diff --git a/tests/kuttl/common/validate-pools-yaml.sh b/tests/kuttl/common/validate-pools-yaml.sh new file mode 100755 index 00000000..7bc1375b --- /dev/null +++ b/tests/kuttl/common/validate-pools-yaml.sh @@ -0,0 +1,94 @@ +#!/bin/bash +# +# This is a base script which will verify the pools.yaml generated file. +# +# Get the ConfigMap content +NUM_OF_SERVICES=$1 +EXPECTED_IPS_NUM=$((NUM_OF_SERVICES * 2)) +config_content=$(oc get -n $NAMESPACE configmap designate-pools-yaml-config-map -o jsonpath='{.data.pools-yaml-content}') + +# Validate pools.yaml config map YAML structure +if ! yq eval '.' <<< "$config_content" &> /dev/null; then + echo "Invalid YAML structure" + exit 1 +fi + +# Assert pool's name +if [ "$(echo "$config_content" | yq eval '.[0].name' -)" != "default" ]; then + echo "Pool name is not 'default'" + exit 1 +fi + +# Assert pool's NS records +if [ "$(echo "$config_content" | yq eval '.[0].ns_records[0].hostname' -)" != "ns1.example.com." ]; then + echo "First NS record hostname is incorrect" + exit 1 +fi +if [ "$(echo "$config_content" | yq eval '.[0].ns_records[1].hostname' -)" != "ns2.example.com." ]; then + echo "Second NS record hostname is incorrect" + exit 1 +fi + +# Check nameserver IPs +nameserver_ips=$(echo "$config_content" | yq eval '.[0].nameservers[].host' -) +for ip in $nameserver_ips; do + if [[ ! $ip =~ ^172\.28\.0\.[0-9]+$ ]]; then + echo "Invalid nameserver IP format: $ip" + exit 1 + fi +done + +# Check master IPs +master_ips=$(echo "$config_content" | yq eval '.[0].targets[].masters[].host' -) +for ip in $master_ips; do + if [[ ! $ip =~ ^172\.28\.0\.[0-9]+$ ]]; then + echo "Invalid master IP format: $ip" + exit 1 + fi +done + +# Check target.option IPs +target_ips=$(echo "$config_content" | yq eval '.[0].targets[].options.host' -) +rndc_ips=$(echo "$config_content" | yq eval '.[0].targets[].options.rndc_host' -) +for ip in $target_ips $rndc_ips; do + if [[ ! $ip =~ ^172\.28\.0\.[0-9]+$ ]]; then + echo "Invalid target/rndc IP format: $ip" + exit 1 + fi +done + +# Count total unique IPs +all_ips=$(echo "$config_content" | yq eval ' + .[0].nameservers[].host, + .[0].targets[].masters[].host, + .[0].targets[].options.host, + .[0].targets[].options.rndc_host' - | sort -u) +unique_ip_count=$(echo "$all_ips" | wc -l) +if [ "$unique_ip_count" -ne $EXPECTED_IPS_NUM ]; then + echo "Expected $EXPECTED_IPS_NUM unique IPs, found $unique_ip_count" + exit 1 +fi + +# Verify port numbers +nameserver_ports=$(echo "$config_content" | yq eval '.[0].nameservers[].port' -) +for port in $nameserver_ports; do + if [ "$port" -ne 53 ]; then + echo "Invalid nameserver port: $port" + exit 1 + fi +done +master_ports=$(echo "$config_content" | yq eval '.[0].targets[].masters[].port' -) +for port in $master_ports; do + if [ "$port" -ne 5354 ]; then + echo "Invalid master port: $port" + exit 1 + fi +done +rndc_ports=$(echo "$config_content" | yq eval '.[0].targets[].options.rndc_port' -) +for port in $rndc_ports; do + if [ "$port" -ne 953 ]; then + echo "Invalid rndc port: $port" + exit 1 + fi +done +echo "pools.yaml generated file was verified successfully" diff --git a/tests/kuttl/common/validate-predictable-ips.sh b/tests/kuttl/common/validate-predictable-ips.sh new file mode 100755 index 00000000..e0b005a9 --- /dev/null +++ b/tests/kuttl/common/validate-predictable-ips.sh @@ -0,0 +1,31 @@ +#!/bin/bash +# +# This is a base script which will verify Bind9 & Mdns predictable IPs. +# +# Check Bind9 predictable IPs configmap +NUM_OF_SERVICES=$1 +bind_ips=$(oc get -n $NAMESPACE configmap designate-bind-ip-map -o json | jq -r '.data | values[]') +if [ $(echo "$bind_ips" | wc -l) -ne ${NUM_OF_SERVICES} ]; then + echo "Expected ${NUM_OF_SERVICES} bind addresses, found $(echo "$bind_ips" | wc -l)" + exit 1 +fi +for ip in $bind_ips; do + if [[ ! $ip =~ ^172\.28\.0\.[0-9]+$ ]]; then + echo "Invalid bind IP format: $ip" + exit 1 + fi +done + +# Check Mdns predictable IPs configmap +mdns_ips=$(oc get -n $NAMESPACE configmap designate-mdns-ip-map -o json | jq -r '.data | values[]') +if [ $(echo "$mdns_ips" | wc -l) -ne ${NUM_OF_SERVICES} ]; then + echo "Expected ${NUM_OF_SERVICES} mdns addresses, found $(echo "$mdns_ips" | wc -l)" + exit 1 +fi +for ip in $mdns_ips; do + if [[ ! $ip =~ ^172\.28\.0\.[0-9]+$ ]]; then + echo "Invalid mdns IP format: $ip" + exit 1 + fi +done +echo "Bind9 & Mdns predictable IPs were verified successfully" diff --git a/tests/kuttl/tests/designate_scale/02-assert.yaml b/tests/kuttl/tests/designate_scale/02-assert.yaml index bd922370..6c3c499b 100644 --- a/tests/kuttl/tests/designate_scale/02-assert.yaml +++ b/tests/kuttl/tests/designate_scale/02-assert.yaml @@ -1,8 +1,8 @@ # # Check for: # -# - 1 DesignateAPI CR -# - 3 Pods for DesignateAPI CR +# - Designate CR with all services scaled to 3 replicas +# - 3 Pods for each Designate service # apiVersion: designate.openstack.org/v1beta1 @@ -14,8 +14,26 @@ metadata: spec: designateAPI: replicas: 3 + designateBackendbind9: + replicas: 3 + designateCentral: + replicas: 3 + designateMdns: + replicas: 3 + designateProducer: + replicas: 3 + designateUnbound: + replicas: 3 + designateWorker: + replicas: 3 status: designateAPIReadyCount: 3 + designateBackendbind9ReadyCount: 3 + designateCentralReadyCount: 3 + designateMdnsReadyCount: 3 + designateProducerReadyCount: 3 + designateUnboundReadyCount: 3 + designateWorkerReadyCount: 3 --- apiVersion: apps/v1 kind: Deployment @@ -25,3 +43,64 @@ spec: replicas: 3 status: availableReplicas: 3 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: designate-backendbind9 +spec: + replicas: 3 +status: + availableReplicas: 3 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: designate-central +spec: + replicas: 3 +status: + availableReplicas: 3 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: designate-mdns +spec: + replicas: 3 +status: + availableReplicas: 3 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: designate-producer +spec: + replicas: 3 +status: + availableReplicas: 3 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: designate-unbound +spec: + replicas: 3 +status: + availableReplicas: 3 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: designate-worker +spec: + replicas: 3 +status: + availableReplicas: 3 +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +commands: + - script: | + ../../common/validate-predictable-ips.sh 3 + ../../common/validate-pools-yaml.sh 3 diff --git a/tests/kuttl/tests/designate_scale/02-scale-designate.yaml b/tests/kuttl/tests/designate_scale/02-scale-designate.yaml new file mode 100644 index 00000000..88d29cd3 --- /dev/null +++ b/tests/kuttl/tests/designate_scale/02-scale-designate.yaml @@ -0,0 +1,6 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: | + SVC_REPLICA_COUNT=3 + for svc in API Backendbind9 Central Mdns Producer Unbound Worker; do oc patch designate -n $NAMESPACE designate --type='json' -p='[{"op": "replace", "path": "/spec/designate'"${svc}"'/replicas", "value":'"${SVC_REPLICA_COUNT}"'}]'; done diff --git a/tests/kuttl/tests/designate_scale/02-scale-designateapi.yaml b/tests/kuttl/tests/designate_scale/02-scale-designateapi.yaml deleted file mode 100644 index 21b87b12..00000000 --- a/tests/kuttl/tests/designate_scale/02-scale-designateapi.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: kuttl.dev/v1beta1 -kind: TestStep -commands: - - script: | - oc patch designate -n $NAMESPACE designate --type='json' -p='[{"op": "replace", "path": "/spec/designateAPI/replicas", "value":3}]' diff --git a/tests/kuttl/tests/designate_scale/03-assert.yaml b/tests/kuttl/tests/designate_scale/03-assert.yaml index 53280822..9ff3f6b5 100644 --- a/tests/kuttl/tests/designate_scale/03-assert.yaml +++ b/tests/kuttl/tests/designate_scale/03-assert.yaml @@ -1,8 +1,8 @@ # # Check for: # -# - 1 DesignateAPI CR -# - 1 Pods for DesignateAPI CR +# - Designate CR with all services scaled down to 1 replica +# - 1 Pod for each Designate service # apiVersion: designate.openstack.org/v1beta1 @@ -14,8 +14,26 @@ metadata: spec: designateAPI: replicas: 1 + designateBackendbind9: + replicas: 1 + designateCentral: + replicas: 1 + designateMdns: + replicas: 1 + designateProducer: + replicas: 1 + designateUnbound: + replicas: 1 + designateWorker: + replicas: 1 status: designateAPIReadyCount: 1 + designateBackendbind9ReadyCount: 1 + designateCentralReadyCount: 1 + designateMdnsReadyCount: 1 + designateProducerReadyCount: 1 + designateUnboundReadyCount: 1 + designateWorkerReadyCount: 1 --- apiVersion: apps/v1 kind: Deployment @@ -25,3 +43,64 @@ spec: replicas: 1 status: availableReplicas: 1 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: designate-backendbind9 +spec: + replicas: 1 +status: + availableReplicas: 1 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: designate-central +spec: + replicas: 1 +status: + availableReplicas: 1 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: designate-mdns +spec: + replicas: 1 +status: + availableReplicas: 1 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: designate-producer +spec: + replicas: 1 +status: + availableReplicas: 1 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: designate-unbound +spec: + replicas: 1 +status: + availableReplicas: 1 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: designate-worker +spec: + replicas: 1 +status: + availableReplicas: 1 +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +commands: + - script: | + ../../common/validate-predictable-ips.sh 1 + ../../common/validate-pools-yaml.sh 1 diff --git a/tests/kuttl/tests/designate_scale/03-scale-down-designate.yaml b/tests/kuttl/tests/designate_scale/03-scale-down-designate.yaml new file mode 100644 index 00000000..7ba5a3ee --- /dev/null +++ b/tests/kuttl/tests/designate_scale/03-scale-down-designate.yaml @@ -0,0 +1,6 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: | + SVC_REPLICA_COUNT=1 + for svc in API Backendbind9 Central Mdns Producer Unbound Worker; do oc patch designate -n $NAMESPACE designate --type='json' -p='[{"op": "replace", "path": "/spec/designate'"${svc}"'/replicas", "value":'"${SVC_REPLICA_COUNT}"'}]'; done diff --git a/tests/kuttl/tests/designate_scale/03-scale-down-designateapi.yaml b/tests/kuttl/tests/designate_scale/03-scale-down-designateapi.yaml deleted file mode 100644 index 2ceb251f..00000000 --- a/tests/kuttl/tests/designate_scale/03-scale-down-designateapi.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: kuttl.dev/v1beta1 -kind: TestStep -commands: - - script: | - oc patch designate -n $NAMESPACE designate --type='json' -p='[{"op": "replace", "path": "/spec/designateAPI/replicas", "value":1}]' diff --git a/tests/kuttl/tests/designate_scale/04-assert.yaml b/tests/kuttl/tests/designate_scale/04-assert.yaml index 08f3ae94..3b3bc176 100644 --- a/tests/kuttl/tests/designate_scale/04-assert.yaml +++ b/tests/kuttl/tests/designate_scale/04-assert.yaml @@ -1,8 +1,10 @@ # # Check for: # -# - 1 DesignateAPI CR with 0 replicas -# - Designate Deployment with 0 Pods +# - Designate CR with all services scaled to 3 replicas +# - 3 Pods for each Designate service +# +# We scale Designate up again to make sure scaling down didn't break anything # apiVersion: designate.openstack.org/v1beta1 @@ -13,11 +15,94 @@ metadata: name: designate spec: designateAPI: - replicas: 0 + replicas: 3 + designateBackendbind9: + replicas: 3 + designateCentral: + replicas: 3 + designateMdns: + replicas: 3 + designateProducer: + replicas: 3 + designateUnbound: + replicas: 3 + designateWorker: + replicas: 3 +status: + designateAPIReadyCount: 3 + designateBackendbind9ReadyCount: 3 + designateCentralReadyCount: 3 + designateMdnsReadyCount: 3 + designateProducerReadyCount: 3 + designateUnboundReadyCount: 3 + designateWorkerReadyCount: 3 --- apiVersion: apps/v1 kind: Deployment metadata: name: designate-api spec: - replicas: 0 + replicas: 3 +status: + availableReplicas: 3 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: designate-backendbind9 +spec: + replicas: 3 +status: + availableReplicas: 3 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: designate-central +spec: + replicas: 3 +status: + availableReplicas: 3 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: designate-mdns +spec: + replicas: 3 +status: + availableReplicas: 3 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: designate-producer +spec: + replicas: 3 +status: + availableReplicas: 3 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: designate-unbound +spec: + replicas: 3 +status: + availableReplicas: 3 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: designate-worker +spec: + replicas: 3 +status: + availableReplicas: 3 +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +commands: + - script: | + ../../common/validate-predictable-ips.sh 3 + ../../common/validate-pools-yaml.sh 3 diff --git a/tests/kuttl/tests/designate_scale/04-errors.yaml b/tests/kuttl/tests/designate_scale/04-errors.yaml deleted file mode 100644 index 2efa4262..00000000 --- a/tests/kuttl/tests/designate_scale/04-errors.yaml +++ /dev/null @@ -1,7 +0,0 @@ -apiVersion: v1 -kind: Pod -metadata: - annotations: - openshift.io/scc: anyuid - labels: - service: designate diff --git a/tests/kuttl/tests/designate_scale/04-scale-designate-up-again.yaml b/tests/kuttl/tests/designate_scale/04-scale-designate-up-again.yaml new file mode 100644 index 00000000..88d29cd3 --- /dev/null +++ b/tests/kuttl/tests/designate_scale/04-scale-designate-up-again.yaml @@ -0,0 +1,6 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: | + SVC_REPLICA_COUNT=3 + for svc in API Backendbind9 Central Mdns Producer Unbound Worker; do oc patch designate -n $NAMESPACE designate --type='json' -p='[{"op": "replace", "path": "/spec/designate'"${svc}"'/replicas", "value":'"${SVC_REPLICA_COUNT}"'}]'; done diff --git a/tests/kuttl/tests/designate_scale/04-scale-down-zero-designateapi.yaml b/tests/kuttl/tests/designate_scale/04-scale-down-zero-designateapi.yaml deleted file mode 100644 index 30d97094..00000000 --- a/tests/kuttl/tests/designate_scale/04-scale-down-zero-designateapi.yaml +++ /dev/null @@ -1,5 +0,0 @@ -apiVersion: kuttl.dev/v1beta1 -kind: TestStep -commands: - - script: | - oc patch designate -n $NAMESPACE designate --type='json' -p='[{"op": "replace", "path": "/spec/designateAPI/replicas", "value":0}]' diff --git a/tests/kuttl/tests/designate_scale/05-assert.yaml b/tests/kuttl/tests/designate_scale/05-assert.yaml new file mode 100644 index 00000000..c06ab0ca --- /dev/null +++ b/tests/kuttl/tests/designate_scale/05-assert.yaml @@ -0,0 +1,81 @@ +# +# Check for: +# +# - Designate CR with all services scaled down to 0 replicas +# - Designate Deployment with no pods +# + +apiVersion: designate.openstack.org/v1beta1 +kind: Designate +metadata: + finalizers: + - openstack.org/designate + name: designate +spec: + designateAPI: + replicas: 0 + # Commenting the following lines until the team decides what to do about bind replica count = 0 + # designateBackendbind9: + # replicas: 0 + designateCentral: + replicas: 0 + # Commenting the following lines until the team decides what to do about mdns replica count = 0 + # designateMdns: + # replicas: 0 + designateProducer: + replicas: 0 + designateUnbound: + replicas: 0 + designateWorker: + replicas: 0 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: designate-api +spec: + replicas: 0 +# Commenting the following lines until the team decides what to do about bind replica count = 0 +# --- +# apiVersion: apps/v1 +# kind: StatefulSet +# metadata: +# name: designate-backendbind9 +# spec: +# replicas: 0 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: designate-central +spec: + replicas: 0 +# Commenting the following lines until the team decides what to do about mdns replica count = 0 +# --- +# apiVersion: apps/v1 +# kind: StatefulSet +# metadata: +# name: designate-mdns +# spec: +# replicas: 0 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: designate-producer +spec: + replicas: 0 +--- +apiVersion: apps/v1 +kind: StatefulSet +metadata: + name: designate-unbound +spec: + replicas: 0 +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: designate-worker +spec: + replicas: 0 diff --git a/tests/kuttl/tests/designate_scale/05-errors.yaml b/tests/kuttl/tests/designate_scale/05-errors.yaml index e965041c..2efa4262 100644 --- a/tests/kuttl/tests/designate_scale/05-errors.yaml +++ b/tests/kuttl/tests/designate_scale/05-errors.yaml @@ -1,24 +1,3 @@ -# -# Check for: -# -# No DesignateAPI CR -# No Deployment for DesignateAPI CR -# No Pods in designate Deployment -# No Designate Services -# -apiVersion: designate.openstack.org/v1beta1 -kind: Designate -metadata: - finalizers: - - openstack.org/designate - name: designate ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: designate-api ---- -# the openshift annotations can't be checked through the deployment above apiVersion: v1 kind: Pod metadata: @@ -26,31 +5,3 @@ metadata: openshift.io/scc: anyuid labels: service: designate ---- -apiVersion: v1 -kind: Service -metadata: - labels: - endpoint: internal - service: designate - name: designate-internal -spec: - ports: - - name: designate-internal - selector: - service: designate - type: ClusterIP ---- -apiVersion: v1 -kind: Service -metadata: - labels: - endpoint: public - service: designate - name: designate-public -spec: - ports: - - name: designate-public - selector: - service: designate - type: ClusterIP diff --git a/tests/kuttl/tests/designate_scale/05-scale-down-zero-designate.yaml b/tests/kuttl/tests/designate_scale/05-scale-down-zero-designate.yaml new file mode 100644 index 00000000..32222ae7 --- /dev/null +++ b/tests/kuttl/tests/designate_scale/05-scale-down-zero-designate.yaml @@ -0,0 +1,6 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: | + SVC_REPLICA_COUNT=0 + for svc in API Central Producer Unbound Worker; do oc patch designate -n $NAMESPACE designate --type='json' -p='[{"op": "replace", "path": "/spec/designate'"${svc}"'/replicas", "value":'"${SVC_REPLICA_COUNT}"'}]'; done diff --git a/tests/kuttl/tests/designate_scale/05-cleanup-designate.yaml b/tests/kuttl/tests/designate_scale/06-cleanup-designate.yaml similarity index 100% rename from tests/kuttl/tests/designate_scale/05-cleanup-designate.yaml rename to tests/kuttl/tests/designate_scale/06-cleanup-designate.yaml diff --git a/tests/kuttl/tests/designate_scale/06-errors.yaml b/tests/kuttl/tests/designate_scale/06-errors.yaml new file mode 100644 index 00000000..e965041c --- /dev/null +++ b/tests/kuttl/tests/designate_scale/06-errors.yaml @@ -0,0 +1,56 @@ +# +# Check for: +# +# No DesignateAPI CR +# No Deployment for DesignateAPI CR +# No Pods in designate Deployment +# No Designate Services +# +apiVersion: designate.openstack.org/v1beta1 +kind: Designate +metadata: + finalizers: + - openstack.org/designate + name: designate +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: designate-api +--- +# the openshift annotations can't be checked through the deployment above +apiVersion: v1 +kind: Pod +metadata: + annotations: + openshift.io/scc: anyuid + labels: + service: designate +--- +apiVersion: v1 +kind: Service +metadata: + labels: + endpoint: internal + service: designate + name: designate-internal +spec: + ports: + - name: designate-internal + selector: + service: designate + type: ClusterIP +--- +apiVersion: v1 +kind: Service +metadata: + labels: + endpoint: public + service: designate + name: designate-public +spec: + ports: + - name: designate-public + selector: + service: designate + type: ClusterIP