From 77a8173e9f6e2b44e2d6b6bbfa3cf0d719d1298f Mon Sep 17 00:00:00 2001 From: Stavros Kois <47820033+stavros-k@users.noreply.github.com> Date: Tue, 27 Jun 2023 23:14:26 +0300 Subject: [PATCH] NAS-122472 / 23.10 / add `wordpress` to `community` train (#1266) * add `wordpress` to `community` catalog * set version to 1.0.0 * fix sources * update readme's * remove category --- library/common/Chart.yaml | 2 +- .../templates/app_functions/_mariadb.tpl | 177 ++++++++++++ library/common/values.yaml | 5 + library/ix-dev/community/wordpress/Chart.lock | 6 + library/ix-dev/community/wordpress/Chart.yaml | 25 ++ library/ix-dev/community/wordpress/README.md | 12 + .../ix-dev/community/wordpress/app-readme.md | 12 + .../wordpress/charts/common-1.0.9.tgz | Bin 0 -> 55985 bytes .../community/wordpress/ci/basic-values.yaml | 10 + library/ix-dev/community/wordpress/item.yaml | 11 + .../ix-dev/community/wordpress/metadata.yaml | 10 + .../ix-dev/community/wordpress/questions.yaml | 270 ++++++++++++++++++ .../community/wordpress/templates/NOTES.txt | 1 + .../wordpress/templates/_configuration.tpl | 33 +++ .../wordpress/templates/_mariadb.tpl | 50 ++++ .../community/wordpress/templates/_portal.tpl | 12 + .../wordpress/templates/_wordpress.tpl | 106 +++++++ .../community/wordpress/templates/common.yaml | 11 + .../community/wordpress/upgrade_info.json | 1 + .../community/wordpress/upgrade_strategy | 31 ++ .../ix-dev/community/wordpress/values.yaml | 27 ++ 21 files changed, 811 insertions(+), 1 deletion(-) create mode 100644 library/common/templates/app_functions/_mariadb.tpl create mode 100644 library/ix-dev/community/wordpress/Chart.lock create mode 100644 library/ix-dev/community/wordpress/Chart.yaml create mode 100644 library/ix-dev/community/wordpress/README.md create mode 100644 library/ix-dev/community/wordpress/app-readme.md create mode 100644 library/ix-dev/community/wordpress/charts/common-1.0.9.tgz create mode 100644 library/ix-dev/community/wordpress/ci/basic-values.yaml create mode 100644 library/ix-dev/community/wordpress/item.yaml create mode 100644 library/ix-dev/community/wordpress/metadata.yaml create mode 100644 library/ix-dev/community/wordpress/questions.yaml create mode 100644 library/ix-dev/community/wordpress/templates/NOTES.txt create mode 100644 library/ix-dev/community/wordpress/templates/_configuration.tpl create mode 100644 library/ix-dev/community/wordpress/templates/_mariadb.tpl create mode 100644 library/ix-dev/community/wordpress/templates/_portal.tpl create mode 100644 library/ix-dev/community/wordpress/templates/_wordpress.tpl create mode 100644 library/ix-dev/community/wordpress/templates/common.yaml create mode 100644 library/ix-dev/community/wordpress/upgrade_info.json create mode 100755 library/ix-dev/community/wordpress/upgrade_strategy create mode 100644 library/ix-dev/community/wordpress/values.yaml diff --git a/library/common/Chart.yaml b/library/common/Chart.yaml index 82c1183773..e5113d9da7 100644 --- a/library/common/Chart.yaml +++ b/library/common/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: common description: A library chart for iX Official Catalog type: library -version: 1.0.8 +version: 1.0.9 appVersion: v1 annotations: title: Common Library Chart diff --git a/library/common/templates/app_functions/_mariadb.tpl b/library/common/templates/app_functions/_mariadb.tpl new file mode 100644 index 0000000000..c223ccc1bc --- /dev/null +++ b/library/common/templates/app_functions/_mariadb.tpl @@ -0,0 +1,177 @@ +{{/* Returns a mariadb pod with init container for fixing permissions +and a pre-upgrade job to backup the database */}} +{{/* Call this template: +{{ include "ix.v1.common.app.mariadb" (dict "name" "mariadb" "secretName" "mariadb-creds" "backupPath" "/mariadb_backup" "resources" .Values.resources) }} + +name (optional): Name of the mariadb pod/container (default: mariadb) +secretName (required): Name of the secret containing the mariadb credentials +backupPath (optional): Path to store the backup, it's the container's path (default: /mariadb_backup) +resources (required): Resources for the mariadb container +backupChownMode (optional): Whether to chown the backup directory or + check parent directory permissions and fix them if needed. + (default: check) Valid values: always, check +*/}} +{{- define "ix.v1.common.app.mariadb" -}} + {{- $name := .name | default "mariadb" -}} + {{- $secretName := (required "MariaDB - Secret Name is required" .secretName) -}} + {{- $backupPath := .backupPath | default "/mariadb_backup" -}} + {{- $backupChownMode := .backupChownMode | default "check" -}} + {{- $ixChartContext := .ixChartContext -}} + {{- $resources := (required "MariadDB - Resources are required" .resources) }} +{{ $name }}: + enabled: true + type: Deployment + podSpec: + containers: + {{ $name }}: + enabled: true + primary: true + imageSelector: mariadbImage + securityContext: + runAsUser: 999 + runAsGroup: 999 + readOnlyRootFilesystem: false + resources: + limits: + cpu: {{ $resources.limits.cpu }} + memory: {{ $resources.limits.memory }} + envFrom: + - secretRef: + name: {{ $secretName }} + probes: + {{- $args := "--user=root --host=localhost --password=$MARIADB_ROOT_PASSWORD" }} + liveness: + enabled: true + type: exec + command: + - sh + - -c + - "until mariadb-admin {{ $args }} ping && mariadb-admin {{ $args }} status; do sleep 2; done" + readiness: + enabled: true + type: exec + command: + - sh + - -c + - "until mariadb-admin {{ $args }} ping && mariadb-admin {{ $args }} status; do sleep 2; done" + startup: + enabled: true + type: exec + command: + - sh + - -c + - "until mariadb-admin {{ $args }} ping && mariadb-admin {{ $args }} status; do sleep 2; done" + initContainers: + {{- include "ix.v1.common.app.permissions" (dict "UID" 999 "GID" 999) | nindent 6 }} + +{{/* Backup Job */}} +{{- $enableBackupJob := false -}} +{{- if hasKey $ixChartContext "isUpgrade" -}} + {{- if $ixChartContext.isUpgrade -}} + {{- $enableBackupJob = true -}} + {{- end -}} +{{- else -}} + {{/* + If the key is not present in ixChartContext, + means we are outside SCALE (Probably CI), + let upgrade job run + */}} + {{- $enableBackupJob = true -}} +{{- end }} +mariadbbackup: + enabled: {{ $enableBackupJob }} + type: Job + annotations: + "helm.sh/hook": pre-upgrade + "helm.sh/hook-weight": "1" + "helm.sh/hook-delete-policy": hook-succeeded + podSpec: + restartPolicy: Never + containers: + mariadbbackup: + enabled: true + primary: true + imageSelector: mariadbImage + securityContext: + runAsUser: 999 + runAsGroup: 999 + readOnlyRootFilesystem: false + probes: + liveness: + enabled: false + readiness: + enabled: false + startup: + enabled: false + resources: + limits: + cpu: 2000m + memory: 2Gi + envFrom: + - secretRef: + name: {{ $secretName }} + command: + - sh + - -c + - | + until mariadb-admin --user=root --host="${MARIADB_HOST}" --password="${MARIADB_ROOT_PASSWORD}" --connect-timeout=5 ping + do + echo "Waiting for mariadb to be ready. Sleeping 2 seconds" + sleep 2s + done + until mariadb-admin --user=root --host="${MARIADB_HOST}" --password="${MARIADB_ROOT_PASSWORD}" --connect-timeout=5 status + do + echo "Waiting for mariadb to be alive. Sleeping 2 seconds" + sleep 2s + done + + echo "Creating backup of ${MARIADB_DATABASE} database" + + mariadb-dump ${MARIADB_DATABASE} --host="${MARIADB_HOST}" \ + --user=root --password="${MARIADB_ROOT_PASSWORD}" \ + > {{ $backupPath }}/${MARIADB_DATABASE}_$(date +%Y-%m-%d_%H-%M-%S).sql \ + || echo "Failed to create backup" + + echo "Backup finished" + initContainers: + {{- include "ix.v1.common.app.permissions" (dict "UID" 999 "GID" 999 "type" "init" "mode" $backupChownMode) | nindent 6 }} +{{- end -}} + + +{{/* Returns a mariadb-wait container for waiting for mariadb to be ready */}} +{{/* Call this template: +{{ include "ix.v1.common.app.mariadbWait" (dict "name" "mariadb-wait" "secretName" "mariadb-creds") }} + +name (optional): Name of the mariadb-wait container (default: mariadb-wait) +secretName (required): Name of the secret containing the mariadb credentials +*/}} +{{- define "ix.v1.common.app.mariadbWait" -}} + {{- $name := .name | default "mariadb-wait" -}} + {{- $secretName := (required "Mariadb-Wait - Secret Name is required" .secretName) }} +{{ $name }}: + enabled: true + type: init + imageSelector: mariadbImage + envFrom: + - secretRef: + name: {{ $secretName }} + resources: + limits: + cpu: 500m + memory: 256Mi + command: bash + args: + - -c + - | + echo "Waiting for mariadb to be ready" + until mariadb-admin --user=root --host="${MARIADB_HOST}" --password="${MARIADB_ROOT_PASSWORD}" --connect-timeout=5 ping + do + echo "Waiting for mariadb to be ready. Sleeping 2 seconds" + sleep 2s + done + until mariadb-admin --user=root --host="${MARIADB_HOST}" --password="${MARIADB_ROOT_PASSWORD}" --connect-timeout=5 status + do + echo "Waiting for mariadb to be alive. Sleeping 2 seconds" + sleep 2s + done +{{- end -}} diff --git a/library/common/values.yaml b/library/common/values.yaml index 95fdac02cb..9b11deb4c5 100644 --- a/library/common/values.yaml +++ b/library/common/values.yaml @@ -46,6 +46,11 @@ postgresImage: tag: "15.2" pullPolicy: IfNotPresent +mariadbImage: + repository: mariadb + tag: "10.6.14" + pullPolicy: IfNotPresent + # -- (docs/README.md) securityContext: container: diff --git a/library/ix-dev/community/wordpress/Chart.lock b/library/ix-dev/community/wordpress/Chart.lock new file mode 100644 index 0000000000..f730d2f803 --- /dev/null +++ b/library/ix-dev/community/wordpress/Chart.lock @@ -0,0 +1,6 @@ +dependencies: +- name: common + repository: file://../../../common + version: 1.0.9 +digest: sha256:c3eb00f142d5d1cdbff7843940c150a00bd916520363e6ee9f459ce61fa92b40 +generated: "2023-06-14T18:39:35.751013894+03:00" diff --git a/library/ix-dev/community/wordpress/Chart.yaml b/library/ix-dev/community/wordpress/Chart.yaml new file mode 100644 index 0000000000..f66039b925 --- /dev/null +++ b/library/ix-dev/community/wordpress/Chart.yaml @@ -0,0 +1,25 @@ +name: wordpress +description: Wordpress is a web content management system +annotations: + title: Wordpress +type: application +version: 1.0.0 +apiVersion: v2 +appVersion: '1.19.0' +kubeVersion: '>=1.16.0-0' +maintainers: + - name: truenas + url: https://www.truenas.com/ + email: dev@ixsystems.com +dependencies: + - name: common + repository: file://../../../common + version: 1.0.9 +home: https://wordpress.org +icon: https://github.com/WordPress/WordPress/blob/master/wp-admin/images/wordpress-logo.png?raw=true +sources: + - https://hub.docker.com/_/wordpress + - https://github.com/truenas/charts/tree/master/community/wordpress +keywords: + - cms + - blog diff --git a/library/ix-dev/community/wordpress/README.md b/library/ix-dev/community/wordpress/README.md new file mode 100644 index 0000000000..bde8537dee --- /dev/null +++ b/library/ix-dev/community/wordpress/README.md @@ -0,0 +1,12 @@ +# Wordpress + +[Wordpress](https://wordpress.org/) is a web content management system. + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `wordpress` directories. +> Afterward, the `wordpress` container will run as a **non**-root user (`33`). +> Same applies to the `mariadb` container. This will run afterwards as a **non**-root user (`999`). +> On each upgrade, a container will be launched with **root** privileges in order to apply the correct +> permissions to the `mariadb` **backups** directory. Container that performs the backup will run as a **non**-root user (`999`) afterwards. +> Keep in mind the permissions on the backup directory will be changed to `999:999` on **every** update. +> But will only be changed once for the `wordpress` and `mariadb` data directories. diff --git a/library/ix-dev/community/wordpress/app-readme.md b/library/ix-dev/community/wordpress/app-readme.md new file mode 100644 index 0000000000..bde8537dee --- /dev/null +++ b/library/ix-dev/community/wordpress/app-readme.md @@ -0,0 +1,12 @@ +# Wordpress + +[Wordpress](https://wordpress.org/) is a web content management system. + +> When application is installed, a container will be launched with **root** privileges. +> This is required in order to apply the correct permissions to the `wordpress` directories. +> Afterward, the `wordpress` container will run as a **non**-root user (`33`). +> Same applies to the `mariadb` container. This will run afterwards as a **non**-root user (`999`). +> On each upgrade, a container will be launched with **root** privileges in order to apply the correct +> permissions to the `mariadb` **backups** directory. Container that performs the backup will run as a **non**-root user (`999`) afterwards. +> Keep in mind the permissions on the backup directory will be changed to `999:999` on **every** update. +> But will only be changed once for the `wordpress` and `mariadb` data directories. diff --git a/library/ix-dev/community/wordpress/charts/common-1.0.9.tgz b/library/ix-dev/community/wordpress/charts/common-1.0.9.tgz new file mode 100644 index 0000000000000000000000000000000000000000..528451cc579c491482bf0370ffa2789859cc1fb4 GIT binary patch literal 55985 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 + Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: ixVolume + enum: + - value: hostPath + description: Host Path (Path that already exists on the system) + - value: ixVolume + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: data + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: mariadbData + label: Wordpress MariaDB Data Storage + description: The path to store Wordpress MariaDB Data. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: ixVolume + enum: + - value: hostPath + description: Host Path (Path that already exists on the system) + - value: ixVolume + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: mariadbData + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: mariadbBackup + label: Wordpress MariaDB Backup Storage + description: The path to store Wordpress MariaDB Backup. + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: ixVolume + enum: + - value: hostPath + description: Host Path (Path that already exists on the system) + - value: ixVolume + description: ixVolume (Dataset created automatically by the system) + - variable: datasetName + label: Dataset Name + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + hidden: true + immutable: true + default: mariadbBackup + $ref: + - "normalize/ixVolume" + - variable: hostPath + label: Host Path + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + immutable: true + required: true + - variable: additionalStorages + label: Additional Storage + description: Additional storage for Wordpress. + schema: + type: list + default: [] + items: + - variable: storageEntry + label: Storage Entry + schema: + type: dict + attrs: + - variable: type + label: Type + description: | + ixVolume: Is dataset created automatically by the system.
+ Host Path: Is a path that already exists on the system. + schema: + type: string + required: true + default: "ixVolume" + enum: + - value: "hostPath" + description: Host Path (Path that already exists on the system) + - value: "ixVolume" + description: ixVolume (Dataset created automatically by the system) + - variable: mountPath + label: Mount Path + description: The path inside the container to mount the storage. + schema: + type: path + required: true + - variable: hostPath + label: Host Path + description: The host path to use for storage. + schema: + type: hostpath + show_if: [["type", "=", "hostPath"]] + required: true + - variable: datasetName + label: Dataset Name + description: The name of the dataset to use for storage. + schema: + type: string + show_if: [["type", "=", "ixVolume"]] + required: true + immutable: true + default: "storage_entry" + $ref: + - "normalize/ixVolume" + + - variable: resources + label: "" + group: Resources Configuration + schema: + type: dict + attrs: + - variable: limits + label: Limits + schema: + type: dict + attrs: + - variable: cpu + label: CPU + description: CPU limit for Wordpress. + schema: + type: string + default: 4000m + required: true + - variable: memory + label: Memory + description: Memory limit for Wordpress. + schema: + type: string + default: 8Gi + required: true diff --git a/library/ix-dev/community/wordpress/templates/NOTES.txt b/library/ix-dev/community/wordpress/templates/NOTES.txt new file mode 100644 index 0000000000..ba4e01146c --- /dev/null +++ b/library/ix-dev/community/wordpress/templates/NOTES.txt @@ -0,0 +1 @@ +{{ include "ix.v1.common.lib.chart.notes" $ }} diff --git a/library/ix-dev/community/wordpress/templates/_configuration.tpl b/library/ix-dev/community/wordpress/templates/_configuration.tpl new file mode 100644 index 0000000000..9fa4e00672 --- /dev/null +++ b/library/ix-dev/community/wordpress/templates/_configuration.tpl @@ -0,0 +1,33 @@ +{{- define "wordpress.configuration" -}} + + {{- $fullname := (include "ix.v1.common.lib.chart.names.fullname" $) -}} + + {{- $dbHost := (printf "%s-mariadb" $fullname) -}} + {{- $dbUser := "wordpress" -}} + {{- $dbName := "wordpress" -}} + + {{- $dbPass := (randAlphaNum 32) -}} + {{- $dbRootPass := (randAlphaNum 32) -}} + {{- with (lookup "v1" "Secret" .Release.Namespace (printf "%s-mariadb-creds" $fullname)) -}} + {{- $dbPass = ((index .data "MARIADB_PASSWORD") | b64dec) -}} + {{- $dbRootPass = ((index .data "MARIADB_ROOT_PASSWORD") | b64dec) -}} + {{- end }} + +secret: + mariadb-creds: + enabled: true + data: + MARIADB_USER: {{ $dbUser }} + MARIADB_DATABASE: {{ $dbName }} + MARIADB_PASSWORD: {{ $dbPass }} + MARIADB_ROOT_PASSWORD: {{ $dbRootPass }} + MARIADB_HOST: {{ $dbHost }} + + wordpress-creds: + enabled: true + data: + WORDPRESS_DB_HOST: {{ $dbHost }} + WORDPRESS_DB_NAME: {{ $dbName }} + WORDPRESS_DB_USER: {{ $dbUser }} + WORDPRESS_DB_PASSWORD: {{ $dbPass }} +{{- end -}} diff --git a/library/ix-dev/community/wordpress/templates/_mariadb.tpl b/library/ix-dev/community/wordpress/templates/_mariadb.tpl new file mode 100644 index 0000000000..a5a91b2bb7 --- /dev/null +++ b/library/ix-dev/community/wordpress/templates/_mariadb.tpl @@ -0,0 +1,50 @@ +{{- define "wordpress.mariadb.workload" -}} +workload: +{{- include "ix.v1.common.app.mariadb" (dict "secretName" "mariadb-creds" + "resources" .Values.resources + "ixChartContext" .Values.ixChartContext) | nindent 2 }} +{{/* Service */}} +service: + mariadb: + enabled: true + type: ClusterIP + targetSelector: mariadb + ports: + mariadb: + enabled: true + primary: true + port: 3306 + targetPort: 3306 + targetSelector: mariadb + +{{/* Persistence */}} +persistence: + mariadbdata: + enabled: true + type: {{ .Values.wpStorage.mariadbData.type }} + datasetName: {{ .Values.wpStorage.mariadbData.datasetName | default "" }} + hostPath: {{ .Values.wpStorage.mariadbData.hostPath | default "" }} + targetSelector: + # MariaDB pod + mariadb: + # MariaDB container + mariadb: + mountPath: /var/lib/mysql + # MariaDB - Permissions container + permissions: + mountPath: /mnt/directories/mariadb_data + mariadbbackup: + enabled: true + type: {{ .Values.wpStorage.mariadbBackup.type }} + datasetName: {{ .Values.wpStorage.mariadbBackup.datasetName | default "" }} + hostPath: {{ .Values.wpStorage.mariadbBackup.hostPath | default "" }} + targetSelector: + # MariaDB backup pod + mariadbbackup: + # MariaDB backup container + mariadbbackup: + mountPath: /mariadb_backup + # MariaDB - Permissions container + permissions: + mountPath: /mnt/directories/mariadb_backup +{{- end -}} diff --git a/library/ix-dev/community/wordpress/templates/_portal.tpl b/library/ix-dev/community/wordpress/templates/_portal.tpl new file mode 100644 index 0000000000..6249ccb850 --- /dev/null +++ b/library/ix-dev/community/wordpress/templates/_portal.tpl @@ -0,0 +1,12 @@ +{{- define "wordpress.portal" -}} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: portal +data: + path: / + port: {{ .Values.wpNetwork.webPort | quote }} + protocol: http + host: $node_ip +{{- end -}} diff --git a/library/ix-dev/community/wordpress/templates/_wordpress.tpl b/library/ix-dev/community/wordpress/templates/_wordpress.tpl new file mode 100644 index 0000000000..42b9d333ca --- /dev/null +++ b/library/ix-dev/community/wordpress/templates/_wordpress.tpl @@ -0,0 +1,106 @@ +{{- define "wordpress.workload" -}} +workload: + wordpress: + enabled: true + primary: true + type: Deployment + podSpec: + hostNetwork: false + containers: + wordpress: + enabled: true + primary: true + imageSelector: image + securityContext: + runAsUser: 33 + runAsGroup: 33 + capabilities: + add: + - NET_BIND_SERVICE + envFrom: + - secretRef: + name: wordpress-creds + {{ with .Values.wpConfig.additionalEnvs }} + envList: + {{ range $env := . }} + - name: {{ $env.name }} + value: {{ $env.value }} + {{ end }} + {{ end }} + probes: + liveness: + enabled: true + type: tcp + port: 80 + readiness: + enabled: true + type: tcp + port: 80 + startup: + enabled: true + type: tcp + port: 80 + initContainers: + {{- include "ix.v1.common.app.permissions" (dict "containerName" "01-permissions" + "UID" 33 + "GID" 33 + "type" "install") | nindent 8 }} + {{- include "ix.v1.common.app.mariadbWait" (dict "name" "mariadb-wait" + "secretName" "mariadb-creds") | nindent 8 }} +{{/* Service */}} +service: + wordpress: + enabled: true + primary: true + type: NodePort + targetSelector: wordpress + ports: + webui: + enabled: true + primary: true + port: {{ .Values.wpNetwork.webPort }} + nodePort: {{ .Values.wpNetwork.webPort }} + targetPort: 80 + targetSelector: wordpress + +{{/* Persistence */}} +persistence: + data: + enabled: true + type: {{ .Values.wpStorage.data.type }} + datasetName: {{ .Values.wpStorage.data.datasetName | default "" }} + hostPath: {{ .Values.wpStorage.data.hostPath | default "" }} + targetSelector: + wordpress: + wordpress: + mountPath: /var/www/html + 01-permissions: + mountPath: /mnt/directories/data + {{- range $idx, $storage := .Values.wpStorage.additionalStorages }} + {{ printf "wp-%v" (int $idx) }}: + enabled: true + type: {{ $storage.type }} + datasetName: {{ $storage.datasetName | default "" }} + hostPath: {{ $storage.hostPath | default "" }} + targetSelector: + wordpress: + wordpress: + mountPath: {{ $storage.mountPath }} + 01-permissions: + mountPath: /mnt/directories{{ $storage.mountPath }} + {{- end }} + tmp: + enabled: true + type: emptyDir + targetSelector: + wordpress: + wordpress: + mountPath: /tmp + varrun: + enabled: true + type: emptyDir + targetSelector: + wordpress: + wordpress: + mountPath: /var/run +{{- end -}} diff --git a/library/ix-dev/community/wordpress/templates/common.yaml b/library/ix-dev/community/wordpress/templates/common.yaml new file mode 100644 index 0000000000..8dfa28ebdf --- /dev/null +++ b/library/ix-dev/community/wordpress/templates/common.yaml @@ -0,0 +1,11 @@ +{{- include "ix.v1.common.loader.init" . -}} + +{{/* Merge the templates with Values */}} +{{- $_ := mustMergeOverwrite .Values (include "wordpress.configuration" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "wordpress.workload" $ | fromYaml) -}} +{{- $_ := mustMergeOverwrite .Values (include "wordpress.mariadb.workload" $ | fromYaml) -}} + +{{/* Create the configmap for portal manually*/}} +{{- include "wordpress.portal" $ -}} + +{{- include "ix.v1.common.loader.apply" . -}} diff --git a/library/ix-dev/community/wordpress/upgrade_info.json b/library/ix-dev/community/wordpress/upgrade_info.json new file mode 100644 index 0000000000..767388094a --- /dev/null +++ b/library/ix-dev/community/wordpress/upgrade_info.json @@ -0,0 +1 @@ +{"filename": "values.yaml", "keys": ["image"]} diff --git a/library/ix-dev/community/wordpress/upgrade_strategy b/library/ix-dev/community/wordpress/upgrade_strategy new file mode 100755 index 0000000000..41e9448b21 --- /dev/null +++ b/library/ix-dev/community/wordpress/upgrade_strategy @@ -0,0 +1,31 @@ +#!/usr/bin/python3 +import json +import re +import sys + +from catalog_update.upgrade_strategy import semantic_versioning + + +RE_STABLE_VERSION = re.compile(r'[0-9]+\.[0-9]+\.[0-9]+') + + +def newer_mapping(image_tags): + key = list(image_tags.keys())[0] + tags = {t: t for t in image_tags[key] if RE_STABLE_VERSION.fullmatch(t)} + version = semantic_versioning(list(tags)) + if not version: + return {} + + return { + 'tags': {key: tags[version]}, + 'app_version': version, + } + + +if __name__ == '__main__': + try: + versions_json = json.loads(sys.stdin.read()) + except ValueError: + raise ValueError('Invalid json specified') + + print(json.dumps(newer_mapping(versions_json))) diff --git a/library/ix-dev/community/wordpress/values.yaml b/library/ix-dev/community/wordpress/values.yaml new file mode 100644 index 0000000000..09d5c5c920 --- /dev/null +++ b/library/ix-dev/community/wordpress/values.yaml @@ -0,0 +1,27 @@ +image: + repository: wordpress + pullPolicy: IfNotPresent + tag: 6.2.2 + +resources: + limits: + cpu: 4000m + memory: 8Gi + +wpConfig: + additionalEnvs: [] + +wpNetwork: + webPort: 30040 + +wpStorage: + data: + type: ixVolume + datasetName: data + mariadbData: + type: ixVolume + datasetName: mariadbData + mariadbBackup: + type: ixVolume + datasetName: mariadbBackup + additionalStorages: []