Add CRUD operations for Identity Providers.
Add relevant methods for adding, updating, listing, getting, and deleting Identity Provider objects. Change-Id: Ib77781b507d2c06c368a1877eb716ec7fe2d88e4 Implements: blueprint federation-crud-operations
This commit is contained in:
86
keystoneclient/tests/v3/test_federation.py
Normal file
86
keystoneclient/tests/v3/test_federation.py
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
import httpretty
|
||||||
|
|
||||||
|
from keystoneclient.tests.v3 import utils
|
||||||
|
from keystoneclient.v3.contrib.federation import identity_providers
|
||||||
|
|
||||||
|
|
||||||
|
class IdentityProviderTests(utils.TestCase, utils.CrudTests):
|
||||||
|
def setUp(self):
|
||||||
|
super(IdentityProviderTests, self).setUp()
|
||||||
|
self.key = 'identity_provider'
|
||||||
|
self.collection_key = 'identity_providers'
|
||||||
|
self.model = identity_providers.IdentityProvider
|
||||||
|
self.manager = self.client.federation.identity_providers
|
||||||
|
self.path_prefix = 'OS-FEDERATION'
|
||||||
|
|
||||||
|
def new_ref(self, **kwargs):
|
||||||
|
kwargs.setdefault('id', uuid.uuid4().hex)
|
||||||
|
kwargs.setdefault('description', uuid.uuid4().hex)
|
||||||
|
kwargs.setdefault('enabled', True)
|
||||||
|
return kwargs
|
||||||
|
|
||||||
|
def test_positional_parameters_expect_fail(self):
|
||||||
|
"""Ensure CrudManager raises TypeError exceptions.
|
||||||
|
|
||||||
|
After passing wrong number of positional arguments
|
||||||
|
an exception should be raised.
|
||||||
|
|
||||||
|
Operations to be tested:
|
||||||
|
* create()
|
||||||
|
* get()
|
||||||
|
* list()
|
||||||
|
* delete()
|
||||||
|
* update()
|
||||||
|
|
||||||
|
"""
|
||||||
|
POS_PARAM_1 = uuid.uuid4().hex
|
||||||
|
POS_PARAM_2 = uuid.uuid4().hex
|
||||||
|
POS_PARAM_3 = uuid.uuid4().hex
|
||||||
|
|
||||||
|
PARAMETERS = {
|
||||||
|
'create': (POS_PARAM_1, POS_PARAM_2),
|
||||||
|
'get': (POS_PARAM_1, POS_PARAM_2),
|
||||||
|
'list': (POS_PARAM_1, POS_PARAM_2),
|
||||||
|
'update': (POS_PARAM_1, POS_PARAM_2, POS_PARAM_3),
|
||||||
|
'delete': (POS_PARAM_1, POS_PARAM_2)
|
||||||
|
}
|
||||||
|
|
||||||
|
for f_name, args in PARAMETERS.items():
|
||||||
|
self.assertRaises(TypeError, getattr(self.manager, f_name),
|
||||||
|
*args)
|
||||||
|
|
||||||
|
@httpretty.activate
|
||||||
|
def test_create(self, ref=None, req_ref=None):
|
||||||
|
ref = ref or self.new_ref()
|
||||||
|
|
||||||
|
# req_ref argument allows you to specify a different
|
||||||
|
# signature for the request when the manager does some
|
||||||
|
# conversion before doing the request (e.g converting
|
||||||
|
# from datetime object to timestamp string)
|
||||||
|
req_ref = (req_ref or ref).copy()
|
||||||
|
req_ref.pop('id')
|
||||||
|
|
||||||
|
self.stub_entity(httpretty.PUT, entity=ref, id=ref['id'], status=201)
|
||||||
|
|
||||||
|
returned = self.manager.create(**ref)
|
||||||
|
self.assertIsInstance(returned, self.model)
|
||||||
|
for attr in req_ref:
|
||||||
|
self.assertEqual(
|
||||||
|
getattr(returned, attr),
|
||||||
|
req_ref[attr],
|
||||||
|
'Expected different %s' % attr)
|
||||||
|
self.assertEntityRequestBodyIs(req_ref)
|
@@ -19,6 +19,7 @@ from keystoneclient.auth.identity import v3 as v3_auth
|
|||||||
from keystoneclient import exceptions
|
from keystoneclient import exceptions
|
||||||
from keystoneclient import httpclient
|
from keystoneclient import httpclient
|
||||||
from keystoneclient.openstack.common import jsonutils
|
from keystoneclient.openstack.common import jsonutils
|
||||||
|
from keystoneclient.v3.contrib import federation
|
||||||
from keystoneclient.v3.contrib import trusts
|
from keystoneclient.v3.contrib import trusts
|
||||||
from keystoneclient.v3 import credentials
|
from keystoneclient.v3 import credentials
|
||||||
from keystoneclient.v3 import domains
|
from keystoneclient.v3 import domains
|
||||||
@@ -95,6 +96,7 @@ class Client(httpclient.HTTPClient):
|
|||||||
self.credentials = credentials.CredentialManager(self)
|
self.credentials = credentials.CredentialManager(self)
|
||||||
self.endpoints = endpoints.EndpointManager(self)
|
self.endpoints = endpoints.EndpointManager(self)
|
||||||
self.domains = domains.DomainManager(self)
|
self.domains = domains.DomainManager(self)
|
||||||
|
self.federation = federation.FederationManager(self)
|
||||||
self.groups = groups.GroupManager(self)
|
self.groups = groups.GroupManager(self)
|
||||||
self.policies = policies.PolicyManager(self)
|
self.policies = policies.PolicyManager(self)
|
||||||
self.projects = projects.ProjectManager(self)
|
self.projects = projects.ProjectManager(self)
|
||||||
|
13
keystoneclient/v3/contrib/federation/__init__.py
Normal file
13
keystoneclient/v3/contrib/federation/__init__.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from keystoneclient.v3.contrib.federation.core import * # flake8: noqa
|
19
keystoneclient/v3/contrib/federation/core.py
Normal file
19
keystoneclient/v3/contrib/federation/core.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from keystoneclient.v3.contrib.federation import identity_providers
|
||||||
|
|
||||||
|
|
||||||
|
class FederationManager(object):
|
||||||
|
def __init__(self, api):
|
||||||
|
self.identity_providers = identity_providers.IdentityProviderManager(
|
||||||
|
api)
|
100
keystoneclient/v3/contrib/federation/identity_providers.py
Normal file
100
keystoneclient/v3/contrib/federation/identity_providers.py
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from keystoneclient import base
|
||||||
|
from keystoneclient import utils
|
||||||
|
|
||||||
|
|
||||||
|
class IdentityProvider(base.Resource):
|
||||||
|
"""Object representing Identity Provider container
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
* id: user-defined unique string identifying Identity Provider.
|
||||||
|
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class IdentityProviderManager(base.CrudManager):
|
||||||
|
"""Manager class for manipulating Identity Providers."""
|
||||||
|
|
||||||
|
resource_class = IdentityProvider
|
||||||
|
collection_key = 'identity_providers'
|
||||||
|
key = 'identity_provider'
|
||||||
|
base_url = 'OS-FEDERATION'
|
||||||
|
|
||||||
|
def _build_url_and_put(self, **kwargs):
|
||||||
|
url = self.build_url(dict_args_in_out=kwargs)
|
||||||
|
body = {self.key: kwargs}
|
||||||
|
return self._update(url, body=body, response_key=self.key,
|
||||||
|
method='PUT')
|
||||||
|
|
||||||
|
@utils.positional.method(0)
|
||||||
|
def create(self, id, **kwargs):
|
||||||
|
"""Create Identity Provider object.
|
||||||
|
|
||||||
|
Utilize Keystone URI:
|
||||||
|
PUT /OS-FEDERATION/identity_providers/$identity_provider
|
||||||
|
|
||||||
|
:param id: unique id of the identity provider.
|
||||||
|
|
||||||
|
"""
|
||||||
|
return self._build_url_and_put(identity_provider_id=id,
|
||||||
|
**kwargs)
|
||||||
|
|
||||||
|
def get(self, identity_provider):
|
||||||
|
"""Fetch Identity Provider object
|
||||||
|
|
||||||
|
Utilize Keystone URI:
|
||||||
|
GET /OS-FEDERATION/identity_providers/$identity_provider
|
||||||
|
|
||||||
|
:param identity_provider: an object with identity_provider_id
|
||||||
|
stored inside.
|
||||||
|
|
||||||
|
"""
|
||||||
|
return super(IdentityProviderManager, self).get(
|
||||||
|
identity_provider_id=base.getid(identity_provider))
|
||||||
|
|
||||||
|
def list(self, **kwargs):
|
||||||
|
"""List all Identity Providers.
|
||||||
|
|
||||||
|
Utilize Keystone URI:
|
||||||
|
GET /OS-FEDERATION/identity_providers
|
||||||
|
|
||||||
|
"""
|
||||||
|
return super(IdentityProviderManager, self).list(**kwargs)
|
||||||
|
|
||||||
|
def update(self, identity_provider, **kwargs):
|
||||||
|
"""Update Identity Provider object.
|
||||||
|
|
||||||
|
Utilize Keystone URI:
|
||||||
|
PATCH /OS-FEDERATION/identity_providers/$identity_provider
|
||||||
|
|
||||||
|
:param identity_provider: an object with identity_provider_id
|
||||||
|
stored inside.
|
||||||
|
|
||||||
|
"""
|
||||||
|
return super(IdentityProviderManager, self).update(
|
||||||
|
identity_provider_id=base.getid(identity_provider), **kwargs)
|
||||||
|
|
||||||
|
def delete(self, identity_provider):
|
||||||
|
"""Delete Identity Provider object.
|
||||||
|
|
||||||
|
Utilize Keystone URI:
|
||||||
|
DELETE /OS-FEDERATION/identity_providers/$identity_provider
|
||||||
|
|
||||||
|
:param identity_provider: an object with identity_provider_id
|
||||||
|
stored inside.
|
||||||
|
|
||||||
|
"""
|
||||||
|
return super(IdentityProviderManager, self).delete(
|
||||||
|
identity_provider_id=base.getid(identity_provider))
|
Reference in New Issue
Block a user