Skip to content

Commit 77ff011

Browse files
committed
Add domain parameter to Identity Provider
Identity providers are now associated with domains. This change allows a user to specify a domain by ID or by name when creating an identity provider. [0] This also adds the column for Domain ID in listing. Updating a domain for an identity provider is not supported, so that isn't changed. [0]. Id18b8b2fe853b97631bc990df8188ed64a6e1275 Closes-Bug: 1698390 Change-Id: Icc408e2fe88f257d5863bd3df716a777d52befcc
1 parent 26ec06e commit 77ff011

5 files changed

Lines changed: 110 additions & 4 deletions

File tree

doc/source/cli/command-objects/identity-provider.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Create new identity provider
1717
openstack identity provider create
1818
[--remote-id <remote-id> [...] | --remote-id-file <file-name>]
1919
[--description <description>]
20+
[--domain <domain>]
2021
[--enable | --disable]
2122
<name>
2223
@@ -34,6 +35,11 @@ Create new identity provider
3435

3536
New identity provider description
3637

38+
.. option:: --domain
39+
40+
Name or ID of the domain to associate with the identity provider. If not
41+
specified, one will be created automatically
42+
3743
.. option:: --enable
3844

3945
Enable the identity provider (default)

openstackclient/identity/v3/identity_provider.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import six
2222

2323
from openstackclient.i18n import _
24+
from openstackclient.identity import common
2425

2526

