helmv2-cli armada pod running and ready check

This modifies helmv2-cli check for armada pod readiness.
There can be multiple kubernetes armada pods in the system, each
in different condition. This now selects armada pods that are
running and ready instead of just selecting the first found pod.

i.e., status.phase 'Running' and status.conditions 'Ready=True'

Change-Id: Ib998d60f3442835d9dbd8e93bf6aaa54ede2e218
Closes-Bug: 1886429
Signed-off-by: Jim Gauld <james.gauld@windriver.com>
This commit is contained in:
Jim Gauld 2020-09-16 15:58:09 -04:00
parent 17c1b8894d
commit a4d7cb9832
2 changed files with 48 additions and 13 deletions

View File

@ -20,18 +20,21 @@ PATH=/bin:/usr/bin:/usr/local/bin
# Process input options # Process input options
SCRIPT=$(basename $0) SCRIPT=$(basename $0)
OPTS=$(getopt -o dh --long debug,help -n ${SCRIPT} -- "$@") OPTS=$(getopt -o dh --long debug,help -n ${SCRIPT} -- "$@")
if [ $? != 0 ] ; then echo "Failed parsing options." >&2 ; exit 1 ; fi if [ $? != 0 ]; then
echo "Failed parsing options." >&2
exit 1
fi
eval set -- "$OPTS" eval set -- "$OPTS"
DEBUG=false DEBUG=false
HELP=false HELP=false
while true; do while true; do
case "$1" in case "$1" in
-d | --debug ) DEBUG=true; shift ;; -d | --debug ) DEBUG=true; shift ;;
-h | --help ) HELP=true; shift ;; -h | --help ) HELP=true; shift ;;
-- ) shift; break ;; -- ) shift; break ;;
* ) break ;; * ) break ;;
esac esac
done done
# Treat remaining arguments as commands + options # Treat remaining arguments as commands + options
@ -63,9 +66,41 @@ function ERROR {
LOG "${MSG} $@" LOG "${MSG} $@"
} }
# Determine armada pod # Determine running armada pods, including list of status conditions
POD=$(kubectl get pods -n armada --selector=application=armada \ # This jsonpath gives the following output format per pod:
--output=jsonpath={.items..metadata.name}) # armada-api-bc77f956d-jwl4n::Initialized=True:Ready=True:ContainersReady=True:PodScheduled=True
JSONPATH='{range .items[*]}{"\n"}{@.metadata.name}:{@.metadata.deletionTimestamp}{range @.status.conditions[*]}{":"}{@.type}={@.status}{end}{end}'
ARMADA_PODS=( $(kubectl get pods -n armada \
--selector=application=armada,component=api \
--field-selector status.phase=Running \
--output=jsonpath="${JSONPATH}") )
if [ ${#ARMADA_PODS[@]} -eq 0 ]; then
ERROR "Could not find armada pod."
exit 1
fi
if [ ${DEBUG} == 'true' ]; then
LOG "Found armada pods: ${ARMADA_PODS[@]}"
fi
# Get first available Running and Ready armada pod, with tiller container we can exec
POD=""
for LINE in "${ARMADA_PODS[@]}"; do
# match only Ready pods with nil deletionTimestamp
if [[ $LINE =~ ::.*Ready=True ]]; then
# extract pod name, it is first element delimited by :
A=( ${LINE/:/ } )
P=${A[0]}
else
continue
fi
kubectl exec -it -n armada ${P} -c tiller -- pwd 1>/dev/null 2>/dev/null
RC=$?
if [ ${RC} -eq 0 ]; then
POD=${P}
break
fi
done
if [ -z "${POD}" ]; then if [ -z "${POD}" ]; then
ERROR "Could not find armada pod." ERROR "Could not find armada pod."
exit 1 exit 1
@ -77,7 +112,7 @@ fi
# Determine tiller listen port (configured by armada chart) # Determine tiller listen port (configured by armada chart)
# armada-api is container index 0, tiller is container index 1 # armada-api is container index 0, tiller is container index 1
TILLER_PORT=$(kubectl get pod -n armada ${POD} \ TILLER_PORT=$(kubectl get pod -n armada ${POD} \
--output=jsonpath={.spec.containers[1].ports[0].containerPort}) --output=jsonpath={.spec.containers[1].ports[0].containerPort})
if [ -z "${TILLER_PORT}" ]; then if [ -z "${TILLER_PORT}" ]; then
ERROR "Could not find tiller listen port." ERROR "Could not find tiller listen port."
exit 1 exit 1

View File

@ -1,7 +1,7 @@
Name: helm Name: helm
Version: 3.2.1 Version: 3.2.1
Release: 0%{?_tis_dist}.%{tis_patch_ver} Release: 0%{?_tis_dist}.%{tis_patch_ver}
Summary: The Kubernetes Package Manager Summary: The Kubernetes Package Manager
License: Apache-2.0 License: Apache-2.0
Group: devel Group: devel
Packager: Wind River <info@windriver.com> Packager: Wind River <info@windriver.com>
@ -9,7 +9,7 @@ URL: https://github.com/kubernetes/helm/releases
Source0: %{name}-v%{version}-linux-amd64.tar.gz Source0: %{name}-v%{version}-linux-amd64.tar.gz
Source1: helm-upload Source1: helm-upload
Source2: helm.sudo Source2: helm.sudo
Source3: helmv2-cli Source3: helmv2-cli.sh
Requires: /bin/bash Requires: /bin/bash