Initial validation of functions
All template functions contain only 'result' function for resolving snippet of template. Current patch presents initial implementation of validate method and support function 'validate' similar to 'resolve'. Related-Bug: #1273490 Change-Id: Id81493bd72e75da746101c4c741eaf846abd8360
This commit is contained in:
parent
df9fa6c0c4
commit
85e9411d3d
|
@ -36,6 +36,15 @@ class Function(object):
|
|||
self.fn_name = fn_name
|
||||
self.args = args
|
||||
|
||||
def validate(self):
|
||||
"""
|
||||
Validate arguments without resolving the function.
|
||||
|
||||
Function subclasses must override this method to validate their
|
||||
args.
|
||||
"""
|
||||
validate(self.args)
|
||||
|
||||
@abc.abstractmethod
|
||||
def result(self):
|
||||
"""
|
||||
|
@ -110,3 +119,15 @@ def resolve(snippet):
|
|||
return [resolve(v) for v in snippet]
|
||||
|
||||
return snippet
|
||||
|
||||
|
||||
def validate(snippet):
|
||||
if isinstance(snippet, Function):
|
||||
snippet.validate()
|
||||
elif isinstance(snippet, collections.Mapping):
|
||||
for v in snippet.values():
|
||||
validate(v)
|
||||
elif (not isinstance(snippet, basestring) and
|
||||
isinstance(snippet, collections.Iterable)):
|
||||
for v in snippet:
|
||||
validate(v)
|
||||
|
|
|
@ -19,6 +19,10 @@ from heat.engine import function
|
|||
|
||||
|
||||
class TestFunction(function.Function):
|
||||
def validate(self):
|
||||
if len(self.args) < 2:
|
||||
raise Exception(_('Need more arguments'))
|
||||
|
||||
def result(self):
|
||||
return 'wibble'
|
||||
|
||||
|
@ -80,3 +84,42 @@ class ResolveTest(HeatTestCase):
|
|||
self.assertEqual(['foo', {'bar': ['baz', {'blarg': 'wibble'}]}],
|
||||
result)
|
||||
self.assertIsNot(result, snippet)
|
||||
|
||||
|
||||
class ValidateTest(HeatTestCase):
|
||||
def setUp(self):
|
||||
super(ValidateTest, self).setUp()
|
||||
self.func = TestFunction(None, 'foo', ['bar', 'baz'])
|
||||
|
||||
def test_validate_func(self):
|
||||
self.assertIsNone(function.validate(self.func))
|
||||
self.func = TestFunction(None, 'foo', ['bar'])
|
||||
ex = self.assertRaises(Exception, function.validate, self.func)
|
||||
self.assertEqual('Need more arguments', str(ex))
|
||||
|
||||
def test_validate_dict(self):
|
||||
snippet = {'foo': 'bar', 'blarg': self.func}
|
||||
function.validate(snippet)
|
||||
|
||||
self.func = TestFunction(None, 'foo', ['bar'])
|
||||
snippet = {'foo': 'bar', 'blarg': self.func}
|
||||
ex = self.assertRaises(Exception, function.validate, snippet)
|
||||
self.assertEqual('Need more arguments', str(ex))
|
||||
|
||||
def test_validate_list(self):
|
||||
snippet = ['foo', 'bar', 'baz', 'blarg', self.func]
|
||||
function.validate(snippet)
|
||||
|
||||
self.func = TestFunction(None, 'foo', ['bar'])
|
||||
snippet = {'foo': 'bar', 'blarg': self.func}
|
||||
ex = self.assertRaises(Exception, function.validate, snippet)
|
||||
self.assertEqual('Need more arguments', str(ex))
|
||||
|
||||
def test_validate_all(self):
|
||||
snippet = ['foo', {'bar': ['baz', {'blarg': self.func}]}]
|
||||
function.validate(snippet)
|
||||
|
||||
self.func = TestFunction(None, 'foo', ['bar'])
|
||||
snippet = {'foo': 'bar', 'blarg': self.func}
|
||||
ex = self.assertRaises(Exception, function.validate, snippet)
|
||||
self.assertEqual('Need more arguments', str(ex))
|
||||
|
|
Loading…
Reference in New Issue