]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Store owner_id on Stack so updates maintain it
authorChristopher Armstrong <chris.armstrong@rackspace.com>
Tue, 13 Aug 2013 23:40:12 +0000 (23:40 +0000)
committerChristopher Armstrong <chris.armstrong@rackspace.com>
Wed, 14 Aug 2013 14:09:16 +0000 (14:09 +0000)
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

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

index 5cebd4dce9db97557f5e56c096005fdff348489f..56a60b6b0eccb33d28a4688939ad064dfc656231 100644 (file)
@@ -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,
index 29c18c798953e5e5c9c57cb4a62ce6e696a05cce..6ff3339baa15253f7a03b1b28577ce355239b5db 100644 (file)
@@ -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,
index d5f94123c67b3f8025ef6cf0c8611306695fb337..d28f29caa0ba8c84c0be763c256e9043ddae6cf3 100644 (file)
@@ -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)
index 7eb7e7593da84bc6f0a35eb50b4a33374c16eedc..834652636a1af1b2e071811e89b51c405da6e492 100644 (file)
@@ -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