Author: tomaz
Date: Thu Nov 24 02:47:19 2011
New Revision: 1205708
URL: http://svn.apache.org/viewvc?rev=1205708&view=rev
Log:
Fix OpenStack Auth 2.0 fixture. Current one probably was from some pre-release
version, because it doesn't match the docs and the actual API response.
Also update all the tests and fix the tenant id parsing.
Modified:
libcloud/trunk/libcloud/common/openstack.py
libcloud/trunk/test/compute/fixtures/openstack/_v2_0__auth.json
libcloud/trunk/test/compute/test_openstack.py
Modified: libcloud/trunk/libcloud/common/openstack.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/libcloud/common/openstack.py?rev=1205708&r1=1205707&r2=1205708&view=diff
==============================================================================
--- libcloud/trunk/libcloud/common/openstack.py (original)
+++ libcloud/trunk/libcloud/common/openstack.py Thu Nov 24 02:47:19 2011
@@ -84,7 +84,6 @@ class OpenStackAuthConnection(Connection
self.auth_version = auth_version
self.auth_url = auth_url
self.urls = {}
- self.tenant = {}
self.driver = self.parent_conn.driver
def add_default_headers(self, headers):
@@ -190,9 +189,6 @@ class OpenStackAuthConnection(Connection
token = access['token']
self.auth_token = token['id']
self.urls = access['serviceCatalog']
-
- self.tenant['id'] = token['tenant']['id']
- self.tenant['name'] = token['tenant']['name']
except KeyError, e:
raise MalformedResponseError('Auth JSON response is missing
required elements', e)
@@ -284,11 +280,14 @@ class OpenStackBaseConnection(Connection
# TODO: Multi-region support
if self._auth_version == '2.0':
+ self.tenant_ids = {}
+
for service in osa.urls:
- if service.get('type') == 'compute':
+ service_type = service['type']
+ if service_type == 'compute':
self.server_url =
self._get_default_region(service.get('endpoints', []))
- self.tenant = osa.tenant
+ self.tenant_ids[service_type] =
service['endpoints'][0]['tenantId']
elif self._auth_version in ['1.1', '1.0']:
self.server_url =
self._get_default_region(osa.urls.get('cloudServers', []))
self.cdn_management_url =
self._get_default_region(osa.urls.get('cloudFilesCDN', []))
Modified: libcloud/trunk/test/compute/fixtures/openstack/_v2_0__auth.json
URL:
http://svn.apache.org/viewvc/libcloud/trunk/test/compute/fixtures/openstack/_v2_0__auth.json?rev=1205708&r1=1205707&r2=1205708&view=diff
==============================================================================
--- libcloud/trunk/test/compute/fixtures/openstack/_v2_0__auth.json (original)
+++ libcloud/trunk/test/compute/fixtures/openstack/_v2_0__auth.json Thu Nov 24
02:47:19 2011
@@ -1 +1,64 @@
-{"access": {"token": {"expires": "2011-11-08T15:57:43.653263", "id":
"aaaaaaaaaaaa-bbb-cccccccccccccc", "tenant": {"id": "45", "name":
"testproj-project"}}, "serviceCatalog": [{"endpoints": [{"adminURL":
"http://my.fake.hostname:8774/v1.1/slug", "region": "ORD", "internalURL": ".",
"publicURL": "http://my.fake.hostname:8774/v1.1/slug"}], "type": "compute",
"name": "nova"}], "user": {"id": "45", "roles": [{"tenantId": "45", "id": "2",
"name": "Member"}], "name": "testproj"}}}
+{
+ "access": {
+ "token": {
+ "id": "aaaaaaaaaaaa-bbb-cccccccccccccc",
+ "expires": "2011-11-23T21:00:14.000-06:00"
+ },
+ "serviceCatalog": [
+ {
+ "endpoints": [
+ {
+ "region": "ORD",
+ "tenantId":
"MossoCloudFS_11111-111111111-1111111111-1111111",
+ "publicURL":
"https://cdn2.clouddrive.com/v1/MossoCloudFS_11111-111111111-1111111111-1111111",
+ "version": {
+ "versionInfo": "https://cdn2.clouddrive.com/v1/",
+ "versionList": "https://cdn2.clouddrive.com/",
+ "versionId": "1"
+ }
+ }
+ ],
+ "name": "cloudFilesCDN",
+ "type": "object-store"
+ },
+ {
+ "endpoints": [
+ {
+ "region": "ORD",
+ "tenantId":
"MossoCloudFS_11111-111111111-1111111111-1111111",
+ "publicURL":
"https://storage101.ord1.clouddrive.com/v1/MossoCloudFS_11111-111111111-1111111111-1111111",
+ "internalURL":
"https://snet-storage101.ord1.clouddrive.com/v1/MossoCloudFS_11111-111111111-1111111111-1111111"
+ }
+ ],
+ "name": "cloudFiles",
+ "type": "object-store"
+ },
+ {
+ "endpoints": [
+ {
+ "tenantId": "1337",
+ "publicURL":
"https://servers.api.rackspacecloud.com/v1.0/1337",
+ "version": {
+ "versionInfo":
"https://servers.api.rackspacecloud.com/v1.0/",
+ "versionList":
"https://servers.api.rackspacecloud.com/",
+ "versionId": "1.0"
+ }
+ }
+ ],
+ "name": "cloudServers",
+ "type": "compute"
+ }
+ ],
+ "user": {
+ "id": "7",
+ "roles": [
+ {
+ "id": "identity:default",
+ "description": "Default Role.",
+ "name": "identity:default"
+ }
+ ],
+ "name": "testuser"
+ }
+ }
+}
Modified: libcloud/trunk/test/compute/test_openstack.py
URL:
http://svn.apache.org/viewvc/libcloud/trunk/test/compute/test_openstack.py?rev=1205708&r1=1205707&r2=1205708&view=diff
==============================================================================
--- libcloud/trunk/test/compute/test_openstack.py (original)
+++ libcloud/trunk/test/compute/test_openstack.py Thu Nov 24 02:47:19 2011
@@ -14,6 +14,7 @@
# limitations under the License.
import sys
import unittest
+import types
import httplib
from libcloud.common.types import InvalidCredsError, MalformedResponseError
@@ -673,7 +674,7 @@ class OpenStack_1_1_FactoryMethodTests(O
driver_klass = OpenStack_1_1_NodeDriver
driver_type = get_driver(Provider.OPENSTACK)
driver_args = OPENSTACK_PARAMS + ('1.1',)
-
+ driver_kwargs = {'ex_force_auth_version': '1.0'}
class OpenStack_1_1_MockHttp(MockHttpTestCase):
fixtures = ComputeFileFixtures('openstack_v1.1')
@@ -770,23 +771,56 @@ class OpenStack_1_1_MockHttp(MockHttpTes
else:
raise NotImplementedError()
+class OpenStack_1_1_Auth_2_0_MockHttp(OpenStack_1_1_MockHttp):
+ fixtures = ComputeFileFixtures('openstack_v1.1')
+ auth_fixtures = OpenStackFixtures()
+ json_content_headers = {'content-type': 'application/json; charset=UTF-8'}
+
+ def __init__(self, *args, **kwargs):
+ super(OpenStack_1_1_Auth_2_0_MockHttp, self).__init__(*args, **kwargs)
+
+ # TODO Figure out why 1.1 tests are using some 1.0 endpoints
+ methods1 = OpenStackMockHttp.__dict__
+ methods2 = OpenStack_1_1_MockHttp.__dict__
+
+ names1 = [m for m in methods1 if m.find('_v1_0') == 0]
+ names2 = [m for m in methods2 if m.find('_v1_1') == 0]
+
+ for name in names1:
+ method = methods1[name]
+ new_name = name.replace('_v1_0_slug_', '_v1_0_1337_')
+ setattr(self, new_name, types.MethodType(method, self,
+ OpenStack_1_1_Auth_2_0_MockHttp))
+
+ for name in names2:
+ method = methods2[name]
+ new_name = name.replace('_v1_1_slug_', '_v1_0_1337_')
+ setattr(self, new_name, types.MethodType(method, self,
+ OpenStack_1_1_Auth_2_0_MockHttp))
+
+
class OpenStack_1_1_Auth_2_0_Tests(OpenStack_1_1_Tests):
+ driver_args = OPENSTACK_PARAMS + ('1.1',)
driver_kwargs = {'ex_force_auth_version': '2.0'}
def setUp(self):
- self.driver_klass.connectionCls.conn_classes =
(OpenStack_1_1_MockHttp, OpenStack_1_1_MockHttp)
+ self.driver_klass.connectionCls.conn_classes = \
+ (OpenStack_1_1_Auth_2_0_MockHttp,
OpenStack_1_1_Auth_2_0_MockHttp)
self.driver_klass.connectionCls.auth_url =
"https://auth.api.example.com/v2.0/"
OpenStack_1_1_MockHttp.type = None
self.driver = self.create_driver()
clear_pricing_data()
self.node = self.driver.list_nodes()[1]
- server_url = 'http://my.fake.hostname:8774/v1.1/slug'
+ server_url = 'https://servers.api.rackspacecloud.com/v1.0/1337'
auth_token = 'aaaaaaaaaaaa-bbb-cccccccccccccc'
+ tenant_compute = '1337'
+ tenant_object_store = 'MossoCloudFS_11111-111111111-1111111111-1111111'
+
self.assertEqual(self.driver.connection.server_url, server_url)
self.assertEqual(self.driver.connection.auth_token, auth_token)
- self.assertEqual(self.driver.connection.tenant, {'id': '45', 'name':
- 'testproj-project'})
+ self.assertEqual(self.driver.connection.tenant_ids,
+ {'compute': tenant_compute, 'object-store': tenant_object_store})