Author: pquerna
Date: Tue Sep 20 22:12:56 2011
New Revision: 1173406

URL: http://svn.apache.org/viewvc?rev=1173406&view=rev
Log:
For open stack providers, add the ex_force_auth_url and ex_force_auth_version 
params to force where you get your auth tokens from, and add back in support 
for Auth 1.0

Modified:
    libcloud/trunk/libcloud/common/openstack.py
    libcloud/trunk/libcloud/compute/drivers/openstack.py

Modified: libcloud/trunk/libcloud/common/openstack.py
URL: 
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/common/openstack.py?rev=1173406&r1=1173405&r2=1173406&view=diff
==============================================================================
--- libcloud/trunk/libcloud/common/openstack.py (original)
+++ libcloud/trunk/libcloud/common/openstack.py Tue Sep 20 22:12:56 2011
@@ -73,7 +73,7 @@ class OpenStackAuthConnection(Connection
     responseCls = OpenStackAuthResponse
     name = 'OpenStack Auth'
 
-    def __init__(self, parent_conn, auth_url, user_id, key):
+    def __init__(self, parent_conn, auth_url, auth_version, user_id, key):
         self.parent_conn = parent_conn
         # enable tests to use the same mock connection classes.
         self.conn_classes = parent_conn.conn_classes
@@ -81,6 +81,7 @@ class OpenStackAuthConnection(Connection
         super(OpenStackAuthConnection, self).__init__(
             user_id, key, url=auth_url)
 
+        self.auth_version = auth_version
         self.auth_url = auth_url
         self.urls = {}
         self.driver = self.parent_conn.driver
@@ -91,13 +92,45 @@ class OpenStackAuthConnection(Connection
         return headers
 
     def authenticate(self):
-        reqbody = json.dumps({'credentials': {'username': self.user_id, 'key': 
self.key}})
-        resp = self.request("/auth",
-                    data=reqbody,
+        if self.auth_version == "1.0":
+            return self.authenticate_1_0()
+        elif self.auth_version == "1.1":
+            return self.authenticate_1_1()
+        else:
+            raise LibcloudError('Unsupported Auth Version requested')
+
+    def authenticate_1_0(self):
+        resp = self.request("/",
                     headers={
                         'X-Auth-User': self.user_id,
                         'X-Auth-Key': self.key,
                     },
+                    method='GET')
+
+        if resp.status == httplib.UNAUTHORIZED:
+            # HTTP UNAUTHORIZED (401): auth failed
+            raise InvalidCredsError()
+        elif resp.status != httplib.NO_CONTENT:
+            raise MalformedResponseError('Malformed response',
+                    body='code: %s body:%s headers:%s' % (resp.status, 
resp.body, resp.headers),
+                    driver=self.driver)
+        else:
+            headers = resp.headers
+            # emulate the auth 1.1 URL list
+            self.urls = {}
+            self.urls['cloudServers'] = [{'publicURL': 
headers.get('x-server-management-url', None)}]
+            self.urls['cloudFilesCDN'] = [{'publicURL': 
headers.get('x-cdn-management-url', None)}]
+            self.urls['cloudFiles'] = [{'publicURL': 
headers.get('x-storage-url', None)}]
+            self.auth_token = headers.get('x-auth-token', None)
+
+            if not self.auth_token:
+                raise MalformedResponseError('Missing X-Auth-Token in response 
headers')
+
+    def authenticate_1_1(self):
+        reqbody = json.dumps({'credentials': {'username': self.user_id, 'key': 
self.key}})
+        resp = self.request("/auth",
+                    data=reqbody,
+                    headers={},
                     method='POST')
 
         if resp.status == httplib.UNAUTHORIZED:
@@ -123,13 +156,18 @@ class OpenStackBaseConnection(Connection
     auth_url = None
 
     def __init__(self, user_id, key, secure=True,
-                 host=None, port=None, ex_force_base_url=None):
+                 host=None, port=None,
+                 ex_force_base_url=None,
+                 ex_force_auth_url=None,
+                 ex_force_auth_version='1.1'):
         self.server_url = None
         self.cdn_management_url = None
         self.storage_url = None
         self.lb_url = None
         self.auth_token = None
         self._force_base_url = ex_force_base_url
+        self._ex_force_auth_url = ex_force_auth_url
+        self._auth_version = ex_force_auth_version
         super(OpenStackBaseConnection, self).__init__(
             user_id, key)
 
@@ -168,7 +206,7 @@ class OpenStackBaseConnection(Connection
                 if i.get('v1Default', False):
                     return i['publicURL']
             # uber lame
-            return arr[0]
+            return arr[0]['publicURL']
         return None
 
     def request(self, **kwargs):
@@ -182,10 +220,15 @@ class OpenStackBaseConnection(Connection
         request yet, do it here. Otherwise, just return the management host.
         """
         if not self.auth_token:
-            if self.auth_url == None:
+            aurl = self.auth_url 
+
+            if self._ex_force_auth_url != None:
+                aurl = self._ex_force_auth_url
+
+            if aurl == None :
                 raise LibcloudError('OpenStack instance must have auth_url 
set')
 
-            osa = OpenStackAuthConnection(self, self.auth_url, self.user_id, 
self.key)
+            osa = OpenStackAuthConnection(self, aurl, self._auth_version, 
self.user_id, self.key)
 
             # may throw InvalidCreds, etc
             osa.authenticate()

Modified: libcloud/trunk/libcloud/compute/drivers/openstack.py
URL: 
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/compute/drivers/openstack.py?rev=1173406&r1=1173405&r2=1173406&view=diff
==============================================================================
--- libcloud/trunk/libcloud/compute/drivers/openstack.py (original)
+++ libcloud/trunk/libcloud/compute/drivers/openstack.py Tue Sep 20 22:12:56 
2011
@@ -89,9 +89,15 @@ class OpenStackConnection(OpenStackBaseC
     responseCls = OpenStackResponse
     _url_key = "server_url"
 
-    def __init__(self, user_id, key, secure=True, host=None, port=None, 
ex_force_base_url=None):
+    def __init__(self, user_id, key, secure=True, host=None, port=None,
+                 ex_force_base_url=None,
+                 ex_force_auth_url=None,
+                 ex_force_auth_version=None):
         super(OpenStackConnection, self).__init__(
-            user_id, key, host=host, port=port, 
ex_force_base_url=ex_force_base_url)
+            user_id, key, host=host, port=port,
+            ex_force_base_url=ex_force_base_url,
+            ex_force_auth_url=ex_force_auth_url,
+            ex_force_auth_version=ex_force_auth_version)
         self.api_version = 'v1.0'
         self.accept_format = 'application/xml'
 
@@ -149,12 +155,19 @@ class OpenStackNodeDriver(NodeDriver):
 
     def __init__(self, *args, **kwargs):
         self._ex_force_base_url = kwargs.pop('ex_force_base_url', None)
+        self._ex_force_auth_url = kwargs.pop('ex_force_auth_url', None)
+        self._ex_force_auth_version = kwargs.pop('ex_force_auth_version', None)
         super(OpenStackNodeDriver, self).__init__(*args, **kwargs)
 
     def _ex_connection_class_kwargs(self):
+        rv = {}
         if self._ex_force_base_url:
-            return {'ex_force_base_url': self._ex_force_base_url}
-        return {}
+            rv['ex_force_base_url'] = self._ex_force_base_url
+        if self._ex_force_auth_url:
+            rv['ex_force_auth_url'] = self._ex_force_auth_url
+        if self._ex_force_auth_version:
+            rv['ex_force_auth_version'] = self._ex_force_auth_version
+        return rv
 
 
     def list_nodes(self):


Reply via email to