Fix usage of novaclient

We should use 'client interface' for initialization of novaclient
instead of direct import of some specific client.

Change-Id: I51254e20151fe1d6771897e64a8d0bdf2d674d03
Closes-Bug: #1493576
This commit is contained in:
Ivan Kolodyazhny 2015-09-11 14:23:02 +03:00
parent 5be886df36
commit c131767a19
4 changed files with 32 additions and 22 deletions

View File

@ -17,12 +17,9 @@ Handles all requests to Nova.
"""
from novaclient import client as nova_client
from novaclient import exceptions as nova_exceptions
from novaclient import extension
from novaclient import service_catalog
from novaclient.v2 import client as nova_client
from novaclient.v2.contrib import assisted_volume_snapshots
from novaclient.v2.contrib import list_extensions
from oslo_config import cfg
from oslo_log import log as logging
from requests import exceptions as request_exceptions
@ -65,8 +62,11 @@ CONF.register_opts(nova_opts)
LOG = logging.getLogger(__name__)
nova_extensions = (assisted_volume_snapshots,
extension.Extension('list_extensions', list_extensions))
# TODO(e0ne): Make Nova version configurable in Mitaka.
NOVA_API_VERSION = 2
nova_extensions = [ext for ext in nova_client.discover_extensions(2)
if ext.name == "assisted_volume_snapshots"]
def novaclient(context, admin_endpoint=False, privileged_user=False,
@ -137,7 +137,8 @@ def novaclient(context, admin_endpoint=False, privileged_user=False,
LOG.debug('Nova client connection created using URL: %s', url)
c = nova_client.Client(context.user_id,
c = nova_client.Client(NOVA_API_VERSION,
context.user_id,
context.auth_token,
context.project_name,
auth_url=url,
@ -161,12 +162,7 @@ class API(base.Base):
def has_extension(self, context, extension, timeout=None):
try:
client = novaclient(context, timeout=timeout)
# Pylint gives a false positive here because the 'list_extensions'
# method is not explicitly declared. Overriding the error.
# pylint: disable-msg=E1101
nova_exts = client.list_extensions.show_all()
nova_exts = nova_client.discover_extensions(NOVA_API_VERSION)
except request_exceptions.Timeout:
raise exception.APITimeout(service='Nova')
return extension in [e.name for e in nova_exts]

View File

@ -38,49 +38,54 @@ class NovaClientTestCase(test.TestCase):
self.override_config('os_privileged_user_name', 'adminuser')
self.override_config('os_privileged_user_password', 'strongpassword')
@mock.patch('novaclient.v2.client.Client')
@mock.patch('novaclient.client.Client')
def test_nova_client_regular(self, p_client):
nova.novaclient(self.ctx)
p_client.assert_called_once_with(
nova.NOVA_API_VERSION,
'regularuser', 'token', None, region_name=None,
auth_url='http://novahost:8774/v2/e3f0833dc08b4cea',
insecure=False, endpoint_type='publicURL', cacert=None,
timeout=None, extensions=nova.nova_extensions)
@mock.patch('novaclient.v2.client.Client')
@mock.patch('novaclient.client.Client')
def test_nova_client_admin_endpoint(self, p_client):
nova.novaclient(self.ctx, admin_endpoint=True)
p_client.assert_called_once_with(
nova.NOVA_API_VERSION,
'regularuser', 'token', None, region_name=None,
auth_url='http://novaadmhost:4778/v2/e3f0833dc08b4cea',
insecure=False, endpoint_type='adminURL', cacert=None,
timeout=None, extensions=nova.nova_extensions)
@mock.patch('novaclient.v2.client.Client')
@mock.patch('novaclient.client.Client')
def test_nova_client_privileged_user(self, p_client):
nova.novaclient(self.ctx, privileged_user=True)
p_client.assert_called_once_with(
nova.NOVA_API_VERSION,
'adminuser', 'strongpassword', None, region_name=None,
auth_url='http://keystonehost:5000/v2.0',
insecure=False, endpoint_type='publicURL', cacert=None,
timeout=None, extensions=nova.nova_extensions)
@mock.patch('novaclient.v2.client.Client')
@mock.patch('novaclient.client.Client')
def test_nova_client_privileged_user_custom_auth_url(self, p_client):
self.override_config('os_privileged_user_auth_url',
'http://privatekeystonehost:5000/v2.0')
nova.novaclient(self.ctx, privileged_user=True)
p_client.assert_called_once_with(
nova.NOVA_API_VERSION,
'adminuser', 'strongpassword', None, region_name=None,
auth_url='http://privatekeystonehost:5000/v2.0',
insecure=False, endpoint_type='publicURL', cacert=None,
timeout=None, extensions=nova.nova_extensions)
@mock.patch('novaclient.v2.client.Client')
@mock.patch('novaclient.client.Client')
def test_nova_client_custom_region(self, p_client):
self.override_config('os_region_name', 'farfaraway')
nova.novaclient(self.ctx)
p_client.assert_called_once_with(
nova.NOVA_API_VERSION,
'regularuser', 'token', None, region_name='farfaraway',
auth_url='http://novahost:8774/v2/e3f0833dc08b4cea',
insecure=False, endpoint_type='publicURL', cacert=None,

View File

@ -139,7 +139,7 @@ class FakeNovaClient(object):
def __init__(self, ext_srv_attr=True):
self.servers = FakeNovaClient.ServerManager()
self.list_extensions = FakeNovaClient.ListExtManager(
self.discover_extensions = FakeNovaClient.ListExtManager(
ext_srv_attr=ext_srv_attr)

View File

@ -902,9 +902,12 @@ class InstanceLocalityFilterTestCase(HostFiltersTestCase):
{'type': 'identity', 'name': 'keystone', 'endpoints':
[{'publicURL': 'http://keystonehost:5000/v2.0'}]}]
@mock.patch('novaclient.client.discover_extensions')
@mock.patch('cinder.compute.nova.novaclient')
def test_same_host(self, _mock_novaclient):
def test_same_host(self, _mock_novaclient, fake_extensions):
_mock_novaclient.return_value = fakes.FakeNovaClient()
fake_extensions.return_value = (
fakes.FakeNovaClient().discover_extensions.show_all())
filt_cls = self.class_map['InstanceLocalityFilter']()
host = fakes.FakeHostState('host1', {})
uuid = nova.novaclient().servers.create('host1')
@ -913,9 +916,12 @@ class InstanceLocalityFilterTestCase(HostFiltersTestCase):
'scheduler_hints': {'local_to_instance': uuid}}
self.assertTrue(filt_cls.host_passes(host, filter_properties))
@mock.patch('novaclient.client.discover_extensions')
@mock.patch('cinder.compute.nova.novaclient')
def test_different_host(self, _mock_novaclient):
def test_different_host(self, _mock_novaclient, fake_extensions):
_mock_novaclient.return_value = fakes.FakeNovaClient()
fake_extensions.return_value = (
fakes.FakeNovaClient().discover_extensions.show_all())
filt_cls = self.class_map['InstanceLocalityFilter']()
host = fakes.FakeHostState('host1', {})
uuid = nova.novaclient().servers.create('host2')
@ -966,10 +972,13 @@ class InstanceLocalityFilterTestCase(HostFiltersTestCase):
filter_properties = {'context': self.context, 'size': 100}
self.assertTrue(filt_cls.host_passes(host, filter_properties))
@mock.patch('novaclient.client.discover_extensions')
@mock.patch('requests.request')
def test_nova_timeout(self, _mock_request):
def test_nova_timeout(self, _mock_request, fake_extensions):
# Simulate a HTTP timeout
_mock_request.side_effect = request_exceptions.Timeout
fake_extensions.return_value = (
fakes.FakeNovaClient().discover_extensions.show_all())
filt_cls = self.class_map['InstanceLocalityFilter']()
host = fakes.FakeHostState('host1', {})