Allow separate versioning of each API
Previously, all APIs used single versioning definition. Since these are likely to change at different rates (AWS APIs are unlikely to change at all, but OpenStack APIs probably will), give each their own version definition. Change-Id: I6985205dfcb5baf6f49ad32b091d811f97d1552a Signed-off-by: Zane Bitter <zbitter@redhat.com>changes/55/13755/2
parent
3c85e1941f
commit
f26b218831
|
@ -49,7 +49,7 @@ heat.app_factory = heat.api.cfn.v1:API
|
|||
|
||||
[filter:versionnegotiation]
|
||||
paste.filter_factory = heat.common.wsgi:filter_factory
|
||||
heat.filter_factory = heat.api.middleware.version_negotiation:VersionNegotiationFilter
|
||||
heat.filter_factory = heat.api.cfn:version_negotiation_filter
|
||||
|
||||
[filter:cache]
|
||||
paste.filter_factory = heat.common.wsgi:filter_factory
|
||||
|
|
|
@ -49,7 +49,7 @@ heat.app_factory = heat.api.cloudwatch:API
|
|||
|
||||
[filter:versionnegotiation]
|
||||
paste.filter_factory = heat.common.wsgi:filter_factory
|
||||
heat.filter_factory = heat.api.middleware.version_negotiation:VersionNegotiationFilter
|
||||
heat.filter_factory = heat.api.cloudwatch:version_negotiation_filter
|
||||
|
||||
[filter:cache]
|
||||
paste.filter_factory = heat.common.wsgi:filter_factory
|
||||
|
|
|
@ -12,3 +12,15 @@
|
|||
# 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 gettext
|
||||
|
||||
gettext.install('heat', unicode=1)
|
||||
|
||||
from heat.api.middleware.version_negotiation import VersionNegotiationFilter
|
||||
from heat.api.cfn import versions
|
||||
|
||||
|
||||
def version_negotiation_filter(app, conf, **local_conf):
|
||||
return VersionNegotiationFilter(versions.Controller, app,
|
||||
conf, **local_conf)
|
||||
|
|
|
@ -17,9 +17,6 @@ import json
|
|||
import urlparse
|
||||
import httplib
|
||||
import routes
|
||||
import gettext
|
||||
|
||||
gettext.install('heat', unicode=1)
|
||||
|
||||
from heat.api.cfn.v1 import stacks
|
||||
from heat.common import wsgi
|
||||
|
|
|
@ -37,19 +37,14 @@ class Controller(object):
|
|||
"""Respond to a request for all OpenStack API versions."""
|
||||
version_objs = [
|
||||
{
|
||||
"id": "v1.1",
|
||||
"id": "v1.0",
|
||||
"status": "CURRENT",
|
||||
"links": [
|
||||
{
|
||||
"rel": "self",
|
||||
"href": self.get_href(req)}]},
|
||||
{
|
||||
"id": "v1.0",
|
||||
"status": "SUPPORTED",
|
||||
"links": [
|
||||
{
|
||||
"rel": "self",
|
||||
"href": self.get_href(req)}]}]
|
||||
"href": self.get_href(req)
|
||||
}]
|
||||
}]
|
||||
|
||||
body = json.dumps(dict(versions=version_objs))
|
||||
|
|
@ -29,6 +29,9 @@ import webob
|
|||
from heat import utils
|
||||
from heat.common import context
|
||||
from heat.api.aws import exception
|
||||
from heat.api.middleware.version_negotiation import VersionNegotiationFilter
|
||||
from heat.api.cloudwatch import versions
|
||||
|
||||
|
||||
from heat.openstack.common import log as logging
|
||||
|
||||
|
@ -79,3 +82,8 @@ class API(wsgi.Router):
|
|||
mapper.connect("/", controller=controller_resource, action="index")
|
||||
|
||||
super(API, self).__init__(mapper)
|
||||
|
||||
|
||||
def version_negotiation_filter(app, conf, **local_conf):
|
||||
return VersionNegotiationFilter(versions.Controller, app,
|
||||
conf, **local_conf)
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
||||
|
||||
#
|
||||
# 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.
|
||||
|
||||
"""
|
||||
Controller that returns information on the heat API versions
|
||||
"""
|
||||
|
||||
import httplib
|
||||
import json
|
||||
|
||||
import webob.dec
|
||||
|
||||
|
||||
class Controller(object):
|
||||
|
||||
"""
|
||||
A controller that produces information on the heat API versions.
|
||||
"""
|
||||
|
||||
def __init__(self, conf):
|
||||
self.conf = conf
|
||||
|
||||
@webob.dec.wsgify
|
||||
def __call__(self, req):
|
||||
"""Respond to a request for all OpenStack API versions."""
|
||||
version_objs = [
|
||||
{
|
||||
"id": "v1.0",
|
||||
"status": "CURRENT",
|
||||
"links": [
|
||||
{
|
||||
"rel": "self",
|
||||
"href": self.get_href(req)
|
||||
}]
|
||||
}]
|
||||
|
||||
body = json.dumps(dict(versions=version_objs))
|
||||
|
||||
response = webob.Response(request=req,
|
||||
status=httplib.MULTIPLE_CHOICES,
|
||||
content_type='application/json')
|
||||
response.body = body
|
||||
|
||||
return response
|
||||
|
||||
def get_href(self, req):
|
||||
return "%s/v1/" % req.host_url
|
|
@ -23,7 +23,6 @@ import re
|
|||
|
||||
from heat.openstack.common import log as logging
|
||||
|
||||
from heat.api import versions
|
||||
from heat.common import wsgi
|
||||
|
||||
logger = logging.getLogger('heat.api.middleware.version_negotiation')
|
||||
|
@ -31,8 +30,8 @@ logger = logging.getLogger('heat.api.middleware.version_negotiation')
|
|||
|
||||
class VersionNegotiationFilter(wsgi.Middleware):
|
||||
|
||||
def __init__(self, app, conf, **local_conf):
|
||||
self.versions_app = versions.Controller(conf)
|
||||
def __init__(self, version_controller, app, conf, **local_conf):
|
||||
self.versions_app = version_controller(conf)
|
||||
self.version_uri_regex = re.compile(r"^v(\d+)\.?(\d+)?")
|
||||
self.conf = conf
|
||||
super(VersionNegotiationFilter, self).__init__(app)
|
||||
|
|
Loading…
Reference in New Issue