Merge "Handle different endpoint format"

This commit is contained in:
Zuul 2018-10-30 05:00:21 +00:00 committed by Gerrit Code Review
commit 21c814390d
3 changed files with 36 additions and 15 deletions

View File

@ -40,11 +40,12 @@ class BaseTestCase(testtools.TestCase):
class FakeAPI(object):
def __init__(self, responses):
def __init__(self, responses, endpoint=None):
self.responses = responses
self.calls = []
self.api_version = api_versions.APIVersion(
api_versions.MAX_API_VERSION)
self.endpoint = endpoint
def _request(self, method, url, headers=None, body=None):
call = (method, url, headers or {}, body)
@ -61,7 +62,7 @@ class FakeAPI(object):
return FakeResponse(response[0]), response[1]
def get_endpoint(self, *args, **kwargs):
return '/v1'
return self.endpoint or '/v1'
class FakeConnection(object):

View File

@ -24,7 +24,7 @@ VERSION1 = {'status': 'CURRENT',
}
fake_responses = {
'/':
'https://example.com':
{
'GET': (
{},
@ -36,15 +36,17 @@ fake_responses = {
class VersionManagerTest(testtools.TestCase):
def setUp(self):
super(VersionManagerTest, self).setUp()
self.api = utils.FakeAPI(fake_responses)
self.mgr = versions.VersionManager(self.api)
def test_version_list(self):
versions = self.mgr.list()
self._test_version_list('https://example.com')
self._test_version_list('https://example.com/v1')
self._test_version_list('https://example.com/v1/')
def _test_version_list(self, endpoint):
api = utils.FakeAPI(fake_responses, endpoint=endpoint)
mgr = versions.VersionManager(api)
api_versions = mgr.list()
expect = [
('GET', '/', {}, None),
('GET', 'https://example.com', {}, None),
]
self.assertEqual(expect, self.api.calls)
self.assertThat(versions, matchers.HasLength(1))
self.assertEqual(expect, api.calls)
self.assertThat(api_versions, matchers.HasLength(1))

View File

@ -10,6 +10,8 @@
# License for the specific language governing permissions and limitations
# under the License.
from six.moves import urllib
from zunclient.common import base
@ -22,9 +24,25 @@ class VersionManager(base.Manager):
resource_class = Version
def list(self):
url = "%s" % self.api.get_endpoint()
url = "%s/" % url.rsplit("/", 1)[0]
return self._list(url, "versions")
endpoint = self.api.get_endpoint()
url = urllib.parse.urlparse(endpoint)
# NOTE(hongbin): endpoint URL has at least 2 formats:
# 1. the classic (legacy) endpoint:
# http://{host}:{optional_port}/v1/
# 2. under wsgi:
# http://{host}:{optional_port}/container/v1
if url.path.endswith("v1") or "/v1/" in url.path:
# this way should handle all 2 possible formats
path = url.path[:url.path.rfind("/v1")]
version_url = '%s://%s%s' % (url.scheme, url.netloc, path)
else:
# NOTE(hongbin): probably, it is one of the next cases:
# * https://container.example.com/
# * https://example.com/container
# leave as is without cropping.
version_url = endpoint
return self._list(version_url, "versions")
def get_current(self):
for version in self.list():