From bc2c6dbcfe097b45f53b162f6433e6fdd2ca9fa7 Mon Sep 17 00:00:00 2001 From: Steve Baker Date: Wed, 14 Nov 2012 16:23:12 +1300 Subject: [PATCH] Always filter by tenant_id in stack_get_by_name. 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 --- heat/db/sqlalchemy/api.py | 16 ++++++---------- heat/engine/service.py | 6 +++--- heat/engine/watchrule.py | 2 +- heat/tests/test_engine_service.py | 11 +++++++++-- 4 files changed, 19 insertions(+), 16 deletions(-) diff --git a/heat/db/sqlalchemy/api.py b/heat/db/sqlalchemy/api.py index 2e654673..3f733659 100644 --- a/heat/db/sqlalchemy/api.py +++ b/heat/db/sqlalchemy/api.py @@ -112,17 +112,13 @@ def resource_get_all_by_stack(context, stack_id): 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): diff --git a/heat/engine/service.py b/heat/engine/service.py index 3ae98f11..44541c5b 100644 --- a/heat/engine/service.py +++ b/heat/engine/service.py @@ -137,7 +137,7 @@ class EngineService(service.Service): """ 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) @@ -371,7 +371,7 @@ class EngineService(service.Service): """ 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: @@ -382,7 +382,7 @@ class EngineService(service.Service): 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] diff --git a/heat/engine/watchrule.py b/heat/engine/watchrule.py index 3091cf87..3a5854ad 100644 --- a/heat/engine/watchrule.py +++ b/heat/engine/watchrule.py @@ -228,7 +228,7 @@ class WatchRule(object): 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) diff --git a/heat/tests/test_engine_service.py b/heat/tests/test_engine_service.py index b250920d..7b2ae5ab 100644 --- a/heat/tests/test_engine_service.py +++ b/heat/tests/test_engine_service.py @@ -393,6 +393,13 @@ class stackServiceTest(unittest.TestCase): 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) @@ -577,7 +584,7 @@ class stackServiceTest(unittest.TestCase): 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) @@ -590,7 +597,7 @@ class stackServiceTest(unittest.TestCase): 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) -- 2.45.2