From a76d38119befe654bd9ef906c55de0d334ac950a Mon Sep 17 00:00:00 2001
From: Steve Martinelli <s.martinelli@gmail.com>
Date: Fri, 13 Jan 2017 12:00:31 -0800
Subject: [PATCH] Fix network functional tests for sdk 0.9.12

it seems the SDK returns "is_default", but doesn't actually set
it based on --default or --is-default

I already had these functioanl tests mostly converted to JSON, so I dumped
that in here too to make the is_default stuff cleaner.

Change-Id: I47ca62f57c73aa7fa984ca54742fc86b6bb837c4
---
 .../functional/network/v2/test_network.py     | 229 ++++++++++--------
 1 file changed, 125 insertions(+), 104 deletions(-)

diff --git a/openstackclient/tests/functional/network/v2/test_network.py b/openstackclient/tests/functional/network/v2/test_network.py
index ef42dcceef..c55d70f9af 100644
--- a/openstackclient/tests/functional/network/v2/test_network.py
+++ b/openstackclient/tests/functional/network/v2/test_network.py
@@ -10,164 +10,173 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
-import re
+import json
 import uuid
 
-import testtools
-
 from openstackclient.tests.functional import base
 
 
 class NetworkTests(base.TestCase):
     """Functional tests for network"""
 
-    @classmethod
-    def setUpClass(cls):
-        # Set up some regex for matching below
-        cls.re_id = re.compile("id\s+\|\s+(\S+)")
-        cls.re_description = re.compile("description\s+\|\s+([^|]+?)\s+\|")
-        cls.re_enabled = re.compile("admin_state_up\s+\|\s+(\S+)")
-        cls.re_shared = re.compile("shared\s+\|\s+(\S+)")
-        cls.re_external = re.compile("router:external\s+\|\s+(\S+)")
-        cls.re_default = re.compile("is_default\s+\|\s+(\S+)")
-        cls.re_port_security = re.compile(
-            "port_security_enabled\s+\|\s+(\S+)"
-        )
-
     def test_network_delete(self):
         """Test create, delete multiple"""
         name1 = uuid.uuid4().hex
-        raw_output = self.openstack(
-            'network create ' +
+        cmd_output = json.loads(self.openstack(
+            'network create -f json ' +
             '--description aaaa ' +
             name1
-        )
+        ))
+        self.assertIsNotNone(cmd_output["id"])
         self.assertEqual(
             'aaaa',
-            re.search(self.re_description, raw_output).group(1),
+            cmd_output["description"],
         )
+
         name2 = uuid.uuid4().hex
-        raw_output = self.openstack(
-            'network create ' +
+        cmd_output = json.loads(self.openstack(
+            'network create -f json ' +
             '--description bbbb ' +
             name2
-        )
+        ))
+        self.assertIsNotNone(cmd_output["id"])
         self.assertEqual(
             'bbbb',
-            re.search(self.re_description, raw_output).group(1),
+            cmd_output["description"],
         )
 
         del_output = self.openstack('network delete ' + name1 + ' ' + name2)
         self.assertOutput('', del_output)
 
-    @testtools.skip('broken SDK testing')
     def test_network_list(self):
         """Test create defaults, list filters, delete"""
         name1 = uuid.uuid4().hex
-        raw_output = self.openstack(
-            'network create ' +
+        cmd_output = json.loads(self.openstack(
+            'network create -f json ' +
             '--description aaaa ' +
             name1
-        )
+        ))
         self.addCleanup(self.openstack, 'network delete ' + name1)
+        self.assertIsNotNone(cmd_output["id"])
         self.assertEqual(
             'aaaa',
-            re.search(self.re_description, raw_output).group(1),
+            cmd_output["description"],
         )
         # Check the default values
         self.assertEqual(
             'UP',
-            re.search(self.re_enabled, raw_output).group(1),
+            cmd_output["admin_state_up"],
         )
         self.assertEqual(
-            'False',
-            re.search(self.re_shared, raw_output).group(1),
+            False,
+            cmd_output["shared"],
         )
         self.assertEqual(
             'Internal',
-            re.search(self.re_external, raw_output).group(1),
+            cmd_output["router:external"],
         )
         # NOTE(dtroyer): is_default is not present in the create output
         #                so make sure it stays that way.
