From 1f1934eb8277c7432e56da024bd8ce2171f3e8e6 Mon Sep 17 00:00:00 2001 From: wangxiyuan Date: Thu, 29 Oct 2015 17:50:36 +0800 Subject: [PATCH] Add versions list function This patch add a function to query the Glance API versions. DocImpact Change-Id: I21eeaee3db4ae23f608b68bb319772ac612975b4 Closes-bug: #1511180 --- glanceclient/tests/unit/v1/test_versions.py | 79 +++++++++++++++++++++ glanceclient/tests/unit/v2/test_versions.py | 75 +++++++++++++++++++ glanceclient/v1/client.py | 2 + glanceclient/v1/versions.py | 26 +++++++ glanceclient/v2/client.py | 3 + glanceclient/v2/versions.py | 26 +++++++ 6 files changed, 211 insertions(+) create mode 100644 glanceclient/tests/unit/v1/test_versions.py create mode 100644 glanceclient/tests/unit/v2/test_versions.py create mode 100644 glanceclient/v1/versions.py create mode 100644 glanceclient/v2/versions.py diff --git a/glanceclient/tests/unit/v1/test_versions.py b/glanceclient/tests/unit/v1/test_versions.py new file mode 100644 index 0000000..4228627 --- /dev/null +++ b/glanceclient/tests/unit/v1/test_versions.py @@ -0,0 +1,79 @@ +# Copyright 2015 OpenStack Foundation +# Copyright 2015 Huawei Corp. +# 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 testtools + +from glanceclient.tests import utils +import glanceclient.v1.versions + + +fixtures = { + '/versions': { + 'GET': ( + {}, + {"versions": [ + { + "status": "EXPERIMENTAL", + "id": "v3.0", + "links": [ + { + "href": "http://10.229.45.145:9292/v3/", + "rel": "self" + } + ] + }, + { + "status": "CURRENT", + "id": "v2.3", + "links": [ + { + "href": "http://10.229.45.145:9292/v2/", + "rel": "self" + } + ] + }, + { + "status": "SUPPORTED", + "id": "v1.0", + "links": [ + { + "href": "http://10.229.45.145:9292/v1/", + "rel": "self" + } + ] + } + ]} + ) + } +} + + +class TestVersions(testtools.TestCase): + + def setUp(self): + super(TestVersions, self).setUp() + self.api = utils.FakeAPI(fixtures) + self.mgr = glanceclient.v1.versions.VersionManager(self.api) + + def test_version_list(self): + versions = self.mgr.list() + expect = [('GET', '/versions', {}, None)] + self.assertEqual(expect, self.api.calls) + self.assertEqual(3, len(versions)) + self.assertEqual('v3.0', versions[0]['id']) + self.assertEqual('EXPERIMENTAL', versions[0]['status']) + self.assertEqual([{"href": "http://10.229.45.145:9292/v3/", + "rel": "self"}], versions[0]['links']) diff --git a/glanceclient/tests/unit/v2/test_versions.py b/glanceclient/tests/unit/v2/test_versions.py new file mode 100644 index 0000000..6d21a80 --- /dev/null +++ b/glanceclient/tests/unit/v2/test_versions.py @@ -0,0 +1,75 @@ +# Copyright 2015 OpenStack Foundation +# Copyright 2015 Huawei Corp. +# 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 testtools + +from glanceclient.tests import utils +from glanceclient.v2 import versions + +fixtures = { + '/versions': { + 'GET': ( + {}, + {"versions": [ + { + "status": "EXPERIMENTAL", + "id": "v3.0", + "links": [ + { + "href": "http://10.229.45.145:9292/v3/", + "rel": "self" + } + ] + }, + { + "status": "CURRENT", + "id": "v2.3", + "links": [ + { + "href": "http://10.229.45.145:9292/v2/", + "rel": "self" + } + ] + }, + { + "status": "SUPPORTED", + "id": "v1.0", + "links": [ + { + "href": "http://10.229.45.145:9292/v1/", + "rel": "self" + } + ] + } + ]} + ) + } +} + + +class TestVersions(testtools.TestCase): + + def setUp(self): + super(TestVersions, self).setUp() + self.api = utils.FakeAPI(fixtures) + self.controller = versions.VersionController(self.api) + + def test_version_list(self): + version = list(self.controller.list()) + self.assertEqual('v3.0', version[0]['id']) + self.assertEqual('EXPERIMENTAL', version[0]['status']) + self.assertEqual([{"href": "http://10.229.45.145:9292/v3/", + "rel": "self"}], version[0]['links']) diff --git a/glanceclient/v1/client.py b/glanceclient/v1/client.py index cc6fa6a..7ae8065 100644 --- a/glanceclient/v1/client.py +++ b/glanceclient/v1/client.py @@ -17,6 +17,7 @@ from glanceclient.common import http from glanceclient.common import utils from glanceclient.v1 import image_members from glanceclient.v1 import images +from glanceclient.v1 import versions class Client(object): @@ -37,3 +38,4 @@ class Client(object): self.http_client = http.get_http_client(endpoint=endpoint, **kwargs) self.images = images.ImageManager(self.http_client) self.image_members = image_members.ImageMemberManager(self.http_client) + self.versions = versions.VersionManager(self.http_client) diff --git a/glanceclient/v1/versions.py b/glanceclient/v1/versions.py new file mode 100644 index 0000000..d65c2f6 --- /dev/null +++ b/glanceclient/v1/versions.py @@ -0,0 +1,26 @@ +# Copyright 2015 OpenStack Foundation +# Copyright 2015 Huawei Corp. +# 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. + +from glanceclient.openstack.common.apiclient import base + + +class VersionManager(base.ManagerWithFind): + + def list(self): + """List all versions.""" + url = '/versions' + resp, body = self.client.get(url) + return body.get('versions', None) diff --git a/glanceclient/v2/client.py b/glanceclient/v2/client.py index bca8318..279be63 100644 --- a/glanceclient/v2/client.py +++ b/glanceclient/v2/client.py @@ -22,6 +22,7 @@ from glanceclient.v2 import images from glanceclient.v2 import metadefs from glanceclient.v2 import schemas from glanceclient.v2 import tasks +from glanceclient.v2 import versions class Client(object): @@ -63,3 +64,5 @@ class Client(object): self.metadefs_namespace = ( metadefs.NamespaceController(self.http_client, self.schemas)) + + self.versions = versions.VersionController(self.http_client) diff --git a/glanceclient/v2/versions.py b/glanceclient/v2/versions.py new file mode 100644 index 0000000..95b4f63 --- /dev/null +++ b/glanceclient/v2/versions.py @@ -0,0 +1,26 @@ +# Copyright 2015 OpenStack Foundation +# Copyright 2015 Huawei Corp. +# 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. + + +class VersionController(object): + def __init__(self, http_client): + self.http_client = http_client + + def list(self): + """List all versions.""" + url = '/versions' + resp, body = self.http_client.get(url) + return body.get('versions', None)