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
This commit is contained in:
Angus Salkeld 2013-10-21 07:24:02 -10:00
parent 999066cb8e
commit f915b1b33f
2 changed files with 75 additions and 1 deletions

View File

@ -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,

View File

@ -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)