diff --git a/e2e-tests/functions b/e2e-tests/functions index 533e842bc..135605988 100644 --- a/e2e-tests/functions +++ b/e2e-tests/functions @@ -1153,11 +1153,12 @@ get_container_image() { local component=$1 local pgVersion=$2 - if [[ ${IMAGE} == percona/* ]] || [[ -n ${FORCE_RELEASE_RUN} ]]; then + if [[ ${IMAGE} == percona/* || ${IMAGE} == docker.io/percona/* ]] || [[ -n ${FORCE_RELEASE_RUN} ]]; then local key case $component in pgbouncer) key="IMAGE_PGBOUNCER${pgVersion}" ;; pgbackrest) key="IMAGE_BACKREST${pgVersion}" ;; + postgis) key="IMAGE_POSTGIS${pgVersion}" ;; *) key="IMAGE_POSTGRESQL${pgVersion}" ;; esac get_release_image "$key" diff --git a/e2e-tests/run-release.csv b/e2e-tests/run-release.csv index cab53e6b5..6bd370067 100644 --- a/e2e-tests/run-release.csv +++ b/e2e-tests/run-release.csv @@ -16,6 +16,10 @@ major-upgrade-14-to-15 major-upgrade-15-to-16 major-upgrade-16-to-17 major-upgrade-17-to-18 +major-upgrade-14-to-15-postgis +major-upgrade-15-to-16-postgis +major-upgrade-16-to-17-postgis +major-upgrade-17-to-18-postgis ldap ldap-tls monitoring diff --git a/e2e-tests/tests/major-upgrade-14-to-15-postgis/00-assert.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/00-assert.yaml new file mode 100644 index 000000000..ae5a062d8 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/00-assert.yaml @@ -0,0 +1,24 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: perconapgclusters.pgv2.percona.com +spec: + group: pgv2.percona.com + names: + kind: PerconaPGCluster + listKind: PerconaPGClusterList + plural: perconapgclusters + singular: perconapgcluster + scope: Namespaced +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +metadata: + name: check-operator-deploy-status +timeout: 120 +commands: + - script: kubectl assert exist-enhanced deployment percona-postgresql-operator -n ${OPERATOR_NS:-$NAMESPACE} --field-selector status.readyReplicas=1 diff --git a/e2e-tests/tests/major-upgrade-14-to-15-postgis/00-deploy-operator.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/00-deploy-operator.yaml new file mode 100644 index 000000000..5d21c58f9 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/00-deploy-operator.yaml @@ -0,0 +1,13 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + init_temp_dir # do this only in the first TestStep + + deploy_operator + deploy_client + deploy_s3_secrets diff --git a/e2e-tests/tests/major-upgrade-14-to-15-postgis/01-assert.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/01-assert.yaml new file mode 100644 index 000000000..880cbe539 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/01-assert.yaml @@ -0,0 +1,135 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: major-upgrade-14-to-15-postgis-repo-host + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-14-to-15-postgis + postgres-operator.crunchydata.com/data: pgbackrest + postgres-operator.crunchydata.com/pgbackrest: '' + postgres-operator.crunchydata.com/pgbackrest-dedicated: '' + ownerReferences: + - apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + name: major-upgrade-14-to-15-postgis + controller: true + blockOwnerDeletion: true +status: + observedGeneration: 1 + replicas: 1 + readyReplicas: 1 + currentReplicas: 1 + updatedReplicas: 1 + collisionCount: 0 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-14-to-15-postgis + postgres-operator.crunchydata.com/data: postgres + postgres-operator.crunchydata.com/instance-set: instance1 + ownerReferences: + - apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + name: major-upgrade-14-to-15-postgis + controller: true + blockOwnerDeletion: true +status: + observedGeneration: 1 + replicas: 1 + readyReplicas: 1 + currentReplicas: 1 + updatedReplicas: 1 + collisionCount: 0 +--- +kind: Deployment +apiVersion: apps/v1 +metadata: + name: major-upgrade-14-to-15-postgis-pgbouncer + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-14-to-15-postgis + postgres-operator.crunchydata.com/role: pgbouncer + annotations: + deployment.kubernetes.io/revision: '1' + ownerReferences: + - apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + name: major-upgrade-14-to-15-postgis + controller: true + blockOwnerDeletion: true +status: + observedGeneration: 1 + replicas: 3 + updatedReplicas: 3 + readyReplicas: 3 +--- +kind: Job +apiVersion: batch/v1 +metadata: + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-14-to-15-postgis + postgres-operator.crunchydata.com/pgbackrest: '' + postgres-operator.crunchydata.com/pgbackrest-backup: replica-create + postgres-operator.crunchydata.com/pgbackrest-repo: repo1 + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGBackup + controller: true + blockOwnerDeletion: true +status: + succeeded: 1 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: major-upgrade-14-to-15-postgis + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: major-upgrade-14-to-15-postgis + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 3 + replicas: 3 + updatedReplicas: 3 + observedGeneration: 1 + pgbackrest: + repoHost: + apiVersion: apps/v1 + kind: StatefulSet + ready: true + repos: + - bound: true + name: repo1 + replicaCreateBackupComplete: true + stanzaCreated: true + proxy: + pgBouncer: + readyReplicas: 3 + replicas: 3 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: major-upgrade-14-to-15-postgis +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/major-upgrade-14-to-15-postgis/01-create-cluster.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/01-create-cluster.yaml new file mode 100644 index 000000000..56049e4c6 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/01-create-cluster.yaml @@ -0,0 +1,30 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 10 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + postgres_image=$(get_container_image "postgis" 14) + pgbouncer_image=$(get_container_image "pgbouncer" 14) + pgbackrest_image=$(get_container_image "pgbackrest" 14) + + get_cr \ + | yq eval " + .spec.postgresVersion = 14 | + .spec.image = \"${postgres_image}\" | + .spec.instances[0].dataVolumeClaimSpec.resources.requests.storage = \"3Gi\" | + .spec.proxy.pgBouncer.image = \"${pgbouncer_image}\" | + .spec.backups.pgbackrest.image = \"${pgbackrest_image}\" | + .spec.patroni.removeDataDirectoryOnDivergedTimelines = true | + .spec.patroni.dynamicConfiguration.postgresql.parameters.shared_preload_libraries = \"pg_cron\" | + .spec.extensions.builtin.pg_stat_monitor = true | + .spec.extensions.builtin.pg_stat_statements = false | + .spec.extensions.builtin.pg_audit = true | + .spec.extensions.builtin.pgvector = true | + .spec.extensions.builtin.pg_repack = true | + .spec.extensions.custom += [{\"name\": \"pg_cron\", \"version\": \"1.6.6\"}]" \ + | kubectl -n "${NAMESPACE}" apply -f - diff --git a/e2e-tests/tests/major-upgrade-14-to-15-postgis/02-write-data.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/02-write-data.yaml new file mode 100644 index 000000000..9e58b1dcb --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/02-write-data.yaml @@ -0,0 +1,32 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + run_psql_local \ + 'CREATE DATABASE myapp; \c myapp \\\ CREATE TABLE IF NOT EXISTS myApp (id int PRIMARY KEY);' \ + "postgres:$(get_psql_user_pass major-upgrade-14-to-15-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-14-to-15-postgis-pguser-postgres)" + + run_psql_local \ + '\c myapp \\\ INSERT INTO myApp (id) VALUES (100500)' \ + "postgres:$(get_psql_user_pass major-upgrade-14-to-15-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-14-to-15-postgis-pguser-postgres)" + + primary=$(get_pod_by_role major-upgrade-14-to-15-postgis primary name) + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d postgres -c 'CREATE DATABASE mygisdata' + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d mygisdata -c 'CREATE SCHEMA gis' + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d mygisdata -c 'CREATE EXTENSION postgis' + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d mygisdata -c 'CREATE TABLE gis.locations (id int PRIMARY KEY, geom geometry(Point, 4326))' + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d mygisdata -c 'INSERT INTO gis.locations (id, geom) VALUES (1, ST_GeomFromText($$POINT(30 10)$$, 4326))' + + run_psql_local \ + '\c postgres \\\ CREATE EXTENSION pg_cron' \ + "postgres:$(get_psql_user_pass major-upgrade-14-to-15-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-14-to-15-postgis-pguser-postgres)" diff --git a/e2e-tests/tests/major-upgrade-14-to-15-postgis/03-assert.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/03-assert.yaml new file mode 100644 index 000000000..afd413428 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/03-assert.yaml @@ -0,0 +1,11 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 30 +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: 03-read-from-primary +data: + data: ' 100500' + postgis: ' POINT(30 10)' diff --git a/e2e-tests/tests/major-upgrade-14-to-15-postgis/03-read-from-primary.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/03-read-from-primary.yaml new file mode 100644 index 000000000..1d7295ea4 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/03-read-from-primary.yaml @@ -0,0 +1,12 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + data=$(run_psql_local '\c myapp \\\ SELECT * from myApp;' "postgres:$(get_psql_user_pass major-upgrade-14-to-15-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-14-to-15-postgis-pguser-postgres)") + postgis=$(run_psql_local '\c mygisdata \\\ SELECT ST_AsText(geom) FROM gis.locations ORDER BY id;' "postgres:$(get_psql_user_pass major-upgrade-14-to-15-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-14-to-15-postgis-pguser-postgres)") + + kubectl create configmap -n "${NAMESPACE}" 03-read-from-primary --from-literal=data="${data}" --from-literal=postgis="${postgis}" diff --git a/e2e-tests/tests/major-upgrade-14-to-15-postgis/04-assert.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/04-assert.yaml new file mode 100644 index 000000000..2ba29e294 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/04-assert.yaml @@ -0,0 +1,61 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 360 +commands: +- script: |- + kubectl -n ${NAMESPACE} get cm \ + -l app.kubernetes.io/instance=major-upgrade-14-to-15-postgis \ + -l app.kubernetes.io/component=pg -o yaml + kubectl -n ${NAMESPACE} get pg,pod,job + sleep 5 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: major-upgrade-14-to-15-postgis +spec: + postgresVersion: 15 +status: + pgbouncer: + ready: 3 + size: 3 + postgres: + instances: + - name: instance1 + ready: 3 + size: 3 + ready: 3 + size: 3 + state: ready +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGUpgrade +metadata: + name: 14-to-15-postgis +status: + conditions: + - type: Progressing + reason: PGUpgradeCompleted + status: "False" + observedGeneration: 1 + - type: Succeeded + reason: PGUpgradeSucceeded + status: "True" + observedGeneration: 1 + observedGeneration: 1 +--- +kind: Job +apiVersion: batch/v1 +metadata: + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-14-to-15-postgis + postgres-operator.crunchydata.com/pgbackrest: '' + postgres-operator.crunchydata.com/pgbackrest-backup: replica-create + postgres-operator.crunchydata.com/pgbackrest-repo: repo1 + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGBackup + controller: true + blockOwnerDeletion: true +status: + succeeded: 1 diff --git a/e2e-tests/tests/major-upgrade-14-to-15-postgis/04-upgrade.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/04-upgrade.yaml new file mode 100644 index 000000000..c5defbe07 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/04-upgrade.yaml @@ -0,0 +1,23 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl apply -n ${NAMESPACE} -f - <<-EOF + apiVersion: pgv2.percona.com/v2 + kind: PerconaPGUpgrade + metadata: + name: 14-to-15-postgis + spec: + postgresClusterName: major-upgrade-14-to-15-postgis + image: ${IMAGE_UPGRADE} + fromPostgresVersion: 14 + toPostgresVersion: 15 + toPostgresImage: $(get_container_image "postgis" 15) + toPgBouncerImage: $(get_container_image "pgbouncer" 15) + toPgBackRestImage: $(get_container_image "pgbackrest" 15) + EOF diff --git a/e2e-tests/tests/major-upgrade-14-to-15-postgis/05-post-upgrade.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/05-post-upgrade.yaml new file mode 100644 index 000000000..fac73338d --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/05-post-upgrade.yaml @@ -0,0 +1,13 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + primary=$(get_pod_by_role major-upgrade-14-to-15-postgis primary name) + kubectl -n ${NAMESPACE} exec ${primary} -- vacuumdb --all --analyze-in-stages + kubectl -n ${NAMESPACE} exec ${primary} -- vacuumdb --all --analyze-only + kubectl -n ${NAMESPACE} exec ${primary} -- /pgdata/delete_old_cluster.sh diff --git a/e2e-tests/tests/major-upgrade-14-to-15-postgis/06-write-data.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/06-write-data.yaml new file mode 100644 index 000000000..36b994b89 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/06-write-data.yaml @@ -0,0 +1,16 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + run_psql_local \ + '\c myapp \\\ INSERT INTO myApp (id) VALUES (100501)' \ + "postgres:$(get_psql_user_pass major-upgrade-14-to-15-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-14-to-15-postgis-pguser-postgres)" + + run_psql_local \ + '\c mygisdata \\\ INSERT INTO gis.locations (id, geom) VALUES (2, ST_GeomFromText($$POINT(40 20)$$, 4326))' \ + "postgres:$(get_psql_user_pass major-upgrade-14-to-15-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-14-to-15-postgis-pguser-postgres)" diff --git a/e2e-tests/tests/major-upgrade-14-to-15-postgis/07-assert.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/07-assert.yaml new file mode 100644 index 000000000..9c42f0c03 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/07-assert.yaml @@ -0,0 +1,31 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 660 +--- +kind: Job +apiVersion: batch/v1 +metadata: + annotations: + postgres-operator.crunchydata.com/pgbackrest-backup: backup-after-14-to-15-postgis + labels: + postgres-operator.crunchydata.com/pgbackrest-backup: manual + postgres-operator.crunchydata.com/pgbackrest-repo: repo1 + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGBackup + controller: true + blockOwnerDeletion: true +status: + succeeded: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGBackup +metadata: + name: backup-after-14-to-15-postgis +spec: + pgCluster: major-upgrade-14-to-15-postgis + repoName: repo1 + options: + - --type=full +status: + state: Succeeded diff --git a/e2e-tests/tests/major-upgrade-14-to-15-postgis/07-run-backup.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/07-run-backup.yaml new file mode 100644 index 000000000..7e99efb56 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/07-run-backup.yaml @@ -0,0 +1,9 @@ +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGBackup +metadata: + name: backup-after-14-to-15-postgis +spec: + pgCluster: major-upgrade-14-to-15-postgis + repoName: repo1 + options: + - --type=full diff --git a/e2e-tests/tests/major-upgrade-14-to-15-postgis/09-write-data.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/09-write-data.yaml new file mode 100644 index 000000000..973f78de3 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/09-write-data.yaml @@ -0,0 +1,16 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + run_psql_local \ + '\c myapp \\\ INSERT INTO myApp (id) VALUES (100502)' \ + "postgres:$(get_psql_user_pass major-upgrade-14-to-15-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-14-to-15-postgis-pguser-postgres)" + + run_psql_local \ + '\c mygisdata \\\ INSERT INTO gis.locations (id, geom) VALUES (3, ST_GeomFromText($$POINT(50 30)$$, 4326))' \ + "postgres:$(get_psql_user_pass major-upgrade-14-to-15-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-14-to-15-postgis-pguser-postgres)" diff --git a/e2e-tests/tests/major-upgrade-14-to-15-postgis/10-assert.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/10-assert.yaml new file mode 100644 index 000000000..dcb173052 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/10-assert.yaml @@ -0,0 +1,55 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 1500 +commands: + - script: |- + set -o errexit + + kubectl -n ${NAMESPACE} get pod + + for pod in $(kubectl -n ${NAMESPACE} get pods -l postgres-operator.crunchydata.com/data=postgres --no-headers | awk '{print $1}'); do + phase=$(kubectl -n ${NAMESPACE} get pod/${pod} -o jsonpath={".status.phase"}) + if [[ "${phase}" != "Running" ]]; then + echo "Waiting for ${pod} to start running" + continue + fi + echo "PostgreSQL logs from ${pod}:" + echo "find /pgdata/pg15/log -type f -iname 'postgresql*.log' -exec tail -n 30 {} \;" \ + | kubectl -n ${NAMESPACE} exec -it ${pod} -- bash 2>/dev/null + done + + sleep 30 +collectors: + - type: pod + selector: "postgres-operator.crunchydata.com/data=postgres" + tail: 30 + - type: pod + selector: "postgres-operator.crunchydata.com/pgbackrest-restore=''" + tail: 30 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGRestore +metadata: + name: restore-after-14-to-15-postgis +spec: + pgCluster: major-upgrade-14-to-15-postgis + repoName: repo1 +status: + state: Succeeded +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: major-upgrade-14-to-15-postgis +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/major-upgrade-14-to-15-postgis/10-run-restore.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/10-run-restore.yaml new file mode 100644 index 000000000..c632a6f87 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/10-run-restore.yaml @@ -0,0 +1,7 @@ +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGRestore +metadata: + name: restore-after-14-to-15-postgis +spec: + pgCluster: major-upgrade-14-to-15-postgis + repoName: repo1 diff --git a/e2e-tests/tests/major-upgrade-14-to-15-postgis/11-assert.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/11-assert.yaml new file mode 100644 index 000000000..d16cfe05e --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/11-assert.yaml @@ -0,0 +1,17 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 30 +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: 11-read-from-primary +data: + data: |2- + 100500 + 100501 + 100502 + postgis: |2- + POINT(30 10) + POINT(40 20) + POINT(50 30) diff --git a/e2e-tests/tests/major-upgrade-14-to-15-postgis/11-read-from-primary.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/11-read-from-primary.yaml new file mode 100644 index 000000000..de44cc60f --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/11-read-from-primary.yaml @@ -0,0 +1,13 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 30 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + data=$(run_psql_local '\c myapp \\\ SELECT * from myApp;' "postgres:$(get_psql_user_pass major-upgrade-14-to-15-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-14-to-15-postgis-pguser-postgres)") + postgis=$(run_psql_local '\c mygisdata \\\ SELECT ST_AsText(geom) FROM gis.locations ORDER BY id;' "postgres:$(get_psql_user_pass major-upgrade-14-to-15-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-14-to-15-postgis-pguser-postgres)") + + kubectl create configmap -n "${NAMESPACE}" 11-read-from-primary --from-literal=data="${data}" --from-literal=postgis="${postgis}" diff --git a/e2e-tests/tests/major-upgrade-14-to-15-postgis/99-remove-cluster-gracefully.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/99-remove-cluster-gracefully.yaml new file mode 100644 index 000000000..416bd1dcb --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/99-remove-cluster-gracefully.yaml @@ -0,0 +1,22 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +delete: +- apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + metadata: + name: major-upgrade-14-to-15-postgis +- apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + metadata: + name: major-upgrade-14-to-15-postgis +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + remove_all_finalizers + check_operator_panic + destroy_operator + timeout: 60 diff --git a/e2e-tests/tests/major-upgrade-14-to-15-postgis/conf/major-upgrade-14-to-15-postgis.yaml b/e2e-tests/tests/major-upgrade-14-to-15-postgis/conf/major-upgrade-14-to-15-postgis.yaml new file mode 100644 index 000000000..0770a389b --- /dev/null +++ b/e2e-tests/tests/major-upgrade-14-to-15-postgis/conf/major-upgrade-14-to-15-postgis.yaml @@ -0,0 +1,14 @@ +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: major-upgrade-14-to-15-postgis +spec: + extensions: + image: + imagePullPolicy: Always + storage: + type: s3 + bucket: pg-extensions + region: eu-central-1 + secret: + name: aws-s3-secret diff --git a/e2e-tests/tests/major-upgrade-15-to-16-postgis/00-assert.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/00-assert.yaml new file mode 100644 index 000000000..ae5a062d8 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/00-assert.yaml @@ -0,0 +1,24 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: perconapgclusters.pgv2.percona.com +spec: + group: pgv2.percona.com + names: + kind: PerconaPGCluster + listKind: PerconaPGClusterList + plural: perconapgclusters + singular: perconapgcluster + scope: Namespaced +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +metadata: + name: check-operator-deploy-status +timeout: 120 +commands: + - script: kubectl assert exist-enhanced deployment percona-postgresql-operator -n ${OPERATOR_NS:-$NAMESPACE} --field-selector status.readyReplicas=1 diff --git a/e2e-tests/tests/major-upgrade-15-to-16-postgis/00-deploy-operator.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/00-deploy-operator.yaml new file mode 100644 index 000000000..5d21c58f9 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/00-deploy-operator.yaml @@ -0,0 +1,13 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + init_temp_dir # do this only in the first TestStep + + deploy_operator + deploy_client + deploy_s3_secrets diff --git a/e2e-tests/tests/major-upgrade-15-to-16-postgis/01-assert.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/01-assert.yaml new file mode 100644 index 000000000..ffe259d81 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/01-assert.yaml @@ -0,0 +1,135 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: major-upgrade-15-to-16-postgis-repo-host + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-15-to-16-postgis + postgres-operator.crunchydata.com/data: pgbackrest + postgres-operator.crunchydata.com/pgbackrest: '' + postgres-operator.crunchydata.com/pgbackrest-dedicated: '' + ownerReferences: + - apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + name: major-upgrade-15-to-16-postgis + controller: true + blockOwnerDeletion: true +status: + observedGeneration: 1 + replicas: 1 + readyReplicas: 1 + currentReplicas: 1 + updatedReplicas: 1 + collisionCount: 0 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-15-to-16-postgis + postgres-operator.crunchydata.com/data: postgres + postgres-operator.crunchydata.com/instance-set: instance1 + ownerReferences: + - apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + name: major-upgrade-15-to-16-postgis + controller: true + blockOwnerDeletion: true +status: + observedGeneration: 1 + replicas: 1 + readyReplicas: 1 + currentReplicas: 1 + updatedReplicas: 1 + collisionCount: 0 +--- +kind: Deployment +apiVersion: apps/v1 +metadata: + name: major-upgrade-15-to-16-postgis-pgbouncer + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-15-to-16-postgis + postgres-operator.crunchydata.com/role: pgbouncer + annotations: + deployment.kubernetes.io/revision: '1' + ownerReferences: + - apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + name: major-upgrade-15-to-16-postgis + controller: true + blockOwnerDeletion: true +status: + observedGeneration: 1 + replicas: 3 + updatedReplicas: 3 + readyReplicas: 3 +--- +kind: Job +apiVersion: batch/v1 +metadata: + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-15-to-16-postgis + postgres-operator.crunchydata.com/pgbackrest: '' + postgres-operator.crunchydata.com/pgbackrest-backup: replica-create + postgres-operator.crunchydata.com/pgbackrest-repo: repo1 + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGBackup + controller: true + blockOwnerDeletion: true +status: + succeeded: 1 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: major-upgrade-15-to-16-postgis + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: major-upgrade-15-to-16-postgis + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 3 + replicas: 3 + updatedReplicas: 3 + observedGeneration: 1 + pgbackrest: + repoHost: + apiVersion: apps/v1 + kind: StatefulSet + ready: true + repos: + - bound: true + name: repo1 + replicaCreateBackupComplete: true + stanzaCreated: true + proxy: + pgBouncer: + readyReplicas: 3 + replicas: 3 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: major-upgrade-15-to-16-postgis +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/major-upgrade-15-to-16-postgis/01-create-cluster.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/01-create-cluster.yaml new file mode 100644 index 000000000..d8d1e3b14 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/01-create-cluster.yaml @@ -0,0 +1,30 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 10 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + postgres_image=$(get_container_image "postgis" 15) + pgbouncer_image=$(get_container_image "pgbouncer" 15) + pgbackrest_image=$(get_container_image "pgbackrest" 15) + + get_cr \ + | yq eval " + .spec.postgresVersion = 15 | + .spec.image = \"${postgres_image}\" | + .spec.instances[0].dataVolumeClaimSpec.resources.requests.storage = \"3Gi\" | + .spec.proxy.pgBouncer.image = \"${pgbouncer_image}\" | + .spec.backups.pgbackrest.image = \"${pgbackrest_image}\" | + .spec.patroni.removeDataDirectoryOnDivergedTimelines = true | + .spec.patroni.dynamicConfiguration.postgresql.parameters.shared_preload_libraries = \"pg_cron\" | + .spec.extensions.builtin.pg_stat_monitor = true | + .spec.extensions.builtin.pg_stat_statements = false | + .spec.extensions.builtin.pg_audit = true | + .spec.extensions.builtin.pgvector = true | + .spec.extensions.builtin.pg_repack = true | + .spec.extensions.custom += [{\"name\": \"pg_cron\", \"version\": \"1.6.6\"}]" \ + | kubectl -n "${NAMESPACE}" apply -f - diff --git a/e2e-tests/tests/major-upgrade-15-to-16-postgis/02-write-data.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/02-write-data.yaml new file mode 100644 index 000000000..dd3da8110 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/02-write-data.yaml @@ -0,0 +1,32 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + run_psql_local \ + 'CREATE DATABASE myapp; \c myapp \\\ CREATE TABLE IF NOT EXISTS myApp (id int PRIMARY KEY);' \ + "postgres:$(get_psql_user_pass major-upgrade-15-to-16-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-15-to-16-postgis-pguser-postgres)" + + run_psql_local \ + '\c myapp \\\ INSERT INTO myApp (id) VALUES (100500)' \ + "postgres:$(get_psql_user_pass major-upgrade-15-to-16-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-15-to-16-postgis-pguser-postgres)" + + primary=$(get_pod_by_role major-upgrade-15-to-16-postgis primary name) + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d postgres -c 'CREATE DATABASE mygisdata' + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d mygisdata -c 'CREATE SCHEMA gis' + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d mygisdata -c 'CREATE EXTENSION postgis' + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d mygisdata -c 'CREATE TABLE gis.locations (id int PRIMARY KEY, geom geometry(Point, 4326))' + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d mygisdata -c 'INSERT INTO gis.locations (id, geom) VALUES (1, ST_GeomFromText($$POINT(30 10)$$, 4326))' + + run_psql_local \ + '\c postgres \\\ CREATE EXTENSION pg_cron' \ + "postgres:$(get_psql_user_pass major-upgrade-15-to-16-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-15-to-16-postgis-pguser-postgres)" diff --git a/e2e-tests/tests/major-upgrade-15-to-16-postgis/03-assert.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/03-assert.yaml new file mode 100644 index 000000000..afd413428 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/03-assert.yaml @@ -0,0 +1,11 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 30 +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: 03-read-from-primary +data: + data: ' 100500' + postgis: ' POINT(30 10)' diff --git a/e2e-tests/tests/major-upgrade-15-to-16-postgis/03-read-from-primary.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/03-read-from-primary.yaml new file mode 100644 index 000000000..a05c294fe --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/03-read-from-primary.yaml @@ -0,0 +1,12 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + data=$(run_psql_local '\c myapp \\\ SELECT * from myApp;' "postgres:$(get_psql_user_pass major-upgrade-15-to-16-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-15-to-16-postgis-pguser-postgres)") + postgis=$(run_psql_local '\c mygisdata \\\ SELECT ST_AsText(geom) FROM gis.locations ORDER BY id;' "postgres:$(get_psql_user_pass major-upgrade-15-to-16-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-15-to-16-postgis-pguser-postgres)") + + kubectl create configmap -n "${NAMESPACE}" 03-read-from-primary --from-literal=data="${data}" --from-literal=postgis="${postgis}" diff --git a/e2e-tests/tests/major-upgrade-15-to-16-postgis/04-assert.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/04-assert.yaml new file mode 100644 index 000000000..2ea82233f --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/04-assert.yaml @@ -0,0 +1,61 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 360 +commands: +- script: |- + kubectl -n ${NAMESPACE} get cm \ + -l app.kubernetes.io/instance=major-upgrade-15-to-16-postgis \ + -l app.kubernetes.io/component=pg -o yaml + kubectl -n ${NAMESPACE} get pg,pod,job + sleep 5 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: major-upgrade-15-to-16-postgis +spec: + postgresVersion: 16 +status: + pgbouncer: + ready: 3 + size: 3 + postgres: + instances: + - name: instance1 + ready: 3 + size: 3 + ready: 3 + size: 3 + state: ready +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGUpgrade +metadata: + name: 15-to-16-postgis +status: + conditions: + - type: Progressing + reason: PGUpgradeCompleted + status: "False" + observedGeneration: 1 + - type: Succeeded + reason: PGUpgradeSucceeded + status: "True" + observedGeneration: 1 + observedGeneration: 1 +--- +kind: Job +apiVersion: batch/v1 +metadata: + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-15-to-16-postgis + postgres-operator.crunchydata.com/pgbackrest: '' + postgres-operator.crunchydata.com/pgbackrest-backup: replica-create + postgres-operator.crunchydata.com/pgbackrest-repo: repo1 + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGBackup + controller: true + blockOwnerDeletion: true +status: + succeeded: 1 diff --git a/e2e-tests/tests/major-upgrade-15-to-16-postgis/04-upgrade.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/04-upgrade.yaml new file mode 100644 index 000000000..f692d62ac --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/04-upgrade.yaml @@ -0,0 +1,23 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl apply -n ${NAMESPACE} -f - <<-EOF + apiVersion: pgv2.percona.com/v2 + kind: PerconaPGUpgrade + metadata: + name: 15-to-16-postgis + spec: + postgresClusterName: major-upgrade-15-to-16-postgis + image: ${IMAGE_UPGRADE} + fromPostgresVersion: 15 + toPostgresVersion: 16 + toPostgresImage: $(get_container_image "postgis" 16) + toPgBouncerImage: $(get_container_image "pgbouncer" 16) + toPgBackRestImage: $(get_container_image "pgbackrest" 16) + EOF diff --git a/e2e-tests/tests/major-upgrade-15-to-16-postgis/05-post-upgrade.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/05-post-upgrade.yaml new file mode 100644 index 000000000..fc7881033 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/05-post-upgrade.yaml @@ -0,0 +1,13 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + primary=$(get_pod_by_role major-upgrade-15-to-16-postgis primary name) + kubectl -n ${NAMESPACE} exec ${primary} -- vacuumdb --all --analyze-in-stages + kubectl -n ${NAMESPACE} exec ${primary} -- vacuumdb --all --analyze-only + kubectl -n ${NAMESPACE} exec ${primary} -- /pgdata/delete_old_cluster.sh diff --git a/e2e-tests/tests/major-upgrade-15-to-16-postgis/06-write-data.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/06-write-data.yaml new file mode 100644 index 000000000..cc5b0f383 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/06-write-data.yaml @@ -0,0 +1,16 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + run_psql_local \ + '\c myapp \\\ INSERT INTO myApp (id) VALUES (100501)' \ + "postgres:$(get_psql_user_pass major-upgrade-15-to-16-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-15-to-16-postgis-pguser-postgres)" + + run_psql_local \ + '\c mygisdata \\\ INSERT INTO gis.locations (id, geom) VALUES (2, ST_GeomFromText($$POINT(40 20)$$, 4326))' \ + "postgres:$(get_psql_user_pass major-upgrade-15-to-16-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-15-to-16-postgis-pguser-postgres)" diff --git a/e2e-tests/tests/major-upgrade-15-to-16-postgis/07-assert.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/07-assert.yaml new file mode 100644 index 000000000..afb535192 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/07-assert.yaml @@ -0,0 +1,31 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 660 +--- +kind: Job +apiVersion: batch/v1 +metadata: + annotations: + postgres-operator.crunchydata.com/pgbackrest-backup: backup-after-15-to-16-postgis + labels: + postgres-operator.crunchydata.com/pgbackrest-backup: manual + postgres-operator.crunchydata.com/pgbackrest-repo: repo1 + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGBackup + controller: true + blockOwnerDeletion: true +status: + succeeded: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGBackup +metadata: + name: backup-after-15-to-16-postgis +spec: + pgCluster: major-upgrade-15-to-16-postgis + repoName: repo1 + options: + - --type=full +status: + state: Succeeded diff --git a/e2e-tests/tests/major-upgrade-15-to-16-postgis/07-run-backup.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/07-run-backup.yaml new file mode 100644 index 000000000..3a6a38624 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/07-run-backup.yaml @@ -0,0 +1,9 @@ +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGBackup +metadata: + name: backup-after-15-to-16-postgis +spec: + pgCluster: major-upgrade-15-to-16-postgis + repoName: repo1 + options: + - --type=full diff --git a/e2e-tests/tests/major-upgrade-15-to-16-postgis/09-write-data.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/09-write-data.yaml new file mode 100644 index 000000000..cafbc73ad --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/09-write-data.yaml @@ -0,0 +1,16 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + run_psql_local \ + '\c myapp \\\ INSERT INTO myApp (id) VALUES (100502)' \ + "postgres:$(get_psql_user_pass major-upgrade-15-to-16-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-15-to-16-postgis-pguser-postgres)" + + run_psql_local \ + '\c mygisdata \\\ INSERT INTO gis.locations (id, geom) VALUES (3, ST_GeomFromText($$POINT(50 30)$$, 4326))' \ + "postgres:$(get_psql_user_pass major-upgrade-15-to-16-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-15-to-16-postgis-pguser-postgres)" diff --git a/e2e-tests/tests/major-upgrade-15-to-16-postgis/10-assert.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/10-assert.yaml new file mode 100644 index 000000000..afceadef8 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/10-assert.yaml @@ -0,0 +1,55 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 1500 +commands: + - script: |- + set -o errexit + + kubectl -n ${NAMESPACE} get pod + + for pod in $(kubectl -n ${NAMESPACE} get pods -l postgres-operator.crunchydata.com/data=postgres --no-headers | awk '{print $1}'); do + phase=$(kubectl -n ${NAMESPACE} get pod/${pod} -o jsonpath={".status.phase"}) + if [[ "${phase}" != "Running" ]]; then + echo "Waiting for ${pod} to start running" + continue + fi + echo "PostgreSQL logs from ${pod}:" + echo "find /pgdata/pg16/log -type f -iname 'postgresql*.log' -exec tail -n 30 {} \;" \ + | kubectl -n ${NAMESPACE} exec -it ${pod} -- bash 2>/dev/null + done + + sleep 30 +collectors: + - type: pod + selector: "postgres-operator.crunchydata.com/data=postgres" + tail: 30 + - type: pod + selector: "postgres-operator.crunchydata.com/pgbackrest-restore=''" + tail: 30 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGRestore +metadata: + name: restore-after-15-to-16-postgis +spec: + pgCluster: major-upgrade-15-to-16-postgis + repoName: repo1 +status: + state: Succeeded +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: major-upgrade-15-to-16-postgis +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/major-upgrade-15-to-16-postgis/10-run-restore.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/10-run-restore.yaml new file mode 100644 index 000000000..d0aa63bfc --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/10-run-restore.yaml @@ -0,0 +1,7 @@ +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGRestore +metadata: + name: restore-after-15-to-16-postgis +spec: + pgCluster: major-upgrade-15-to-16-postgis + repoName: repo1 diff --git a/e2e-tests/tests/major-upgrade-15-to-16-postgis/11-assert.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/11-assert.yaml new file mode 100644 index 000000000..d16cfe05e --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/11-assert.yaml @@ -0,0 +1,17 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 30 +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: 11-read-from-primary +data: + data: |2- + 100500 + 100501 + 100502 + postgis: |2- + POINT(30 10) + POINT(40 20) + POINT(50 30) diff --git a/e2e-tests/tests/major-upgrade-15-to-16-postgis/11-read-from-primary.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/11-read-from-primary.yaml new file mode 100644 index 000000000..37f905fa0 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/11-read-from-primary.yaml @@ -0,0 +1,13 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 30 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + data=$(run_psql_local '\c myapp \\\ SELECT * from myApp;' "postgres:$(get_psql_user_pass major-upgrade-15-to-16-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-15-to-16-postgis-pguser-postgres)") + postgis=$(run_psql_local '\c mygisdata \\\ SELECT ST_AsText(geom) FROM gis.locations ORDER BY id;' "postgres:$(get_psql_user_pass major-upgrade-15-to-16-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-15-to-16-postgis-pguser-postgres)") + + kubectl create configmap -n "${NAMESPACE}" 11-read-from-primary --from-literal=data="${data}" --from-literal=postgis="${postgis}" diff --git a/e2e-tests/tests/major-upgrade-15-to-16-postgis/99-remove-cluster-gracefully.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/99-remove-cluster-gracefully.yaml new file mode 100644 index 000000000..4a58a648e --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/99-remove-cluster-gracefully.yaml @@ -0,0 +1,22 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +delete: +- apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + metadata: + name: major-upgrade-15-to-16-postgis +- apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + metadata: + name: major-upgrade-15-to-16-postgis +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + remove_all_finalizers + check_operator_panic + destroy_operator + timeout: 60 diff --git a/e2e-tests/tests/major-upgrade-15-to-16-postgis/conf/major-upgrade-15-to-16-postgis.yaml b/e2e-tests/tests/major-upgrade-15-to-16-postgis/conf/major-upgrade-15-to-16-postgis.yaml new file mode 100644 index 000000000..0a8e57113 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-15-to-16-postgis/conf/major-upgrade-15-to-16-postgis.yaml @@ -0,0 +1,14 @@ +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: major-upgrade-15-to-16-postgis +spec: + extensions: + image: + imagePullPolicy: Always + storage: + type: s3 + bucket: pg-extensions + region: eu-central-1 + secret: + name: aws-s3-secret diff --git a/e2e-tests/tests/major-upgrade-16-to-17-postgis/00-assert.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/00-assert.yaml new file mode 100644 index 000000000..ae5a062d8 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/00-assert.yaml @@ -0,0 +1,24 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: perconapgclusters.pgv2.percona.com +spec: + group: pgv2.percona.com + names: + kind: PerconaPGCluster + listKind: PerconaPGClusterList + plural: perconapgclusters + singular: perconapgcluster + scope: Namespaced +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +metadata: + name: check-operator-deploy-status +timeout: 120 +commands: + - script: kubectl assert exist-enhanced deployment percona-postgresql-operator -n ${OPERATOR_NS:-$NAMESPACE} --field-selector status.readyReplicas=1 diff --git a/e2e-tests/tests/major-upgrade-16-to-17-postgis/00-deploy-operator.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/00-deploy-operator.yaml new file mode 100644 index 000000000..5d21c58f9 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/00-deploy-operator.yaml @@ -0,0 +1,13 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + init_temp_dir # do this only in the first TestStep + + deploy_operator + deploy_client + deploy_s3_secrets diff --git a/e2e-tests/tests/major-upgrade-16-to-17-postgis/01-assert.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/01-assert.yaml new file mode 100644 index 000000000..24dbe3cce --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/01-assert.yaml @@ -0,0 +1,135 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: major-upgrade-16-to-17-postgis-repo-host + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-16-to-17-postgis + postgres-operator.crunchydata.com/data: pgbackrest + postgres-operator.crunchydata.com/pgbackrest: '' + postgres-operator.crunchydata.com/pgbackrest-dedicated: '' + ownerReferences: + - apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + name: major-upgrade-16-to-17-postgis + controller: true + blockOwnerDeletion: true +status: + observedGeneration: 1 + replicas: 1 + readyReplicas: 1 + currentReplicas: 1 + updatedReplicas: 1 + collisionCount: 0 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-16-to-17-postgis + postgres-operator.crunchydata.com/data: postgres + postgres-operator.crunchydata.com/instance-set: instance1 + ownerReferences: + - apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + name: major-upgrade-16-to-17-postgis + controller: true + blockOwnerDeletion: true +status: + observedGeneration: 1 + replicas: 1 + readyReplicas: 1 + currentReplicas: 1 + updatedReplicas: 1 + collisionCount: 0 +--- +kind: Deployment +apiVersion: apps/v1 +metadata: + name: major-upgrade-16-to-17-postgis-pgbouncer + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-16-to-17-postgis + postgres-operator.crunchydata.com/role: pgbouncer + annotations: + deployment.kubernetes.io/revision: '1' + ownerReferences: + - apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + name: major-upgrade-16-to-17-postgis + controller: true + blockOwnerDeletion: true +status: + observedGeneration: 1 + replicas: 3 + updatedReplicas: 3 + readyReplicas: 3 +--- +kind: Job +apiVersion: batch/v1 +metadata: + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-16-to-17-postgis + postgres-operator.crunchydata.com/pgbackrest: '' + postgres-operator.crunchydata.com/pgbackrest-backup: replica-create + postgres-operator.crunchydata.com/pgbackrest-repo: repo1 + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGBackup + controller: true + blockOwnerDeletion: true +status: + succeeded: 1 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: major-upgrade-16-to-17-postgis + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: major-upgrade-16-to-17-postgis + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 3 + replicas: 3 + updatedReplicas: 3 + observedGeneration: 1 + pgbackrest: + repoHost: + apiVersion: apps/v1 + kind: StatefulSet + ready: true + repos: + - bound: true + name: repo1 + replicaCreateBackupComplete: true + stanzaCreated: true + proxy: + pgBouncer: + readyReplicas: 3 + replicas: 3 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: major-upgrade-16-to-17-postgis +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/major-upgrade-16-to-17-postgis/01-create-cluster.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/01-create-cluster.yaml new file mode 100644 index 000000000..6edbe4787 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/01-create-cluster.yaml @@ -0,0 +1,30 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 10 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + postgres_image=$(get_container_image "postgis" 16) + pgbouncer_image=$(get_container_image "pgbouncer" 16) + pgbackrest_image=$(get_container_image "pgbackrest" 16) + + get_cr \ + | yq eval " + .spec.postgresVersion = 16 | + .spec.image = \"${postgres_image}\" | + .spec.instances[0].dataVolumeClaimSpec.resources.requests.storage = \"3Gi\" | + .spec.proxy.pgBouncer.image = \"${pgbouncer_image}\" | + .spec.backups.pgbackrest.image = \"${pgbackrest_image}\" | + .spec.patroni.removeDataDirectoryOnDivergedTimelines = true | + .spec.patroni.dynamicConfiguration.postgresql.parameters.shared_preload_libraries = \"pg_cron\" | + .spec.extensions.builtin.pg_stat_monitor = true | + .spec.extensions.builtin.pg_stat_statements = false | + .spec.extensions.builtin.pg_audit = true | + .spec.extensions.builtin.pgvector = true | + .spec.extensions.builtin.pg_repack = true | + .spec.extensions.custom += [{\"name\": \"pg_cron\", \"version\": \"1.6.6\"}]" \ + | kubectl -n "${NAMESPACE}" apply -f - diff --git a/e2e-tests/tests/major-upgrade-16-to-17-postgis/02-write-data.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/02-write-data.yaml new file mode 100644 index 000000000..532e5a620 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/02-write-data.yaml @@ -0,0 +1,32 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + run_psql_local \ + 'CREATE DATABASE myapp; \c myapp \\\ CREATE TABLE IF NOT EXISTS myApp (id int PRIMARY KEY);' \ + "postgres:$(get_psql_user_pass major-upgrade-16-to-17-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-16-to-17-postgis-pguser-postgres)" + + run_psql_local \ + '\c myapp \\\ INSERT INTO myApp (id) VALUES (100500)' \ + "postgres:$(get_psql_user_pass major-upgrade-16-to-17-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-16-to-17-postgis-pguser-postgres)" + + primary=$(get_pod_by_role major-upgrade-16-to-17-postgis primary name) + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d postgres -c 'CREATE DATABASE mygisdata' + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d mygisdata -c 'CREATE SCHEMA gis' + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d mygisdata -c 'CREATE EXTENSION postgis' + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d mygisdata -c 'CREATE TABLE gis.locations (id int PRIMARY KEY, geom geometry(Point, 4326))' + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d mygisdata -c 'INSERT INTO gis.locations (id, geom) VALUES (1, ST_GeomFromText($$POINT(30 10)$$, 4326))' + + run_psql_local \ + '\c postgres \\\ CREATE EXTENSION pg_cron' \ + "postgres:$(get_psql_user_pass major-upgrade-16-to-17-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-16-to-17-postgis-pguser-postgres)" diff --git a/e2e-tests/tests/major-upgrade-16-to-17-postgis/03-assert.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/03-assert.yaml new file mode 100644 index 000000000..afd413428 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/03-assert.yaml @@ -0,0 +1,11 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 30 +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: 03-read-from-primary +data: + data: ' 100500' + postgis: ' POINT(30 10)' diff --git a/e2e-tests/tests/major-upgrade-16-to-17-postgis/03-read-from-primary.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/03-read-from-primary.yaml new file mode 100644 index 000000000..fb7f64182 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/03-read-from-primary.yaml @@ -0,0 +1,12 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + data=$(run_psql_local '\c myapp \\\ SELECT * from myApp;' "postgres:$(get_psql_user_pass major-upgrade-16-to-17-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-16-to-17-postgis-pguser-postgres)") + postgis=$(run_psql_local '\c mygisdata \\\ SELECT ST_AsText(geom) FROM gis.locations ORDER BY id;' "postgres:$(get_psql_user_pass major-upgrade-16-to-17-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-16-to-17-postgis-pguser-postgres)") + + kubectl create configmap -n "${NAMESPACE}" 03-read-from-primary --from-literal=data="${data}" --from-literal=postgis="${postgis}" diff --git a/e2e-tests/tests/major-upgrade-16-to-17-postgis/04-assert.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/04-assert.yaml new file mode 100644 index 000000000..2eed9659a --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/04-assert.yaml @@ -0,0 +1,61 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 360 +commands: +- script: |- + kubectl -n ${NAMESPACE} get cm \ + -l app.kubernetes.io/instance=major-upgrade-16-to-17-postgis \ + -l app.kubernetes.io/component=pg -o yaml + kubectl -n ${NAMESPACE} get pg,pod,job + sleep 5 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: major-upgrade-16-to-17-postgis +spec: + postgresVersion: 17 +status: + pgbouncer: + ready: 3 + size: 3 + postgres: + instances: + - name: instance1 + ready: 3 + size: 3 + ready: 3 + size: 3 + state: ready +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGUpgrade +metadata: + name: 16-to-17-postgis +status: + conditions: + - type: Progressing + reason: PGUpgradeCompleted + status: "False" + observedGeneration: 1 + - type: Succeeded + reason: PGUpgradeSucceeded + status: "True" + observedGeneration: 1 + observedGeneration: 1 +--- +kind: Job +apiVersion: batch/v1 +metadata: + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-16-to-17-postgis + postgres-operator.crunchydata.com/pgbackrest: '' + postgres-operator.crunchydata.com/pgbackrest-backup: replica-create + postgres-operator.crunchydata.com/pgbackrest-repo: repo1 + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGBackup + controller: true + blockOwnerDeletion: true +status: + succeeded: 1 diff --git a/e2e-tests/tests/major-upgrade-16-to-17-postgis/04-upgrade.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/04-upgrade.yaml new file mode 100644 index 000000000..09530069c --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/04-upgrade.yaml @@ -0,0 +1,23 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl apply -n ${NAMESPACE} -f - <<-EOF + apiVersion: pgv2.percona.com/v2 + kind: PerconaPGUpgrade + metadata: + name: 16-to-17-postgis + spec: + postgresClusterName: major-upgrade-16-to-17-postgis + image: ${IMAGE_UPGRADE} + fromPostgresVersion: 16 + toPostgresVersion: 17 + toPostgresImage: $(get_container_image "postgis" 17) + toPgBouncerImage: $(get_container_image "pgbouncer" 17) + toPgBackRestImage: $(get_container_image "pgbackrest" 17) + EOF diff --git a/e2e-tests/tests/major-upgrade-16-to-17-postgis/05-post-upgrade.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/05-post-upgrade.yaml new file mode 100644 index 000000000..05354baa9 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/05-post-upgrade.yaml @@ -0,0 +1,13 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + primary=$(get_pod_by_role major-upgrade-16-to-17-postgis primary name) + kubectl -n ${NAMESPACE} exec ${primary} -- vacuumdb --all --analyze-in-stages + kubectl -n ${NAMESPACE} exec ${primary} -- vacuumdb --all --analyze-only + kubectl -n ${NAMESPACE} exec ${primary} -- /pgdata/delete_old_cluster.sh diff --git a/e2e-tests/tests/major-upgrade-16-to-17-postgis/06-write-data.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/06-write-data.yaml new file mode 100644 index 000000000..70eb6f356 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/06-write-data.yaml @@ -0,0 +1,16 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + run_psql_local \ + '\c myapp \\\ INSERT INTO myApp (id) VALUES (100501)' \ + "postgres:$(get_psql_user_pass major-upgrade-16-to-17-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-16-to-17-postgis-pguser-postgres)" + + run_psql_local \ + '\c mygisdata \\\ INSERT INTO gis.locations (id, geom) VALUES (2, ST_GeomFromText($$POINT(40 20)$$, 4326))' \ + "postgres:$(get_psql_user_pass major-upgrade-16-to-17-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-16-to-17-postgis-pguser-postgres)" diff --git a/e2e-tests/tests/major-upgrade-16-to-17-postgis/07-assert.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/07-assert.yaml new file mode 100644 index 000000000..27a2ebad9 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/07-assert.yaml @@ -0,0 +1,31 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 660 +--- +kind: Job +apiVersion: batch/v1 +metadata: + annotations: + postgres-operator.crunchydata.com/pgbackrest-backup: backup-after-16-to-17-postgis + labels: + postgres-operator.crunchydata.com/pgbackrest-backup: manual + postgres-operator.crunchydata.com/pgbackrest-repo: repo1 + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGBackup + controller: true + blockOwnerDeletion: true +status: + succeeded: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGBackup +metadata: + name: backup-after-16-to-17-postgis +spec: + pgCluster: major-upgrade-16-to-17-postgis + repoName: repo1 + options: + - --type=full +status: + state: Succeeded diff --git a/e2e-tests/tests/major-upgrade-16-to-17-postgis/07-run-backup.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/07-run-backup.yaml new file mode 100644 index 000000000..c2f67da34 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/07-run-backup.yaml @@ -0,0 +1,9 @@ +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGBackup +metadata: + name: backup-after-16-to-17-postgis +spec: + pgCluster: major-upgrade-16-to-17-postgis + repoName: repo1 + options: + - --type=full diff --git a/e2e-tests/tests/major-upgrade-16-to-17-postgis/09-write-data.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/09-write-data.yaml new file mode 100644 index 000000000..c00d62bd0 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/09-write-data.yaml @@ -0,0 +1,16 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + run_psql_local \ + '\c myapp \\\ INSERT INTO myApp (id) VALUES (100502)' \ + "postgres:$(get_psql_user_pass major-upgrade-16-to-17-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-16-to-17-postgis-pguser-postgres)" + + run_psql_local \ + '\c mygisdata \\\ INSERT INTO gis.locations (id, geom) VALUES (3, ST_GeomFromText($$POINT(50 30)$$, 4326))' \ + "postgres:$(get_psql_user_pass major-upgrade-16-to-17-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-16-to-17-postgis-pguser-postgres)" diff --git a/e2e-tests/tests/major-upgrade-16-to-17-postgis/10-assert.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/10-assert.yaml new file mode 100644 index 000000000..d5035fa3e --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/10-assert.yaml @@ -0,0 +1,55 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 1500 +commands: + - script: |- + set -o errexit + + kubectl -n ${NAMESPACE} get pod + + for pod in $(kubectl -n ${NAMESPACE} get pods -l postgres-operator.crunchydata.com/data=postgres --no-headers | awk '{print $1}'); do + phase=$(kubectl -n ${NAMESPACE} get pod/${pod} -o jsonpath={".status.phase"}) + if [[ "${phase}" != "Running" ]]; then + echo "Waiting for ${pod} to start running" + continue + fi + echo "PostgreSQL logs from ${pod}:" + echo "find /pgdata/pg17/log -type f -iname 'postgresql*.log' -exec tail -n 30 {} \;" \ + | kubectl -n ${NAMESPACE} exec -it ${pod} -- bash 2>/dev/null + done + + sleep 30 +collectors: + - type: pod + selector: "postgres-operator.crunchydata.com/data=postgres" + tail: 30 + - type: pod + selector: "postgres-operator.crunchydata.com/pgbackrest-restore=''" + tail: 30 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGRestore +metadata: + name: restore-after-16-to-17-postgis +spec: + pgCluster: major-upgrade-16-to-17-postgis + repoName: repo1 +status: + state: Succeeded +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: major-upgrade-16-to-17-postgis +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/major-upgrade-16-to-17-postgis/10-run-restore.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/10-run-restore.yaml new file mode 100644 index 000000000..b1390a98e --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/10-run-restore.yaml @@ -0,0 +1,7 @@ +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGRestore +metadata: + name: restore-after-16-to-17-postgis +spec: + pgCluster: major-upgrade-16-to-17-postgis + repoName: repo1 diff --git a/e2e-tests/tests/major-upgrade-16-to-17-postgis/11-assert.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/11-assert.yaml new file mode 100644 index 000000000..d16cfe05e --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/11-assert.yaml @@ -0,0 +1,17 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 30 +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: 11-read-from-primary +data: + data: |2- + 100500 + 100501 + 100502 + postgis: |2- + POINT(30 10) + POINT(40 20) + POINT(50 30) diff --git a/e2e-tests/tests/major-upgrade-16-to-17-postgis/11-read-from-primary.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/11-read-from-primary.yaml new file mode 100644 index 000000000..abcbe151e --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/11-read-from-primary.yaml @@ -0,0 +1,13 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 30 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + data=$(run_psql_local '\c myapp \\\ SELECT * from myApp;' "postgres:$(get_psql_user_pass major-upgrade-16-to-17-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-16-to-17-postgis-pguser-postgres)") + postgis=$(run_psql_local '\c mygisdata \\\ SELECT ST_AsText(geom) FROM gis.locations ORDER BY id;' "postgres:$(get_psql_user_pass major-upgrade-16-to-17-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-16-to-17-postgis-pguser-postgres)") + + kubectl create configmap -n "${NAMESPACE}" 11-read-from-primary --from-literal=data="${data}" --from-literal=postgis="${postgis}" diff --git a/e2e-tests/tests/major-upgrade-16-to-17-postgis/99-remove-cluster-gracefully.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/99-remove-cluster-gracefully.yaml new file mode 100644 index 000000000..beaecf79a --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/99-remove-cluster-gracefully.yaml @@ -0,0 +1,22 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +delete: +- apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + metadata: + name: major-upgrade-16-to-17-postgis +- apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + metadata: + name: major-upgrade-16-to-17-postgis +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + remove_all_finalizers + check_operator_panic + destroy_operator + timeout: 60 diff --git a/e2e-tests/tests/major-upgrade-16-to-17-postgis/conf/major-upgrade-16-to-17-postgis.yaml b/e2e-tests/tests/major-upgrade-16-to-17-postgis/conf/major-upgrade-16-to-17-postgis.yaml new file mode 100644 index 000000000..613987ef0 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-16-to-17-postgis/conf/major-upgrade-16-to-17-postgis.yaml @@ -0,0 +1,14 @@ +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: major-upgrade-16-to-17-postgis +spec: + extensions: + image: + imagePullPolicy: Always + storage: + type: s3 + bucket: pg-extensions + region: eu-central-1 + secret: + name: aws-s3-secret diff --git a/e2e-tests/tests/major-upgrade-17-to-18-postgis/00-assert.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/00-assert.yaml new file mode 100644 index 000000000..ae5a062d8 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/00-assert.yaml @@ -0,0 +1,24 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: perconapgclusters.pgv2.percona.com +spec: + group: pgv2.percona.com + names: + kind: PerconaPGCluster + listKind: PerconaPGClusterList + plural: perconapgclusters + singular: perconapgcluster + scope: Namespaced +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +metadata: + name: check-operator-deploy-status +timeout: 120 +commands: + - script: kubectl assert exist-enhanced deployment percona-postgresql-operator -n ${OPERATOR_NS:-$NAMESPACE} --field-selector status.readyReplicas=1 diff --git a/e2e-tests/tests/major-upgrade-17-to-18-postgis/00-deploy-operator.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/00-deploy-operator.yaml new file mode 100644 index 000000000..5d21c58f9 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/00-deploy-operator.yaml @@ -0,0 +1,13 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + init_temp_dir # do this only in the first TestStep + + deploy_operator + deploy_client + deploy_s3_secrets diff --git a/e2e-tests/tests/major-upgrade-17-to-18-postgis/01-assert.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/01-assert.yaml new file mode 100644 index 000000000..8f550f493 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/01-assert.yaml @@ -0,0 +1,135 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: major-upgrade-17-to-18-postgis-repo-host + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-17-to-18-postgis + postgres-operator.crunchydata.com/data: pgbackrest + postgres-operator.crunchydata.com/pgbackrest: '' + postgres-operator.crunchydata.com/pgbackrest-dedicated: '' + ownerReferences: + - apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + name: major-upgrade-17-to-18-postgis + controller: true + blockOwnerDeletion: true +status: + observedGeneration: 1 + replicas: 1 + readyReplicas: 1 + currentReplicas: 1 + updatedReplicas: 1 + collisionCount: 0 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-17-to-18-postgis + postgres-operator.crunchydata.com/data: postgres + postgres-operator.crunchydata.com/instance-set: instance1 + ownerReferences: + - apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + name: major-upgrade-17-to-18-postgis + controller: true + blockOwnerDeletion: true +status: + observedGeneration: 1 + replicas: 1 + readyReplicas: 1 + currentReplicas: 1 + updatedReplicas: 1 + collisionCount: 0 +--- +kind: Deployment +apiVersion: apps/v1 +metadata: + name: major-upgrade-17-to-18-postgis-pgbouncer + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-17-to-18-postgis + postgres-operator.crunchydata.com/role: pgbouncer + annotations: + deployment.kubernetes.io/revision: '1' + ownerReferences: + - apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + name: major-upgrade-17-to-18-postgis + controller: true + blockOwnerDeletion: true +status: + observedGeneration: 1 + replicas: 3 + updatedReplicas: 3 + readyReplicas: 3 +--- +kind: Job +apiVersion: batch/v1 +metadata: + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-17-to-18-postgis + postgres-operator.crunchydata.com/pgbackrest: '' + postgres-operator.crunchydata.com/pgbackrest-backup: replica-create + postgres-operator.crunchydata.com/pgbackrest-repo: repo1 + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGBackup + controller: true + blockOwnerDeletion: true +status: + succeeded: 1 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: major-upgrade-17-to-18-postgis + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: major-upgrade-17-to-18-postgis + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 3 + replicas: 3 + updatedReplicas: 3 + observedGeneration: 1 + pgbackrest: + repoHost: + apiVersion: apps/v1 + kind: StatefulSet + ready: true + repos: + - bound: true + name: repo1 + replicaCreateBackupComplete: true + stanzaCreated: true + proxy: + pgBouncer: + readyReplicas: 3 + replicas: 3 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: major-upgrade-17-to-18-postgis +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/major-upgrade-17-to-18-postgis/01-create-cluster.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/01-create-cluster.yaml new file mode 100644 index 000000000..622638b2a --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/01-create-cluster.yaml @@ -0,0 +1,30 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 10 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + postgres_image=$(get_container_image "postgis" 17) + pgbouncer_image=$(get_container_image "pgbouncer" 17) + pgbackrest_image=$(get_container_image "pgbackrest" 17) + + get_cr \ + | yq eval " + .spec.postgresVersion = 17 | + .spec.image = \"${postgres_image}\" | + .spec.instances[0].dataVolumeClaimSpec.resources.requests.storage = \"3Gi\" | + .spec.proxy.pgBouncer.image = \"${pgbouncer_image}\" | + .spec.backups.pgbackrest.image = \"${pgbackrest_image}\" | + .spec.patroni.removeDataDirectoryOnDivergedTimelines = true | + .spec.patroni.dynamicConfiguration.postgresql.parameters.shared_preload_libraries = \"pg_cron\" | + .spec.extensions.builtin.pg_stat_monitor = true | + .spec.extensions.builtin.pg_stat_statements = false | + .spec.extensions.builtin.pg_audit = true | + .spec.extensions.builtin.pgvector = true | + .spec.extensions.builtin.pg_repack = true | + .spec.extensions.custom += [{\"name\": \"pg_cron\", \"version\": \"1.6.6\"}]" \ + | kubectl -n "${NAMESPACE}" apply -f - diff --git a/e2e-tests/tests/major-upgrade-17-to-18-postgis/02-write-data.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/02-write-data.yaml new file mode 100644 index 000000000..8a74b256d --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/02-write-data.yaml @@ -0,0 +1,32 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + run_psql_local \ + 'CREATE DATABASE myapp; \c myapp \\\ CREATE TABLE IF NOT EXISTS myApp (id int PRIMARY KEY);' \ + "postgres:$(get_psql_user_pass major-upgrade-17-to-18-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-17-to-18-postgis-pguser-postgres)" + + run_psql_local \ + '\c myapp \\\ INSERT INTO myApp (id) VALUES (100500)' \ + "postgres:$(get_psql_user_pass major-upgrade-17-to-18-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-17-to-18-postgis-pguser-postgres)" + + primary=$(get_pod_by_role major-upgrade-17-to-18-postgis primary name) + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d postgres -c 'CREATE DATABASE mygisdata' + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d mygisdata -c 'CREATE SCHEMA gis' + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d mygisdata -c 'CREATE EXTENSION postgis' + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d mygisdata -c 'CREATE TABLE gis.locations (id int PRIMARY KEY, geom geometry(Point, 4326))' + kubectl -n ${NAMESPACE} exec ${primary} -- \ + psql -v ON_ERROR_STOP=1 -d mygisdata -c 'INSERT INTO gis.locations (id, geom) VALUES (1, ST_GeomFromText($$POINT(30 10)$$, 4326))' + + run_psql_local \ + '\c postgres \\\ CREATE EXTENSION pg_cron' \ + "postgres:$(get_psql_user_pass major-upgrade-17-to-18-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-17-to-18-postgis-pguser-postgres)" diff --git a/e2e-tests/tests/major-upgrade-17-to-18-postgis/03-assert.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/03-assert.yaml new file mode 100644 index 000000000..afd413428 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/03-assert.yaml @@ -0,0 +1,11 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 30 +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: 03-read-from-primary +data: + data: ' 100500' + postgis: ' POINT(30 10)' diff --git a/e2e-tests/tests/major-upgrade-17-to-18-postgis/03-read-from-primary.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/03-read-from-primary.yaml new file mode 100644 index 000000000..17b4a33c4 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/03-read-from-primary.yaml @@ -0,0 +1,12 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + data=$(run_psql_local '\c myapp \\\ SELECT * from myApp;' "postgres:$(get_psql_user_pass major-upgrade-17-to-18-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-17-to-18-postgis-pguser-postgres)") + postgis=$(run_psql_local '\c mygisdata \\\ SELECT ST_AsText(geom) FROM gis.locations ORDER BY id;' "postgres:$(get_psql_user_pass major-upgrade-17-to-18-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-17-to-18-postgis-pguser-postgres)") + + kubectl create configmap -n "${NAMESPACE}" 03-read-from-primary --from-literal=data="${data}" --from-literal=postgis="${postgis}" diff --git a/e2e-tests/tests/major-upgrade-17-to-18-postgis/04-assert.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/04-assert.yaml new file mode 100644 index 000000000..b6fc04eff --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/04-assert.yaml @@ -0,0 +1,61 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 360 +commands: +- script: |- + kubectl -n ${NAMESPACE} get cm \ + -l app.kubernetes.io/instance=major-upgrade-17-to-18-postgis \ + -l app.kubernetes.io/component=pg -o yaml + kubectl -n ${NAMESPACE} get pg,pod,job + sleep 5 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: major-upgrade-17-to-18-postgis +spec: + postgresVersion: 18 +status: + pgbouncer: + ready: 3 + size: 3 + postgres: + instances: + - name: instance1 + ready: 3 + size: 3 + ready: 3 + size: 3 + state: ready +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGUpgrade +metadata: + name: 17-to-18-postgis +status: + conditions: + - type: Progressing + reason: PGUpgradeCompleted + status: "False" + observedGeneration: 1 + - type: Succeeded + reason: PGUpgradeSucceeded + status: "True" + observedGeneration: 1 + observedGeneration: 1 +--- +kind: Job +apiVersion: batch/v1 +metadata: + labels: + postgres-operator.crunchydata.com/cluster: major-upgrade-17-to-18-postgis + postgres-operator.crunchydata.com/pgbackrest: '' + postgres-operator.crunchydata.com/pgbackrest-backup: replica-create + postgres-operator.crunchydata.com/pgbackrest-repo: repo1 + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGBackup + controller: true + blockOwnerDeletion: true +status: + succeeded: 1 diff --git a/e2e-tests/tests/major-upgrade-17-to-18-postgis/04-upgrade.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/04-upgrade.yaml new file mode 100644 index 000000000..83bc13896 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/04-upgrade.yaml @@ -0,0 +1,23 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl apply -n ${NAMESPACE} -f - <<-EOF + apiVersion: pgv2.percona.com/v2 + kind: PerconaPGUpgrade + metadata: + name: 17-to-18-postgis + spec: + postgresClusterName: major-upgrade-17-to-18-postgis + image: ${IMAGE_UPGRADE} + fromPostgresVersion: 17 + toPostgresVersion: 18 + toPostgresImage: $(get_container_image "postgis" 18) + toPgBouncerImage: $(get_container_image "pgbouncer" 18) + toPgBackRestImage: $(get_container_image "pgbackrest" 18) + EOF diff --git a/e2e-tests/tests/major-upgrade-17-to-18-postgis/05-post-upgrade.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/05-post-upgrade.yaml new file mode 100644 index 000000000..9a5e327a6 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/05-post-upgrade.yaml @@ -0,0 +1,13 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + primary=$(get_pod_by_role major-upgrade-17-to-18-postgis primary name) + kubectl -n ${NAMESPACE} exec ${primary} -- vacuumdb --all --analyze-in-stages + kubectl -n ${NAMESPACE} exec ${primary} -- vacuumdb --all --analyze-only + kubectl -n ${NAMESPACE} exec ${primary} -- /pgdata/delete_old_cluster.sh diff --git a/e2e-tests/tests/major-upgrade-17-to-18-postgis/06-write-data.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/06-write-data.yaml new file mode 100644 index 000000000..654fc7ee0 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/06-write-data.yaml @@ -0,0 +1,16 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + run_psql_local \ + '\c myapp \\\ INSERT INTO myApp (id) VALUES (100501)' \ + "postgres:$(get_psql_user_pass major-upgrade-17-to-18-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-17-to-18-postgis-pguser-postgres)" + + run_psql_local \ + '\c mygisdata \\\ INSERT INTO gis.locations (id, geom) VALUES (2, ST_GeomFromText($$POINT(40 20)$$, 4326))' \ + "postgres:$(get_psql_user_pass major-upgrade-17-to-18-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-17-to-18-postgis-pguser-postgres)" diff --git a/e2e-tests/tests/major-upgrade-17-to-18-postgis/07-assert.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/07-assert.yaml new file mode 100644 index 000000000..6e6c88b47 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/07-assert.yaml @@ -0,0 +1,31 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 660 +--- +kind: Job +apiVersion: batch/v1 +metadata: + annotations: + postgres-operator.crunchydata.com/pgbackrest-backup: backup-after-17-to-18-postgis + labels: + postgres-operator.crunchydata.com/pgbackrest-backup: manual + postgres-operator.crunchydata.com/pgbackrest-repo: repo1 + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGBackup + controller: true + blockOwnerDeletion: true +status: + succeeded: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGBackup +metadata: + name: backup-after-17-to-18-postgis +spec: + pgCluster: major-upgrade-17-to-18-postgis + repoName: repo1 + options: + - --type=full +status: + state: Succeeded diff --git a/e2e-tests/tests/major-upgrade-17-to-18-postgis/07-run-backup.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/07-run-backup.yaml new file mode 100644 index 000000000..bd74da368 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/07-run-backup.yaml @@ -0,0 +1,9 @@ +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGBackup +metadata: + name: backup-after-17-to-18-postgis +spec: + pgCluster: major-upgrade-17-to-18-postgis + repoName: repo1 + options: + - --type=full diff --git a/e2e-tests/tests/major-upgrade-17-to-18-postgis/09-write-data.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/09-write-data.yaml new file mode 100644 index 000000000..281eb6a47 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/09-write-data.yaml @@ -0,0 +1,16 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + run_psql_local \ + '\c myapp \\\ INSERT INTO myApp (id) VALUES (100502)' \ + "postgres:$(get_psql_user_pass major-upgrade-17-to-18-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-17-to-18-postgis-pguser-postgres)" + + run_psql_local \ + '\c mygisdata \\\ INSERT INTO gis.locations (id, geom) VALUES (3, ST_GeomFromText($$POINT(50 30)$$, 4326))' \ + "postgres:$(get_psql_user_pass major-upgrade-17-to-18-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-17-to-18-postgis-pguser-postgres)" diff --git a/e2e-tests/tests/major-upgrade-17-to-18-postgis/10-assert.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/10-assert.yaml new file mode 100644 index 000000000..6d56fefae --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/10-assert.yaml @@ -0,0 +1,55 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 1500 +commands: + - script: |- + set -o errexit + + kubectl -n ${NAMESPACE} get pod + + for pod in $(kubectl -n ${NAMESPACE} get pods -l postgres-operator.crunchydata.com/data=postgres --no-headers | awk '{print $1}'); do + phase=$(kubectl -n ${NAMESPACE} get pod/${pod} -o jsonpath={".status.phase"}) + if [[ "${phase}" != "Running" ]]; then + echo "Waiting for ${pod} to start running" + continue + fi + echo "PostgreSQL logs from ${pod}:" + echo "find /pgdata/pg18/log -type f -iname 'postgresql*.log' -exec tail -n 30 {} \;" \ + | kubectl -n ${NAMESPACE} exec -it ${pod} -- bash 2>/dev/null + done + + sleep 30 +collectors: + - type: pod + selector: "postgres-operator.crunchydata.com/data=postgres" + tail: 30 + - type: pod + selector: "postgres-operator.crunchydata.com/pgbackrest-restore=''" + tail: 30 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGRestore +metadata: + name: restore-after-17-to-18-postgis +spec: + pgCluster: major-upgrade-17-to-18-postgis + repoName: repo1 +status: + state: Succeeded +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: major-upgrade-17-to-18-postgis +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/major-upgrade-17-to-18-postgis/10-run-restore.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/10-run-restore.yaml new file mode 100644 index 000000000..142199e40 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/10-run-restore.yaml @@ -0,0 +1,7 @@ +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGRestore +metadata: + name: restore-after-17-to-18-postgis +spec: + pgCluster: major-upgrade-17-to-18-postgis + repoName: repo1 diff --git a/e2e-tests/tests/major-upgrade-17-to-18-postgis/11-assert.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/11-assert.yaml new file mode 100644 index 000000000..d16cfe05e --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/11-assert.yaml @@ -0,0 +1,17 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 30 +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: 11-read-from-primary +data: + data: |2- + 100500 + 100501 + 100502 + postgis: |2- + POINT(30 10) + POINT(40 20) + POINT(50 30) diff --git a/e2e-tests/tests/major-upgrade-17-to-18-postgis/11-read-from-primary.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/11-read-from-primary.yaml new file mode 100644 index 000000000..04a4ddf42 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/11-read-from-primary.yaml @@ -0,0 +1,13 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 30 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + data=$(run_psql_local '\c myapp \\\ SELECT * from myApp;' "postgres:$(get_psql_user_pass major-upgrade-17-to-18-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-17-to-18-postgis-pguser-postgres)") + postgis=$(run_psql_local '\c mygisdata \\\ SELECT ST_AsText(geom) FROM gis.locations ORDER BY id;' "postgres:$(get_psql_user_pass major-upgrade-17-to-18-postgis-pguser-postgres)@$(get_psql_user_host major-upgrade-17-to-18-postgis-pguser-postgres)") + + kubectl create configmap -n "${NAMESPACE}" 11-read-from-primary --from-literal=data="${data}" --from-literal=postgis="${postgis}" diff --git a/e2e-tests/tests/major-upgrade-17-to-18-postgis/99-remove-cluster-gracefully.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/99-remove-cluster-gracefully.yaml new file mode 100644 index 000000000..de1d662e5 --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/99-remove-cluster-gracefully.yaml @@ -0,0 +1,22 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +delete: +- apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + metadata: + name: major-upgrade-17-to-18-postgis +- apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + metadata: + name: major-upgrade-17-to-18-postgis +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + remove_all_finalizers + check_operator_panic + destroy_operator + timeout: 60 diff --git a/e2e-tests/tests/major-upgrade-17-to-18-postgis/conf/major-upgrade-17-to-18-postgis.yaml b/e2e-tests/tests/major-upgrade-17-to-18-postgis/conf/major-upgrade-17-to-18-postgis.yaml new file mode 100644 index 000000000..e5bcfc8cc --- /dev/null +++ b/e2e-tests/tests/major-upgrade-17-to-18-postgis/conf/major-upgrade-17-to-18-postgis.yaml @@ -0,0 +1,14 @@ +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: major-upgrade-17-to-18-postgis +spec: + extensions: + image: + imagePullPolicy: Always + storage: + type: s3 + bucket: pg-extensions + region: eu-central-1 + secret: + name: aws-s3-secret