Add cleanup back
Related-PROD: PROD-34629
Change-Id: I8e9ab3c92aac77061d9e9bd718ad9ad9c7a73e4a
diff --git a/cleanup.sh b/cleanup.sh
new file mode 100644
index 0000000..0e9b0ac
--- /dev/null
+++ b/cleanup.sh
@@ -0,0 +1,334 @@
+#!/bin/bash
+export OS_INTERFACE='admin'
+mask='s_rally\|rally_\|tempest_\|tempest-\|spt-'
+exclude='manual\|-static-'
+stack_alt=false
+stack_regex='api-[0-9]+-[a-z]+'
+dry_run=false
+clean_projects=false
+make_servers_active=false
+serial=false
+batch_size=10
+# granularity values: days,hours,minutes,seconds
+stack_granularity=days
+stack_granularity_value=1
+
+function show_help {
+ printf "Resource cleaning script\nMask is: %s\n\t-h, -?\tShow this help\n" ${mask}
+ printf "\t-t\tDry run mode, no cleaning done\n"
+ printf "\t-P\tForce cleaning of projects\n"
+ printf "\t-s\tUse single thread of 'openstack' client for cleanup\n"
+ printf "\t-S\tSet servers to ACTIVE before deletion (bare metal reqiured)\n"
+ printf "\t-f\tForce stack cleanup with an additional mask of '%s'\n" ${stack_regex}
+ printf "\t-F\tForce purge deleted stacks. Batch size: %s, >%s %s\n" ${batch_size} ${stack_granularity_value} ${stack_granularity}
+}
+
+OPTIND=1 # Reset in case getopts has been used previously in the shell.
+while getopts "h?:tsSPfF" opt; do
+ case "$opt" in
+ h|\?)
+ show_help
+ exit 0
+ ;;
+ t) dry_run=true
+ printf "Running in dry-run mode\n"
+ ;;
+ s) serial=true
+ printf "Single threaded mode enabled\n"
+ ;;
+ S) make_servers_active=true
+ printf "Servers will be set to ACTIVE before deletion\n"
+ ;;
+ P) clean_projects=true
+ printf "Project cleanning enabled\n"
+ ;;
+ f) stack_alt=true
+ printf "Cleaning stacks using additional mask '%s'\n" ${stack_regex}
+ ;;
+ F) purge_deleted_stacks=true
+ printf "Purging stacks deleted >$stack_granularity_value $stack_granularity ago enabled, batch size %s\n" $stack_batch_size
+ ;;
+ esac
+done
+
+shift $((OPTIND-1))
+[ "${1:-}" = "--" ] && shift
+
+### Execute collected commands and flush the temp file
+function _clean_and_flush {
+ if [ "$dry_run" = true ] ; then
+ return 0
+ fi
+ if [ -s ${cmds} ]; then
+ if [ "${serial}" = false ] ; then
+ echo "... processing $(cat ${cmds} | wc -l) commands, worker threads ${batch_size}"
+ cat ${cmds} | tr '\n' '\0' | xargs -P ${batch_size} -n 1 -0 echo | openstack
+ #cat ${cmds} | openstack
+ truncate -s 0 ${cmds}
+ else
+ echo "... processing $(cat ${cmds} | wc -l) commands"
+ cat ${cmds} | tr '\n' '\0' | xargs -P 1 -n 1 -0 echo | openstack
+ truncate -s 0 ${cmds}
+ fi
+ fi
+}
+
+function _clean_and_flush_cinder {
+ if [ "$dry_run" = true ] ; then
+ return 0
+ fi
+ if [ -s ${cmds} ]; then
+ if [ "${serial}" = false ] ; then
+ echo "... processing $(cat ${cmds} | wc -l) commands, worker threads ${batch_size}"
+ cat ${cmds} | tr '\n' '\0' | xargs -I{} -P ${batch_size} -n 1 -0 /bin/bash -c 'cinder --os-volume-api-version 3.43 {}'
+ #cat ${cmds} | cinder --os-volume-api-version 3.43
+ truncate -s 0 ${cmds}
+ else
+ echo "... processing $(cat ${cmds} | wc -l) commands"
+ cat ${cmds} | tr '\n' '\0' | xargs -I{} -P 1 -n 1 -0 /bin/bash -c 'cinder --os-volume-api-version 3.43 {}'
+ truncate -s 0 ${cmds}
+ fi
+ fi
+}
+
+### Users
+function _clean_users {
+ users=( $(openstack user list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#users[@]} users containing '${mask}' found"
+ printf "%s\n" ${users[@]} | xargs -I{} echo user delete {} >>${cmds}
+ _clean_and_flush
+}
+
+### Roles
+function _clean_roles {
+ roles=( $(openstack role list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#roles[@]} roles containing '${mask}' found"
+ printf "%s\n" ${roles[@]} | xargs -I{} echo role delete {} >>${cmds}
+ _clean_and_flush
+}
+
+### Projects
+function _clean_projects {
+ projects=( $(openstack project list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#projects[@]} projects containing '${mask}' found"
+ printf "%s\n" ${projects[@]} | xargs -I{} echo project delete {} >>${cmds}
+ _clean_and_flush
+}
+
+### Servers
+function _clean_servers {
+ servers=( $(openstack server list -c ID -c Name -f value --all | grep "${mask}" | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#servers[@]} servers containing '${mask}' found"
+ if [ "$make_servers_active" = true ]; then
+ printf "%s\n" ${servers[@]} | xargs -I{} echo server set --state active {} >>${cmds}
+ fi
+ printf "%s\n" ${servers[@]} | xargs -I{} echo server delete {} >>${cmds}
+ _clean_and_flush
+}
+
+### Reset snapshot state and delete
+function _clean_snapshots {
+ snapshots=( $(openstack volume snapshot list --all -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#snapshots[@]} snapshots containing '${mask}' found"
+ printf "%s\n" ${snapshots[@]} | xargs -I{} echo volume snapshot set --state available {} >>${cmds}
+ printf "%s\n" ${snapshots[@]} | xargs -I{} echo volume snapshot delete {} >>${cmds}
+ _clean_and_flush
+}
+
+function _clean_volumes {
+ volumes=( $(openstack volume list --all -c ID -c Name -c Type -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#volumes[@]} volumes containing '${mask}' found"
+ printf "%s\n" ${volumes[@]} | xargs -I{} echo volume set --state available {} >>${cmds}
+ printf "%s\n" ${volumes[@]} | xargs -I{} echo volume delete {} >>${cmds}
+ _clean_and_flush
+}
+
+function _clean_volume_groups {
+ groups=( $(cinder --os-volume-api-version 3.43 group-list --all-tenants 1 | grep ${mask} | grep -v ${exclude} | awk '{print $2}') )
+ echo "-> ${#groups[@]} groups containing '${mask}' found"
+ printf "%s\n" ${groups[@]} | xargs -I{} echo group-delete {} >>${cmds}
+ _clean_and_flush_cinder
+}
+
+function _clean_volume_group_types {
+ group_types=( $(cinder --os-volume-api-version 3.43 group-type-list | grep ${mask} | grep -v ${exclude} | awk '{print $2}') )
+ echo "-> ${#group_types[@]} group types containing '${mask}' found"
+ printf "%s\n" ${group_types[@]} | xargs -I{} echo group-type-delete {} >>${cmds}
+ _clean_and_flush_cinder
+}
+
+### Volume types
+function _clean_volume_types {
+ vtypes=( $(openstack volume type list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#vtypes[@]} volume types containing '${mask}' found"
+ printf "%s\n" ${vtypes[@]} | xargs -I{} echo volume type delete {} >>${cmds}
+ _clean_and_flush
+}
+
+### Images
+function _clean_images {
+ images=( $(openstack image list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#images[@]} images containing '${mask}' found"
+ printf "%s\n" ${images[@]} | xargs -I{} echo image delete {} >>${cmds}
+ _clean_and_flush
+}
+
+### Sec groups
+function _clean_sec_groups {
+ projects=( $(openstack project list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ sgroups=( $(printf "%s\n" ${projects[@]} | xargs -I{} /bin/bash -c "openstack security group list -c ID -c Project -f value | grep {} | cut -d' ' -f1") )
+ echo "-> ${#sgroups[@]} security groups for project containing '${mask}' found"
+ printf "%s\n" ${sgroups[@]} | xargs -I{} echo security group delete {} >>${cmds}
+ _clean_and_flush
+
+ # Additional step to cleanup 'hanged' groups
+ sgroups_raw=( $(openstack security group list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#sgroups_raw[@]} security groups for '${mask}' found"
+ printf "%s\n" ${sgroups_raw[@]} | xargs -I{} echo security group delete {} >>${cmds}
+ _clean_and_flush
+}
+
+### Keypairs
+function _clean_keypairs {
+ keypairs=( $(openstack keypair list -c Name -f value | grep ${mask} | grep -v ${exclude}) )
+ echo "-> ${#keypairs[@]} keypairs containing '${mask}' found"
+ printf "%s\n" ${keypairs[@]} | xargs -I{} echo keypair delete {} >>${cmds}
+ _clean_and_flush
+}
+
+### Routers and Networks
+function _clean_routers_and_networks {
+ routers=( $(openstack router list -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d ' ' -f1) )
+ if [ ${#routers[@]} -eq 0 ]; then
+ echo "-> No routers containing '${mask}' found"
+ else
+ echo "-> ${#routers[@]} routers containing '${mask}' found"
+ echo "... unsetting gateways"
+ printf "%s\n" ${routers[@]} | xargs -I{} echo router unset --external-gateway {} >>${cmds}
+ _clean_and_flush
+
+ echo "... removing ports"
+ for router in ${routers[@]}; do
+ r_ports=( $(openstack port list --router ${router} -f value -c ID) )
+ if [ ${#r_ports[@]} -eq 0 ]; then
+ echo "... no ports to unplug for ${router}"
+ else
+ for r_port in ${r_ports[@]}; do
+ echo "... queued removal of port '${r_port}' from router '${router}'"
+ echo "router remove port ${router} ${r_port}" >>${cmds}
+ done
+ fi
+ done
+ _clean_and_flush
+
+ echo "... deleting routers"
+ printf "%s\n" ${routers[@]} | xargs -I{} echo router delete {} >>${cmds}
+ _clean_and_flush
+ fi
+
+ networks=( $(openstack network list | grep "${mask}" | grep -v ${exclude} | cut -d' ' -f2) )
+ if [ ${#networks[@]} -eq 0 ]; then
+ echo "-> No networks containing '${mask}' found"
+ else
+ ports=()
+ subnets=()
+ for((idx=0;idx<${#networks[@]};idx++)) do
+ ports+=( $(openstack port list --network ${networks[idx]} -c ID -f value) )
+ subnets+=( $(openstack subnet list --network ${networks[idx]} -c ID -f value) )
+ echo "-> $((${idx}+1)) of ${#networks[@]}, total ${#ports[@]} ports, ${#subnets[@]} subnets"
+ done
+ printf "%s\n" ${ports[@]} | xargs -I{} echo port delete {} >>${cmds}
+ printf "%s\n" ${subnets[@]} | xargs -I{} echo subnet delete {} >>${cmds}
+ echo network delete ${networks[@]} >>${cmds}
+ echo "-> ${#routers[@]} routers, ${#ports[@]} ports, ${#subnets[@]} subnets, ${#networks[@]} networks"
+ fi
+ _clean_and_flush
+}
+
+### Regions
+function _clean_regions {
+ regions=( $(openstack region list -c Region -f value | grep ${mask} | grep -v ${exclude}) )
+ echo "-> ${#regions[@]} regions containing '${mask}' found"
+ printf "%s\n" ${regions[@]} | xargs -I{} echo region delete {} >>${cmds}
+ _clean_and_flush
+}
+
+### Stacks
+function _clean_stacks {
+ # By default openstack denies use of global_index for everyone.
+ # In case you want to have handy cleanup, consider updating policy.json here:
+ # root@ctl0x:~# cat -n /etc/heat/policy.json | grep global_index
+ # 48 "stacks:global_index": "rule:deny_everybody",
+ # 73 "software_configs:global_index": "rule:deny_everybody",
+ # After this you will be able to use --all option
+
+ stacks=( $(openstack stack list --nested --hidden -c ID -c "Stack Name" -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#stacks[@]} stacks containing '${mask}' found"
+ printf "%s\n" ${stacks[@]} | xargs -I{} echo stack check {} >>${cmds}
+ printf "%s\n" ${stacks[@]} | xargs -I{} echo stack delete -y {} >>${cmds}
+ _clean_and_flush
+
+ if [ "$stack_alt" = true ]; then
+ stacks=( $(openstack stack list --nested --hidden -c ID -c "Stack Name" -f value | grep -E ${stack_regex} | cut -d' ' -f1) )
+ echo "-> ${#stacks[@]} stacks containing '${stack_regex}' found"
+ printf "%s\n" ${stacks[@]} | xargs -I{} echo stack check {} >>${cmds}
+ printf "%s\n" ${stacks[@]} | xargs -I{} echo stack delete -y {} >>${cmds}
+ _clean_and_flush
+ fi
+
+ if [ "$purge_deleted_stacks" = true ]; then
+ heat-manage purge_deleted -g ${stack_granularity} -b ${batch_size} ${stack_granularity_value} | wc -l | xargs -I{} echo "-> Purged {} stacks"
+ fi
+}
+
+### Containers
+function _clean_containers {
+ containers=( $(openstack container list --all -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#containers[@]} containers containing '${mask}' found"
+ printf "%s\n" ${containers[@]} | xargs -I{} echo container delete {} >>${cmds}
+ _clean_and_flush
+}
+
+function _clean_flavors {
+ flavors=( $(openstack flavor list --all -c ID -c Name -f value | grep ${mask} | grep -v ${exclude} | cut -d' ' -f1) )
+ echo "-> ${#flavors[@]} flavors containing '${mask}' found"
+ printf "%s\n" ${flavors[@]} | xargs -I{} echo flavor delete {} >>${cmds}
+ _clean_and_flush
+}
+
+###################
+### Main
+###################
+# temp file for commands
+cmds=$(mktemp)
+trap "rm -f ${cmds}" EXIT
+echo "Using tempfile: '${cmds}'"
+
+# Consider cleaning contrail resources carefully
+# ...and only after that - clean projects
+
+_clean_stacks
+_clean_servers
+_clean_flavors
+_clean_users
+_clean_roles
+_clean_snapshots
+_clean_volumes
+_clean_volume_groups
+_clean_volume_group_types
+_clean_volume_types
+_clean_images
+_clean_sec_groups
+_clean_keypairs
+_clean_routers_and_networks
+_clean_regions
+_clean_containers
+
+# project cleaning disabled by default
+# Coz cleaning Contrail with no projects is a hard task
+if [ "$clean_projects" = true ]; then
+ _clean_projects
+fi
+
+# remove temp file
+rm ${cmds}