"""
+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
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,
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,
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]
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,
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)
{'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')
'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')
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', {})