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
) % stack_name)
self.id = stack_id
+ self.owner_id = owner_id
self.context = context
self.clients = Clients(context)
self.t = tmpl
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
'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,
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,
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,
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)
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,
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