Fix version discovery check of url for integer project id

Check if the last url segment matches the project id.
Previously the check only confirmed whether the last url segment
endswith the project id which could cause problems with spurious
matches of some legacy integer project ids.

Closes-Bug: 1968793
Change-Id: I7c6c22e41bde2a73508635b7e964c58a02c12146
changes/35/837635/1
Dylan McCulloch 2022-04-13 09:32:44 +10:00
parent 2403661941
commit 8e27ff5d13
2 changed files with 14 additions and 1 deletions

View File

@ -1263,7 +1263,7 @@ class EndpointData(object):
# First, check to see if the catalog url ends with a project id
# We need to remove it and save it for later if it does
if project_id and url_parts[-1].endswith(project_id):
if project_id and (url_parts[-1] == project_id):
self._saved_project_id = url_parts.pop()
elif not project_id:
# Peek to see if -2 is a version. If so, -1 is a project_id,

View File

@ -1296,6 +1296,10 @@ class VersionDataTests(utils.TestCase):
class EndpointDataTests(utils.TestCase):
def setUp(self):
super(EndpointDataTests, self).setUp()
self.session = session.Session()
@mock.patch('keystoneauth1.discover.get_discovery')
@mock.patch('keystoneauth1.discover.EndpointData.'
'_get_discovery_url_choices')
@ -1359,3 +1363,12 @@ class EndpointDataTests(utils.TestCase):
bad_url = "https://compute.example.com/v2/123456"
epd = discover.EndpointData(catalog_url=bad_url)
self.assertEqual((2, 0), epd.api_version)
def test_url_version_match_project_id_int(self):
self.session = session.Session()
discovery_fixture = fixture.V3Discovery(V3_URL)
discovery_doc = _create_single_version(discovery_fixture)
self.requests_mock.get(V3_URL, status_code=200, json=discovery_doc)
epd = discover.EndpointData(catalog_url=V3_URL).get_versioned_data(
session=self.session, project_id='3')
self.assertEqual(epd.catalog_url, epd.url)