diff --git a/heat/common/urlfetch.py b/heat/common/urlfetch.py index 04e0be1f1a..1ef22b40c4 100644 --- a/heat/common/urlfetch.py +++ b/heat/common/urlfetch.py @@ -39,13 +39,13 @@ def get(url, allowed_schemes=('http', 'https')): the allowed_schemes argument. Raise an IOError if getting the data fails. """ - LOG.info('Fetching data from %s', url) - components = urllib.parse.urlparse(url) if components.scheme not in allowed_schemes: raise URLFetchError(_('Invalid URL scheme %s') % components.scheme) + LOG.info('Fetching data from %s', url) + if components.scheme == 'file': try: return urllib.request.urlopen(url).read() diff --git a/heat/engine/resources/template_resource.py b/heat/engine/resources/template_resource.py index 7abf6d2876..ba5e58ade6 100644 --- a/heat/engine/resources/template_resource.py +++ b/heat/engine/resources/template_resource.py @@ -195,6 +195,10 @@ class TemplateResource(stack_resource.StackResource): reported_excp = None t_data = self.stack.t.files.get(self.template_url) stored_t_data = t_data + + if t_data is None: + LOG.debug('TemplateResource data file "%s" not found in files.', + self.template_url) if not t_data and self.template_url.endswith((".yaml", ".template")): try: t_data = self.get_template_file(self.template_url, @@ -257,9 +261,8 @@ class TemplateResource(stack_resource.StackResource): raise exception.StackValidationFailed(message=msg) def validate(self): - if self.validation_exception is not None: - msg = six.text_type(self.validation_exception) - raise exception.StackValidationFailed(message=msg) + # Calls validate_template() + result = super(TemplateResource, self).validate() try: self.template_data() @@ -280,7 +283,14 @@ class TemplateResource(stack_resource.StackResource): facade_cls = fri.get_class(files=self.stack.t.files) self._validate_against_facade(facade_cls) - return super(TemplateResource, self).validate() + return result + + def validate_template(self): + if self.validation_exception is not None: + msg = six.text_type(self.validation_exception) + raise exception.StackValidationFailed(message=msg) + + return super(TemplateResource, self).validate_template() def handle_adopt(self, resource_data=None): return self.create_with_template(self.child_template(), diff --git a/heat_integrationtests/functional/test_template_resource.py b/heat_integrationtests/functional/test_template_resource.py index c05912c4ce..21a4ec061a 100644 --- a/heat_integrationtests/functional/test_template_resource.py +++ b/heat_integrationtests/functional/test_template_resource.py @@ -792,9 +792,11 @@ outputs: value: not-important ''' + template = yaml.safe_load(self.template) + del template['resources']['thisone']['properties']['two'] try: self.stack_create( - template=self.template, + template=yaml.safe_dump(template), environment=self.env, files={'facade.yaml': self.templ_facade, 'concrete.yaml': templ_missing_parameter},