Skip to content

Commit 9dd3a53

Browse files
author
Dean Troyer
committed
Complete Identity v3 list command filters
Complete the 'group list' and 'user list' filter options following the refactor in https://review.openstack.org/69878 Change-Id: Ib4af417c56d4f7da4b88852f191af615cc7fa2ec
1 parent c6cc1d7 commit 9dd3a53

4 files changed

Lines changed: 362 additions & 30 deletions

File tree

‎openstackclient/identity/v3/group.py‎

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -164,17 +164,21 @@ def take_action(self, parsed_args):
164164

165165

166166
class ListGroup(lister.Lister):
167-
"""List groups and optionally roles assigned to groups"""
167+
"""List groups"""
168168

169169
log = logging.getLogger(__name__ + '.ListGroup')
170170

171171
def get_parser(self, prog_name):
172172
parser = super(ListGroup, self).get_parser(prog_name)
173173
parser.add_argument(
174-
'group',
175-
metavar='<group>',
176-
nargs='?',
177-
help='Name or ID of group to list [required with --role]',
174+
'--domain',
175+
metavar='<domain>',
176+
help='Filter group list by <domain>',
177+
)
178+
parser.add_argument(
179+
'--user',
180+
metavar='<user>',
181+
help='List group memberships for <user> (name or ID)',
178182
)
179183
parser.add_argument(
180184
'--long',
@@ -188,18 +192,39 @@ def take_action(self, parsed_args):
188192
self.log.debug('take_action(%s)', parsed_args)
189193
identity_client = self.app.client_manager.identity
190194

195+
if parsed_args.domain:
196+
domain = utils.find_resource(
197+
identity_client.domains,
198+
parsed_args.domain,
199+
).id
200+
else:
201+
domain = None
202+
203+
if parsed_args.user:
204+
user = utils.find_resource(
205+
identity_client.users,
206+
parsed_args.user,
207+
).id
208+
else:
209+
user = None
210+
191211
# List groups
192212
if parsed_args.long:
193213
columns = ('ID', 'Name', 'Domain ID', 'Description')
194214
else:
195215
columns = ('ID', 'Name')
196-
data = identity_client.groups.list()
216+
data = identity_client.groups.list(
217+
domain=domain,
218+
user=user,
219+
)
197220

198-
return (columns,
199-
(utils.get_item_properties(
200-
s, columns,
201-
formatters={},
202-
) for s in data))
221+
return (
222+
columns,
223+
(utils.get_item_properties(
224+
s, columns,
225+
formatters={},
226+
) for s in data)
227+
)
203228

204229

205230
class RemoveUserFromGroup(command.Command):

‎openstackclient/identity/v3/user.py‎

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -148,17 +148,21 @@ def take_action(self, parsed_args):
148148

149149

150150
class ListUser(lister.Lister):
151-
"""List users and optionally roles assigned to users"""
151+
"""List users"""
152152

153153
log = logging.getLogger(__name__ + '.ListUser')
154154

155155
def get_parser(self, prog_name):
156156
parser = super(ListUser, self).get_parser(prog_name)
157157
parser.add_argument(
158-
'user',
159-
metavar='<user>',
160-
nargs='?',
161-
help='Name or ID of user to list [required with --role]',
158+
'--domain',
159+
metavar='<domain>',
160+
help='Filter group list by <domain>',
161+
)
162+
parser.add_argument(
163+
'--group',
164+
metavar='<group>',
165+
help='List memberships of <group> (name or ID)',
162166
)
163167
parser.add_argument(
164168
'--long',
@@ -169,21 +173,43 @@ def get_parser(self, prog_name):
169173
return parser
170174

171175
def take_action(self, parsed_args):
172-
self.log.debug('take_action(%s)' % parsed_args)
176+
self.log.debug('take_action(%s)', parsed_args)
177+
identity_client = self.app.client_manager.identity
178+
179+
if parsed_args.domain:
180+
domain = utils.find_resource(
181+
identity_client.domains,
182+
parsed_args.domain,
183+
).id
184+
else:
185+
domain = None
186+
187+
if parsed_args.group:
188+
group = utils.find_resource(
189+
identity_client.groups,
190+
parsed_args.group,
191+
).id
192+
else:
193+
group = None
173194

174195
# List users
175196
if parsed_args.long:
176197
columns = ('ID', 'Name', 'Project Id', 'Domain Id',
177198
'Description', 'Email', 'Enabled')
178199
else:
179200
columns = ('ID', 'Name')
180-
data = self.app.client_manager.identity.users.list()
201+
data = identity_client.users.list(
202+
domain=domain,
203+
group=group,
204+
)
181205

182-
return (columns,
183-
(utils.get_item_properties(
184-
s, columns,
185-
formatters={},
186-
) for s in data))
206+
return (
207+
columns,
208+
(utils.get_item_properties(
209+
s, columns,
210+
formatters={},
211+
) for s in data)
212+
)
187213

188214

189215
class SetUser(command.Command):
Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
2+
# not use this file except in compliance with the License. You may obtain
3+
# a copy of the License at
4+
#
5+
# http://www.apache.org/licenses/LICENSE-2.0
6+
#
7+
# Unless required by applicable law or agreed to in writing, software
8+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
9+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
10+
# License for the specific language governing permissions and limitations
11+
# under the License.
12+
#
13+
14+
import copy
15+
16+
from openstackclient.identity.v3 import group
17+
from openstackclient.tests import fakes
18+
from openstackclient.tests.identity.v3 import fakes as identity_fakes
19+
20+
21+
class TestGroup(identity_fakes.TestIdentityv3):
22+
23+
def setUp(self):
24+
super(TestGroup, self).setUp()
25+
26+
# Get a shortcut to the DomainManager Mock
27+
self.domains_mock = self.app.client_manager.identity.domains
28+
self.domains_mock.reset_mock()
29+
30+
# Get a shortcut to the GroupManager Mock
31+
self.groups_mock = self.app.client_manager.identity.groups
32+
self.groups_mock.reset_mock()
33+
34+
# Get a shortcut to the UserManager Mock
35+
self.users_mock = self.app.client_manager.identity.users
36+
self.users_mock.reset_mock()
37+
38+
39+
class TestGroupList(TestGroup):
40+
41+
def setUp(self):
42+
super(TestGroupList, self).setUp()
43+
44+
self.groups_mock.get.return_value = fakes.FakeResource(
45+
None,
46+
copy.deepcopy(identity_fakes.GROUP),
47+
loaded=True,
48+
)
49+
self.groups_mock.list.return_value = [
50+
fakes.FakeResource(
51+
None,
52+
copy.deepcopy(identity_fakes.GROUP),
53+
loaded=True,
54+
),
55+
]
56+
57+
self.domains_mock.get.return_value = fakes.FakeResource(
58+
None,
59+
copy.deepcopy(identity_fakes.DOMAIN),
60+
loaded=True,
61+
)
62+
63+
self.users_mock.get.return_value = fakes.FakeResource(
64+
None,
65+
copy.deepcopy(identity_fakes.USER),
66+
loaded=True,
67+
)
68+
69+
# Get the command object to test
70+
self.cmd = group.ListGroup(self.app, None)
71+
72+
def test_group_list_no_options(self):
73+
arglist = []
74+
verifylist = []
75+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
76+
77+
# DisplayCommandBase.take_action() returns two tuples
78+
columns, data = self.cmd.take_action(parsed_args)
79+
80+
# Set expected values
81+
kwargs = {
82+
'domain': None,
83+
'user': None,
84+
}
85+
86+
self.groups_mock.list.assert_called_with(
87+
**kwargs
88+
)
89+
90+
collist = ('ID', 'Name')
91+
self.assertEqual(columns, collist)
92+
datalist = ((
93+
identity_fakes.group_id,
94+
identity_fakes.group_name,
95+
), )
96+
self.assertEqual(datalist, tuple(data))
97+
98+
def test_group_list_domain(self):
99+
arglist = [
100+
'--domain', identity_fakes.domain_id,
101+
]
102+
verifylist = [
103+
('domain', identity_fakes.domain_id),
104+
]
105+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
106+
107+
# DisplayCommandBase.take_action() returns two tuples
108+
columns, data = self.cmd.take_action(parsed_args)
109+
110+
# Set expected values
111+
kwargs = {
112+
'domain': identity_fakes.domain_id,
113+
'user': None,
114+
}
115+
116+
self.groups_mock.list.assert_called_with(
117+
**kwargs
118+
)
119+
120+
collist = ('ID', 'Name')
121+
self.assertEqual(columns, collist)
122+
datalist = ((
123+
identity_fakes.group_id,
124+
identity_fakes.group_name,
125+
), )
126+
self.assertEqual(datalist, tuple(data))
127+
128+
def test_group_list_user(self):
129+
arglist = [
130+
'--user', identity_fakes.user_name,
131+
]
132+
verifylist = [
133+
('user', identity_fakes.user_name),
134+
]
135+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
136+
137+
# DisplayCommandBase.take_action() returns two tuples
138+
columns, data = self.cmd.take_action(parsed_args)
139+
140+
# Set expected values
141+
kwargs = {
142+
'domain': None,
143+
'user': identity_fakes.user_id,
144+
}
145+
146+
self.groups_mock.list.assert_called_with(
147+
**kwargs
148+
)
149+
150+
collist = ('ID', 'Name')
151+
self.assertEqual(columns, collist)
152+
datalist = ((
153+
identity_fakes.group_id,
154+
identity_fakes.group_name,
155+
), )
156+
self.assertEqual(datalist, tuple(data))
157+
158+
def test_group_list_long(self):
159+
arglist = [
160+
'--long',
161+
]
162+
verifylist = [
163+
('long', True),
164+
]
165+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
166+
167+
# DisplayCommandBase.take_action() returns two tuples
168+
columns, data = self.cmd.take_action(parsed_args)
169+
170+
# Set expected values
171+
kwargs = {
172+
'domain': None,
173+
'user': None,
174+
}
175+
176+
self.groups_mock.list.assert_called_with(
177+
**kwargs
178+
)
179+
180+
collist = (
181+
'ID',
182+
'Name',
183+
'Domain ID',
184+
'Description',
185+
)
186+
self.assertEqual(columns, collist)
187+
datalist = ((
188+
identity_fakes.group_id,
189+
identity_fakes.group_name,
190+
'',
191+
'',
192+
), )
193+
self.assertEqual(datalist, tuple(data))

0 commit comments

Comments
 (0)