This means that all calls to stack_get_by_name need to provide a context.
Without this change, 2 tenants cannot create stacks with the same name.
Change-Id: I98c35a5d51c5c7d66e0b8a0fddc04f221d1d6ab7
def stack_get_by_name(context, stack_name, owner_id=None):
+ query = model_query(context, models.Stack).\
+ filter_by(tenant=context.tenant_id).\
+ filter_by(name=stack_name)
+
if owner_id:
- result = model_query(context, models.Stack).\
- filter_by(owner_id=owner_id).\
- filter_by(name=stack_name).first()
- else:
- result = model_query(context, models.Stack).\
- filter_by(name=stack_name).first()
- if (result is not None and context is not None and
- result.tenant != context.tenant_id):
- return None
- return result
+ query = query.filter_by(owner_id=owner_id)
+ return query.first()
def stack_get(context, stack_id):
"""
logger.info('template is %s' % template)
- if db_api.stack_get_by_name(None, stack_name):
+ if db_api.stack_get_by_name(context, stack_name):
raise AttributeError('Stack already exists with that name')
tmpl = parser.Template(template)
"""
Return the resource IDs of the given stack.
"""
- stack = db_api.stack_get_by_name(None, stack_name)
+ stack = db_api.stack_get_by_name(context, stack_name)
if stack:
return [res.name for res in stack.resources]
else:
Get the metadata for the given resource.
"""
- s = db_api.stack_get_by_name(None, stack_name)
+ s = db_api.stack_get_by_name(context, stack_name)
if not s:
logger.warn("Stack %s not found" % stack_name)
return ['stack', None]
new_state)
actioned = True
else:
- s = db_api.stack_get_by_name(None, self.stack_name)
+ s = db_api.stack_get_by_name(self.context, self.stack_name)
if s and s.status in (parser.Stack.CREATE_COMPLETE,
parser.Stack.UPDATE_COMPLETE):
user_creds = db_api.user_creds_get(s.user_creds_id)
self.assertRaises(AttributeError, self.man.create_stack,
self.ctx, self.stack_name, self.stack.t, {}, {})
+ def test_stack_by_name_tenants(self):
+ self.assertEqual(self.stack.id,
+ db_api.stack_get_by_name(self.ctx, self.stack_name).id)
+ ctx2 = create_context(self.m, self.username,
+ 'stack_service_test_tenant2')
+ self.assertEqual(None, db_api.stack_get_by_name(ctx2, self.stack_name))
+
def test_stack_event_list(self):
el = self.man.list_events(self.ctx, self.stack_identity)
self.ctx, nonexist)
def test_metadata(self):
- err, metadata = self.man.metadata_get_resource(None,
+ err, metadata = self.man.metadata_get_resource(self.ctx,
self.stack_name,
'WebServer')
self.assertEqual(err, None)
self.assertEqual(err, None)
self.assertEqual(result, test_metadata)
- err, metadata = self.man.metadata_get_resource(None,
+ err, metadata = self.man.metadata_get_resource(self.ctx,
self.stack_name,
'WebServer')
self.assertEqual(err, None)