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