From 0b4fb0bb662d71a85aba251e13d403cf692d8d54 Mon Sep 17 00:00:00 2001
From: Tang Chen <tangchen@cn.fujitsu.com>
Date: Fri, 4 Dec 2015 19:48:22 +0800
Subject: [PATCH] Migrate "network create" command to use SDK.

This patch makes "network create" command use sdk.

Since we have to keep the other commands runnable with
the old network client, we use a temporary method to
create sdk network client. And as a result, the tests
need to patch a method to fake the temporary method,
which will be removed at last.

Change-Id: I06559c675be1188747257f72f18d6b4d420d0285
Implements: blueprint neutron-client
Co-Authored-By: Terry Howe <terrylhowe@gmail.com>
Co-Authored-By: Tang Chen <tangchen@cn.fujitsu.com>
---
 openstackclient/network/v2/network.py         |  15 +-
 .../tests/network/v2/test_network.py          | 158 ++++++++++++------
 2 files changed, 114 insertions(+), 59 deletions(-)

diff --git a/openstackclient/network/v2/network.py b/openstackclient/network/v2/network.py
index 48b5b5a017..3b7ae7375e 100644
--- a/openstackclient/network/v2/network.py
+++ b/openstackclient/network/v2/network.py
@@ -114,15 +114,14 @@ class CreateNetwork(show.ShowOne):
 
     def take_action(self, parsed_args):
         self.log.debug('take_action(%s)' % parsed_args)
+        self.app.client_manager.network = \
+            _make_client_sdk(self.app.client_manager)
         client = self.app.client_manager.network
         body = self.get_body(parsed_args)
-        create_method = getattr(client, "create_network")
-        data = create_method(body)['network']
-        if data:
-            data = _prep_network_detail(data)
-        else:
-            data = {'': ''}
-        return zip(*sorted(six.iteritems(data)))
+        obj = client.create_network(**body)
+        columns = sorted(obj.keys())
+        data = utils.get_item_properties(obj, columns, formatters=_formatters)
+        return (tuple(columns), data)
 
     def get_body(self, parsed_args):
         body = {'name': str(parsed_args.name),
@@ -137,7 +136,7 @@ class CreateNetwork(show.ShowOne):
                 parsed_args.project_domain,
             ).id
             body['tenant_id'] = project_id
-        return {'network': body}
+        return body
 
 
 class DeleteNetwork(command.Command):
diff --git a/openstackclient/tests/network/v2/test_network.py b/openstackclient/tests/network/v2/test_network.py
index ccf4fcd030..8648a11fb6 100644
--- a/openstackclient/tests/network/v2/test_network.py
+++ b/openstackclient/tests/network/v2/test_network.py
@@ -71,13 +71,38 @@ class TestNetwork(network_fakes.TestNetworkV2):
         self.api = self.app.client_manager.network.api
 
 
+@mock.patch('openstackclient.network.v2.network._make_client_sdk')
 class TestCreateNetworkIdentityV3(TestNetwork):
 
+    # The new network created.
+    _network = network_fakes.FakeNetwork.create_one_network(
+        attrs={'tenant_id': identity_fakes_v3.project_id}
+    )
+
+    columns = (
+        'admin_state_up',
+        'id',
+        'name',
+        'router_external',
+        'status',
+        'subnets',
+        'tenant_id',
+    )
+
+    data = (
+        network._format_admin_state(_network.admin_state_up),
+        _network.id,
+        _network.name,
+        network._format_router_external(_network.router_external),
+        _network.status,
+        utils.format_list(_network.subnets),
+        _network.tenant_id,
+    )
+
     def setUp(self):
         super(TestCreateNetworkIdentityV3, self).setUp()
 
-        self.new_network = mock.Mock(return_value=copy.deepcopy(RESPONSE))
-        self.network.create_network = self.new_network
+        self.network.create_network = mock.Mock(return_value=self._network)
 
         # Get the command object to test
         self.cmd = network.CreateNetwork(self.app, self.namespace)
@@ -106,89 +131,117 @@ class TestCreateNetworkIdentityV3(TestNetwork):
             loaded=True,
         )
 
-    def test_create_no_options(self):
+    def test_create_no_options(self, _make_client_sdk):
+        _make_client_sdk.return_value = self.app.client_manager.network
+
         arglist = [
-            FAKE_NAME,
+            self._network.name,
         ]
         verifylist = [
-            ('name', FAKE_NAME),
+            ('name', self._network.name),
             ('admin_state', True),
             ('shared', None),
             ('project', None),
         ]
 
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
-        result = list(self.cmd.take_action(parsed_args))
+        columns, data = self.cmd.take_action(parsed_args)
 
