Skip to content

Commit 23f64a4

Browse files
Jenkinsopenstack-gerrit
authored andcommitted
Merge "Complete Identity v3 list command filters"
2 parents 3019f11 + 9dd3a53 commit 23f64a4

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)