]> review.fuel-infra Code Review - tools/sustaining.git/commitdiff
Add subnet cleanup step 79/41679/2
authorVladimir Khlyunev <vkhlyunev@mirantis.com>
Mon, 18 Jan 2021 13:27:30 +0000 (17:27 +0400)
committerVladimir Khlyunev <vkhlyunev@mirantis.com>
Mon, 18 Jan 2021 13:30:05 +0000 (17:30 +0400)
Change-Id: Ie2e7dad470503435e60f70f2f6ab0dec93578260

os_cloud_cleaner/cleaner.py
os_cloud_cleaner/os_connector.py
os_cloud_cleaner/shell.py

index 15484d132065a70224fc4f0c2d2b15abe14bcbfb..0ab740ae4064d71a672391dc73598b58dc83b675 100644 (file)
@@ -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):
index c531e73279fbdcce56685bc4960b5d984691be87..2b7d5c6e0bc584a34ae55b34638758980e734ce8 100644 (file)
@@ -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 = []
index 6428813bbfb32e4368186452048d688aa202a0c0..8554134c592786d60fbb4971340e24cd25b04914 100644 (file)
@@ -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(