|
| 1 | +#!/bin/bash |
| 2 | + |
| 3 | +set -x |
| 4 | + |
| 5 | +# PROJECT_ID="546993cb-c1ba-49cd-a975-187a2b924c21" |
| 6 | +# CONFIG_IDS=("b79d03d5-edfe-4cd4-8787-7d70738c6529" "853c369d-3dbd-41e4-8e79-006d2c3408b2" "736fd03d-190a-4bcd-a1a5-18334d868f20" "3d76faf5-663e-4a7a-bb1d-3c98a9fa6628" "70667b97-6bb5-425b-8e6a-47c931740604") |
| 7 | +# STACK_CONFIG_ID="53ef9a25-3aad-4167-b548-41b19c57cad4" |
| 8 | + |
| 9 | +function parse_params() { |
| 10 | + PROJECT_NAME=$1 |
| 11 | + STACK_NAME=$2 |
| 12 | + CONFIG_PATTERN=$3 |
| 13 | + [[ -z "$PROJECT_NAME" && -z "$PROJECT_ID" || -z "$STACK_NAME" && -z "$STACK_CONFIG_ID" ]] && \ |
| 14 | + die "Usage: $(basename "${BASH_SOURCE[0]}") project_name stack_name [config_name_pattern]" |
| 15 | + |
| 16 | + if [[ -z $DRY_RUN ]]; then |
| 17 | + CLI_CMD=ibmcloud |
| 18 | + else |
| 19 | + CLI_CMD=echo |
| 20 | + fi |
| 21 | +} |
| 22 | + |
| 23 | +function get_config_ids() { |
| 24 | + |
| 25 | + if [[ -z "$PROJECT_ID" ]]; then |
| 26 | + PROJECT_ID=$( ibmcloud project list --all-pages --output json | jq -r --arg project_name "$PROJECT_NAME" '.projects[]? | select(.definition.name == $project_name) | .id' ) |
| 27 | + fi |
| 28 | + [[ -z "$PROJECT_ID" ]] && die "ERROR!!! Project $PROJECT_NAME is not found" |
| 29 | + |
| 30 | + if [[ -z "$STACK_CONFIG_ID" ]]; then |
| 31 | + STACK_CONFIG_ID=$(ibmcloud project configs --project-id $PROJECT_ID --output json | jq -r --arg conf "$STACK_NAME" '.configs[]? | select(.definition.name==$conf) | .id ') |
| 32 | + fi |
| 33 | + [[ -z "$STACK_CONFIG_ID" ]] && die "ERROR!!! Stack Configuration $STACK_NAME is not found in project $PROJECT_NAME" |
| 34 | + |
| 35 | + |
| 36 | + if [[ -z "$CONFIG_IDS" ]]; then |
| 37 | + CONFIG_IDS=($(ibmcloud project configs --project-id $PROJECT_ID --output json | jq -r --arg pattern "$CONFIG_PATTERN" '[.configs[]? | select((.definition.name | test($pattern)) and (.deployment_model != "stack"))] | sort_by(.definition.name)[] | .id')) |
| 38 | + fi |
| 39 | + [[ -z "$CONFIG_IDS" ]] && die "ERROR!!! No configurations found matching '$CONFIG_PATTERN' in project $PROJECT_NAME" |
| 40 | +} |
| 41 | + |
| 42 | +function set_stack_inputs() { |
| 43 | + $CLI_CMD project config-update --project-id $PROJECT_ID --id $STACK_CONFIG_ID --definition @.def.json |
| 44 | +} |
| 45 | + |
| 46 | +function validate_config() { |
| 47 | + echo "=========> Starting validation for $(ibmcloud project config --project-id $PROJECT_ID --id $CONFIG_ID --output json| jq -r '.definition.name')" |
| 48 | + $CLI_CMD project config-validate --project-id $PROJECT_ID --id $CONFIG_ID --output json > /tmp/validation.json |
| 49 | +} |
| 50 | + |
| 51 | +function wait_for_validation() { |
| 52 | + # Loop until the state is set to validated |
| 53 | + while true; do |
| 54 | + |
| 55 | + # Get the current state of the configuration |
| 56 | + STATE=$(ibmcloud project config --project-id $PROJECT_ID --id $CONFIG_ID --output json | jq -r '.state') |
| 57 | + if [[ ! -z $DRY_RUN ]]; then |
| 58 | + STATE=validated |
| 59 | + fi |
| 60 | + |
| 61 | + if [[ "$STATE" == "validated" ]]; then |
| 62 | + break |
| 63 | + fi |
| 64 | + |
| 65 | + if [[ "$STATE" != "validating" ]]; then |
| 66 | + echo "Error: Unexpected state $STATE" |
| 67 | + exit 1 |
| 68 | + fi |
| 69 | + |
| 70 | + sleep 10 |
| 71 | + done |
| 72 | +} |
| 73 | + |
| 74 | +function approve_config() { |
| 75 | + $CLI_CMD project config-approve --project-id $PROJECT_ID --id $CONFIG_ID --comment "I approve through CLI" |
| 76 | +} |
| 77 | + |
| 78 | +function deploy_config() { |
| 79 | + $CLI_CMD project config-deploy --project-id $PROJECT_ID --id $CONFIG_ID |
| 80 | +} |
| 81 | + |
| 82 | +function wait_for_deployment() { |
| 83 | + while true; do |
| 84 | + # Retrieve the configuration |
| 85 | + RESPONSE=$(ibmcloud project config --project-id $PROJECT_ID --id $CONFIG_ID --output json) |
| 86 | + |
| 87 | + # Check the state of the configuration under approved_version |
| 88 | + STATE=$(echo "$RESPONSE" | jq -r ".approved_version.state") |
| 89 | + if [[ ! -z $DRY_RUN ]]; then |
| 90 | + STATE=deployed |
| 91 | + fi |
| 92 | + |
| 93 | + |
| 94 | + # If the state is "deployed" or "deploying_failed", exit the loop |
| 95 | + if [[ "$STATE" == "deployed" || "$STATE" == "deploying_failed" ]]; then |
| 96 | + break |
| 97 | + fi |
| 98 | + |
| 99 | + # If the state is not "deploying", print an error message and exit |
| 100 | + if [[ "$STATE" != "deploying" ]]; then |
| 101 | + echo "Error: Unexpected state $STATE" |
| 102 | + exit 1 |
| 103 | + fi |
| 104 | + |
| 105 | + # Sleep for a few seconds before checking the state again |
| 106 | + sleep 10 |
| 107 | + done |
| 108 | +} |
| 109 | + |
| 110 | +function die() |
| 111 | +{ |
| 112 | + local message=$1 |
| 113 | + local exit_code=${2-1} |
| 114 | + echo >&2 -e "$message" |
| 115 | + exit $exit_code |
| 116 | +} |
| 117 | + |
| 118 | +parse_params "$@" |
| 119 | +get_config_ids |
| 120 | +set_stack_inputs |
| 121 | + |
| 122 | +# 6. Loop through the configuration IDs and execute the functions |
| 123 | +for CONFIG_ID in "${CONFIG_IDS[@]}" |
| 124 | +do |
| 125 | + validate_config |
| 126 | + wait_for_validation |
| 127 | + approve_config |
| 128 | + deploy_config |
| 129 | + wait_for_deployment |
| 130 | +done |
0 commit comments