try:
res = self.engine_rpcapi.validate_template(con, template)
+ if 'Error' in res:
+ return api_utils.format_response('ValidateTemplate',
+ res['Error'])
+
res['Parameters'] = [format_validate_parameter(k, v)
for k, v in res['Parameters'].items()]
return api_utils.format_response('ValidateTemplate', res)
return {'Error': 'At least one Resources member must be defined.'}
for res in tmpl_resources.values():
- if not res.get('Type'):
+ try:
+ if not res.get('Type'):
+ return {'Error':
+ 'Every Resource object must '
+ 'contain a Type member.'}
+ except AttributeError:
+ type_res = type(res)
+ if isinstance(res, unicode):
+ type_res = "string"
return {'Error':
- 'Every Resources object must contain a Type member.'}
+ 'Resources must contain Resource. '
+ 'Found a [%s] instead' % type_res}
+
ResourceClass = resource.get_class(res['Type'])
props = properties.Properties(ResourceClass.properties_schema,
res.get('Properties', {}))
self.assertEqual(type(result),
exception.HeatInvalidParameterValueError)
+ def test_bad_resources_in_template(self):
+ # Format a dummy request
+ json_template = {
+ 'template': {
+ 'AWSTemplateFormatVersion': '2010-09-09',
+ 'Resources': {
+ 'Type': 'AWS: : EC2: : Instance',
+ },
+ }
+ }
+ params = {'Action': 'ValidateTemplate',
+ 'TemplateBody': '%s' % json.dumps(json_template)}
+ response = {'Error': 'Resources must contain Resource. '
+ 'Found a [string] instead'}
+ dummy_req = self._dummy_GET_request(params)
+
+ # Stub out the RPC call to the engine with a pre-canned response
+ self.m.StubOutWithMock(rpc, 'call')
+ rpc.call(dummy_req.context, self.topic,
+ {'namespace': None,
+ 'method': 'validate_template',
+ 'args': {'template': json_template},
+ 'version': self.api_version}, None).AndReturn(response)
+ self.m.ReplayAll()
+
+ response = self.controller.validate_template(dummy_req)
+
+ expected = {'ValidateTemplateResponse':
+ {'ValidateTemplateResult':
+ 'Resources must contain Resource. '
+ 'Found a [string] instead'}}
+ self.assertEqual(expected, response)
+ self.m.VerifyAll()
+
def test_delete(self):
# Format a dummy request
stack_name = "wordpress"
}
'''
+test_template_invalid_resources = '''
+{
+ "AWSTemplateFormatVersion" : "2010-09-09",
+ "Description" : "AWS CloudFormation Sample Template for xyz.",
+ "Parameters" : {
+ "InstanceType" : {
+ "Description" : "Defined instance type",
+ "Type" : "String",
+ "Default" : "node.ee",
+ "AllowedValues" : ["node.ee", "node.apache", "node.api"],
+ "ConstraintDescription" : "must be a valid instance type."
+ }
+ },
+ "Resources" : {
+ "Type" : "AWS::EC2::Instance",
+ "Metadata" : {
+ },
+ "Properties" : {
+ "ImageId" : { "Ref" : "centos-6.4-20130701-0" },
+ "InstanceType" : { "Ref" : "InstanceType" }
+ }
+ }
+}
+'''
+
test_template_invalid_property = '''
{
"AWSTemplateFormatVersion" : "2010-09-09",
res = dict(engine.validate_template(None, t))
self.assertEqual(res, {'Error': 'Unknown Property UnknownProperty'})
+ def test_invalid_resources(self):
+ t = template_format.parse(test_template_invalid_resources)
+ self.m.StubOutWithMock(instances.Instance, 'nova')
+ instances.Instance.nova().AndReturn(self.fc)
+ self.m.ReplayAll()
+
+ engine = service.EngineService('a', 't')
+ res = dict(engine.validate_template(None, t))
+ self.assertEqual({'Error': 'Resources must contain Resource. '
+ 'Found a [string] instead'},
+ res)
+
def test_unimplemented_property(self):
t = template_format.parse(test_template_unimplemented_property)
self.m.StubOutWithMock(instances.Instance, 'nova')