Migrate network client to SDK.

The previous patches have migrate all network commands to
the new version using sdk. This patch will remove the
temporary method, and implement a new make_client() to
create sdk network client.

And also, find() in openstackclient/network/common.py must
support sdk. The logic of this function will become much
easier than before, so this patch also removes two useless
test cases of find().

This patch will also remove the patched methods in tests.

Change-Id: Ic2f7bca073beb9757172d16f95d9b82c48cbbc12
Implements: blueprint neutron-client
Co-Authored-By: Terry Howe <terrylhowe@gmail.com>
Co-Authored-By: Tang Chen <tangchen@cn.fujitsu.com>
This commit is contained in:
Tang Chen 2015-12-04 16:30:10 +08:00
parent 2a2cb4f75d
commit 4be716eb27
6 changed files with 48 additions and 163 deletions
openstackclient

@ -13,6 +13,8 @@
import logging
from openstack import connection
from openstackclient.common import utils
@ -22,62 +24,18 @@ DEFAULT_API_VERSION = '2.0'
API_VERSION_OPTION = 'os_network_api_version'
API_NAME = "network"
API_VERSIONS = {
"2.0": "neutronclient.v2_0.client.Client",
"2": "neutronclient.v2_0.client.Client",
}
# Translate our API version to auth plugin version prefix
API_VERSION_MAP = {
'2.0': 'v2.0',
'2': 'v2.0',
}
NETWORK_API_TYPE = 'network'
NETWORK_API_VERSIONS = {
'2.0': 'openstackclient.api.network_v2.APIv2',
'2': 'openstackclient.api.network_v2.APIv2',
"2.0": "openstack.connection.Connection",
"2": "openstack.connection.Connection",
}
def make_client(instance):
"""Returns an network service client"""
network_client = utils.get_client_class(
API_NAME,
instance._api_version[API_NAME],
API_VERSIONS)
LOG.debug('Instantiating network client: %s', network_client)
endpoint = instance.get_endpoint_for_service_type(
API_NAME,
region_name=instance._region_name,
interface=instance._interface,
)
# Remember endpoint_type only if it is set
kwargs = utils.build_kwargs_dict('endpoint_type', instance._interface)
client = network_client(
session=instance.session,
region_name=instance._region_name,
**kwargs
)
network_api = utils.get_client_class(
API_NAME,
instance._api_version[API_NAME],
NETWORK_API_VERSIONS)
LOG.debug('Instantiating network api: %s', network_client)
# v2 is hard-coded until discovery is completed, neutron only has one atm
client.api = network_api(
session=instance.session,
service_type=NETWORK_API_TYPE,
endpoint='/'.join([
endpoint,
API_VERSION_MAP[instance._api_version[API_NAME]],
])
)
return client
"""Returns a network proxy"""
conn = connection.Connection(authenticator=instance.session.auth)
LOG.debug('Connection: %s', conn)
LOG.debug('Network client initialized using OpenStack SDK: %s',
conn.network)
return conn.network
def build_option_parser(parser):

@ -11,8 +11,6 @@
# under the License.
#
from openstackclient.common import exceptions
def find(client, resource, resources, name_or_id, name_attr='name'):
"""Find a network resource
@ -26,22 +24,6 @@ def find(client, resource, resources, name_or_id, name_attr='name'):
For example:
n = find(netclient, 'network', 'networks', 'matrix')
"""
list_method = getattr(client, "list_%s" % resources)
# Search by name
kwargs = {name_attr: name_or_id, 'fields': 'id'}
data = list_method(**kwargs)
info = data[resources]
if len(info) == 1:
return info[0]['id']
if len(info) > 1:
msg = "More than one %s exists with the name '%s'."
raise exceptions.CommandError(msg % (resource, name_or_id))
# Search by id
data = list_method(id=name_or_id, fields='id')
info = data[resources]
if len(info) == 1:
return info[0]['id']
msg = "No %s with a name or ID of '%s' exists." % (resource, name_or_id)
raise exceptions.CommandError(msg)
list_method = getattr(client, "find_%s" % resource)
data = list_method(name_or_id, ignore_missing=False)
return data.id

