diff --git a/doc/source/user/proxies/identity_v3.rst b/doc/source/user/proxies/identity_v3.rst index 548abf4ca..fe02e2fbc 100644 --- a/doc/source/user/proxies/identity_v3.rst +++ b/doc/source/user/proxies/identity_v3.rst @@ -84,6 +84,7 @@ User Operations .. autoclass:: openstack.identity.v3._proxy.Proxy :noindex: :members: create_user, update_user, delete_user, get_user, find_user, users, + user_groups Trust Operations ^^^^^^^^^^^^^^^^ diff --git a/doc/source/user/resources/identity/v3/group.rst b/doc/source/user/resources/identity/v3/group.rst index fe6c4462a..d1215113d 100644 --- a/doc/source/user/resources/identity/v3/group.rst +++ b/doc/source/user/resources/identity/v3/group.rst @@ -10,3 +10,12 @@ The ``Group`` class inherits from :class:`~openstack.resource.Resource`. .. autoclass:: openstack.identity.v3.group.Group :members: + +The UserGroup Class +------------------- + +The ``UserGroup`` class inherits from +:class:`~openstack.identity.v3.group.Group` + +.. autoclass:: openstack.identity.v3.group.UserGroup + :members: diff --git a/openstack/identity/v3/_proxy.py b/openstack/identity/v3/_proxy.py index 84c9ef25a..207ba661c 100644 --- a/openstack/identity/v3/_proxy.py +++ b/openstack/identity/v3/_proxy.py @@ -939,6 +939,18 @@ class Proxy(proxy.Proxy): """ return self._get(_user.User, user) + def user_groups(self, user): + """List groups a user is in + + :param user: Either the ID of a user or a + :class:`~openstack.identity.v3.user.User` instance + + :return: List of :class:`~openstack.identity.v3.group.group` + """ + user_id = self._get_resource(_user.User, user).id + groups = self._list(_group.UserGroup, user_id=user_id) + return groups + def users(self, **query): """Retrieve a generator of users diff --git a/openstack/identity/v3/group.py b/openstack/identity/v3/group.py index c1c11d9a7..d795f96f5 100644 --- a/openstack/identity/v3/group.py +++ b/openstack/identity/v3/group.py @@ -74,3 +74,17 @@ class Group(resource.Resource): if resp.status_code == 204: return True return False + + +class UserGroup(Group): + base_path = '/users/%(user_id)%/groups' + + #: The ID for the user from the URI of the resource + user_id = resource.URI('user_id') + + # capabilities + allow_create = False + allow_fetch = False + allow_commit = False + allow_delete = False + allow_list = True diff --git a/openstack/tests/unit/identity/v3/test_proxy.py b/openstack/tests/unit/identity/v3/test_proxy.py index faaa3a5e6..13b930b77 100644 --- a/openstack/tests/unit/identity/v3/test_proxy.py +++ b/openstack/tests/unit/identity/v3/test_proxy.py @@ -385,6 +385,14 @@ class TestIdentityProxyUser(TestIdentityProxyBase): def test_user_update(self): self.verify_update(self.proxy.update_user, user.User) + def test_user_groups(self): + self.verify_list( + self.proxy.user_groups, + group.UserGroup, + method_kwargs={"user": 'user'}, + expected_kwargs={"user_id": "user"}, + ) + class TestIdentityProxyTrust(TestIdentityProxyBase): def test_trust_create_attrs(self):