From 19480df10a98165597d33eea360cbfe7460e3309 Mon Sep 17 00:00:00 2001 From: Takashi NATSUME Date: Fri, 28 Aug 2015 16:16:06 +0900 Subject: [PATCH] Add parsing the endpoint URL Add parsing the endpoint URL and check the path string only in order to decide the API version. Change-Id: Ib0a035f3bed31e2162a1231a5f5dcc3907d37243 Closes-Bug: #1489727 --- glanceclient/common/utils.py | 11 +++++++---- glanceclient/tests/unit/test_client.py | 20 ++++++++++++++++++++ 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/glanceclient/common/utils.py b/glanceclient/common/utils.py index 24ddd793..2801a1de 100644 --- a/glanceclient/common/utils.py +++ b/glanceclient/common/utils.py @@ -20,6 +20,7 @@ import hashlib import json import os import re +import six.moves.urllib.parse as urlparse import sys import threading import uuid @@ -396,11 +397,13 @@ def strip_version(endpoint): version = None # Get rid of trailing '/' if present endpoint = endpoint.rstrip('/') - url_bits = endpoint.split('/') + url_parts = urlparse.urlparse(endpoint) + (scheme, netloc, path, __, __, __) = url_parts + path = path.lstrip('/') # regex to match 'v1' or 'v2.0' etc - if re.match('v\d+\.?\d*', url_bits[-1]): - version = float(url_bits[-1].lstrip('v')) - endpoint = '/'.join(url_bits[:-1]) + if re.match('v\d+\.?\d*', path): + version = float(path.lstrip('v')) + endpoint = scheme + '://' + netloc return endpoint, version diff --git a/glanceclient/tests/unit/test_client.py b/glanceclient/tests/unit/test_client.py index fea7949e..42e00671 100644 --- a/glanceclient/tests/unit/test_client.py +++ b/glanceclient/tests/unit/test_client.py @@ -44,3 +44,23 @@ class ClientTest(testtools.TestCase): gc = client.Client(2.2, "http://example.com/v2.1") self.assertEqual("http://example.com", gc.http_client.endpoint) self.assertIsInstance(gc, v2.client.Client) + + def test_endpoint_with_version_hostname(self): + gc = client.Client(2, "http://v1.example.com") + self.assertEqual("http://v1.example.com", gc.http_client.endpoint) + self.assertIsInstance(gc, v2.client.Client) + + def test_versioned_endpoint_with_version_hostname_v2(self): + gc = client.Client(endpoint="http://v1.example.com/v2") + self.assertEqual("http://v1.example.com", gc.http_client.endpoint) + self.assertIsInstance(gc, v2.client.Client) + + def test_versioned_endpoint_with_version_hostname_v1(self): + gc = client.Client(endpoint="http://v2.example.com/v1") + self.assertEqual("http://v2.example.com", gc.http_client.endpoint) + self.assertIsInstance(gc, v1.client.Client) + + def test_versioned_endpoint_with_minor_revision_and_version_hostname(self): + gc = client.Client(endpoint="http://v1.example.com/v2.1") + self.assertEqual("http://v1.example.com", gc.http_client.endpoint) + self.assertIsInstance(gc, v2.client.Client)