summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZuul <zuul@review.opendev.org>2019-09-10 20:36:10 +0000
committerGerrit Code Review <review@openstack.org>2019-09-10 20:36:10 +0000
commit4e812b673b5c324d3f10c9f8c43570cafa561d0b (patch)
treeb23e1ee2245962ca776e02a33ef72ba97a774724
parent27d4376ea57be9944ee5eb0601157f8996de077f (diff)
parent2d3ec6eb89574d442c357b2b8231367ba1ac24f6 (diff)
downloadpython-keystoneclient-4e812b673b5c324d3f10c9f8c43570cafa561d0b.tar.gz
Merge "Add parent project filter for listing projects"
-rw-r--r--keystoneclient/tests/functional/v3/test_projects.py24
-rw-r--r--keystoneclient/tests/unit/v3/test_projects.py15
-rw-r--r--keystoneclient/v3/projects.py6
-rw-r--r--releasenotes/notes/list_projects_filtered_by_the_parent_project-a873974f197c1e37.yaml5
4 files changed, 47 insertions, 3 deletions
diff --git a/keystoneclient/tests/functional/v3/test_projects.py b/keystoneclient/tests/functional/v3/test_projects.py
index c40da50..eec2745 100644
--- a/keystoneclient/tests/functional/v3/test_projects.py
+++ b/keystoneclient/tests/functional/v3/test_projects.py
@@ -157,6 +157,30 @@ class ProjectsTestCase(base.V3ClientTestCase, ProjectsTestMixin):
self.assertIn(project_one.entity, projects)
self.assertIn(project_two.entity, projects)
+ def test_list_subprojects(self):
+ parent_project = fixtures.Project(self.client, self.test_domain.id)
+ self.useFixture(parent_project)
+
+ child_project_one = fixtures.Project(self.client, self.test_domain.id,
+ parent=parent_project.id)
+ self.useFixture(child_project_one)
+
+ child_project_two = fixtures.Project(self.client, self.test_domain.id,
+ parent=parent_project.id)
+ self.useFixture(child_project_two)
+
+ projects = self.client.projects.list(parent=parent_project.id)
+
+ # All projects are valid
+ for project in projects:
+ self.check_project(project)
+
+ self.assertIn(child_project_one.entity, projects)
+ self.assertIn(child_project_two.entity, projects)
+
+ # Parent project should not be included in the result
+ self.assertNotIn(parent_project.entity, projects)
+
def test_update_project(self):
project = fixtures.Project(self.client, self.test_domain.id)
self.useFixture(project)
diff --git a/keystoneclient/tests/unit/v3/test_projects.py b/keystoneclient/tests/unit/v3/test_projects.py
index 2df8f05..99186f1 100644
--- a/keystoneclient/tests/unit/v3/test_projects.py
+++ b/keystoneclient/tests/unit/v3/test_projects.py
@@ -55,8 +55,7 @@ class ProjectTests(utils.ClientTestCase, utils.CrudTests):
ref_list = [self.new_ref(), self.new_ref()]
domain_id = uuid.uuid4().hex
- self.stub_entity('GET', [self.collection_key],
- entity=ref_list)
+ self.stub_entity('GET', [self.collection_key], entity=ref_list)
returned_list = self.manager.list(domain=domain_id)
self.assertEqual(len(ref_list), len(returned_list))
@@ -64,6 +63,18 @@ class ProjectTests(utils.ClientTestCase, utils.CrudTests):
self.assertQueryStringIs('domain_id=%s' % domain_id)
+ def test_list_projects_for_parent(self):
+ ref_list = [self.new_ref(), self.new_ref()]
+ parent_id = uuid.uuid4().hex
+
+ self.stub_entity('GET', [self.collection_key], entity=ref_list)
+
+ returned_list = self.manager.list(parent=parent_id)
+ self.assertEqual(len(ref_list), len(returned_list))
+ [self.assertIsInstance(r, self.model) for r in returned_list]
+
+ self.assertQueryStringIs('parent_id=%s' % parent_id)
+
def test_create_with_parent(self):
parent_ref = self.new_ref()
parent_ref['parent_id'] = uuid.uuid4().hex
diff --git a/keystoneclient/v3/projects.py b/keystoneclient/v3/projects.py
index 5975bda..edaf982 100644
--- a/keystoneclient/v3/projects.py
+++ b/keystoneclient/v3/projects.py
@@ -112,7 +112,7 @@ class ProjectManager(base.CrudManager):
enabled=enabled,
**kwargs)
- def list(self, domain=None, user=None, **kwargs):
+ def list(self, domain=None, user=None, parent=None, **kwargs):
"""List projects.
:param domain: the domain of the projects to be filtered on.
@@ -120,6 +120,9 @@ class ProjectManager(base.CrudManager):
:param user: filter in projects the specified user has role
assignments on.
:type user: str or :class:`keystoneclient.v3.users.User`
+ :param parent: filter in projects the specified project is a parent
+ for
+ :type parent: str or :class:`keystoneclient.v3.projects.Project`
:param kwargs: any other attribute provided will filter projects on.
Project tags filter keyword: ``tags``, ``tags_any``,
``not_tags``, and ``not_tags_any``. tag attribute type
@@ -134,6 +137,7 @@ class ProjectManager(base.CrudManager):
projects = super(ProjectManager, self).list(
base_url=base_url,
domain_id=base.getid(domain),
+ parent_id=base.getid(parent),
fallback_to_auth=True,
**kwargs)
diff --git a/releasenotes/notes/list_projects_filtered_by_the_parent_project-a873974f197c1e37.yaml b/releasenotes/notes/list_projects_filtered_by_the_parent_project-a873974f197c1e37.yaml
new file mode 100644
index 0000000..988dca5
--- /dev/null
+++ b/releasenotes/notes/list_projects_filtered_by_the_parent_project-a873974f197c1e37.yaml
@@ -0,0 +1,5 @@
+---
+features:
+ - |
+ Now keystone client supports to list projects which belongs to the given
+ parent project.