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
This commit is contained in:
Steven Hardy 2013-02-25 14:47:45 +00:00
parent d6f8dfed16
commit 8a4a1960f1
2 changed files with 26 additions and 3 deletions

View File

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

View File

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