From 0af28cb95e9825e39ff96dd5539d7236a4592882 Mon Sep 17 00:00:00 2001 From: Steve Lewis Date: Fri, 12 Sep 2014 11:37:15 -0700 Subject: [PATCH] Describe API versions Adding json representation of the v2 REST API at the API root endpoint. Endpoint still requires authentication. Change-Id: I069644917f9a29e7ddfe7010695ad3a5aa5ca8c2 Partial-Bug: #1350076 --- ceilometer/api/controllers/root.py | 33 ++++++++++++-- ceilometer/tests/api/test_versions.py | 65 +++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 3 deletions(-) create mode 100644 ceilometer/tests/api/test_versions.py diff --git a/ceilometer/api/controllers/root.py b/ceilometer/api/controllers/root.py index dbb990964..ab8fb6989 100644 --- a/ceilometer/api/controllers/root.py +++ b/ceilometer/api/controllers/root.py @@ -19,12 +19,39 @@ import pecan from ceilometer.api.controllers import v2 +MEDIA_TYPE_JSON = 'application/vnd.openstack.telemetry-%s+json' +MEDIA_TYPE_XML = 'application/vnd.openstack.telemetry-%s+xml' + class RootController(object): v2 = v2.V2Controller() - @pecan.expose(generic=True, template='index.html') + @pecan.expose('json') def index(self): - # FIXME: Return version information - return dict() + base_url = pecan.request.host_url + available = [{'tag': 'v2', 'date': '2013-02-13T00:00:00Z', }] + collected = [version_descriptor(base_url, v['tag'], v['date']) + for v in available] + versions = {'versions': {'values': collected}} + return versions + + +def version_descriptor(base_url, version, released_on): + url = version_url(base_url, version) + return { + 'id': version, + 'links': [ + {'href': url, 'rel': 'self', }, + {'href': 'http://docs.openstack.org/', + 'rel': 'describedby', 'type': 'text/html', }], + 'media-types': [ + {'base': 'application/json', 'type': MEDIA_TYPE_JSON % version, }, + {'base': 'application/xml', 'type': MEDIA_TYPE_XML % version, }], + 'status': 'stable', + 'updated': released_on, + } + + +def version_url(base_url, version_number): + return '%s/%s' % (base_url, version_number) diff --git a/ceilometer/tests/api/test_versions.py b/ceilometer/tests/api/test_versions.py new file mode 100644 index 000000000..1bc21f25e --- /dev/null +++ b/ceilometer/tests/api/test_versions.py @@ -0,0 +1,65 @@ +# Copyright 2014 OpenStack Foundation +# +# 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 ceilometer.tests import api + +V2_MEDIA_TYPES = [ + { + 'base': 'application/json', + 'type': 'application/vnd.openstack.telemetry-v2+json' + }, { + 'base': 'application/xml', + 'type': 'application/vnd.openstack.telemetry-v2+xml' + } +] + +V2_HTML_DESCRIPTION = { + 'href': 'http://docs.openstack.org/', + 'rel': 'describedby', + 'type': 'text/html', +} + +V2_EXPECTED_RESPONSE = { + 'id': 'v2', + 'links': [ + { + 'rel': 'self', + 'href': 'http://localhost/v2', + }, + V2_HTML_DESCRIPTION + ], + 'media-types': V2_MEDIA_TYPES, + 'status': 'stable', + 'updated': '2013-02-13T00:00:00Z', +} + +V2_VERSION_RESPONSE = { + "version": V2_EXPECTED_RESPONSE +} + +VERSIONS_RESPONSE = { + "versions": { + "values": [ + V2_EXPECTED_RESPONSE + ] + } +} + + +class TestVersions(api.FunctionalTest): + + def test_versions(self): + data = self.get_json('/') + self.assertEqual(VERSIONS_RESPONSE, data)