diff --git a/build/postgres-operator/install-extensions.sh b/build/postgres-operator/install-extensions.sh index ca09efe7cd..d5b9ad73be 100755 --- a/build/postgres-operator/install-extensions.sh +++ b/build/postgres-operator/install-extensions.sh @@ -24,19 +24,6 @@ if [[ ${STORAGE_FORCE_PATH_STYLE} == "true" ]]; then args+=(-force-path-style) fi -for key in "${extensions[@]}"; do - if [ -f "${PGDATA_EXTENSIONS}"/"${key}".installed ]; then - echo "Extension ${key} already installed" - continue - fi - - echo "Installing extension: ${key}" - /usr/local/bin/extension-installer \ - "${args[@]}" \ - -key "${key}" \ - -install -done - for installed in "${PGDATA_EXTENSIONS}"/*.installed; do filename=$(basename -- "${installed}") key=${filename%.*} @@ -53,3 +40,16 @@ for installed in "${PGDATA_EXTENSIONS}"/*.installed; do rm -f "${installed}" fi done + +for key in "${extensions[@]}"; do + if [ -f "${PGDATA_EXTENSIONS}"/"${key}".installed ]; then + echo "Extension ${key} already installed" + continue + fi + + echo "Installing extension: ${key}" + /usr/local/bin/extension-installer \ + "${args[@]}" \ + -key "${key}" \ + -install +done diff --git a/e2e-tests/tests/custom-extensions/06-assert.yaml b/e2e-tests/tests/custom-extensions/06-assert.yaml index f0c57e2972..9e0e8c2d25 100644 --- a/e2e-tests/tests/custom-extensions/06-assert.yaml +++ b/e2e-tests/tests/custom-extensions/06-assert.yaml @@ -1,6 +1,6 @@ apiVersion: kuttl.dev/v1beta1 kind: TestAssert -timeout: 120 +timeout: 180 --- kind: StatefulSet apiVersion: apps/v1 diff --git a/e2e-tests/tests/custom-extensions/14-assert.yaml b/e2e-tests/tests/custom-extensions/14-assert.yaml new file mode 100644 index 0000000000..9e347dd025 --- /dev/null +++ b/e2e-tests/tests/custom-extensions/14-assert.yaml @@ -0,0 +1,80 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + labels: + postgres-operator.crunchydata.com/cluster: custom-extensions + postgres-operator.crunchydata.com/data: postgres + postgres-operator.crunchydata.com/instance-set: instance1 + ownerReferences: + - apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + name: custom-extensions + controller: true + blockOwnerDeletion: true +spec: + template: + spec: + initContainers: + - name: postgres-startup + - command: + - /usr/local/bin/relocate-extensions.sh + resources: {} + volumeMounts: + - mountPath: /pgdata + name: postgres-data + - mountPath: /tmp + name: tmp + - command: + - /usr/local/bin/install-extensions.sh + env: + - name: STORAGE_TYPE + value: s3 + - name: STORAGE_ENDPOINT + - name: STORAGE_REGION + value: eu-central-1 + - name: STORAGE_BUCKET + value: pg-extensions + - name: INSTALL_EXTENSIONS + - name: PG_VERSION + - name: PGDATA_EXTENSIONS + envFrom: + - secretRef: + name: aws-s3-secret + resources: {} + volumeMounts: + - mountPath: /pgdata + name: postgres-data + - name: postgres-data + - name: postgres-data + - mountPath: /tmp + name: tmp + - command: + - /usr/local/bin/init-entrypoint.sh + - name: nss-wrapper-init +status: + observedGeneration: 5 + replicas: 1 + updatedReplicas: 1 + readyReplicas: 1 + availableReplicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-extensions +status: + pgbouncer: + ready: 3 + size: 3 + postgres: + instances: + - name: instance1 + ready: 3 + size: 3 + ready: 3 + size: 3 + state: ready diff --git a/e2e-tests/tests/custom-extensions/14-update-pg_cron.yaml b/e2e-tests/tests/custom-extensions/14-update-pg_cron.yaml new file mode 100644 index 0000000000..f9092e2cdd --- /dev/null +++ b/e2e-tests/tests/custom-extensions/14-update-pg_cron.yaml @@ -0,0 +1,14 @@ +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-extensions +spec: + extensions: + custom: + - name: pg_cron + version: 1.6.4 + patroni: + dynamicConfiguration: + postgresql: + parameters: + shared_preload_libraries: pg_cron diff --git a/e2e-tests/tests/custom-extensions/15-assert.yaml b/e2e-tests/tests/custom-extensions/15-assert.yaml new file mode 100644 index 0000000000..6798d2dc4f --- /dev/null +++ b/e2e-tests/tests/custom-extensions/15-assert.yaml @@ -0,0 +1,80 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + labels: + postgres-operator.crunchydata.com/cluster: custom-extensions + postgres-operator.crunchydata.com/data: postgres + postgres-operator.crunchydata.com/instance-set: instance1 + ownerReferences: + - apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + name: custom-extensions + controller: true + blockOwnerDeletion: true +spec: + template: + spec: + initContainers: + - name: postgres-startup + - command: + - /usr/local/bin/relocate-extensions.sh + resources: {} + volumeMounts: + - mountPath: /pgdata + name: postgres-data + - mountPath: /tmp + name: tmp + - command: + - /usr/local/bin/install-extensions.sh + env: + - name: STORAGE_TYPE + value: s3 + - name: STORAGE_ENDPOINT + - name: STORAGE_REGION + value: eu-central-1 + - name: STORAGE_BUCKET + value: pg-extensions + - name: INSTALL_EXTENSIONS + - name: PG_VERSION + - name: PGDATA_EXTENSIONS + envFrom: + - secretRef: + name: aws-s3-secret + resources: {} + volumeMounts: + - mountPath: /pgdata + name: postgres-data + - name: postgres-data + - name: postgres-data + - mountPath: /tmp + name: tmp + - command: + - /usr/local/bin/init-entrypoint.sh + - name: nss-wrapper-init +status: + observedGeneration: 6 + replicas: 1 + updatedReplicas: 1 + readyReplicas: 1 + availableReplicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-extensions +status: + pgbouncer: + ready: 3 + size: 3 + postgres: + instances: + - name: instance1 + ready: 3 + size: 3 + ready: 3 + size: 3 + state: ready diff --git a/e2e-tests/tests/custom-extensions/15-restart-cluster.yaml b/e2e-tests/tests/custom-extensions/15-restart-cluster.yaml new file mode 100644 index 0000000000..ee2af7ff4b --- /dev/null +++ b/e2e-tests/tests/custom-extensions/15-restart-cluster.yaml @@ -0,0 +1,13 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + wait_cluster_consistency custom-extensions + + restart_pg_pods custom-extensions instance1 + timeout: 360 \ No newline at end of file diff --git a/e2e-tests/tests/custom-extensions/16-assert.yaml b/e2e-tests/tests/custom-extensions/16-assert.yaml new file mode 100644 index 0000000000..2c70384c04 --- /dev/null +++ b/e2e-tests/tests/custom-extensions/16-assert.yaml @@ -0,0 +1,13 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 30 +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: 16-check-extensions +data: + data: |2- + pg_cron + pg_stat_monitor + pgaudit diff --git a/e2e-tests/tests/custom-extensions/16-check-extensions.yaml b/e2e-tests/tests/custom-extensions/16-check-extensions.yaml new file mode 100644 index 0000000000..e5c7177941 --- /dev/null +++ b/e2e-tests/tests/custom-extensions/16-check-extensions.yaml @@ -0,0 +1,13 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 30 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + data=$(kubectl -n ${NAMESPACE} exec $(get_client_pod) -- psql -v ON_ERROR_STOP=1 -t -q postgres://postgres:$(get_psql_user_pass custom-extensions-pguser-postgres)@$(get_psql_user_host custom-extensions-pguser-postgres) -c "\c postgres" -c "select name from pg_available_extensions where name in ('pg_cron','pg_stat_monitor','pgaudit') order by name") + + kubectl create configmap -n "${NAMESPACE}" 16-check-extensions --from-literal=data="${data}"