From 289f15a81468e3e134218bf1c2833102b6365f47 Mon Sep 17 00:00:00 2001
From: Nakul Dahiwade <nakul.dahiwade@intel.com>
Date: Wed, 1 Mar 2017 21:15:10 +0000
Subject: [PATCH] Jsonify meter and meter rule functional tests

Some functional tests try to parse the CLI table output
format, that cause much work on parse string by using
regular expression. Using json format in functional tests
is better and easier way, this patch reworks for meter and
meter rule related tests.

Change-Id: I1f2a95c873a4ed23dd1afa4040900a1c7704d0bf
---
 .../network/v2/test_network_meter.py          | 116 +++++++++++++-----
 .../network/v2/test_network_meter_rule.py     |  83 ++++++++-----
 2 files changed, 135 insertions(+), 64 deletions(-)

diff --git a/openstackclient/tests/functional/network/v2/test_network_meter.py b/openstackclient/tests/functional/network/v2/test_network_meter.py
index 7dce34e7e3..f73f481297 100644
--- a/openstackclient/tests/functional/network/v2/test_network_meter.py
+++ b/openstackclient/tests/functional/network/v2/test_network_meter.py
@@ -13,7 +13,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import re
+import json
 import uuid
 
 from openstackclient.tests.functional import base
@@ -27,37 +27,45 @@ class TestMeter(base.TestCase):
     #                has its own needs and there are collisions when running
     #                tests in parallel.
 
-    @classmethod
-    def setUpClass(cls):
-        # Set up some regex for matching below
-        cls.re_name = re.compile("name\s+\|\s+([^|]+?)\s+\|")
-        cls.re_shared = re.compile("shared\s+\|\s+(\S+)")
-        cls.re_description = re.compile("description\s+\|\s+([^|]+?)\s+\|")
-
     def test_meter_delete(self):
         """Test create, delete multiple"""
         name1 = uuid.uuid4().hex
         name2 = uuid.uuid4().hex
