From 9bafea555d6ef84817976621d40522172c5b351f Mon Sep 17 00:00:00 2001 From: root Date: Thu, 10 Mar 2016 09:30:47 +0530 Subject: [PATCH] Add support for deleting Image-property OSC does not support to delete volume's image property. This patch will provide support for deleting image property to existing volume. Closes-Bug:#1554879 Change-Id: I9256913948fae9e9a03fed173b826dfa918f78e9 Implements: bp cinder-command-support --- doc/source/command-objects/volume.rst | 6 +++ .../tests/volume/v2/test_volume.py | 53 +++++++++++++++++++ openstackclient/volume/v2/volume.py | 20 +++++-- ...mage-property-delete-118c6007eba8357a.yaml | 14 +++++ 4 files changed, 89 insertions(+), 4 deletions(-) create mode 100644 releasenotes/notes/image-property-delete-118c6007eba8357a.yaml diff --git a/doc/source/command-objects/volume.rst b/doc/source/command-objects/volume.rst index f51b5ae19d..fd32c3278f 100644 --- a/doc/source/command-objects/volume.rst +++ b/doc/source/command-objects/volume.rst @@ -219,12 +219,18 @@ Unset volume properties os volume unset [--property ] + [--image-property ] .. option:: --property Property to remove from volume (repeat option to remove multiple properties) +.. option:: --image-property + + To remove image properties from volume + (repeat option to remove multiple image properties) + .. describe:: Volume to modify (name or ID) diff --git a/openstackclient/tests/volume/v2/test_volume.py b/openstackclient/tests/volume/v2/test_volume.py index 29fc391ee9..12253806b9 100644 --- a/openstackclient/tests/volume/v2/test_volume.py +++ b/openstackclient/tests/volume/v2/test_volume.py @@ -783,3 +783,56 @@ class TestVolumeSet(TestVolume): self.cmd.take_action(parsed_args) self.volumes_mock.set_image_metadata.assert_called_with( self.volumes_mock.get().id, parsed_args.image_property) + + +class TestVolumeUnset(TestVolume): + + def setUp(self): + super(TestVolumeUnset, self).setUp() + + self.new_volume = volume_fakes.FakeVolume.create_one_volume() + self.volumes_mock.create.return_value = self.new_volume + + # Get the command object to set property + self.cmd_set = volume.SetVolume(self.app, None) + + # Get the command object to unset property + self.cmd_unset = volume.UnsetVolume(self.app, None) + + def test_volume_unset_image_property(self): + + # Arguments for setting image properties + arglist = [ + '--image-property', 'Alpha=a', + '--image-property', 'Beta=b', + self.new_volume.id, + ] + verifylist = [ + ('image_property', {'Alpha': 'a', 'Beta': 'b'}), + ('volume', self.new_volume.id), + ] + parsed_args = self.check_parser(self.cmd_set, arglist, verifylist) + + # In base command class ShowOne in cliff, abstract method take_action() + # returns nothing + self.cmd_set.take_action(parsed_args) + + # Arguments for unsetting image properties + arglist_unset = [ + '--image-property', 'Alpha', + self.new_volume.id, + ] + verifylist_unset = [ + ('image_property', ['Alpha']), + ('volume', self.new_volume.id), + ] + parsed_args_unset = self.check_parser(self.cmd_unset, + arglist_unset, + verifylist_unset) + + # In base command class ShowOne in cliff, abstract method take_action() + # returns nothing + self.cmd_unset.take_action(parsed_args_unset) + + self.volumes_mock.delete_image_metadata.assert_called_with( + self.volumes_mock.get().id, parsed_args_unset.image_property) diff --git a/openstackclient/volume/v2/volume.py b/openstackclient/volume/v2/volume.py index 9b58d73daf..5d9d2d9e35 100644 --- a/openstackclient/volume/v2/volume.py +++ b/openstackclient/volume/v2/volume.py @@ -433,12 +433,17 @@ class UnsetVolume(command.Command): parser.add_argument( '--property', metavar='', - required=True, action='append', - default=[], help='Property to remove from volume ' '(repeat option to remove multiple properties)', ) + parser.add_argument( + '--image-property', + metavar='', + action='append', + help='To remove image properties from volume ' + '(repeat option to remove multiple image properties)', + ) return parser def take_action(self, parsed_args): @@ -446,5 +451,12 @@ class UnsetVolume(command.Command): volume = utils.find_resource( volume_client.volumes, parsed_args.volume) - volume_client.volumes.delete_metadata( - volume.id, parsed_args.property) + if parsed_args.property: + volume_client.volumes.delete_metadata( + volume.id, parsed_args.property) + if parsed_args.image_property: + volume_client.volumes.delete_image_metadata( + volume.id, parsed_args.image_property) + + if (not parsed_args.image_property and not parsed_args.property): + self.app.log.error("No changes requested\n") diff --git a/releasenotes/notes/image-property-delete-118c6007eba8357a.yaml b/releasenotes/notes/image-property-delete-118c6007eba8357a.yaml new file mode 100644 index 0000000000..deb1556799 --- /dev/null +++ b/releasenotes/notes/image-property-delete-118c6007eba8357a.yaml @@ -0,0 +1,14 @@ +--- +fixes: + - | + Added support for deleting volume image property. + + Image properties are copied from image when volume is created. + But since a volume is mutable, user sometime wants to delete + image properties for volume. + + So, this fix enables user to delete image properties of volume + using below command: + ``volume unset [--image-property ] ``. + + [Bug 'https://bugs.launchpad.net/python-openstackclient/+bug/1554879'_]