Fix version replacement when path

When an API server is on an unversioned path (for example, keystone
is on http://localhost/identity), verify-config would fail with a
404 Not Found because the version wasn't put on the URL as required
(for example, the v2.0 keystone url should have been
http://localhost/identity/v2.0 but was instead
http://localhost/identity). This is because the version replacement
code wasn't adding the version when it wasn't present and a path
was there.

Change-Id: I559bd967a87b646906f37df81a7db096148488db
This commit is contained in:
Brant Knudson 2016-04-11 15:14:54 -05:00
parent f2d1f57e00
commit 7729380f83
2 changed files with 10 additions and 11 deletions

View File

@ -34,13 +34,15 @@ LOG = logging.getLogger(__name__)
def replace_version(url, new_version):
parts = urlparse.urlparse(url)
version_path = '/%s' % new_version
path = re.sub(r'(^|/)+v\d+(?:\.\d+)?',
version_path,
parts.path,
count=1)
path, subs = re.subn(r'(^|/)+v\d+(?:\.\d+)?',
version_path,
parts.path,
count=1)
if not subs:
path = '%s%s' % (parts.path.rstrip('/'), version_path)
url = urlparse.urlunparse((parts.scheme,
parts.netloc,
path or version_path,
path,
parts.params,
parts.query,
parts.fragment))

View File

@ -599,21 +599,18 @@ class TestReplaceVersion(base.TestCase):
auth.replace_version('http://localhost:35357', 'v2.0'))
def test_no_version_base_solidus(self):
# TODO(blk-u): This doesn't look like it works as expected.
self.assertEqual(
'http://localhost:35357/',
'http://localhost:35357/v2.0',
auth.replace_version('http://localhost:35357/', 'v2.0'))
def test_no_version_path(self):
# TODO(blk-u): This doesn't look like it works as expected.
self.assertEqual(
'http://localhost/identity',
'http://localhost/identity/v2.0',
auth.replace_version('http://localhost/identity', 'v2.0'))
def test_no_version_path_solidus(self):
# TODO(blk-u): This doesn't look like it works as expected.
self.assertEqual(
'http://localhost/identity/',
'http://localhost/identity/v2.0',
auth.replace_version('http://localhost/identity/', 'v2.0'))
def test_path_version(self):