-        self.network.create_network.assert_called_with({
-            RESOURCE: {
-                'admin_state_up': True,
-                'name': FAKE_NAME,
-            }
+        self.network.create_network.assert_called_with(**{
+            'admin_state_up': True,
+            'name': self._network.name,
         })
-        self.assertEqual(FILTERED, result)
+        self.assertEqual(self.columns, columns)
+        self.assertEqual(self.data, data)
+
+    def test_create_all_options(self, _make_client_sdk):
+        _make_client_sdk.return_value = self.app.client_manager.network
 
-    def test_create_all_options(self):
         arglist = [
             "--disable",
             "--share",
             "--project", identity_fakes_v3.project_name,
             "--project-domain", identity_fakes_v3.domain_name,
-            FAKE_NAME,
+            self._network.name,
         ]
         verifylist = [
             ('admin_state', False),
             ('shared', True),
             ('project', identity_fakes_v3.project_name),
             ('project_domain', identity_fakes_v3.domain_name),
-            ('name', FAKE_NAME),
+            ('name', self._network.name),
         ]
 
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
-        result = list(self.cmd.take_action(parsed_args))
+        columns, data = (self.cmd.take_action(parsed_args))
 
-        self.network.create_network.assert_called_with({
-            RESOURCE: {
-                'admin_state_up': False,
-                'name': FAKE_NAME,
-                'shared': True,
-                'tenant_id': identity_fakes_v3.project_id,
-            }
+        self.network.create_network.assert_called_with(**{
+            'admin_state_up': False,
+            'name': self._network.name,
+            'shared': True,
+            'tenant_id': identity_fakes_v3.project_id,
         })
-        self.assertEqual(FILTERED, result)
+        self.assertEqual(self.columns, columns)
+        self.assertEqual(self.data, data)
+
+    def test_create_other_options(self, _make_client_sdk):
+        _make_client_sdk.return_value = self.app.client_manager.network
 
-    def test_create_other_options(self):
         arglist = [
             "--enable",
             "--no-share",
-            FAKE_NAME,
+            self._network.name,
         ]
         verifylist = [
             ('admin_state', True),
             ('shared', False),
-            ('name', FAKE_NAME),
+            ('name', self._network.name),
         ]
 
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
-        result = list(self.cmd.take_action(parsed_args))
+        columns, data = self.cmd.take_action(parsed_args)
 
-        self.network.create_network.assert_called_with({
-            RESOURCE: {
-                'admin_state_up': True,
-                'name': FAKE_NAME,
-                'shared': False,
-            }
+        self.network.create_network.assert_called_with(**{
+            'admin_state_up': True,
+            'name': self._network.name,
+            'shared': False,
         })
-        self.assertEqual(FILTERED, result)
+        self.assertEqual(self.columns, columns)
+        self.assertEqual(self.data, data)
 
 
+@mock.patch('openstackclient.network.v2.network._make_client_sdk')
 class TestCreateNetworkIdentityV2(TestNetwork):
 
+    # The new network created.
+    _network = network_fakes.FakeNetwork.create_one_network(
+        attrs={'tenant_id': identity_fakes_v2.project_id}
+    )
+
+    columns = (
+        'admin_state_up',
+        'id',
+        'name',
+        'router_external',
+        'status',
+        'subnets',
+        'tenant_id',
+    )
+
+    data = (
+        network._format_admin_state(_network.admin_state_up),
+        _network.id,
+        _network.name,
+        network._format_router_external(_network.router_external),
+        _network.status,
+        utils.format_list(_network.subnets),
+        _network.tenant_id,
+    )
+
     def setUp(self):
         super(TestCreateNetworkIdentityV2, self).setUp()
 
-        self.new_network = mock.Mock(return_value=copy.deepcopy(RESPONSE))
-        self.network.create_network = self.new_network
+        self.network.create_network = mock.Mock(return_value=self._network)
 
         # Get the command object to test
         self.cmd = network.CreateNetwork(self.app, self.namespace)
@@ -211,42 +264,45 @@ class TestCreateNetworkIdentityV2(TestNetwork):
 
         # There is no DomainManager Mock in fake identity v2.
 
-    def test_create_with_project_identityv2(self):
+    def test_create_with_project_identityv2(self, _make_client_sdk):
+        _make_client_sdk.return_value = self.app.client_manager.network
+
         arglist = [
             "--project", identity_fakes_v2.project_name,
-            FAKE_NAME,
+            self._network.name,
         ]
         verifylist = [
             ('admin_state', True),
             ('shared', None),
-            ('name', FAKE_NAME),
+            ('name', self._network.name),
             ('project', identity_fakes_v2.project_name),
         ]
 
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)
-        result = list(self.cmd.take_action(parsed_args))
+        columns, data = self.cmd.take_action(parsed_args)
 
-        self.network.create_network.assert_called_with({
-            RESOURCE: {
-                'admin_state_up': True,
-                'name': FAKE_NAME,
-                'tenant_id': identity_fakes_v2.project_id,
-            }
+        self.network.create_network.assert_called_with(**{
+            'admin_state_up': True,
+            'name': self._network.name,
+            'tenant_id': identity_fakes_v2.project_id,
         })
-        self.assertEqual(FILTERED, result)
+        self.assertEqual(self.columns, columns)
+        self.assertEqual(self.data, data)
+
+    def test_create_with_domain_identityv2(self, _make_client_sdk):
+        _make_client_sdk.return_value = self.app.client_manager.network
 
-    def test_create_with_domain_identityv2(self):
         arglist = [
             "--project", identity_fakes_v3.project_name,
             "--project-domain", identity_fakes_v3.domain_name,
-            FAKE_NAME,
+            self._network.name,
         ]
         verifylist = [
             ('admin_state', True),
             ('shared', None),
             ('project', identity_fakes_v3.project_name),
             ('project_domain', identity_fakes_v3.domain_name),
-            ('name', FAKE_NAME),
+            ('name', self._network.name),
         ]
 
         parsed_args = self.check_parser(self.cmd, arglist, verifylist)