diff --git a/heat/api/openstack/v1/stacks.py b/heat/api/openstack/v1/stacks.py index 6d0c31090..5ffbaa5d1 100644 --- a/heat/api/openstack/v1/stacks.py +++ b/heat/api/openstack/v1/stacks.py @@ -537,7 +537,8 @@ class StackController(object): result = self.rpc_client.validate_template(req.context, data.template(), - data.environment()) + data.environment(), + files=data.files()) if 'Error' in result: raise exc.HTTPBadRequest(result['Error']) diff --git a/heat/engine/service.py b/heat/engine/service.py index 398c1517d..20fe8c5f2 100644 --- a/heat/engine/service.py +++ b/heat/engine/service.py @@ -273,7 +273,7 @@ class EngineService(service.Service): by the RPC caller. """ - RPC_API_VERSION = '1.16' + RPC_API_VERSION = '1.17' def __init__(self, host, topic): super(EngineService, self).__init__() @@ -958,7 +958,7 @@ class EngineService(service.Service): engine_id=engine_id) @context.request_context - def validate_template(self, cnxt, template, params=None): + def validate_template(self, cnxt, template, params=None, files=None): """ The validate_template method uses the stack parser to check the validity of a template. @@ -966,13 +966,14 @@ class EngineService(service.Service): :param cnxt: RPC context. :param template: Template of stack you want to create. :param params: Stack Input Params + :param files: Files referenced from the template """ LOG.info(_LI('validate_template')) if template is None: msg = _("No Template provided.") return webob.exc.HTTPBadRequest(explanation=msg) - tmpl = templatem.Template(template) + tmpl = templatem.Template(template, files=files) # validate overall template try: diff --git a/heat/rpc/client.py b/heat/rpc/client.py index 5526674d2..670e2eb85 100644 --- a/heat/rpc/client.py +++ b/heat/rpc/client.py @@ -37,6 +37,7 @@ class EngineClient(object): 1.14 - Add cancel_with_rollback option to stack_cancel_update 1.15 - Add preview_update_stack() call 1.16 - Adds version, type_name to list_resource_types() + 1.17 - Add files to validate_template ''' BASE_RPC_API_VERSION = '1.0' @@ -292,7 +293,7 @@ class EngineClient(object): ), version='1.15') - def validate_template(self, ctxt, template, params=None): + def validate_template(self, ctxt, template, params=None, files=None): """ The validate_template method uses the stack parser to check the validity of a template. @@ -300,10 +301,13 @@ class EngineClient(object): :param ctxt: RPC context. :param template: Template of stack you want to create. :param params: Stack Input Params/Environment + :param files: files referenced from the environment/template. """ return self.call(ctxt, self.make_msg('validate_template', template=template, - params=params)) + params=params, + files=files), + version='1.17') def authenticated_to_backend(self, ctxt): """ diff --git a/heat/tests/api/cfn/test_api_cfn_v1.py b/heat/tests/api/cfn/test_api_cfn_v1.py index c0fce4f18..a8a9a5761 100644 --- a/heat/tests/api/cfn/test_api_cfn_v1.py +++ b/heat/tests/api/cfn/test_api_cfn_v1.py @@ -1073,7 +1073,9 @@ class CfnStackControllerTest(common.HeatTestCase): self.m.StubOutWithMock(rpc_client.EngineClient, 'call') rpc_client.EngineClient.call( dummy_req.context, - ('validate_template', {'template': json_template, 'params': None}) + ('validate_template', {'template': json_template, 'params': None, + 'files': None}), + version='1.17' ).AndReturn(response) self.m.ReplayAll() diff --git a/heat/tests/api/openstack_v1/test_stacks.py b/heat/tests/api/openstack_v1/test_stacks.py index c19142aa0..3f99fd1ab 100644 --- a/heat/tests/api/openstack_v1/test_stacks.py +++ b/heat/tests/api/openstack_v1/test_stacks.py @@ -2058,7 +2058,9 @@ class StackControllerTest(tools.ControllerTest, common.HeatTestCase): 'params': {'parameters': {}, 'encrypted_param_names': [], 'parameter_defaults': {}, - 'resource_registry': {}}}) + 'resource_registry': {}}, + 'files': {}}), + version='1.17' ).AndReturn(engine_response) self.m.ReplayAll() @@ -2083,7 +2085,9 @@ class StackControllerTest(tools.ControllerTest, common.HeatTestCase): 'params': {'parameters': {}, 'encrypted_param_names': [], 'parameter_defaults': {}, - 'resource_registry': {}}}) + 'resource_registry': {}}, + 'files': {}}), + version='1.17' ).AndReturn({'Error': 'fubar'}) self.m.ReplayAll() diff --git a/heat/tests/engine/service/test_service_engine.py b/heat/tests/engine/service/test_service_engine.py index fb586736d..17fb4b1af 100644 --- a/heat/tests/engine/service/test_service_engine.py +++ b/heat/tests/engine/service/test_service_engine.py @@ -39,7 +39,7 @@ class ServiceEngineTest(common.HeatTestCase): def test_make_sure_rpc_version(self): self.assertEqual( - '1.16', + '1.17', service.EngineService.RPC_API_VERSION, ('RPC version is changed, please update this test to new version ' 'and make sure additional test cases are added for RPC APIs ' diff --git a/heat/tests/test_rpc_client.py b/heat/tests/test_rpc_client.py index 9bb5879b4..683ee369e 100644 --- a/heat/tests/test_rpc_client.py +++ b/heat/tests/test_rpc_client.py @@ -198,7 +198,8 @@ class EngineRpcAPITestCase(common.HeatTestCase): def test_validate_template(self): self._test_engine_api('validate_template', 'call', template={u'Foo': u'bar'}, - params={u'Egg': u'spam'}) + params={u'Egg': u'spam'}, + files=None) def test_list_resource_types(self): self._test_engine_api('list_resource_types',