From 9c91c1df4147cbd277c3384b0c648a6069c5f723 Mon Sep 17 00:00:00 2001
From: Tang Chen <chen.tang@easystack.cn>
Date: Wed, 17 Feb 2016 14:39:57 +0800
Subject: [PATCH] Make SetAgent inherit from cliff.Command

set/unset command classes should inherit from cliff.Command class.

Also, this patch adds functional tests for compute agent.

Change-Id: I25eafffd1167f82aa0d430628c22dee7516b1e19
Partial-Bug: 1546065
---
 doc/source/backwards-incompatible.rst         | 12 +++
 functional/tests/compute/v2/test_agent.py     | 76 +++++++++++++++++++
 openstackclient/compute/v2/agent.py           |  5 +-
 .../notes/bug-1546065-41d09ffbd8606513.yaml   |  2 +
 4 files changed, 92 insertions(+), 3 deletions(-)
 create mode 100644 functional/tests/compute/v2/test_agent.py

diff --git a/doc/source/backwards-incompatible.rst b/doc/source/backwards-incompatible.rst
index 752f52e3e2..76a3b95187 100644
--- a/doc/source/backwards-incompatible.rst
+++ b/doc/source/backwards-incompatible.rst
@@ -138,6 +138,18 @@ List of Backwards Incompatible Changes
   * Bug: https://bugs.launchpad.net/python-openstackclient/+bug/1546065
   * Commit: https://review.openstack.org/#/c/281087/
 
+11. `compute agent set` commands will no longer return the modified resource
+
+  Previously, modifying an agent would result in the new agent being displayed
+  to the user. To keep things consistent with other `set` commands, we will
+  no longer be showing the modified resource.
+
+  * In favor of: Use `set` then `show`
+  * As of: NA
+  * Removed in: NA
+  * Bug: https://bugs.launchpad.net/python-openstackclient/+bug/1546065
+  * Commit: https://review.openstack.org/#/c/281088/
+
 For Developers
 ==============
 
diff --git a/functional/tests/compute/v2/test_agent.py b/functional/tests/compute/v2/test_agent.py
new file mode 100644
index 0000000000..df7c21f264
--- /dev/null
+++ b/functional/tests/compute/v2/test_agent.py
@@ -0,0 +1,76 @@
+#    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.
+
+import hashlib
+
+from functional.common import test
+
+
+class ComputeAgentTests(test.TestCase):
+    """Functional tests for compute agent. """
+
+    ID = None
+    MD5HASH = hashlib.md5().hexdigest()
+    URL = "http://localhost"
+    VER = "v1"
+    OS = "TEST_OS"
+    ARCH = "x86_64"
+    HYPER = "kvm"
+
+    HEADERS = ['agent_id', 'md5hash']
+    FIELDS = ['agent_id', 'md5hash']
+
+    @classmethod
+    def setUpClass(cls):
+        opts = cls.get_show_opts(cls.HEADERS)
+        raw_output = cls.openstack('compute agent create '
+                                   + cls.OS + ' ' + cls.ARCH + ' '
+                                   + cls.VER + ' ' + cls.URL + ' '
+                                   + cls.MD5HASH + ' ' + cls.HYPER + ' '
+                                   + opts)
+
+        # Get agent id because agent can only be deleted by ID
+        output_list = raw_output.split('\n', 1)
+        cls.ID = output_list[0]
+
+        cls.assertOutput(cls.MD5HASH + '\n', output_list[1])
+
+    @classmethod
+    def tearDownClass(cls):
+        raw_output = cls.openstack('compute agent delete ' + cls.ID)
+        cls.assertOutput('', raw_output)
+
+    def test_agent_list(self):
+        raw_output = self.openstack('compute agent list')
+        self.assertIn(self.ID, raw_output)
+        self.assertIn(self.OS, raw_output)
+        self.assertIn(self.ARCH, raw_output)
+        self.assertIn(self.VER, raw_output)
+        self.assertIn(self.URL, raw_output)
+        self.assertIn(self.MD5HASH, raw_output)
+        self.assertIn(self.HYPER, raw_output)
+
+    def test_agent_set(self):
+        ver = 'v2'
+        url = "http://openstack"
+        md5hash = hashlib.md5().hexdigest()
+
+        raw_output = self.openstack('compute agent set '
+                                    + self.ID + ' ' + ver + ' '
+                                    + url + ' ' + md5hash)
+        self.assertEqual('', raw_output)
+
+        raw_output = self.openstack('compute agent list')
+        self.assertIn(self.ID, raw_output)
+        self.assertIn(ver, raw_output)
+        self.assertIn(url, raw_output)
+        self.assertIn(md5hash, raw_output)
diff --git a/openstackclient/compute/v2/agent.py b/openstackclient/compute/v2/agent.py
index 59d7dc66e3..d5e860330f 100644
--- a/openstackclient/compute/v2/agent.py
+++ b/openstackclient/compute/v2/agent.py
@@ -112,7 +112,7 @@ class ListAgent(command.Lister):
                 ) for s in data))
 
 
-class SetAgent(command.ShowOne):
+class SetAgent(command.Command):
     """Set compute agent command"""
 
     def get_parser(self, prog_name):
@@ -143,5 +143,4 @@ class SetAgent(command.ShowOne):
             parsed_args.url,
             parsed_args.md5hash
         )
-        agent = compute_client.agents.update(*args)._info.copy()
-        return zip(*sorted(six.iteritems(agent)))
+        compute_client.agents.update(*args)
diff --git a/releasenotes/notes/bug-1546065-41d09ffbd8606513.yaml b/releasenotes/notes/bug-1546065-41d09ffbd8606513.yaml
index f0c3463828..a28290cfde 100644
--- a/releasenotes/notes/bug-1546065-41d09ffbd8606513.yaml
+++ b/releasenotes/notes/bug-1546065-41d09ffbd8606513.yaml
@@ -4,3 +4,5 @@ fixes:
     [Bug `1546065 <https://bugs.launchpad.net/python-openstackclient/+bug/1546065>`_]
   - Command ``security group set`` now outputs nothing.
     [Bug `1546065 <https://bugs.launchpad.net/python-openstackclient/+bug/1546065>`_]
+  - Command ``compute agent set`` now outputs nothing.
+    [Bug `1546065 <https://bugs.launchpad.net/python-openstackclient/+bug/1546065>`_]