diff --git a/e2e-tests/tests/postgis/00-assert.yaml b/e2e-tests/tests/postgis/00-assert.yaml new file mode 100644 index 000000000..ae5a062d8 --- /dev/null +++ b/e2e-tests/tests/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/postgis/00-deploy-operator.yaml b/e2e-tests/tests/postgis/00-deploy-operator.yaml new file mode 100644 index 000000000..1aaca58be --- /dev/null +++ b/e2e-tests/tests/postgis/00-deploy-operator.yaml @@ -0,0 +1,13 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 10 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + init_temp_dir # do this only in the first TestStep + + deploy_operator + deploy_client diff --git a/e2e-tests/tests/postgis/01-assert.yaml b/e2e-tests/tests/postgis/01-assert.yaml new file mode 100644 index 000000000..ab55fd57f --- /dev/null +++ b/e2e-tests/tests/postgis/01-assert.yaml @@ -0,0 +1,115 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 180 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: postgis-repo-host + labels: + postgres-operator.crunchydata.com/cluster: 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: 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: postgis + postgres-operator.crunchydata.com/data: postgres + postgres-operator.crunchydata.com/instance-set: instance1 + ownerReferences: + - apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + name: 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: postgis-pgbouncer + labels: + postgres-operator.crunchydata.com/cluster: postgis + postgres-operator.crunchydata.com/role: pgbouncer + ownerReferences: + - apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + name: postgis + controller: true + blockOwnerDeletion: true +status: + observedGeneration: 1 + replicas: 3 + updatedReplicas: 3 + readyReplicas: 3 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: postgis + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: 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 + proxy: + pgBouncer: + readyReplicas: 3 + replicas: 3 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: 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/postgis/01-create-cluster.yaml b/e2e-tests/tests/postgis/01-create-cluster.yaml new file mode 100644 index 000000000..abcf680df --- /dev/null +++ b/e2e-tests/tests/postgis/01-create-cluster.yaml @@ -0,0 +1,12 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 100 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + # Use the PostGIS-enabled PostgreSQL image + get_cr | yq eval '.spec.image = "'$IMAGE_POSTGIS'"' - | kubectl -n "${NAMESPACE}" apply -f - diff --git a/e2e-tests/tests/postgis/02-assert.yaml b/e2e-tests/tests/postgis/02-assert.yaml new file mode 100644 index 000000000..e49a83fe1 --- /dev/null +++ b/e2e-tests/tests/postgis/02-assert.yaml @@ -0,0 +1,28 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: postgis +status: + instances: + - name: instance1 + readyReplicas: 3 + replicas: 3 + updatedReplicas: 3 + pgbackrest: + repoHost: + ready: true + proxy: + pgBouncer: + readyReplicas: 3 + replicas: 3 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: postgis +status: + state: ready diff --git a/e2e-tests/tests/postgis/02-enable-postgis.yaml b/e2e-tests/tests/postgis/02-enable-postgis.yaml new file mode 100644 index 000000000..569760e5b --- /dev/null +++ b/e2e-tests/tests/postgis/02-enable-postgis.yaml @@ -0,0 +1,16 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 100 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + # Patch the underlying PostgresCluster to enable PostGIS. + # The Percona operator does not override postGISVersion on reconcile, + # so this setting is preserved and triggers PostGIS extension installation. + kubectl -n "${NAMESPACE}" patch postgrescluster postgis \ + --type=merge \ + --patch "{\"spec\":{\"postGISVersion\":\"${POSTGIS_VER}\"}}" diff --git a/e2e-tests/tests/postgis/03-check-postgis.yaml b/e2e-tests/tests/postgis/03-check-postgis.yaml new file mode 100644 index 000000000..be022b2ec --- /dev/null +++ b/e2e-tests/tests/postgis/03-check-postgis.yaml @@ -0,0 +1,46 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 120 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + PSQL_URI="postgres:$(get_psql_user_pass postgis-pguser-postgres)@$(get_psql_user_host postgis-pguser-postgres)/postgres" + + result=$(run_psql_local \ + "SELECT left(postgis_version(),1);" \ + "${PSQL_URI}") + if [[ "${result}" != "${POSTGIS_VER:0:1}" ]]; then + echo "PostGIS version check failed: expected major version ${POSTGIS_VER:0:1}, got ${result}" + exit 1 + fi + + for schema in tiger tiger_data topology; do + result=$(run_psql_local \ + "SELECT nspname FROM pg_catalog.pg_namespace WHERE nspname='${schema}';" \ + "${PSQL_URI}") + if [[ "${result}" != "${schema}" ]]; then + echo "PostGIS schema '${schema}' is missing" + exit 1 + fi + done + + result=$(run_psql_local \ + "SELECT pg_typeof(ST_MakePoint(28.385200,-81.563900));" \ + "${PSQL_URI}") + if [[ "${result}" != "geometry" ]]; then + echo "ST_MakePoint check failed: expected 'geometry', got '${result}'" + exit 1 + fi + + result=$(run_psql_local \ + "SELECT ST_AsGeoJSON('SRID=4326;POINT(-118.4079 33.9434)'::geography);" \ + "${PSQL_URI}") + expected='{"type":"Point","coordinates":[-118.4079,33.9434]}' + if [[ "${result}" != "${expected}" ]]; then + echo "ST_AsGeoJSON check failed: expected '${expected}', got '${result}'" + exit 1 + fi diff --git a/e2e-tests/tests/postgis/99-remove-cluster-gracefully.yaml b/e2e-tests/tests/postgis/99-remove-cluster-gracefully.yaml new file mode 100644 index 000000000..6c0486bf4 --- /dev/null +++ b/e2e-tests/tests/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: postgis +- apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + metadata: + name: 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/vars.sh b/e2e-tests/vars.sh index 92ea4e92c..bffb1e71b 100755 --- a/e2e-tests/vars.sh +++ b/e2e-tests/vars.sh @@ -33,6 +33,7 @@ fi export IMAGE_PGBOUNCER=${IMAGE_PGBOUNCER:-"${IMAGE_BASE}:main-pgbouncer$PG_VER"} export IMAGE_POSTGRESQL=${IMAGE_POSTGRESQL:-"${IMAGE_BASE}:main-ppg$PG_VER-postgres"} export IMAGE_BACKREST=${IMAGE_BACKREST:-"${IMAGE_BASE}:main-pgbackrest$PG_VER"} +export IMAGE_POSTGIS=${s:-"docker.io/percona/percona-postgresql-operator:2.8.1-ppg17.7-postgres-gis3.3.8"} export IMAGE_UPGRADE=${IMAGE_UPGRADE:-"${IMAGE_BASE}:main-upgrade"} export BUCKET=${BUCKET:-"pg-operator-testing"} export PMM_SERVER_VERSION=${PMM_SERVER_VERSION:-"9.9.9"}