Use api/attributes.py instead of api/utils.py

Lets stop this habit now.

Change-Id: I0d3f7041cbe4fb762d6266dec6b4837640734cdf
This commit is contained in:
Henry Gessau 2016-11-13 16:24:02 -05:00
parent fa6c37f35b
commit 60e9415c88
4 changed files with 61 additions and 34 deletions

View File

@ -0,0 +1,43 @@
# 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:
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

View File

@ -10,35 +10,14 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from webob import exc """
NOTE: Do not use this module to add random utils.
We want to avoid having a generic utils.py dumping ground.
"""
from neutron_lib._i18n import _ from debtcollector import moves
from neutron_lib.api import attributes
def populate_project_info(attributes): populate_project_info = moves.moved_function(
"""Ensure that both project_id and tenant_id attributes are present. attributes.populate_project_info, 'populate_project_info', __name__)
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

View File

@ -12,7 +12,7 @@
from webob import exc from webob import exc
from neutron_lib.api import utils from neutron_lib.api import attributes
from oslo_utils import uuidutils from oslo_utils import uuidutils
from neutron_lib.tests import _base as base from neutron_lib.tests import _base as base
@ -22,14 +22,14 @@ class TestApiUtils(base.BaseTestCase):
def test_populate_project_info_add_project(self): def test_populate_project_info_add_project(self):
attrs_in = {'tenant_id': uuidutils.generate_uuid()} attrs_in = {'tenant_id': uuidutils.generate_uuid()}
attrs_out = utils.populate_project_info(attrs_in) attrs_out = attributes.populate_project_info(attrs_in)
self.assertIn('project_id', attrs_out) self.assertIn('project_id', attrs_out)
self.assertEqual(attrs_in['tenant_id'], attrs_out['project_id']) self.assertEqual(attrs_in['tenant_id'], attrs_out['project_id'])
self.assertEqual(2, len(attrs_out)) self.assertEqual(2, len(attrs_out))
def test_populate_project_info_add_tenant(self): def test_populate_project_info_add_tenant(self):
attrs_in = {'project_id': uuidutils.generate_uuid()} attrs_in = {'project_id': uuidutils.generate_uuid()}
attrs_out = utils.populate_project_info(attrs_in) attrs_out = attributes.populate_project_info(attrs_in)
self.assertIn('tenant_id', attrs_out) self.assertIn('tenant_id', attrs_out)
self.assertEqual(attrs_in['project_id'], attrs_out['tenant_id']) self.assertEqual(attrs_in['project_id'], attrs_out['tenant_id'])
self.assertEqual(2, len(attrs_out)) self.assertEqual(2, len(attrs_out))
@ -37,7 +37,7 @@ class TestApiUtils(base.BaseTestCase):
def test_populate_project_info_ids_match(self): def test_populate_project_info_ids_match(self):
project_id = uuidutils.generate_uuid() project_id = uuidutils.generate_uuid()
attrs_in = {'project_id': project_id, 'tenant_id': project_id} attrs_in = {'project_id': project_id, 'tenant_id': project_id}
attrs_out = utils.populate_project_info(attrs_in) attrs_out = attributes.populate_project_info(attrs_in)
self.assertEqual(attrs_in, attrs_out) self.assertEqual(attrs_in, attrs_out)
def test_populate_project_info_id_mismatch(self): def test_populate_project_info_id_mismatch(self):
@ -46,4 +46,4 @@ class TestApiUtils(base.BaseTestCase):
'tenant_id': uuidutils.generate_uuid() 'tenant_id': uuidutils.generate_uuid()
} }
self.assertRaises(exc.HTTPBadRequest, self.assertRaises(exc.HTTPBadRequest,
utils.populate_project_info, attrs) attributes.populate_project_info, attrs)

View File

@ -0,0 +1,5 @@
---
deprecations:
- The function ``neutron_lib.api.utils.populate_project_info`` has moved
to ``neutron_lib.api.attributes.populate_project_info``. It will be removed
from the old location in the future.