]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
heat engine : Set stack parameters AWS::StackId on stack create/store
authorSteven Hardy <shardy@redhat.com>
Mon, 25 Feb 2013 16:34:13 +0000 (16:34 +0000)
committerSteven Hardy <shardy@redhat.com>
Wed, 27 Feb 2013 16:17:30 +0000 (16:17 +0000)
We need to set the ARN provided via the AWS::StackId pseudo parameter
when the stack is stored, and also whenever a parser.Stack object is
created

ref bug 1131666

Change-Id: Ic8dc5ab2b25c85c51f2f685fe69bb2447a1e3615

heat/engine/parser.py
heat/tests/test_parser.py

index e1df1a92ecf6c787c797e2d9cc9411ee38832fe0..da0157d2cb12040823ffa420dbacbf84e0620179 100644 (file)
@@ -84,6 +84,8 @@ class Stack(object):
             parameters = Parameters(self.name, self.t)
         self.parameters = parameters
 
+        self._set_param_stackid()
+
         if resolve_data:
             self.outputs = self.resolve_static_data(self.t[template.OUTPUTS])
         else:
@@ -96,6 +98,20 @@ class Stack(object):
 
         self.dependencies = self._get_dependencies(self.resources.itervalues())
 
+    def _set_param_stackid(self):
+        '''
+        Update self.parameters with the current ARN which is then provided
+        via the Parameters class as the AWS::StackId pseudo parameter
+        '''
+        # This can fail if constructor called without a valid context,
+        # as it is in many tests
+        try:
+            stack_arn = self.identifier().arn()
+        except (AttributeError, ValueError, TypeError):
+            logger.warning("Unable to set parameters StackId identifier")
+        else:
+            self.parameters.set_stack_id(stack_arn)
+
     @staticmethod
     def _get_dependencies(resources):
         '''Return the dependency graph for a list of resources'''
@@ -148,6 +164,8 @@ class Stack(object):
             new_s = db_api.stack_create(self.context, s)
             self.id = new_s.id
 
+        self._set_param_stackid()
+
         return self.id
 
     def identifier(self):
index 6162d881fc78d313f0afc5ec8c4196835f4377b7..e5ff141bb2eac5a99956594be85e5c057e33013c 100644 (file)
@@ -16,6 +16,7 @@
 import unittest
 from nose.plugins.attrib import attr
 import mox
+import uuid
 
 from heat.common import context
 from heat.common import exception
@@ -299,6 +300,7 @@ class StackTest(unittest.TestCase):
         self.ctx = context.get_admin_context()
         self.m.StubOutWithMock(self.ctx, 'username')
         self.ctx.username = self.username
+        self.ctx.tenant_id = 'test_tenant'
 
         self.m.ReplayAll()
 
@@ -336,11 +338,42 @@ class StackTest(unittest.TestCase):
                                   parser.Template({}))
         self.stack.store()
         identifier = self.stack.identifier()
-        self.assertEqual(identifier.tenant, self.ctx.tenant)
+        self.assertEqual(identifier.tenant, self.ctx.tenant_id)
         self.assertEqual(identifier.stack_name, 'identifier_test')
         self.assertTrue(identifier.stack_id)
         self.assertFalse(identifier.path)
 
+    @stack_delete_after
+    def test_set_param_id(self):
+        dummy_stackid = 'STACKABCD1234'
+        self.m.StubOutWithMock(uuid, 'uuid4')
+        uuid.uuid4().AndReturn(dummy_stackid)
+        self.m.ReplayAll()
+        self.stack = parser.Stack(self.ctx, 'param_arn_test',
+                                  parser.Template({}))
+        exp_prefix = 'arn:openstack:heat::test_tenant:stacks/param_arn_test/'
+        self.assertEqual(self.stack.parameters['AWS::StackId'],
+                         exp_prefix + 'None')
+        self.stack.store()
+        identifier = self.stack.identifier()
+        self.assertEqual(self.stack.parameters['AWS::StackId'],
+                         exp_prefix + dummy_stackid)
+        self.assertEqual(self.stack.parameters['AWS::StackId'],
+                         identifier.arn())
+        self.m.VerifyAll()
+
+    @stack_delete_after
+    def test_load_param_id(self):
+        self.stack = parser.Stack(self.ctx, 'param_load_arn_test',
+                                  parser.Template({}))
+        self.stack.store()
+        identifier = self.stack.identifier()
+        self.assertEqual(self.stack.parameters['AWS::StackId'],
+                         identifier.arn())
+
+        newstack = parser.Stack.load(self.ctx, stack_id=self.stack.id)
+        self.assertEqual(newstack.parameters['AWS::StackId'], identifier.arn())
+
     @stack_delete_after
     def test_created_time(self):
         self.stack = parser.Stack(self.ctx, 'creation_time_test',