From 384c3f9100c4a69fe4300a1db9cd5cb233d1ed60 Mon Sep 17 00:00:00 2001 From: Nathan Kinder Date: Fri, 3 Apr 2015 12:53:01 -0700 Subject: [PATCH] Allow identity provider to be created with remote_ids set to None When support was added for multiple remote_ids, identity provider creation was broken when remote_ids are specified as None instead of an empty list. The remote_ids are supposed to be optional. This causes 400 errors when using python-openstackclient to create an identity provider without any remote_ids. Change-Id: I9a4d1206f6df95636ae350236f6e704ca37f7b73 Closes-bug: #1440185 --- keystone/contrib/federation/backends/sql.py | 4 +++- keystone/tests/unit/test_v3_federation.py | 15 +++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/keystone/contrib/federation/backends/sql.py b/keystone/contrib/federation/backends/sql.py index 324cd1d581..eb157008fa 100644 --- a/keystone/contrib/federation/backends/sql.py +++ b/keystone/contrib/federation/backends/sql.py @@ -58,7 +58,9 @@ class IdentityProviderModel(sql.ModelBase, sql.DictBase): @classmethod def from_dict(cls, dictionary): new_dictionary = dictionary.copy() - remote_ids_list = new_dictionary.pop('remote_ids', []) + remote_ids_list = new_dictionary.pop('remote_ids', None) + if not remote_ids_list: + remote_ids_list = [] identity_provider = cls(**new_dictionary) remote_ids = [] # NOTE(fmarco76): the remote_ids_list contains only remote ids diff --git a/keystone/tests/unit/test_v3_federation.py b/keystone/tests/unit/test_v3_federation.py index e190863382..2207f3500d 100644 --- a/keystone/tests/unit/test_v3_federation.py +++ b/keystone/tests/unit/test_v3_federation.py @@ -856,6 +856,21 @@ class FederatedIdentityProviderTests(FederationTests): keys_to_check=keys_to_check, ref=body) + def test_create_idp_remote_none(self): + """Creates an IdP with a None remote_ids.""" + + keys_to_check = list(self.idp_keys) + keys_to_check.append('remote_ids') + body = self.default_body.copy() + body['description'] = uuid.uuid4().hex + body['remote_ids'] = None + resp = self._create_default_idp(body=body) + expected = body.copy() + expected['remote_ids'] = [] + self.assertValidResponse(resp, 'identity_provider', dummy_validator, + keys_to_check=keys_to_check, + ref=expected) + def test_update_idp_remote_ids(self): """Update IdP's remote_ids parameter.""" body = self.default_body.copy()