]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
heat engine : Add parser parameter support for AWS::StackId
authorSteven Hardy <shardy@redhat.com>
Mon, 25 Feb 2013 14:47:45 +0000 (14:47 +0000)
committerSteven Hardy <shardy@redhat.com>
Wed, 27 Feb 2013 16:10:36 +0000 (16:10 +0000)
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
heat/tests/test_parameters.py

index 3b6d56b77bd9c054e02b86450b5301cfb2800d30..bc1bf281d4da35e5d5becd5814f2b3ee42873339 100644 (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
index 80c4aad10868839c0dc5e28b55b13ad810393d5b..dc530e7979cf4767966fd9fb22f118980bc13cf9 100644 (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)