fix get_vim_resource_id() to support list_networks()

add neutron filter name and not unique exception

Co-Authored-By: Yan Xing an <yanxingan@cmss.​chinamobile.​com>
Closes-Bug: #1667236

Change-Id: I1b8dddff92a7ef7d11ba3d06254f4686df8deff3
This commit is contained in:
Jimmy.Ye 2017-02-23 18:20:50 +08:00 committed by Yan Xing'an
parent f23c0c5964
commit 7bbafc8120
4 changed files with 84 additions and 11 deletions

View File

@ -70,7 +70,17 @@ class VimUnsupportedResourceTypeException(exceptions.TackerException):
class VimGetResourceException(exceptions.TackerException):
message = _("Error while trying to issue %(cmd)s to find resource type "
"%(type)s")
"%(type)s by resource name %(name)s")
class VimGetResourceNameNotUnique(exceptions.TackerException):
message = _("Getting resource id from VIM with resource name %(name)s "
"by %(cmd)s returns more than one")
class VimGetResourceNotFoundException(exceptions.TackerException):
message = _("Getting resource id from VIM with resource name %(name)s "
"by %(cmd)s returns nothing")
class VimFromVnfNotFoundException(exceptions.NotFound):

View File

@ -58,7 +58,9 @@ cfg.CONF.register_opts(OPTS, 'vim_keys')
cfg.CONF.register_opts(OPENSTACK_OPTS, 'vim_monitor')
_VALID_RESOURCE_TYPES = {'network': {'client': neutron_client.Client,
'cmd': 'list_'
'cmd': 'list_networks',
'vim_res_name': 'networks',
'filter_attr': 'name'
}
}
@ -265,21 +267,34 @@ class OpenStack_Driver(abstract_vim_driver.VimAbstractDriver,
:return: ID of resource
"""
if resource_type in _VALID_RESOURCE_TYPES.keys():
client_type = _VALID_RESOURCE_TYPES[resource_type]['client']
cmd_prefix = _VALID_RESOURCE_TYPES[resource_type]['cmd']
res_cmd_map = _VALID_RESOURCE_TYPES[resource_type]
client_type = res_cmd_map['client']
cmd = res_cmd_map['cmd']
filter_attr = res_cmd_map.get('filter_attr')
vim_res_name = res_cmd_map['vim_res_name']
else:
raise nfvo.VimUnsupportedResourceTypeException(type=resource_type)
client = self._get_client(vim_obj, client_type)
cmd = str(cmd_prefix) + str(resource_name)
cmd_args = {}
if filter_attr:
cmd_args[filter_attr] = resource_name
try:
resources = getattr(client, "%s" % cmd)()
resources = getattr(client, "%s" % cmd)(**cmd_args)[vim_res_name]
LOG.debug(_('resources output %s'), resources)
for resource in resources[resource_type]:
if resource['name'] == resource_name:
return resource['id']
except Exception:
raise nfvo.VimGetResourceException(cmd=cmd, type=resource_type)
raise nfvo.VimGetResourceException(
cmd=cmd, name=resource_name, type=resource_type)
if len(resources) > 1:
raise nfvo.VimGetResourceNameNotUnique(
cmd=cmd, name=resource_name)
elif len(resources) < 1:
raise nfvo.VimGetResourceNotFoundException(
cmd=cmd, name=resource_name)
return resources[0]['id']
@log.log
def _get_client(self, vim_obj, client_type):

View File

@ -424,7 +424,7 @@ class NfvoPlugin(nfvo_db.NfvoPluginDb, vnffg_db.VnffgPluginDbMixin,
driver_type = vim_obj['type']
return self._vim_drivers.invoke(driver_type,
'get_vim_resource_id',
vim_auth=vim_obj['auth_cred'],
vim_obj=vim_obj,
resource_type=resource,
resource_name=name)

View File

@ -33,6 +33,10 @@ class FakeKeystone(mock.Mock):
pass
class FakeNeutronClient(mock.Mock):
pass
class mock_dict(dict):
def __getattr__(self, item):
return self.get(item)
@ -139,3 +143,47 @@ class TestOpenstack_Driver(base.TestCase):
mock_ks_client.regions.list.assert_called_once_with()
self.keystone.initialize_client.assert_called_once_with(
version=keystone_version, **self.auth_obj)
def test_get_vim_resource_id(self):
resource_type = 'network'
resource_name = 'net0'
fake_networks = {'networks': [{'id': 'fake-uuid', 'name': 'net0'}]}
fake_neutron_client = FakeNeutronClient()
fake_neutron_client.list_networks.return_value = fake_networks
self.openstack_driver._get_client = mock.Mock(
return_value=fake_neutron_client)
self.openstack_driver.get_vim_resource_id(
self.vim_obj, resource_type, resource_name)
self.openstack_driver._get_client.assert_called_once_with(
self.vim_obj, mock.ANY)
fake_neutron_client.list_networks.assert_called_once_with(
**{'name': 'net0'})
def test_get_vim_resource_id_name_not_unique(self):
resource_type = 'network'
resource_name = 'net0'
fake_networks = {'networks': [{'id': 'fake-uuid-1', 'name': 'net0'},
{'id': 'fake-uuid-2', 'name': 'net0'}]}
fake_neutron_client = FakeNeutronClient()
fake_neutron_client.list_networks.return_value = fake_networks
self.openstack_driver._get_client = mock.Mock(
return_value=fake_neutron_client)
self.assertRaises(nfvo.VimGetResourceNameNotUnique,
self.openstack_driver.get_vim_resource_id,
self.vim_obj, resource_type, resource_name)
def test_get_vim_resource_id_name_not_exist(self):
resource_type = 'network'
resource_name = 'net0'
fake_networks = {'networks': []}
fake_neutron_client = FakeNeutronClient()
fake_neutron_client.list_networks.return_value = fake_networks
self.openstack_driver._get_client = mock.Mock(
return_value=fake_neutron_client)
self.assertRaises(nfvo.VimGetResourceNotFoundException,
self.openstack_driver.get_vim_resource_id,
self.vim_obj, resource_type, resource_name)