From 71e6d444767a29664821ab190e0736088d8ccfba Mon Sep 17 00:00:00 2001
From: "jiahui.qiang" <jiahui.qiang@easystack.cn>
Date: Mon, 21 Nov 2016 05:47:48 +0800
Subject: [PATCH] Add "volume host set" command

Add "volume host set" command in volume v2 to support freeze(disable)
and thaw(enable) the specified cinder-volume host

Change-Id: Iee1604d72f9eccd9e327b0ef8d345909a733a647
Implements: bp cinder-command-support
---
 doc/source/command-objects/volume-host.rst    | 30 +++++++
 doc/source/commands.rst                       |  1 +
 .../tests/unit/volume/v2/test_volume_host.py  | 86 +++++++++++++++++++
 openstackclient/volume/v2/volume_host.py      | 50 +++++++++++
 ...nder-command-support-7e3ae1fb4cd90407.yaml |  5 ++
 setup.cfg                                     |  2 +
 6 files changed, 174 insertions(+)
 create mode 100644 doc/source/command-objects/volume-host.rst
 create mode 100644 openstackclient/tests/unit/volume/v2/test_volume_host.py
 create mode 100644 openstackclient/volume/v2/volume_host.py
 create mode 100644 releasenotes/notes/bp-cinder-command-support-7e3ae1fb4cd90407.yaml

diff --git a/doc/source/command-objects/volume-host.rst b/doc/source/command-objects/volume-host.rst
new file mode 100644
index 0000000000..956fce525b
--- /dev/null
+++ b/doc/source/command-objects/volume-host.rst
@@ -0,0 +1,30 @@
+===========
+volume host
+===========
+
+Volume v2
+
+volume host set
+---------------
+
+Set volume host properties
+
+.. program:: volume host set
+.. code:: bash
+
+    os volume host set
+        [--enable | --disable]
+        <host-name>
+
+.. option:: --enable
+
+    Thaw and enable the specified volume host
+
+.. option:: --disable
+
+    Freeze and disable the specified volume host
+
+.. _volume-host-set:
+.. describe:: <host-name>
+
+    Name of volume host
diff --git a/doc/source/commands.rst b/doc/source/commands.rst
index f7ef3eaabb..795dfd530b 100644
--- a/doc/source/commands.rst
+++ b/doc/source/commands.rst
@@ -144,6 +144,7 @@ referring to both Compute and Volume quotas.
 * ``user role``: (**Identity**) roles assigned to a user
 * ``volume``: (**Volume**) block volumes
 * ``volume backup``: (**Volume**) backup for volumes
+* ``volume host``: (**Volume**) the physical computer for volumes
 * ``volume qos``: (**Volume**) quality-of-service (QoS) specification for volumes
 * ``volume snapshot``: (**Volume**) a point-in-time copy of a volume
 * ``volume type``: (**Volume**) deployment-specific types of volumes available
