diff --git a/doc/source/users/proxies/identity_v2.rst b/doc/source/users/proxies/identity_v2.rst index 66f4b528c..3f2c65aeb 100644 --- a/doc/source/users/proxies/identity_v2.rst +++ b/doc/source/users/proxies/identity_v2.rst @@ -12,7 +12,15 @@ The identity high-level interface is available through the ``identity`` member of a :class:`~openstack.connection.Connection` object. The ``identity`` member will only be added if the service is detected. -User Operations +Extension Operations +^^^^^^^^^^^^^^^^^^^^ + +.. autoclass:: openstack.identity.v2._proxy.Proxy + + .. automethod:: openstack.identity.v2._proxy.Proxy.get_extension + .. automethod:: openstack.identity.v2._proxy.Proxy.extensions + + User Operations ^^^^^^^^^^^^^^^ .. autoclass:: openstack.identity.v2._proxy.Proxy diff --git a/openstack/identity/v2/_proxy.py b/openstack/identity/v2/_proxy.py index a25d83241..e371da5e8 100644 --- a/openstack/identity/v2/_proxy.py +++ b/openstack/identity/v2/_proxy.py @@ -10,14 +10,36 @@ # License for the specific language governing permissions and limitations # under the License. +from openstack.identity.v2 import extension as _extension from openstack.identity.v2 import role as _role from openstack.identity.v2 import tenant as _tenant from openstack.identity.v2 import user as _user -from openstack import proxy +from openstack import proxy2 as proxy class Proxy(proxy.BaseProxy): + def extensions(self): + """Retrieve a generator of extensions + + :returns: A generator of extension instances. + :rtype: :class:`~openstack.identity.v2.extension.Extension` + """ + return self._list(_extension.Extension, paginated=False) + + def get_extension(self, extension): + """Get a single extension + + :param extension: The value can be the ID of an extension or a + :class:`~openstack.identity.v2.extension.Extension` + instance. + + :returns: One :class:`~openstack.identity.v2.extension.Extension` + :raises: :class:`~openstack.exceptions.ResourceNotFound` + when no extension can be found. + """ + return self._get(_extension.Extension, extension) + def create_role(self, **attrs): """Create a new role from attributes diff --git a/openstack/identity/v2/extension.py b/openstack/identity/v2/extension.py index 19c8ab448..b4160aad4 100644 --- a/openstack/identity/v2/extension.py +++ b/openstack/identity/v2/extension.py @@ -11,7 +11,7 @@ # under the License. from openstack.identity import identity_service -from openstack import resource +from openstack import resource2 as resource class Extension(resource.Resource): @@ -22,29 +22,30 @@ class Extension(resource.Resource): # capabilities allow_list = True + allow_get = True # Properties #: A unique identifier, which will be used for accessing the extension #: through a dedicated url ``/extensions/*alias*``. The extension #: alias uniquely identifies an extension and is prefixed by a vendor #: identifier. *Type: string* - alias = resource.prop('alias') + alias = resource.Body('alias', alternate_id=True) #: A description of the extension. *Type: string* - description = resource.prop('description') + description = resource.Body('description') #: Links to the documentation in various format. *Type: string* - links = resource.prop('links') + links = resource.Body('links') #: The name of the extension. *Type: string* - name = resource.prop('name') + name = resource.Body('name') #: The second unique identifier of the extension after the alias. #: It is usually a URL which will be used. Example: #: "http://docs.openstack.org/identity/api/ext/s3tokens/v1.0" #: *Type: string* - namespace = resource.prop('namespace') + namespace = resource.Body('namespace') #: The last time the extension has been modified (update date). - updated_at = resource.prop('updated') + updated_at = resource.Body('updated') @classmethod - def list(cls, session, **params): + def list(cls, session, paginated=False, **params): resp = session.get(cls.base_path, endpoint_filter=cls.service, params=params) resp = resp.json() diff --git a/openstack/identity/v2/role.py b/openstack/identity/v2/role.py index 536b19280..b3b0a0363 100644 --- a/openstack/identity/v2/role.py +++ b/openstack/identity/v2/role.py @@ -12,7 +12,7 @@ from openstack import format from openstack.identity import identity_service -from openstack import resource +from openstack import resource2 as resource class Role(resource.Resource): @@ -23,16 +23,16 @@ class Role(resource.Resource): # capabilities allow_create = True - allow_retrieve = True + allow_get = True allow_update = True allow_delete = True allow_list = True # Properties #: The description of the role. *Type: string* - description = resource.prop('description') + description = resource.Body('description') #: Setting this attribute to ``False`` prevents this role from being #: available in the role list. *Type: bool* - is_enabled = resource.prop('enabled', type=format.BoolStr) + is_enabled = resource.Body('enabled', type=format.BoolStr) #: Unique role name. *Type: string* - name = resource.prop('name') + name = resource.Body('name') diff --git a/openstack/identity/v2/tenant.py b/openstack/identity/v2/tenant.py index 93630c992..f6933d5a4 100644 --- a/openstack/identity/v2/tenant.py +++ b/openstack/identity/v2/tenant.py @@ -11,7 +11,7 @@ # under the License. from openstack.identity import identity_service -from openstack import resource +from openstack import resource2 as resource class Tenant(resource.Resource): @@ -22,18 +22,18 @@ class Tenant(resource.Resource): # capabilities allow_create = True - allow_retrieve = True + allow_get = True allow_update = True allow_delete = True allow_list = True # Properties #: The description of the tenant. *Type: string* - description = resource.prop('description') + description = resource.Body('description') #: Setting this attribute to ``False`` prevents users from authorizing #: against this tenant. Additionally, all pre-existing tokens authorized #: for the tenant are immediately invalidated. Re-enabling a tenant #: does not re-enable pre-existing tokens. *Type: bool* - is_enabled = resource.prop('enabled', type=bool) + is_enabled = resource.Body('enabled', type=bool) #: Unique tenant name. *Type: string* - name = resource.prop('name') + name = resource.Body('name') diff --git a/openstack/identity/v2/user.py b/openstack/identity/v2/user.py index 930494c90..0e5a5846b 100644 --- a/openstack/identity/v2/user.py +++ b/openstack/identity/v2/user.py @@ -11,7 +11,7 @@ # under the License. from openstack.identity import identity_service -from openstack import resource +from openstack import resource2 as resource class User(resource.Resource): @@ -22,18 +22,18 @@ class User(resource.Resource): # capabilities allow_create = True - allow_retrieve = True + allow_get = True allow_update = True allow_delete = True allow_list = True # Properties #: The email of this user. *Type: string* - email = resource.prop('email') + email = resource.Body('email') #: Setting this value to ``False`` prevents the user from authenticating or #: receiving authorization. Additionally, all pre-existing tokens held by #: the user are immediately invalidated. Re-enabling a user does not #: re-enable pre-existing tokens. *Type: bool* - is_enabled = resource.prop('enabled', type=bool) + is_enabled = resource.Body('enabled', type=bool) #: The name of this user. *Type: string* - name = resource.prop('name') + name = resource.Body('name') diff --git a/openstack/tests/unit/identity/v2/test_extension.py b/openstack/tests/unit/identity/v2/test_extension.py index 3c9471d5c..13d0d29b1 100644 --- a/openstack/tests/unit/identity/v2/test_extension.py +++ b/openstack/tests/unit/identity/v2/test_extension.py @@ -35,13 +35,13 @@ class TestExtension(testtools.TestCase): self.assertEqual('/extensions', sot.base_path) self.assertEqual('identity', sot.service.service_type) self.assertFalse(sot.allow_create) - self.assertFalse(sot.allow_retrieve) + self.assertTrue(sot.allow_get) self.assertFalse(sot.allow_update) self.assertFalse(sot.allow_delete) self.assertTrue(sot.allow_list) def test_make_it(self): - sot = extension.Extension(EXAMPLE) + sot = extension.Extension(**EXAMPLE) self.assertEqual(EXAMPLE['alias'], sot.alias) self.assertEqual(EXAMPLE['description'], sot.description) self.assertEqual(EXAMPLE['links'], sot.links) @@ -62,7 +62,7 @@ class TestExtension(testtools.TestCase): resp.json = mock.Mock(return_value=resp.body) session = mock.Mock() session.get = mock.Mock(return_value=resp) - sot = extension.Extension(EXAMPLE) + sot = extension.Extension(**EXAMPLE) result = sot.list(session) self.assertEqual(next(result).name, 'a') self.assertEqual(next(result).name, 'b') diff --git a/openstack/tests/unit/identity/v2/test_proxy.py b/openstack/tests/unit/identity/v2/test_proxy.py index 5080cc9e0..cbca1fd7b 100644 --- a/openstack/tests/unit/identity/v2/test_proxy.py +++ b/openstack/tests/unit/identity/v2/test_proxy.py @@ -14,7 +14,7 @@ from openstack.identity.v2 import _proxy from openstack.identity.v2 import role from openstack.identity.v2 import tenant from openstack.identity.v2 import user -from openstack.tests.unit import test_proxy_base +from openstack.tests.unit import test_proxy_base2 as test_proxy_base class TestIdentityProxy(test_proxy_base.TestProxyBase): diff --git a/openstack/tests/unit/identity/v2/test_role.py b/openstack/tests/unit/identity/v2/test_role.py index 55967c25e..e1f67ba36 100644 --- a/openstack/tests/unit/identity/v2/test_role.py +++ b/openstack/tests/unit/identity/v2/test_role.py @@ -32,14 +32,13 @@ class TestRole(testtools.TestCase): self.assertEqual('/OS-KSADM/roles', sot.base_path) self.assertEqual('identity', sot.service.service_type) self.assertTrue(sot.allow_create) - self.assertTrue(sot.allow_retrieve) + self.assertTrue(sot.allow_get) self.assertTrue(sot.allow_update) self.assertTrue(sot.allow_delete) self.assertTrue(sot.allow_list) def test_make_it(self): - sot = role.Role(EXAMPLE) - self.assertTrue(sot.enabled) + sot = role.Role(**EXAMPLE) self.assertEqual(EXAMPLE['description'], sot.description) self.assertEqual(EXAMPLE['id'], sot.id) self.assertEqual(EXAMPLE['name'], sot.name) diff --git a/openstack/tests/unit/identity/v2/test_tenant.py b/openstack/tests/unit/identity/v2/test_tenant.py index 3430284b0..b123ce40c 100644 --- a/openstack/tests/unit/identity/v2/test_tenant.py +++ b/openstack/tests/unit/identity/v2/test_tenant.py @@ -32,13 +32,13 @@ class TestTenant(testtools.TestCase): self.assertEqual('/tenants', sot.base_path) self.assertEqual('identity', sot.service.service_type) self.assertTrue(sot.allow_create) - self.assertTrue(sot.allow_retrieve) + self.assertTrue(sot.allow_get) self.assertTrue(sot.allow_update) self.assertTrue(sot.allow_delete) self.assertTrue(sot.allow_list) def test_make_it(self): - sot = tenant.Tenant(EXAMPLE) + sot = tenant.Tenant(**EXAMPLE) self.assertEqual(EXAMPLE['description'], sot.description) self.assertTrue(sot.is_enabled) self.assertEqual(EXAMPLE['id'], sot.id) diff --git a/openstack/tests/unit/identity/v2/test_user.py b/openstack/tests/unit/identity/v2/test_user.py index d6ec1ee39..161b8bade 100644 --- a/openstack/tests/unit/identity/v2/test_user.py +++ b/openstack/tests/unit/identity/v2/test_user.py @@ -32,13 +32,13 @@ class TestUser(testtools.TestCase): self.assertEqual('/users', sot.base_path) self.assertEqual('identity', sot.service.service_type) self.assertTrue(sot.allow_create) - self.assertTrue(sot.allow_retrieve) + self.assertTrue(sot.allow_get) self.assertTrue(sot.allow_update) self.assertTrue(sot.allow_delete) self.assertTrue(sot.allow_list) def test_make_it(self): - sot = user.User(EXAMPLE) + sot = user.User(**EXAMPLE) self.assertEqual(EXAMPLE['email'], sot.email) self.assertTrue(sot.is_enabled) self.assertEqual(EXAMPLE['id'], sot.id)