
Foundation for ekko-api, ported over from the Ironic project. The goal here was to copy enough to give a solid foundation that conforms to the "OpenStack way", without a lot of extra frills that we either may not need right away, or makes it harder see what's going on starting out. After installation the service can be started via 'ekko-api', which listens on port 6800 by default. This was chosen from the list of unassigned ports at http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt There are still plenty of TODO's, primarily keystone integration and config file generation. Foundations for these are here but completely untested as of this commit. Change-Id: If136a3bb66949ef710d741eaf3691f36f7b60692
112 lines
3.3 KiB
Python
112 lines
3.3 KiB
Python
#
|
|
# 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
|
|
|
|
from ekko.api.controllers import base
|
|
from ekko.api.controllers import v1
|
|
from ekko.api.controllers.v1 import versions
|
|
from ekko.api import expose
|
|
|
|
ID_VERSION1 = 'v1'
|
|
|
|
|
|
class Version(base.APIBase):
|
|
"""An API version representation.
|
|
|
|
This class represents an API version, including the minimum and
|
|
maximum minor versions that are supported within the major version.
|
|
"""
|
|
|
|
id = wtypes.text
|
|
"""The ID of the (major) version, also acts as the release number"""
|
|
|
|
status = wtypes.text
|
|
"""Status of the version.
|
|
|
|
One of:
|
|
* CURRENT - the latest version of API,
|
|
* SUPPORTED - supported, but not latest, version of API,
|
|
* DEPRECATED - supported, but deprecated, version of API.
|
|
"""
|
|
|
|
version = wtypes.text
|
|
"""The current, maximum supported (major.minor) version of API."""
|
|
|
|
min_version = wtypes.text
|
|
"""Minimum supported (major.minor) version of API."""
|
|
|
|
def __init__(self, id, min_version, version, status='CURRENT'):
|
|
self.id = id
|
|
self.status = status
|
|
self.version = version
|
|
self.min_version = min_version
|
|
|
|
|
|
class Root(base.APIBase):
|
|
|
|
name = wtypes.text
|
|
"""The name of the API"""
|
|
|
|
description = wtypes.text
|
|
"""Some information about this API"""
|
|
|
|
versions = [Version]
|
|
"""Links to all the versions available in this API"""
|
|
|
|
default_version = Version
|
|
"""A link to the default version of the API"""
|
|
|
|
@staticmethod
|
|
def convert():
|
|
root = Root()
|
|
root.name = "OpenStack Ekko API"
|
|
root.description = ("Block-based backups stored in object-storage.")
|
|
root.default_version = Version(ID_VERSION1,
|
|
versions.MIN_VERSION_STRING,
|
|
versions.MAX_VERSION_STRING)
|
|
root.versions = [root.default_version]
|
|
return root
|
|
|
|
|
|
class RootController(rest.RestController):
|
|
|
|
_versions = [ID_VERSION1]
|
|
"""All supported API versions"""
|
|
|
|
_default_version = ID_VERSION1
|
|
"""The default API version"""
|
|
|
|
v1 = v1.Controller()
|
|
|
|
@expose.expose(Root)
|
|
def get(self):
|
|
# NOTE: The reason why convert() it's being called for every
|
|
# request is because we need to get the host url from
|
|
# the request object to make the links.
|
|
return Root.convert()
|
|
|
|
@pecan.expose()
|
|
def _route(self, args):
|
|
"""Overrides the default routing behavior.
|
|
|
|
It redirects the request to the default version of the ekko API
|
|
if the version number is not specified in the url.
|
|
"""
|
|
|
|
if args[0] and args[0] not in self._versions:
|
|
args = [self._default_version] + args
|
|
return super(RootController, self)._route(args)
|