If the passed name matches a uuid then lookup by uuid instead of name.
Change-Id: I2058616ce0191aab4d364b652f1b20d072f6b258
)
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
self.PATH: path,
}
+ @classmethod
+ def is_uuid(cls, uuid):
+ return HeatIdentifier.uuid_re.match(uuid)
+
@classmethod
def from_arn(cls, arn):
'''
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())
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
class stackCreateTest(unittest.TestCase):
def setUp(self):
self.m = mox.Mox()
+ config.register_engine_opts()
def tearDown(self):
self.m.UnsetStubs()
cls.stack_name = 'service_test_stack'
stack = get_wordpress_stack(cls.stack_name, ctx)
+
setup_mocks(m, stack)
m.ReplayAll()
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')
import json
from heat.engine import identifier
+from heat.common import utils
@attr(tag=['unit', 'identifier'])
'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__':