blob: 651e9db2368abfe5fdd103aa84d56d3724a07604 [file] [log] [blame]
#!/usr/bin/env bash
# Copyright 2020 Telefónica Investigación y Desarrollo S.A.U.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Default values
sampling_period=5 # seconds
time_for_readiness=2 # minutes ready
time_for_failure=7 # minutes broken
KUBERNETES= # By default, assumes Docker Swarm installation
STACK_NAME=osm # By default, "osm"
while getopts "p:r:f:s:k" o; do
case "${o}" in
p)
sampling_period=${OPTARG}
;;
r)
time_for_readiness=${OPTARG}
;;
f)
time_for_failure=${OPTARG}
;;
s)
STACK_NAME=${OPTARG}
;;
k)
KUBERNETES="y"
;;
esac
done
oks_threshold=$((time_for_readiness*60/${sampling_period})) # No. ok samples to declare the system ready
failures_threshold=$((time_for_failure*60/${sampling_period})) # No. nok samples to declare the system broken
failures_in_a_row=0
oks_in_a_row=0
# Show status of the OSM services deployed with helm
echo "helm -n ${STACK_NAME} list"
helm -n ${STACK_NAME} list
echo "helm -n ${STACK_NAME} status ${STACK_NAME}"
helm -n ${STACK_NAME} status ${STACK_NAME}
####################################################################################
# Loop to check system readiness
####################################################################################
while [[ (${failures_in_a_row} -lt ${failures_threshold}) && (${oks_in_a_row} -lt ${oks_threshold}) ]]
do
#------------ CHECKS FOR KUBERNETES INSTALLATION
if [ -n "$KUBERNETES" ]
then
# State of Deployments
DEPLOYMENTS_STATE=$(kubectl get deployment -n ${STACK_NAME} --no-headers 2>&1)
DEPLOYMENTS_READY=$(echo "${DEPLOYMENTS_STATE}" | awk '$2=="1/1" && $4=="1" {printf ("%20s\t%s\t%s\n", $1, $2, $4)}')
DEPLOYMENTS_NOT_READY=$(echo "${DEPLOYMENTS_STATE}" | awk '$2!="1/1" || $4!="1" {printf ("%20s\t%s\t%s\n", $1, $2, $4)}')
COUNT_DEPLOYMENTS_READY=$(echo "${DEPLOYMENTS_READY}"| grep -v -e '^$' | wc -l)
COUNT_DEPLOYMENTS_NOT_READY=$(echo "${DEPLOYMENTS_NOT_READY}" | grep -v -e '^$' | wc -l)
# State of Statefulsets
STS_STATE=$(kubectl get statefulset -n ${STACK_NAME} --no-headers 2>&1)
STS_READY=$(echo "${STS_STATE}" | awk '$2=="1/1" || $2=="2/2" || $2=="3/3" {printf ("%20s\t%s\t%s\n", $1, $2, $4)}')
STS_NOT_READY=$(echo "${STS_STATE}" | awk '$2!="1/1" && $2!="2/2" && $2!="3/3" {printf ("%20s\t%s\t%s\n", $1, $2, $4)}')
COUNT_STS_READY=$(echo "${STS_READY}" | grep -v -e '^$' | wc -l)
COUNT_STS_NOT_READY=$(echo "${STS_NOT_READY}" | grep -v -e '^$' | wc -l)
# OK sample
if [[ $((${COUNT_DEPLOYMENTS_NOT_READY}+${COUNT_STS_NOT_READY})) -eq 0 ]]
then
((++oks_in_a_row))
failures_in_a_row=0
echo -ne ===\> Successful checks: "${oks_in_a_row}"/${oks_threshold}\\r
# NOK sample
else
((++failures_in_a_row))
oks_in_a_row=0
echo
echo Bootstraping... "${failures_in_a_row}" attempts of ${failures_threshold}
# Reports failed deployments
if [[ "${COUNT_DEPLOYMENTS_NOT_READY}" -ne 0 ]]
then
echo ${COUNT_DEPLOYMENTS_NOT_READY} of $((${COUNT_DEPLOYMENTS_NOT_READY}+${COUNT_DEPLOYMENTS_READY})) deployments starting:
echo "${DEPLOYMENTS_NOT_READY}"
echo
fi
# Reports failed statefulsets
if [[ "${COUNT_STS_NOT_READY}" -ne 0 ]]
then
echo ${COUNT_STS_NOT_READY} of $((${COUNT_STS_NOT_READY}+${COUNT_STS_READY})) statefulsets starting:
echo "${STS_NOT_READY}"
echo
fi
fi
#------------ CHECKS FOR DOCKER SWARM INSTALLATION
else
# State of Docker Services
SERVICES_STATE=$(sg docker -c "docker service ls" 2>&1 | grep " ${STACK_NAME}_")
SERVICES_READY=$(echo "${SERVICES_STATE}" | awk '$3=="replicated" && $4=="1/1" {printf ("%20s\t%s\n", $2, $4)}')
SERVICES_NOT_READY=$(echo "${SERVICES_STATE}" | awk '$3=="replicated" && $4!="1/1" {printf ("%20s\t%s\n", $2, $4)}')
COUNT_SERVICES_READY=$(echo "${SERVICES_READY}" | grep -v -e '^$' | wc -l)
COUNT_SERVICES_NOT_READY=$(echo "${SERVICES_NOT_READY}" | grep -v -e '^$' | wc -l)
# OK sample
if [[ ${COUNT_SERVICES_NOT_READY} -eq 0 ]]
then
((++oks_in_a_row))
failures_in_a_row=0
echo -ne ===\> Successful checks: "${oks_in_a_row}"/${oks_threshold}\\r
# NOK sample
else
((++failures_in_a_row))
oks_in_a_row=0
echo
echo Bootstraping... "${failures_in_a_row}" attempts of ${failures_threshold}
echo ${COUNT_SERVICES_NOT_READY} of $((${COUNT_SERVICES_NOT_READY}+${COUNT_SERVICES_READY})) services starting:
echo "${SERVICES_NOT_READY}"
fi
fi
#------------ NEXT SAMPLE
sleep ${sampling_period}
done
####################################################################################
# OUTCOME
####################################################################################
if [[ (${failures_in_a_row} -ge ${failures_threshold}) ]]
then
echo
echo SYSTEM IS BROKEN
exit 1
else
echo
echo SYSTEM IS READY
fi