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>
This commit is contained in:
Zane Bitter 2012-09-27 14:40:52 +02:00
parent 3c85e1941f
commit f26b218831
8 changed files with 87 additions and 17 deletions

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -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))

View File

@ -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)

View File

@ -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

View File

@ -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)