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