From f915b1b33fedc225b7758e291b421d47c8cd555e Mon Sep 17 00:00:00 2001 From: Angus Salkeld Date: Mon, 21 Oct 2013 07:24:02 -1000 Subject: [PATCH] Add support to disable resources To remove a resource, you add the following to the global environment: resource_registry: 'AWS::*': implements blueprint exclude-resources-option Change-Id: Ia7c6c78ad3c1850ea20dd942d8d52957b5ad2b11 --- heat/engine/environment.py | 24 +++++++++++++++- heat/tests/test_environment.py | 52 ++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) diff --git a/heat/engine/environment.py b/heat/engine/environment.py index 6dd73f08f3..a441563e84 100644 --- a/heat/engine/environment.py +++ b/heat/engine/environment.py @@ -54,6 +54,8 @@ class ResourceInfo(object): self.user_resource = True def __eq__(self, other): + if other is None: + return False return (self.path == other.path and self.value == other.value and self.user_resource == other.user_resource) @@ -154,7 +156,9 @@ class ResourceRegistry(object): def _load_registry(self, path, registry): for k, v in iter(registry.items()): - if isinstance(v, dict): + if v is None: + self._register_info(path + [k], None) + elif isinstance(v, dict): self._load_registry(path + [k], v) else: self._register_info(path + [k], @@ -173,6 +177,24 @@ class ResourceRegistry(object): registry[key] = {} registry = registry[key] + if info is None: + if name.endswith('*'): + # delete all matching entries. + for res_name in registry.keys(): + if isinstance(registry[res_name], ResourceInfo) and \ + res_name.startswith(name[:-1]): + LOG.warn(_('Removing %(item)s from %(path)s') % { + 'item': res_name, + 'path': descriptive_path}) + del registry[res_name] + else: + # delete this entry. + LOG.warn(_('Removing %(item)s from %(path)s') % { + 'item': name, + 'path': descriptive_path}) + del registry[name] + return + if name in registry and isinstance(registry[name], ResourceInfo): details = { 'path': descriptive_path, diff --git a/heat/tests/test_environment.py b/heat/tests/test_environment.py index 152636efea..c768733eb2 100644 --- a/heat/tests/test_environment.py +++ b/heat/tests/test_environment.py @@ -200,3 +200,55 @@ class GlobalEnvLoadingTest(common.HeatTestCase): # 3. assert our resource is in place. self.assertEqual('file:///not_really_here.yaml', g_env.get_resource_info('OS::Nova::Server').value) + + def test_env_one_resource_disable(self): + # prove we can disable a resource in the global environment + + g_env_content = ''' + resource_registry: + "OS::Nova::Server": + ''' + # 1. fake an environment file + envdir = self.useFixture(fixtures.TempDir()) + envfile = os.path.join(envdir.path, 'test.yaml') + with open(envfile, 'w+') as ef: + ef.write(g_env_content) + cfg.CONF.set_override('environment_dir', envdir.path) + + # 2. load global env + g_env = environment.Environment({}, user_env=False) + resources._load_all(g_env) + + # 3. assert our resource is in now gone. + self.assertEqual(None, + g_env.get_resource_info('OS::Nova::Server')) + + # 4. make sure we haven't removed something we shouldn't have + self.assertEqual(resources.instance.Instance, + g_env.get_resource_info('AWS::EC2::Instance').value) + + def test_env_multi_resources_disable(self): + # prove we can disable resources in the global environment + + g_env_content = ''' + resource_registry: + "AWS::*": + ''' + # 1. fake an environment file + envdir = self.useFixture(fixtures.TempDir()) + envfile = os.path.join(envdir.path, 'test.yaml') + with open(envfile, 'w+') as ef: + ef.write(g_env_content) + cfg.CONF.set_override('environment_dir', envdir.path) + + # 2. load global env + g_env = environment.Environment({}, user_env=False) + resources._load_all(g_env) + + # 3. assert our resources are now gone. + self.assertEqual(None, + g_env.get_resource_info('AWS::EC2::Instance')) + + # 4. make sure we haven't removed something we shouldn't have + self.assertEqual(resources.server.Server, + g_env.get_resource_info('OS::Nova::Server').value)