| #!/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 |