From 990a5d7114acac3f65f556a4e7fde86019db7309 Mon Sep 17 00:00:00 2001 From: Henry Gessau Date: Wed, 5 Oct 2016 12:14:28 -0400 Subject: [PATCH] Rehome populate_project_info() from neutron Having this function in neutron-lib is a prerequisite for moving the common_db_mixin stuff to neutron-lib. Change-Id: I545dac5e872c60e01c4eee7ca8c01519ffd2ec2e --- neutron_lib/api/utils.py | 44 +++++++++++++++++++++ neutron_lib/tests/unit/api/test_utils.py | 49 ++++++++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 neutron_lib/api/utils.py create mode 100644 neutron_lib/tests/unit/api/test_utils.py diff --git a/neutron_lib/api/utils.py b/neutron_lib/api/utils.py new file mode 100644 index 0000000..bbcaeff --- /dev/null +++ b/neutron_lib/api/utils.py @@ -0,0 +1,44 @@ +# 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 webob import exc + +from neutron_lib._i18n import _ + + +def populate_project_info(attributes): + """Ensure that both project_id and tenant_id attributes are present. + + If either project_id or tenant_id is present in attributes then ensure + that both are present. + + If neither are present then attributes is not updated. + + :param attributes: a dictionary of resource/API attributes + :type attributes: dict + + :return: the updated attributes dictionary + :rtype: dict + + """ + if 'tenant_id' in attributes and 'project_id' not in attributes: + # TODO(HenryG): emit a deprecation warning here + attributes['project_id'] = attributes['tenant_id'] + elif 'project_id' in attributes and 'tenant_id' not in attributes: + # Backward compatibility for code still using tenant_id + attributes['tenant_id'] = attributes['project_id'] + + if attributes.get('project_id') != attributes.get('tenant_id'): + msg = _("'project_id' and 'tenant_id' do not match") + raise exc.HTTPBadRequest(msg) + + return attributes diff --git a/neutron_lib/tests/unit/api/test_utils.py b/neutron_lib/tests/unit/api/test_utils.py new file mode 100644 index 0000000..54841be --- /dev/null +++ b/neutron_lib/tests/unit/api/test_utils.py @@ -0,0 +1,49 @@ +# 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 webob import exc + +from neutron_lib.api import utils +from oslo_utils import uuidutils + +from neutron_lib.tests import _base as base + + +class TestApiUtils(base.BaseTestCase): + + def test_populate_project_info_add_project(self): + attrs_in = {'tenant_id': uuidutils.generate_uuid()} + attrs_out = utils.populate_project_info(attrs_in) + self.assertIn('project_id', attrs_out) + self.assertEqual(attrs_in['tenant_id'], attrs_out['project_id']) + self.assertEqual(2, len(attrs_out)) + + def test_populate_project_info_add_tenant(self): + attrs_in = {'project_id': uuidutils.generate_uuid()} + attrs_out = utils.populate_project_info(attrs_in) + self.assertIn('tenant_id', attrs_out) + self.assertEqual(attrs_in['project_id'], attrs_out['tenant_id']) + self.assertEqual(2, len(attrs_out)) + + def test_populate_project_info_ids_match(self): + project_id = uuidutils.generate_uuid() + attrs_in = {'project_id': project_id, 'tenant_id': project_id} + attrs_out = utils.populate_project_info(attrs_in) + self.assertEqual(2, len(attrs_out)) + + def test_populate_project_info_id_mismatch(self): + attrs = { + 'project_id': uuidutils.generate_uuid(), + 'tenant_id': uuidutils.generate_uuid() + } + self.assertRaises(exc.HTTPBadRequest, + utils.populate_project_info, attrs)