github.com/percona/percona-xtradb-cluster-operator@v1.14.0/e2e-tests/upgrade-haproxy/run (about) 1 #!/bin/bash 2 3 set -o errexit 4 5 test_dir=$(realpath $(dirname $0)) 6 . ${test_dir}/../functions 7 8 set_debug 9 10 CLUSTER="upgrade-haproxy" 11 CLUSTER_SIZE=3 12 TARGET_OPERATOR_VER="${OPERATOR_VERSION}" 13 TARGET_IMAGE="${IMAGE}" 14 TARGET_IMAGE_PXC="${IMAGE_PXC}" 15 TARGET_IMAGE_PMM_CLIENT="${IMAGE_PMM_CLIENT}" 16 TARGET_IMAGE_PROXY="${IMAGE_PROXY}" 17 TARGET_IMAGE_HAPROXY="${IMAGE_HAPROXY}" 18 TARGET_IMAGE_BACKUP="${IMAGE_BACKUP}" 19 if [[ ${TARGET_IMAGE_PXC} == *"percona-xtradb-cluster-operator"* ]]; then 20 PXC_VER=$(echo -n "${TARGET_IMAGE_PXC}" | $sed -r 's/.*([0-9].[0-9])$/\1/') 21 else 22 PXC_VER=$(echo -n "${TARGET_IMAGE_PXC}" | $sed -r 's/.*:([0-9]+\.[0-9]+).*$/\1/') 23 fi 24 25 INIT_OPERATOR_VER=$(curl -s https://check.percona.com/versions/v1/pxc-operator | jq -r '.versions[].operator' | sort -V | tail -n1) 26 # if testing on release branch and version service is already updated with new operator images 27 # use the older version of operator as initial point for test 28 if [[ ${INIT_OPERATOR_VER} == "${TARGET_OPERATOR_VER}" ]]; then 29 INIT_OPERATOR_VER=$(curl -s https://check.percona.com/versions/v1/pxc-operator | jq -r '.versions[].operator' | sort -V | tail -n2 | head -n1) 30 fi 31 GIT_TAG="v${INIT_OPERATOR_VER}" 32 INIT_OPERATOR_IMAGES=$(curl -s "https://check.percona.com/versions/v1/pxc-operator/${INIT_OPERATOR_VER}/latest?databaseVersion=${PXC_VER}") 33 OPERATOR_NAME="percona-xtradb-cluster-operator" 34 35 IMAGE=$(echo "${INIT_OPERATOR_IMAGES}" | jq -r '.versions[].matrix.operator[].imagePath') 36 # we use the starting image from the same repo so we don't need to use initContainer.image option 37 if [[ "$(echo ${TARGET_IMAGE} | cut -d'/' -f1)" == "perconalab" ]]; then 38 IMAGE="${IMAGE/percona/perconalab}" 39 fi 40 IMAGE_PXC=$(echo "${INIT_OPERATOR_IMAGES}" | jq -r '.versions[].matrix.pxc[].imagePath') 41 IMAGE_PMM_CLIENT=$(echo "${INIT_OPERATOR_IMAGES}" | jq -r '.versions[].matrix.pmm[].imagePath') 42 IMAGE_PROXY=$(echo "${INIT_OPERATOR_IMAGES}" | jq -r '.versions[].matrix.proxysql[].imagePath') 43 IMAGE_HAPROXY=$(echo "${INIT_OPERATOR_IMAGES}" | jq -r '.versions[].matrix.haproxy[].imagePath') 44 IMAGE_BACKUP=$(echo "${INIT_OPERATOR_IMAGES}" | jq -r '.versions[].matrix.backup[].imagePath') 45 46 if [[ ${TARGET_OPERATOR_VER} == "${INIT_OPERATOR_VER}" ]]; then 47 echo "INIT_OPERATOR_VER and TARGET_OPERATOR_VER variables are the same: ${INIT_OPERATOR_VER}! Something is wrong!" 48 exit 1 49 fi 50 51 function main() { 52 deploy_cert_manager 53 54 # we cannot use create_infra and deploy_operator from functions since they deploy from the current source tree 55 # so we fetch last officially released images and yaml files as initial state for upgrade from github 56 create_infra_gh "${namespace}" "${GIT_TAG}" 57 start_minio 58 59 local proxy="haproxy" 60 local cr_yaml="${tmp_dir}/cr_${INIT_OPERATOR_VER}_${proxy}.yaml" 61 prepare_cr_yaml "${cr_yaml}" "${proxy}" "${CLUSTER}" "${CLUSTER_SIZE}" "${GIT_TAG}" 62 spinup_pxc "${CLUSTER}" "${cr_yaml}" "${CLUSTER_SIZE}" "30" "${conf_dir}/secrets_without_tls.yml" 63 compare_generation "1" "${proxy}" "${CLUSTER}" 64 65 run_backup "${CLUSTER}" "on-demand-backup-minio" 66 67 desc 'upgrade operator' 68 kubectl_bin apply --server-side --force-conflicts -f "${src_dir}/deploy/crd.yaml" 69 if [[ -n ${OPERATOR_NS} ]]; then 70 apply_rbac cw-rbac 71 else 72 apply_rbac rbac 73 fi 74 kubectl_bin patch deployment "${OPERATOR_NAME}" \ 75 -p'{"spec":{"template":{"spec":{"containers":[{"name":"'"${OPERATOR_NAME}"'","image":"'"${TARGET_IMAGE}"'"}]}}}}' ${OPERATOR_NS:+-n $OPERATOR_NS} 76 kubectl_bin rollout status deployment/"${OPERATOR_NAME}" ${OPERATOR_NS:+-n $OPERATOR_NS} 77 sleep 10 78 79 desc 'wait for operator upgrade' 80 local i=0 81 local max=60 82 until [[ $(kubectl_bin get pods --selector=app.kubernetes.io/name=${OPERATOR_NAME} \ 83 -o custom-columns='NAME:.metadata.name,IMAGE:.spec.containers[0].image' ${OPERATOR_NS:+-n $OPERATOR_NS} \ 84 | grep -vc 'NAME' | awk '{print $1}') -eq 1 ]]; do 85 if [[ $i -ge $max ]]; then 86 echo "Something went wrong waiting for operator upgrade!" 87 exit 1 88 fi 89 let i+=1 90 sleep 5 91 done 92 93 if [ -n "${OPERATOR_NS}" ]; then 94 kubectl_bin config set-context $(kubectl_bin config current-context) --namespace="${OPERATOR_NS}" 95 fi 96 wait_pod "$(kubectl_bin get pods --selector=app.kubernetes.io/name=${OPERATOR_NAME} \ 97 -o custom-columns='NAME:.metadata.name,IMAGE:.spec.containers[0].image' \ 98 | grep "${TARGET_IMAGE}" | awk '{print $1}')" 99 kubectl_bin config set-context $(kubectl_bin config current-context) --namespace="${namespace}" 100 101 desc 'check images and generation after operator upgrade' 102 check_pxc_liveness "${CLUSTER}" "${CLUSTER_SIZE}" 103 if [[ ${TARGET_IMAGE} == $(kubectl_bin get pod ${OPERATOR_NS:+-n $OPERATOR_NS} --selector=app.kubernetes.io/name="${OPERATOR_NAME}" -o jsonpath='{.items[*].spec.containers[?(@.name == "'"${OPERATOR_NAME}"'")].image}') && 104 ${IMAGE_PROXY} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.proxysql.image}') && 105 ${IMAGE_HAPROXY} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.haproxy.image}') && 106 ${IMAGE_BACKUP} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.backup.image}') && 107 ${IMAGE_PMM_CLIENT} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.pmm.image}') && 108 ${IMAGE_PXC} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.pxc.image}') ]]; then 109 : Operator image has been updated correctly 110 else 111 echo 'Operator image has not been updated' 112 exit 1 113 fi 114 compare_generation "1" "${proxy}" "${CLUSTER}" 115 116 desc 'patch pxc images and upgrade' 117 kubectl_bin patch pxc "${CLUSTER}" --type=merge --patch '{ 118 "spec": { 119 "crVersion": "'"${TARGET_OPERATOR_VER}"'", 120 "pxc": { "image": "'"${TARGET_IMAGE_PXC}"'" }, 121 "pmm": { "image": "'"${TARGET_IMAGE_PMM_CLIENT}"'" }, 122 "haproxy": { "image": "'"${TARGET_IMAGE_HAPROXY}"'" }, 123 "proxysql": { "image": "'"${TARGET_IMAGE_PROXY}"'" }, 124 "backup": { "image": "'"${TARGET_IMAGE_BACKUP}"'" } 125 }}' 126 sleep 10 127 128 desc 'check images and generation after full upgrade' 129 check_pxc_liveness "${CLUSTER}" "${CLUSTER_SIZE}" 130 if [[ ${TARGET_IMAGE} == $(kubectl_bin get pod ${OPERATOR_NS:+-n $OPERATOR_NS} --selector=app.kubernetes.io/name="${OPERATOR_NAME}" -o jsonpath='{.items[*].spec.containers[?(@.name == "'"${OPERATOR_NAME}"'")].image}') && 131 ${TARGET_IMAGE_PROXY} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.proxysql.image}') && 132 ${TARGET_IMAGE_HAPROXY} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.haproxy.image}') && 133 ${TARGET_IMAGE_BACKUP} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.backup.image}') && 134 ${TARGET_IMAGE_PMM_CLIENT} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.pmm.image}') && 135 ${TARGET_IMAGE_PXC} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.pxc.image}') ]]; then 136 : Cluster images have been updated correctly 137 else 138 echo 'Cluster images have not been updated' 139 exit 1 140 fi 141 compare_generation "2" "${proxy}" "${CLUSTER}" 142 compare_kubectl "statefulset/${CLUSTER}-pxc" 143 compare_kubectl "statefulset/${CLUSTER}-haproxy" 144 sleep 60 145 desc 'check data exists after upgrade and drop database' 146 compare_mysql_cmd "select-1" "SELECT * from myApp.myApp;" "-h ${CLUSTER}-pxc-0.${CLUSTER}-pxc -uroot -proot_password" 147 compare_mysql_cmd "select-1" "SELECT * from myApp.myApp;" "-h ${CLUSTER}-pxc-1.${CLUSTER}-pxc -uroot -proot_password" 148 compare_mysql_cmd "select-1" "SELECT * from myApp.myApp;" "-h ${CLUSTER}-pxc-2.${CLUSTER}-pxc -uroot -proot_password" 149 run_mysql 'drop database myApp;' "-h ${CLUSTER}-pxc -uroot -proot_password" 150 151 desc 'run restore' 152 run_recovery_check "${CLUSTER}" "on-demand-backup-minio" 153 154 desc 'cleanup' 155 destroy "${namespace}" 156 kubectl delete crd $(kubectl get crd | grep 'perconaxtradbcluster' | awk '{print $1}' | tr '\n' ' ') || : 157 desc "test passed" 158 } 159 160 main