From 0c0803d363aeae9e8a6eb2cdaf4b5baedee416dc Mon Sep 17 00:00:00 2001
From: Steven Hardy <shardy@redhat.com>
Date: Fri, 7 Mar 2014 18:25:41 +0000
Subject: [PATCH] identity v3 allow project list filtering by domain

The underlying keystoneclient interface allows filtering by domain,
so support it in the cli interface because it makes project list
much nicer to use in a multi-domain deployment.

Change-Id: If3f5cf1205c1e9cf314f8286a3ae81bda4456b8f
Closes-Bug: #1289513
---
 openstackclient/identity/v3/project.py        | 14 ++++++++-
 .../tests/identity/v3/test_project.py         | 29 +++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)

diff --git a/openstackclient/identity/v3/project.py b/openstackclient/identity/v3/project.py
index ebae733df9..d3618fb3ce 100644
--- a/openstackclient/identity/v3/project.py
+++ b/openstackclient/identity/v3/project.py
@@ -140,15 +140,27 @@ class ListProject(lister.Lister):
             default=False,
             help='List additional fields in output',
         )
+        parser.add_argument(
+            '--domain',
+            metavar='<project-domain>',
+            help='Filter by a specific domain',
+        )
         return parser
 
     def take_action(self, parsed_args):
         self.log.debug('take_action(%s)' % parsed_args)
+        identity_client = self.app.client_manager.identity
         if parsed_args.long:
             columns = ('ID', 'Name', 'Domain ID', 'Description', 'Enabled')
         else:
             columns = ('ID', 'Name')
-        data = self.app.client_manager.identity.projects.list()
+        kwargs = {}
+        if parsed_args.domain:
+            kwargs['domain'] = utils.find_resource(
+                identity_client.domains,
+                parsed_args.domain,
+            ).id
+        data = identity_client.projects.list(**kwargs)
         return (columns,
                 (utils.get_item_properties(
                     s, columns,
diff --git a/openstackclient/tests/identity/v3/test_project.py b/openstackclient/tests/identity/v3/test_project.py
index 517c73c594..0479d37996 100644
--- a/openstackclient/tests/identity/v3/test_project.py
+++ b/openstackclient/tests/identity/v3/test_project.py
@@ -376,6 +376,35 @@ class TestProjectList(TestProject):
         ), )
         self.assertEqual(tuple(data), datalist)
 
+    def test_project_list_domain(self):
+        arglist = [
+            '--domain', identity_fakes.domain_name,
+        ]
+        verifylist = [
+            ('domain', identity_fakes.domain_name),
+        ]
+
+        self.domains_mock.get.return_value = fakes.FakeResource(
+            None,
+            copy.deepcopy(identity_fakes.DOMAIN),
+            loaded=True,
+        )
+
+        parsed_args = self.check_parser(self.cmd, arglist, verifylist)
+
+        # DisplayCommandBase.take_action() returns two tuples
+        columns, data = self.cmd.take_action(parsed_args)
+        self.projects_mock.list.assert_called_with(
+            domain=identity_fakes.domain_id)
+
+        collist = ('ID', 'Name')
+        self.assertEqual(columns, collist)
+        datalist = ((
+            identity_fakes.project_id,
+            identity_fakes.project_name,
+        ), )
+        self.assertEqual(tuple(data), datalist)
+
 
 class TestProjectSet(TestProject):