diff --git a/heat/engine/properties.py b/heat/engine/properties.py index dddfcc8abd..e874879c51 100644 --- a/heat/engine/properties.py +++ b/heat/engine/properties.py @@ -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.""" @@ -366,16 +377,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, diff --git a/heat/tests/test_properties.py b/heat/tests/test_properties.py index 47e6fe446b..8380a00a6d 100644 --- a/heat/tests/test_properties.py +++ b/heat/tests/test_properties.py @@ -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)