-        self.assertIsNone(re.search(self.re_default, raw_output))
+        # NOTE(stevemar): is_default *is* present in SDK 0.9.11 and newer,
+        #                 but the value seems to always be None, regardless
+        #                 of the --default or --no-default value.
+        # self.assertEqual('x', cmd_output)
+        if ('is_default' in cmd_output):
+            self.assertEqual(
+                None,
+                cmd_output["is_default"],
+            )
         self.assertEqual(
-            'True',
-            re.search(self.re_port_security, raw_output).group(1),
+            True,
+            cmd_output["port_security_enabled"],
         )
 
         name2 = uuid.uuid4().hex
-        raw_output = self.openstack(
-            'network create ' +
+        cmd_output = json.loads(self.openstack(
+            'network create -f json ' +
             '--description bbbb ' +
             '--disable ' +
             '--share ' +
             name2
-        )
+        ))
         self.addCleanup(self.openstack, 'network delete ' + name2)
+        self.assertIsNotNone(cmd_output["id"])
         self.assertEqual(
             'bbbb',
-            re.search(self.re_description, raw_output).group(1),
+            cmd_output["description"],
         )
         self.assertEqual(
             'DOWN',
-            re.search(self.re_enabled, raw_output).group(1),
+            cmd_output["admin_state_up"],
         )
         self.assertEqual(
-            'True',
-            re.search(self.re_shared, raw_output).group(1),
+            True,
+            cmd_output["shared"],
+        )
+        if ('is_default' in cmd_output):
+            self.assertEqual(
+                None,
+                cmd_output["is_default"],
+            )
+        self.assertEqual(
+            True,
+            cmd_output["port_security_enabled"],
         )
 
         # Test list --long
-        raw_output = self.openstack('network list --long')
-        self.assertIsNotNone(
-            re.search("\|\s+" + name1 + "\s+\|\s+ACTIVE", raw_output)
-        )
-        self.assertIsNotNone(
-            re.search("\|\s+" + name2 + "\s+\|\s+ACTIVE", raw_output)
-        )
+        cmd_output = json.loads(self.openstack(
+            "network list -f json " +
+            "--long"
+        ))
+        col_name = [x["Name"] for x in cmd_output]
+        self.assertIn(name1, col_name)
+        self.assertIn(name2, col_name)
 
         # Test list --long --enable
-        raw_output = self.openstack('network list --long --enable')
-        self.assertIsNotNone(
-            re.search("\|\s+" + name1 + "\s+\|\s+ACTIVE", raw_output)
-        )
-        self.assertIsNone(
-            re.search("\|\s+" + name2 + "\s+\|\s+ACTIVE", raw_output)
-        )
+        cmd_output = json.loads(self.openstack(
+            "network list -f json " +
+            "--enable " +
+            "--long"
+        ))
+        col_name = [x["Name"] for x in cmd_output]
+        self.assertIn(name1, col_name)
+        self.assertNotIn(name2, col_name)
 
         # Test list --long --disable
-        raw_output = self.openstack('network list --long --disable')
-        self.assertIsNone(
-            re.search("\|\s+" + name1 + "\s+\|\s+ACTIVE", raw_output)
-        )
-        self.assertIsNotNone(
-            re.search("\|\s+" + name2 + "\s+\|\s+ACTIVE", raw_output)
-        )
+        cmd_output = json.loads(self.openstack(
+            "network list -f json " +
+            "--disable " +
+            "--long"
+        ))
+        col_name = [x["Name"] for x in cmd_output]
+        self.assertNotIn(name1, col_name)
+        self.assertIn(name2, col_name)
 
         # Test list --long --share
-        raw_output = self.openstack('network list --long --share')
-        self.assertIsNone(
-            re.search("\|\s+" + name1 + "\s+\|\s+ACTIVE", raw_output)
-        )
-        self.assertIsNotNone(
-            re.search("\|\s+" + name2 + "\s+\|\s+ACTIVE", raw_output)
-        )
+        cmd_output = json.loads(self.openstack(
+            "network list -f json " +
+            "--share " +
+            "--long"
+        ))
+        col_name = [x["Name"] for x in cmd_output]
+        self.assertNotIn(name1, col_name)
+        self.assertIn(name2, col_name)
 
         # Test list --long --no-share
