Skip to content

Commit e0ac59d

Browse files
authored
K8SPG-833 add "custom-envs" e2e test (#1315)
1 parent 1c1dd05 commit e0ac59d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+1667
-0
lines changed

e2e-tests/functions

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,3 +1143,95 @@ wait_for_generation() {
11431143
fi
11441144
done
11451145
}
1146+
1147+
# Reads all environment variables from a pod (single kubectl exec call)
1148+
get_envs_from_pod() {
1149+
local namespace=$1
1150+
local pod=$2
1151+
local container=$3
1152+
1153+
if [ -n "$container" ]; then
1154+
kubectl exec -n "$namespace" "$pod" -c "$container" -- printenv 2>/dev/null || true
1155+
else
1156+
kubectl exec -n "$namespace" "$pod" -- printenv 2>/dev/null || true
1157+
fi
1158+
}
1159+
1160+
# Verifies a single variable in given env content
1161+
check_env_in_pod() {
1162+
local check_type=$1
1163+
local pod=$2
1164+
local var_name=$3
1165+
local expected_value=$4
1166+
local env_content=$5
1167+
1168+
local actual_value
1169+
actual_value=$(echo "$env_content" | grep -E "^${var_name}=" | cut -d'=' -f2- || true)
1170+
1171+
if [[ "$check_type" == "add" ]]; then
1172+
if [ "$actual_value" != "$expected_value" ]; then
1173+
echo "ERROR: $var_name in $pod — expected '$expected_value', got '${actual_value:-<missing>}'"
1174+
return 1
1175+
else
1176+
echo "OK: $var_name=$actual_value in $pod"
1177+
fi
1178+
elif [[ "$check_type" == "delete" ]]; then
1179+
if [ -n "$actual_value" ]; then
1180+
echo "ERROR: $var_name exists in $pod (should not exist)"
1181+
return 1
1182+
else
1183+
echo "OK: $var_name deleted in $pod"
1184+
fi
1185+
else
1186+
echo "ERROR: unknown check type '$check_type'"
1187+
return 1
1188+
fi
1189+
}
1190+
1191+
# Checks multiple env vars in one or more components
1192+
check_envs_for_component() {
1193+
local check_type=$1 # add | delete
1194+
local component=$2 # instance | pgbouncer | repohost
1195+
local vars=("${@:3}") # everything after the 2nd argument
1196+
1197+
case "$component" in
1198+
instance)
1199+
POD=$(kubectl get -n "${NAMESPACE}" pod -l postgres-operator.crunchydata.com/instance-set=instance1 -o 'jsonpath={.items[0].metadata.name}')
1200+
CONTAINER=""
1201+
;;
1202+
pgbouncer)
1203+
POD=$(kubectl get -n "${NAMESPACE}" pod -l postgres-operator.crunchydata.com/role=pgbouncer -o 'jsonpath={.items[0].metadata.name}')
1204+
CONTAINER="pgbouncer"
1205+
;;
1206+
repohost)
1207+
POD=$(kubectl get -n "${NAMESPACE}" pod -l postgres-operator.crunchydata.com/data=pgbackrest -o 'jsonpath={.items[0].metadata.name}')
1208+
CONTAINER="pgbackrest"
1209+
;;
1210+
*)
1211+
echo "ERROR: unknown component '$component'"
1212+
return 1
1213+
;;
1214+
esac
1215+
1216+
echo "Fetching environment variables for $component pod $POD..."
1217+
local env_content
1218+
env_content=$(get_envs_from_pod "${NAMESPACE}" "$POD" "$CONTAINER")
1219+
1220+
local errors=0
1221+
for var_entry in "${vars[@]}"; do
1222+
if [[ "$check_type" == "add" ]]; then
1223+
local var_name="${var_entry%%=*}"
1224+
local var_expected="${var_entry#*=}"
1225+
check_env_in_pod add "$POD" "$var_name" "$var_expected" "$env_content" || errors=$((errors+1))
1226+
else
1227+
check_env_in_pod delete "$POD" "$var_entry" "" "$env_content" || errors=$((errors+1))
1228+
fi
1229+
done
1230+
1231+
if (( errors > 0 )); then
1232+
echo "$errors environment check(s) failed for component '$component'"
1233+
return 1
1234+
else
1235+
echo "All environment checks passed for component '$component'"
1236+
fi
1237+
}

e2e-tests/run-pr.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
backup-enable-disable
2+
custom-envs
23
custom-extensions
34
custom-tls
45
database-init-sql

