From 5d93e928d0ba47f57605b603c20c2da7b847e924 Mon Sep 17 00:00:00 2001 From: "J. Matt Peterson" Date: Wed, 1 May 2013 17:54:11 -0700 Subject: Refactor v3 API to support filtering Fixes: bug #1175356 Future implementations of keystone API v3 will support server-side filtering using key/value attributes. See additional details: https://github.com/openstack/identity-api/blob/master/openstack-identity-api/src/markdown/identity-api-v3.md#list-entities-filtered-by-attribute To support this functionality **kwargs need to be passed from the v3 API classes to keystoneclient.base.CrudManager.list. This is not fully implemented server-side for all attributes so it's difficult to document exactly which attributes will work. An example of a working attribute is: keystone.users.list(name="someone") Change-Id: I148093fbe37700f890ed44148aa3f63f34ee5ff5 --- keystoneclient/v3/endpoints.py | 12 +++++++++--- keystoneclient/v3/groups.py | 13 +++++++++++-- keystoneclient/v3/projects.py | 13 +++++++++++-- keystoneclient/v3/roles.py | 12 ++++++++---- keystoneclient/v3/users.py | 13 +++++++++++-- 5 files changed, 50 insertions(+), 13 deletions(-) diff --git a/keystoneclient/v3/endpoints.py b/keystoneclient/v3/endpoints.py index c13313d..010572b 100644 --- a/keystoneclient/v3/endpoints.py +++ b/keystoneclient/v3/endpoints.py @@ -61,14 +61,20 @@ class EndpointManager(base.CrudManager): return super(EndpointManager, self).get( endpoint_id=base.getid(endpoint)) - def list(self, service=None, name=None, interface=None, region=None, - enabled=None): + def list(self, service=None, interface=None, region=None, + enabled=None, **kwargs): + """List endpoints. + + If ``**kwargs`` are provided, then filter endpoints with + attributes matching ``**kwargs``. + """ self._validate_interface(interface) return super(EndpointManager, self).list( service_id=base.getid(service), interface=interface, region=region, - enabled=enabled) + enabled=enabled, + **kwargs) def update(self, endpoint, service=None, url=None, name=None, interface=None, region=None, enabled=None): diff --git a/keystoneclient/v3/groups.py b/keystoneclient/v3/groups.py index e196daf..f6e04c6 100644 --- a/keystoneclient/v3/groups.py +++ b/keystoneclient/v3/groups.py @@ -55,13 +55,22 @@ class GroupManager(base.CrudManager): domain_id=base.getid(domain), description=description) - def list(self, user=None): + def list(self, user=None, **kwargs): + """List groups. + + If user is provided, then filter groups with + that attribute. + + If ``**kwargs`` are provided, then filter groups with + attributes matching ``**kwargs``. + """ if user: base_url = '/users/%s' % base.getid(user) else: base_url = None return super(GroupManager, self).list( - base_url=base_url) + base_url=base_url, + **kwargs) def get(self, group): return super(GroupManager, self).get( diff --git a/keystoneclient/v3/projects.py b/keystoneclient/v3/projects.py index bcbc4fd..cb08061 100644 --- a/keystoneclient/v3/projects.py +++ b/keystoneclient/v3/projects.py @@ -58,11 +58,20 @@ class ProjectManager(base.CrudManager): description=description, enabled=enabled) - def list(self, domain=None, user=None): + def list(self, domain=None, user=None, **kwargs): + """List projects. + + If domain or user are provided, then filter projects with + those attributes. + + If ``**kwargs`` are provided, then filter projects with + attributes matching ``**kwargs``. + """ base_url = '/users/%s' % base.getid(user) if user else None return super(ProjectManager, self).list( base_url=base_url, - domain_id=base.getid(domain)) + domain_id=base.getid(domain), + **kwargs) def get(self, project): return super(ProjectManager, self).get( diff --git a/keystoneclient/v3/roles.py b/keystoneclient/v3/roles.py index a930426..8bd269d 100644 --- a/keystoneclient/v3/roles.py +++ b/keystoneclient/v3/roles.py @@ -74,13 +74,16 @@ class RoleManager(base.CrudManager): return super(RoleManager, self).get( role_id=base.getid(role)) - def list(self, user=None, group=None, domain=None, project=None): + def list(self, user=None, group=None, domain=None, project=None, **kwargs): """Lists roles and role grants. - If no arguments are provided, all roles in the system will be listed. + If no arguments are provided, all roles in the system will be + listed. If a user or group is specified, you must also specify either a - domain or project to list role grants on that pair. + domain or project to list role grants on that pair. And if + ``**kwargs`` are provided, then also filter roles with + attributes matching ``**kwargs``. """ if user or group: @@ -89,7 +92,8 @@ class RoleManager(base.CrudManager): return super(RoleManager, self).list( base_url=self._role_grants_base_url(user, group, - domain, project)) + domain, project), + **kwargs) return super(RoleManager, self).list() diff --git a/keystoneclient/v3/users.py b/keystoneclient/v3/users.py index 363cef3..6046513 100644 --- a/keystoneclient/v3/users.py +++ b/keystoneclient/v3/users.py @@ -49,7 +49,15 @@ class UserManager(base.CrudManager): description=description, enabled=enabled) - def list(self, project=None, domain=None, group=None): + def list(self, project=None, domain=None, group=None, **kwargs): + """List users. + + If project, domain or group are provided, then filter + users with those attributes. + + If ``**kwargs`` are provided, then filter users with + attributes matching ``**kwargs``. + """ if group: base_url = '/groups/%s' % base.getid(group) else: @@ -58,7 +66,8 @@ class UserManager(base.CrudManager): return super(UserManager, self).list( base_url=base_url, domain_id=base.getid(domain), - project_id=base.getid(project)) + project_id=base.getid(project), + **kwargs) def get(self, user): return super(UserManager, self).get( -- cgit v1.2.1