From 6ea813be339f8218cef6ceaa61bbe3a698783e09 Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Fri, 19 Oct 2012 16:15:13 +0200 Subject: [PATCH] Identify stacks using tenant UUIDs Tenant names may come and go, but UUIDs are universally unique. Therefore, ownership of the stack should be keyed on the tenant_id, not the tenant name. Change-Id: I7ec410aeaeceb6319299935b5f34d7c4e9c63d67 Signed-off-by: Zane Bitter --- heat/api/openstack/v1/stacks.py | 4 ++-- heat/db/sqlalchemy/api.py | 10 +++++----- heat/engine/manager.py | 2 +- heat/engine/parser.py | 4 ++-- heat/tests/test_api_cfn_v1.py | 2 ++ heat/tests/test_api_openstack_v1.py | 2 ++ heat/tests/test_engine_manager.py | 4 ++-- 7 files changed, 16 insertions(+), 12 deletions(-) diff --git a/heat/api/openstack/v1/stacks.py b/heat/api/openstack/v1/stacks.py index fe493394..3e29dbd8 100644 --- a/heat/api/openstack/v1/stacks.py +++ b/heat/api/openstack/v1/stacks.py @@ -142,7 +142,7 @@ class InstantiationData(object): def tenant_local(handler): @wraps(handler) def handle_stack_method(controller, req, tenant_id, **kwargs): - req.context.tenant = tenant_id + req.context.tenant_id = tenant_id return handler(controller, req, **kwargs) return handle_stack_method @@ -152,7 +152,7 @@ def identified_stack(handler): @tenant_local @wraps(handler) def handle_stack_method(controller, req, stack_name, stack_id, **kwargs): - stack_identity = identifier.HeatIdentifier(req.context.tenant, + stack_identity = identifier.HeatIdentifier(req.context.tenant_id, stack_name, stack_id) return handler(controller, req, dict(stack_identity), **kwargs) diff --git a/heat/db/sqlalchemy/api.py b/heat/db/sqlalchemy/api.py index ee6a9356..2e654673 100644 --- a/heat/db/sqlalchemy/api.py +++ b/heat/db/sqlalchemy/api.py @@ -80,7 +80,7 @@ def resource_get_by_physical_resource_id(context, physical_resource_id): .filter_by(nova_instance=physical_resource_id) .first()) if (result is not None and context is not None and - result.stack.tenant != context.tenant): + result.stack.tenant != context.tenant_id): return None return result @@ -120,7 +120,7 @@ def stack_get_by_name(context, stack_name, owner_id=None): 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): + result.tenant != context.tenant_id): return None return result @@ -129,7 +129,7 @@ def stack_get(context, stack_id): result = model_query(context, models.Stack).get(stack_id) if (result is not None and context is not None and - result.tenant != context.tenant): + result.tenant != context.tenant_id): return None return result @@ -144,7 +144,7 @@ def stack_get_all(context): def stack_get_by_tenant(context): results = model_query(context, models.Stack).\ filter_by(owner_id=None).\ - filter_by(tenant=context.tenant).all() + filter_by(tenant=context.tenant_id).all() return results @@ -235,7 +235,7 @@ def event_get_all(context): def event_get_all_by_tenant(context): stacks = model_query(context, models.Stack).\ - filter_by(tenant=context.tenant).all() + filter_by(tenant=context.tenant_id).all() results = [] for stack in stacks: results.extend(model_query(context, models.Event). diff --git a/heat/engine/manager.py b/heat/engine/manager.py index c525606c..4145813c 100644 --- a/heat/engine/manager.py +++ b/heat/engine/manager.py @@ -78,7 +78,7 @@ class EngineManager(manager.Manager): def _get_stack(self, context, stack_identity): identity = identifier.HeatIdentifier(**stack_identity) - if identity.tenant != context.tenant: + if identity.tenant != context.tenant_id: raise AttributeError('Invalid tenant') s = db_api.stack_get(context, identity.stack_id) diff --git a/heat/engine/parser.py b/heat/engine/parser.py index e6192230..9f804cd0 100644 --- a/heat/engine/parser.py +++ b/heat/engine/parser.py @@ -309,7 +309,7 @@ class Stack(object): 'owner_id': owner and owner.id, 'user_creds_id': new_creds.id, 'username': self.context.username, - 'tenant': self.context.tenant, + 'tenant': self.context.tenant_id, 'status': self.state, 'status_reason': self.state_description, 'timeout': self.timeout_mins, @@ -326,7 +326,7 @@ class Stack(object): ''' Return an identifier for this stack. ''' - return identifier.HeatIdentifier(self.context.tenant, + return identifier.HeatIdentifier(self.context.tenant_id, self.name, self.id) def __iter__(self): diff --git a/heat/tests/test_api_cfn_v1.py b/heat/tests/test_api_cfn_v1.py index 263e5c78..0e25b45c 100644 --- a/heat/tests/test_api_cfn_v1.py +++ b/heat/tests/test_api_cfn_v1.py @@ -49,6 +49,8 @@ class StackControllerTest(unittest.TestCase): ctx = context.get_admin_context() self.m.StubOutWithMock(ctx, 'username') ctx.username = user + self.m.StubOutWithMock(ctx, 'tenant_id') + ctx.tenant_id = 't' self.m.StubOutWithMock(auth, 'authenticate') return ctx diff --git a/heat/tests/test_api_openstack_v1.py b/heat/tests/test_api_openstack_v1.py index 23115185..b5a52075 100644 --- a/heat/tests/test_api_openstack_v1.py +++ b/heat/tests/test_api_openstack_v1.py @@ -161,6 +161,8 @@ class StackControllerTest(unittest.TestCase): ctx = context.get_admin_context() self.m.StubOutWithMock(ctx, 'username') ctx.username = user + self.m.StubOutWithMock(ctx, 'tenant_id') + ctx.tenant_id = self.tenant self.m.StubOutWithMock(auth, 'authenticate') return ctx diff --git a/heat/tests/test_engine_manager.py b/heat/tests/test_engine_manager.py index 60a73869..f6dde6a4 100644 --- a/heat/tests/test_engine_manager.py +++ b/heat/tests/test_engine_manager.py @@ -45,9 +45,9 @@ def create_context(mocks, user='stacks_test_user', tenant='test_admin', ctx=None): ctx = ctx or context.get_admin_context() mocks.StubOutWithMock(ctx, 'username') - mocks.StubOutWithMock(ctx, 'tenant') + mocks.StubOutWithMock(ctx, 'tenant_id') ctx.username = user - ctx.tenant = tenant + ctx.tenant_id = tenant return ctx -- 2.45.2