diff --git a/cloudbridge/__init__.py b/cloudbridge/__init__.py index 69b076a5..d9334512 100644 --- a/cloudbridge/__init__.py +++ b/cloudbridge/__init__.py @@ -2,7 +2,7 @@ import logging # Current version of the library -__version__ = '3.0.0' +__version__ = '3.1.0' def get_version(): diff --git a/cloudbridge/providers/openstack/provider.py b/cloudbridge/providers/openstack/provider.py index b24f6be2..a948fecc 100644 --- a/cloudbridge/providers/openstack/provider.py +++ b/cloudbridge/providers/openstack/provider.py @@ -18,6 +18,8 @@ from cloudbridge.base import BaseCloudProvider from cloudbridge.base.helpers import get_env +from cloudbridge.interfaces.exceptions import ProviderConnectionException + from .services import OpenStackComputeService from .services import OpenStackDnsService from .services import OpenStackNetworkingService @@ -34,6 +36,10 @@ def __init__(self, config): super(OpenStackCloudProvider, self).__init__(config) # Initialize cloud connection fields + self.app_cred_id = self._get_config_value( + 'os_application_credential_id', get_env('OS_APPLICATION_CREDENTIAL_ID')) + self.app_cred_secret = self._get_config_value( + 'os_application_credential_secret', get_env('OS_APPLICATION_CREDENTIAL_SECRET')) self.username = self._get_config_value( 'os_username', get_env('OS_USERNAME')) self.password = self._get_config_value( @@ -112,13 +118,22 @@ def _keystone_session(self): if self._keystone_version == 3: from keystoneauth1.identity import v3 - auth = v3.Password(auth_url=self.auth_url, - username=self.username, - password=self.password, - user_domain_name=self.user_domain_name, - project_domain_id=self.project_domain_id, - project_domain_name=self.project_domain_name, - project_name=self.project_name) + if self.username and self.password: + auth = v3.Password(auth_url=self.auth_url, + username=self.username, + password=self.password, + user_domain_name=self.user_domain_name, + project_domain_id=self.project_domain_id, + project_domain_name=self.project_domain_name, + project_name=self.project_name) + elif self.app_cred_id and self.app_cred_secret: + auth = v3.ApplicationCredential(auth_url=self.auth_url, + application_credential_id=self.app_cred_id, + application_credential_secret=self.app_cred_secret) + else: + raise ProviderConnectionException("""No valid credentials were found. You must supply either + 'os_username' and 'os_password', or 'os_application_credential_id' + and 'os_application_credential_secret'""") self._cached_keystone_session = session.Session(auth=auth) else: from keystoneauth1.identity import v2 @@ -133,12 +148,7 @@ def _connect_openstack(self): region_name=self.region_name, user_agent='cloudbridge', auth_url=self.auth_url, - project_name=self.project_name, - username=self.username, - password=self.password, - user_domain_name=self.user_domain_name, - project_domain_id=self.project_domain_id, - project_domain_name=self.project_domain_name + session=self._keystone_session, ) @property diff --git a/setup.py b/setup.py index b71b2413..a177062e 100644 --- a/setup.py +++ b/setup.py @@ -48,8 +48,8 @@ ] REQS_OPENSTACK = [ 'openstacksdk>=0.12.0,<1.0.0', - 'python-novaclient>=7.0.0,<18.0', - 'python-swiftclient>=3.2.0,<4.0', + 'python-novaclient>=7.0.0,<19.0', + 'python-swiftclient>=3.2.0,<5.0', 'python-neutronclient>=6.0.0,<8.0', 'python-keystoneclient>=3.13.0,<5.0' ]