From f7d852185ab0b3e2657f3364a11f48540976f262 Mon Sep 17 00:00:00 2001 From: Vladimir Khlyunev Date: Thu, 14 Jan 2021 17:18:05 +0400 Subject: [PATCH] Extend output of search option Change-Id: Id14e09e10aa65bb9a4632e78e14137f332d816f9 --- os_cloud_cleaner/cleaner.py | 76 +++++++++++++++++++++++++------- os_cloud_cleaner/ignorelist.txt | 2 + os_cloud_cleaner/os_connector.py | 7 +++ os_cloud_cleaner/shell.py | 15 ++++--- 4 files changed, 77 insertions(+), 23 deletions(-) diff --git a/os_cloud_cleaner/cleaner.py b/os_cloud_cleaner/cleaner.py index 438fab0..15484d1 100644 --- a/os_cloud_cleaner/cleaner.py +++ b/os_cloud_cleaner/cleaner.py @@ -1,6 +1,7 @@ from __future__ import unicode_literals import os +from collections import OrderedDict from datetime import datetime from os_connector import OpenStackActions @@ -120,22 +121,65 @@ class Cleaner: def search_non_heat_resources_by_name(self, name): self.reset_cache() resources = self.collect_os_non_stack_resources() - servers = {server.id: server.name for server in resources['servers'] - if name in server.name and - server.id not in self.ignorelist_uuids} - volumes = {volume.id: volume.name for volume in resources['volumes'] - if name in volume.name and - volume.id not in self.ignorelist_uuids} - networks = {net['id']: net['name'] for net in resources['networks'] - if name in net['name'] and - net['id'] not in self.ignorelist_uuids} - subnets = {subnet['id']: subnet['name'] for subnet in - resources['subnets'] - if name in subnet['name'] and - subnet['id'] not in self.ignorelist_uuids} - routers = {router['id']: router['name'] for router in - resources['routers'] if name in router['name'] and - router['id'] not in self.ignorelist_uuids} + # base fields: uuid, name, created_at + servers = [] + for server in resources['servers']: + if name in server.name and server.id not in self.ignorelist_uuids: + data = OrderedDict() + data['uuid'] = server.id + data['name'] = server.name + data['created'] = server.created + servers.append(data) + volumes = [] + for volume in resources['volumes']: + if name in volume.name and volume.id not in self.ignorelist_uuids: + attach_decs = [] + for attachment in volume.attachments: + attach_template = "{server} as {device} since {date}" + server_name = self.os_conn.get_server_name_by_uuid( + attachment['server_id']) + if server_name: + attach_decs.append(attach_template.format( + server=server_name, + device=attachment['device'], + date=attachment['attached_at'])) + else: + attach_decs.append( + "Attached to non-existing server {}! " + "Error in databases".format( + attachment['server_id'])) + data = OrderedDict() + data['uuid'] = volume.id + data['name'] = volume.name + data['created_at'] = volume.created_at + data['attachments'] = '\n'.join(attach_decs) + volumes.append(data) + networks = [] + for net in resources['networks']: + if name in net['name'] and net['id'] not in self.ignorelist_uuids: + data = OrderedDict() + data['uuid'] = net['id'] + data['name'] = net['name'] + data['created_at'] = net['created_at'] + networks.append(data) + subnets = [] + for subnet in resources['subnets']: + if name in subnet['name'] and \ + subnet['id'] not in self.ignorelist_uuids: + data = OrderedDict() + data['uuid'] = subnet['id'] + data['name'] = subnet['name'] + data['created_at'] = subnet['created_at'] + subnets.append(data) + routers = [] + for router in resources['routers']: + if name in router['name'] and \ + router['id'] not in self.ignorelist_uuids: + data = OrderedDict() + data['uuid'] = router['id'] + data['name'] = router['name'] + data['created_at'] = router['created_at'] + routers.append(data) return {'servers': servers, 'volumes': volumes, diff --git a/os_cloud_cleaner/ignorelist.txt b/os_cloud_cleaner/ignorelist.txt index 800b503..a1b46a4 100644 --- a/os_cloud_cleaner/ignorelist.txt +++ b/os_cloud_cleaner/ignorelist.txt @@ -30,8 +30,10 @@ d92fc584-371b-4c0b-aa85-9c5c49292129 # sre-router 83bada1a-3a04-413f-b3ef-d0f26adf69e2 # dstremkouski-convert-qcow2-raw 0d0665c2-c684-4a66-a224-72462ccb016d # dstremkouski-500G-stripe 0601a251-940f-4489-b5d3-4ed58d9d2727 # dstremkouski-VW-jumphost +da6ff39c-01cc-4323-9c76-ab7fc243fae4 # dstremkouski-jumphost-eu d0eb9a28-8ea1-4728-9fcc-5e89d1fd773d # dstremkouski-500G d32349f4-74eb-4acb-a7a4-b9ae32029000 # windows-vw-jump +48a15d0c-5c48-45dc-b8db-13462239278c # sre-monitoring # Subnets 4e248805-d684-4411-bb3f-143ec8da5bad # cvp-subnet-internal-2 7d7e65ba-d6cf-458f-b963-50614fac5e00 # baremetal-subnet diff --git a/os_cloud_cleaner/os_connector.py b/os_cloud_cleaner/os_connector.py index 4c2c93e..c531e73 100644 --- a/os_cloud_cleaner/os_connector.py +++ b/os_cloud_cleaner/os_connector.py @@ -126,6 +126,13 @@ class OpenStackActions(object): servers = self.nova.servers.list() return servers + def get_server_name_by_uuid(self, uuid): + try: + server = self.nova.servers.get(uuid) + return server.name + except NovaNotFoundException: + return None + def get_keystone_endpoints(self): endpoints = self.keystone.endpoints.list() return endpoints diff --git a/os_cloud_cleaner/shell.py b/os_cloud_cleaner/shell.py index 8686f51..1f9361d 100644 --- a/os_cloud_cleaner/shell.py +++ b/os_cloud_cleaner/shell.py @@ -16,8 +16,9 @@ def do_search(name, only_uuids): keys_ordered = ['servers', 'subnets', 'networks', 'routers', 'volumes'] if only_uuids: uuids = [] - for k in keys_ordered: - uuids.extend(result[k].keys()) + for key in keys_ordered: + for item in result[key]: + uuids.append(item['uuid']) print " ".join(uuids) else: for key in keys_ordered: @@ -25,13 +26,13 @@ def do_search(name, only_uuids): continue print key table = PrettyTable() - table.field_names = ["UUID", "Name"] + table.field_names = result[key][0].keys() table.align = 'l' # table.vertical_char = "#" # table.horizontal_char = "#" # table.left_padding_width = 0 - for uuid in result[key]: - table.add_row([uuid, result[key][uuid]]) + for value in result[key]: + table.add_row(value.values()) print table @@ -65,8 +66,8 @@ search_subparser.add_argument('--only-uuids', '-i', # 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() +args = parser.parse_args("search".split(" ")) +# args = parser.parse_args() auth_url = args.os_auth_url or os.environ.get('OS_AUTH_URL') username = args.os_username or os.environ.get('OS_USERNAME') -- 2.45.2