|
|
@@ -33,14 +33,13 @@ class OpenStackCloudProvider(BaseCloudProvider):
|
|
|
'os_username', os.environ.get('OS_USERNAME', None))
|
|
|
self.password = self._get_config_value(
|
|
|
'os_password', os.environ.get('OS_PASSWORD', None))
|
|
|
- self.tenant_name = self._get_config_value(
|
|
|
- 'os_tenant_name', os.environ.get('OS_TENANT_NAME', None))
|
|
|
+ self.project_name = self._get_config_value(
|
|
|
+ 'os_project_name', os.environ.get('OS_PROJECT_NAME', None) or
|
|
|
+ os.environ.get('OS_TENANT_NAME', None))
|
|
|
self.auth_url = self._get_config_value(
|
|
|
'os_auth_url', os.environ.get('OS_AUTH_URL', None))
|
|
|
self.region_name = self._get_config_value(
|
|
|
'os_region_name', os.environ.get('OS_REGION_NAME', None))
|
|
|
- self.project_name = self._get_config_value(
|
|
|
- 'os_project_name', os.environ.get('OS_PROJECT_NAME', None))
|
|
|
self.project_domain_name = self._get_config_value(
|
|
|
'os_project_domain_name',
|
|
|
os.environ.get('OS_PROJECT_DOMAIN_NAME', None))
|
|
|
@@ -49,23 +48,6 @@ class OpenStackCloudProvider(BaseCloudProvider):
|
|
|
self.identity_api_version = self._get_config_value(
|
|
|
'os_identity_api_version',
|
|
|
os.environ.get('OS_IDENTITY_API_VERSION', None))
|
|
|
- # Allow individual service connections to have their own values but
|
|
|
- # default to the ones defined above.
|
|
|
- self.swift_username = self._get_config_value(
|
|
|
- 'os_swift_username',
|
|
|
- os.environ.get('OS_SWIFT_USERNAME', self.username))
|
|
|
- self.swift_password = self._get_config_value(
|
|
|
- 'os_swift_password',
|
|
|
- os.environ.get('OS_SWIFT_PASSWORD', self.password))
|
|
|
- self.swift_tenant_name = self._get_config_value(
|
|
|
- 'os_swift_tenant_name',
|
|
|
- os.environ.get('OS_SWIFT_TENANT_NAME', self.tenant_name))
|
|
|
- self.swift_auth_url = self._get_config_value(
|
|
|
- 'os_swift_auth_url',
|
|
|
- os.environ.get('OS_SWIFT_AUTH_URL', self.auth_url))
|
|
|
- self.swift_region_name = self._get_config_value(
|
|
|
- 'os_swift_region_name',
|
|
|
- os.environ.get('OS_SWIFT_REGION_NAME', self.region_name))
|
|
|
|
|
|
# Service connections, lazily initialized
|
|
|
self._nova = None
|
|
|
@@ -75,6 +57,9 @@ class OpenStackCloudProvider(BaseCloudProvider):
|
|
|
self._swift = None
|
|
|
self._neutron = None
|
|
|
|
|
|
+ # Additional cached variables
|
|
|
+ self._cached_keystone_session = None
|
|
|
+
|
|
|
# Initialize provider services
|
|
|
self._compute = OpenStackComputeService(self)
|
|
|
self._network = OpenStackNetworkService(self)
|
|
|
@@ -115,14 +100,10 @@ class OpenStackCloudProvider(BaseCloudProvider):
|
|
|
:rtype: :class:`keystoneauth1.session.Session`
|
|
|
:return: A Keystone session object.
|
|
|
"""
|
|
|
- def connect_v2():
|
|
|
- from keystoneauth1.identity.v2 import Password as Password_v2
|
|
|
- auth = Password_v2(self.auth_url, username=self.username,
|
|
|
- password=self.password,
|
|
|
- tenant_name=self.tenant_name)
|
|
|
- return session.Session(auth=auth)
|
|
|
+ if self._cached_keystone_session:
|
|
|
+ return self._cached_keystone_session
|
|
|
|
|
|
- def connect_v3():
|
|
|
+ if self._keystone_version == 3:
|
|
|
from keystoneauth1.identity.v3 import Password as Password_v3
|
|
|
auth = Password_v3(auth_url=self.auth_url,
|
|
|
username=self.username,
|
|
|
@@ -130,9 +111,14 @@ class OpenStackCloudProvider(BaseCloudProvider):
|
|
|
user_domain_name=self.user_domain_name,
|
|
|
project_domain_name=self.project_domain_name,
|
|
|
project_name=self.project_name)
|
|
|
- return session.Session(auth=auth)
|
|
|
-
|
|
|
- return connect_v3() if self._keystone_version == 3 else connect_v2()
|
|
|
+ self._cached_keystone_session = session.Session(auth=auth)
|
|
|
+ else:
|
|
|
+ from keystoneauth1.identity.v2 import Password as Password_v2
|
|
|
+ auth = Password_v2(self.auth_url, username=self.username,
|
|
|
+ password=self.password,
|
|
|
+ tenant_name=self.project_name)
|
|
|
+ self._cached_keystone_session = session.Session(auth=auth)
|
|
|
+ return self._cached_keystone_session
|
|
|
|
|
|
# @property
|
|
|
# def glance(self):
|
|
|
@@ -183,22 +169,8 @@ class OpenStackCloudProvider(BaseCloudProvider):
|
|
|
|
|
|
def _connect_nova_region(self, region_name):
|
|
|
"""Get an OpenStack Nova (compute) client object."""
|
|
|
- def connect_pwd():
|
|
|
- """Connect using username and password parameters."""
|
|
|
- nova = nova_client.Client(
|
|
|
- api_version, username=self.username, api_key=self.password,
|
|
|
- project_id=self.tenant_name, auth_url=self.auth_url,
|
|
|
- region_name=region_name, service_name=service_name,
|
|
|
- http_log_debug=True if self.config.debug_mode else False)
|
|
|
- nova.authenticate()
|
|
|
- return nova
|
|
|
-
|
|
|
- def connect_sess():
|
|
|
- """Connect using a Keystone session object."""
|
|
|
- return nova_client.Client(
|
|
|
- api_version, session=self._keystone_session,
|
|
|
- service_name=service_name,
|
|
|
- http_log_debug=True if self.config.debug_mode else False)
|
|
|
+ # Force reauthentication with Keystone
|
|
|
+ self._cached_keystone_session = None
|
|
|
|
|
|
api_version = self._get_config_value(
|
|
|
'os_compute_api_version',
|
|
|
@@ -210,11 +182,19 @@ class OpenStackCloudProvider(BaseCloudProvider):
|
|
|
if self.config.debug_mode:
|
|
|
nova_shell.OpenStackComputeShell().setup_debugging(True)
|
|
|
|
|
|
- return connect_sess() if self._keystone_version == 3 else connect_pwd()
|
|
|
+ nova = nova_client.Client(
|
|
|
+ api_version, session=self._keystone_session,
|
|
|
+ region_name=region_name,
|
|
|
+ service_name=service_name,
|
|
|
+ http_log_debug=True if self.config.debug_mode else False)
|
|
|
+ return nova
|
|
|
|
|
|
def _connect_keystone(self):
|
|
|
"""Get an OpenStack Keystone (identity) client object."""
|
|
|
- def connect_v2():
|
|
|
+ if self._keystone_version == 3:
|
|
|
+ return keystone_client.Client(session=self._keystone_session,
|
|
|
+ auth_url=self.auth_url)
|
|
|
+ else:
|
|
|
# Wow, the internal keystoneV2 implementation is terribly buggy. It
|
|
|
# needs both a separate Session object and the username, password
|
|
|
# again for things to work correctly. Plus, a manual call to
|
|
|
@@ -225,35 +205,20 @@ class OpenStackCloudProvider(BaseCloudProvider):
|
|
|
auth_url=self.auth_url,
|
|
|
username=self.username,
|
|
|
password=self.password,
|
|
|
- tenant_name=self.tenant_name,
|
|
|
+ project_name=self.project_name,
|
|
|
region_name=self.region_name)
|
|
|
keystone.authenticate()
|
|
|
return keystone
|
|
|
|
|
|
- def connect_v3():
|
|
|
- return keystone_client.Client(session=self._keystone_session,
|
|
|
- auth_url=self.auth_url)
|
|
|
-
|
|
|
- return connect_v3() if self._keystone_version == 3 else connect_v2()
|
|
|
-
|
|
|
def _connect_cinder(self):
|
|
|
"""Get an OpenStack Cinder (block storage) client object."""
|
|
|
- def connect_pwd():
|
|
|
- """Connect using username and password parameters."""
|
|
|
- return cinder_client.Client(
|
|
|
- api_version, username=self.username, api_key=self.password,
|
|
|
- project_id=self.tenant_name, auth_url=self.auth_url)
|
|
|
-
|
|
|
- def connect_sess():
|
|
|
- """Connect using a Keystone session object."""
|
|
|
- return cinder_client.Client(
|
|
|
- api_version, session=self._keystone_session)
|
|
|
-
|
|
|
api_version = self._get_config_value(
|
|
|
'os_volume_api_version',
|
|
|
os.environ.get('OS_VOLUME_API_VERSION', 2))
|
|
|
|
|
|
- return connect_sess() if self._keystone_version == 3 else connect_pwd()
|
|
|
+ return cinder_client.Client(api_version,
|
|
|
+ session=self._keystone_session,
|
|
|
+ region_name=self.region_name)
|
|
|
|
|
|
# def _connect_glance(self):
|
|
|
# """
|
|
|
@@ -269,36 +234,9 @@ class OpenStackCloudProvider(BaseCloudProvider):
|
|
|
|
|
|
def _connect_swift(self):
|
|
|
"""Get an OpenStack Swift (object store) client object cloud."""
|
|
|
- def connect_v2():
|
|
|
- os_options = {'region_name': self.swift_region_name}
|
|
|
- return swift_client.Connection(
|
|
|
- authurl=self.swift_auth_url, auth_version='2',
|
|
|
- user=self.swift_username, key=self.swift_password,
|
|
|
- tenant_name=self.swift_tenant_name,
|
|
|
- os_options=os_options)
|
|
|
-
|
|
|
- def connect_v3():
|
|
|
- os_options = {'region_name': self.swift_region_name,
|
|
|
- 'user_domain_name': self.user_domain_name,
|
|
|
- 'project_domain_name': self.project_domain_name,
|
|
|
- 'project_name': self.project_name}
|
|
|
- return swift_client.Connection(
|
|
|
- authurl=self.swift_auth_url, auth_version='3',
|
|
|
- user=self.swift_username, key=self.swift_password,
|
|
|
- os_options=os_options)
|
|
|
-
|
|
|
- return connect_v3() if self._keystone_version == 3 else connect_v2()
|
|
|
+ return swift_client.Connection(session=self._keystone_session)
|
|
|
|
|
|
def _connect_neutron(self):
|
|
|
"""Get an OpenStack Neutron (networking) client object cloud."""
|
|
|
- def connect_pwd():
|
|
|
- """Connect using username and password parameters."""
|
|
|
- return neutron_client.Client(
|
|
|
- username=self.username, password=self.password,
|
|
|
- tenant_name=self.tenant_name, auth_url=self.auth_url)
|
|
|
-
|
|
|
- def connect_sess():
|
|
|
- """Connect using a Keystone session object."""
|
|
|
- return neutron_client.Client(session=self._keystone_session)
|
|
|
-
|
|
|
- return connect_sess() if self._keystone_version == 3 else connect_pwd()
|
|
|
+ return neutron_client.Client(session=self._keystone_session,
|
|
|
+ region_name=self.region_name)
|