Author: tomaz
Date: Sat Mar 24 21:00:18 2012
New Revision: 1304915
URL: http://svn.apache.org/viewvc?rev=1304915&view=rev
Log:
Allow user to specify OpenStack service catalog parameters (service type,
name and region). This way base OpenStack driver can be used with
different providers without needing to subclass. This patch has been
contributed by James E. Blair and is part of LIBCLOUD-173.
Modified:
libcloud/trunk/CHANGES
libcloud/trunk/libcloud/common/openstack.py
libcloud/trunk/libcloud/compute/drivers/openstack.py
Modified: libcloud/trunk/CHANGES
URL:
http://svn.apache.org/viewvc/libcloud/trunk/CHANGES?rev=1304915&r1=1304914&r2=1304915&view=diff
==============================================================================
--- libcloud/trunk/CHANGES (original)
+++ libcloud/trunk/CHANGES Sat Mar 24 21:00:18 2012
@@ -18,7 +18,12 @@ Changes with Apache Libcloud in developm
- Allow user to pass ex_tenant_name keyword argument to the OpenStack node
driver class. This scopes all the endpoints returned by the Auth API
- endpoint to the provided tenant.
+ endpoint to the provided tenant. ; LIBCLOUD-172
+ [James E. Blair]
+
+ - Allow user to specify OpenStack service catalog parameters (service type,
+ name and region). This way base OpenStack driver can be used with
+ different providers without needing to subclass. ; LIBCLOUD-173
[James E. Blair]
*) Compute:
Modified: libcloud/trunk/libcloud/common/openstack.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/common/openstack.py?rev=1304915&r1=1304914&r2=1304915&view=diff
==============================================================================
--- libcloud/trunk/libcloud/common/openstack.py (original)
+++ libcloud/trunk/libcloud/common/openstack.py Sat Mar 24 21:00:18 2012
@@ -340,11 +340,26 @@ class OpenStackBaseConnection(Connection
authentication time. Others will use a default tenant if none
is provided.
@type ex_tenant_name: C{string}
+
+ @param ex_force_service_type: Service type to use when selecting an
+ service. If not specified, a provider specific default will be used.
+ @type ex_force_service_type: C{string}
+
+ @param ex_force_service_name: Service name to use when selecting an
+ service. If not specified, a provider specific default will be used.
+ @type ex_force_service_name: C{string}
+
+ @param ex_force_service_region: Region to use when selecting an
+ service. If not specified, a provider specific default will be used.
+ @type ex_force_service_region: C{string}
"""
auth_url = None
auth_token = None
service_catalog = None
+ service_type = None
+ service_name = None
+ service_region = None
def __init__(self, user_id, key, secure=True,
host=None, port=None,
@@ -352,12 +367,18 @@ class OpenStackBaseConnection(Connection
ex_force_auth_url=None,
ex_force_auth_version=None,
ex_force_auth_token=None,
- ex_tenant_name=None):
+ ex_tenant_name=None,
+ ex_force_service_type=None,
+ ex_force_service_name=None,
+ ex_force_service_region=None):
self._ex_force_base_url = ex_force_base_url
self._ex_force_auth_url = ex_force_auth_url
self._auth_version = ex_force_auth_version
self._ex_tenant_name = ex_tenant_name
+ self._ex_force_service_type = ex_force_service_type
+ self._ex_force_service_name = ex_force_service_name
+ self._ex_force_service_region = ex_force_service_region
if ex_force_auth_token:
self.auth_token = ex_force_auth_token
@@ -374,18 +395,28 @@ class OpenStackBaseConnection(Connection
def get_endpoint(self):
"""
- Every openstack driver must have a connection class that subclasses
- this class and it must implement this method.
+ Selects the endpoint to use based on provider specific values,
+ or overrides passed in by the user when setting up the driver.
@returns: url of the relevant endpoint for the driver
-
- Example implementation:
- ep = self.service_catalog.get_endpoint(service_type='compute',
- name='ServiceName',
- region='US1')
- return ep['publicURL']
"""
- raise NotImplementedError
+ service_type = self.service_type
+ service_name = self.service_name
+ service_region = self.service_region
+ if self._ex_force_service_type:
+ service_type = self._ex_force_service_type
+ if self._ex_force_service_name:
+ service_name = self._ex_force_service_name
+ if self._ex_force_service_region:
+ service_region = self._ex_force_service_region
+
+ ep = self.service_catalog.get_endpoint(service_type=service_type,
+ name=service_name,
+ region=service_region)
+ if 'publicURL' in ep:
+ return ep['publicURL']
+
+ raise LibcloudError('Could not find specified endpoint')
def add_default_headers(self, headers):
headers['X-Auth-Token'] = self.auth_token
@@ -413,8 +444,8 @@ class OpenStackBaseConnection(Connection
aurl = self._ex_force_auth_url
if aurl == None:
- raise LibcloudError('OpenStack instance must \
- have auth_url set')
+ raise LibcloudError('OpenStack instance must ' +
+ 'have auth_url set')
osa = OpenStackAuthConnection(self, aurl, self._auth_version,
self.user_id, self.key,
self._ex_tenant_name)
@@ -447,6 +478,9 @@ class OpenStackDriverMixin(object):
self._ex_force_auth_version = kwargs.get('ex_force_auth_version', None)
self._ex_force_auth_token = kwargs.get('ex_force_auth_token', None)
self._ex_tenant_name = kwargs.get('ex_tenant_name', None)
+ self._ex_force_service_type = kwargs.get('ex_force_service_type', None)
+ self._ex_force_service_name = kwargs.get('ex_force_service_name', None)
+ self._ex_force_service_region = kwargs.get('ex_force_service_region',
None)
def openstack_connection_kwargs(self):
rv = {}
@@ -460,4 +494,10 @@ class OpenStackDriverMixin(object):
rv['ex_force_auth_version'] = self._ex_force_auth_version
if self._ex_tenant_name:
rv['ex_tenant_name'] = self._ex_tenant_name
+ if self._ex_force_service_type:
+ rv['ex_force_service_type'] = self._ex_force_service_type
+ if self._ex_force_service_name:
+ rv['ex_force_service_name'] = self._ex_force_service_name
+ if self._ex_force_service_region:
+ rv['ex_force_service_region'] = self._ex_force_service_region
return rv
Modified: libcloud/trunk/libcloud/compute/drivers/openstack.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/openstack.py?rev=1304915&r1=1304914&r2=1304915&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/openstack.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/openstack.py Sat Mar 24 21:00:18
2012
@@ -125,17 +125,10 @@ class OpenStackResponse(Response):
class OpenStackComputeConnection(OpenStackBaseConnection):
-
- def get_endpoint(self):
-
- # default config for http://devstack.org/
- ep = self.service_catalog.get_endpoint(service_type='compute',
- name='nova',
- region='RegionOne')
- if 'publicURL' in ep:
- return ep['publicURL']
-
- raise LibcloudError('Could not find specified endpoint')
+ # default config for http://devstack.org/
+ service_type = 'compute'
+ service_name = 'nova'
+ service_region = 'RegionOne'
def request(self, action, params=None, data='', headers=None,
method='GET'):