Fix outputs validation place in Stack.validate
Because of outputs validation check located in wrong place, outputs validation skipped, when template has no resources. It's incorrect because of possible incorrect references to unknown resources. Change-Id: I693b51540b0678aa17b861b9f85a0cb2a9552660 Closes-bug: #1396441
This commit is contained in:
parent
1812a70a9b
commit
514916125b
@ -480,22 +480,22 @@ class Stack(collections.Mapping):
|
||||
if result:
|
||||
raise exception.StackValidationFailed(message=result)
|
||||
|
||||
for val in self.outputs.values():
|
||||
try:
|
||||
if not val or not val.get('Value'):
|
||||
message = _('Each Output must contain '
|
||||
'a Value key.')
|
||||
raise exception.StackValidationFailed(message=message)
|
||||
function.validate(val.get('Value'))
|
||||
except AttributeError:
|
||||
message = _('Output validation error: '
|
||||
'Outputs must contain Output. '
|
||||
'Found a [%s] instead') % type(val)
|
||||
for val in self.outputs.values():
|
||||
try:
|
||||
if not val or not val.get('Value'):
|
||||
message = _('Each Output must contain '
|
||||
'a Value key.')
|
||||
raise exception.StackValidationFailed(message=message)
|
||||
except Exception as ex:
|
||||
reason = _('Output validation error: '
|
||||
'%s') % six.text_type(ex)
|
||||
raise exception.StackValidationFailed(message=reason)
|
||||
function.validate(val.get('Value'))
|
||||
except AttributeError:
|
||||
message = _('Output validation error: '
|
||||
'Outputs must contain Output. '
|
||||
'Found a [%s] instead') % type(val)
|
||||
raise exception.StackValidationFailed(message=message)
|
||||
except Exception as ex:
|
||||
reason = _('Output validation error: '
|
||||
'%s') % six.text_type(ex)
|
||||
raise exception.StackValidationFailed(message=reason)
|
||||
|
||||
def requires_deferred_auth(self):
|
||||
'''
|
||||
|
@ -4264,6 +4264,41 @@ class StackTest(common.HeatTestCase):
|
||||
'(AResource Bar) is incorrect.',
|
||||
six.text_type(ex))
|
||||
|
||||
def test_incorrect_outputs_cfn_incorrect_reference(self):
|
||||
tmpl = template_format.parse("""
|
||||
HeatTemplateFormatVersion: '2012-12-12'
|
||||
Outputs:
|
||||
Output:
|
||||
Value:
|
||||
Fn::GetAtt:
|
||||
- Resource
|
||||
- Foo
|
||||
""")
|
||||
self.stack = parser.Stack(self.ctx, 'stack_with_incorrect_outputs',
|
||||
template.Template(tmpl))
|
||||
|
||||
ex = self.assertRaises(exception.StackValidationFailed,
|
||||
self.stack.validate)
|
||||
|
||||
self.assertIn('The specified reference "Resource" '
|
||||
'(in unknown) is incorrect.', six.text_type(ex))
|
||||
|
||||
def test_incorrect_outputs_incorrect_reference(self):
|
||||
tmpl = template_format.parse("""
|
||||
heat_template_version: 2013-05-23
|
||||
outputs:
|
||||
output:
|
||||
value: { get_attr: [resource, foo] }
|
||||
""")
|
||||
self.stack = parser.Stack(self.ctx, 'stack_with_incorrect_outputs',
|
||||
template.Template(tmpl))
|
||||
|
||||
ex = self.assertRaises(exception.StackValidationFailed,
|
||||
self.stack.validate)
|
||||
|
||||
self.assertIn('The specified reference "resource" '
|
||||
'(in unknown) is incorrect.', six.text_type(ex))
|
||||
|
||||
def test_incorrect_outputs_cfn_empty_output(self):
|
||||
tmpl = template_format.parse("""
|
||||
HeatTemplateFormatVersion: '2012-12-12'
|
||||
|
Loading…
Reference in New Issue
Block a user