@ -19,8 +19,6 @@ from cliff import command
from cliff import lister
from cliff import show
from openstack import connection
from openstackclient.common import exceptions
from openstackclient.common import utils
from openstackclient.identity import common as identity_common
@ -41,12 +39,6 @@ _formatters = {
}
def _make_client_sdk(instance):
"""Return a network proxy"""
conn = connection.Connection(authenticator=instance.session.auth)
return conn.network
class CreateNetwork(show.ShowOne):
"""Create new network"""
@ -96,8 +88,6 @@ 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)
obj = client.create_network(**body)
@ -138,8 +128,6 @@ class DeleteNetwork(command.Command):
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
for network in parsed_args.networks:
obj = client.find_network(network)
@ -170,8 +158,6 @@ class ListNetwork(lister.Lister):
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
if parsed_args.long:
@ -270,8 +256,6 @@ class SetNetwork(command.Command):
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
obj = client.find_network(parsed_args.identifier, ignore_missing=False)
@ -306,8 +290,6 @@ class ShowNetwork(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
obj = client.find_network(parsed_args.identifier, ignore_missing=False)
columns = sorted(obj.keys())

@ -231,6 +231,18 @@ class TestServerCreate(TestServer):
list_networks.return_value = {'networks': [{'id': 'net1_uuid'}]}
list_ports.return_value = {'ports': [{'id': 'port1_uuid'}]}
# Mock sdk APIs.
_network = mock.Mock()
_network.id = 'net1_uuid'
_port = mock.Mock()
_port.id = 'port1_uuid'
find_network = mock.Mock()
find_port = mock.Mock()
find_network.return_value = _network
find_port.return_value = _port
self.app.client_manager.network.find_network = find_network
self.app.client_manager.network.find_port = find_port
# DisplayCommandBase.take_action() returns two tuples
columns, data = self.cmd.take_action(parsed_args)

@ -13,7 +13,6 @@
import mock
from openstackclient.common import exceptions
from openstackclient.network import common
from openstackclient.tests import utils
@ -28,45 +27,31 @@ class TestFind(utils.TestCase):
super(TestFind, self).setUp()
self.mock_client = mock.Mock()
self.list_resources = mock.Mock()
self.mock_client.list_resources = self.list_resources
self.matrix = {'id': ID}
self.mock_client.find_resource = self.list_resources
self.resource = mock.Mock()
self.resource.id = ID
def test_name(self):
self.list_resources.return_value = {RESOURCES: [self.matrix]}
self.list_resources.return_value = self.resource
result = common.find(self.mock_client, RESOURCE, RESOURCES, NAME)
self.assertEqual(ID, result)
self.list_resources.assert_called_with(fields='id', name=NAME)
self.list_resources.assert_called_with(NAME, ignore_missing=False)
def test_id(self):
self.list_resources.side_effect = [{RESOURCES: []},
{RESOURCES: [self.matrix]}]
self.list_resources.return_value = self.resource
result = common.find(self.mock_client, RESOURCE, RESOURCES, NAME)
self.assertEqual(ID, result)
self.list_resources.assert_called_with(fields='id', id=NAME)
self.list_resources.assert_called_with(NAME, ignore_missing=False)
def test_nameo(self):
self.list_resources.return_value = {RESOURCES: [self.matrix]}
self.list_resources.return_value = self.resource
result = common.find(self.mock_client, RESOURCE, RESOURCES, NAME,
name_attr='nameo')
self.assertEqual(ID, result)
self.list_resources.assert_called_with(fields='id', nameo=NAME)
def test_dups(self):
dup = {'id': 'Larry'}
self.list_resources.return_value = {RESOURCES: [self.matrix, dup]}
self.assertRaises(exceptions.CommandError, common.find,
self.mock_client, RESOURCE, RESOURCES, NAME)
def test_nada(self):
self.list_resources.side_effect = [{RESOURCES: []},
{RESOURCES: []}]
self.assertRaises(exceptions.CommandError, common.find,
self.mock_client, RESOURCE, RESOURCES, NAME)
self.list_resources.assert_called_with(NAME, ignore_missing=False)

@ -72,7 +72,6 @@ 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.
@ -132,9 +131,7 @@ class TestCreateNetworkIdentityV3(TestNetwork):
loaded=True,
)
def test_create_no_options(self, _make_client_sdk):
_make_client_sdk.return_value = self.app.client_manager.network
def test_create_no_options(self):
arglist = [
self._network.name,
]
@ -155,9 +152,7 @@ class TestCreateNetworkIdentityV3(TestNetwork):
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",
@ -185,9 +180,7 @@ class TestCreateNetworkIdentityV3(TestNetwork):
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",
@ -211,7 +204,6 @@ class TestCreateNetworkIdentityV3(TestNetwork):
self.assertEqual(self.data, data)
@mock.patch('openstackclient.network.v2.network._make_client_sdk')
class TestCreateNetworkIdentityV2(TestNetwork):
# The new network created.
@ -265,9 +257,7 @@ class TestCreateNetworkIdentityV2(TestNetwork):
# There is no DomainManager Mock in fake identity v2.
def test_create_with_project_identityv2(self, _make_client_sdk):
_make_client_sdk.return_value = self.app.client_manager.network
def test_create_with_project_identityv2(self):
arglist = [
"--project", identity_fakes_v2.project_name,
self._network.name,
@ -290,9 +280,7 @@ class TestCreateNetworkIdentityV2(TestNetwork):
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,
@ -315,7 +303,6 @@ class TestCreateNetworkIdentityV2(TestNetwork):
)
@mock.patch('openstackclient.network.v2.network._make_client_sdk')
class TestDeleteNetwork(TestNetwork):
# The network to delete.
@ -331,9 +318,7 @@ class TestDeleteNetwork(TestNetwork):
# Get the command object to test
self.cmd = network.DeleteNetwork(self.app, self.namespace)
def test_delete(self, _make_client_sdk):
_make_client_sdk.return_value = self.app.client_manager.network
def test_delete(self):
arglist = [
self._network.name,
]
@ -348,7 +333,6 @@ class TestDeleteNetwork(TestNetwork):
self.assertEqual(None, result)
@mock.patch('openstackclient.network.v2.network._make_client_sdk')
class TestListNetwork(TestNetwork):
# The networks going to be listed up.
@ -401,9 +385,7 @@ class TestListNetwork(TestNetwork):
self.network.networks = mock.Mock(return_value=self._network)
def test_network_list_no_options(self, _make_client_sdk):
_make_client_sdk.return_value = self.app.client_manager.network
def test_network_list_no_options(self):
arglist = []
verifylist = [
('external', False),
@ -418,9 +400,7 @@ class TestListNetwork(TestNetwork):
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
def test_list_external(self, _make_client_sdk):
_make_client_sdk.return_value = self.app.client_manager.network
def test_list_external(self):
arglist = [
'--external',
]
@ -439,9 +419,7 @@ class TestListNetwork(TestNetwork):
self.assertEqual(self.columns, columns)
self.assertEqual(self.data, list(data))
def test_network_list_long(self, _make_client_sdk):
_make_client_sdk.return_value = self.app.client_manager.network
def test_network_list_long(self):
arglist = [
'--long',
]
@ -459,7 +437,6 @@ class TestListNetwork(TestNetwork):
self.assertEqual(self.data_long, list(data))
@mock.patch('openstackclient.network.v2.network._make_client_sdk')
class TestSetNetwork(TestNetwork):
# The network to set.
@ -475,9 +452,7 @@ class TestSetNetwork(TestNetwork):
# Get the command object to test
self.cmd = network.SetNetwork(self.app, self.namespace)
def test_set_this(self, _make_client_sdk):
_make_client_sdk.return_value = self.app.client_manager.network
def test_set_this(self):
self._network.is_dirty = True
arglist = [
@ -499,9 +474,7 @@ class TestSetNetwork(TestNetwork):
self.network.update_network.assert_called_with(self._network)
self.assertEqual(None, result)
def test_set_that(self, _make_client_sdk):
_make_client_sdk.return_value = self.app.client_manager.network
def test_set_that(self):
self._network.is_dirty = True
arglist = [
@ -521,9 +494,7 @@ class TestSetNetwork(TestNetwork):
self.network.update_network.assert_called_with(self._network)
self.assertEqual(None, result)
def test_set_nothing(self, _make_client_sdk):
_make_client_sdk.return_value = self.app.client_manager.network
def test_set_nothing(self):
self._network.is_dirty = False
arglist = [self._network.name, ]
@ -534,7 +505,6 @@ class TestSetNetwork(TestNetwork):
parsed_args)
@mock.patch('openstackclient.network.v2.network._make_client_sdk')
class TestShowNetwork(TestNetwork):
# The network to set.
@ -568,9 +538,7 @@ class TestShowNetwork(TestNetwork):
# Get the command object to test
self.cmd = network.ShowNetwork(self.app, self.namespace)
def test_show_no_options(self, _make_client_sdk):
_make_client_sdk.return_value = self.app.client_manager.network
def test_show_no_options(self):
arglist = []
verifylist = []
@ -580,9 +548,7 @@ class TestShowNetwork(TestNetwork):
except tests_utils.ParserException:
pass
def test_show_all_options(self, _make_client_sdk):
_make_client_sdk.return_value = self.app.client_manager.network
def test_show_all_options(self):
arglist = [
self._network.name,
]