From 8a4a1960f152431bd0ae822b249da156dc9d3bf1 Mon Sep 17 00:00:00 2001 From: Steven Hardy Date: Mon, 25 Feb 2013 14:47:45 +0000 Subject: [PATCH] heat engine : Add parser parameter support for AWS::StackId Adds support for the AWS::StackId pseudo parameter, which will allow us to to reference the stack ARN in the template, e.g so that stacks can query their resource metadata via ARN not stack name, which will solve the problem with nested resource being unable to query their metadata. ref bug 1131666 Change-Id: Ib7b1d380fa8766b6d0c968bd66270da8ce8245c4 --- heat/engine/parameters.py | 19 ++++++++++++++++--- heat/tests/test_parameters.py | 10 ++++++++++ 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/heat/engine/parameters.py b/heat/engine/parameters.py index 3b6d56b7..bc1bf281 100644 --- a/heat/engine/parameters.py +++ b/heat/engine/parameters.py @@ -32,7 +32,11 @@ PARAMETER_TYPES = ( ) = ( 'String', 'Number', 'CommaDelimitedList' ) -(PARAM_STACK_NAME, PARAM_REGION) = ('AWS::StackName', 'AWS::Region') +PSEUDO_PARAMETERS = ( + PARAM_STACK_ID, PARAM_STACK_NAME, PARAM_REGION +) = ( + 'AWS::StackId', 'AWS::StackName', 'AWS::Region' +) class Parameter(object): @@ -214,13 +218,16 @@ class Parameters(collections.Mapping): The parameters of a stack, with type checking, defaults &c. specified by the stack's template. ''' - - def __init__(self, stack_name, tmpl, user_params={}): + def __init__(self, stack_name, tmpl, user_params={}, stack_id=None): ''' Create the parameter container for a stack from the stack name and template, optionally setting the user-supplied parameter values. ''' def parameters(): + yield Parameter(PARAM_STACK_ID, + {TYPE: STRING, + DESCRIPTION: 'Stack ID', + DEFAULT: str(stack_id)}) if stack_name is not None: yield Parameter(PARAM_STACK_NAME, {TYPE: STRING, @@ -271,3 +278,9 @@ class Parameters(collections.Mapping): ''' return self.map(lambda p: p.user_value, lambda p: p.user_value is not None) + + def set_stack_id(self, stack_id): + ''' + Set the AWS::StackId pseudo parameter value + ''' + self.params[PARAM_STACK_ID].schema[DEFAULT] = stack_id diff --git a/heat/tests/test_parameters.py b/heat/tests/test_parameters.py index 80c4aad1..dc530e79 100644 --- a/heat/tests/test_parameters.py +++ b/heat/tests/test_parameters.py @@ -278,8 +278,17 @@ class ParametersTest(unittest.TestCase): params = parameters.Parameters('test_stack', {"Parameters": {}}) self.assertEqual(params['AWS::StackName'], 'test_stack') + self.assertEqual(params['AWS::StackId'], 'None') self.assertTrue('AWS::Region' in params) + def test_pseudo_param_stackid(self): + params = parameters.Parameters('test_stack', {'Parameters': {}}, + stack_id='123::foo') + + self.assertEqual(params['AWS::StackId'], '123::foo') + params.set_stack_id('456::bar') + self.assertEqual(params['AWS::StackId'], '456::bar') + def test_user_param(self): user_params = {'User': 'wibble'} params = parameters.Parameters('test', params_schema, user_params) @@ -316,6 +325,7 @@ class ParametersTest(unittest.TestCase): expected = {'Foo': False, 'Bar': True, 'AWS::Region': True, + 'AWS::StackId': True, 'AWS::StackName': True} self.assertEqual(params.map(lambda p: p.has_default()), expected) -- 2.45.2