From 90d161fc3a6b81c86b1948783fa2837333b44732 Mon Sep 17 00:00:00 2001 From: Jamie Lennox Date: Thu, 22 Aug 2013 11:05:30 +1000 Subject: [PATCH] Add domain attributes to accessinfo user_domain_id and project_domain_id are already available, so simply add an equivalent user_domain_name and project_domain_name if available. The use of 'default' for v2 tokens is inspired from the default behaviour of similar functions and what is used in auth_token middleware. Change-Id: Ia9b345529072ab893d04c7a38fb7ba3acdc28227 --- keystoneclient/access.py | 57 ++++++++++++++++++++++++++++++++++----- tests/v2_0/test_access.py | 18 +++++++++++++ tests/v3/test_access.py | 22 +++++++++++++++ 3 files changed, 91 insertions(+), 6 deletions(-) diff --git a/keystoneclient/access.py b/keystoneclient/access.py index 5a10c798f..483e8935c 100644 --- a/keystoneclient/access.py +++ b/keystoneclient/access.py @@ -134,10 +134,23 @@ class AccessInfo(dict): @property def user_domain_id(self): """Returns the domain id of the user associated with the authentication - request. + request. + + For v2, it always returns 'default' which may be different from the + Keystone configuration. + + :returns: str + """ + raise NotImplementedError() + + @property + def user_domain_name(self): + """Returns the domain name of the user associated with the + authentication request. + + For v2, it always returns 'Default' which may be different from the + Keystone configuration. - For v2, it always returns 'default' which maybe different from the - Keystone configuration. :returns: str """ raise NotImplementedError() @@ -234,10 +247,23 @@ class AccessInfo(dict): @property def project_domain_id(self): """Returns the domain id of the project associated with the - authentication request. + authentication request. + + For v2, it returns 'default' if a project is scoped or None which may + be different from the keystone configuration. + + :returns: str + """ + raise NotImplementedError() + + @property + def project_domain_name(self): + """Returns the domain name of the project associated with the + authentication request. + + For v2, it returns 'Default' if a project is scoped or None which may + be different from the keystone configuration. - For v2, it always returns 'default' which maybe different from the - keystone configuration. :returns: str """ raise NotImplementedError() @@ -317,6 +343,10 @@ class AccessInfoV2(AccessInfo): def user_domain_id(self): return 'default' + @property + def user_domain_name(self): + return 'Default' + @property def domain_name(self): return None @@ -396,6 +426,11 @@ class AccessInfoV2(AccessInfo): if self.project_id: return 'default' + @property + def project_domain_name(self): + if self.project_id: + return 'Default' + @property def auth_url(self): if self.service_catalog: @@ -456,6 +491,10 @@ class AccessInfoV3(AccessInfo): def user_domain_id(self): return self['user']['domain']['id'] + @property + def user_domain_name(self): + return self['user']['domain']['name'] + @property def username(self): return self['user']['name'] @@ -484,6 +523,12 @@ class AccessInfoV3(AccessInfo): if project: return project['domain']['id'] + @property + def project_domain_name(self): + project = self.get('project') + if project: + return project['domain']['name'] + @property def project_name(self): project = self.get('project') diff --git a/tests/v2_0/test_access.py b/tests/v2_0/test_access.py index 06ab895ea..d46a820e4 100644 --- a/tests/v2_0/test_access.py +++ b/tests/v2_0/test_access.py @@ -37,6 +37,11 @@ class AccessInfoTest(utils.TestCase): self.assertFalse(auth_ref.project_scoped) self.assertFalse(auth_ref.trust_scoped) + self.assertIsNone(auth_ref.project_domain_id) + self.assertIsNone(auth_ref.project_domain_name) + self.assertEqual(auth_ref.user_domain_id, 'default') + self.assertEqual(auth_ref.user_domain_name, 'Default') + self.assertEquals(auth_ref.expires, timeutils.parse_isotime( UNSCOPED_TOKEN['access']['token']['expires'])) @@ -73,6 +78,11 @@ class AccessInfoTest(utils.TestCase): self.assertEquals(auth_ref.management_url, ('http://admin:35357/v2.0',)) + self.assertEqual(auth_ref.project_domain_id, 'default') + self.assertEqual(auth_ref.project_domain_name, 'Default') + self.assertEqual(auth_ref.user_domain_id, 'default') + self.assertEqual(auth_ref.user_domain_name, 'Default') + self.assertTrue(auth_ref.scoped) self.assertTrue(auth_ref.project_scoped) self.assertFalse(auth_ref.domain_scoped) @@ -84,6 +94,10 @@ class AccessInfoTest(utils.TestCase): self.assertEquals(auth_ref.username, 'user_name1') self.assertEquals(auth_ref.project_id, 'tenant_id1') self.assertEquals(auth_ref.project_name, 'tenant_id1') + self.assertEquals(auth_ref.project_domain_id, 'default') + self.assertEquals(auth_ref.project_domain_name, 'Default') + self.assertEquals(auth_ref.user_domain_id, 'default') + self.assertEquals(auth_ref.user_domain_name, 'Default') self.assertFalse(auth_ref.scoped) def test_grizzly_token(self): @@ -91,3 +105,7 @@ class AccessInfoTest(utils.TestCase): self.assertEquals(auth_ref.project_id, 'tenant_id1') self.assertEquals(auth_ref.project_name, 'tenant_name1') + self.assertEquals(auth_ref.project_domain_id, 'default') + self.assertEquals(auth_ref.project_domain_name, 'Default') + self.assertEquals(auth_ref.user_domain_id, 'default') + self.assertEquals(auth_ref.user_domain_name, 'Default') diff --git a/tests/v3/test_access.py b/tests/v3/test_access.py index 050a373a7..0de6d8ee2 100644 --- a/tests/v3/test_access.py +++ b/tests/v3/test_access.py @@ -37,6 +37,13 @@ class AccessInfoTest(utils.TestCase): self.assertFalse(auth_ref.domain_scoped) self.assertFalse(auth_ref.project_scoped) + self.assertEquals(auth_ref.user_domain_id, + '4e6893b7ba0b4006840c3845660b86ed') + self.assertEquals(auth_ref.user_domain_name, 'exampledomain') + + self.assertIsNone(auth_ref.project_domain_id) + self.assertIsNone(auth_ref.project_domain_name) + self.assertEquals(auth_ref.expires, timeutils.parse_isotime( UNSCOPED_TOKEN['token']['expires_at'])) @@ -70,6 +77,13 @@ class AccessInfoTest(utils.TestCase): self.assertEquals(auth_ref.project_name, None) self.assertEquals(auth_ref.project_id, None) + self.assertEquals(auth_ref.user_domain_id, + '4e6893b7ba0b4006840c3845660b86ed') + self.assertEquals(auth_ref.user_domain_name, 'exampledomain') + + self.assertIsNone(auth_ref.project_domain_id) + self.assertIsNone(auth_ref.project_domain_name) + self.assertTrue(auth_ref.domain_scoped) self.assertFalse(auth_ref.project_scoped) @@ -102,5 +116,13 @@ class AccessInfoTest(utils.TestCase): self.assertEquals(auth_ref.management_url, ('http://admin:35357/v3',)) + self.assertEquals(auth_ref.project_domain_id, + '4e6893b7ba0b4006840c3845660b86ed') + self.assertEquals(auth_ref.project_domain_name, 'exampledomain') + + self.assertEquals(auth_ref.user_domain_id, + '4e6893b7ba0b4006840c3845660b86ed') + self.assertEquals(auth_ref.user_domain_name, 'exampledomain') + self.assertFalse(auth_ref.domain_scoped) self.assertTrue(auth_ref.project_scoped)