diff options
author | Peter Razumovsky <prazumovsky@mirantis.com> | 2015-03-30 14:48:32 +0300 |
---|---|---|
committer | Peter Razumovsky <prazumovsky@mirantis.com> | 2015-06-03 14:02:44 +0000 |
commit | 6a117f3930049d37b03770e2cb1c94a9795a08e0 (patch) | |
tree | d05972ffab331eae90a7930f26303e21a65ab9d4 | |
parent | 40bfa60d84aa38fef5a7c8d278641bfeefad4bb7 (diff) | |
download | heat-6a117f3930049d37b03770e2cb1c94a9795a08e0.tar.gz |
Add env storing for loaded environments
If env loaded from outer file, there is probability
that this outer file will be deleted. So, if template
uses some resource with resource registry env, we need
to store this env in db.
Change-Id: Ib0c191db2dccac6d467a9961062424bc1f924c24
Closes-bug: #1429141
(cherry picked from commit d8fe35eee518036eab7f73aca28cf4d770ae7dc1)
-rw-r--r-- | heat/engine/environment.py | 9 | ||||
-rw-r--r-- | heat/engine/resources/template_resource.py | 3 | ||||
-rw-r--r-- | heat/tests/test_environment.py | 21 |
3 files changed, 33 insertions, 0 deletions
diff --git a/heat/engine/environment.py b/heat/engine/environment.py index 383b6a38b..edee06f0f 100644 --- a/heat/engine/environment.py +++ b/heat/engine/environment.py @@ -290,6 +290,15 @@ class ResourceRegistry(object): resource_name) if ((registry_type is None or isinstance(match, registry_type)) and (accept_fn is None or accept_fn(info))): + # NOTE(prazumovsky): if resource_type defined in outer env + # there is a risk to lose it due to h-eng restarting, so + # store it to local env (exclude ClassResourceInfo because it + # loads from resources; TemplateResourceInfo handles by + # template_resource module). + if (match and not match.user_resource and + not isinstance(info, (TemplateResourceInfo, + ClassResourceInfo))): + self._register_info([resource_type], info) return match def get_class(self, resource_type, resource_name=None, accept_fn=None): diff --git a/heat/engine/resources/template_resource.py b/heat/engine/resources/template_resource.py index 816919fe0..509f3caad 100644 --- a/heat/engine/resources/template_resource.py +++ b/heat/engine/resources/template_resource.py @@ -65,6 +65,7 @@ class TemplateResource(stack_resource.StackResource): '.template are supported')) else: self.template_name = tri.template_name + self.resource_type = tri.name if tri.user_resource: self.allowed_schemes = ('http', 'https') else: @@ -170,6 +171,8 @@ class TemplateResource(stack_resource.StackResource): if t_data is not None: self.stack.t.files[self.template_name] = t_data + self.stack.env.register_class(self.resource_type, + self.template_name) return t_data if reported_excp is None: reported_excp = ValueError(_('Unknown error retrieving %s') % diff --git a/heat/tests/test_environment.py b/heat/tests/test_environment.py index edd5b6d60..d4c4bf975 100644 --- a/heat/tests/test_environment.py +++ b/heat/tests/test_environment.py @@ -255,6 +255,27 @@ class EnvironmentDuplicateTest(common.HeatTestCase): env.get_resource_info('OS::Test::Dummy', 'my_fip')) + def test_env_register_while_get_resource_info(self): + env_test = {u'resource_registry': { + u'OS::Test::Dummy': self.resource_type}} + env = environment.Environment() + env.load(env_test) + env.get_resource_info('OS::Test::Dummy') + self.assertEqual({'OS::Test::Dummy': self.resource_type, + 'resources': {}}, + env.user_env_as_dict().get( + environment_format.RESOURCE_REGISTRY)) + + env_test = {u'resource_registry': { + u'resources': {u'test': {u'OS::Test::Dummy': self.resource_type}}}} + env.load(env_test) + env.get_resource_info('OS::Test::Dummy') + self.assertEqual({u'OS::Test::Dummy': self.resource_type, + 'resources': {u'test': {u'OS::Test::Dummy': + self.resource_type}}}, + env.user_env_as_dict().get( + environment_format.RESOURCE_REGISTRY)) + class GlobalEnvLoadingTest(common.HeatTestCase): |