From 032ba8ac28e6b8f3030f4b0caec3cf403e8a261a Mon Sep 17 00:00:00 2001 From: Vladimir Khlyunev Date: Mon, 18 Jan 2021 17:27:30 +0400 Subject: [PATCH] Add subnet cleanup step Change-Id: Ie2e7dad470503435e60f70f2f6ab0dec93578260 --- os_cloud_cleaner/cleaner.py | 6 ++++ os_cloud_cleaner/os_connector.py | 51 ++++++++++++++++++++++++++++++++ os_cloud_cleaner/shell.py | 12 ++++---- 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/os_cloud_cleaner/cleaner.py b/os_cloud_cleaner/cleaner.py index 15484d1..0ab740a 100644 --- a/os_cloud_cleaner/cleaner.py +++ b/os_cloud_cleaner/cleaner.py @@ -213,6 +213,7 @@ class Cleaner: server_uuids = [] router_uuids = [] network_uuids = [] + subnets_uuids = [] secgroup_uuids = [] floating_ip_uuids = [] volumes_uuids = [] @@ -225,6 +226,8 @@ class Cleaner: router_uuids.append(uuid) elif resource["resource_type"] == "OS::Neutron::Net": network_uuids.append(uuid) + elif resource["resource_type"] == "OS::Neutron::Subnet": + subnets_uuids.append(uuid) elif resource["resource_type"] == "OS::Neutron::SecurityGroup": secgroup_uuids.append(uuid) elif resource["resource_type"] == "OS::Neutron::FloatingIP": @@ -237,6 +240,7 @@ class Cleaner: self.os_conn.cleanup_volumes_batch(volumes_uuids) self.os_conn.cleanup_router_batch(router_uuids) self.os_conn.cleanup_network_batch(network_uuids) + self.os_conn.cleanup_subnet_batch(subnets_uuids) self.os_conn.cleanup_stack(stack.id, ignore_err=True) def process_resource(self, uuid): @@ -247,6 +251,8 @@ class Cleaner: self.os_conn.cleanup_servers_batch(arg) elif self.os_conn.check_volume_exists(uuid): self.os_conn.cleanup_volumes_batch(arg) + elif self.os_conn.check_subnet_exists(uuid): + self.os_conn.cleanup_subnet_batch(arg) elif self.os_conn.check_router_exists(uuid): self.os_conn.cleanup_router_batch(arg) elif self.os_conn.check_network_exists(arg): diff --git a/os_cloud_cleaner/os_connector.py b/os_cloud_cleaner/os_connector.py index c531e73..2b7d5c6 100644 --- a/os_cloud_cleaner/os_connector.py +++ b/os_cloud_cleaner/os_connector.py @@ -117,6 +117,11 @@ class OpenStackActions(object): if f_ip_data['floating_ip_address'] == floating_ip: return f_ip_data['id'] + def get_ports(self): + response = self.neutron.list_ports() + ports = response['ports'] + return ports + def get_router_ports(self, router_uuid): response = self.neutron.list_ports(device_id=router_uuid) ports = response['ports'] @@ -185,6 +190,12 @@ class OpenStackActions(object): return True return False + def check_subnet_exists(self, subnet_uuid): + resp = self.neutron.list_subnets(id=subnet_uuid)['subnets'] + if resp: + return True + return False + def check_any_network_exists(self, uuids): return any( [self.check_network_exists(uuid) for uuid in uuids] @@ -451,6 +462,46 @@ class OpenStackActions(object): logger.error("Router {} is stuck!".format(router_uuid)) raise + def cleanup_subnet_batch(self, subnet_uuids): + logger.info("Cleaning up subnets {}".format(subnet_uuids)) + existing_subnets = [] + existing_ports = [] + for subnet in subnet_uuids: + if self.check_subnet_exists(subnet): + existing_subnets.append(subnet) + ports = self.get_ports() + for port in ports: + for fixed_ip in port['fixed_ips']: + if fixed_ip['subnet_id'] in existing_subnets: + existing_ports.append(port['id']) + for port in existing_ports: + logger.info("Deleting port {}".format(port)) + self.neutron.delete_port(port) + try: + helpers.wait_false(self.check_any_port_exists, + interval=3, + timeout=30, + predicate_kwargs={"uuids": existing_ports}) + + except helpers.TimeoutError: + for port_uuid in existing_ports: + if self.check_port_exists(port_uuid): + logger.error("Port {} was not removed!".format(port_uuid)) + raise + + for subnet in existing_subnets: + logger.info("Deleting subnet {}".format(subnet)) + self.neutron.delete_subnet(subnet) + + try: + helpers.wait_false(self.check_any_subnet_exists, + predicate_kwargs={"uuids": existing_subnets}) + except helpers.TimeoutError: + for subnet_uuid in existing_subnets: + if self.check_subnet_exists(subnet_uuid): + logger.error("Can not delete subnet {}".format(subnet_uuid)) + raise + def cleanup_network_batch(self, network_uuids): logger.info("Cleaning up networks {}".format(network_uuids)) existing_networks = [] diff --git a/os_cloud_cleaner/shell.py b/os_cloud_cleaner/shell.py index 6428813..8554134 100644 --- a/os_cloud_cleaner/shell.py +++ b/os_cloud_cleaner/shell.py @@ -63,8 +63,8 @@ search_subparser.add_argument('--only-uuids', '-i', default=False, action='store_true') # args = parser.parse_args("cleanup stack bm-cicd-pike-ovs-maas".split(" ")) +# args = parser.parse_args("search -i -n bm-cicd-pike-ovs-maas".split(" ")) # args = parser.parse_args("cleanup misc c32eade8-78a2-4cb2-a6a5-9b692a979620 0e429566-4566-41b3-8767-4d157aa90e38 37a8cdf7-0684-4fe8-860a-4ed7eedbe07c".split(" ")) -# args = parser.parse_args("search -i -n pike-ci-dvr-tarask-test".split(" ")) # args = parser.parse_args("search -i".split(" ")) # args = parser.parse_args("search".split(" ")) args = parser.parse_args() @@ -93,10 +93,12 @@ if args.action == "cleanup": if len(stacks) == 1: stack = stacks[0] stack_name = stack.stack_name - cleaner.cleanup_stack_parallel(stack.id) - logger.info("Stack cleanup done, looking for non-deleted OS " - "resources by stack-name") - do_search(stack_name, only_uuids=False) + try: + cleaner.cleanup_stack_parallel(stack.id) + logger.info("Stack cleanup done, looking for non-deleted " + "OS resources by stack-name") + finally: + do_search(stack_name, only_uuids=False) elif len(stacks) > 1: logger.error( "More than one stack found for given name '{}', do nothing".format( -- 2.45.2