From d10d31b3686125fefd92f293bb9fc607926e2227 Mon Sep 17 00:00:00 2001 From: Mark Chappell Date: Tue, 17 Mar 2020 12:47:07 +0100 Subject: [PATCH] Add support for federation mappings Change-Id: I99cef69de1047dfbf31cf2ff5535bb734f5fa61e --- openstack/identity/v3/_proxy.py | 81 +++++++++++++++++++ openstack/identity/v3/mapping.py | 39 +++++++++ .../tests/unit/identity/v3/test_mapping.py | 50 ++++++++++++ 3 files changed, 170 insertions(+) create mode 100644 openstack/identity/v3/mapping.py create mode 100644 openstack/tests/unit/identity/v3/test_mapping.py diff --git a/openstack/identity/v3/_proxy.py b/openstack/identity/v3/_proxy.py index f0f20038f..461fbefb9 100644 --- a/openstack/identity/v3/_proxy.py +++ b/openstack/identity/v3/_proxy.py @@ -18,6 +18,7 @@ from openstack.identity.v3 import domain as _domain from openstack.identity.v3 import endpoint as _endpoint from openstack.identity.v3 import group as _group from openstack.identity.v3 import limit as _limit +from openstack.identity.v3 import mapping as _mapping from openstack.identity.v3 import policy as _policy from openstack.identity.v3 import project as _project from openstack.identity.v3 import region as _region @@ -1319,3 +1320,83 @@ class Proxy(proxy.Proxy): application_credential, user_id=user.id, ignore_missing=ignore_missing) + + def create_mapping(self, **attrs): + """Create a new mapping from attributes + + :param dict attrs: Keyword arguments which will be used to create + a :class:`~openstack.identity.v3.mapping.Mapping`, + comprised of the properties on the Mapping class. + + :returns: The results of mapping creation + :rtype: :class:`~openstack.identity.v3.mapping.Mapping` + """ + return self._create(_mapping.Mapping, **attrs) + + def delete_mapping(self, mapping, ignore_missing=True): + """Delete a mapping + + :param mapping: The ID of a mapping or a + :class:`~openstack.identity.v3.mapping.Mapping` + instance. + :param bool ignore_missing: When set to ``False`` + :class:`~openstack.exceptions.ResourceNotFound` will be + raised when the mapping does not exist. + When set to ``True``, no exception will be set when + attempting to delete a nonexistent mapping. + + :returns: ``None`` + """ + self._delete(_mapping.Mapping, mapping, ignore_missing=ignore_missing) + + def find_mapping(self, name_or_id, ignore_missing=True): + """Find a single mapping + + :param name_or_id: The name or ID of a mapping. + :param bool ignore_missing: When set to ``False`` + :class:`~openstack.exceptions.ResourceNotFound` will be + raised when the resource does not exist. + When set to ``True``, None will be returned when + attempting to find a nonexistent resource. + :returns: One :class:`~openstack.identity.v3.mapping.Mapping` or None + """ + return self._find(_mapping.Mapping, name_or_id, + ignore_missing=ignore_missing) + + def get_mapping(self, mapping): + """Get a single mapping + + :param mapping: The value can be the ID of a mapping or a + :class:`~openstack.identity.v3.mapping.Mapping` + instance. + + :returns: One :class:`~openstack.identity.v3.mapping.Mapping` + :raises: :class:`~openstack.exceptions.ResourceNotFound` + when no resource can be found. + """ + return self._get(_mapping.Mapping, mapping) + + def mappings(self, **query): + """Retrieve a generator of mappings + + :param kwargs query: Optional query parameters to be sent to limit + the resources being returned. + + :returns: A generator of mapping instances. + :rtype: :class:`~openstack.identity.v3.mapping.Mapping` + """ + return self._list(_mapping.Mapping, **query) + + def update_mapping(self, mapping, **attrs): + """Update a mapping + + :param mapping: Either the ID of a mapping or a + :class:`~openstack.identity.v3.mapping.Mapping` + instance. + :attrs kwargs: The attributes to update on the mapping represented + by ``value``. + + :returns: The updated mapping + :rtype: :class:`~openstack.identity.v3.mapping.Mapping` + """ + return self._update(_mapping.Mapping, mapping, **attrs) diff --git a/openstack/identity/v3/mapping.py b/openstack/identity/v3/mapping.py new file mode 100644 index 000000000..a0327ef8d --- /dev/null +++ b/openstack/identity/v3/mapping.py @@ -0,0 +1,39 @@ +# 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 openstack import resource + + +class Mapping(resource.Resource): + resource_key = 'mapping' + resources_key = 'mappings' + base_path = '/OS-FEDERATION/mappings' + + # capabilities + allow_create = True + allow_fetch = True + allow_commit = True + allow_delete = True + allow_list = True + create_method = 'PUT' + commit_method = 'PATCH' + + _query_mapping = resource.QueryParameters( + 'id', + ) + + # Properties + #: The rules of this mapping. *Type: list* + rules = resource.Body('rules', type=list) + + #: The identifier of the mapping. *Type: string* + name = resource.Body('id') diff --git a/openstack/tests/unit/identity/v3/test_mapping.py b/openstack/tests/unit/identity/v3/test_mapping.py new file mode 100644 index 000000000..41b07c7ba --- /dev/null +++ b/openstack/tests/unit/identity/v3/test_mapping.py @@ -0,0 +1,50 @@ +# 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 openstack.tests.unit import base + +from openstack.identity.v3 import mapping + +IDENTIFIER = 'IDENTIFIER' +EXAMPLE = { + 'id': IDENTIFIER, + 'rules': [{'local': [], 'remote': []}], +} + + +class TestMapping(base.TestCase): + + def test_basic(self): + sot = mapping.Mapping() + self.assertEqual('mapping', sot.resource_key) + self.assertEqual('mappings', sot.resources_key) + self.assertEqual('/OS-FEDERATION/mappings', sot.base_path) + self.assertTrue(sot.allow_create) + self.assertTrue(sot.allow_fetch) + self.assertTrue(sot.allow_commit) + self.assertTrue(sot.allow_delete) + self.assertTrue(sot.allow_list) + self.assertEqual('PATCH', sot.commit_method) + self.assertEqual('PUT', sot.create_method) + + self.assertDictEqual( + { + 'id': 'id', + 'limit': 'limit', + 'marker': 'marker', + }, + sot._query_mapping._mapping) + + def test_make_it(self): + sot = mapping.Mapping(**EXAMPLE) + self.assertEqual(EXAMPLE['id'], sot.id) + self.assertEqual(EXAMPLE['rules'], sot.rules)