summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Razumovsky <prazumovsky@mirantis.com>2015-03-30 14:48:32 +0300
committerPeter Razumovsky <prazumovsky@mirantis.com>2015-06-03 14:02:44 +0000
commit6a117f3930049d37b03770e2cb1c94a9795a08e0 (patch)
treed05972ffab331eae90a7930f26303e21a65ab9d4
parent40bfa60d84aa38fef5a7c8d278641bfeefad4bb7 (diff)
downloadheat-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.py9
-rw-r--r--heat/engine/resources/template_resource.py3
-rw-r--r--heat/tests/test_environment.py21
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):