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
This commit is contained in:
parent
26ec06e281
commit
77ff011ced
@ -17,6 +17,7 @@ Create new identity provider
|
|||||||
openstack identity provider create
|
openstack identity provider create
|
||||||
[--remote-id <remote-id> [...] | --remote-id-file <file-name>]
|
[--remote-id <remote-id> [...] | --remote-id-file <file-name>]
|
||||||
[--description <description>]
|
[--description <description>]
|
||||||
|
[--domain <domain>]
|
||||||
[--enable | --disable]
|
[--enable | --disable]
|
||||||
<name>
|
<name>
|
||||||
|
|
||||||
@ -34,6 +35,11 @@ Create new identity provider
|
|||||||
|
|
||||||
New identity provider description
|
New identity provider description
|
||||||
|
|
||||||
|
.. option:: --domain
|
||||||
|
|
||||||
|
Name or ID of the domain to associate with the identity provider. If not
|
||||||
|
specified, one will be created automatically
|
||||||
|
|
||||||
.. option:: --enable
|
.. option:: --enable
|
||||||
|
|
||||||
Enable the identity provider (default)
|
Enable the identity provider (default)
|
||||||
|
@ -21,6 +21,7 @@ from osc_lib import utils
|
|||||||
import six
|
import six
|
||||||
|
|
||||||
from openstackclient.i18n import _
|
from openstackclient.i18n import _
|
||||||
|
from openstackclient.identity import common
|
||||||
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
@ -55,6 +56,13 @@ class CreateIdentityProvider(command.ShowOne):
|
|||||||
metavar='<description>',
|
metavar='<description>',
|
||||||
help=_('New identity provider description'),
|
help=_('New identity provider description'),
|
||||||
)
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
'--domain',
|
||||||
|
metavar='<domain>',
|
||||||
|
help=_('Domain to associate with the identity provider. If not '
|
||||||
|
'specified, a domain will be created automatically. '
|
||||||
|
'(Name or ID)'),
|
||||||
|
)
|
||||||
enable_identity_provider = parser.add_mutually_exclusive_group()
|
enable_identity_provider = parser.add_mutually_exclusive_group()
|
||||||
enable_identity_provider.add_argument(
|
enable_identity_provider.add_argument(
|
||||||
'--enable',
|
'--enable',
|
||||||
@ -81,10 +89,17 @@ class CreateIdentityProvider(command.ShowOne):
|
|||||||
else:
|
else:
|
||||||
remote_ids = (parsed_args.remote_id
|
remote_ids = (parsed_args.remote_id
|
||||||
if parsed_args.remote_id else None)
|
if parsed_args.remote_id else None)
|
||||||
|
|
||||||
|
domain_id = None
|
||||||
|
if parsed_args.domain:
|
||||||
|
domain_id = common.find_domain(identity_client,
|
||||||
|
parsed_args.domain).id
|
||||||
|
|
||||||
idp = identity_client.federation.identity_providers.create(
|
idp = identity_client.federation.identity_providers.create(
|
||||||
id=parsed_args.identity_provider_id,
|
id=parsed_args.identity_provider_id,
|
||||||
remote_ids=remote_ids,
|
remote_ids=remote_ids,
|
||||||
description=parsed_args.description,
|
description=parsed_args.description,
|
||||||
|
domain_id=domain_id,
|
||||||
enabled=parsed_args.enabled)
|
enabled=parsed_args.enabled)
|
||||||
|
|
||||||
idp._info.pop('links', None)
|
idp._info.pop('links', None)
|
||||||
@ -129,7 +144,7 @@ class ListIdentityProvider(command.Lister):
|
|||||||
_description = _("List identity providers")
|
_description = _("List identity providers")
|
||||||
|
|
||||||
def take_action(self, parsed_args):
|
def take_action(self, parsed_args):
|
||||||
columns = ('ID', 'Enabled', 'Description')
|
columns = ('ID', 'Enabled', 'Domain ID', 'Description')
|
||||||
identity_client = self.app.client_manager.identity
|
identity_client = self.app.client_manager.identity
|
||||||
data = identity_client.federation.identity_providers.list()
|
data = identity_client.federation.identity_providers.list()
|
||||||
return (columns,
|
return (columns,
|
||||||
|
@ -284,7 +284,8 @@ IDENTITY_PROVIDER = {
|
|||||||
'id': idp_id,
|
'id': idp_id,
|
||||||
'remote_ids': idp_remote_ids,
|
'remote_ids': idp_remote_ids,
|
||||||
'enabled': True,
|
'enabled': True,
|
||||||
'description': idp_description
|
'description': idp_description,
|
||||||
|
'domain_id': domain_id,
|
||||||
}
|
}
|
||||||
|
|
||||||
protocol_id = 'protocol'
|
protocol_id = 'protocol'
|
||||||
|
@ -25,21 +25,33 @@ class TestIdentityProvider(identity_fakes.TestFederatedIdentity):
|
|||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(TestIdentityProvider, self).setUp()
|
super(TestIdentityProvider, self).setUp()
|
||||||
|
|
||||||
|
# Identity Provider mocks
|
||||||
federation_lib = self.app.client_manager.identity.federation
|
federation_lib = self.app.client_manager.identity.federation
|
||||||
self.identity_providers_mock = federation_lib.identity_providers
|
self.identity_providers_mock = federation_lib.identity_providers
|
||||||
self.identity_providers_mock.reset_mock()
|
self.identity_providers_mock.reset_mock()
|
||||||
|
|
||||||
|
# Domain mocks
|
||||||
|
self.domains_mock = self.app.client_manager.identity.domains
|
||||||
|
self.domains_mock.reset_mock()
|
||||||
|
self.domain = identity_fakes.FakeDomain.create_one_domain(
|
||||||
|
identity_fakes.DOMAIN
|
||||||
|
)
|
||||||
|
self.domains_mock.list.return_value = [self.domain]
|
||||||
|
self.domains_mock.get.return_value = self.domain
|
||||||
|
|
||||||
|
|
||||||
class TestIdentityProviderCreate(TestIdentityProvider):
|
class TestIdentityProviderCreate(TestIdentityProvider):
|
||||||
|
|
||||||
columns = (
|
columns = (
|
||||||
'description',
|
'description',
|
||||||
|
'domain_id',
|
||||||
'enabled',
|
'enabled',
|
||||||
'id',
|
'id',
|
||||||
'remote_ids',
|
'remote_ids',
|
||||||
)
|
)
|
||||||
datalist = (
|
datalist = (
|
||||||
identity_fakes.idp_description,
|
identity_fakes.idp_description,
|
||||||
|
identity_fakes.domain_id,
|
||||||
True,
|
True,
|
||||||
identity_fakes.idp_id,
|
identity_fakes.idp_id,
|
||||||
identity_fakes.formatted_idp_remote_ids,
|
identity_fakes.formatted_idp_remote_ids,
|
||||||
@ -68,6 +80,7 @@ class TestIdentityProviderCreate(TestIdentityProvider):
|
|||||||
'remote_ids': None,
|
'remote_ids': None,
|
||||||
'enabled': True,
|
'enabled': True,
|
||||||
'description': None,
|
'description': None,
|
||||||
|
'domain_id': None,
|
||||||
}
|
}
|
||||||
|
|
||||||
self.identity_providers_mock.create.assert_called_with(
|
self.identity_providers_mock.create.assert_called_with(
|
||||||
@ -94,6 +107,7 @@ class TestIdentityProviderCreate(TestIdentityProvider):
|
|||||||
kwargs = {
|
kwargs = {
|
||||||
'remote_ids': None,
|
'remote_ids': None,
|
||||||
'description': identity_fakes.idp_description,
|
'description': identity_fakes.idp_description,
|
||||||
|
'domain_id': None,
|
||||||
'enabled': True,
|
'enabled': True,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,6 +135,7 @@ class TestIdentityProviderCreate(TestIdentityProvider):
|
|||||||
kwargs = {
|
kwargs = {
|
||||||
'remote_ids': identity_fakes.idp_remote_ids[:1],
|
'remote_ids': identity_fakes.idp_remote_ids[:1],
|
||||||
'description': None,
|
'description': None,
|
||||||
|
'domain_id': None,
|
||||||
'enabled': True,
|
'enabled': True,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,6 +164,7 @@ class TestIdentityProviderCreate(TestIdentityProvider):
|
|||||||
kwargs = {
|
kwargs = {
|
||||||
'remote_ids': identity_fakes.idp_remote_ids,
|
'remote_ids': identity_fakes.idp_remote_ids,
|
||||||
'description': None,
|
'description': None,
|
||||||
|
'domain_id': None,
|
||||||
'enabled': True,
|
'enabled': True,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -181,6 +197,7 @@ class TestIdentityProviderCreate(TestIdentityProvider):
|
|||||||
kwargs = {
|
kwargs = {
|
||||||
'remote_ids': identity_fakes.idp_remote_ids,
|
'remote_ids': identity_fakes.idp_remote_ids,
|
||||||
'description': None,
|
'description': None,
|
||||||
|
'domain_id': None,
|
||||||
'enabled': True,
|
'enabled': True,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -217,6 +234,7 @@ class TestIdentityProviderCreate(TestIdentityProvider):
|
|||||||
'remote_ids': None,
|
'remote_ids': None,
|
||||||
'enabled': False,
|
'enabled': False,
|
||||||
'description': None,
|
'description': None,
|
||||||
|
'domain_id': None,
|
||||||
}
|
}
|
||||||
|
|
||||||
self.identity_providers_mock.create.assert_called_with(
|
self.identity_providers_mock.create.assert_called_with(
|
||||||
@ -227,12 +245,69 @@ class TestIdentityProviderCreate(TestIdentityProvider):
|
|||||||
self.assertEqual(self.columns, columns)
|
self.assertEqual(self.columns, columns)
|
||||||
datalist = (
|
datalist = (
|
||||||
None,
|
None,
|
||||||
|
identity_fakes.domain_id,
|
||||||
False,
|
False,
|
||||||
identity_fakes.idp_id,
|
identity_fakes.idp_id,
|
||||||
identity_fakes.formatted_idp_remote_ids
|
identity_fakes.formatted_idp_remote_ids
|
||||||
)
|
)
|
||||||
self.assertEqual(datalist, data)
|
self.assertEqual(datalist, data)
|
||||||
|
|
||||||
|
def test_create_identity_provider_domain_name(self):
|
||||||
|
arglist = [
|
||||||
|
'--domain', identity_fakes.domain_name,
|
||||||
|
identity_fakes.idp_id,
|
||||||
|
]
|
||||||
|
verifylist = [
|
||||||
|
('identity_provider_id', identity_fakes.idp_id),
|
||||||
|
('domain', identity_fakes.domain_name),
|
||||||
|
]
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
columns, data = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
|
# Set expected values
|
||||||
|
kwargs = {
|
||||||
|
'remote_ids': None,
|
||||||
|
'description': None,
|
||||||
|
'domain_id': identity_fakes.domain_id,
|
||||||
|
'enabled': True,
|
||||||
|
}
|
||||||
|
|
||||||
|
self.identity_providers_mock.create.assert_called_with(
|
||||||
|
id=identity_fakes.idp_id,
|
||||||
|
**kwargs
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(self.columns, columns)
|
||||||
|
self.assertEqual(self.datalist, data)
|
||||||
|
|
||||||
|
def test_create_identity_provider_domain_id(self):
|
||||||
|
arglist = [
|
||||||
|
'--domain', identity_fakes.domain_id,
|
||||||
|
identity_fakes.idp_id,
|
||||||
|
]
|
||||||
|
verifylist = [
|
||||||
|
('identity_provider_id', identity_fakes.idp_id),
|
||||||
|
('domain', identity_fakes.domain_id),
|
||||||
|
]
|
||||||
|
parsed_args = self.check_parser(self.cmd, arglist, verifylist)
|
||||||
|
columns, data = self.cmd.take_action(parsed_args)
|
||||||
|
|
||||||
|
# Set expected values
|
||||||
|
kwargs = {
|
||||||
|
'remote_ids': None,
|
||||||
|
'description': None,
|
||||||
|
'domain_id': identity_fakes.domain_id,
|
||||||
|
'enabled': True,
|
||||||
|
}
|
||||||
|
|
||||||
|
self.identity_providers_mock.create.assert_called_with(
|
||||||
|
id=identity_fakes.idp_id,
|
||||||
|
**kwargs
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertEqual(self.columns, columns)
|
||||||
|
self.assertEqual(self.datalist, data)
|
||||||
|
|
||||||
|
|
||||||
class TestIdentityProviderDelete(TestIdentityProvider):
|
class TestIdentityProviderDelete(TestIdentityProvider):
|
||||||
|
|
||||||
@ -299,11 +374,12 @@ class TestIdentityProviderList(TestIdentityProvider):
|
|||||||
|
|
||||||
self.identity_providers_mock.list.assert_called_with()
|
self.identity_providers_mock.list.assert_called_with()
|
||||||
|
|
||||||
collist = ('ID', 'Enabled', 'Description')
|
collist = ('ID', 'Enabled', 'Domain ID', 'Description')
|
||||||
self.assertEqual(collist, columns)
|
self.assertEqual(collist, columns)
|
||||||
datalist = ((
|
datalist = ((
|
||||||
identity_fakes.idp_id,
|
identity_fakes.idp_id,
|
||||||
True,
|
True,
|
||||||
|
identity_fakes.domain_id,
|
||||||
identity_fakes.idp_description,
|
identity_fakes.idp_description,
|
||||||
), )
|
), )
|
||||||
self.assertEqual(datalist, tuple(data))
|
self.assertEqual(datalist, tuple(data))
|
||||||
@ -582,10 +658,11 @@ class TestIdentityProviderShow(TestIdentityProvider):
|
|||||||
id='test_idp'
|
id='test_idp'
|
||||||
)
|
)
|
||||||
|
|
||||||
collist = ('description', 'enabled', 'id', 'remote_ids')
|
collist = ('description', 'domain_id', 'enabled', 'id', 'remote_ids')
|
||||||
self.assertEqual(collist, columns)
|
self.assertEqual(collist, columns)
|
||||||
datalist = (
|
datalist = (
|
||||||
identity_fakes.idp_description,
|
identity_fakes.idp_description,
|
||||||
|
identity_fakes.domain_id,
|
||||||
True,
|
True,
|
||||||
identity_fakes.idp_id,
|
identity_fakes.idp_id,
|
||||||
identity_fakes.formatted_idp_remote_ids
|
identity_fakes.formatted_idp_remote_ids
|
||||||
|
7
releasenotes/notes/bug-1698390-0df8f0ec4fe354de.yaml
Normal file
7
releasenotes/notes/bug-1698390-0df8f0ec4fe354de.yaml
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
---
|
||||||
|
features:
|
||||||
|
- |
|
||||||
|
Added the ``--domain`` option to the ``identity provider create`` command to
|
||||||
|
associate an existing domain with an identity provider on its creation.
|
||||||
|
|
||||||
|
[Bug `1698390 <https://bugs.launchpad.net/python-openstackclient/+bug/1698390>`_]
|
Loading…
x
Reference in New Issue
Block a user