blob: 5048b6decfcf839a4d5fb7b6b859ec249923f01c [file] [log] [blame]
Oleksii Zhurba1580fc52017-11-14 15:20:44 -06001#!/bin/bash
Oleksii Zhurba1580fc52017-11-14 15:20:44 -06002export OS_INTERFACE='admin'
Oleksandr Savatieiev0a1db222019-01-29 10:31:19 +01003mask='s_rally\|rally_\|tempest_\|tempest-'
Oleksandr Savatieievc1bbead2018-10-18 14:39:25 +02004dry_run=false
5clean_projects=false
Oleksandr Savatieiev41df4eb2018-11-08 16:22:30 +01006make_servers_active=false
Oleksii Zhurba0b736c72019-04-29 17:13:47 -05007serial=false
Alex Savatieiev788193b2019-03-12 11:39:08 -05008batch_size=10
Oleksandr Savatieiev722396b2019-01-29 12:53:21 +01009# granularity values: days,hours,minutes,seconds
10stack_granularity=days
11stack_granularity_value=1
12
Oleksandr Savatieievc1bbead2018-10-18 14:39:25 +020013function show_help {
Oleksandr Savatieiev722396b2019-01-29 12:53:21 +010014 printf "Resource cleaning script\nMask is: %s\n\t-h, -?\tShow this help\n" ${mask}
15 printf "\t-t\tDry run mode, no cleaning done\n"
16 printf "\t-P\tForce cleaning of projects\n"
Alex Savatieiev788193b2019-03-12 11:39:08 -050017 printf "\t-s\tUse single thread of 'openstack' client for cleanup\n"
Oleksandr Savatieiev722396b2019-01-29 12:53:21 +010018 printf "\t-S\tSet servers to ACTIVE before deletion (bare metal reqiured)\n"
Alex Savatieiev788193b2019-03-12 11:39:08 -050019 printf "\t-F\tForce purge deleted stacks. Batch size: %s, >%s %s\n" ${batch_size} ${stack_granularity_value} ${stack_granularity}
Oleksandr Savatieievc1bbead2018-10-18 14:39:25 +020020}
21
22OPTIND=1 # Reset in case getopts has been used previously in the shell.
Alex Savatieiev788193b2019-03-12 11:39:08 -050023while getopts "h?:tsSPF" opt; do
Oleksandr Savatieievc1bbead2018-10-18 14:39:25 +020024 case "$opt" in
25 h|\?)
26 show_help
27 exit 0
28 ;;
29 t) dry_run=true
30 printf "Running in dry-run mode\n"
31 ;;
Alex Savatieiev788193b2019-03-12 11:39:08 -050032 s) serial=true
33 printf "Single threaded mode enabled\n"
34 ;;
Oleksandr Savatieiev41df4eb2018-11-08 16:22:30 +010035 S) make_servers_active=true
36 printf "Servers will be set to ACTIVE before deletion\n"
37 ;;
Oleksandr Savatieievc1bbead2018-10-18 14:39:25 +020038 P) clean_projects=true
39 printf "Project cleanning enabled\n"
40 ;;
Oleksandr Savatieiev722396b2019-01-29 12:53:21 +010041 F) purge_deleted_stacks=true
42 printf "Purging stacks deleted >$stack_granularity_value $stack_granularity ago enabled, batch size %s\n" $stack_batch_size
43 ;;
Oleksandr Savatieievc1bbead2018-10-18 14:39:25 +020044 esac
45done
46
47shift $((OPTIND-1))
48[ "${1:-}" = "--" ] && shift
Oleksii Zhurba0aa46702018-02-07 16:17:39 -060049
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +020050### Execute collected commands and flush the temp file
51function _clean_and_flush {
Oleksandr Savatieievc1bbead2018-10-18 14:39:25 +020052 if [ "$dry_run" = true ] ; then
53 return 0
54 fi
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +020055 if [ -s ${cmds} ]; then
Oleksii Zhurba0b736c72019-04-29 17:13:47 -050056 if [ "${serial}" = false ] ; then
Alex Savatieiev788193b2019-03-12 11:39:08 -050057 echo "... processing $(cat ${cmds} | wc -l) commands, worker threads ${batch_size}"
Oleksii Zhurba0b736c72019-04-29 17:13:47 -050058 cat ${cmds} | tr '\n' '\0' | xargs -P 1 -n 1 -0 openstack
Alex Savatieiev788193b2019-03-12 11:39:08 -050059 #cat ${cmds} | openstack
60 truncate -s 0 ${cmds}
61 else
62 echo "... processing $(cat ${cmds} | wc -l) commands"
Oleksii Zhurba0b736c72019-04-29 17:13:47 -050063 cat ${cmds} | tr '\n' '\0' | xargs -P ${batch_size} -n 1 -0 openstack
64 truncate -s 0 ${cmds}
65 fi
66 fi
67}
68
69function _clean_and_flush_cinder {
70 if [ "$dry_run" = true ] ; then
71 return 0
72 fi
73 if [ -s ${cmds} ]; then
74 if [ "${serial}" = false ] ; then
75 echo "... processing $(cat ${cmds} | wc -l) commands, worker threads ${batch_size}"
76 cat ${cmds} | tr '\n' '\0' | xargs -I{} -P ${batch_size} -n 1 -0 /bin/bash -c 'cinder --os-volume-api-version 3.43 {}'
77 #cat ${cmds} | cinder --os-volume-api-version 3.43
78 truncate -s 0 ${cmds}
79 else
80 echo "... processing $(cat ${cmds} | wc -l) commands"
81 cat ${cmds} | tr '\n' '\0' | xargs -I{} -P 1 -n 1 -0 /bin/bash -c 'cinder --os-volume-api-version 3.43 {}'
Alex Savatieiev788193b2019-03-12 11:39:08 -050082 truncate -s 0 ${cmds}
83 fi
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +020084 fi
85}
Oleksii Zhurba0aa46702018-02-07 16:17:39 -060086
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +020087### Users
88function _clean_users {
89 users=( $(openstack user list -c ID -c Name -f value | grep ${mask} | cut -d' ' -f1) )
90 echo "-> ${#users[@]} users containing '${mask}' found"
91 printf "%s\n" ${users[@]} | xargs -I{} echo user delete {} >>${cmds}
92 _clean_and_flush
93}
Oleksii Zhurba0aa46702018-02-07 16:17:39 -060094
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +020095### Roles
96function _clean_roles {
97 roles=( $(openstack role list -c ID -c Name -f value | grep ${mask} | cut -d' ' -f1) )
98 echo "-> ${#roles[@]} roles containing '${mask}' found"
99 printf "%s\n" ${roles[@]} | xargs -I{} echo role delete {} >>${cmds}
100 _clean_and_flush
101}
Oleksii Zhurba0aa46702018-02-07 16:17:39 -0600102
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200103### Projects
104function _clean_projects {
105 projects=( $(openstack project list -c ID -c Name -f value | grep ${mask} | cut -d' ' -f1) )
106 echo "-> ${#projects[@]} projects containing '${mask}' found"
107 printf "%s\n" ${projects[@]} | xargs -I{} echo project delete {} >>${cmds}
108 _clean_and_flush
109}
Valentyn Khalinbdf3ba92018-07-13 18:14:20 +0300110
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200111### Servers
112function _clean_servers {
Oleksandr Savatieiev0a1db222019-01-29 10:31:19 +0100113 servers=( $(openstack server list -c ID -c Name -f value --all | grep "${mask}" | cut -d' ' -f1) )
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200114 echo "-> ${#servers[@]} servers containing '${mask}' found"
Oleksandr Savatieiev41df4eb2018-11-08 16:22:30 +0100115 if [ "$make_servers_active" = true ]; then
116 printf "%s\n" ${servers[@]} | xargs -I{} echo server set --state active {} >>${cmds}
117 fi
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200118 printf "%s\n" ${servers[@]} | xargs -I{} echo server delete {} >>${cmds}
119 _clean_and_flush
120}
Oleksii Zhurba0aa46702018-02-07 16:17:39 -0600121
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200122### Reset snapshot state and delete
123function _clean_snapshots {
124 snapshots=( $(openstack volume snapshot list --all -c ID -c Name -f value | grep ${mask} | cut -d' ' -f1) )
125 echo "-> ${#snapshots[@]} snapshots containing '${mask}' found"
Oleksandr Savatieievc1bbead2018-10-18 14:39:25 +0200126 printf "%s\n" ${snapshots[@]} | xargs -I{} echo volume snapshot set --state available {} >>${cmds}
127 printf "%s\n" ${snapshots[@]} | xargs -I{} echo volume snapshot delete {} >>${cmds}
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200128 _clean_and_flush
129}
Oleksii Zhurba0aa46702018-02-07 16:17:39 -0600130
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200131function _clean_volumes {
132 volumes=( $(openstack volume list --all -c ID -c Name -c Type -f value | grep ${mask} | cut -d' ' -f1) )
133 echo "-> ${#volumes[@]} volumes containing '${mask}' found"
134 printf "%s\n" ${volumes[@]} | xargs -I{} echo volume set --state available {} >>${cmds}
135 printf "%s\n" ${volumes[@]} | xargs -I{} echo volume delete {} >>${cmds}
136 _clean_and_flush
137}
Oleksii Zhurba0aa46702018-02-07 16:17:39 -0600138
Oleksii Zhurba0b736c72019-04-29 17:13:47 -0500139function _clean_volume_groups {
140 groups=( $(cinder --os-volume-api-version 3.43 group-list --all-tenants 1 | grep ${mask} | awk '{print $2}') )
141 echo "-> ${#groups[@]} groups containing '${mask}' found"
142 printf "%s\n" ${groups[@]} | xargs -I{} echo group-delete {} >>${cmds}
143 _clean_and_flush_cinder
144}
145
146function _clean_volume_group_types {
147 group_types=( $(cinder --os-volume-api-version 3.43 group-type-list | grep ${mask} | awk '{print $2}') )
148 echo "-> ${#group_types[@]} group types containing '${mask}' found"
149 printf "%s\n" ${group_types[@]} | xargs -I{} echo group-type-delete {} >>${cmds}
150 _clean_and_flush_cinder
151}
152
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200153### Volume types
154function _clean_volume_types {
155 vtypes=( $(openstack volume type list -c ID -c Name -f value | grep ${mask} | cut -d' ' -f1) )
156 echo "-> ${#vtypes[@]} volume types containing '${mask}' found"
157 printf "%s\n" ${vtypes[@]} | xargs -I{} echo volume type delete {} >>${cmds}
158 _clean_and_flush
159}
Oleksii Zhurba0aa46702018-02-07 16:17:39 -0600160
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200161### Images
162function _clean_images {
Oleksandr Savatieievc1bbead2018-10-18 14:39:25 +0200163 images=( $(openstack image list -c ID -c Name -f value | grep ${mask} | cut -d' ' -f1) )
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200164 echo "-> ${#images[@]} images containing '${mask}' found"
165 printf "%s\n" ${images[@]} | xargs -I{} echo image delete {} >>${cmds}
166 _clean_and_flush
167}
Oleksii Zhurba0aa46702018-02-07 16:17:39 -0600168
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200169### Sec groups
170function _clean_sec_groups {
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200171 projects=( $(openstack project list -c ID -c Name -f value | grep ${mask} | cut -d' ' -f1) )
172 sgroups=( $(printf "%s\n" ${projects[@]} | xargs -I{} /bin/bash -c "openstack security group list -c ID -c Project -f value | grep {} | cut -d' ' -f1") )
173 echo "-> ${#sgroups[@]} security groups for project containing '${mask}' found"
174 printf "%s\n" ${sgroups[@]} | xargs -I{} echo security group delete {} >>${cmds}
175 _clean_and_flush
Alex Savatieiev788193b2019-03-12 11:39:08 -0500176
177 # Additional step to cleanup 'hanged' groups
178 sgroups_raw=( $(openstack security group list -c ID -c Name -f value | grep ${mask} | cut -d' ' -f1) )
179 echo "-> ${#sgroups_raw[@]} security groups for '${mask}' found"
180 printf "%s\n" ${sgroups_raw[@]} | xargs -I{} echo security group delete {} >>${cmds}
181 _clean_and_flush
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200182}
Oleksii Zhurba0aa46702018-02-07 16:17:39 -0600183
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200184### Keypairs
185function _clean_keypairs {
186 keypairs=( $(openstack keypair list -c Name -f value | grep ${mask}) )
187 echo "-> ${#keypairs[@]} keypairs containing '${mask}' found"
188 printf "%s\n" ${keypairs[@]} | xargs -I{} echo keypair delete {} >>${cmds}
189 _clean_and_flush
190}
Oleksii Zhurba0aa46702018-02-07 16:17:39 -0600191
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200192### Routers and Networks
193function _clean_routers_and_networks {
194 routers=( $(openstack router list -c ID -c Name -f value | grep ${mask} | cut -d ' ' -f1) )
195 if [ ${#routers[@]} -eq 0 ]; then
196 echo "-> No routers containing '${mask}' found"
197 else
198 echo "-> ${#routers[@]} routers containing '${mask}' found"
Alex Savatieiev788193b2019-03-12 11:39:08 -0500199 echo "... unsetting gateways"
200 printf "%s\n" ${routers[@]} | xargs -I{} echo router unset --external-gateway {} >>${cmds}
201 _clean_and_flush
202
203 echo "... removing ports"
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200204 for router in ${routers[@]}; do
205 r_ports=( $(openstack port list --router ${router} -f value -c ID) )
206 if [ ${#r_ports[@]} -eq 0 ]; then
Alex Savatieiev788193b2019-03-12 11:39:08 -0500207 echo "... no ports to unplug for ${router}"
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200208 else
209 for r_port in ${r_ports[@]}; do
Alex Savatieiev788193b2019-03-12 11:39:08 -0500210 echo "... queued removal of port '${r_port}' from router '${router}'"
211 echo "router remove port ${router} ${r_port}" >>${cmds}
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200212 done
213 fi
214 done
Alex Savatieiev788193b2019-03-12 11:39:08 -0500215 _clean_and_flush
216
217 echo "... deleting routers"
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200218 printf "%s\n" ${routers[@]} | xargs -I{} echo router delete {} >>${cmds}
Alex Savatieiev788193b2019-03-12 11:39:08 -0500219 _clean_and_flush
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200220 fi
Oleksii Zhurba0aa46702018-02-07 16:17:39 -0600221
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200222 networks=( $(openstack network list | grep "${mask}" | cut -d' ' -f2) )
223 if [ ${#networks[@]} -eq 0 ]; then
224 echo "-> No networks containing '${mask}' found"
225 else
226 ports=()
227 subnets=()
228 for((idx=0;idx<${#networks[@]};idx++)) do
229 ports+=( $(openstack port list --network ${networks[idx]} -c ID -f value) )
230 subnets+=( $(openstack subnet list --network ${networks[idx]} -c ID -f value) )
231 echo "-> $((${idx}+1)) of ${#networks[@]}, total ${#ports[@]} ports, ${#subnets[@]} subnets"
232 done
233 printf "%s\n" ${ports[@]} | xargs -I{} echo port delete {} >>${cmds}
234 printf "%s\n" ${subnets[@]} | xargs -I{} echo subnet delete {} >>${cmds}
235 echo network delete ${networks[@]} >>${cmds}
236 echo "-> ${#routers[@]} routers, ${#ports[@]} ports, ${#subnets[@]} subnets, ${#networks[@]} networks"
237 fi
238 _clean_and_flush
239}
Oleksii Zhurba0aa46702018-02-07 16:17:39 -0600240
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200241### Regions
242function _clean_regions {
243 regions=( $(openstack region list -c Region -f value | grep ${mask}) )
244 echo "-> ${#regions[@]} regions containing '${mask}' found"
245 printf "%s\n" ${regions[@]} | xargs -I{} echo region delete {} >>${cmds}
246 _clean_and_flush
247}
Oleksii Zhurba0aa46702018-02-07 16:17:39 -0600248
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200249### Stacks
250function _clean_stacks {
251 # By default openstack denies use of global_index for everyone.
252 # In case you want to have handy cleanup, consider updating policy.json here:
253 # root@ctl0x:~# cat -n /etc/heat/policy.json | grep global_index
254 # 48 "stacks:global_index": "rule:deny_everybody",
255 # 73 "software_configs:global_index": "rule:deny_everybody",
256 # After this you will be able to use --all option
Oleksii Zhurba0aa46702018-02-07 16:17:39 -0600257
Oleksandr Savatieiev722396b2019-01-29 12:53:21 +0100258 stacks=( $(openstack stack list --nested --hidden -c ID -c "Stack Name" -f value | grep ${mask} | cut -d' ' -f1) )
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200259 echo "-> ${#stacks[@]} stacks containing '${mask}' found"
260 printf "%s\n" ${stacks[@]} | xargs -I{} echo stack check {} >>${cmds}
261 printf "%s\n" ${stacks[@]} | xargs -I{} echo stack delete -y {} >>${cmds}
262 _clean_and_flush
Oleksandr Savatieiev722396b2019-01-29 12:53:21 +0100263 if [ "$purge_deleted_stacks" = true ]; then
Alex Savatieiev788193b2019-03-12 11:39:08 -0500264 heat-manage purge_deleted -g ${stack_granularity} -b ${batch_size} ${stack_granularity_value} | wc -l | xargs -I{} echo "-> Purged {} stacks"
Oleksandr Savatieiev722396b2019-01-29 12:53:21 +0100265 fi
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200266}
Oleksii Zhurba0aa46702018-02-07 16:17:39 -0600267
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200268### Containers
269function _clean_containers {
270 containers=( $(openstack container list --all -c ID -c Name -f value | grep ${mask}) )
271 echo "-> ${#containers[@]} containers containing '${mask}' found"
272 printf "%s\n" ${containers[@]} | xargs -I{} echo container delete {} >>${cmds}
273 _clean_and_flush
274}
Oleksii Zhurba0aa46702018-02-07 16:17:39 -0600275
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200276###################
277### Main
278###################
279# temp file for commands
280cmds=$(mktemp)
Oleksandr Savatieievc1bbead2018-10-18 14:39:25 +0200281trap "rm -f ${cmds}" EXIT
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200282echo "Using tempfile: '${cmds}'"
Oleksii Zhurba0aa46702018-02-07 16:17:39 -0600283
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200284# Consider cleaning contrail resources carefully
285# ...and only after that - clean projects
Oleksii Zhurba0aa46702018-02-07 16:17:39 -0600286
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200287_clean_stacks
288_clean_servers
289
290_clean_users
291_clean_roles
292_clean_snapshots
293_clean_volumes
Oleksii Zhurba0b736c72019-04-29 17:13:47 -0500294_clean_volume_groups
295_clean_volume_group_types
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200296_clean_volume_types
297_clean_images
298_clean_sec_groups
299_clean_keypairs
300_clean_routers_and_networks
301_clean_regions
302_clean_containers
303
304# project cleaning disabled by default
305# Coz cleaning Contrail with no projects is a hard task
Oleksandr Savatieievc1bbead2018-10-18 14:39:25 +0200306if [ "$clean_projects" = true ]; then
307 _clean_projects
308fi
Oleksandr Savatieiev91355c82018-09-07 12:14:34 +0200309
310# remove temp file
311rm ${cmds}