github.com/percona/percona-xtradb-cluster-operator@v1.14.0/e2e-tests/upgrade-proxysql/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-proxysql" 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 IMAGE=$(echo "${INIT_OPERATOR_IMAGES}" | jq -r '.versions[].matrix.operator[].imagePath') 35 # we use the starting image from the same repo so we don't need to use initContainer.image option 36 if [[ "$(echo ${TARGET_IMAGE} | cut -d'/' -f1)" == "perconalab" ]]; then 37 IMAGE="${IMAGE/percona/perconalab}" 38 fi 39 IMAGE_PXC=$(echo "${INIT_OPERATOR_IMAGES}" | jq -r '.versions[].matrix.pxc[].imagePath') 40 IMAGE_PMM_CLIENT=$(echo "${INIT_OPERATOR_IMAGES}" | jq -r '.versions[].matrix.pmm[].imagePath') 41 IMAGE_PROXY=$(echo "${INIT_OPERATOR_IMAGES}" | jq -r '.versions[].matrix.proxysql[].imagePath') 42 IMAGE_HAPROXY=$(echo "${INIT_OPERATOR_IMAGES}" | jq -r '.versions[].matrix.haproxy[].imagePath') 43 IMAGE_BACKUP=$(echo "${INIT_OPERATOR_IMAGES}" | jq -r '.versions[].matrix.backup[].imagePath') 44 45 if [[ ${TARGET_OPERATOR_VER} == "${INIT_OPERATOR_VER}" ]]; then 46 echo "INIT_OPERATOR_VER and TARGET_OPERATOR_VER variables are the same: ${INIT_OPERATOR_VER}! Something is wrong!" 47 exit 1 48 fi 49 50 function main() { 51 deploy_cert_manager 52 53 # we cannot use create_infra and deploy_operator from functions since they deploy from the current source tree 54 # so we fetch last officially released images and yaml files as initial state for upgrade from github 55 create_infra_gh "${namespace}" "${GIT_TAG}" 56 57 local proxy="proxysql" 58 local cr_yaml="${tmp_dir}/cr_${INIT_OPERATOR_VER}_${proxy}.yaml" 59 prepare_cr_yaml "${cr_yaml}" "${proxy}" "${CLUSTER}" "${CLUSTER_SIZE}" "${GIT_TAG}" 60 spinup_pxc "${CLUSTER}" "${cr_yaml}" "${CLUSTER_SIZE}" "30" "${conf_dir}/secrets_without_tls.yml" 61 compare_generation "1" "${proxy}" "${CLUSTER}" 62 63 desc 'upgrade operator' 64 kubectl_bin apply --server-side --force-conflicts -f "${src_dir}/deploy/crd.yaml" 65 if [[ -n ${OPERATOR_NS} ]]; then 66 apply_rbac cw-rbac 67 else 68 apply_rbac rbac 69 fi 70 kubectl_bin patch deployment "${OPERATOR_NAME}" \ 71 -p'{"spec":{"template":{"spec":{"containers":[{"name":"'"${OPERATOR_NAME}"'","image":"'"${TARGET_IMAGE}"'"}]}}}}' ${OPERATOR_NS:+-n $OPERATOR_NS} 72 kubectl_bin rollout status deployment/"${OPERATOR_NAME}" ${OPERATOR_NS:+-n $OPERATOR_NS} 73 sleep 10 74 75 desc 'wait for operator upgrade' 76 local i=0 77 local max=60 78 until [[ $(kubectl_bin get pods --selector=app.kubernetes.io/name=${OPERATOR_NAME} \ 79 -o custom-columns='NAME:.metadata.name,IMAGE:.spec.containers[0].image' ${OPERATOR_NS:+-n $OPERATOR_NS} \ 80 | grep -vc 'NAME' | awk '{print $1}') -eq 1 ]]; do 81 if [[ $i -ge $max ]]; then 82 echo "Something went wrong waiting for operator upgrade!" 83 exit 1 84 fi 85 let i+=1 86 sleep 5 87 done 88 89 if [ -n "${OPERATOR_NS}" ]; then 90 kubectl_bin config set-context $(kubectl_bin config current-context) --namespace="${OPERATOR_NS}" 91 fi 92 wait_pod "$(kubectl_bin get pods --selector=app.kubernetes.io/name=${OPERATOR_NAME} \ 93 -o custom-columns='NAME:.metadata.name,IMAGE:.spec.containers[0].image' \ 94 | grep "${TARGET_IMAGE}" | awk '{print $1}')" 95 kubectl_bin config set-context $(kubectl_bin config current-context) --namespace="${namespace}" 96 97 desc 'check images and generation after operator upgrade' 98 check_pxc_liveness "${CLUSTER}" "${CLUSTER_SIZE}" 99 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}') && 100 ${IMAGE_PROXY} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.proxysql.image}') && 101 ${IMAGE_HAPROXY} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.haproxy.image}') && 102 ${IMAGE_BACKUP} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.backup.image}') && 103 ${IMAGE_PMM_CLIENT} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.pmm.image}') && 104 ${IMAGE_PXC} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.pxc.image}') ]]; then 105 : Operator image has been updated correctly 106 else 107 echo 'Operator image has not been updated' 108 exit 1 109 fi 110 compare_generation "1" "${proxy}" "${CLUSTER}" 111 112 desc 'patch pxc images and upgrade' 113 kubectl_bin patch pxc "${CLUSTER}" --type=merge --patch '{ 114 "spec": { 115 "crVersion": "'"${TARGET_OPERATOR_VER}"'", 116 "pxc": { "image": "'"${TARGET_IMAGE_PXC}"'" }, 117 "pmm": { "image": "'"${TARGET_IMAGE_PMM_CLIENT}"'" }, 118 "haproxy": { "image": "'"${TARGET_IMAGE_HAPROXY}"'" }, 119 "proxysql": { "image": "'"${TARGET_IMAGE_PROXY}"'" }, 120 "backup": { "image": "'"${TARGET_IMAGE_BACKUP}"'" } 121 }}' 122 sleep 10 123 124 desc 'check images and generation after full upgrade' 125 check_pxc_liveness "${CLUSTER}" "${CLUSTER_SIZE}" 126 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}') && 127 ${TARGET_IMAGE_PROXY} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.proxysql.image}') && 128 ${TARGET_IMAGE_HAPROXY} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.haproxy.image}') && 129 ${TARGET_IMAGE_BACKUP} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.backup.image}') && 130 ${TARGET_IMAGE_PMM_CLIENT} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.pmm.image}') && 131 ${TARGET_IMAGE_PXC} == $(kubectl_bin get pxc "${CLUSTER}" -o jsonpath='{.spec.pxc.image}') ]]; then 132 : Cluster images have been updated correctly 133 else 134 echo 'Cluster images have not been updated' 135 exit 1 136 fi 137 compare_generation "2" "${proxy}" "${CLUSTER}" 138 compare_kubectl "statefulset/${CLUSTER}-pxc" 139 compare_kubectl "statefulset/${CLUSTER}-proxysql" 140 141 desc 'cleanup' 142 destroy "${namespace}" 143 kubectl delete crd $(kubectl get crd | grep 'perconaxtradbcluster' | awk '{print $1}' | tr '\n' ' ') || : 144 desc "test passed" 145 } 146 147 main