diff --git a/heat/api/openstack/v1/__init__.py b/heat/api/openstack/v1/__init__.py index b819ecce33..c4792ae5c0 100644 --- a/heat/api/openstack/v1/__init__.py +++ b/heat/api/openstack/v1/__init__.py @@ -66,6 +66,11 @@ class API(wsgi.Router): stack_mapper.connect("stack_lookup", "/stacks/{stack_name}", action="lookup") + # \x3A matches on a colon. + # Routes treats : specially in its regexp + stack_mapper.connect("stack_lookup", + r"/stacks/{stack_name:arn\x3A.*}", + action="lookup") subpaths = ['resources', 'events'] path = "{path:%s}" % '|'.join(subpaths) stack_mapper.connect("stack_lookup_subpath", diff --git a/heat/tests/test_api_openstack_v1.py b/heat/tests/test_api_openstack_v1.py index fb313d258d..dc28d0baca 100644 --- a/heat/tests/test_api_openstack_v1.py +++ b/heat/tests/test_api_openstack_v1.py @@ -1678,6 +1678,20 @@ class RoutesTest(unittest.TestCase): 'tenant_id': 'aaaa', 'stack_name': 'teststack' }) + self.assertRoute( + self.m, + '/aaaa/stacks/arn:openstack:heat::6548ab64fbda49deb188851a3b7d8c8b' + ':stacks/stack-1411-06/1c5d9bb2-3464-45e2-a728-26dfa4e1d34a', + 'GET', + 'lookup', + 'StackController', + { + 'tenant_id': 'aaaa', + 'stack_name': 'arn:openstack:heat:' + ':6548ab64fbda49deb188851a3b7d8c8b:stacks/stack-1411-06/' + '1c5d9bb2-3464-45e2-a728-26dfa4e1d34a' + }) + self.assertRoute( self.m, '/aaaa/stacks/teststack/resources',