From 5d1afcee68e01d81019a9195f683507371aebfaf Mon Sep 17 00:00:00 2001 From: Mridula Joshi Date: Thu, 31 Aug 2023 05:49:44 +0000 Subject: [PATCH] Adds command ``image metadef object delete`` Change-Id: Ib94b7ba625ca0679ae4ae841e217ea251baff371 --- .../cli/command-objects/image-metadef.rst | 21 +++++++ doc/source/cli/data/glance.csv | 6 +- openstackclient/image/v2/metadef_objects.py | 56 ++++++++++++++++++- .../unit/image/v2/test_metadef_objects.py | 25 ++++++++- setup.cfg | 1 + 5 files changed, 104 insertions(+), 5 deletions(-) diff --git a/doc/source/cli/command-objects/image-metadef.rst b/doc/source/cli/command-objects/image-metadef.rst index 0a41d9261d..46fe43eda6 100644 --- a/doc/source/cli/command-objects/image-metadef.rst +++ b/doc/source/cli/command-objects/image-metadef.rst @@ -21,3 +21,24 @@ Image v2 .. autoprogram-cliff:: openstack.image.v2 :command: image metadef resource type list + +.. autoprogram-cliff:: openstack.image.v2 + :command: image metadef object create + +.. autoprogram-cliff:: openstack.image.v2 + :command: image metadef object show + +.. autoprogram-cliff:: openstack.image.v2 + :command: image metadef object list + +.. autoprogram-cliff:: openstack.image.v2 + :command: image metadef object delete + +.. autoprogram-cliff:: openstack.image.v2 + :command: image metadef property create + +.. autoprogram-cliff:: openstack.image.v2 + :command: image metadef property list + +.. autoprogram-cliff:: openstack.image.v2 + :command: image metadef property show diff --git a/doc/source/cli/data/glance.csv b/doc/source/cli/data/glance.csv index e2e2f7e87a..4c46bf8ef4 100644 --- a/doc/source/cli/data/glance.csv +++ b/doc/source/cli/data/glance.csv @@ -33,10 +33,10 @@ md-namespace-show,image metadef namespace show,Describe a specific metadata defi md-namespace-tags-delete,,Delete all metadata definitions tags inside a specific namespace. md-namespace-update,,Update an existing metadata definitions namespace. md-object-create,image metadef object create,Create a new metadata definitions object inside a namespace. -md-object-delete,,Delete a specific metadata definitions object inside a namespace. -md-object-list,image metadef object list,List metadata definitions objects inside a specific namespace. -md-object-property-show,,Describe a specific metadata definitions property inside an object. md-object-show,image metadef object show,Describe a specific metadata definitions object inside a namespace. +md-object-list,image metadef object list,List metadata definitions objects inside a specific namespace. +md-object-delete,image metadef object delete,Delete a specific metadata definitions object inside a namespace. +md-object-property-show,,Describe a specific metadata definitions property inside an object. md-object-update,,Update metadata definitions object inside a namespace. md-property-create,image metadef property create,Create a new metadata definitions property inside a namespace. md-property-delete,,Delete a specific metadata definitions property inside a namespace. diff --git a/openstackclient/image/v2/metadef_objects.py b/openstackclient/image/v2/metadef_objects.py index a88c19cd89..014a953d21 100644 --- a/openstackclient/image/v2/metadef_objects.py +++ b/openstackclient/image/v2/metadef_objects.py @@ -15,13 +15,18 @@ """Image V2 Action Implementations""" +import logging from osc_lib.command import command +from osc_lib import exceptions from osc_lib import utils from openstackclient.i18n import _ +LOG = logging.getLogger(__name__) + + def _format_object(md_object): fields_to_show = ( 'created_at', @@ -77,7 +82,7 @@ class CreateMetadefObjects(command.ShowOne): class ShowMetadefObjects(command.ShowOne): _description = _( - "Describe a specific metadata definitions" "object inside a namespace" + "Describe a specific metadata definitions object inside a namespace" ) def get_parser(self, prog_name): @@ -107,6 +112,55 @@ class ShowMetadefObjects(command.ShowOne): return fields, value +class DeleteMetadefObject(command.Command): + _description = _( + "Delete a specific metadata definitions object inside a namespace" + ) + + def get_parser(self, prog_name): + parser = super().get_parser(prog_name) + parser.add_argument( + "namespace_name", + metavar="", + help=_("Namespace (name) for the namespace"), + ) + parser.add_argument( + "object_name", + metavar="", + nargs="+", + help=_("Name of an object."), + ) + return parser + + def take_action(self, parsed_args): + image_client = self.app.client_manager.image + + namespace_name = parsed_args.namespace_name + + result = 0 + for i in parsed_args.object_name: + try: + object = image_client.get_metadef_object(i, namespace_name) + image_client.delete_metadef_object(object, namespace_name) + except Exception as e: + result += 1 + LOG.error( + _( + "Failed to delete object with name or " + "ID '%(object)s': %(e)s" + ), + {'object': i, 'e': e}, + ) + + if result > 0: + total = len(parsed_args.namespace_name) + msg = _("%(result)s of %(total)s object failed to delete.") % { + 'result': result, + 'total': total, + } + raise exceptions.CommandError(msg) + + class ListMetadefObjects(command.Lister): _description = _("List metadef objects inside a specific namespace.") diff --git a/openstackclient/tests/unit/image/v2/test_metadef_objects.py b/openstackclient/tests/unit/image/v2/test_metadef_objects.py index 7b8c238b9a..d05b0337b7 100644 --- a/openstackclient/tests/unit/image/v2/test_metadef_objects.py +++ b/openstackclient/tests/unit/image/v2/test_metadef_objects.py @@ -97,13 +97,36 @@ class TestMetadefObjectsShow(fakes.TestImagev2): ] verifylist = [] parsed_args = self.check_parser(self.cmd, arglist, verifylist) - columns, data = self.cmd.take_action(parsed_args) self.assertEqual(self.expected_columns, columns) self.assertEqual(self.expected_data, data) +class TestMetadefObjectDelete(fakes.TestImagev2): + _metadef_namespace = fakes.create_one_metadef_namespace() + _metadef_objects = fakes.create_one_metadef_object() + + def setUp(self): + super().setUp() + + self.image_client.delete_metadef_object.return_value = None + self.cmd = metadef_objects.DeleteMetadefObject(self.app, None) + + def test_object_delete(self): + arglist = [ + self._metadef_namespace.namespace, + self._metadef_objects.name, + ] + + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + + self.assertIsNone(result) + + class TestMetadefObjectList(fakes.TestImagev2): _metadef_namespace = fakes.create_one_metadef_namespace() _metadef_objects = [fakes.create_one_metadef_object()] diff --git a/setup.cfg b/setup.cfg index a42fafccf7..b2197e7371 100644 --- a/setup.cfg +++ b/setup.cfg @@ -401,6 +401,7 @@ openstack.image.v2 = image_metadef_object_create = openstackclient.image.v2.metadef_objects:CreateMetadefObjects image_metadef_object_show = openstackclient.image.v2.metadef_objects:ShowMetadefObjects image_metadef_object_list = openstackclient.image.v2.metadef_objects:ListMetadefObjects + image_metadef_object_delete = openstackclient.image.v2.metadef_objects:DeleteMetadefObject image_metadef_property_create = openstackclient.image.v2.metadef_properties:CreateMetadefProperty