141 lines
3.4 KiB
Python
141 lines
3.4 KiB
Python
#
|
|
# Copyright (c) 2015 EUROGICIEL
|
|
#
|
|
# 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 pecan
|
|
from pecan import rest
|
|
from wsme import types as wtypes
|
|
import wsmeext.pecan as wsme_pecan
|
|
|
|
from cerberus.api.v1 import controllers as v1_api
|
|
from cerberus.openstack.common import log as logging
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
VERSION_STATUS = wtypes.Enum(wtypes.text, 'EXPERIMENTAL', 'STABLE')
|
|
|
|
|
|
class APILink(wtypes.Base):
|
|
"""API link description.
|
|
|
|
"""
|
|
|
|
type = wtypes.text
|
|
"""Type of link."""
|
|
|
|
rel = wtypes.text
|
|
"""Relationship with this link."""
|
|
|
|
href = wtypes.text
|
|
"""URL of the link."""
|
|
|
|
@classmethod
|
|
def sample(cls):
|
|
version = 'v1'
|
|
sample = cls(
|
|
rel='self',
|
|
type='text/html',
|
|
href='http://127.0.0.1:8888/{id}'.format(
|
|
id=version))
|
|
return sample
|
|
|
|
|
|
class APIMediaType(wtypes.Base):
|
|
"""Media type description.
|
|
|
|
"""
|
|
|
|
base = wtypes.text
|
|
"""Base type of this media type."""
|
|
|
|
type = wtypes.text
|
|
"""Type of this media type."""
|
|
|
|
@classmethod
|
|
def sample(cls):
|
|
sample = cls(
|
|
base='application/json',
|
|
type='application/vnd.openstack.sticks-v1+json')
|
|
return sample
|
|
|
|
|
|
class APIVersion(wtypes.Base):
|
|
"""API Version description.
|
|
|
|
"""
|
|
|
|
id = wtypes.text
|
|
"""ID of the version."""
|
|
|
|
status = VERSION_STATUS
|
|
"""Status of the version."""
|
|
|
|
updated = wtypes.text
|
|
"Last update in iso8601 format."
|
|
|
|
links = [APILink]
|
|
"""List of links to API resources."""
|
|
|
|
media_types = [APIMediaType]
|
|
"""Types accepted by this API."""
|
|
|
|
@classmethod
|
|
def sample(cls):
|
|
version = 'v1'
|
|
updated = '2014-08-11T16:00:00Z'
|
|
links = [APILink.sample()]
|
|
media_types = [APIMediaType.sample()]
|
|
sample = cls(id=version,
|
|
status='STABLE',
|
|
updated=updated,
|
|
links=links,
|
|
media_types=media_types)
|
|
return sample
|
|
|
|
|
|
class RootController(rest.RestController):
|
|
"""Root REST Controller exposing versions of the API.
|
|
|
|
"""
|
|
|
|
v1 = v1_api.V1Controller()
|
|
|
|
@wsme_pecan.wsexpose([APIVersion])
|
|
def get(self):
|
|
"""Return the version list
|
|
|
|
"""
|
|
# TODO(sheeprine): Maybe we should store all the API version
|
|
# informations in every API modules
|
|
ver1 = APIVersion(
|
|
id='v1',
|
|
status='EXPERIMENTAL',
|
|
updated='2015-03-09T16:00:00Z',
|
|
links=[
|
|
APILink(
|
|
rel='self',
|
|
href='{scheme}://{host}/v1'.format(
|
|
scheme=pecan.request.scheme,
|
|
host=pecan.request.host,
|
|
)
|
|
)
|
|
],
|
|
media_types=[]
|
|
)
|
|
|
|
versions = []
|
|
versions.append(ver1)
|
|
|
|
return versions
|