diff --git a/scripts/deploy/02_wait_for_helmreleases.sh b/scripts/deploy/02_wait_for_helmreleases.sh index feeb7333ac38b3ff176d3fbda98206c5ce64ff4e..6650f4bf2c7f1928b40e8a96c49125b3b9bf812c 100755 --- a/scripts/deploy/02_wait_for_helmreleases.sh +++ b/scripts/deploy/02_wait_for_helmreleases.sh @@ -2,13 +2,19 @@ set -e -## This is an array to instantiate the order of wait conditions -ORDERED_HELMRELEASES="gatekeeper istio-operator istio monitoring eck-operator ek fluent-bit twistlock cluster-auditor authservice argocd gitlab haproxy-sso gitlab-runner minio-operator minio anchore sonarqube mattermost-operator mattermost keycloak nexus-repository-manager" +## Array of core HRs +CORE_HELMRELEASES=("gatekeeper" "istio-operator" "istio" "monitoring" "eck-operator" "ek" "fluent-bit" "twistlock" "cluster-auditor" "jaeger" "kiali") -## This is the actual deployed helmrelease objects in the cluster -DEPLOYED_HELMRELEASES=$(kubectl get hr --no-headers -n bigbang | awk '{ print $1}') +## Array of addon HRs +ADD_ON_HELMRELEASES=("argocd" "authservice" "gitlab" "gitlab-runner" "anchore" "sonarqube" "minio-operator" "minio" "mattermost-operator" "mattermost" "nexus-repository-manager" "velero") -printf "Identified the following deployed helmreleases:\n%s" "${DEPLOYED_HELMRELEASES}" +## Map of values-keys/labels to HRs: Only needed if HR name =/= label name +declare -A ADD_ON_HELMRELEASES_MAP +ADD_ON_HELMRELEASES_MAP["haproxy"]="haproxy-sso" +ADD_ON_HELMRELEASES_MAP["gitlabRunner"]="gitlab-runner" +ADD_ON_HELMRELEASES_MAP["minioOperator"]="minio-operator" +ADD_ON_HELMRELEASES_MAP["mattermostoperator"]="mattermost-operator" +ADD_ON_HELMRELEASES_MAP["nexus"]="nexus-repository-manager" ## Function to test an array contains an element ## Args: @@ -27,12 +33,48 @@ function array_contains() { return $in } -## Function to wait on helmrelease -## Args: -## $1: package name -function wait_on() { - echo "Waiting on package $1" - kubectl wait --for=condition=Ready --timeout 600s helmrelease -n bigbang $1; +## Function to check/wait on HR existence +function check_if_hr_exist() { + timeElapsed=0 + echo "Waiting for $1 HR to exist" + until kubectl get hr -n bigbang $1 &> /dev/null; do + sleep 5 + timeElapsed=$(($timeElapsed+5)) + if [[ $timeElapsed -ge 60 ]]; then + echo "Timed out while waiting for $1 HR to exist" + exit 1 + fi + done +} + +## Function to wait on all HRs +function wait_all_hr() { + timeElapsed=0 + while true; do + if [[ "$(kubectl get hr -n bigbang -o jsonpath='{.items[*].status.conditions[0].reason}')" =~ Failed ]]; then + state=$(kubectl get hr -A -o go-template='{{range $items,$contents := .items}}{{printf "HR %s" $contents.metadata.name}}{{printf " status is %s\n" (index $contents.status.conditions 0).reason}}{{end}}') + failed=$(echo "${state}" | grep "Failed") + echo "Found failed Helm Release(s). Exiting now." + echo "${failed}" + failed_hrs=$(echo "{$failed}" | awk '{print $2}') + for hr in $failed_hrs; do + kubectl describe hr -n bigbang $hr + done + exit 1 + fi + if [[ "$(kubectl get hr -n bigbang -o jsonpath='{.items[*].status.conditions[0].status}')" != *Unknown* ]]; then + if [[ "$(kubectl get hr -n bigbang -o jsonpath='{.items[*].status.conditions[0].status}')" != *False* ]]; then + echo "All HR's deployed" + break + fi + fi + sleep 5 + timeElapsed=$(($timeElapsed+5)) + if [[ $timeElapsed -ge 1800 ]]; then + echo "Timed out while waiting for hr's to be ready." + exit 1 + fi + done } ## Function to wait on all statefulsets @@ -75,29 +117,41 @@ function wait_daemonset(){ done } +## Append all add-ons to hr list if "all-packages" or default branch/tag. Else, add specific ci labels to hr list. +HELMRELEASES=(${CORE_HELMRELEASES[@]}) +if [[ "${CI_COMMIT_BRANCH}" == "${CI_DEFAULT_BRANCH}" ]] || [[ ! -z "$CI_COMMIT_TAG" ]] || [[ $CI_MERGE_REQUEST_LABELS =~ "all-packages" ]]; then + HELMRELEASES+=(${ADD_ON_HELMRELEASES[@]}) + echo "All helmreleases enabled: all-packages label enabled, or on default branch or tag." +elif [[ ! -z "$CI_MERGE_REQUEST_LABELS" ]]; then + IFS="," + for package in $CI_MERGE_REQUEST_LABELS; do + # Check if package is in addons + if array_contains ADD_ON_HELMRELEASES "$package"; then + HELMRELEASES+=("$package") + # Check to see if there is a mapping from label -> HR + elif [ ${ADD_ON_HELMRELEASES_MAP[$package]+_} ]; then + package="${ADD_ON_HELMRELEASES_MAP[$package]}" + # Safeguard to doublecheck new package name is valid HR name + if array_contains ADD_ON_HELMRELEASES "$package"; then + HELMRELEASES+=("$package") + fi + fi + done + echo "Found enabled helmreleases: ${HELMRELEASES[@]}" +fi -for package in $ORDERED_HELMRELEASES; -do - if array_contains DEPLOYED_HELMRELEASES "$package"; - then wait_on "$package" - else echo "Expected package: $package, but not found in release. Update the array in this script if this package is no longer needed" - fi -done - -kubectl get helmreleases,kustomizations,gitrepositories -A +echo "Waiting on GitRepositories" +kubectl wait --for=condition=Ready --timeout 60s gitrepositories -n bigbang --all -for package in $DEPLOYED_HELMRELEASES; +for package in "${HELMRELEASES[@]}"; do - if array_contains ORDERED_HELMRELEASES "$package"; - then echo "" - else - echo "Found package: $package, but not found in this script array. Update the array in this script if this package is always needed" - wait_on "$package" - fi + check_if_hr_exist "$package" done -# Double check everything got waited on... -kubectl wait --for=condition=Ready --timeout 600s helmrelease -n bigbang --all +echo "Waiting on helm releases..." +wait_all_hr + +kubectl get helmreleases,kustomizations,gitrepositories -A echo "Waiting on Secrets Kustomization" kubectl wait --for=condition=Ready --timeout 300s kustomizations.kustomize.toolkit.fluxcd.io -n bigbang secrets diff --git a/tests/ci/k3d/values.yaml b/tests/ci/k3d/values.yaml index 90fc5c1a940c5c037462d309f1b4ccd4de2ca4f4..93b4321ba005d091856daea6c135d6c50dc329fa 100644 --- a/tests/ci/k3d/values.yaml +++ b/tests/ci/k3d/values.yaml @@ -162,6 +162,8 @@ addons: enabled: false sso: enabled: false + flux: + timeout: 20m values: global: rails: