From 1a35545db3aa2af7707928c6169e1908e24c8286 Mon Sep 17 00:00:00 2001 From: Joe Heck Date: Wed, 14 Nov 2012 05:38:16 +0000 Subject: [PATCH] fixes auth_ref initialization error bug 1078589 * allow client values to be overridden, but use auth_ref if none available * added tests to match this flow * refactored tokens into test_fixtures.py file Change-Id: I771a2dee6dedf31d883417d9b4e6e64bbb620f14 --- keystoneclient/client.py | 35 +++++++++++++------ tests/client_fixtures.py | 72 ++++++++++++++++++++++++++++++++++++++ tests/test_access.py | 75 ++-------------------------------------- tests/test_client.py | 37 ++++++++++++++++++++ 4 files changed, 137 insertions(+), 82 deletions(-) create mode 100644 tests/client_fixtures.py create mode 100644 tests/test_client.py diff --git a/keystoneclient/client.py b/keystoneclient/client.py index 9ab3cfb8..c15cdc15 100644 --- a/keystoneclient/client.py +++ b/keystoneclient/client.py @@ -48,25 +48,40 @@ class HTTPClient(httplib2.Http): else: self.add_certificate(key=cert, cert=cert, domain='') self.version = 'v2.0' + # set baseline defaults + self.username = None + self.tenant_id = None + self.tenant_name = None + self.auth_url = None + self.token = None + self.auth_token = None + self.management_url = None + # if loading from a dictionary passed in via auth_ref, + # load values from AccessInfo parsing that dictionary self.auth_ref = access.AccessInfo(**auth_ref) if auth_ref else None if self.auth_ref: self.username = self.auth_ref.username self.tenant_id = self.auth_ref.tenant_id self.tenant_name = self.auth_ref.tenant_name - self.auth_url = self.auth_ref.auth_url - self.management_url = self.auth_ref.management_url + self.auth_url = self.auth_ref.auth_url[0] + self.management_url = self.auth_ref.management_url[0] self.auth_token = self.auth_ref.auth_token - #NOTE(heckj): allow override of the auth_ref defaults from explicit + # allow override of the auth_ref defaults from explicit # values provided to the client - self.username = username - self.tenant_id = tenant_id - self.tenant_name = tenant_name + if username: + self.username = username + if tenant_id: + self.tenant_id = tenant_id + if tenant_name: + self.tenant_name = tenant_name + if auth_url: + self.auth_url = auth_url.rstrip('/') + if token: + self.auth_token = token + if endpoint: + self.management_url = endpoint.rstrip('/') self.password = password - self.auth_url = auth_url.rstrip('/') if auth_url else None - self.auth_token = token self.original_ip = original_ip - - self.management_url = endpoint.rstrip('/') if endpoint else None self.region_name = region_name # httplib2 overrides diff --git a/tests/client_fixtures.py b/tests/client_fixtures.py new file mode 100644 index 00000000..f0b51379 --- /dev/null +++ b/tests/client_fixtures.py @@ -0,0 +1,72 @@ +UNSCOPED_TOKEN = { + u'access': {u'serviceCatalog': {}, + u'token': {u'expires': u'2012-10-03T16:58:01Z', + u'id': u'3e2813b7ba0b4006840c3825860b86ed'}, + u'user': {u'id': u'c4da488862bd435c9e6c0275a0d0e49a', + u'name': u'exampleuser', + u'roles': [], + u'roles_links': [], + u'username': u'exampleuser'} + } +} + +PROJECT_SCOPED_TOKEN = { + u'access': { + u'serviceCatalog': [{ + u'endpoints': [{ + u'adminURL': u'http://admin:8776/v1/225da22d3ce34b15877ea70b2a575f58', + u'internalURL': + u'http://internal:8776/v1/225da22d3ce34b15877ea70b2a575f58', + u'publicURL': + u'http://public.com:8776/v1/225da22d3ce34b15877ea70b2a575f58', + u'region': u'RegionOne' + }], + u'endpoints_links': [], + u'name': u'Volume Service', + u'type': u'volume'}, + {u'endpoints': [{ + u'adminURL': u'http://admin:9292/v1', + u'internalURL': u'http://internal:9292/v1', + u'publicURL': u'http://public.com:9292/v1', + u'region': u'RegionOne'}], + u'endpoints_links': [], + u'name': u'Image Service', + u'type': u'image'}, + {u'endpoints': [{ +u'adminURL': u'http://admin:8774/v2/225da22d3ce34b15877ea70b2a575f58', +u'internalURL': u'http://internal:8774/v2/225da22d3ce34b15877ea70b2a575f58', +u'publicURL': u'http://public.com:8774/v2/225da22d3ce34b15877ea70b2a575f58', +u'region': u'RegionOne'}], + u'endpoints_links': [], + u'name': u'Compute Service', + u'type': u'compute'}, + {u'endpoints': [{ +u'adminURL': u'http://admin:8773/services/Admin', +u'internalURL': u'http://internal:8773/services/Cloud', +u'publicURL': u'http://public.com:8773/services/Cloud', +u'region': u'RegionOne'}], + u'endpoints_links': [], + u'name': u'EC2 Service', + u'type': u'ec2'}, + {u'endpoints': [{ +u'adminURL': u'http://admin:35357/v2.0', +u'internalURL': u'http://internal:5000/v2.0', +u'publicURL': u'http://public.com:5000/v2.0', +u'region': u'RegionOne'}], + u'endpoints_links': [], + u'name': u'Identity Service', + u'type': u'identity'}], + u'token': {u'expires': u'2012-10-03T16:53:36Z', + u'id': u'04c7d5ffaeef485f9dc69c06db285bdb', + u'tenant': {u'description': u'', + u'enabled': True, + u'id': u'225da22d3ce34b15877ea70b2a575f58', + u'name': u'exampleproject'}}, + u'user': {u'id': u'c4da488862bd435c9e6c0275a0d0e49a', + u'name': u'exampleuser', + u'roles': [{u'id': u'edc12489faa74ee0aca0b8a0b4d74a74', + u'name': u'Member'}], + u'roles_links': [], + u'username': u'exampleuser'} + } +} diff --git a/tests/test_access.py b/tests/test_access.py index e7298191..be2a186b 100644 --- a/tests/test_access.py +++ b/tests/test_access.py @@ -1,78 +1,9 @@ from keystoneclient import access from tests import utils +from tests import client_fixtures -UNSCOPED_TOKEN = { - u'access': {u'serviceCatalog': {}, - u'token': {u'expires': u'2012-10-03T16:58:01Z', - u'id': u'3e2813b7ba0b4006840c3825860b86ed'}, - u'user': {u'id': u'c4da488862bd435c9e6c0275a0d0e49a', - u'name': u'exampleuser', - u'roles': [], - u'roles_links': [], - u'username': u'exampleuser'} - } -} - -PROJECT_SCOPED_TOKEN = { - u'access': { - u'serviceCatalog': [{ - u'endpoints': [{ - u'adminURL': u'http://admin:8776/v1/225da22d3ce34b15877ea70b2a575f58', - u'internalURL': - u'http://internal:8776/v1/225da22d3ce34b15877ea70b2a575f58', - u'publicURL': - u'http://public.com:8776/v1/225da22d3ce34b15877ea70b2a575f58', - u'region': u'RegionOne' - }], - u'endpoints_links': [], - u'name': u'Volume Service', - u'type': u'volume'}, - {u'endpoints': [{ - u'adminURL': u'http://admin:9292/v1', - u'internalURL': u'http://internal:9292/v1', - u'publicURL': u'http://public.com:9292/v1', - u'region': u'RegionOne'}], - u'endpoints_links': [], - u'name': u'Image Service', - u'type': u'image'}, - {u'endpoints': [{ -u'adminURL': u'http://admin:8774/v2/225da22d3ce34b15877ea70b2a575f58', -u'internalURL': u'http://internal:8774/v2/225da22d3ce34b15877ea70b2a575f58', -u'publicURL': u'http://public.com:8774/v2/225da22d3ce34b15877ea70b2a575f58', -u'region': u'RegionOne'}], - u'endpoints_links': [], - u'name': u'Compute Service', - u'type': u'compute'}, - {u'endpoints': [{ -u'adminURL': u'http://admin:8773/services/Admin', -u'internalURL': u'http://internal:8773/services/Cloud', -u'publicURL': u'http://public.com:8773/services/Cloud', -u'region': u'RegionOne'}], - u'endpoints_links': [], - u'name': u'EC2 Service', - u'type': u'ec2'}, - {u'endpoints': [{ -u'adminURL': u'http://admin:35357/v2.0', -u'internalURL': u'http://internal:5000/v2.0', -u'publicURL': u'http://public.com:5000/v2.0', -u'region': u'RegionOne'}], - u'endpoints_links': [], - u'name': u'Identity Service', - u'type': u'identity'}], - u'token': {u'expires': u'2012-10-03T16:53:36Z', - u'id': u'04c7d5ffaeef485f9dc69c06db285bdb', - u'tenant': {u'description': u'', - u'enabled': True, - u'id': u'225da22d3ce34b15877ea70b2a575f58', - u'name': u'exampleproject'}}, - u'user': {u'id': u'c4da488862bd435c9e6c0275a0d0e49a', - u'name': u'exampleuser', - u'roles': [{u'id': u'edc12489faa74ee0aca0b8a0b4d74a74', - u'name': u'Member'}], - u'roles_links': [], - u'username': u'exampleuser'} - } -} +UNSCOPED_TOKEN = client_fixtures.UNSCOPED_TOKEN +PROJECT_SCOPED_TOKEN = client_fixtures.PROJECT_SCOPED_TOKEN class AccessInfoTest(utils.TestCase): diff --git a/tests/test_client.py b/tests/test_client.py new file mode 100644 index 00000000..43d0d8d9 --- /dev/null +++ b/tests/test_client.py @@ -0,0 +1,37 @@ +import httplib2 +import json +import mock + +from keystoneclient.v2_0 import client +from tests import client_fixtures +from tests import utils + + +fake_response = httplib2.Response({"status": 200}) +fake_body = json.dumps(client_fixtures.PROJECT_SCOPED_TOKEN) +mock_request = mock.Mock(return_value=(fake_response, fake_body)) + + +class KeystoneclientTest(utils.TestCase): + + def test_scoped_init(self): + with mock.patch.object(httplib2.Http, "request", mock_request): + cl = client.Client(username='exampleuser', + password='password', + auth_url='http://somewhere/') + self.assertIsNotNone(cl.auth_ref) + self.assertTrue(cl.auth_ref.scoped) + + def test_auth_ref_load(self): + with mock.patch.object(httplib2.Http, "request", mock_request): + cl = client.Client(username='exampleuser', + password='password', + auth_url='http://somewhere/') + cache = json.dumps(cl.auth_ref) + new_client = client.Client(auth_ref=json.loads(cache)) + self.assertIsNotNone(new_client.auth_ref) + self.assertTrue(new_client.auth_ref.scoped) + self.assertEquals(new_client.username, 'exampleuser') + self.assertIsNone(new_client.password) + self.assertEqual(new_client.management_url, + 'http://admin:35357/v2.0')