2627
LOG = logging.getLogger(__name__)
@@ -55,6 +56,13 @@ def get_parser(self, prog_name):
5556
metavar='<description>',
5657
help=_('New identity provider description'),
5758
)
59+
parser.add_argument(
60+
'--domain',
61+
metavar='<domain>',
62+
help=_('Domain to associate with the identity provider. If not '
63+
'specified, a domain will be created automatically. '
64+
'(Name or ID)'),
65+
)
5866
enable_identity_provider = parser.add_mutually_exclusive_group()
5967
enable_identity_provider.add_argument(
6068
'--enable',
@@ -81,10 +89,17 @@ def take_action(self, parsed_args):
8189
else:
8290
remote_ids = (parsed_args.remote_id
8391
if parsed_args.remote_id else None)
92+
93+
domain_id = None
94+
if parsed_args.domain:
95+
domain_id = common.find_domain(identity_client,
96+
parsed_args.domain).id
97+
8498
idp = identity_client.federation.identity_providers.create(
8599
id=parsed_args.identity_provider_id,
86100
remote_ids=remote_ids,
87101
description=parsed_args.description,
102+
domain_id=domain_id,
88103
enabled=parsed_args.enabled)
89104

90105
idp._info.pop('links', None)
@@ -129,7 +144,7 @@ class ListIdentityProvider(command.Lister):
129144
_description = _("List identity providers")
130145

131146
def take_action(self, parsed_args):
132-
columns = ('ID', 'Enabled', 'Description')
147+
columns = ('ID', 'Enabled', 'Domain ID', 'Description')
133148
identity_client = self.app.client_manager.identity
134149
data = identity_client.federation.identity_providers.list()
135150
return (columns,

openstackclient/tests/unit/identity/v3/fakes.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -284,7 +284,8 @@
284284
'id': idp_id,
285285
'remote_ids': idp_remote_ids,
286286
'enabled': True,
287-
'description': idp_description
287+
'description': idp_description,
288+
'domain_id': domain_id,
288289
}
289290

290291
protocol_id = 'protocol'

openstackclient/tests/unit/identity/v3/test_identity_provider.py

Lines changed: 79 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,21 +25,33 @@ class TestIdentityProvider(identity_fakes.TestFederatedIdentity):
2525
def setUp(self):
2626
super(TestIdentityProvider, self).setUp()
2727

28+
# Identity Provider mocks
2829
federation_lib = self.app.client_manager.identity.federation
2930
self.identity_providers_mock = federation_lib.identity_providers
3031
self.identity_providers_mock.reset_mock()
3132

33+
# Domain mocks
34+
self.domains_mock = self.app.client_manager.identity.domains
35+
self.domains_mock.reset_mock()
36+
self.domain = identity_fakes.FakeDomain.create_one_domain(
37+
identity_fakes.DOMAIN
38+
)
39+
self.domains_mock.list.return_value = [self.domain]
40+
self.domains_mock.get.return_value = self.domain
41+
3242

3343
class TestIdentityProviderCreate(TestIdentityProvider):
3444

3545
columns = (
3646
'description',
47+
'domain_id',
3748
'enabled',
3849
'id',
3950
'remote_ids',
4051
)
4152
datalist = (
4253
identity_fakes.idp_description,
54+
identity_fakes.domain_id,
4355
True,
4456
identity_fakes.idp_id,
4557
identity_fakes.formatted_idp_remote_ids,
@@ -68,6 +80,7 @@ def test_create_identity_provider_no_options(self):
6880
'remote_ids': None,
6981
'enabled': True,
7082
'description': None,
83+
'domain_id': None,
7184
}
7285

7386
self.identity_providers_mock.create.assert_called_with(
@@ -94,6 +107,7 @@ def test_create_identity_provider_description(self):
94107
kwargs = {
95108
'remote_ids': None,
96109
'description': identity_fakes.idp_description,
110+
'domain_id': None,
97111
'enabled': True,
98112
}
99113

@@ -121,6 +135,7 @@ def test_create_identity_provider_remote_id(self):
121135
kwargs = {
122136
'remote_ids': identity_fakes.idp_remote_ids[:1],
123137
'description': None,
138+
'domain_id': None,
124139
'enabled': True,
125140
}
126141

@@ -149,6 +164,7 @@ def test_create_identity_provider_remote_ids_multiple(self):
149164
kwargs = {
150165
'remote_ids': identity_fakes.idp_remote_ids,
151166
'description': None,
167+
'domain_id': None,
152168
'enabled': True,
153169
}
154170

@@ -181,6 +197,7 @@ def test_create_identity_provider_remote_ids_file(self):
181197
kwargs = {
182198
'remote_ids': identity_fakes.idp_remote_ids,
183199
'description': None,
200+
'domain_id': None,
184201
'enabled': True,
185202
}
186203

@@ -217,6 +234,7 @@ def test_create_identity_provider_disabled(self):
217234
'remote_ids': None,
218235
'enabled': False,
219236
'description': None,
237+
'domain_id': None,
220238
}
221239

222240
self.identity_providers_mock.create.assert_called_with(
@@ -227,12 +245,69 @@ def test_create_identity_provider_disabled(self):
227245
self.assertEqual(self.columns, columns)
228246
datalist = (
229247
None,
248+
identity_fakes.domain_id,
230249
False,
231250
identity_fakes.idp_id,
232251
identity_fakes.formatted_idp_remote_ids
233252
)
234253
self.assertEqual(datalist, data)
235254

255+
def test_create_identity_provider_domain_name(self):
256+
arglist = [
257+
'--domain', identity_fakes.domain_name,
258+
identity_fakes.idp_id,
259+
]
260+
verifylist = [
261+
('identity_provider_id', identity_fakes.idp_id),
262+
('domain', identity_fakes.domain_name),
263+
]
264+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
265+
columns, data = self.cmd.take_action(parsed_args)
266+
267+
# Set expected values
268+
kwargs = {
269+
'remote_ids': None,
270+
'description': None,
271+
'domain_id': identity_fakes.domain_id,
272+
'enabled': True,
273+
}
274+
275+
self.identity_providers_mock.create.assert_called_with(
276+
id=identity_fakes.idp_id,
277+
**kwargs
278+
)
279+
280+
self.assertEqual(self.columns, columns)
281+
self.assertEqual(self.datalist, data)
282+
283+
def test_create_identity_provider_domain_id(self):
284+
arglist = [
285+
'--domain', identity_fakes.domain_id,
286+
identity_fakes.idp_id,
287+
]
288+
verifylist = [
289+
('identity_provider_id', identity_fakes.idp_id),
290+
('domain', identity_fakes.domain_id),
291+
]
292+
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
293+
columns, data = self.cmd.take_action(parsed_args)
294+
295+
# Set expected values
296+
kwargs = {
297+
'remote_ids': None,
298+
'description': None,
299+
'domain_id': identity_fakes.domain_id,
300+
'enabled': True,
301+
}
302+
303+
self.identity_providers_mock.create.assert_called_with(
304+
id=identity_fakes.idp_id,
305+
**kwargs
306+
)
307+
308+
self.assertEqual(self.columns, columns)
309+
self.assertEqual(self.datalist, data)
310+
236311

237312
class TestIdentityProviderDelete(TestIdentityProvider):
238313

@@ -299,11 +374,12 @@ def test_identity_provider_list_no_options(self):
299374

300375
self.identity_providers_mock.list.assert_called_with()
301376

302-
collist = ('ID', 'Enabled', 'Description')
377+
collist = ('ID', 'Enabled', 'Domain ID', 'Description')
303378
self.assertEqual(collist, columns)
304379
datalist = ((
305380
identity_fakes.idp_id,
306381
True,
382+
identity_fakes.domain_id,
307383
identity_fakes.idp_description,
308384
), )
309385
self.assertEqual(datalist, tuple(data))
@@ -582,10 +658,11 @@ def test_identity_provider_show(self):
582658
id='test_idp'
583659
)
584660

585-
collist = ('description', 'enabled', 'id', 'remote_ids')
661+
collist = ('description', 'domain_id', 'enabled', 'id', 'remote_ids')
586662
self.assertEqual(collist, columns)
587663
datalist = (
588664
identity_fakes.idp_description,
665+
identity_fakes.domain_id,
589666
True,
590667
identity_fakes.idp_id,
591668
identity_fakes.formatted_idp_remote_ids
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
features:
3+
- |
4+
Added the ``--domain`` option to the ``identity provider create`` command to
5+
associate an existing domain with an identity provider on its creation.
6+
7+
[Bug `1698390 <https://bugs.launchpad.net/python-openstackclient/+bug/1698390>`_]

0 commit comments

Comments
 (0)