diff --git a/openstackclient/tests/unit/volume/v2/test_volume_host.py b/openstackclient/tests/unit/volume/v2/test_volume_host.py
new file mode 100644
index 0000000000..aad7bb0bf4
--- /dev/null
+++ b/openstackclient/tests/unit/volume/v2/test_volume_host.py
@@ -0,0 +1,86 @@
+#
+#   Licensed under the Apache License, Version 2.0 (the "License"); you may
+#   not use this file except in compliance with the License. You may obtain
+#   a copy of the License at
+#
+#        http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#   WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#   License for the specific language governing permissions and limitations
+#   under the License.
+#
+
+from openstackclient.tests.unit.volume.v2 import fakes as host_fakes
+from openstackclient.volume.v2 import volume_host
+
+
+class TestVolumeHost(host_fakes.TestVolume):
+
+    def setUp(self):
+        super(TestVolumeHost, self).setUp()
+
+        self.host_mock = self.app.client_manager.volume.services
+        self.host_mock.reset_mock()
+
+
+class TestVolumeHostSet(TestVolumeHost):
+
+    service = host_fakes.FakeService.create_one_service()
+
+    def setUp(self):
+        super(TestVolumeHostSet, self).setUp()
+
+        self.host_mock.freeze_host.return_value = None
+        self.host_mock.thaw_host.return_value = None
+
+        self.cmd = volume_host.SetVolumeHost(self.app, None)
+
+    def test_volume_host_set_nothing(self):
+        arglist = [
+            self.service.host,
+        ]
+        verifylist = [
+            ('host', self.service.host),
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+        result = self.cmd.take_action(parsed_args)
+
+        self.host_mock.freeze_host.assert_not_called()
+        self.host_mock.thaw_host.assert_not_called()
+        self.assertIsNone(result)
+
+    def test_volume_host_set_enable(self):
+        arglist = [
+            '--enable',
+            self.service.host,
+        ]
+        verifylist = [
+            ('enable', True),
+            ('host', self.service.host),
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        result = self.cmd.take_action(parsed_args)
+
+        self.host_mock.thaw_host.assert_called_with(self.service.host)
+        self.host_mock.freeze_host.assert_not_called()
+        self.assertIsNone(result)
+
+    def test_volume_host_set_disable(self):
+        arglist = [
+            '--disable',
+            self.service.host,
+        ]
+        verifylist = [
+            ('disable', True),
+            ('host', self.service.host),
+        ]
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        result = self.cmd.take_action(parsed_args)
+
+        self.host_mock.freeze_host.assert_called_with(self.service.host)
+        self.host_mock.thaw_host.assert_not_called()
+        self.assertIsNone(result)
diff --git a/openstackclient/volume/v2/volume_host.py b/openstackclient/volume/v2/volume_host.py
new file mode 100644
index 0000000000..376e502491
--- /dev/null
+++ b/openstackclient/volume/v2/volume_host.py
@@ -0,0 +1,50 @@
+#
+#   Licensed under the Apache License, Version 2.0 (the "License"); you may
+#   not use this file except in compliance with the License. You may obtain
+#   a copy of the License at
+#
+#        http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#   WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#   License for the specific language governing permissions and limitations
+#   under the License.
+#
+
+"""Volume v2 host action implementations"""
+
+from osc_lib.command import command
+
+from openstackclient.i18n import _
+
+
+class SetVolumeHost(command.Command):
+    _description = _("Set volume host properties")
+
+    def get_parser(self, prog_name):
+        parser = super(SetVolumeHost, self).get_parser(prog_name)
+        parser.add_argument(
+            "host",
+            metavar="<host-name>",
+            help=_("Name of volume host")
+        )
+        enabled_group = parser.add_mutually_exclusive_group()
+        enabled_group.add_argument(
+            "--disable",
+            action="store_true",
+            help=_("Freeze and disable the specified volume host.")
+        )
+        enabled_group.add_argument(
+            "--enable",
+            action="store_true",
+            help=_("Thaw and enable the specified volume host.")
+        )
+        return parser
+
+    def take_action(self, parsed_args):
+        service_client = self.app.client_manager.volume
+        if parsed_args.enable:
+            service_client.services.thaw_host(parsed_args.host)
+        if parsed_args.disable:
+            service_client.services.freeze_host(parsed_args.host)
diff --git a/releasenotes/notes/bp-cinder-command-support-7e3ae1fb4cd90407.yaml b/releasenotes/notes/bp-cinder-command-support-7e3ae1fb4cd90407.yaml
new file mode 100644
index 0000000000..1b0ca18de3
--- /dev/null
+++ b/releasenotes/notes/bp-cinder-command-support-7e3ae1fb4cd90407.yaml
@@ -0,0 +1,5 @@
+---
+features:
+  - Add ``volume host set`` command, it allows a user to enable or disable a volume host.
+    [Blueprint `cinder-command-support <https://blueprints.launchpad.net/python-openstackclient/+spec/cinder-command-support>`_]
+
diff --git a/setup.cfg b/setup.cfg
index 2bbbb5ae72..ee1fc2ecb6 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -547,6 +547,8 @@ openstack.volume.v2 =
     volume_backup_set = openstackclient.volume.v2.backup:SetVolumeBackup
     volume_backup_show = openstackclient.volume.v2.backup:ShowVolumeBackup
 
+    volume_host_set = openstackclient.volume.v2.volume_host:SetVolumeHost
+
     volume_snapshot_create = openstackclient.volume.v2.volume_snapshot:CreateVolumeSnapshot
     volume_snapshot_delete = openstackclient.volume.v2.volume_snapshot:DeleteVolumeSnapshot
     volume_snapshot_list = openstackclient.volume.v2.volume_snapshot:ListVolumeSnapshot