]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Always filter by tenant_id in stack_get_by_name.
authorSteve Baker <sbaker@redhat.com>
Wed, 14 Nov 2012 03:23:12 +0000 (16:23 +1300)
committerSteve Baker <sbaker@redhat.com>
Wed, 14 Nov 2012 03:23:12 +0000 (16:23 +1300)
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
heat/engine/service.py
heat/engine/watchrule.py
heat/tests/test_engine_service.py

index 2e654673173d88358f0a35b9f8491b5586a4f260..3f7336597f4609ab13735791f60c0b8f93097fcf 100644 (file)
@@ -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):
index 3ae98f112c50240bf56609cefdaee2cac1d35afd..44541c5bdf7c82c3b6ad4c91363c66732598d1f0 100644 (file)
@@ -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]
index 3091cf87f233df53308414bf29dfc8d19bd1fea3..3a5854ad39f5e7e8576d2a6b851b4ef9e84ffd65 100644 (file)
@@ -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)
index b250920d6b4c638d3d39401cc19f244172b228ae..7b2ae5ab991af2260363591c6965d264bb7076cd 100644 (file)
@@ -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)