diff --git a/e2e-tests/functions b/e2e-tests/functions index 5a8722606..08c65e876 100644 --- a/e2e-tests/functions +++ b/e2e-tests/functions @@ -1143,3 +1143,95 @@ wait_for_generation() { fi done } + +# Reads all environment variables from a pod (single kubectl exec call) +get_envs_from_pod() { + local namespace=$1 + local pod=$2 + local container=$3 + + if [ -n "$container" ]; then + kubectl exec -n "$namespace" "$pod" -c "$container" -- printenv 2>/dev/null || true + else + kubectl exec -n "$namespace" "$pod" -- printenv 2>/dev/null || true + fi +} + +# Verifies a single variable in given env content +check_env_in_pod() { + local check_type=$1 + local pod=$2 + local var_name=$3 + local expected_value=$4 + local env_content=$5 + + local actual_value + actual_value=$(echo "$env_content" | grep -E "^${var_name}=" | cut -d'=' -f2- || true) + + if [[ "$check_type" == "add" ]]; then + if [ "$actual_value" != "$expected_value" ]; then + echo "ERROR: $var_name in $pod — expected '$expected_value', got '${actual_value:-}'" + return 1 + else + echo "OK: $var_name=$actual_value in $pod" + fi + elif [[ "$check_type" == "delete" ]]; then + if [ -n "$actual_value" ]; then + echo "ERROR: $var_name exists in $pod (should not exist)" + return 1 + else + echo "OK: $var_name deleted in $pod" + fi + else + echo "ERROR: unknown check type '$check_type'" + return 1 + fi +} + +# Checks multiple env vars in one or more components +check_envs_for_component() { + local check_type=$1 # add | delete + local component=$2 # instance | pgbouncer | repohost + local vars=("${@:3}") # everything after the 2nd argument + + case "$component" in + instance) + POD=$(kubectl get -n "${NAMESPACE}" pod -l postgres-operator.crunchydata.com/instance-set=instance1 -o 'jsonpath={.items[0].metadata.name}') + CONTAINER="" + ;; + pgbouncer) + POD=$(kubectl get -n "${NAMESPACE}" pod -l postgres-operator.crunchydata.com/role=pgbouncer -o 'jsonpath={.items[0].metadata.name}') + CONTAINER="pgbouncer" + ;; + repohost) + POD=$(kubectl get -n "${NAMESPACE}" pod -l postgres-operator.crunchydata.com/data=pgbackrest -o 'jsonpath={.items[0].metadata.name}') + CONTAINER="pgbackrest" + ;; + *) + echo "ERROR: unknown component '$component'" + return 1 + ;; + esac + + echo "Fetching environment variables for $component pod $POD..." + local env_content + env_content=$(get_envs_from_pod "${NAMESPACE}" "$POD" "$CONTAINER") + + local errors=0 + for var_entry in "${vars[@]}"; do + if [[ "$check_type" == "add" ]]; then + local var_name="${var_entry%%=*}" + local var_expected="${var_entry#*=}" + check_env_in_pod add "$POD" "$var_name" "$var_expected" "$env_content" || errors=$((errors+1)) + else + check_env_in_pod delete "$POD" "$var_entry" "" "$env_content" || errors=$((errors+1)) + fi + done + + if (( errors > 0 )); then + echo "$errors environment check(s) failed for component '$component'" + return 1 + else + echo "All environment checks passed for component '$component'" + fi +} \ No newline at end of file diff --git a/e2e-tests/run-pr.csv b/e2e-tests/run-pr.csv index 8c480e198..358ce4498 100644 --- a/e2e-tests/run-pr.csv +++ b/e2e-tests/run-pr.csv @@ -1,4 +1,5 @@ backup-enable-disable +custom-envs custom-extensions custom-tls database-init-sql diff --git a/e2e-tests/run-release.csv b/e2e-tests/run-release.csv index 8c480e198..358ce4498 100644 --- a/e2e-tests/run-release.csv +++ b/e2e-tests/run-release.csv @@ -1,4 +1,5 @@ backup-enable-disable +custom-envs custom-extensions custom-tls database-init-sql diff --git a/e2e-tests/tests/custom-envs/00-assert.yaml b/e2e-tests/tests/custom-envs/00-assert.yaml new file mode 100644 index 000000000..ae5a062d8 --- /dev/null +++ b/e2e-tests/tests/custom-envs/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/custom-envs/00-deploy-operator.yaml b/e2e-tests/tests/custom-envs/00-deploy-operator.yaml new file mode 100644 index 000000000..7faf4da85 --- /dev/null +++ b/e2e-tests/tests/custom-envs/00-deploy-operator.yaml @@ -0,0 +1,14 @@ +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 + deploy_s3_secrets diff --git a/e2e-tests/tests/custom-envs/01-assert.yaml b/e2e-tests/tests/custom-envs/01-assert.yaml new file mode 100644 index 000000000..9f767a78f --- /dev/null +++ b/e2e-tests/tests/custom-envs/01-assert.yaml @@ -0,0 +1,106 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + labels: + postgres-operator.crunchydata.com/cluster: custom-envs + postgres-operator.crunchydata.com/data: postgres + postgres-operator.crunchydata.com/instance-set: instance1 + ownerReferences: + - apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + name: custom-envs + controller: true + blockOwnerDeletion: true +status: + observedGeneration: 1 + replicas: 1 + readyReplicas: 1 + currentReplicas: 1 + updatedReplicas: 1 + collisionCount: 0 +--- +kind: Deployment +apiVersion: apps/v1 +metadata: + name: custom-envs-pgbouncer + labels: + postgres-operator.crunchydata.com/cluster: custom-envs + postgres-operator.crunchydata.com/role: pgbouncer + annotations: + deployment.kubernetes.io/revision: '1' + ownerReferences: + - apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + name: custom-envs + controller: true + blockOwnerDeletion: true +status: + observedGeneration: 1 + replicas: 1 + updatedReplicas: 1 + readyReplicas: 1 +--- +kind: Job +apiVersion: batch/v1 +metadata: + labels: + postgres-operator.crunchydata.com/cluster: custom-envs + 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: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 1 + pgbackrest: + repos: + - name: repo1 + stanzaCreated: true + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready diff --git a/e2e-tests/tests/custom-envs/01-create-cluster.yaml b/e2e-tests/tests/custom-envs/01-create-cluster.yaml new file mode 100644 index 000000000..2ff465910 --- /dev/null +++ b/e2e-tests/tests/custom-envs/01-create-cluster.yaml @@ -0,0 +1,15 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 20 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + get_cr \ + | yq eval ' + .spec.proxy.pgBouncer.replicas=1 | + .spec.instances[].replicas=1' - \ + | kubectl -n "${NAMESPACE}" apply -f - diff --git a/e2e-tests/tests/custom-envs/02-add-env-to-instance.yaml b/e2e-tests/tests/custom-envs/02-add-env-to-instance.yaml new file mode 100644 index 000000000..0a36be90f --- /dev/null +++ b/e2e-tests/tests/custom-envs/02-add-env-to-instance.yaml @@ -0,0 +1,21 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 10 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + get_cr | yq eval ' + .spec.proxy.pgBouncer.replicas = 1 | + .spec.instances[].replicas = 1 | + .spec.instances[].env = ((.spec.instances[].env // []) + [{"name": "FIRST_ENV", "value": "1000"}, {"name": "SECOND_ENV", "value": "2000"}] | unique_by(.name)) + ' - | kubectl -n "${NAMESPACE}" apply -f - + + + sleep 10 + wait_cluster_consistency custom-envs + + check_envs_for_component add instance FIRST_ENV=1000 SECOND_ENV=2000 + diff --git a/e2e-tests/tests/custom-envs/02-assert.yaml b/e2e-tests/tests/custom-envs/02-assert.yaml new file mode 100644 index 000000000..b03a78959 --- /dev/null +++ b/e2e-tests/tests/custom-envs/02-assert.yaml @@ -0,0 +1,48 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 2 + pgbackrest: + repos: + - name: repo1 + stanzaCreated: true + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/03-assert.yaml b/e2e-tests/tests/custom-envs/03-assert.yaml new file mode 100644 index 000000000..27ac4cd27 --- /dev/null +++ b/e2e-tests/tests/custom-envs/03-assert.yaml @@ -0,0 +1,48 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 3 + pgbackrest: + repos: + - name: repo1 + stanzaCreated: true + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/03-update-env-for-instance.yaml b/e2e-tests/tests/custom-envs/03-update-env-for-instance.yaml new file mode 100644 index 000000000..1afd19810 --- /dev/null +++ b/e2e-tests/tests/custom-envs/03-update-env-for-instance.yaml @@ -0,0 +1,19 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 10 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + kubectl -n ${NAMESPACE} get pg custom-envs -o yaml | \ + yq eval ' + .spec.instances[].env[] |= + (select(.name == "FIRST_ENV").value = "2000")' - | \ + kubectl apply -f - + + sleep 10 + wait_cluster_consistency custom-envs + + check_envs_for_component add instance FIRST_ENV=2000 SECOND_ENV=2000 \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/04-add-env-secret-to-instance.yaml b/e2e-tests/tests/custom-envs/04-add-env-secret-to-instance.yaml new file mode 100644 index 000000000..a5a632a4b --- /dev/null +++ b/e2e-tests/tests/custom-envs/04-add-env-secret-to-instance.yaml @@ -0,0 +1,24 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 20 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + # Create a secret + kubectl create secret generic instance-env-secret \ + --from-literal=DB_USER=myuser \ + --from-literal=DB_PASSWORD='MyS3cretP@ss' \ + -n "${NAMESPACE}" + + kubectl get pg custom-envs -n ${NAMESPACE} -o yaml | \ + yq eval '.spec.instances[].envFrom += [{"secretRef": {"name": "instance-env-secret"}}]' - | \ + kubectl apply -f - + + sleep 10 + wait_cluster_consistency custom-envs + check_envs_for_component add instance DB_USER=myuser DB_PASSWORD=MyS3cretP@ss + diff --git a/e2e-tests/tests/custom-envs/04-assert.yaml b/e2e-tests/tests/custom-envs/04-assert.yaml new file mode 100644 index 000000000..98b0d2445 --- /dev/null +++ b/e2e-tests/tests/custom-envs/04-assert.yaml @@ -0,0 +1,48 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 4 + pgbackrest: + repos: + - name: repo1 + stanzaCreated: true + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/05-assert.yaml b/e2e-tests/tests/custom-envs/05-assert.yaml new file mode 100644 index 000000000..b2e558006 --- /dev/null +++ b/e2e-tests/tests/custom-envs/05-assert.yaml @@ -0,0 +1,48 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 5 + pgbackrest: + repos: + - name: repo1 + stanzaCreated: true + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/05-update-env-in-secret-for-instance.yaml b/e2e-tests/tests/custom-envs/05-update-env-in-secret-for-instance.yaml new file mode 100644 index 000000000..58ebca0fb --- /dev/null +++ b/e2e-tests/tests/custom-envs/05-update-env-in-secret-for-instance.yaml @@ -0,0 +1,19 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 20 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl -n "${NAMESPACE}" patch secret instance-env-secret \ + --type='merge' \ + -p "$(echo "{\"data\": {\"DB_NEW_ENV\": \"$(printf %s 'new-value' | base64)\"}}")" + + + sleep 10 + wait_cluster_consistency custom-envs + check_envs_for_component add instance DB_USER=myuser DB_PASSWORD=MyS3cretP@ss DB_NEW_ENV=new-value + diff --git a/e2e-tests/tests/custom-envs/06-assert.yaml b/e2e-tests/tests/custom-envs/06-assert.yaml new file mode 100644 index 000000000..a646ef2df --- /dev/null +++ b/e2e-tests/tests/custom-envs/06-assert.yaml @@ -0,0 +1,48 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 6 + pgbackrest: + repos: + - name: repo1 + stanzaCreated: true + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/06-update-secret-for-instance.yaml b/e2e-tests/tests/custom-envs/06-update-secret-for-instance.yaml new file mode 100644 index 000000000..443c98fdc --- /dev/null +++ b/e2e-tests/tests/custom-envs/06-update-secret-for-instance.yaml @@ -0,0 +1,25 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 30 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + # Create new secret with new env vars + kubectl create secret generic instance-env-secret-updated \ + --from-literal=DB_USER_NEW=myuser2 \ + --from-literal=DB_PASSWORD_NEW='NewS3cretP@ss' \ + -n "${NAMESPACE}" + + # Patch the CR to reference the new secret + kubectl get pg custom-envs -n ${NAMESPACE} -o yaml | \ + yq eval '.spec.instances[].envFrom = [{"secretRef": {"name": "instance-env-secret-updated"}}]' - | \ + kubectl apply -f - + + sleep 10 + wait_cluster_consistency custom-envs + check_envs_for_component add instance DB_USER_NEW=myuser2 DB_PASSWORD_NEW=NewS3cretP@ss + diff --git a/e2e-tests/tests/custom-envs/07-assert.yaml b/e2e-tests/tests/custom-envs/07-assert.yaml new file mode 100644 index 000000000..7ad6ad8b4 --- /dev/null +++ b/e2e-tests/tests/custom-envs/07-assert.yaml @@ -0,0 +1,48 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 7 + pgbackrest: + repos: + - name: repo1 + stanzaCreated: true + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/07-delete-env-for-instance.yaml b/e2e-tests/tests/custom-envs/07-delete-env-for-instance.yaml new file mode 100644 index 000000000..86a1059b6 --- /dev/null +++ b/e2e-tests/tests/custom-envs/07-delete-env-for-instance.yaml @@ -0,0 +1,23 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 10 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl get pg custom-envs -n ${NAMESPACE} -o yaml | \ + yq eval ' + .spec.instances[].env |= map(select(.name != "FIRST_ENV" and .name != "SECOND_ENV")) + ' - | kubectl apply -f - + + sleep 20 + wait_cluster_consistency custom-envs + check_envs_for_component delete instance FIRST_ENV SECOND_ENV + + + + + diff --git a/e2e-tests/tests/custom-envs/08-assert.yaml b/e2e-tests/tests/custom-envs/08-assert.yaml new file mode 100644 index 000000000..0610e10a3 --- /dev/null +++ b/e2e-tests/tests/custom-envs/08-assert.yaml @@ -0,0 +1,44 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 8 + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/08-delete-secret-for-instance.yaml b/e2e-tests/tests/custom-envs/08-delete-secret-for-instance.yaml new file mode 100644 index 000000000..1fc3c5e31 --- /dev/null +++ b/e2e-tests/tests/custom-envs/08-delete-secret-for-instance.yaml @@ -0,0 +1,20 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 30 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl get pg custom-envs -n ${NAMESPACE} -o yaml | \ + yq eval ' + .spec.instances[].envFrom = [] + ' - | kubectl apply -f - + + sleep 10 + wait_cluster_consistency custom-envs + check_envs_for_component delete instance DB_USER_NEW DB_PASSWORD_NEW + + diff --git a/e2e-tests/tests/custom-envs/09-add-env-to-pgbouncer.yaml b/e2e-tests/tests/custom-envs/09-add-env-to-pgbouncer.yaml new file mode 100644 index 000000000..ce4360181 --- /dev/null +++ b/e2e-tests/tests/custom-envs/09-add-env-to-pgbouncer.yaml @@ -0,0 +1,17 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 10 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + kubectl -n "${NAMESPACE}" patch pg custom-envs \ + --type merge \ + -p '{"spec":{"proxy":{"pgBouncer":{"replicas":1,"env":[{"name": "FIRST_ENV", "value": "1000"}, {"name": "SECOND_ENV", "value": "2000"}]}}}}' + + sleep 10 + wait_cluster_consistency custom-envs + + check_envs_for_component add pgbouncer FIRST_ENV=1000 SECOND_ENV=2000 \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/09-assert.yaml b/e2e-tests/tests/custom-envs/09-assert.yaml new file mode 100644 index 000000000..1cd98b27f --- /dev/null +++ b/e2e-tests/tests/custom-envs/09-assert.yaml @@ -0,0 +1,44 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 9 + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/10-assert.yaml b/e2e-tests/tests/custom-envs/10-assert.yaml new file mode 100644 index 000000000..8f5935fe9 --- /dev/null +++ b/e2e-tests/tests/custom-envs/10-assert.yaml @@ -0,0 +1,44 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 10 + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/10-update-env-for-pgbouncer.yaml b/e2e-tests/tests/custom-envs/10-update-env-for-pgbouncer.yaml new file mode 100644 index 000000000..73de84401 --- /dev/null +++ b/e2e-tests/tests/custom-envs/10-update-env-for-pgbouncer.yaml @@ -0,0 +1,21 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 10 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl -n "${NAMESPACE}" get pg custom-envs -o yaml | \ + yq eval ' + .spec.proxy.pgBouncer.env[] |= + (select(.name == "FIRST_ENV").value = "2000") + ' - | kubectl apply -f - + + sleep 10 + wait_cluster_consistency custom-envs + + check_envs_for_component add pgbouncer FIRST_ENV=2000 SECOND_ENV=2000 + diff --git a/e2e-tests/tests/custom-envs/11-add-env-secret-to-pgbouncer.yaml b/e2e-tests/tests/custom-envs/11-add-env-secret-to-pgbouncer.yaml new file mode 100644 index 000000000..fdca41b90 --- /dev/null +++ b/e2e-tests/tests/custom-envs/11-add-env-secret-to-pgbouncer.yaml @@ -0,0 +1,23 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 20 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl create secret generic pgbouncer-env-secret \ + --from-literal=DB_USER=myuser \ + --from-literal=DB_PASSWORD='MyS3cretP@ss' \ + -n "${NAMESPACE}" + + kubectl get pg custom-envs -n "${NAMESPACE}" -o yaml | \ + yq eval ' + .spec.proxy.pgBouncer.envFrom += [{"secretRef": {"name": "pgbouncer-env-secret"}}] + ' - | kubectl apply -f - + + sleep 10 + wait_cluster_consistency custom-envs + check_envs_for_component add pgbouncer DB_USER=myuser DB_PASSWORD=MyS3cretP@ss diff --git a/e2e-tests/tests/custom-envs/11-assert.yaml b/e2e-tests/tests/custom-envs/11-assert.yaml new file mode 100644 index 000000000..924bdf878 --- /dev/null +++ b/e2e-tests/tests/custom-envs/11-assert.yaml @@ -0,0 +1,44 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 11 + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/12-assert.yaml b/e2e-tests/tests/custom-envs/12-assert.yaml new file mode 100644 index 000000000..99562c737 --- /dev/null +++ b/e2e-tests/tests/custom-envs/12-assert.yaml @@ -0,0 +1,44 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 12 + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/12-update-env-in-secret-for-pgbouncer.yaml b/e2e-tests/tests/custom-envs/12-update-env-in-secret-for-pgbouncer.yaml new file mode 100644 index 000000000..3348f535e --- /dev/null +++ b/e2e-tests/tests/custom-envs/12-update-env-in-secret-for-pgbouncer.yaml @@ -0,0 +1,18 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 20 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl -n "${NAMESPACE}" patch secret pgbouncer-env-secret \ + --type='merge' \ + -p "$(printf '{"data":{"DB_NEW_ENV":"%s"}}' "$(printf 'new-value' | base64)")" + + sleep 10 + wait_cluster_consistency custom-envs + check_envs_for_component add pgbouncer DB_USER=myuser DB_PASSWORD=MyS3cretP@ss DB_NEW_ENV=new-value + diff --git a/e2e-tests/tests/custom-envs/13-assert.yaml b/e2e-tests/tests/custom-envs/13-assert.yaml new file mode 100644 index 000000000..64a58fabc --- /dev/null +++ b/e2e-tests/tests/custom-envs/13-assert.yaml @@ -0,0 +1,44 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 13 + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/13-update-secret-for-pgbouncer.yaml b/e2e-tests/tests/custom-envs/13-update-secret-for-pgbouncer.yaml new file mode 100644 index 000000000..d842902cb --- /dev/null +++ b/e2e-tests/tests/custom-envs/13-update-secret-for-pgbouncer.yaml @@ -0,0 +1,25 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 30 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl create secret generic pgbouncer-env-secret-updated \ + --from-literal=DB_USER_NEW=myuser2 \ + --from-literal=DB_PASSWORD_NEW='NewS3cretP@ss' \ + -n "${NAMESPACE}" + + + kubectl get pg custom-envs -n "${NAMESPACE}" -o yaml | \ + yq eval '.spec.proxy.pgBouncer.envFrom = [{"secretRef": {"name": "pgbouncer-env-secret-updated"}}]' - | \ + kubectl apply -f - + + sleep 10 + wait_cluster_consistency custom-envs + + check_envs_for_component add pgbouncer DB_USER_NEW=myuser2 DB_PASSWORD_NEW=NewS3cretP@ss + diff --git a/e2e-tests/tests/custom-envs/14-assert.yaml b/e2e-tests/tests/custom-envs/14-assert.yaml new file mode 100644 index 000000000..4ea2438b2 --- /dev/null +++ b/e2e-tests/tests/custom-envs/14-assert.yaml @@ -0,0 +1,44 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 14 + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/14-delete-env-for-pgbouncer.yaml b/e2e-tests/tests/custom-envs/14-delete-env-for-pgbouncer.yaml new file mode 100644 index 000000000..26db73832 --- /dev/null +++ b/e2e-tests/tests/custom-envs/14-delete-env-for-pgbouncer.yaml @@ -0,0 +1,22 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 10 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl -n "${NAMESPACE}" get pg custom-envs -o yaml | \ + yq eval ' + .spec.proxy.pgBouncer.env |= map(select(.name != "FIRST_ENV" and .name != "SECOND_ENV")) + ' - | kubectl apply -f - + + + + sleep 30 + wait_cluster_consistency custom-envs + + check_envs_for_component delete pgbouncer FIRST_ENV SECOND_ENV + diff --git a/e2e-tests/tests/custom-envs/15-assert.yaml b/e2e-tests/tests/custom-envs/15-assert.yaml new file mode 100644 index 000000000..8561612fd --- /dev/null +++ b/e2e-tests/tests/custom-envs/15-assert.yaml @@ -0,0 +1,44 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 15 + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/15-delete-secret-for-pgbouncer.yaml b/e2e-tests/tests/custom-envs/15-delete-secret-for-pgbouncer.yaml new file mode 100644 index 000000000..dcfccae96 --- /dev/null +++ b/e2e-tests/tests/custom-envs/15-delete-secret-for-pgbouncer.yaml @@ -0,0 +1,20 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 30 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl get pg custom-envs -n "${NAMESPACE}" -o yaml | \ + yq eval ' + .spec.proxy.pgBouncer.envFrom = [] + ' - | kubectl apply -f - + + sleep 10 + wait_cluster_consistency custom-envs + + check_envs_for_component delete pgbouncer DB_USER_NEW DB_PASSWORD_NEW + diff --git a/e2e-tests/tests/custom-envs/16-add-env-to-repohost.yaml b/e2e-tests/tests/custom-envs/16-add-env-to-repohost.yaml new file mode 100644 index 000000000..c7d7d894a --- /dev/null +++ b/e2e-tests/tests/custom-envs/16-add-env-to-repohost.yaml @@ -0,0 +1,18 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 10 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl -n "${NAMESPACE}" patch pg custom-envs \ + --type merge \ + -p '{"spec":{"backups":{"pgbackrest":{"env":[{"name": "FIRST_ENV", "value": "1000"}, {"name": "SECOND_ENV", "value": "2000"}]}}}}' + + sleep 20 + wait_cluster_consistency custom-envs + check_envs_for_component add repohost FIRST_ENV=1000 SECOND_ENV=2000 + diff --git a/e2e-tests/tests/custom-envs/16-assert.yaml b/e2e-tests/tests/custom-envs/16-assert.yaml new file mode 100644 index 000000000..d340d9d4d --- /dev/null +++ b/e2e-tests/tests/custom-envs/16-assert.yaml @@ -0,0 +1,44 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 16 + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/17-assert.yaml b/e2e-tests/tests/custom-envs/17-assert.yaml new file mode 100644 index 000000000..743d45fad --- /dev/null +++ b/e2e-tests/tests/custom-envs/17-assert.yaml @@ -0,0 +1,44 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 17 + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/17-update-env-for-repohost.yaml b/e2e-tests/tests/custom-envs/17-update-env-for-repohost.yaml new file mode 100644 index 000000000..7a70e4055 --- /dev/null +++ b/e2e-tests/tests/custom-envs/17-update-env-for-repohost.yaml @@ -0,0 +1,20 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 10 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + kubectl -n ${NAMESPACE} get pg custom-envs -o yaml | \ + yq eval ' + .spec.backups.pgbackrest.env[] |= + (select(.name == "FIRST_ENV").value = "2000")' - | \ + kubectl apply -f - + + sleep 30 + wait_cluster_consistency custom-envs + + check_envs_for_component add repohost FIRST_ENV=2000 SECOND_ENV=2000 + diff --git a/e2e-tests/tests/custom-envs/18-add-env-secret-to-repohost.yaml b/e2e-tests/tests/custom-envs/18-add-env-secret-to-repohost.yaml new file mode 100644 index 000000000..b30bd2720 --- /dev/null +++ b/e2e-tests/tests/custom-envs/18-add-env-secret-to-repohost.yaml @@ -0,0 +1,23 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 20 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl create secret generic repo-host-env-secret \ + --from-literal=DB_USER=myuser \ + --from-literal=DB_PASSWORD='MyS3cretP@ss' \ + -n "${NAMESPACE}" + + kubectl get pg custom-envs -n ${NAMESPACE} -o yaml | \ + yq eval '.spec.backups.pgbackrest.envFrom += [{"secretRef": {"name": "repo-host-env-secret"}}]' - | \ + kubectl apply -f - + + sleep 60 + wait_cluster_consistency custom-envs + + check_envs_for_component add repohost DB_USER=myuser DB_PASSWORD=MyS3cretP@ss diff --git a/e2e-tests/tests/custom-envs/18-assert.yaml b/e2e-tests/tests/custom-envs/18-assert.yaml new file mode 100644 index 000000000..36ecbfa9e --- /dev/null +++ b/e2e-tests/tests/custom-envs/18-assert.yaml @@ -0,0 +1,44 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 18 + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/19-assert.yaml b/e2e-tests/tests/custom-envs/19-assert.yaml new file mode 100644 index 000000000..2af2f2d19 --- /dev/null +++ b/e2e-tests/tests/custom-envs/19-assert.yaml @@ -0,0 +1,44 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 19 + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/19-update-env-in-secret-for-repohost.yaml b/e2e-tests/tests/custom-envs/19-update-env-in-secret-for-repohost.yaml new file mode 100644 index 000000000..3479113c2 --- /dev/null +++ b/e2e-tests/tests/custom-envs/19-update-env-in-secret-for-repohost.yaml @@ -0,0 +1,20 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 20 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl -n "${NAMESPACE}" patch secret repo-host-env-secret \ + --type='merge' \ + -p "$(printf '{"data":{"DB_NEW_ENV":"%s"}}' "$(printf 'new-value' | base64)")" + + + sleep 60 + wait_cluster_consistency custom-envs + + check_envs_for_component add repohost DB_USER=myuser DB_PASSWORD=MyS3cretP@ss DB_NEW_ENV=new-value + diff --git a/e2e-tests/tests/custom-envs/20-assert.yaml b/e2e-tests/tests/custom-envs/20-assert.yaml new file mode 100644 index 000000000..f5b272baa --- /dev/null +++ b/e2e-tests/tests/custom-envs/20-assert.yaml @@ -0,0 +1,44 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 20 + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/20-update-secret-for-repohost.yaml b/e2e-tests/tests/custom-envs/20-update-secret-for-repohost.yaml new file mode 100644 index 000000000..bcea8259b --- /dev/null +++ b/e2e-tests/tests/custom-envs/20-update-secret-for-repohost.yaml @@ -0,0 +1,27 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 30 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl create secret generic repo-host-env-secret-updated \ + --from-literal=DB_USER_NEW=myuser2 \ + --from-literal=DB_PASSWORD_NEW='NewS3cretP@ss' \ + -n "${NAMESPACE}" + + + kubectl get pg custom-envs -n "${NAMESPACE}" -o yaml | \ + yq eval '.spec.backups.pgbackrest.envFrom += [{"secretRef": {"name": "repo-host-env-secret-updated"}}]' - | \ + kubectl apply -f - + + + sleep 60 + wait_cluster_consistency custom-envs + + check_envs_for_component add repohost DB_USER_NEW=myuser2 DB_PASSWORD_NEW=NewS3cretP@ss + + diff --git a/e2e-tests/tests/custom-envs/21-assert.yaml b/e2e-tests/tests/custom-envs/21-assert.yaml new file mode 100644 index 000000000..a90cfff6f --- /dev/null +++ b/e2e-tests/tests/custom-envs/21-assert.yaml @@ -0,0 +1,44 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 21 + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/21-delete-env-for-repohost.yaml b/e2e-tests/tests/custom-envs/21-delete-env-for-repohost.yaml new file mode 100644 index 000000000..35d220629 --- /dev/null +++ b/e2e-tests/tests/custom-envs/21-delete-env-for-repohost.yaml @@ -0,0 +1,21 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 10 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl -n ${NAMESPACE} get pg custom-envs -o yaml | \ + yq eval ' + .spec.backups.pgbackrest.env |= map(select(.name != "FIRST_ENV" and .name != "SECOND_ENV")) + ' - | kubectl apply -f - + + + sleep 60 + wait_cluster_consistency custom-envs + + check_envs_for_component delete repohost FIRST_ENV SECOND_ENV + diff --git a/e2e-tests/tests/custom-envs/22-assert.yaml b/e2e-tests/tests/custom-envs/22-assert.yaml new file mode 100644 index 000000000..f1aa497c7 --- /dev/null +++ b/e2e-tests/tests/custom-envs/22-assert.yaml @@ -0,0 +1,44 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: postgres-operator.crunchydata.com/v1beta1 +kind: PostgresCluster +metadata: + name: custom-envs + ownerReferences: + - apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + name: custom-envs + controller: true + blockOwnerDeletion: true + finalizers: + - postgres-operator.crunchydata.com/finalizer +status: + instances: + - name: instance1 + readyReplicas: 1 + replicas: 1 + updatedReplicas: 1 + observedGeneration: 22 + proxy: + pgBouncer: + readyReplicas: 1 + replicas: 1 +--- +apiVersion: pgv2.percona.com/v2 +kind: PerconaPGCluster +metadata: + name: custom-envs +status: + pgbouncer: + ready: 1 + size: 1 + postgres: + instances: + - name: instance1 + ready: 1 + size: 1 + ready: 1 + size: 1 + state: ready \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/22-delete-secret-for-repohost.yaml b/e2e-tests/tests/custom-envs/22-delete-secret-for-repohost.yaml new file mode 100644 index 000000000..6cd7535b5 --- /dev/null +++ b/e2e-tests/tests/custom-envs/22-delete-secret-for-repohost.yaml @@ -0,0 +1,19 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +timeout: 30 +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + kubectl get pg custom-envs -n ${NAMESPACE} -o yaml | \ + yq eval ' + .spec.backups.pgbackrest.envFrom = [] + ' - | kubectl apply -f - + + sleep 60 + wait_cluster_consistency custom-envs + + check_envs_for_component delete repohost DB_USER_NEW DB_PASSWORD_NEW \ No newline at end of file diff --git a/e2e-tests/tests/custom-envs/99-remove-cluster-gracefully.yaml b/e2e-tests/tests/custom-envs/99-remove-cluster-gracefully.yaml new file mode 100644 index 000000000..74eca2688 --- /dev/null +++ b/e2e-tests/tests/custom-envs/99-remove-cluster-gracefully.yaml @@ -0,0 +1,21 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +delete: +- apiVersion: pgv2.percona.com/v2 + kind: PerconaPGCluster + metadata: + name: one-pod +- apiVersion: postgres-operator.crunchydata.com/v1beta1 + kind: PostgresCluster + metadata: + name: one-pod +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + remove_all_finalizers + destroy_operator + timeout: 60