From bba5c9047f81439a18e4e8be434f51abab83a24a Mon Sep 17 00:00:00 2001
From: Huanxuan Ao <huanxuan.ao@easystack.cn>
Date: Wed, 21 Sep 2016 15:08:14 +0800
Subject: [PATCH] Fix "volume unset" command pass normally when nothing
 specified

When nothing specified in "volume unset" command, there
will be an error message says that the "--properties"
option is required, it is unusual behaviour, this patch
fix it and also add unit test for it.
Also, this patch add unit test for "volume show" command
by the way.

Change-Id: I5b5d587670acf0af4262b8521292455bf9f60fe5
Partial-bug: #1588588
---
 .../tests/unit/volume/v1/test_volume.py       | 99 +++++++++++++++++++
 openstackclient/volume/v1/volume.py           |  2 -
 2 files changed, 99 insertions(+), 2 deletions(-)

diff --git a/openstackclient/tests/unit/volume/v1/test_volume.py b/openstackclient/tests/unit/volume/v1/test_volume.py
index 6fe6394101..895f1f876b 100644
--- a/openstackclient/tests/unit/volume/v1/test_volume.py
+++ b/openstackclient/tests/unit/volume/v1/test_volume.py
@@ -880,3 +880,102 @@ class TestVolumeSet(TestVolume):
             self.cmd.take_action(parsed_args)
             self.volumes_mock.set_bootable.assert_called_with(
                 self._volume.id, verifylist[index][0][1])
+
+
+class TestVolumeShow(TestVolume):
+
+    columns = (
+        'attachments',
+        'availability_zone',
+        'bootable',
+        'created_at',
+        'display_description',
+        'display_name',
+        'id',
+        'properties',
+        'size',
+        'snapshot_id',
+        'status',
+        'type',
+    )
+
+    def setUp(self):
+        super(TestVolumeShow, self).setUp()
+        self._volume = volume_fakes.FakeVolume.create_one_volume()
+        self.datalist = (
+            self._volume.attachments,
+            self._volume.availability_zone,
+            self._volume.bootable,
+            self._volume.created_at,
+            self._volume.display_description,
+            self._volume.display_name,
+            self._volume.id,
+            utils.format_dict(self._volume.metadata),
+            self._volume.size,
+            self._volume.snapshot_id,
+            self._volume.status,
+            self._volume.volume_type,
+        )
+        self.volumes_mock.get.return_value = self._volume
+        # Get the command object to test
+        self.cmd = volume.ShowVolume(self.app, None)
+
+    def test_volume_show(self):
+        arglist = [
+            self._volume.id
+        ]
+        verifylist = [
+            ("volume", self._volume.id)
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        columns, data = self.cmd.take_action(parsed_args)
+        self.volumes_mock.get.assert_called_with(self._volume.id)
+
+        self.assertEqual(self.columns, columns)
+        self.assertEqual(self.datalist, data)
+
+
+class TestVolumeUnset(TestVolume):
+
+    _volume = volume_fakes.FakeVolume.create_one_volume()
+
+    def setUp(self):
+        super(TestVolumeUnset, self).setUp()
+
+        self.volumes_mock.get.return_value = self._volume
+
+        self.volumes_mock.delete_metadata.return_value = None
+        # Get the command object to test
+        self.cmd = volume.UnsetVolume(self.app, None)
+
+    def test_volume_unset_no_options(self):
+        arglist = [
+            self._volume.display_name,
+        ]
+        verifylist = [
+            ('property', None),
+            ('volume', self._volume.display_name),
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        result = self.cmd.take_action(parsed_args)
+        self.assertIsNone(result)
+
+    def test_volume_unset_property(self):
+        arglist = [
+            '--property', 'myprop',
+            self._volume.display_name,
+        ]
+        verifylist = [
+            ('property', ['myprop']),
+            ('volume', self._volume.display_name),
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        result = self.cmd.take_action(parsed_args)
+
+        self.volumes_mock.delete_metadata.assert_called_with(
+            self._volume.id, ['myprop']
+        )
+        self.assertIsNone(result)
diff --git a/openstackclient/volume/v1/volume.py b/openstackclient/volume/v1/volume.py
index 69bf380348..89fa2014ae 100644
--- a/openstackclient/volume/v1/volume.py
+++ b/openstackclient/volume/v1/volume.py
@@ -452,10 +452,8 @@ class UnsetVolume(command.Command):
             '--property',
             metavar='<key>',
             action='append',
-            default=[],
             help=_('Remove a property from volume '
                    '(repeat option to remove multiple properties)'),
-            required=True,
         )
         return parser