From f26b2188319a293b4dff6a88c571215798634e85 Mon Sep 17 00:00:00 2001 From: Zane Bitter Date: Thu, 27 Sep 2012 14:40:52 +0200 Subject: [PATCH] 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 --- etc/heat/heat-api-cfn-paste.ini | 2 +- etc/heat/heat-api-cloudwatch-paste.ini | 2 +- heat/api/cfn/__init__.py | 12 +++++ heat/api/cfn/v1/__init__.py | 3 -- heat/api/{ => cfn}/versions.py | 13 ++--- heat/api/cloudwatch/__init__.py | 8 +++ heat/api/cloudwatch/versions.py | 59 ++++++++++++++++++++++ heat/api/middleware/version_negotiation.py | 5 +- 8 files changed, 87 insertions(+), 17 deletions(-) rename heat/api/{ => cfn}/versions.py (84%) create mode 100644 heat/api/cloudwatch/versions.py diff --git a/etc/heat/heat-api-cfn-paste.ini b/etc/heat/heat-api-cfn-paste.ini index 88df756934..bad885b25e 100644 --- a/etc/heat/heat-api-cfn-paste.ini +++ b/etc/heat/heat-api-cfn-paste.ini @@ -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 diff --git a/etc/heat/heat-api-cloudwatch-paste.ini b/etc/heat/heat-api-cloudwatch-paste.ini index da1e83d59d..23e76afa47 100644 --- a/etc/heat/heat-api-cloudwatch-paste.ini +++ b/etc/heat/heat-api-cloudwatch-paste.ini @@ -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 diff --git a/heat/api/cfn/__init__.py b/heat/api/cfn/__init__.py index e8e4035941..b39691f4a0 100644 --- a/heat/api/cfn/__init__.py +++ b/heat/api/cfn/__init__.py @@ -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) diff --git a/heat/api/cfn/v1/__init__.py b/heat/api/cfn/v1/__init__.py index cf7c2cd2f8..ca95e010b0 100644 --- a/heat/api/cfn/v1/__init__.py +++ b/heat/api/cfn/v1/__init__.py @@ -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 diff --git a/heat/api/versions.py b/heat/api/cfn/versions.py similarity index 84% rename from heat/api/versions.py rename to heat/api/cfn/versions.py index 4625dbb713..a6407d4e2a 100644 --- a/heat/api/versions.py +++ b/heat/api/cfn/versions.py @@ -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)) diff --git a/heat/api/cloudwatch/__init__.py b/heat/api/cloudwatch/__init__.py index 877857857b..823b757b8b 100644 --- a/heat/api/cloudwatch/__init__.py +++ b/heat/api/cloudwatch/__init__.py @@ -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) diff --git a/heat/api/cloudwatch/versions.py b/heat/api/cloudwatch/versions.py new file mode 100644 index 0000000000..a6407d4e2a --- /dev/null +++ b/heat/api/cloudwatch/versions.py @@ -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 diff --git a/heat/api/middleware/version_negotiation.py b/heat/api/middleware/version_negotiation.py index 8f2826df6f..2e3de02985 100644 --- a/heat/api/middleware/version_negotiation.py +++ b/heat/api/middleware/version_negotiation.py @@ -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)