blob: 403e5491a511d8c4f6dc55dec24a34b72fa031a1 [file] [log] [blame]
Dmitriy Kruglovb811e642022-10-06 12:24:33 +02001import argparse
Ievgeniia Zadorozhnaa33b29a2023-08-29 18:19:47 +03002import json
Dmitriy Kruglovb811e642022-10-06 12:24:33 +02003import os
4import re
5import sys
Ievgeniia Zadorozhnaa33b29a2023-08-29 18:19:47 +03006import time
7
8from types import SimpleNamespace
Dmitriy Kruglovb811e642022-10-06 12:24:33 +02009
10import openstack
11
12
13# Send logs to both, a log file and stdout
14openstack.enable_logging(debug=False, path='openstack.log', stream=sys.stdout)
15
Ievgeniia Zadorozhnaa33b29a2023-08-29 18:19:47 +030016volume_api_version = "3.43"
Ievgeniia Zadorozhnac7713ae2024-12-23 20:55:55 +010017manila_api_version = "2.75"
Ievgeniia Zadorozhnaa33b29a2023-08-29 18:19:47 +030018
Dmitriy Kruglovb811e642022-10-06 12:24:33 +020019# Connect to cloud
20TEST_CLOUD = os.getenv('OS_TEST_CLOUD', 'os-cloud')
21cloud = openstack.connect(cloud=TEST_CLOUD)
22log = cloud.log
23
24# Get cloud config (clouds.yaml vars)
25config_obj = openstack.config.loader.OpenStackConfig()
26cloud_config = config_obj.get_one(cloud=TEST_CLOUD)
27
28compute = cloud.compute
29identity = cloud.identity
30image = cloud.image
31network = cloud.network
32orchestration = cloud.orchestration
Dmitriy Kruglovb811e642022-10-06 12:24:33 +020033volume = cloud.volume
Ievgeniia Zadorozhnaab334132023-08-01 23:20:13 +030034load_balancer = cloud.load_balancer
Dmitriy Kruglovb811e642022-10-06 12:24:33 +020035
Ievgeniia Zadorozhnab02617b2024-01-22 23:59:05 +010036# Check if Object Storage is present on the cloud, else skip
37object_store_present = any(service.type == 'object-store' for service
38 in list(identity.services()))
39if object_store_present:
40 object_store = cloud.object_store
41
Ievgeniia Zadorozhnac7713ae2024-12-23 20:55:55 +010042# Check if Manila Shared File System is present on the cloud, else skip
43manila_present = any(service.type == 'sharev2' for service
44 in list(identity.services()))
45if manila_present:
46 shared_file_system = cloud.shared_file_system
47
Dmitriy Kruglovb811e642022-10-06 12:24:33 +020048mask = "cvp|s_rally|rally_|tempest-|tempest_|spt|fio"
49full_mask = f"^(?!.*(manual|-static-)).*({mask}).*$"
50mask_pattern = re.compile(full_mask, re.IGNORECASE)
51stack_mask = "api-[0-9]+-[a-z]+"
52stack_pattern = re.compile(stack_mask, re.IGNORECASE)
53
54
55def get_resource_value(resource_key, default):
56 try:
57 return cloud_config.config['custom_vars'][resource_key]
58 except KeyError:
59 return default
60
61
Ievgeniia Zadorozhnaa33b29a2023-08-29 18:19:47 +030062def items_to_object(items):
63 data = json.dumps(items)
64 return json.loads(data, object_hook=lambda d: SimpleNamespace(**d))
65
66
Dmitriy Kruglovb811e642022-10-06 12:24:33 +020067def _filter_test_resources(resources, attribute, pattern=mask_pattern):
68 filtered_resources = {}
69 for item in resources:
70 # If there is no attribute in object, use just empty string as value
71 value = getattr(item, attribute, '')
72 # If the attribute value is None, use empty string instead, to be
73 # able to run regex search
74 if value is None:
75 value = ''
76 found = pattern.match(value)
77 if found:
78 filtered_resources[item.id] = getattr(item, attribute)
79 return filtered_resources
80
81
82def _log_resources_count(count, resource, pattern=mask):
83 log.info(f"{count} {resource} containing '{pattern}' are found.")
84
85
86def _log_resource_delete(id_, name, type_):
87 log.info(f"... deleting {name} (id={id_}) {type_}")
88
89
Ievgeniia Zadorozhnaa33b29a2023-08-29 18:19:47 +030090def _get_volume_groups(all_tenants='true'):
91 ep = volume.get_endpoint()
92 uri = f"{ep}/groups/detail"
Ievgeniia Zadorozhnaab334132023-08-01 23:20:13 +030093 headers = {'X-Auth-Token': cloud.session.get_token(),
Ievgeniia Zadorozhnaa33b29a2023-08-29 18:19:47 +030094 'Accept': 'application/json',
95 'OpenStack-API-Version': f'volume {volume_api_version}'}
96 params = {'all_tenants': all_tenants}
97 response = cloud.session.request(url=uri, method='GET',
98 headers=headers, params=params).json()
99 for group in response['groups']:
100 yield group
101
102
Ievgeniia Zadorozhnac7713ae2024-12-23 20:55:55 +0100103def _get_shares(all_tenants='true'):
104 ep = shared_file_system.get_endpoint()
105 uri = f"{ep}/shares/detail"
106 headers = {'X-Auth-Token': cloud.session.get_token(),
107 'Accept': 'application/json',
108 'X-Openstack-Manila-Api-Version': f'{manila_api_version}'}
109 params = {'all_tenants': all_tenants}
110 response = cloud.session.request(url=uri, method='GET',
111 headers=headers, params=params).json()
112 for share in response['shares']:
113 yield share
114
115
116def _get_share_types(all_tenants='true'):
117 ep = shared_file_system.get_endpoint()
118 uri = f"{ep}/types"
119 headers = {'X-Auth-Token': cloud.session.get_token(),
120 'Accept': 'application/json',
121 'X-Openstack-Manila-Api-Version': f'{manila_api_version}'}
122 params = {'all_tenants': all_tenants}
123 response = cloud.session.request(url=uri, method='GET',
124 headers=headers, params=params).json()
125 for share_type in response['volume_types']:
126 yield share_type
127
128
129def _get_share_networks(all_tenants='true'):
130 ep = shared_file_system.get_endpoint()
131 uri = f"{ep}/share-networks/detail"
132 headers = {'X-Auth-Token': cloud.session.get_token(),
133 'Accept': 'application/json',
134 'X-Openstack-Manila-Api-Version': f'{manila_api_version}'}
135 params = {'all_tenants': all_tenants}
136 response = cloud.session.request(url=uri, method='GET',
137 headers=headers, params=params).json()
138 for share_network in response['share_networks']:
139 yield share_network
140
141
Ievgeniia Zadorozhnaa33b29a2023-08-29 18:19:47 +0300142def _delete_volume_group(uuid, delete_volumes='false'):
143 ep = volume.get_endpoint()
144 uri = f"{ep}/groups/{uuid}/action"
145 headers = {'X-Auth-Token': cloud.session.get_token(),
146 'OpenStack-API-Version': f'volume {volume_api_version}',
147 'Content-Type': 'application/json',
148 'Accept': 'application/json'}
149 body = {"delete": {"delete-volumes": delete_volumes}}
150 cloud.session.request(
151 url=uri, method='POST', headers=headers, json=body)
152
153
Ievgeniia Zadorozhnac7713ae2024-12-23 20:55:55 +0100154def _delete_share_type(uuid):
155 ep = shared_file_system.get_endpoint()
156 uri = f"{ep}/types/{uuid}"
157 headers = {'X-Auth-Token': cloud.session.get_token(),
158 'X-Openstack-Manila-Api-Version': f'{manila_api_version}',
159 'Content-Type': 'application/json',
160 'Accept': 'application/json'}
161 cloud.session.request(
162 url=uri, method='DELETE', headers=headers)
163
164
165def _delete_share(uuid, force_delete=True):
166 ep = shared_file_system.get_endpoint()
167 uri = f"{ep}/shares/{uuid}/action"
168 headers = {'X-Auth-Token': cloud.session.get_token(),
169 'X-Openstack-Manila-Api-Version': f'{manila_api_version}',
170 'Content-Type': 'application/json',
171 'Accept': 'application/json'}
172 body = {"force_delete": force_delete}
173 cloud.session.request(
174 url=uri, method='POST', headers=headers, json=body)
175
176
177def _delete_share_network(uuid):
178 ep = shared_file_system.get_endpoint()
179 uri = f"{ep}/share-networks/{uuid}"
180 headers = {'X-Auth-Token': cloud.session.get_token(),
181 'X-Openstack-Manila-Api-Version': f'{manila_api_version}',
182 'Content-Type': 'application/json',
183 'Accept': 'application/json'}
184 cloud.session.request(
185 url=uri, method='DELETE', headers=headers)
186
187
Ievgeniia Zadorozhnaa33b29a2023-08-29 18:19:47 +0300188def _reset_volume_status(uuid, status='available', attach_status='detached',
189 migration_status='None'):
190 ep = volume.get_endpoint()
191 uri = f"{ep}/volumes/{uuid}/action"
192 headers = {'X-Auth-Token': cloud.session.get_token(),
193 'Content-Type': 'application/json',
194 'Accept': 'application/json'}
195 body = {"os-reset_status": {
196 "status": status, "attach_status": attach_status,
197 "migration_status": migration_status}}
198 cloud.session.request(
199 url=uri, method='POST', headers=headers, json=body)
Ievgeniia Zadorozhnaab334132023-08-01 23:20:13 +0300200
201
Dmitriy Kruglovb811e642022-10-06 12:24:33 +0200202def cleanup_users():
203 users = identity.users()
204 users_to_delete = _filter_test_resources(users, 'name')
205 _log_resources_count(len(users_to_delete), 'user(s)')
206 if args.dry_run:
207 return
208 for id_ in users_to_delete:
209 _log_resource_delete(id_, users_to_delete[id_], 'user')
210 identity.delete_user(id_)
211
212
213def cleanup_roles():
214 roles = identity.roles()
215 roles_to_delete = _filter_test_resources(roles, 'name')
216 _log_resources_count(len(roles_to_delete), 'role(s)')
217 if args.dry_run:
218 return
219 for id_ in roles_to_delete:
220 _log_resource_delete(id_, roles_to_delete[id_], 'role')
221 identity.delete_role(id_)
222
223
224def cleanup_projects():
225 projects = identity.projects()
226 projects_to_delete = _filter_test_resources(projects, 'name')
227 _log_resources_count(len(projects_to_delete), 'project(s)')
228 if args.dry_run:
229 return
230 for id_ in projects_to_delete:
231 _log_resource_delete(id_, projects_to_delete[id_], 'project')
232 identity.delete_project(id_)
233
234
235def cleanup_regions():
236 regions = identity.regions()
237 regions_to_delete = _filter_test_resources(regions, 'id')
238 _log_resources_count(len(regions_to_delete), 'region(s)')
239 if args.dry_run:
240 return
241 for id_ in regions_to_delete:
242 _log_resource_delete(id_, id_, 'region')
243 identity.delete_region(id_)
244
245
246def cleanup_services():
247 services = identity.services()
248 services_to_delete = _filter_test_resources(services, 'name')
249 _log_resources_count(len(services_to_delete), 'service(s)')
250 if args.dry_run:
251 return
252 for id_ in services_to_delete:
253 _log_resource_delete(id_, services_to_delete[id_], 'service')
254 identity.delete_service(id_)
255
256
257def cleanup_stacks(stacks_alt=False):
258 stacks = orchestration.stacks()
259 stacks_to_delete = _filter_test_resources(stacks, 'name')
260 _log_resources_count(len(stacks_to_delete), 'stack(s)')
261
262 # Use additional pattern for searching/deleting test Heat resources,
263 # if enabled
264 if stacks_alt:
265 stacks_alt_to_delete = _filter_test_resources(
266 stacks, 'name', stack_pattern)
267 _log_resources_count(len(stacks_alt_to_delete), 'stack(s)', stack_mask)
268 stacks_to_delete.update(stacks_alt_to_delete)
269
270 if args.dry_run:
271 return
272
273 for id_ in stacks_to_delete:
274 _log_resource_delete(id_, stacks_to_delete[id_], 'stack')
Ievgeniia Zadorozhna85020982023-08-03 22:04:12 +0300275 stack_obj = orchestration.get_stack(id_)
Dmitriy Kruglovb811e642022-10-06 12:24:33 +0200276 orchestration.delete_stack(id_)
Ievgeniia Zadorozhna85020982023-08-03 22:04:12 +0300277 orchestration.wait_for_delete(stack_obj)
Dmitriy Kruglovb811e642022-10-06 12:24:33 +0200278
279
280def cleanup_flavors():
281 flavors = compute.flavors()
282 flavors_to_delete = _filter_test_resources(flavors, 'name')
283 _log_resources_count(len(flavors_to_delete), 'flavor(s)')
284 if args.dry_run:
285 return
286 for id_ in flavors_to_delete:
287 _log_resource_delete(id_, flavors_to_delete[id_], 'flavor')
288 compute.delete_flavor(id_)
289
290
291def cleanup_images():
292 images = image.images()
293 images_to_delete = _filter_test_resources(images, 'name')
294 _log_resources_count(len(images_to_delete), 'image(s)')
295 if args.dry_run:
296 return
297 for id_ in images_to_delete:
298 _log_resource_delete(id_, images_to_delete[id_], 'image')
299 image.delete_image(id_)
300
301
302def cleanup_keypairs():
303 keypairs = compute.keypairs()
304 keypairs_to_delete = _filter_test_resources(keypairs, 'name')
305 _log_resources_count(len(keypairs_to_delete), 'keypair(s)')
306 if args.dry_run:
307 return
308 for id_ in keypairs_to_delete:
309 _log_resource_delete(id_, keypairs_to_delete[id_], 'keypair')
310 compute.delete_keypair(id_)
311
312
313def cleanup_servers():
314 servers = compute.servers(all_projects=True)
315 servers_to_delete = _filter_test_resources(servers, 'name')
316 _log_resources_count(len(servers_to_delete), 'server(s)')
317 if args.dry_run:
318 return
319 for id_ in servers_to_delete:
320 if args.servers_active:
321 log.info(
322 f"... resetting {servers_to_delete[id_]} (id={id_}) server "
323 "state to 'active'")
324 compute.reset_server_state(id_, 'active')
325 _log_resource_delete(id_, servers_to_delete[id_], 'server')
326 compute.delete_server(id_)
327 srv_obj = compute.get_server(id_)
328 compute.wait_for_delete(srv_obj)
329
330
Ievgeniia Zadorozhnac7713ae2024-12-23 20:55:55 +0100331def cleanup_shares():
332 shares_in_response = _get_shares()
333 shares = items_to_object([g for g in shares_in_response])
334 shares_to_delete = _filter_test_resources(shares, 'name')
335 _log_resources_count(len(shares_to_delete), 'share(s)')
336 if args.dry_run:
337 return
338 for id_ in shares_to_delete:
339 _log_resource_delete(id_, shares_to_delete[id_], 'share')
340 # TODO: uncomment
341 _delete_share(id_)
342 shr_obj = shared_file_system.get_share(id_)
343 shared_file_system.wait_for_delete(shr_obj)
344
345
346def cleanup_share_types():
347 share_types_in_response = _get_share_types()
348 share_types = items_to_object([g for g in share_types_in_response])
349 share_types_to_delete = _filter_test_resources(share_types, 'name')
350 _log_resources_count(len(share_types_to_delete), 'share type(s)')
351 if args.dry_run:
352 return
353 for id_ in share_types_to_delete:
354 _log_resource_delete(id_, share_types_to_delete[id_], 'type')
355 _delete_share_type(id_)
356
357
358def cleanup_share_networks():
359 share_networks_in_response = _get_share_networks()
360 share_networks = items_to_object([g for g in share_networks_in_response])
361 share_networks_to_delete = _filter_test_resources(share_networks, 'name')
362 _log_resources_count(len(share_networks_to_delete), 'share network(s)')
363 if args.dry_run:
364 return
365 for id_ in share_networks_to_delete:
366 _log_resource_delete(id_, share_networks_to_delete[id_], 'type')
367 _delete_share_network(id_)
368
369
Dmitriy Kruglovb811e642022-10-06 12:24:33 +0200370def cleanup_snapshots():
371 snapshots = volume.snapshots(all_projects=True)
372 snapshots_to_delete = _filter_test_resources(snapshots, 'name')
373 _log_resources_count(len(snapshots_to_delete), 'snapshot(s)')
374 if args.dry_run:
375 return
376 for id_ in snapshots_to_delete:
Ievgeniia Zadorozhna85020982023-08-03 22:04:12 +0300377 snapshot_obj = volume.get_snapshot(id_)
Dmitriy Kruglovb811e642022-10-06 12:24:33 +0200378 volume.reset_snapshot(id_, 'available')
379 _log_resource_delete(id_, snapshots_to_delete[id_], 'snapshot')
Ievgeniia Zadorozhna85020982023-08-03 22:04:12 +0300380 volume.delete_snapshot(id_, force=True)
381 volume.wait_for_delete(snapshot_obj)
Dmitriy Kruglovb811e642022-10-06 12:24:33 +0200382
383
384def cleanup_volumes():
385 volumes = volume.volumes(all_projects=True)
386 volumes_to_delete = _filter_test_resources(volumes, 'name')
387 _log_resources_count(len(volumes_to_delete), 'volume(s)')
388 if args.dry_run:
389 return
390 for id_ in volumes_to_delete:
Ievgeniia Zadorozhnaa33b29a2023-08-29 18:19:47 +0300391 _reset_volume_status(id_, 'available', 'detached', 'None')
Dmitriy Kruglovb811e642022-10-06 12:24:33 +0200392 _log_resource_delete(id_, volumes_to_delete[id_], 'volume')
393 volume.delete_volume(id_)
394 vol_obj = volume.get_volume(id_)
395 volume.wait_for_delete(vol_obj)
396
397
398def cleanup_volume_groups():
Ievgeniia Zadorozhnaa33b29a2023-08-29 18:19:47 +0300399 groups_in_response = _get_volume_groups()
400 groups = items_to_object([g for g in groups_in_response])
Dmitriy Kruglovb811e642022-10-06 12:24:33 +0200401 groups_to_delete = _filter_test_resources(groups, 'name')
402 _log_resources_count(len(groups_to_delete), 'volume group(s)')
403 if args.dry_run:
404 return
405 for id_ in groups_to_delete:
406 _log_resource_delete(id_, groups_to_delete[id_], 'volume group')
Ievgeniia Zadorozhnaa33b29a2023-08-29 18:19:47 +0300407 _delete_volume_group(id_)
408 time.sleep(10) # TODO(izadorozhna): need to add a proper waiter
Dmitriy Kruglovb811e642022-10-06 12:24:33 +0200409
410
Ievgeniia Zadorozhna85020982023-08-03 22:04:12 +0300411def cleanup_volume_backups():
412 backups = volume.backups(all_tenants=True)
413 backups_to_delete = _filter_test_resources(backups, 'name')
414 _log_resources_count(len(backups_to_delete), 'volume backup(s)')
415 if args.dry_run:
416 return
417 for id_ in backups_to_delete:
418 backup_obj = volume.get_backup(id_)
419 _log_resource_delete(id_, backups_to_delete[id_], 'volume backup')
420 volume.delete_backup(id_)
421 volume.wait_for_delete(backup_obj)
422
423
Dmitriy Kruglovb811e642022-10-06 12:24:33 +0200424def cleanup_volume_group_types():
425 group_types = volume.group_types()
426 group_types_to_delete = _filter_test_resources(group_types, 'name')
427 _log_resources_count(len(group_types_to_delete), 'volume group type(s)')
428 if args.dry_run:
429 return
430 for id_ in group_types_to_delete:
431 _log_resource_delete(
432 id_, group_types_to_delete[id_], 'volume group type')
433 volume.delete_group_type(id_)
434
435
436def cleanup_volume_types():
437 volume_types = volume.types()
438 volume_types_to_delete = _filter_test_resources(volume_types, 'name')
439 _log_resources_count(len(volume_types_to_delete), 'volume type(s)')
440 if args.dry_run:
441 return
442 for id_ in volume_types_to_delete:
443 _log_resource_delete(id_, volume_types_to_delete[id_], 'volume type')
444 volume.delete_type(id_)
445
446
447def cleanup_sec_groups():
448 sec_groups = network.security_groups()
449 sec_groups_to_delete = _filter_test_resources(sec_groups, 'name')
450 _log_resources_count(len(sec_groups_to_delete), 'security group(s)')
451 if args.dry_run:
452 return
453 for id_ in sec_groups_to_delete:
454 _log_resource_delete(id_, sec_groups_to_delete[id_], 'security group')
455 network.delete_security_group(id_)
456
457
458def cleanup_containers():
459 containers = object_store.containers()
460 containers_to_delete = _filter_test_resources(containers, 'name')
461 _log_resources_count(len(containers_to_delete), 'container(s)')
462 if args.dry_run:
463 return
464 for id_ in containers_to_delete:
465 _log_resource_delete(id_, containers_to_delete[id_], 'container')
466 object_store.delete_container(id_)
467
468
469def cleanup_routers():
470 routers = network.routers()
471 routers_to_delete = _filter_test_resources(routers, 'name')
472 _log_resources_count(len(routers_to_delete), 'router(s)')
473 if args.dry_run:
474 return
475 for id_ in routers_to_delete:
476 _log_resource_delete(id_, routers_to_delete[id_], 'router')
477
478 # Unset external gateway and remove ports from router
479 log.info("... ... removing external gateway from the router")
480 network.update_router(id_, external_gateway_info={})
481 ports = network.ports(device_id=id_)
482 for p in ports:
483 if p.device_owner != 'network:router_ha_interface':
484 log.info(f"... ... removing port {p.id} from the router")
485 network.remove_interface_from_router(id_, port_id=p.id)
486
487 network.delete_router(id_)
488
489
490def cleanup_networks():
491 nets = network.networks()
492 nets_to_delete = _filter_test_resources(nets, 'name')
493 _log_resources_count(len(nets_to_delete), 'network(s)')
494 if args.dry_run:
495 return
496 for id_ in nets_to_delete:
497 _log_resource_delete(id_, nets_to_delete[id_], 'network')
498
499 ports = network.ports(network_id=id_)
500 for p in ports:
501 log.info(
502 f"... ... removing port {p.id} from the network")
503 network.delete_port(p.id)
504 subnets = network.subnets(network_id=id_)
505 for s in subnets:
506 log.info(
507 f"... ... removing subnet {s.id} from the network")
508 network.delete_subnet(s.id)
509
510 network.delete_network(id_)
511
512
Ievgeniia Zadorozhnaab334132023-08-01 23:20:13 +0300513def cleanup_load_balancers():
514 lbs = load_balancer.load_balancers()
515 lbs_to_delete = _filter_test_resources(lbs, 'name')
516 _log_resources_count(len(lbs_to_delete), 'load_balancer(s)')
517 if args.dry_run:
518 return
519 for id_ in lbs_to_delete:
520 _log_resource_delete(id_, lbs_to_delete[id_], 'load_balancer')
521 try:
522 load_balancer.delete_load_balancer(id_, cascade=True)
523 except openstack.exceptions.ConflictException:
524 # force delete the LB in case it is in some PENDING_* state
Ievgeniia Zadorozhnaa33b29a2023-08-29 18:19:47 +0300525 log.info(f"... ... force deleting {id_} load balancer")
526 load_balancer.delete_load_balancer(id_, cascade=True, force=True)
Ievgeniia Zadorozhnaab334132023-08-01 23:20:13 +0300527 except Exception as e:
528 log.info(f"... ... could not delete {id_} load balancer: {e}")
529
530
Ievgeniia Zadorozhna9600b182023-08-04 17:56:24 +0300531def cleanup_floating_ips():
532 projects = identity.projects()
533 list_projects_to_delete = list(_filter_test_resources(projects, 'name'))
534 floating_ips = network.ips()
535 fips_to_delete = {}
536 for ip in floating_ips:
537 # filter only non-associated IPs, only inside target projects
538 if (ip.status == 'DOWN') and (ip.fixed_ip_address is None):
539 if ip.project_id in list_projects_to_delete:
540 fips_to_delete[ip.id] = ip.floating_ip_address
541 _log_resources_count(len(fips_to_delete), 'floating ip(s)')
542 if args.dry_run:
543 return
544 for id_ in fips_to_delete:
545 _log_resource_delete(id_, fips_to_delete[id_], 'floating ip')
546 network.delete_ip(id_)
547
548
Dmitriy Kruglovb811e642022-10-06 12:24:33 +0200549if __name__ == "__main__":
550 parser = argparse.ArgumentParser(
551 description='OpenStack test resources cleanup script')
552 parser.add_argument(
553 '-t', dest='dry_run', action='store_true',
554 help='Dry run mode, no cleanup is done')
555 parser.add_argument(
556 '-P', dest='projects', action='store_true',
557 help='Force cleanup of projects')
558 parser.add_argument(
559 '-S', dest='servers_active', action='store_true',
560 help='Set servers to ACTIVE before deletion (reqiured by bare metal)')
561 parser.add_argument(
562 '-f', dest='stacks_alt', action='store_true',
563 help='Use additional mask for stack cleanup')
564
565 args = parser.parse_args()
566
567 if args.dry_run:
568 log.info("Running in dry-run mode")
569 if args.servers_active:
570 log.info("Servers will be set to ACTIVE before cleanup")
571 if args.projects:
572 log.info("Project cleanup is enabled")
573 if args.stacks_alt:
574 log.info(
575 f"Stacks will be cleaned up using additional '{stack_mask}' mask")
576
577 cleanup_stacks(stacks_alt=args.stacks_alt)
Ievgeniia Zadorozhnad70f21c2023-08-09 20:24:38 +0300578 cleanup_load_balancers()
Ievgeniia Zadorozhnac7713ae2024-12-23 20:55:55 +0100579
580 if manila_present:
581 cleanup_shares()
582 cleanup_share_types()
583 cleanup_share_networks()
584
Dmitriy Kruglovb811e642022-10-06 12:24:33 +0200585 cleanup_servers()
586 cleanup_flavors()
Ievgeniia Zadorozhnab02617b2024-01-22 23:59:05 +0100587 try: # Skip if cinder-backup service is not enabled
588 cleanup_volume_backups()
589 except openstack.exceptions.ResourceNotFound:
590 pass
Dmitriy Kruglovb811e642022-10-06 12:24:33 +0200591 cleanup_snapshots()
592 cleanup_volumes()
593 cleanup_volume_groups()
594 cleanup_volume_group_types()
595 cleanup_volume_types()
596 cleanup_images()
597 cleanup_sec_groups()
598 cleanup_keypairs()
599 cleanup_users()
600 cleanup_roles()
601 cleanup_services()
602 cleanup_regions()
603 cleanup_routers()
604 cleanup_networks()
Ievgeniia Zadorozhnab02617b2024-01-22 23:59:05 +0100605 if object_store_present:
606 cleanup_containers()
Ievgeniia Zadorozhna9600b182023-08-04 17:56:24 +0300607 cleanup_floating_ips()
Dmitriy Kruglovb811e642022-10-06 12:24:33 +0200608
609 if args.projects:
610 cleanup_projects()
611
612 msg = "Cleanup is FINISHED"
613 log.info(f"\n{'=' * len(msg)}\n{msg}")