diff --git a/e2e-tests/functions b/e2e-tests/functions index 2f13a9d07..3ddf52bae 100755 --- a/e2e-tests/functions +++ b/e2e-tests/functions @@ -84,6 +84,42 @@ deploy_operator() { fi } +upgrade_operator_image() { + local image=$1 + + kubectl -n ${OPERATOR_NS:-$NAMESPACE} set image deployment/percona-server-mysql-operator manager=${image} +} + +deploy_operator_gh() { + local git_tag=$1 + + echo "applying ${git_tag}/deploy/crd.yaml" + kubectl apply \ + --server-side \ + --force-conflicts \ + -f "https://raw.githubusercontent.com/percona/percona-server-mysql-operator/${git_tag}/deploy/crd.yaml" + + local rbac="rbac" + local operator="operator" + if [ -n "${OPERATOR_NS}" ]; then + rbac="cw-rbac" + operator="cw-operator" + + create_namespace "${OPERATOR_NS}" + fi + + echo "applying ${git_tag}/deploy/${rbac}.yaml" + kubectl apply \ + -n "${OPERATOR_NS:-$NAMESPACE}" \ + -f "https://raw.githubusercontent.com/percona/percona-server-mysql-operator/${git_tag}/deploy/${rbac}.yaml" + + echo "applying ${git_tag}/deploy/${operator}.yaml" + curl -s "https://raw.githubusercontent.com/percona/percona-server-mysql-operator/${git_tag}/deploy/${operator}.yaml" \ + | yq eval '(select(documentIndex==1).spec.template.spec.containers[] | select(.name=="manager").env[] | select(.name=="DISABLE_TELEMETRY").value) = "true"' \ + | yq eval '(select(documentIndex==1).spec.template.spec.containers[] | select(.name=="manager").env[] | select(.name=="LOG_LEVEL").value) = "DEBUG"' \ + | kubectl -n "${OPERATOR_NS:-$NAMESPACE}" apply -f - +} + destroy_operator() { kubectl -n "${OPERATOR_NS:-$NAMESPACE}" delete deployment percona-server-mysql-operator --force --grace-period=0 || true if [[ $OPERATOR_NS ]]; then @@ -332,8 +368,21 @@ get_operator_pod() { -o 'jsonpath={.items[].metadata.name}' } +get_operator_image() { + kubectl get pods -n "${OPERATOR_NS:-$NAMESPACE}" \ + --selector=app.kubernetes.io/name=percona-server-mysql-operator \ + -o 'jsonpath={.items[].spec.containers[].image}' +} + get_cr() { local name_suffix=$1 + local image_mysql=${2:-${IMAGE_MYSQL}} + local image_backup=${3:-${IMAGE_BACKUP}} + local image_orchestrator=${4:-${IMAGE_ORCHESTRATOR}} + local image_router=${5:-${IMAGE_ROUTER}} + local image_toolkit=${6:-${IMAGE_TOOLKIT}} + local image_haproxy=${7:-${IMAGE_HAPROXY}} + local image_pmm_client=${8:-${IMAGE_PMM_CLIENT}} yq eval "$(printf '.metadata.name="%s"' "${test_name}${name_suffix:+-$name_suffix}")" "${DEPLOY_DIR}/cr.yaml" \ | yq eval "$(printf '.spec.initImage="%s"' "${IMAGE}")" - \ @@ -342,13 +391,13 @@ get_cr() { | yq eval '.spec.upgradeOptions.apply="disabled"' - \ | yq eval '.spec.mysql.clusterType="async"' - \ | yq eval '.spec.orchestrator.enabled=true' - \ - | yq eval "$(printf '.spec.mysql.image="%s"' "${IMAGE_MYSQL}")" - \ - | yq eval "$(printf '.spec.backup.image="%s"' "${IMAGE_BACKUP}")" - \ - | yq eval "$(printf '.spec.orchestrator.image="%s"' "${IMAGE_ORCHESTRATOR}")" - \ - | yq eval "$(printf '.spec.proxy.router.image="%s"' "${IMAGE_ROUTER}")" - \ - | yq eval "$(printf '.spec.toolkit.image="%s"' "${IMAGE_TOOLKIT}")" - \ - | yq eval "$(printf '.spec.proxy.haproxy.image="%s"' "${IMAGE_HAPROXY}")" - \ - | yq eval "$(printf '.spec.pmm.image="%s"' "${IMAGE_PMM_CLIENT}")" - \ + | yq eval "$(printf '.spec.mysql.image="%s"' "${image_mysql}")" - \ + | yq eval "$(printf '.spec.backup.image="%s"' "${image_backup}")" - \ + | yq eval "$(printf '.spec.orchestrator.image="%s"' "${image_orchestrator}")" - \ + | yq eval "$(printf '.spec.proxy.router.image="%s"' "${image_router}")" - \ + | yq eval "$(printf '.spec.toolkit.image="%s"' "${image_toolkit}")" - \ + | yq eval "$(printf '.spec.proxy.haproxy.image="%s"' "${image_haproxy}")" - \ + | yq eval "$(printf '.spec.pmm.image="%s"' "${image_pmm_client}")" - \ | if [ -n "${MINIKUBE}" ]; then yq eval '(.. | select(has("antiAffinityTopologyKey")).antiAffinityTopologyKey) |= "none"' - \ | yq eval '.spec.proxy.haproxy.resources.requests.cpu="300m"' - @@ -357,6 +406,16 @@ get_cr() { fi } +get_cr_gh() { + local name_suffix=$1 + + curl -s "https://raw.githubusercontent.com/percona/percona-server-mysql-operator/${git_tag}/deploy/cr.yaml" \ + | yq eval "$(printf '.metadata.name="%s"' "${test_name}${name_suffix:+-$name_suffix}")" - \ + | yq eval '.spec.secretsName="test-secrets"' - \ + | yq eval '.spec.sslSecretName="test-ssl"' - \ + | yq eval '.spec.upgradeOptions.apply="disabled"' - +} + get_client_pod() { kubectl -n "${NAMESPACE}" get pods \ --selector=name=mysql-client \ @@ -614,6 +673,7 @@ wait_cluster_consistency_gr() { wait_pod() { local pod=$1 + local ns=${2:-${NAMESPACE}} set +o xtrace retry=0 @@ -1038,3 +1098,43 @@ deploy_cmctl() { | kubectl apply -n "${NAMESPACE}" -f - kubectl apply -n "${NAMESPACE}" -f "${TESTS_CONFIG_DIR}/cmctl.yml" } + +latest_operator_version_in_vs() { + local latest=$(curl -s https://check.percona.com/versions/v1/ps-operator | jq -r '.versions[].operator' | sort -V | tail -n1) + + # if testing on release branch and version service is already updated with new operator images + # use the older version of operator as initial point for test + if [[ ${latest} == "${OPERATOR_VERSION}" ]]; then + latest=$(curl -s https://check.percona.com/versions/v1/ps-operator | jq -r '.versions[].operator' | sort -V | tail -n2 | head -n1) + fi + + echo ${latest} +} + +latest_operator_image_in_vs() { + local version=$(latest_operator_version_in_vs) + + curl -s https://check.percona.com/versions/v1/ps-operator/${version}/latest | jq -r '.versions[].matrix.operator[].imagePath' +} + +get_cr_with_latest_versions_in_vs() { + local version=$(latest_operator_version_in_vs) + local latest_versions=$(curl -s https://check.percona.com/versions/v1/ps-operator/${version}/latest) + + local image_mysql=$(echo ${latest_versions} | jq -r '.versions[].matrix.mysql[].imagePath') + local image_backup=$(echo ${latest_versions} | jq -r '.versions[].matrix.backup[].imagePath') + local image_orchestrator=$(echo ${latest_versions} | jq -r '.versions[].matrix.orchestrator[].imagePath') + local image_router=$(echo ${latest_versions} | jq -r '.versions[].matrix.orchestrator[].imagePath') + local image_toolkit=$(echo ${latest_versions} | jq -r '.versions[].matrix.toolkit[].imagePath') + local image_haproxy=$(echo ${latest_versions} | jq -r '.versions[].matrix.haproxy[].imagePath') + local image_pmm_client=$(echo ${latest_versions} | jq -r '.versions[].matrix.pmm[].imagePath') + + get_cr "" \ + ${image_mysql} \ + ${image_backup} \ + ${image_orchestrator} \ + ${image_router} \ + ${image_toolkit} \ + ${image_haproxy} \ + ${image_pmm_client} +} diff --git a/e2e-tests/run-distro.csv b/e2e-tests/run-distro.csv index a4183279a..76376f6a8 100644 --- a/e2e-tests/run-distro.csv +++ b/e2e-tests/run-distro.csv @@ -15,6 +15,8 @@ gr-security-context gr-self-healing gr-tls-cert-manager gr-users +gr-upgrade +async-upgrade haproxy init-deploy one-pod diff --git a/e2e-tests/run-pr.csv b/e2e-tests/run-pr.csv index c3fa9ff00..582249e58 100644 --- a/e2e-tests/run-pr.csv +++ b/e2e-tests/run-pr.csv @@ -1,34 +1,2 @@ -version-service -async-ignore-annotations -auto-config -config -config-router -demand-backup -gr-demand-backup -gr-demand-backup-haproxy -gr-finalizer -gr-haproxy -gr-ignore-annotations -gr-init-deploy -gr-one-pod -gr-recreate -gr-scaling -gr-scheduled-backup -gr-security-context -gr-self-healing -gr-tls-cert-manager -gr-users -haproxy -init-deploy -limits -monitoring -one-pod -operator-self-healing -recreate -scaling -scheduled-backup -service-per-pod -sidecars -smart-update -tls-cert-manager -users +gr-upgrade +async-upgrade diff --git a/e2e-tests/run-release.csv b/e2e-tests/run-release.csv index c3fa9ff00..816bf9700 100644 --- a/e2e-tests/run-release.csv +++ b/e2e-tests/run-release.csv @@ -18,6 +18,8 @@ gr-security-context gr-self-healing gr-tls-cert-manager gr-users +gr-upgrade +async-upgrade haproxy init-deploy limits diff --git a/e2e-tests/tests/async-upgrade/00-assert.yaml b/e2e-tests/tests/async-upgrade/00-assert.yaml new file mode 100644 index 000000000..d9146fe1b --- /dev/null +++ b/e2e-tests/tests/async-upgrade/00-assert.yaml @@ -0,0 +1,26 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: perconaservermysqls.ps.percona.com +spec: + group: ps.percona.com + names: + kind: PerconaServerMySQL + listKind: PerconaServerMySQLList + plural: perconaservermysqls + shortNames: + - ps + singular: perconaservermysql + scope: Namespaced +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +metadata: + name: check-operator-deploy-status +timeout: 120 +commands: + - script: kubectl assert exist-enhanced deployment percona-server-mysql-operator -n ${OPERATOR_NS:-$NAMESPACE} --field-selector status.readyReplicas=1 diff --git a/e2e-tests/tests/async-upgrade/00-deploy-operator.yaml b/e2e-tests/tests/async-upgrade/00-deploy-operator.yaml new file mode 100644 index 000000000..db7ba6ad8 --- /dev/null +++ b/e2e-tests/tests/async-upgrade/00-deploy-operator.yaml @@ -0,0 +1,15 @@ +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 + + git_tag="v$(latest_operator_version_in_vs)" + deploy_operator_gh ${git_tag} + deploy_non_tls_cluster_secrets + deploy_tls_cluster_secrets + deploy_client diff --git a/e2e-tests/tests/async-upgrade/01-assert.yaml b/e2e-tests/tests/async-upgrade/01-assert.yaml new file mode 100644 index 000000000..8fb121ebe --- /dev/null +++ b/e2e-tests/tests/async-upgrade/01-assert.yaml @@ -0,0 +1,58 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 420 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: async-upgrade-mysql +status: + observedGeneration: 1 + replicas: 3 + readyReplicas: 3 + currentReplicas: 3 + updatedReplicas: 3 + collisionCount: 0 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: async-upgrade-haproxy +status: + observedGeneration: 1 + replicas: 3 + readyReplicas: 3 + updatedReplicas: 3 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: async-upgrade-orc +status: + observedGeneration: 1 + replicas: 3 + readyReplicas: 3 + currentReplicas: 3 + updatedReplicas: 3 + collisionCount: 0 +--- +apiVersion: ps.percona.com/v1alpha1 +kind: PerconaServerMySQL +metadata: + name: async-upgrade + finalizers: + - percona.com/delete-mysql-pods-in-order +status: + mysql: + ready: 3 + size: 3 + state: ready + haproxy: + ready: 3 + size: 3 + state: ready + orchestrator: + ready: 3 + size: 3 + state: ready + state: ready diff --git a/e2e-tests/tests/async-upgrade/01-create-cluster.yaml b/e2e-tests/tests/async-upgrade/01-create-cluster.yaml new file mode 100644 index 000000000..38cd37d43 --- /dev/null +++ b/e2e-tests/tests/async-upgrade/01-create-cluster.yaml @@ -0,0 +1,22 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + version=$(latest_operator_version_in_vs) + init_image=$(get_operator_image) + + if [[ -z ${init_image} ]]; then + echo "failed to get operator image" + exit 1 + fi + + get_cr_with_latest_versions_in_vs \ + | yq eval "$(printf '.spec.initImage="%s"' "${init_image}")" - \ + | yq eval "$(printf '.spec.crVersion="%s"' "${version}")" - \ + | yq eval '.spec.mysql.clusterType="async"' - \ + | kubectl -n "${NAMESPACE}" apply -f - diff --git a/e2e-tests/tests/async-upgrade/02-upgrade-operator.yaml b/e2e-tests/tests/async-upgrade/02-upgrade-operator.yaml new file mode 100644 index 000000000..b86f22601 --- /dev/null +++ b/e2e-tests/tests/async-upgrade/02-upgrade-operator.yaml @@ -0,0 +1,12 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - timeout: 120 + script: |- + set -o errexit + set -o xtrace + + source ../../functions + + upgrade_operator_image ${IMAGE} + wait_deployment percona-server-mysql-operator ${OPERATOR_NS:-$NAMESPACE} diff --git a/e2e-tests/tests/async-upgrade/03-assert.yaml b/e2e-tests/tests/async-upgrade/03-assert.yaml new file mode 100644 index 000000000..488dfda06 --- /dev/null +++ b/e2e-tests/tests/async-upgrade/03-assert.yaml @@ -0,0 +1,70 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 60 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: async-upgrade-mysql +status: + observedGeneration: 1 + replicas: 3 + readyReplicas: 3 + currentReplicas: 3 + updatedReplicas: 3 + collisionCount: 0 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: async-upgrade-haproxy +status: + observedGeneration: 1 + replicas: 3 + readyReplicas: 3 + updatedReplicas: 3 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: async-upgrade-orc +status: + observedGeneration: 1 + replicas: 3 + readyReplicas: 3 + currentReplicas: 3 + updatedReplicas: 3 + collisionCount: 0 +--- +apiVersion: ps.percona.com/v1alpha1 +kind: PerconaServerMySQL +metadata: + name: async-upgrade + finalizers: + - percona.com/delete-mysql-pods-in-order +status: + mysql: + ready: 3 + size: 3 + state: ready + haproxy: + ready: 3 + size: 3 + state: ready + state: ready +--- +apiVersion: v1 +kind: Service +metadata: + name: async-upgrade-mysql +spec: + sessionAffinity: None + type: ClusterIP +--- +apiVersion: v1 +kind: Service +metadata: + name: async-upgrade-haproxy +spec: + sessionAffinity: None + type: ClusterIP diff --git a/e2e-tests/tests/async-upgrade/03-ensure-no-rollout.yaml b/e2e-tests/tests/async-upgrade/03-ensure-no-rollout.yaml new file mode 100644 index 000000000..e091f9f3c --- /dev/null +++ b/e2e-tests/tests/async-upgrade/03-ensure-no-rollout.yaml @@ -0,0 +1,5 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + sleep 25 diff --git a/e2e-tests/tests/async-upgrade/04-assert.yaml b/e2e-tests/tests/async-upgrade/04-assert.yaml new file mode 100644 index 000000000..d513057db --- /dev/null +++ b/e2e-tests/tests/async-upgrade/04-assert.yaml @@ -0,0 +1,58 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 420 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: async-upgrade-mysql +status: + observedGeneration: 2 + replicas: 3 + readyReplicas: 3 + currentReplicas: 3 + updatedReplicas: 3 + collisionCount: 0 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: async-upgrade-haproxy +status: + observedGeneration: 2 + replicas: 3 + readyReplicas: 3 + updatedReplicas: 3 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: async-upgrade-orc +status: + observedGeneration: 2 + replicas: 3 + readyReplicas: 3 + currentReplicas: 3 + updatedReplicas: 3 + collisionCount: 0 +--- +apiVersion: ps.percona.com/v1alpha1 +kind: PerconaServerMySQL +metadata: + name: async-upgrade + finalizers: + - percona.com/delete-mysql-pods-in-order +status: + mysql: + ready: 3 + size: 3 + state: ready + haproxy: + ready: 3 + size: 3 + state: ready + orchestrator: + ready: 3 + size: 3 + state: ready + state: ready diff --git a/e2e-tests/tests/async-upgrade/04-upgrade-cluster.yaml b/e2e-tests/tests/async-upgrade/04-upgrade-cluster.yaml new file mode 100644 index 000000000..61617f08e --- /dev/null +++ b/e2e-tests/tests/async-upgrade/04-upgrade-cluster.yaml @@ -0,0 +1,14 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + get_cr \ + | yq eval "$(printf '.spec.initImage="%s"' "${IMAGE}")" - \ + | yq eval "$(printf '.spec.crVersion="%s"' "${OPERATOR_VERSION}")" - \ + | yq eval '.spec.mysql.clusterType="async"' - \ + | kubectl -n "${NAMESPACE}" apply -f - diff --git a/e2e-tests/tests/async-upgrade/98-drop-finalizer.yaml b/e2e-tests/tests/async-upgrade/98-drop-finalizer.yaml new file mode 100644 index 000000000..00986f111 --- /dev/null +++ b/e2e-tests/tests/async-upgrade/98-drop-finalizer.yaml @@ -0,0 +1,5 @@ +apiVersion: ps.percona.com/v1alpha1 +kind: PerconaServerMySQL +metadata: + name: async-upgrade + finalizers: [] diff --git a/e2e-tests/tests/async-upgrade/99-remove-cluster-gracefully.yaml b/e2e-tests/tests/async-upgrade/99-remove-cluster-gracefully.yaml new file mode 100644 index 000000000..909ca8012 --- /dev/null +++ b/e2e-tests/tests/async-upgrade/99-remove-cluster-gracefully.yaml @@ -0,0 +1,16 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +delete: + - apiVersion: ps.percona.com/v1alpha1 + kind: PerconaServerMySQL + metadata: + name: async-upgrade +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + destroy_operator + timeout: 60 diff --git a/e2e-tests/tests/gr-upgrade/00-assert.yaml b/e2e-tests/tests/gr-upgrade/00-assert.yaml new file mode 100644 index 000000000..d9146fe1b --- /dev/null +++ b/e2e-tests/tests/gr-upgrade/00-assert.yaml @@ -0,0 +1,26 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 120 +--- +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: perconaservermysqls.ps.percona.com +spec: + group: ps.percona.com + names: + kind: PerconaServerMySQL + listKind: PerconaServerMySQLList + plural: perconaservermysqls + shortNames: + - ps + singular: perconaservermysql + scope: Namespaced +--- +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +metadata: + name: check-operator-deploy-status +timeout: 120 +commands: + - script: kubectl assert exist-enhanced deployment percona-server-mysql-operator -n ${OPERATOR_NS:-$NAMESPACE} --field-selector status.readyReplicas=1 diff --git a/e2e-tests/tests/gr-upgrade/00-deploy-operator.yaml b/e2e-tests/tests/gr-upgrade/00-deploy-operator.yaml new file mode 100644 index 000000000..db7ba6ad8 --- /dev/null +++ b/e2e-tests/tests/gr-upgrade/00-deploy-operator.yaml @@ -0,0 +1,15 @@ +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 + + git_tag="v$(latest_operator_version_in_vs)" + deploy_operator_gh ${git_tag} + deploy_non_tls_cluster_secrets + deploy_tls_cluster_secrets + deploy_client diff --git a/e2e-tests/tests/gr-upgrade/01-assert.yaml b/e2e-tests/tests/gr-upgrade/01-assert.yaml new file mode 100644 index 000000000..b25cc3ce9 --- /dev/null +++ b/e2e-tests/tests/gr-upgrade/01-assert.yaml @@ -0,0 +1,58 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 420 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: gr-upgrade-mysql +status: + observedGeneration: 1 + replicas: 3 + readyReplicas: 3 + currentReplicas: 3 + updatedReplicas: 3 + collisionCount: 0 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: gr-upgrade-haproxy +status: + observedGeneration: 1 + replicas: 3 + readyReplicas: 3 + updatedReplicas: 3 +--- +apiVersion: ps.percona.com/v1alpha1 +kind: PerconaServerMySQL +metadata: + name: gr-upgrade + finalizers: + - percona.com/delete-mysql-pods-in-order +status: + mysql: + ready: 3 + size: 3 + state: ready + haproxy: + ready: 3 + size: 3 + state: ready + state: ready +--- +apiVersion: v1 +kind: Service +metadata: + name: gr-upgrade-mysql +spec: + sessionAffinity: None + type: ClusterIP +--- +apiVersion: v1 +kind: Service +metadata: + name: gr-upgrade-haproxy +spec: + sessionAffinity: None + type: ClusterIP diff --git a/e2e-tests/tests/gr-upgrade/01-create-cluster.yaml b/e2e-tests/tests/gr-upgrade/01-create-cluster.yaml new file mode 100644 index 000000000..8b7f4fc5c --- /dev/null +++ b/e2e-tests/tests/gr-upgrade/01-create-cluster.yaml @@ -0,0 +1,24 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + version=$(latest_operator_version_in_vs) + init_image=$(get_operator_image) + + if [[ -z ${init_image} ]]; then + echo "failed to get operator image" + exit 1 + fi + + get_cr_with_latest_versions_in_vs \ + | yq eval "$(printf '.spec.initImage="%s"' "${init_image}")" - \ + | yq eval "$(printf '.spec.crVersion="%s"' "${version}")" - \ + | yq eval '.spec.mysql.clusterType="group-replication"' - \ + | yq eval '.spec.proxy.router.enabled=false' - \ + | yq eval '.spec.proxy.haproxy.enabled=true' - \ + | kubectl -n "${NAMESPACE}" apply -f - diff --git a/e2e-tests/tests/gr-upgrade/02-upgrade-operator.yaml b/e2e-tests/tests/gr-upgrade/02-upgrade-operator.yaml new file mode 100644 index 000000000..b86f22601 --- /dev/null +++ b/e2e-tests/tests/gr-upgrade/02-upgrade-operator.yaml @@ -0,0 +1,12 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - timeout: 120 + script: |- + set -o errexit + set -o xtrace + + source ../../functions + + upgrade_operator_image ${IMAGE} + wait_deployment percona-server-mysql-operator ${OPERATOR_NS:-$NAMESPACE} diff --git a/e2e-tests/tests/gr-upgrade/03-assert.yaml b/e2e-tests/tests/gr-upgrade/03-assert.yaml new file mode 100644 index 000000000..75f4aef0a --- /dev/null +++ b/e2e-tests/tests/gr-upgrade/03-assert.yaml @@ -0,0 +1,58 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 60 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: gr-upgrade-mysql +status: + observedGeneration: 1 + replicas: 3 + readyReplicas: 3 + currentReplicas: 3 + updatedReplicas: 3 + collisionCount: 0 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: gr-upgrade-haproxy +status: + observedGeneration: 1 + replicas: 3 + readyReplicas: 3 + updatedReplicas: 3 +--- +apiVersion: ps.percona.com/v1alpha1 +kind: PerconaServerMySQL +metadata: + name: gr-upgrade + finalizers: + - percona.com/delete-mysql-pods-in-order +status: + mysql: + ready: 3 + size: 3 + state: ready + haproxy: + ready: 3 + size: 3 + state: ready + state: ready +--- +apiVersion: v1 +kind: Service +metadata: + name: gr-upgrade-mysql +spec: + sessionAffinity: None + type: ClusterIP +--- +apiVersion: v1 +kind: Service +metadata: + name: gr-upgrade-haproxy +spec: + sessionAffinity: None + type: ClusterIP diff --git a/e2e-tests/tests/gr-upgrade/03-ensure-no-rollout.yaml b/e2e-tests/tests/gr-upgrade/03-ensure-no-rollout.yaml new file mode 100644 index 000000000..e091f9f3c --- /dev/null +++ b/e2e-tests/tests/gr-upgrade/03-ensure-no-rollout.yaml @@ -0,0 +1,5 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + sleep 25 diff --git a/e2e-tests/tests/gr-upgrade/04-assert.yaml b/e2e-tests/tests/gr-upgrade/04-assert.yaml new file mode 100644 index 000000000..80fd9c81d --- /dev/null +++ b/e2e-tests/tests/gr-upgrade/04-assert.yaml @@ -0,0 +1,42 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestAssert +timeout: 420 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: gr-upgrade-mysql +status: + observedGeneration: 2 + replicas: 3 + readyReplicas: 3 + currentReplicas: 3 + updatedReplicas: 3 + collisionCount: 0 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: gr-upgrade-haproxy +status: + observedGeneration: 2 + replicas: 3 + readyReplicas: 3 + updatedReplicas: 3 +--- +apiVersion: ps.percona.com/v1alpha1 +kind: PerconaServerMySQL +metadata: + name: gr-upgrade + finalizers: + - percona.com/delete-mysql-pods-in-order +status: + mysql: + ready: 3 + size: 3 + state: ready + haproxy: + ready: 3 + size: 3 + state: ready + state: ready diff --git a/e2e-tests/tests/gr-upgrade/04-upgrade-cluster.yaml b/e2e-tests/tests/gr-upgrade/04-upgrade-cluster.yaml new file mode 100644 index 000000000..e11b9e288 --- /dev/null +++ b/e2e-tests/tests/gr-upgrade/04-upgrade-cluster.yaml @@ -0,0 +1,16 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + get_cr \ + | yq eval "$(printf '.spec.initImage="%s"' "${IMAGE}")" - \ + | yq eval "$(printf '.spec.crVersion="%s"' "${OPERATOR_VERSION}")" - \ + | yq eval '.spec.mysql.clusterType="group-replication"' - \ + | yq eval '.spec.proxy.router.enabled=false' - \ + | yq eval '.spec.proxy.haproxy.enabled=true' - \ + | kubectl -n "${NAMESPACE}" apply -f - diff --git a/e2e-tests/tests/gr-upgrade/98-drop-finalizer.yaml b/e2e-tests/tests/gr-upgrade/98-drop-finalizer.yaml new file mode 100644 index 000000000..eda52d169 --- /dev/null +++ b/e2e-tests/tests/gr-upgrade/98-drop-finalizer.yaml @@ -0,0 +1,5 @@ +apiVersion: ps.percona.com/v1alpha1 +kind: PerconaServerMySQL +metadata: + name: gr-upgrade + finalizers: [] diff --git a/e2e-tests/tests/gr-upgrade/99-remove-cluster-gracefully.yaml b/e2e-tests/tests/gr-upgrade/99-remove-cluster-gracefully.yaml new file mode 100644 index 000000000..eadd4699d --- /dev/null +++ b/e2e-tests/tests/gr-upgrade/99-remove-cluster-gracefully.yaml @@ -0,0 +1,16 @@ +apiVersion: kuttl.dev/v1beta1 +kind: TestStep +delete: + - apiVersion: ps.percona.com/v1alpha1 + kind: PerconaServerMySQL + metadata: + name: gr-upgrade +commands: + - script: |- + set -o errexit + set -o xtrace + + source ../../functions + + destroy_operator + timeout: 60 diff --git a/e2e-tests/vars.sh b/e2e-tests/vars.sh index 7818bceca..945414968 100644 --- a/e2e-tests/vars.sh +++ b/e2e-tests/vars.sh @@ -9,6 +9,7 @@ export TEMP_DIR="/tmp/kuttl/ps/${test_name}" export GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD) export VERSION=${VERSION:-$(echo "${GIT_BRANCH}" | sed -e 's^/^-^g; s^[.]^-^g;' | tr '[:upper:]' '[:lower:]')} +export OPERATOR_VERSION="$(