Merge "Duplicate trait validation with jsonschema"

This commit is contained in:
Zuul 2020-11-18 07:10:14 +00:00 committed by Gerrit Code Review
commit 425853995d
2 changed files with 34 additions and 1 deletions

View File

@ -75,7 +75,14 @@ V31_FIELDS = [
]
STANDARD_TRAITS = os_traits.get_traits()
CUSTOM_TRAIT_REGEX = re.compile("^%s[A-Z0-9_]+$" % os_traits.CUSTOM_NAMESPACE)
CUSTOM_TRAIT_PATTERN = "^%s[A-Z0-9_]+$" % os_traits.CUSTOM_NAMESPACE
CUSTOM_TRAIT_REGEX = re.compile(CUSTOM_TRAIT_PATTERN)
TRAITS_SCHEMA = {'anyOf': [
{'type': 'string', 'minLength': 1, 'maxLength': 255,
'pattern': CUSTOM_TRAIT_PATTERN},
{'type': 'string', 'enum': STANDARD_TRAITS},
]}
def validate_limit(limit):
@ -97,6 +104,7 @@ def validate_sort_dir(sort_dir):
def validate_trait(trait, error_prefix=_('Invalid trait')):
# TODO(sbaker) remove when all trait validation is jsonschema based
error = exception.ClientSideError(
_('%(error_prefix)s. A valid trait must be no longer than 255 '
'characters. Standard traits are defined in the os_traits library. '

View File

@ -26,6 +26,7 @@ from ironic import api
from ironic.api.controllers.v1 import node as api_node
from ironic.api.controllers.v1 import utils
from ironic.api import types as atypes
from ironic.common import args
from ironic.common import exception
from ironic.common import policy
from ironic.common import states
@ -87,6 +88,30 @@ class TestApiUtils(base.TestCase):
"spongebob",
utils.validate_trait, "invalid", "spongebob")
def test_validate_trait_jsonschema(self):
validate_trait = args.schema(utils.TRAITS_SCHEMA)
validate_trait('foo', os_traits.HW_CPU_X86_AVX2)
validate_trait('foo', "CUSTOM_1")
validate_trait('foo', "CUSTOM_TRAIT_GOLD")
self.assertRaises(exception.InvalidParameterValue,
validate_trait, 'foo', "A" * 256)
self.assertRaises(exception.InvalidParameterValue,
validate_trait, 'foo', "CuSTOM_1")
self.assertRaises(exception.InvalidParameterValue,
validate_trait, 'foo', "")
self.assertRaises(exception.InvalidParameterValue,
validate_trait, 'foo', "CUSTOM_bob")
self.assertRaises(exception.InvalidParameterValue,
validate_trait, 'foo', "CUSTOM_1-BOB")
self.assertRaises(exception.InvalidParameterValue,
validate_trait, 'foo', "aCUSTOM_1a")
large = "CUSTOM_" + ("1" * 248)
self.assertEqual(255, len(large))
validate_trait('foo', large)
self.assertRaises(exception.InvalidParameterValue,
validate_trait, 'foo', large + "1")
def test_apply_jsonpatch(self):
doc = {"foo": {"bar": "baz"}}
patch = [{"op": "add", "path": "/foo/answer", "value": 42}]