#!/bin/bash REBOOT_TIME=90 NODETYPES=${@} # make sure you define variable STACKNAME in current environment if [[ -z $STACKNAME ]]; then echo "please define STACKNAME variable" exit 1 fi # prepend CICD to stack name if [[ "$STACKNAME" == "CICD"* ]]; then echo "CICD found in stackname. doing nothing" else STACKNAME="CICD"$STACKNAME fi function check_stack_exists { if openstack stack list | grep -w $STACKNAME; then echo "stack found"; else echo "stack not found"; return 1 fi } if ! check_stack_exists then exit 0 fi # return and dictionary in json format, which map server name to ansible_host_groups. There will be IndexError if the servers, which names are prefixed by STACKNAME, don't have ansible_host_groups property host_group_mapping=$(openstack server list --long -f json | python3 -c "import json,sys,re;ivt=json.load(sys.stdin);json.dump({i['Name']: re.search('ansible_host_groups\=\'\[(.+)\]\'', i['Properties']).groups()[0].replace('\"', '').split() for i in ivt if re.match('$STACKNAME',i['Name'])}, fp=sys.stdout)") # all available ansible_host_groups available_groups=$(echo $host_group_mapping | python3 -c "import json,sys;mapping=json.load(sys.stdin);output=[];[output.extend(v) for v in mapping.values()];print(output)" | tr -d "[',]") # if the first input parameter is all then rebuild all groups if [[ "$1" == "all" ]]; then NODETYPES=$available_groups fi echo "going to update group $NODETYPES" server_list=$(echo $host_group_mapping | python3 -c "import json,sys;mapping=json.load(sys.stdin);avail_groups='$available_groups'.split();print([k for k in mapping.keys() if len(set(mapping[k]).intersection(set(avail_groups))) > 0])" | tr -d "[,]'" | xargs -n1 | sort -u) rebuild_func(){ echo "rebuilding server $1" openstack server rebuild --wait $1 } # for eaech line in data for server in $server_list do rebuild_func $server & # run parallel in background done wait # wait for all servers to be rebuild # add an extra time for reboot echo "waiting for reboot" sleep $REBOOT_TIME echo "All done"