]> review.fuel-infra Code Review - openstack-build/heat-build.git/commitdiff
Modify identify_stack to check for uuid.
authorSteve Baker <sbaker@redhat.com>
Tue, 13 Nov 2012 01:30:15 +0000 (14:30 +1300)
committerSteve Baker <sbaker@redhat.com>
Tue, 13 Nov 2012 01:31:53 +0000 (14:31 +1300)
If the passed name matches a uuid then lookup by uuid instead of name.

Change-Id: I2058616ce0191aab4d364b652f1b20d072f6b258

heat/engine/identifier.py
heat/engine/service.py
heat/tests/test_engine_service.py
heat/tests/test_identifier.py

index 7358cbc5980899e857f0b3b6f94ffb20d5be8c44..9fbc25b091826eeb1a632508f306d813d83c863d 100644 (file)
@@ -26,6 +26,12 @@ class HeatIdentifier(collections.Mapping):
     )
     path_re = re.compile(r'stacks/([^/]+)/([^/]+)(.*)')
 
+    HEX_ELEM = '[0-9A-Fa-f]'
+    UUID_PATTERN = '-'.join([HEX_ELEM + '{8}', HEX_ELEM + '{4}',
+                         HEX_ELEM + '{4}', HEX_ELEM + '{4}',
+                         HEX_ELEM + '{12}'])
+    uuid_re = re.compile(r'^' + UUID_PATTERN + '$')
+
     def __init__(self, tenant, stack_name, stack_id, path=''):
         '''
         Initialise a HeatIdentifier from a Tenant ID, Stack name, Stack ID
@@ -42,6 +48,10 @@ class HeatIdentifier(collections.Mapping):
             self.PATH: path,
         }
 
+    @classmethod
+    def is_uuid(cls, uuid):
+        return HeatIdentifier.uuid_re.match(uuid)
+
     @classmethod
     def from_arn(cls, arn):
         '''
index d5abfec5544e8018c25c2daf762d4cd36bb7483d..3ae98f112c50240bf56609cefdaee2cac1d35afd 100644 (file)
@@ -65,9 +65,12 @@ class EngineService(service.Service):
         The identify_stack method returns the full stack identifier for a
         single, live stack given the stack name.
         arg1 -> RPC context.
-        arg2 -> Name of the stack to look up.
+        arg2 -> Name or UUID of the stack to look up.
         """
-        s = db_api.stack_get_by_name(context, stack_name)
+        if identifier.HeatIdentifier.is_uuid(stack_name):
+            s = db_api.stack_get(context, stack_name)
+        else:
+            s = db_api.stack_get_by_name(context, stack_name)
         if s:
             stack = parser.Stack.load(context, stack=s)
             return dict(stack.identifier())
index 6647e284f8a88046b09c428d3b36604adf5e4abb..b250920d6b4c638d3d39401cc19f244172b228ae 100644 (file)
@@ -22,6 +22,7 @@ import mox
 import json
 from nose.plugins.attrib import attr
 
+from heat.common import config
 from heat.common import context
 from heat.tests.v1_1 import fakes
 import heat.engine.api as engine_api
@@ -94,6 +95,7 @@ class DummyThreadGroup(object):
 class stackCreateTest(unittest.TestCase):
     def setUp(self):
         self.m = mox.Mox()
+        config.register_engine_opts()
 
     def tearDown(self):
         self.m.UnsetStubs()
@@ -341,6 +343,7 @@ class stackServiceTest(unittest.TestCase):
         cls.stack_name = 'service_test_stack'
 
         stack = get_wordpress_stack(cls.stack_name, ctx)
+
         setup_mocks(m, stack)
         m.ReplayAll()
 
@@ -378,6 +381,10 @@ class stackServiceTest(unittest.TestCase):
         identity = self.man.identify_stack(self.ctx, self.stack_name)
         self.assertEqual(identity, self.stack_identity)
 
+    def test_stack_identify_uuid(self):
+        identity = self.man.identify_stack(self.ctx, self.stack.id)
+        self.assertEqual(identity, self.stack_identity)
+
     def test_stack_identify_nonexist(self):
         self.assertRaises(AttributeError, self.man.identify_stack,
                           self.ctx, 'wibble')
index aadf27ffb778fed4df4b93ff23a25575ca22f479..4fcc73df0c68a8b18bca62a34d0ffa6945747062 100644 (file)
@@ -20,6 +20,7 @@ import mox
 import json
 
 from heat.engine import identifier
+from heat.common import utils
 
 
 @attr(tag=['unit', 'identifier'])
@@ -221,6 +222,17 @@ class IdentifierTest(unittest.TestCase):
                           'stack_name': 's',
                           'stack_id': 'i'} == hi1)
 
+    def test_uuid_match(self):
+        uuid = utils.generate_uuid()
+        self.assertTrue(identifier.HeatIdentifier.is_uuid(uuid))
+        self.assertFalse(identifier.HeatIdentifier.is_uuid('a' + uuid))
+        self.assertFalse(identifier.HeatIdentifier.is_uuid(
+            'zzzzzzzz-zzzz-zzzz-zzzzzzzzzzzz'))
+        self.assertFalse(identifier.HeatIdentifier.is_uuid(uuid + 'a'))
+        for i in xrange(100):
+            self.assertTrue(identifier.HeatIdentifier.is_uuid(
+                utils.generate_uuid()))
+
 
 # allows testing of the test directly, shown below
 if __name__ == '__main__':