Files
neutron-lib/neutron_lib/tests/unit/api/definitions/base.py
Boden R cba0f9f0dd Rehome providernet api-def
This patch rehomes the neutron.extensions.providernet
extension into neutron-lib. Tests and release note are also
included as well as a minor change to the base API definition
test case to support ATTR_NOT_SPECIFIED parameter values.

Change-Id: I54a1fa31f97c291b223971409e7915df24ee3ad1
2017-01-13 14:02:51 -07:00

167 lines
6.9 KiB
Python

# 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_lib.api.definitions import base
from neutron_lib.api import validators
from neutron_lib import constants
from neutron_lib.tests import _base as test_base
def assert_bool(tester, attribute, attribute_dict, keyword, value):
tester.assertIsInstance(
value, bool,
'%s must be a boolean for %s.' % (keyword, attribute))
def assert_converter(tester, attribute, attribute_dict, keyword, value):
if attribute_dict['default'] is constants.ATTR_NOT_SPECIFIED:
return
try:
attribute_dict['convert_to'](attribute_dict['default'])
except KeyError:
try:
attribute_dict['convert_list_to'](attribute_dict['default'])
except KeyError:
if validators.is_attr_set(value) and not isinstance(value, str):
tester.fail("Default value '%s' cannot be converted for "
"attribute %s." % (value, attribute))
def assert_true(tester, attribute, attribute_dict, keyword, value):
tester.assertTrue(
value, '%s must be True for %s.' % (keyword, attribute))
def assert_validator(tester, attribute, attribute_dict, keyword, value):
tester.assertIn(list(value)[0], validators.validators,
'%s is not a known validator for %s.' % (value, attribute))
ASSERT_FUNCTIONS = {
'allow_post': assert_bool,
'allow_put': assert_bool,
'convert_to': assert_converter,
'convert_list_to': assert_converter,
'default': assert_converter,
'enforce_policy': assert_bool,
'is_visible': assert_bool,
'primary_key': assert_true,
'required_by_policy': assert_bool,
'validate': assert_validator,
}
class DefinitionBaseTestCase(test_base.BaseTestCase):
extension_module = None
extension_resources = ()
extension_subresources = ()
extension_attributes = ()
def setUp(self):
super(DefinitionBaseTestCase, self).setUp()
if not self.extension_module:
self.fail("Missing extension module definition.")
self.alias = self.extension_module.ALIAS
self.is_shim_extension = self.extension_module.IS_SHIM_EXTENSION
self.is_standard_attr_extension = (
self.extension_module.IS_STANDARD_ATTR_EXTENSION)
self.name = self.extension_module.NAME
self.description = self.extension_module.DESCRIPTION
self.resource_map = self.extension_module.RESOURCE_ATTRIBUTE_MAP
self.subresource_map = self.extension_module.SUB_RESOURCE_ATTRIBUTE_MAP
self.action_map = self.extension_module.ACTION_MAP
self.required_extensions = self.extension_module.REQUIRED_EXTENSIONS
self.optional_extensions = self.extension_module.OPTIONAL_EXTENSIONS
def test_shim_extension(self):
if self.is_shim_extension is True:
self.assertFalse(self.extension_resources)
self.assertFalse(self.extension_attributes)
self.assertFalse(self.resource_map)
self.assertFalse(self.action_map)
def test_is_standard_attr_extension(self):
if self.is_standard_attr_extension:
self.assertIn('standard-attr-', self.alias)
else:
self.skipTest('API definition is not related to standardattr.')
def test_resource_map(self):
if not self.resource_map and not self.is_shim_extension:
self.fail('Missing resource map, what is this extension doing?')
elif self.is_shim_extension:
self.skipTest('Shim extension with no API changes.')
for resource in self.resource_map:
self.assertIn(
resource, base.KNOWN_RESOURCES + self.extension_resources,
'Resource is unknown, check for typos.')
self.assertParams(self.resource_map[resource])
def assertParams(self, resource):
for attribute in resource.keys():
self.assertIn(
attribute,
base.KNOWN_ATTRIBUTES + self.extension_attributes,
'Attribute is unknown, check for typos.')
for keyword in resource[attribute]:
self.assertIn(keyword, base.KNOWN_KEYWORDS,
'Keyword is unknown, check for typos.')
value = resource[attribute][keyword]
assert_f = ASSERT_FUNCTIONS[keyword]
assert_f(self, attribute,
resource[attribute],
keyword, value)
def test_subresource_map(self):
if not self.subresource_map:
self.skipTest('API extension has no subresource map.')
for subresource in self.subresource_map:
self.assertIn(
subresource, self.extension_subresources,
'Sub-resource is unknown, check for typos.')
for attribute in self.subresource_map[subresource]:
self.assertIn(attribute, ('parent', 'parameters'))
self.assertIn(
self.subresource_map[subresource]['parent']['collection_name'],
base.KNOWN_RESOURCES + self.extension_resources,
'Sub-resource parent is unknown, check for typos.')
self.assertIn('member_name',
self.subresource_map[subresource]['parent'],
'Incorrect parent definition, check for typos.')
self.assertParams(self.subresource_map[subresource]['parameters'])
def test_action_map(self):
if not self.action_map:
self.skipTest('API definition has no action map.')
for key in self.action_map:
for action in self.action_map[key].values():
self.assertIn(action, base.KNOWN_HTTP_ACTIONS,
'HTTP verb is unknown, check for typos.')
def test_required_extensions(self):
if not self.required_extensions:
self.skipTest('API definition has no required extensions.')
for ext in self.required_extensions:
self.assertIn(ext, base.KNOWN_EXTENSIONS,
'Required extension is unknown, check for typos.')
def test_optional_extensions(self):
if not self.optional_extensions:
self.skipTest('API definition has no optional extensions.')
for ext in self.optional_extensions:
self.assertIn(ext, base.KNOWN_EXTENSIONS,
'Optional extension is unknown, check for typos.')