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 88df7569..bad885b2 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 da1e83d5..23e76afa 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 e8e40359..b39691f4 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 cf7c2cd2..ca95e010 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 4625dbb7..a6407d4e 100644 --- a/heat/api/versions.py +++ b/heat/api/cfn/versions.py @@ -36,20 +36,15 @@ class Controller(object): def __call__(self, req): """Respond to a request for all OpenStack API versions.""" version_objs = [ - { - "id": "v1.1", - "status": "CURRENT", - "links": [ - { - "rel": "self", - "href": self.get_href(req)}]}, { "id": "v1.0", - "status": "SUPPORTED", + "status": "CURRENT", "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 87785785..823b757b 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 00000000..a6407d4e --- /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 8f2826df..2e3de029 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) -- 2.45.2