X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=kubernetes%2Fhelm%2Fplugins%2Fdeploy%2Fdeploy.sh;h=3da189b90846c51f4b0f8373c98fd14274310120;hb=38634d6ef44d9d4954e553445451992e33c1f2f5;hp=9d9d1d208cb0564b0b74d759f5be3f13bac1b55e;hpb=38a4f2cc12dff3072cdfa777155f5f43107b6170;p=oom.git diff --git a/kubernetes/helm/plugins/deploy/deploy.sh b/kubernetes/helm/plugins/deploy/deploy.sh index 9d9d1d208c..ce8e80225f 100755 --- a/kubernetes/helm/plugins/deploy/deploy.sh +++ b/kubernetes/helm/plugins/deploy/deploy.sh @@ -2,7 +2,7 @@ usage() { cat << EOF -Install (or upgrade) an umbrella Helm Chart, and its subcharts, as separate Helm Releases +Install (or upgrade) an umbrella Helm Chart, and its subcharts, as separate Helm Releases The umbrella Helm Chart is broken apart into a parent release and subchart releases. Subcharts the are disabled (.enabled=false) will not be installed or upgraded. @@ -39,69 +39,57 @@ Flags: --set-string stringArray set STRING values on the command line (can specify multiple or separate values with commas: key1=val1,key2=val2) -f, --values valueFiles specify values in a YAML file or a URL(can specify multiple) (default []) --verbose enables full helm install/upgrade output during deploy + --set-last-applied set the last-applied-configuration annotation on all objects.This annotation is required to restore services using Ark/Veloro backup restore. EOF } -parse_yaml() { - local prefix=$2 - local s='[[:space:]]*' w='[a-zA-Z0-9_]*' fs=$(echo @|tr @ '\034') - sed -ne "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \ - -e "s|^\($s\)\($w\)$s:$s\(.*\)$s\$|\1$fs\2$fs\3|p" $1 | - awk -F$fs '{ - indent = length($1)/2; - vname[indent] = $2; - for (i in vname) {if (i > indent) {delete vname[i]}} - if (length($3) > 0) { - vn=""; for (i=0; i $GLOBAL_OVERRIDES cat $COMPUTED_OVERRIDES | sed '/common:/,/consul:/d' \ - | sed -n '/'"$START"'/,/'log:'/p' | sed '1d;$d' >> $GLOBAL_OVERRIDES + | sed -n '/^'"$START"'/,/'log:'/p' | sed '1d;$d' >> $GLOBAL_OVERRIDES else - SUBCHART_DIR="$CACHE_SUBCHART_DIR/$(cut -d':' -f1 <<<"$START")" - if [[ -d "$SUBCHART_DIR" ]]; then - cat $COMPUTED_OVERRIDES | sed -n '/^'"$START"'/,/^'"$END"'/p' \ - | sed '1d;$d' | cut -c3- > $SUBCHART_DIR/subchart-overrides.yaml + SUBCHART_DIR="$CACHE_SUBCHART_DIR/$(echo "$START" |cut -d':' -f1)" + if [ -d "$SUBCHART_DIR" ]; then + if [ -z "$END" ]; then + cat $COMPUTED_OVERRIDES | sed -n '/^'"$START"'/,/'"$END"'/p' \ + | sed '1d;$d' | cut -c3- > $SUBCHART_DIR/subchart-overrides.yaml + else + cat $COMPUTED_OVERRIDES | sed -n '/^'"$START"'/,/^'"$END"'/p' \ + | sed '1d;$d' | cut -c3- > $SUBCHART_DIR/subchart-overrides.yaml + fi fi fi done } - resolve_deploy_flags() { - DEPLOY_FLAGS=$1 - for flag in -f --values --set --set-string - do - while true ; do - # extract value of flag - length=${#flag} - length=$((length+1)) - FLAG_VALUE="$(echo $DEPLOY_FLAGS | sed -n 's/.*\('$flag'\).\s*/\1/p' | cut -c$length- | cut -d' ' -f1)" - - # purge flag and value from - DEPLOY_FLAGS="${DEPLOY_FLAGS//$flag $FLAG_VALUE/}" - DEPLOY_FLAGS=$(echo $DEPLOY_FLAGS | awk '{$1=$1};1') - if [ -z "$FLAG_VALUE" ] ; then - break - fi - done + flags=($1) + n=${#flags[*]} + i=0 ; while [ "$i" -lt "$n" ]; do + PARAM=${flags[i]} + if [ "$PARAM" = "-f" ] || \ + [ "$PARAM" = "--values" ] || \ + [ "$PARAM" = "--set" ] || \ + [ "$PARAM" = "--set-string" ] || \ + [ "$PARAM" = "--version" ]; then + # skip param and its value + i=$((i + 1)) + else + DEPLOY_FLAGS="$DEPLOY_FLAGS $PARAM" + fi + i=$((i+1)) done echo "$DEPLOY_FLAGS" } deploy() { # validate params - if [[ -z "$1" || -z "$2" ]]; then + if [ -z "$1" ] || [ -z "$2" ]; then usage exit 0 fi @@ -109,20 +97,37 @@ deploy() { RELEASE=$1 CHART_URL=$2 FLAGS=${@:3} - CHART_REPO="$(cut -d'/' -f1 <<<"$CHART_URL")" - CHART_NAME="$(cut -d'/' -f2 <<<"$CHART_URL")" - CACHE_DIR=~/.helm/plugins/deploy/cache + CHART_REPO="$(echo "$CHART_URL" |cut -d'/' -f1)" + CHART_NAME="$(echo "$CHART_URL" |cut -d'/' -f2)" + if expr "$HELM_VER" : "v3\..*" ; then + CACHE_DIR=~/.local/share/helm/plugins/deploy/cache + else + CACHE_DIR=~/.helm/plugins/deploy/cache + fi + echo "Use cache dir: $CACHE_DIR" CHART_DIR=$CACHE_DIR/$CHART_NAME CACHE_SUBCHART_DIR=$CHART_DIR-subcharts LOG_DIR=$CHART_DIR/logs # determine if verbose output is enabled VERBOSE="false" - if [[ $FLAGS = *"--verbose"* ]]; then + if expr "$FLAGS" : ".*--verbose.*" ; then FLAGS="$(echo $FLAGS| sed -n 's/--verbose//p')" VERBOSE="true" fi - if [[ $FLAGS = *"--dry-run"* ]]; then + # determine if delay for deployment is enabled + DELAY="false" + if expr "$FLAGS" : ".*--delay.*" ; then + FLAGS="$(echo $FLAGS| sed -n 's/--delay//p')" + DELAY="true" + fi + # determine if set-last-applied flag is enabled + SET_LAST_APPLIED="false" + if expr"$FLAGS" : ".*--set-last-applied.*" ; then + FLAGS="$(echo $FLAGS| sed -n 's/--set-last-applied//p')" + SET_LAST_APPLIED="true" + fi + if expr "$FLAGS" : ".*--dry-run.*" ; then VERBOSE="true" FLAGS="$FLAGS --debug" fi @@ -130,28 +135,30 @@ deploy() { # should pass all flags instead NAMESPACE="$(echo $FLAGS | sed -n 's/.*\(namespace\).\s*/\1/p' | cut -c10- | cut -d' ' -f1)" + VERSION="$(echo $FLAGS | sed -n 's/.*\(version\).\s*/\1/p' | cut -c8- | cut -d' ' -f1)" + + if [ ! -z $VERSION ]; then + VERSION="--version $VERSION" + fi + # Remove all override values passed in as arguments. These will be used during dry run # to resolve computed override values. Remaining flags will be passed on during # actual upgrade/install of parent and subcharts. DEPLOY_FLAGS=$(resolve_deploy_flags "$FLAGS") # determine if upgrading individual subchart or entire parent + subcharts - SUBCHART_RELEASE="$(cut -d'-' -f2 <<<"$RELEASE")" - if [[ ! -d "$CACHE_SUBCHART_DIR/$SUBCHART_RELEASE" ]]; then + SUBCHART_RELEASE="$(echo "$RELEASE" |cut -d'-' -f2)" + # update specified subchart without parent + RELEASE="$(echo "$RELEASE" |cut -d'-' -f1)" + if [ "$SUBCHART_RELEASE" = "$RELEASE" ]; then SUBCHART_RELEASE= - else - # update specified subchart without parent - RELEASE="$(cut -d'-' -f1 <<<"$RELEASE")" fi # clear previously cached charts rm -rf $CACHE_DIR - # create log driectory - mkdir -p $LOG_DIR - # fetch umbrella chart (parent chart containing subcharts) - if [[ -d "$CHART_URL" ]]; then + if [ -d "$CHART_URL" ]; then mkdir -p $CHART_DIR cp -R $CHART_URL/* $CHART_DIR/ @@ -162,9 +169,12 @@ deploy() { rm -rf $CHART_DIR/charts/*.tgz else echo "fetching $CHART_URL" - helm fetch $CHART_URL --untar --untardir $CACHE_DIR + helm fetch $CHART_URL --untar --untardir $CACHE_DIR $VERSION fi + # create log driectory + mkdir -p $LOG_DIR + # move out subcharts to process separately mkdir -p $CACHE_SUBCHART_DIR mv $CHART_DIR/charts/* $CACHE_SUBCHART_DIR/ @@ -185,57 +195,86 @@ deploy() { generate_overrides $COMPUTED_OVERRIDES $GLOBAL_OVERRIDES # upgrade/install parent chart first - if [[ -z "$SUBCHART_RELEASE" ]]; then + if [ -z "$SUBCHART_RELEASE" ]; then LOG_FILE=$LOG_DIR/${RELEASE}.log :> $LOG_FILE helm upgrade -i $RELEASE $CHART_DIR $DEPLOY_FLAGS -f $COMPUTED_OVERRIDES \ > $LOG_FILE.log 2>&1 - if [[ $VERBOSE == "true" ]]; then + if [ "$VERBOSE" = "true" ]; then cat $LOG_FILE else - echo "release $RELEASE deployed" + echo "release \"$RELEASE\" deployed" + fi + # Add annotation last-applied-configuration if set-last-applied flag is set + if [ "$SET_LAST_APPLIED" = "true" ]; then + helm get manifest ${RELEASE} \ + | kubectl apply set-last-applied --create-annotation -n onap -f - \ + > $LOG_FILE.log 2>&1 fi fi - # parse computed overrides - will use to determine if a subchart is "enabled" - eval $(parse_yaml $COMPUTED_OVERRIDES "computed_") - # upgrade/install each "enabled" subchart cd $CACHE_SUBCHART_DIR/ + #“helm ls” is an expensive command in that it can take a long time to execute. + #So cache the results to prevent repeated execution. + ALL_HELM_RELEASES=$(helm ls -q) for subchart in * ; do - VAR="computed_${subchart}_enabled" - COMMAND="$"$VAR - eval "SUBCHART_ENABLED=$COMMAND" - if [[ $SUBCHART_ENABLED == "true" ]]; then - if [[ -z "$SUBCHART_RELEASE" || $SUBCHART_RELEASE == "$subchart" ]]; then + SUBCHART_OVERRIDES=$CACHE_SUBCHART_DIR/$subchart/subchart-overrides.yaml + + SUBCHART_ENABLED=0 + if [ -f $SUBCHART_OVERRIDES ]; then + SUBCHART_ENABLED=$(cat $SUBCHART_OVERRIDES | grep -c "^enabled: true") + fi + + if [ $SUBCHART_ENABLED -eq 1 ]; then + if [ -z "$SUBCHART_RELEASE" ] || [ "$SUBCHART_RELEASE" = "$subchart" ]; then LOG_FILE=$LOG_DIR/"${RELEASE}-${subchart}".log :> $LOG_FILE - SUBCHART_OVERRIDES=$CACHE_SUBCHART_DIR/$subchart/subchart-overrides.yaml helm upgrade -i "${RELEASE}-${subchart}" $CACHE_SUBCHART_DIR/$subchart \ $DEPLOY_FLAGS -f $GLOBAL_OVERRIDES -f $SUBCHART_OVERRIDES \ > $LOG_FILE 2>&1 - if [[ $VERBOSE == "true" ]]; then + if [ "$VERBOSE" = "true" ]; then cat $LOG_FILE else - echo "release ${RELEASE}-${subchart} deployed" + echo "release \"${RELEASE}-${subchart}\" deployed" + fi + # Add annotation last-applied-configuration if set-last-applied flag is set + if [ "$SET_LAST_APPLIED" = "true" ]; then + helm get manifest "${RELEASE}-${subchart}" \ + | kubectl apply set-last-applied --create-annotation -n onap -f - \ + > $LOG_FILE.log 2>&1 fi fi + if [ "$DELAY" = "true" ]; then + echo sleep 3m + sleep 3m + fi else - array=($(helm ls -q | grep "${RELEASE}-${subchart}")) + array=($(echo "$ALL_HELM_RELEASES" | grep "${RELEASE}-${subchart}")) n=${#array[*]} - for (( i = n-1; i >= 0; i-- )); do - helm del "${array[i]}" --purge + for i in $(seq $(($n-1)) -1 0); do + if expr "$HELM_VER" : "v3\..*" ; then + helm del "${array[i]}" + else + helm del "${array[i]}" --purge + fi done fi done # report on success/failures of installs/upgrades - helm ls | grep FAILED | grep $RELEASE + if expr "$HELM_VER" : "v3\..*" ; then + helm ls --all-namespaces | grep -i FAILED | grep $RELEASE + else + helm ls | grep FAILED | grep $RELEASE + fi } +HELM_VER=$(helm version --template "{{.Version}}") +echo $HELM_VER case "${1:-"help"}" in "help") @@ -252,4 +291,4 @@ case "${1:-"help"}" in ;; esac -exit 0 \ No newline at end of file +exit 0