Skip to content

Commit 0c0803d

Browse files
author
Steven Hardy
committed
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
1 parent ce63fa0 commit 0c0803d

2 files changed

Lines changed: 42 additions & 1 deletion

File tree

openstackclient/identity/v3/project.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,15 +140,27 @@ def get_parser(self, prog_name):
140140
default=False,
141141
help='List additional fields in output',
142142
)
143+
parser.add_argument(
144+
'--domain',
145+
metavar='<project-domain>',
146+
help='Filter by a specific domain',
147+
)
143148
return parser
144149

145150
def take_action(self, parsed_args):
146151
self.log.debug('take_action(%s)' % parsed_args)
152+
identity_client = self.app.client_manager.identity
147153
if parsed_args.long:
148154
columns = ('ID', 'Name', 'Domain ID', 'Description', 'Enabled')
149155
else:
150156
columns = ('ID', 'Name')
151-
data = self.app.client_manager.identity.projects.list()
157+
kwargs = {}
158+
if parsed_args.domain:
159+
kwargs['domain'] = utils.find_resource(
160+
identity_client.domains,
161+
parsed_args.domain,
162+
).id
163+
data = identity_client.projects.list(**kwargs)
152164
return (columns,
153165
(utils.get_item_properties(
154166
s, columns,

openstackclient/tests/identity/v3/test_project.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,35 @@ def test_project_list_long(self):
376376
), )
377377
self.assertEqual(tuple(data), datalist)
378378

379+
def test_project_list_domain(self):
380+
arglist = [
381+
'--domain', identity_fakes.domain_name,
382+
]
383+
verifylist = [
384+
('domain', identity_fakes.domain_name),
385+
]
386+
387+
self.domains_mock.get.return_value = fakes.FakeResource(
388+
None,
389+
copy.deepcopy(identity_fakes.DOMAIN),
390+
loaded=True,
391+
)
392+
393+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
394+
395+
# DisplayCommandBase.take_action() returns two tuples
396+
columns, data = self.cmd.take_action(parsed_args)
397+
self.projects_mock.list.assert_called_with(
398+
domain=identity_fakes.domain_id)
399+
400+
collist = ('ID', 'Name')
401+
self.assertEqual(columns, collist)
402+
datalist = ((
403+
identity_fakes.project_id,
404+
identity_fakes.project_name,
405+
), )
406+
self.assertEqual(tuple(data), datalist)
407+
379408

380409
class TestProjectSet(TestProject):
381410

0 commit comments

Comments
 (0)