diff --git a/heat/engine/properties.py b/heat/engine/properties.py index 0544cf849b..8cc80fa75e 100644 --- a/heat/engine/properties.py +++ b/heat/engine/properties.py @@ -213,10 +213,11 @@ def schemata(schema_dicts): class Property(object): - def __init__(self, schema, name=None, context=None): + def __init__(self, schema, name=None, context=None, path=None): self.schema = Schema.from_legacy(schema) self.name = name self.context = context + self.path = self.make_path(name, path) def required(self): return self.schema.required @@ -242,6 +243,18 @@ class Property(object): def support_status(self): return self.schema.support_status + def make_path(self, name, path=None): + if path is None: + path = '' + if name is None: + name = '' + + if isinstance(name, int) or name.isdigit(): + name = str(name) + + delim = '' if not path or path.endswith('.') else '.' + return delim.join([path, name]) + def _get_integer(self, value): if value is None: value = self.has_default() and self.default() or 0 @@ -274,7 +287,7 @@ class Property(object): schemata = dict((k, self.schema.schema[k]) for k in keys) properties = Properties(schemata, dict(child_values), context=self.context, - parent_name=self.name) + parent_name=self.path) if validate: properties.validate() @@ -361,7 +374,7 @@ class Properties(collections.Mapping): def __init__(self, schema, data, resolver=lambda d: d, parent_name=None, context=None, section=None): - self.props = dict((k, Property(s, k, context)) + self.props = dict((k, Property(s, k, context, path=parent_name)) for k, s in schema.items()) self.resolve = resolver self.data = data diff --git a/heat/tests/test_properties.py b/heat/tests/test_properties.py index ad33b1e826..db121cd8af 100644 --- a/heat/tests/test_properties.py +++ b/heat/tests/test_properties.py @@ -914,6 +914,14 @@ class PropertyTest(common.HeatTestCase): self.assertEqual(['foo', 'bar'], p.get_value('foo,bar')) self.assertEqual(['foo'], p.get_value('foo')) + def test_map_path(self): + p = properties.Property({'Type': 'Map'}, name='test', path='parent') + self.assertEqual('parent.test', p.path) + + def test_list_path(self): + p = properties.Property({'Type': 'List'}, name='0', path='parent') + self.assertEqual('parent.0', p.path) + def test_list_maxlength_good(self): schema = {'Type': 'List', 'MaxLength': '3'}