-
-        raw_output = self.openstack(
-            'network meter create ' + name1,
+        description = 'fakedescription'
+        json_output = json.loads(self.openstack(
+            'network meter create -f json ' + name1 + ' --description '
+            + description)
         )
         self.assertEqual(
             name1,
-            re.search(self.re_name, raw_output).group(1),
+            json_output.get('name'),
         )
         # Check if default shared values
         self.assertEqual(
-            'False',
-            re.search(self.re_shared, raw_output).group(1)
+            False,
+            json_output.get('shared')
+        )
+        self.assertEqual(
+            'fakedescription',
+            json_output.get('description')
         )
 
-        raw_output = self.openstack(
-            'network meter create ' + name2,
+        json_output_2 = json.loads(self.openstack(
+            'network meter create -f json ' + name2 + ' --description '
+            + description)
         )
         self.assertEqual(
             name2,
-            re.search(self.re_name, raw_output).group(1),
+            json_output_2.get('name'),
+        )
+        # Check if default shared values
+        self.assertEqual(
+            False,
+            json_output_2.get('shared')
+        )
+        self.assertEqual(
+            'fakedescription',
+            json_output_2.get('description')
         )
 
         raw_output = self.openstack(
@@ -68,35 +76,83 @@ class TestMeter(base.TestCase):
     def test_meter_list(self):
         """Test create, list filters, delete"""
         name1 = uuid.uuid4().hex
-        raw_output = self.openstack(
-            'network meter create --description Test1 --share ' + name1,
+        json_output = json.loads(self.openstack(
+            'network meter create -f json --description Test1 --share '
+            + name1)
         )
         self.addCleanup(self.openstack, 'network meter delete ' + name1)
 
         self.assertEqual(
             'Test1',
-            re.search(self.re_description, raw_output).group(1),
+            json_output.get('description'),
         )
         self.assertEqual(
-            'True',
-            re.search(self.re_shared, raw_output).group(1),
+            True,
+            json_output.get('shared'),
         )
 
         name2 = uuid.uuid4().hex
-        raw_output = self.openstack(
-            'network meter create --description Test2 --no-share ' + name2,
+        json_output_2 = json.loads(self.openstack(
+            'network meter create -f json --description Test2 --no-share '
+            + name2)
         )
         self.addCleanup(self.openstack, 'network meter delete ' + name2)
 
         self.assertEqual(
             'Test2',
-            re.search(self.re_description, raw_output).group(1),
+            json_output_2.get('description')
         )
         self.assertEqual(
-            'False',
-            re.search(self.re_shared, raw_output).group(1),
+            False,
+            json_output_2.get('shared')
         )
 
-        raw_output = self.openstack('network meter list')
-        self.assertIsNotNone(re.search(name1 + "\s+\|\s+Test1", raw_output))
-        self.assertIsNotNone(re.search(name2 + "\s+\|\s+Test2", raw_output))
+        raw_output = json.loads(self.openstack('network meter list -f json'))
+        name_list = [item.get('Name') for item in raw_output]
+        self.assertIn(name1, name_list)
+        self.assertIn(name2, name_list)
+
+    def test_meter_show(self):
+        """Test create, show, delete"""
+        name1 = uuid.uuid4().hex
+        description = 'fakedescription'
+        json_output = json.loads(self.openstack(
+            'network meter create -f json ' + name1 + ' --description '
+            + description)
+        )
+        meter_id = json_output.get('id')
+        self.addCleanup(self.openstack, 'network meter delete ' + name1)
+
+        # Test show with ID
+        json_output = json.loads(self.openstack(
+            'network meter show -f json ' + meter_id)
+        )
+        self.assertEqual(
+            False,
+            json_output.get('shared')
+        )
+        self.assertEqual(
+            'fakedescription',
+            json_output.get('description')
+        )
+        self.assertEqual(
+            name1,
+            json_output.get('name')
+        )
+
+        # Test show with name
+        json_output = json.loads(self.openstack(
+            'network meter show -f json ' + name1)
+        )
+        self.assertEqual(
+            meter_id,
+            json_output.get('id')
+        )
+        self.assertEqual(
+            False,
+            json_output.get('shared')
+        )
+        self.assertEqual(
+            'fakedescription',
+            json_output.get('description')
+        )
diff --git a/openstackclient/tests/functional/network/v2/test_network_meter_rule.py b/openstackclient/tests/functional/network/v2/test_network_meter_rule.py
index 4f079e3ce2..d15cdf77a8 100644
--- a/openstackclient/tests/functional/network/v2/test_network_meter_rule.py
+++ b/openstackclient/tests/functional/network/v2/test_network_meter_rule.py
@@ -13,7 +13,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import re
+import json
 import uuid
 
 from openstackclient.tests.functional import base
@@ -27,19 +27,11 @@ class TestMeterRule(base.TestCase):
 
     @classmethod
     def setUpClass(cls):
-        # Set up some regex for matching below
-        cls.re_id = re.compile("id\s+\|\s+(\S+)")
-        cls.re_direction = re.compile("direction\s+\|\s+(\S+)")
-        cls.re_ip_prefix = re.compile(
-            "remote_ip_prefix\s+\|\s+([^|]+?)\s+\|"
-        )
-        cls.re_meter_id = re.compile("metering_label_id\s+\|\s+(\S+)")
+        json_output = json.loads(cls.openstack(
+            'network meter create -f json ' + cls.METER_NAME
+        ))
 
-        raw_output = cls.openstack(
-            'network meter create ' + cls.METER_NAME
-        )
-
-        cls.METER_ID = re.search(cls.re_id, raw_output).group(1)
+        cls.METER_ID = json_output.get('id')
 
     @classmethod
     def tearDownClass(cls):
@@ -49,58 +41,81 @@ class TestMeterRule(base.TestCase):
     def test_meter_rule_delete(self):
         """test create, delete"""
 
-        raw_output = self.openstack(
-            'network meter rule create ' +
+        json_output = json.loads(self.openstack(
+            'network meter rule create -f json ' +
             '--remote-ip-prefix 10.0.0.0/8 ' +
             self.METER_ID
-        )
-        rule_id = re.search(self.re_id, raw_output).group(1)
-        re_ip = re.search(self.re_ip_prefix, raw_output)
+        ))
+        rule_id = json_output.get('id')
+        re_ip = json_output.get('remote_ip_prefix')
 
         self.addCleanup(self.openstack,
                         'network meter rule delete ' + rule_id)
         self.assertIsNotNone(re_ip)
         self.assertIsNotNone(rule_id)
+        self.assertEqual(
+            '10.0.0.0/8', re_ip
+        )
 
     def test_meter_rule_list(self):
         """Test create, list, delete"""
-        raw_output = self.openstack(
-            'network meter rule create ' +
+        json_output = json.loads(self.openstack(
+            'network meter rule create -f json ' +
             '--remote-ip-prefix 10.0.0.0/8 ' +
             self.METER_ID
-        )
-        rule_id = re.search(self.re_id, raw_output).group(1)
+        ))
+        rule_id_1 = json_output.get('id')
         self.addCleanup(self.openstack,
-                        'network meter rule delete ' + rule_id)
+                        'network meter rule delete ' + rule_id_1)
         self.assertEqual(
             '10.0.0.0/8',
-            re.search(self.re_ip_prefix, raw_output).group(1)
+            json_output.get('remote_ip_prefix')
         )
 
-        raw_output = self.openstack('network meter rule list')
-        self.assertIsNotNone(re.search(rule_id + "|\s+\|\s+\|\s+10.0.0.0/8",
-                                       raw_output))
+        json_output_1 = json.loads(self.openstack(
+            'network meter rule create -f json ' +
+            '--remote-ip-prefix 11.0.0.0/8 ' +
+            self.METER_ID
+        ))
+        rule_id_2 = json_output_1.get('id')
+        self.addCleanup(self.openstack,
+                        'network meter rule delete ' + rule_id_2)
+        self.assertEqual(
+            '11.0.0.0/8',
+            json_output_1.get('remote_ip_prefix')
+        )
+
+        json_output = json.loads(self.openstack('network meter rule list -f '
+                                                'json'))
+        rule_id_list = [item.get('ID') for item in json_output]
+        ip_prefix_list = [item.get('Remote IP Prefix') for item in json_output]
+        self.assertIn(rule_id_1, rule_id_list)
+        self.assertIn(rule_id_2, rule_id_list)
+        self.assertIn('10.0.0.0/8', ip_prefix_list)
+        self.assertIn('11.0.0.0/8', ip_prefix_list)
 
     def test_meter_rule_show(self):
+
         """Test create, show, delete"""
-        raw_output = self.openstack(
-            'network meter rule create ' +
+        json_output = json.loads(self.openstack(
+            'network meter rule create -f json ' +
             '--remote-ip-prefix 10.0.0.0/8 ' +
             '--egress ' +
             self.METER_ID
-        )
-        rule_id = re.search(self.re_id, raw_output).group(1)
+        ))
+        rule_id = json_output.get('id')
 
         self.assertEqual(
             'egress',
-            re.search(self.re_direction, raw_output).group(1)
+            json_output.get('direction')
         )
 
-        raw_output = self.openstack('network meter rule show ' + rule_id)
+        json_output = json.loads(self.openstack('network meter rule show'
+                                                ' -f json ' + rule_id))
 
         self.assertEqual(
             '10.0.0.0/8',
-            re.search(self.re_ip_prefix, raw_output).group(1)
+            json_output.get('remote_ip_prefix')
         )
         self.assertIsNotNone(rule_id)