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)