objects: introduce a util function to handle tenant_id filter

Objects will directly support project_id filters only. The tenant_id
property is provided for mere convenience, and does not serve for
filtering purposes. So every time we'll need to pass filters from API
that still supports tenant_id attribute filtering, we'll need to do the
filter conversion.

This patch introduces the util function that will later be used by
other objects, like subnet, security group, or subnetpool (for the
latter, once we convert its existing tenant_id field to project_id).

Change-Id: If82c180688e1ecdff1c8a6e29cb8668838ac0a5b
Partially-Implements: blueprint adopt-oslo-versioned-objects-for-db
This commit is contained in:
Ihar Hrachyshka 2016-08-03 10:03:19 +02:00
parent 17d85e4748
commit f13ed8c506
3 changed files with 81 additions and 0 deletions

View File

@ -335,6 +335,10 @@ class TenantQuotaNotFound(e.NotFound):
message = _("Quota for tenant %(tenant_id)s could not be found.")
class TenantIdProjectIdFilterConflict(e.BadRequest):
message = _("Both tenant_id and project_id passed as filters.")
# Neutron-lib migration shim. This will wrap any exceptions that are moved
# to that library in a deprecation warning, until they can be updated to
# import directly from their new location.

25
neutron/objects/utils.py Normal file
View File

@ -0,0 +1,25 @@
# 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 copy
from neutron.common import exceptions
def convert_filters(**kwargs):
result = copy.deepcopy(kwargs)
if 'tenant_id' in result:
if 'project_id' in result:
raise exceptions.TenantIdProjectIdFilterConflict()
result['project_id'] = result.pop('tenant_id')
return result

View File

@ -0,0 +1,52 @@
# 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 neutron.common import exceptions
from neutron.objects import utils
from neutron.tests import base as test_base
class TestConvertFilters(test_base.BaseTestCase):
def test_convert_filters_no_tenant_id(self):
kwargs = {
'filter%d' % i: 'value%d' % i
for i in range(0, 10)
}
self.assertEqual(kwargs, utils.convert_filters(**kwargs))
def test_convert_filters_tenant_id(self):
expected_project_id = 'fake-tenant-id'
kwargs = {
'filter%d' % i: 'value%d' % i
for i in range(0, 10)
}
expected = kwargs.copy()
expected['project_id'] = expected_project_id
self.assertEqual(
expected,
utils.convert_filters(tenant_id=expected_project_id, **kwargs)
)
def test_convert_filters_tenant_id_and_project_id_raises(self):
kwargs = {
'filter%d' % i: 'value%d' % i
for i in range(0, 10)
}
kwargs['tenant_id'] = 'fake-tenant-id'
kwargs['project_id'] = 'fake-tenant-id'
self.assertRaises(
exceptions.TenantIdProjectIdFilterConflict,
utils.convert_filters, **kwargs
)