diff --git a/keystoneauth1/discover.py b/keystoneauth1/discover.py index eb7ebf94..97321a14 100644 --- a/keystoneauth1/discover.py +++ b/keystoneauth1/discover.py @@ -473,6 +473,12 @@ def _version_from_url(url): url = urllib.parse.urlparse(url) for part in reversed(url.path.split('/')): try: + # All integer project ids can parse as valid versions. In URLs + # all known instances of versions start with a v. So check to make + # sure the url part starts with 'v', then check that it parses + # as a valid version. + if part[0] != 'v': + continue return normalize_version_number(part) except Exception: pass diff --git a/keystoneauth1/tests/unit/test_discovery.py b/keystoneauth1/tests/unit/test_discovery.py index 024efc62..9972eb3d 100644 --- a/keystoneauth1/tests/unit/test_discovery.py +++ b/keystoneauth1/tests/unit/test_discovery.py @@ -1257,3 +1257,8 @@ class EndpointDataTests(utils.TestCase): self.assertEqual(exp, str(epd)) # Works with implicit stringification self.assertEqual(exp, "%s" % epd) + + def test_project_id_int_fallback(self): + bad_url = "https://compute.example.com/v2/123456" + epd = discover.EndpointData(catalog_url=bad_url) + self.assertEqual((2, 0), epd.api_version)