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:
parent
f23c0c5964
commit
7bbafc8120
|
@ -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):
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue