server_uuids = []
router_uuids = []
network_uuids = []
+ subnets_uuids = []
secgroup_uuids = []
floating_ip_uuids = []
volumes_uuids = []
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":
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):
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):
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']
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]
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 = []
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()
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(