Check immutable and update_allowed conflict in schema validation

This doesn't check any user input, but checks the validity of the
schema itself, so better to do it during schema validation.
Note, that now heat engine doesn't start in the case of invalid schema.

Change-Id: Iec5ca304eae780f8c028f7eb59cc7ee8710043a1
This commit is contained in:
Oleksii Chuprykov 2016-06-20 15:26:37 +03:00
parent 6499a52e4c
commit 1359887fd8
2 changed files with 16 additions and 16 deletions

View File

@ -71,6 +71,17 @@ class Schema(constr.Schema):
# validate structural correctness of schema itself
self.validate()
def validate(self, context=None):
super(Schema, self).validate()
# check that update_allowed and immutable
# do not contradict each other
if self.update_allowed and self.immutable:
msg = _("Options %(ua)s and %(im)s "
"cannot both be True") % {
'ua': UPDATE_ALLOWED,
'im': IMMUTABLE}
raise exception.InvalidSchemaError(message=msg)
@classmethod
def from_legacy(cls, schema_dict):
"""Return a Property Schema object from a legacy schema dictionary."""
@ -365,16 +376,6 @@ class Properties(collections.Mapping):
raise exception.StackValidationFailed(message=msg)
for (key, prop) in self.props.items():
# check that update_allowed and immutable
# do not contradict each other
if prop.update_allowed() and prop.immutable():
msg = _("Property %(prop)s: %(ua)s and %(im)s "
"cannot both be True") % {
'prop': key,
'ua': prop.schema.UPDATE_ALLOWED,
'im': prop.schema.IMMUTABLE}
raise exception.InvalidSchemaError(message=msg)
if with_value:
try:
self._get_property_value(key, validate=True)

View File

@ -1899,9 +1899,8 @@ class PropertiesValidationTest(common.HeatTestCase):
self.assertEqual({}, props)
def test_update_allowed_and_immutable_contradict(self):
schema = {'foo': properties.Schema(
properties.Schema.STRING,
update_allowed=True,
immutable=True)}
props = properties.Properties(schema, {})
self.assertRaises(exception.InvalidSchemaError, props.validate)
self.assertRaises(exception.InvalidSchemaError,
properties.Schema,
properties.Schema.STRING,
update_allowed=True,
immutable=True)