From: Steven Hardy Date: Mon, 25 Feb 2013 16:34:13 +0000 (+0000) Subject: heat engine : Set stack parameters AWS::StackId on stack create/store X-Git-Tag: 2014.1~847^2 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=79bc8170a0d854b2d688af2da82f0ff3e106e562;p=openstack-build%2Fheat-build.git heat engine : Set stack parameters AWS::StackId on stack create/store 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 --- diff --git a/heat/engine/parser.py b/heat/engine/parser.py index e1df1a92..da0157d2 100644 --- a/heat/engine/parser.py +++ b/heat/engine/parser.py @@ -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): diff --git a/heat/tests/test_parser.py b/heat/tests/test_parser.py index 6162d881..e5ff141b 100644 --- a/heat/tests/test_parser.py +++ b/heat/tests/test_parser.py @@ -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',