From ff3566ef48f1a68d5267cd758d42fdc2140d14b0 Mon Sep 17 00:00:00 2001
From: "zhiyong.dai" <zhiyong.dai@easystack.cn>
Date: Sat, 26 Nov 2016 02:13:30 +0800
Subject: [PATCH] Functional test for agent

Using json format output in compute agent functional tests.
Remove resource create/delete from setupClass() and
teardownClass() methods

Change-Id: Ic7c6c268dfccca097709378c0473eb82cddf7bc6
---
 .../tests/functional/compute/v2/test_agent.py | 215 ++++++++++++++----
 1 file changed, 167 insertions(+), 48 deletions(-)

diff --git a/openstackclient/tests/functional/compute/v2/test_agent.py b/openstackclient/tests/functional/compute/v2/test_agent.py
index 7115db1f4f..1a112e8212 100644
--- a/openstackclient/tests/functional/compute/v2/test_agent.py
+++ b/openstackclient/tests/functional/compute/v2/test_agent.py
@@ -11,6 +11,7 @@
 #    under the License.
 
 import hashlib
+import json
 
 from openstackclient.tests.functional import base
 
@@ -18,60 +19,178 @@ from openstackclient.tests.functional import base
 class ComputeAgentTests(base.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"
+    # Generate two different md5hash
+    MD5HASH1 = hashlib.md5()
+    MD5HASH1.update('agent_1')
+    MD5HASH1 = MD5HASH1.hexdigest()
+    MD5HASH2 = hashlib.md5()
+    MD5HASH2.update('agent_2')
+    MD5HASH2 = MD5HASH2.hexdigest()
 
-    HEADERS = ['agent_id', 'md5hash']
-    FIELDS = ['agent_id', 'md5hash']
+    def test_compute_agent_delete(self):
+        """Test compute agent create, delete multiple"""
+        os1 = "os_1"
+        arch1 = "x86_64"
+        ver1 = "v1"
+        url1 = "http://localhost"
+        md5hash1 = self.MD5HASH1
+        hyper1 = "kvm"
+        cmd1 = ' '.join((os1, arch1, ver1, url1, md5hash1, hyper1))
 
-    @classmethod
-    def setUpClass(cls):
-        opts = cls.get_opts(cls.HEADERS)
-        raw_output = cls.openstack('compute agent create ' +
-                                   cls.OS + ' ' + cls.ARCH + ' ' +
-                                   cls.VER + ' ' + cls.URL + ' ' +
-                                   cls.MD5HASH + ' ' + cls.HYPER + ' ' +
-                                   opts)
+        cmd_output = json.loads(self.openstack(
+            'compute agent create -f json ' +
+            cmd1
+        ))
+        agent_id1 = str(cmd_output["agent_id"])
 
-        # Get agent id because agent can only be deleted by ID
-        output_list = raw_output.split('\n', 1)
-        cls.ID = output_list[0]
+        os2 = "os_2"
+        arch2 = "x86"
+        ver2 = "v2"
+        url2 = "http://openstack"
+        md5hash2 = self.MD5HASH2
+        hyper2 = "xen"
+        cmd2 = ' '.join((os2, arch2, ver2, url2, md5hash2, hyper2))
 
-        cls.assertOutput(cls.MD5HASH + '\n', output_list[1])
+        cmd_output = json.loads(self.openstack(
+            'compute agent create -f json ' +
+            cmd2
+        ))
+        agent_id2 = str(cmd_output["agent_id"])
 
-    @classmethod
-    def tearDownClass(cls):
-        raw_output = cls.openstack('compute agent delete ' + cls.ID)
-        cls.assertOutput('', raw_output)
+        # Test compute agent delete
+        del_output = self.openstack(
+            'compute agent delete ' +
+            agent_id1 + ' ' + agent_id2
+        )
+        self.assertOutput('', del_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_compute_agent_list(self):
+        """Test compute agent create and list"""
+        os1 = "os_1"
+        arch1 = "x86_64"
+        ver1 = "v1"
+        url1 = "http://localhost"
+        md5hash1 = self.MD5HASH1
+        hyper1 = "kvm"
+        cmd1 = ' '.join((os1, arch1, ver1, url1, md5hash1, hyper1))
 
-    def test_agent_set(self):
-        ver = 'v2'
-        url = "http://openstack"
-        md5hash = hashlib.md5().hexdigest()
+        cmd_output = json.loads(self.openstack(
+            'compute agent create -f json ' +
+            cmd1
+        ))
+        agent_id1 = str(cmd_output["agent_id"])
+        self.addCleanup(self.openstack, 'compute agent delete ' + agent_id1)
 
-        self.openstack('compute agent set '
-                       + self.ID
-                       + ' --agent-version ' + ver
-                       + ' --url ' + url
-                       + ' --md5hash ' + md5hash)
+        os2 = "os_2"
+        arch2 = "x86"
+        ver2 = "v2"
+        url2 = "http://openstack"
+        md5hash2 = self.MD5HASH2
+        hyper2 = "xen"
+        cmd2 = ' '.join((os2, arch2, ver2, url2, md5hash2, hyper2))
 
-        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)
+        cmd_output = json.loads(self.openstack(
+            'compute agent create -f json ' +
+            cmd2
+        ))
+        agent_id2 = str(cmd_output["agent_id"])
+        self.addCleanup(self.openstack, 'compute agent delete ' + agent_id2)
+
+        # Test compute agent list
+        cmd_output = json.loads(self.openstack(
+            'compute agent list -f json'
+        ))
+
+        hypervisors = [x["Hypervisor"] for x in cmd_output]
+        self.assertIn(hyper1, hypervisors)
+        self.assertIn(hyper2, hypervisors)
+
+        os = [x['OS'] for x in cmd_output]
+        self.assertIn(os1, os)
+        self.assertIn(os2, os)
+
+        archs = [x['Architecture'] for x in cmd_output]
+        self.assertIn(arch1, archs)
+        self.assertIn(arch2, archs)
+
+        versions = [x['Version'] for x in cmd_output]
+        self.assertIn(ver1, versions)
+        self.assertIn(ver2, versions)
+
+        md5hashes = [x['Md5Hash'] for x in cmd_output]
+        self.assertIn(md5hash1, md5hashes)
+        self.assertIn(md5hash2, md5hashes)
+
+        urls = [x['URL'] for x in cmd_output]
+        self.assertIn(url1, urls)
+        self.assertIn(url2, urls)
+
+        # Test compute agent list --hypervisor
+        cmd_output = json.loads(self.openstack(
+            'compute agent list -f json ' +
+            '--hypervisor kvm'
+        ))
+
+        hypervisors = [x["Hypervisor"] for x in cmd_output]
+        self.assertIn(hyper1, hypervisors)
+        self.assertNotIn(hyper2, hypervisors)
+
+        os = [x['OS'] for x in cmd_output]
+        self.assertIn(os1, os)
+        self.assertNotIn(os2, os)
+
+        archs = [x['Architecture'] for x in cmd_output]
+        self.assertIn(arch1, archs)
+        self.assertNotIn(arch2, archs)
+
+        versions = [x['Version'] for x in cmd_output]
+        self.assertIn(ver1, versions)
+        self.assertNotIn(ver2, versions)
+
+        md5hashes = [x['Md5Hash'] for x in cmd_output]
+        self.assertIn(md5hash1, md5hashes)
+        self.assertNotIn(md5hash2, md5hashes)
+
+        urls = [x['URL'] for x in cmd_output]
+        self.assertIn(url1, urls)
+        self.assertNotIn(url2, urls)
+
+    def test_compute_agent_set(self):
+        """Test compute agent set"""
+        os1 = "os_1"
+        arch1 = "x86_64"
+        ver1 = "v1"
+        ver2 = "v2"
+        url1 = "http://localhost"
+        url2 = "http://openstack"
+        md5hash1 = self.MD5HASH1
+        md5hash2 = self.MD5HASH2
+        hyper1 = "kvm"
+        cmd = ' '.join((os1, arch1, ver1, url1, md5hash1, hyper1))
+
+        cmd_output = json.loads(self.openstack(
+            'compute agent create -f json ' +
+            cmd
+        ))
+        agent_id = str(cmd_output["agent_id"])
+        self.assertEqual(ver1, cmd_output["version"])
+        self.assertEqual(url1, cmd_output["url"])
+        self.assertEqual(md5hash1, cmd_output["md5hash"])
+
+        self.addCleanup(self.openstack, 'compute agent delete ' + agent_id)
+
+        raw_output = self.openstack(
+            'compute agent set ' +
+            agent_id + ' ' +
+            '--agent-version ' + ver2 + ' ' +
+            '--url ' + url2 + ' ' +
+            '--md5hash ' + md5hash2
+        )
+        self.assertOutput('', raw_output)
+
+        cmd_output = json.loads(self.openstack(
+            'compute agent list -f json'
+        ))
+        self.assertEqual(ver2, cmd_output[0]["Version"])
+        self.assertEqual(url2, cmd_output[0]["URL"])
+        self.assertEqual(md5hash2, cmd_output[0]["Md5Hash"])