diff --git a/doc/source/cli/data/glance.csv b/doc/source/cli/data/glance.csv index 6abb223b4..7387ddc47 100644 --- a/doc/source/cli/data/glance.csv +++ b/doc/source/cli/data/glance.csv @@ -39,7 +39,7 @@ md-object-property-show,,Describe a specific metadata definitions property insid md-object-show,,Describe a specific metadata definitions object inside a namespace. 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. +md-property-delete,image metadef property delete,Delete a specific metadata definitions property inside a namespace. md-property-list,image metadef property list,List metadata definitions properties inside a specific namespace. md-property-show,image metadef property show,Describe a specific metadata definitions property inside a namespace. md-property-update,,Update metadata definitions property inside a namespace. diff --git a/openstackclient/image/v2/metadef_properties.py b/openstackclient/image/v2/metadef_properties.py index 2de7ac00b..007e018ae 100644 --- a/openstackclient/image/v2/metadef_properties.py +++ b/openstackclient/image/v2/metadef_properties.py @@ -107,6 +107,44 @@ class CreateMetadefProperty(command.ShowOne): return zip(*sorted(info.items())) +class DeleteMetadefProperty(command.Command): + _description = _("Delete a metadef property") + + def get_parser(self, prog_name): + parser = super().get_parser(prog_name) + parser.add_argument( + "namespace_name", + help=_("An identifier (a name) for the namespace"), + ) + parser.add_argument( + "property_name", + help=_("Property to delete"), + ) + return parser + + def take_action(self, parsed_args): + image_client = self.app.client_manager.image + + try: + image_client.delete_metadef_property( + parsed_args.property_name, + parsed_args.namespace_name, + ignore_missing=False, + ) + except Exception as e: + raise exceptions.CommandError( + _( + "Failed to delete property with name or " + "ID '%(property)s' from namespace '%(namespace)s': %(e)s" + ) + % { + 'property': parsed_args.property_name, + 'namespace': parsed_args.namespace_name, + 'e': e, + } + ) + + class ListMetadefProperties(command.Lister): _description = _("List metadef properties") diff --git a/openstackclient/tests/unit/image/v2/test_metadef_properties.py b/openstackclient/tests/unit/image/v2/test_metadef_properties.py index b1fad7f6c..fa59c29cd 100644 --- a/openstackclient/tests/unit/image/v2/test_metadef_properties.py +++ b/openstackclient/tests/unit/image/v2/test_metadef_properties.py @@ -12,6 +12,7 @@ # License for the specific language governing permissions and limitations # under the License. +from openstack import exceptions as sdk_exceptions from osc_lib import exceptions from openstackclient.image.v2 import metadef_properties @@ -85,6 +86,54 @@ class TestMetadefPropertyCreate(image_fakes.TestImagev2): ) +class TestMetadefPropertyDelete(image_fakes.TestImagev2): + def setUp(self): + super().setUp() + + self.cmd = metadef_properties.DeleteMetadefProperty(self.app, None) + + def test_metadef_property_delete(self): + arglist = ['namespace', 'property'] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + result = self.cmd.take_action(parsed_args) + + self.assertIsNone(result) + + def test_metadef_property_delete_missing_arguments(self): + arglist = [] + self.assertRaises( + tests_utils.ParserException, + self.check_parser, + self.cmd, + arglist, + [], + ) + + arglist = ['namespace'] + self.assertRaises( + tests_utils.ParserException, + self.check_parser, + self.cmd, + arglist, + [], + ) + + def test_metadef_property_delete_exception(self): + arglist = ['namespace', 'property'] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + self.image_client.delete_metadef_property.side_effect = ( + sdk_exceptions.ResourceNotFound + ) + + self.assertRaises( + exceptions.CommandError, self.cmd.take_action, parsed_args + ) + + class TestMetadefPropertyList(image_fakes.TestImagev2): _metadef_property = [image_fakes.create_one_metadef_property()] diff --git a/releasenotes/notes/add-metadef-property-delete-ebb999d92a588ad4.yaml b/releasenotes/notes/add-metadef-property-delete-ebb999d92a588ad4.yaml new file mode 100644 index 000000000..69e43dd00 --- /dev/null +++ b/releasenotes/notes/add-metadef-property-delete-ebb999d92a588ad4.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + Add ``image metadef property delete`` command to delete a + metadef property inside a specific namespace. diff --git a/setup.cfg b/setup.cfg index b019546dd..339cce2db 100644 --- a/setup.cfg +++ b/setup.cfg @@ -400,6 +400,7 @@ openstack.image.v2 = image_metadef_object_create = openstackclient.image.v2.metadef_objects:CreateMetadefObjects image_metadef_property_create = openstackclient.image.v2.metadef_properties:CreateMetadefProperty + image_metadef_property_delete = openstackclient.image.v2.metadef_properties:DeleteMetadefProperty image_metadef_property_list = openstackclient.image.v2.metadef_properties:ListMetadefProperties image_metadef_property_show = openstackclient.image.v2.metadef_properties:ShowMetadefProperty