From 5faf344646d061710d57b452e395303fb25c55fb Mon Sep 17 00:00:00 2001 From: Angus Salkeld Date: Mon, 2 Jul 2012 11:23:32 +1000 Subject: [PATCH] Teach CheckedSchema to do nested schemas Change-Id: Ie321fcded8c826ca98c15078d9a545f283d25510 Signed-off-by: Angus Salkeld --- heat/engine/checkeddict.py | 14 +++++++-- heat/tests/unit/test_checkeddict.py | 44 +++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/heat/engine/checkeddict.py b/heat/engine/checkeddict.py index dd09d578ee..7893a66894 100644 --- a/heat/engine/checkeddict.py +++ b/heat/engine/checkeddict.py @@ -92,11 +92,21 @@ class CheckedDict(collections.MutableMapping): if not isinstance(value, dict): raise ValueError('%s: %s Value must be a map' % (self.name, key)) + if 'Schema' in self.data[key]: + cdict = Properties(key, self.data[key]['Schema']) + cdict.data = self.data[key]['Schema'] + for k, v in value.items(): + cdict[k] = v elif t == 'List': if not isinstance(value, (list, tuple)): - raise ValueError('%s: %s Value must be a list' % - (self.name, key)) + raise ValueError('%s: %s Value must be a list, not %s' % + (self.name, key, value)) + if 'Schema' in self.data[key]: + for item in value: + cdict = Properties(key, self.data[key]['Schema']) + for k, v in item.items(): + cdict[k] = v elif t == 'CommaDelimitedList': sp = value.split(',') diff --git a/heat/tests/unit/test_checkeddict.py b/heat/tests/unit/test_checkeddict.py index e804159884..a00fbd3e27 100644 --- a/heat/tests/unit/test_checkeddict.py +++ b/heat/tests/unit/test_checkeddict.py @@ -86,3 +86,47 @@ class CheckedDictTest(unittest.TestCase): self.assertRaises(ValueError, cd.__setitem__, 'SomeNumber', '9048.56') # lists cd['TODOList'] = "'one', 'two', 'three'" + + def test_nested_paramerters(self): + listeners_schema = { + 'InstancePort': {'Type': 'Integer', + 'Required': True}, + 'LoadBalancerPort': {'Type': 'Integer', + 'Required': True} + } + + healthcheck_schema = { + 'HealthyThreshold': {'Type': 'Number', + 'Required': True}, + 'Interval': {'Type': 'Number', + 'Required': True} + } + + properties_schema = { + 'HealthCheck': {'Type': 'Map', + 'Implemented': False, + 'Schema': healthcheck_schema}, + 'Listeners': {'Type': 'List', + 'Schema': listeners_schema} + } + + cd = checkeddict.Properties('nested', properties_schema) + + hc = {'HealthyThreshold': 'bla', 'Interval': '45'} + self.assertRaises(ValueError, cd.__setitem__, 'HealthCheck', hc) + + hc = {'HealthyThreshold': '246', 'Interval': '45'} + cd['HealthCheck'] = hc + self.assertTrue(cd['HealthCheck']['HealthyThreshold'] == '246') + self.assertTrue(cd['HealthCheck']['Interval'] == '45') + + li = [{'InstancePort': 'bla', 'LoadBalancerPort': '45'}, + {'InstancePort': '66', 'LoadBalancerPort': '775'}] + self.assertRaises(ValueError, cd.__setitem__, 'Listeners', li) + + li2 = [{'InstancePort': '674', 'LoadBalancerPort': '45'}, + {'InstancePort': '66', 'LoadBalancerPort': '775'}] + cd['Listeners'] = li2 + + self.assertTrue(cd['Listeners'][0]['LoadBalancerPort'] == '45') + self.assertTrue(cd['Listeners'][1]['LoadBalancerPort'] == '775')