From: Christopher Armstrong Date: Tue, 13 Aug 2013 23:40:12 +0000 (+0000) Subject: Store owner_id on Stack so updates maintain it X-Git-Tag: 2014.1~202^2 X-Git-Url: https://review.fuel-infra.org/gitweb?a=commitdiff_plain;h=4a4a0656f8ba7db8d41e781ce692ffef90a6fa99;p=openstack-build%2Fheat-build.git Store owner_id on Stack so updates maintain it Instead of passing owner to the store() method of parser.Stack, it is now maintained as an attribute of the Stack instance, and store() will use that saved attribute when saving. This fixes the problem of losing the owner_id on updates to a stack. Fixes bug 1212013 Change-Id: I1e3b7832291ca0f5cda24c1995ab782824e48943 --- diff --git a/heat/engine/parser.py b/heat/engine/parser.py index 5cebd4dc..56a60b6b 100644 --- a/heat/engine/parser.py +++ b/heat/engine/parser.py @@ -63,7 +63,7 @@ class Stack(object): def __init__(self, context, stack_name, tmpl, env=None, stack_id=None, action=None, status=None, status_reason='', timeout_mins=60, resolve_data=True, - disable_rollback=True, parent_resource=None): + disable_rollback=True, parent_resource=None, owner_id=None): ''' Initialise from a context, name, Template object and (optionally) Environment object. The database ID may also be initialised, if the @@ -77,6 +77,7 @@ class Stack(object): ) % stack_name) self.id = stack_id + self.owner_id = owner_id self.context = context self.clients = Clients(context) self.t = tmpl @@ -147,11 +148,11 @@ class Stack(object): stack = cls(context, stack.name, template, env, stack.id, stack.action, stack.status, stack.status_reason, stack.timeout, resolve_data, stack.disable_rollback, - parent_resource) + parent_resource, owner_id=stack.owner_id) return stack - def store(self, owner=None): + def store(self): ''' Store the stack in the database and return its ID If self.id is set, we update the existing stack @@ -162,7 +163,7 @@ class Stack(object): 'name': self.name, 'raw_template_id': self.t.store(self.context), 'parameters': self.env.user_env_as_dict(), - 'owner_id': owner and owner.id, + 'owner_id': self.owner_id, 'user_creds_id': new_creds.id, 'username': self.context.username, 'tenant': self.context.tenant_id, diff --git a/heat/engine/stack_resource.py b/heat/engine/stack_resource.py index 29c18c79..6ff3339b 100644 --- a/heat/engine/stack_resource.py +++ b/heat/engine/stack_resource.py @@ -74,10 +74,11 @@ class StackResource(resource.Resource): environment.Environment(user_params), timeout_mins=timeout_mins, disable_rollback=True, - parent_resource=self) + parent_resource=self, + owner_id=self.stack.id) nested.validate() self._nested = nested - nested_id = self._nested.store(self.stack) + nested_id = self._nested.store() self.resource_id_set(nested_id) stack_creator = scheduler.TaskRunner(self._nested.stack_task, diff --git a/heat/tests/test_parser.py b/heat/tests/test_parser.py index d5f94123..d28f29ca 100644 --- a/heat/tests/test_parser.py +++ b/heat/tests/test_parser.py @@ -598,7 +598,7 @@ class StackTest(HeatTestCase): parser.Stack.__init__(self.ctx, stack.name, t, env, stack.id, stack.action, stack.status, stack.status_reason, stack.timeout, True, stack.disable_rollback, - 'parent') + 'parent', owner_id=None) self.m.ReplayAll() parser.Stack.load(self.ctx, stack_id=self.stack.id, @@ -1598,3 +1598,33 @@ class StackTest(HeatTestCase): self.assertEqual(2, len(required_by)) for r in ['CResource', 'DResource']: self.assertIn(r, required_by) + + @utils.stack_delete_after + def test_store_saves_owner(self): + """ + The owner_id attribute of Store is saved to the database when stored. + """ + self.stack = parser.Stack( + self.ctx, 'owner_stack', template.Template({})) + stack_ownee = parser.Stack( + self.ctx, 'ownee_stack', template.Template({}), + owner_id=self.stack.id) + stack_ownee.store() + db_stack = db_api.stack_get(self.ctx, stack_ownee.id) + self.assertEqual(db_stack.owner_id, self.stack.id) + + @utils.stack_delete_after + def test_load_honors_owner(self): + """ + Loading a stack from the database will set the owner_id of the + resultant stack appropriately. + """ + self.stack = parser.Stack( + self.ctx, 'owner_stack', template.Template({})) + stack_ownee = parser.Stack( + self.ctx, 'ownee_stack', template.Template({}), + owner_id=self.stack.id) + stack_ownee.store() + + saved_stack = parser.Stack.load(self.ctx, stack_id=stack_ownee.id) + self.assertEqual(saved_stack.owner_id, self.stack.id) diff --git a/heat/tests/test_stack_resource.py b/heat/tests/test_stack_resource.py index 7eb7e759..83465263 100644 --- a/heat/tests/test_stack_resource.py +++ b/heat/tests/test_stack_resource.py @@ -162,6 +162,11 @@ class StackResourceTest(HeatTestCase): self.assertEqual(set(self.stack.resources.keys()), set(["WebServer", "WebServer2"])) + # The stack's owner_id is maintained. + saved_stack = parser.Stack.load( + self.parent_stack.context, self.stack.id) + self.assertEqual(saved_stack.owner_id, self.parent_stack.id) + @utils.stack_delete_after def test_load_nested_ok(self): self.parent_resource.create_with_template(self.templ, @@ -255,7 +260,8 @@ class StackResourceTest(HeatTestCase): self.m.StubOutWithMock(parser, 'Stack') parser.Stack(ctx, phy_id, templ, env, timeout_mins=None, disable_rollback=True, - parent_resource=self.parent_resource)\ + parent_resource=self.parent_resource, + owner_id=self.parent_stack.id)\ .AndReturn(self.stack) st_set = self.stack.state_set