-        raw_output = self.openstack('network list --long --no-share')
-        self.assertIsNotNone(
-            re.search("\|\s+" + name1 + "\s+\|\s+ACTIVE", raw_output)
-        )
-        self.assertIsNone(
-            re.search("\|\s+" + name2 + "\s+\|\s+ACTIVE", raw_output)
-        )
+        cmd_output = json.loads(self.openstack(
+            "network list -f json " +
+            "--no-share " +
+            "--long"
+        ))
+        col_name = [x["Name"] for x in cmd_output]
+        self.assertIn(name1, col_name)
+        self.assertNotIn(name2, col_name)
 
-    @testtools.skip('broken SDK testing')
     def test_network_set(self):
         """Tests create options, set, show, delete"""
         name = uuid.uuid4().hex
-        raw_output = self.openstack(
-            'network create ' +
+        cmd_output = json.loads(self.openstack(
+            'network create -f json ' +
             '--description aaaa ' +
             '--enable ' +
             '--no-share ' +
@@ -175,30 +184,38 @@ class NetworkTests(base.TestCase):
             '--no-default ' +
             '--enable-port-security ' +
             name
-        )
+        ))
         self.addCleanup(self.openstack, 'network delete ' + name)
+        self.assertIsNotNone(cmd_output["id"])
         self.assertEqual(
             'aaaa',
-            re.search(self.re_description, raw_output).group(1),
+            cmd_output["description"],
         )
         self.assertEqual(
             'UP',
-            re.search(self.re_enabled, raw_output).group(1),
+            cmd_output["admin_state_up"],
         )
         self.assertEqual(
-            'False',
-            re.search(self.re_shared, raw_output).group(1),
+            False,
+            cmd_output["shared"],
         )
         self.assertEqual(
             'Internal',
-            re.search(self.re_external, raw_output).group(1),
+            cmd_output["router:external"],
         )
         # NOTE(dtroyer): is_default is not present in the create output
         #                so make sure it stays that way.
-        self.assertIsNone(re.search(self.re_default, raw_output))
+        # NOTE(stevemar): is_default *is* present in SDK 0.9.11 and newer,
+        #                 but the value seems to always be None, regardless
+        #                 of the --default or --no-default value.
+        if ('is_default' in cmd_output):
+            self.assertEqual(
+                None,
+                cmd_output["is_default"],
+            )
         self.assertEqual(
-            'True',
-            re.search(self.re_port_security, raw_output).group(1),
+            True,
+            cmd_output["port_security_enabled"],
         )
 
         raw_output = self.openstack(
@@ -212,32 +229,34 @@ class NetworkTests(base.TestCase):
         )
         self.assertOutput('', raw_output)
 
-        raw_output = self.openstack('network show ' + name)
+        cmd_output = json.loads(self.openstack(
+            'network show -f json ' + name
+        ))
 
         self.assertEqual(
             'cccc',
-            re.search(self.re_description, raw_output).group(1),
+            cmd_output["description"],
         )
         self.assertEqual(
             'DOWN',
-            re.search(self.re_enabled, raw_output).group(1),
+            cmd_output["admin_state_up"],
         )
         self.assertEqual(
-            'True',
-            re.search(self.re_shared, raw_output).group(1),
+            True,
+            cmd_output["shared"],
         )
         self.assertEqual(
             'External',
-            re.search(self.re_external, raw_output).group(1),
+            cmd_output["router:external"],
         )
         # why not 'None' like above??
         self.assertEqual(
-            'False',
-            re.search(self.re_default, raw_output).group(1),
+            False,
+            cmd_output["is_default"],
         )
         self.assertEqual(
-            'False',
-            re.search(self.re_port_security, raw_output).group(1),
+            False,
+            cmd_output["port_security_enabled"],
         )
 
         # NOTE(dtroyer): There is ambiguity around is_default in that
@@ -252,14 +271,16 @@ class NetworkTests(base.TestCase):
         )
         self.assertOutput('', raw_output)
 
-        raw_output = self.openstack('network show ' + name)
+        cmd_output = json.loads(self.openstack(
+            'network show -f json ' + name
+        ))
 
         self.assertEqual(
             'cccc',
-            re.search(self.re_description, raw_output).group(1),
+            cmd_output["description"],
         )
         # NOTE(dtroyer): This should be 'True'
         self.assertEqual(
-            'False',
-            re.search(self.re_default, raw_output).group(1),
+            False,
+            cmd_output["port_security_enabled"],
         )