# 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