Supprt version discovery
Add a command to list client/server API version. Change-Id: I83957535b0a6dcb9b9cdb5bf1a05b56a544ab2a5
This commit is contained in:
@@ -30,7 +30,9 @@ if not LOG.handlers:
|
|||||||
|
|
||||||
HEADER_NAME = "OpenStack-API-Version"
|
HEADER_NAME = "OpenStack-API-Version"
|
||||||
SERVICE_TYPE = "container"
|
SERVICE_TYPE = "container"
|
||||||
DEFAULT_API_VERSION = '1.12'
|
MIN_API_VERSION = '1.1'
|
||||||
|
MAX_API_VERSION = '1.12'
|
||||||
|
DEFAULT_API_VERSION = MAX_API_VERSION
|
||||||
|
|
||||||
_SUBSTITUTIONS = {}
|
_SUBSTITUTIONS = {}
|
||||||
|
|
||||||
|
@@ -57,6 +57,9 @@ class FakeAPI(object):
|
|||||||
response = self._request(*args, **kwargs)
|
response = self._request(*args, **kwargs)
|
||||||
return FakeResponse(response[0]), response[1]
|
return FakeResponse(response[0]), response[1]
|
||||||
|
|
||||||
|
def get_endpoint(self, *args, **kwargs):
|
||||||
|
return '/v1'
|
||||||
|
|
||||||
|
|
||||||
class FakeConnection(object):
|
class FakeConnection(object):
|
||||||
def __init__(self, response=None):
|
def __init__(self, response=None):
|
||||||
|
50
zunclient/tests/unit/v1/test_versions.py
Normal file
50
zunclient/tests/unit/v1/test_versions.py
Normal file
@@ -0,0 +1,50 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
import testtools
|
||||||
|
from testtools import matchers
|
||||||
|
|
||||||
|
from zunclient.tests.unit import utils
|
||||||
|
from zunclient.v1 import versions
|
||||||
|
|
||||||
|
|
||||||
|
VERSION1 = {'status': 'CURRENT',
|
||||||
|
'min_version': '1.1',
|
||||||
|
'max_version': '1.12',
|
||||||
|
'id': 'v1',
|
||||||
|
}
|
||||||
|
|
||||||
|
fake_responses = {
|
||||||
|
'/':
|
||||||
|
{
|
||||||
|
'GET': (
|
||||||
|
{},
|
||||||
|
{'versions': [VERSION1]},
|
||||||
|
),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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()
|
||||||
|
expect = [
|
||||||
|
('GET', '/', {}, None),
|
||||||
|
]
|
||||||
|
self.assertEqual(expect, self.api.calls)
|
||||||
|
self.assertThat(versions, matchers.HasLength(1))
|
31
zunclient/tests/unit/v1/test_versions_shell.py
Normal file
31
zunclient/tests/unit/v1/test_versions_shell.py
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
# Copyright 2015 NEC Corporation. All rights reserved.
|
||||||
|
#
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
import mock
|
||||||
|
|
||||||
|
from zunclient.tests.unit.v1 import shell_test_base
|
||||||
|
|
||||||
|
|
||||||
|
class ShellTest(shell_test_base.TestCommandLineArgument):
|
||||||
|
|
||||||
|
@mock.patch('zunclient.v1.versions.VersionManager.list')
|
||||||
|
def test_zun_version_list_success(self, mock_list):
|
||||||
|
self._test_arg_success('version-list')
|
||||||
|
self.assertTrue(mock_list.called)
|
||||||
|
|
||||||
|
@mock.patch('zunclient.v1.versions.VersionManager.list')
|
||||||
|
def test_zun_version_list_failure(self, mock_list):
|
||||||
|
self._test_arg_failure('version-list --wrong',
|
||||||
|
self._unrecognized_arg_error)
|
||||||
|
self.assertFalse(mock_list.called)
|
@@ -21,6 +21,7 @@ from zunclient.v1 import containers
|
|||||||
from zunclient.v1 import hosts
|
from zunclient.v1 import hosts
|
||||||
from zunclient.v1 import images
|
from zunclient.v1 import images
|
||||||
from zunclient.v1 import services
|
from zunclient.v1 import services
|
||||||
|
from zunclient.v1 import versions
|
||||||
|
|
||||||
|
|
||||||
class Client(object):
|
class Client(object):
|
||||||
@@ -123,6 +124,7 @@ class Client(object):
|
|||||||
self.images = images.ImageManager(self.http_client)
|
self.images = images.ImageManager(self.http_client)
|
||||||
self.services = services.ServiceManager(self.http_client)
|
self.services = services.ServiceManager(self.http_client)
|
||||||
self.hosts = hosts.HostManager(self.http_client)
|
self.hosts = hosts.HostManager(self.http_client)
|
||||||
|
self.versions = versions.VersionManager(self.http_client)
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def api_version(self):
|
def api_version(self):
|
||||||
|
@@ -17,10 +17,12 @@ from zunclient.v1 import containers_shell
|
|||||||
from zunclient.v1 import hosts_shell
|
from zunclient.v1 import hosts_shell
|
||||||
from zunclient.v1 import images_shell
|
from zunclient.v1 import images_shell
|
||||||
from zunclient.v1 import services_shell
|
from zunclient.v1 import services_shell
|
||||||
|
from zunclient.v1 import versions_shell
|
||||||
|
|
||||||
COMMAND_MODULES = [
|
COMMAND_MODULES = [
|
||||||
containers_shell,
|
containers_shell,
|
||||||
images_shell,
|
images_shell,
|
||||||
services_shell,
|
services_shell,
|
||||||
hosts_shell,
|
hosts_shell,
|
||||||
|
versions_shell,
|
||||||
]
|
]
|
||||||
|
27
zunclient/v1/versions.py
Normal file
27
zunclient/v1/versions.py
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from zunclient.common import base
|
||||||
|
|
||||||
|
|
||||||
|
class Version(base.Resource):
|
||||||
|
def __repr__(self):
|
||||||
|
return "<Version>"
|
||||||
|
|
||||||
|
|
||||||
|
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")
|
28
zunclient/v1/versions_shell.py
Normal file
28
zunclient/v1/versions_shell.py
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
|
||||||
|
from zunclient import api_versions
|
||||||
|
from zunclient.common import cliutils as utils
|
||||||
|
|
||||||
|
|
||||||
|
def do_version_list(cs, args):
|
||||||
|
"""List all API versions."""
|
||||||
|
print("Client supported API versions:")
|
||||||
|
print("Minimum version %(v)s" %
|
||||||
|
{'v': api_versions.MIN_API_VERSION})
|
||||||
|
print("Maximum version %(v)s" %
|
||||||
|
{'v': api_versions.MAX_API_VERSION})
|
||||||
|
|
||||||
|
print("\nServer supported API versions:")
|
||||||
|
result = cs.versions.list()
|
||||||
|
columns = ["Id", "Status", "Min Version", "Max Version"]
|
||||||
|
utils.print_list(result, columns)
|
Reference in New Issue
Block a user