e2e-tests/run-release.csv

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
backup-enable-disable
2+
custom-envs
23
custom-extensions
34
custom-tls
45
database-init-sql
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
apiVersion: kuttl.dev/v1beta1
2+
kind: TestAssert
3+
timeout: 120
4+
---
5+
apiVersion: apiextensions.k8s.io/v1
6+
kind: CustomResourceDefinition
7+
metadata:
8+
name: perconapgclusters.pgv2.percona.com
9+
spec:
10+
group: pgv2.percona.com
11+
names:
12+
kind: PerconaPGCluster
13+
listKind: PerconaPGClusterList
14+
plural: perconapgclusters
15+
singular: perconapgcluster
16+
scope: Namespaced
17+
---
18+
apiVersion: kuttl.dev/v1beta1
19+
kind: TestAssert
20+
metadata:
21+
name: check-operator-deploy-status
22+
timeout: 120
23+
commands:
24+
- script: kubectl assert exist-enhanced deployment percona-postgresql-operator -n ${OPERATOR_NS:-$NAMESPACE} --field-selector status.readyReplicas=1
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
apiVersion: kuttl.dev/v1beta1
2+
kind: TestStep
3+
timeout: 10
4+
commands:
5+
- script: |-
6+
set -o errexit
7+
set -o xtrace
8+
9+
source ../../functions
10+
init_temp_dir # do this only in the first TestStep
11+
12+
deploy_operator
13+
deploy_client
14+
deploy_s3_secrets
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
apiVersion: kuttl.dev/v1beta1
2+
kind: TestAssert
3+
timeout: 120
4+
---
5+
kind: StatefulSet
6+
apiVersion: apps/v1
7+
metadata:
8+
labels:
9+
postgres-operator.crunchydata.com/cluster: custom-envs
10+
postgres-operator.crunchydata.com/data: postgres
11+
postgres-operator.crunchydata.com/instance-set: instance1
12+
ownerReferences:
13+
- apiVersion: postgres-operator.crunchydata.com/v1beta1
14+
kind: PostgresCluster
15+
name: custom-envs
16+
controller: true
17+
blockOwnerDeletion: true
18+
status:
19+
observedGeneration: 1
20+
replicas: 1
21+
readyReplicas: 1
22+
currentReplicas: 1
23+
updatedReplicas: 1
24+
collisionCount: 0
25+
---
26+
kind: Deployment
27+
apiVersion: apps/v1
28+
metadata:
29+
name: custom-envs-pgbouncer
30+
labels:
31+
postgres-operator.crunchydata.com/cluster: custom-envs
32+
postgres-operator.crunchydata.com/role: pgbouncer
33+
annotations:
34+
deployment.kubernetes.io/revision: '1'
35+
ownerReferences:
36+
- apiVersion: postgres-operator.crunchydata.com/v1beta1
37+
kind: PostgresCluster
38+
name: custom-envs
39+
controller: true
40+
blockOwnerDeletion: true
41+
status:
42+
observedGeneration: 1
43+
replicas: 1
44+
updatedReplicas: 1
45+
readyReplicas: 1
46+
---
47+
kind: Job
48+
apiVersion: batch/v1
49+
metadata:
50+
labels:
51+
postgres-operator.crunchydata.com/cluster: custom-envs
52+
postgres-operator.crunchydata.com/pgbackrest: ''
53+
postgres-operator.crunchydata.com/pgbackrest-backup: replica-create
54+
postgres-operator.crunchydata.com/pgbackrest-repo: repo1
55+
ownerReferences:
56+
- apiVersion: pgv2.percona.com/v2
57+
kind: PerconaPGBackup
58+
controller: true
59+
blockOwnerDeletion: true
60+
status:
61+
succeeded: 1
62+
---
63+
apiVersion: postgres-operator.crunchydata.com/v1beta1
64+
kind: PostgresCluster
65+
metadata:
66+
name: custom-envs
67+
ownerReferences:
68+
- apiVersion: pgv2.percona.com/v2
69+
kind: PerconaPGCluster
70+
name: custom-envs
71+
controller: true
72+
blockOwnerDeletion: true
73+
finalizers:
74+
- postgres-operator.crunchydata.com/finalizer
75+
status:
76+
instances:
77+
- name: instance1
78+
readyReplicas: 1
79+
replicas: 1
80+
updatedReplicas: 1
81+
observedGeneration: 1
82+
pgbackrest:
83+
repos:
84+
- name: repo1
85+
stanzaCreated: true
86+
proxy:
87+
pgBouncer:
88+
readyReplicas: 1
89+
replicas: 1
90+
---
91+
apiVersion: pgv2.percona.com/v2
92+
kind: PerconaPGCluster
93+
metadata:
94+
name: custom-envs
95+
status:
96+
pgbouncer:
97+
ready: 1
98+
size: 1
99+
postgres:
100+
instances:
101+
- name: instance1
102+
ready: 1
103+
size: 1
104+
ready: 1
105+
size: 1
106+
state: ready
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
apiVersion: kuttl.dev/v1beta1
2+
kind: TestStep
3+
timeout: 20
4+
commands:
5+
- script: |-
6+
set -o errexit
7+
set -o xtrace
8+
9+
source ../../functions
10+
11+
get_cr \
12+
| yq eval '
13+
.spec.proxy.pgBouncer.replicas=1 |
14+
.spec.instances[].replicas=1' - \
15+
| kubectl -n "${NAMESPACE}" apply -f -
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
apiVersion: kuttl.dev/v1beta1
2+
kind: TestStep
3+
timeout: 10
4+
commands:
5+
- script: |-
6+
set -o errexit
7+
set -o xtrace
8+
9+
source ../../functions
10+
get_cr | yq eval '
11+
.spec.proxy.pgBouncer.replicas = 1 |
12+
.spec.instances[].replicas = 1 |
13+
.spec.instances[].env = ((.spec.instances[].env // []) + [{"name": "FIRST_ENV", "value": "1000"}, {"name": "SECOND_ENV", "value": "2000"}] | unique_by(.name))
14+
' - | kubectl -n "${NAMESPACE}" apply -f -
15+
16+
17+
sleep 10
18+
wait_cluster_consistency custom-envs
19+
20+
check_envs_for_component add instance FIRST_ENV=1000 SECOND_ENV=2000
21+
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
apiVersion: kuttl.dev/v1beta1
2+
kind: TestAssert
3+
timeout: 120
4+
---
5+
apiVersion: postgres-operator.crunchydata.com/v1beta1
6+
kind: PostgresCluster
7+
metadata:
8+
name: custom-envs
9+
ownerReferences:
10+
- apiVersion: pgv2.percona.com/v2
11+
kind: PerconaPGCluster
12+
name: custom-envs
13+
controller: true
14+
blockOwnerDeletion: true
15+
finalizers:
16+
- postgres-operator.crunchydata.com/finalizer
17+
status:
18+
instances:
19+
- name: instance1
20+
readyReplicas: 1
21+
replicas: 1
22+
updatedReplicas: 1
23+
observedGeneration: 2
24+
pgbackrest:
25+
repos:
26+
- name: repo1
27+
stanzaCreated: true
28+
proxy:
29+
pgBouncer:
30+
readyReplicas: 1
31+
replicas: 1
32+
---
33+
apiVersion: pgv2.percona.com/v2
34+
kind: PerconaPGCluster
35+
metadata:
36+
name: custom-envs
37+
status:
38+
pgbouncer:
39+
ready: 1
40+
size: 1
41+
postgres:
42+
instances:
43+
- name: instance1
44+
ready: 1
45+
size: 1
46+
ready: 1
47+
size: 1
48+
state: ready
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
apiVersion: kuttl.dev/v1beta1
2+
kind: TestAssert
3+
timeout: 120
4+
---
5+
apiVersion: postgres-operator.crunchydata.com/v1beta1
6+
kind: PostgresCluster
7+
metadata:
8+
name: custom-envs
9+
ownerReferences:
10+
- apiVersion: pgv2.percona.com/v2
11+
kind: PerconaPGCluster
12+
name: custom-envs
13+
controller: true
14+
blockOwnerDeletion: true
15+
finalizers:
16+
- postgres-operator.crunchydata.com/finalizer
17+
status:
18+
instances:
19+
- name: instance1
20+
readyReplicas: 1
21+
replicas: 1
22+
updatedReplicas: 1
23+
observedGeneration: 3
24+
pgbackrest:
25+
repos:
26+
- name: repo1
27+
stanzaCreated: true
28+
proxy:
29+
pgBouncer:
30+
readyReplicas: 1
31+
replicas: 1
32+
---
33+
apiVersion: pgv2.percona.com/v2
34+
kind: PerconaPGCluster
35+
metadata:
36+
name: custom-envs
37+
status:
38+
pgbouncer:
39+
ready: 1
40+
size: 1
41+
postgres:
42+
instances:
43+
- name: instance1
44+
ready: 1
45+
size: 1
46+
ready: 1
47+
size: 1
48+
state: ready

0 commit comments

Comments
 (0)