summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorBrian Lamar <brian.lamar@rackspace.com>2011-03-18 00:05:58 -0400
committerBrian Lamar <brian.lamar@rackspace.com>2011-03-18 00:05:58 -0400
commitfce6b6f8f39378f5f31b8aa432922374c744544e (patch)
tree81eb002e5d7540d2afae6fda61eccc4d86c0260b /nova/api
parent0c7d93402885ea6644a5fb3c4e65115b2e5626be (diff)
Become compatible with ironcamel and bcwaldon's implementations for standardness.
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/openstack/images.py31
-rw-r--r--nova/api/openstack/views/images.py18
2 files changed, 38 insertions, 11 deletions
diff --git a/nova/api/openstack/images.py b/nova/api/openstack/images.py
index bc7338699..a192883fc 100644
--- a/nova/api/openstack/images.py
+++ b/nova/api/openstack/images.py
@@ -17,9 +17,9 @@ from webob import exc
from nova import compute
from nova import flags
-from nova import log
from nova import utils
from nova import wsgi
+from nova.api.openstack import common
from nova.api.openstack.views import images as images_view
@@ -39,6 +39,11 @@ class Controller(wsgi.Controller):
},
}
+ _builder_dispatch = {
+ "1.0": images_view.ViewBuilderV10,
+ "1.1": images_view.ViewBuilderV11,
+ }
+
def __init__(self, image_service=None, compute_service=None):
"""
Initialize new `ImageController`.
@@ -50,7 +55,17 @@ class Controller(wsgi.Controller):
self.__compute = compute_service or compute.API()
self.__image = image_service or _default_service
- self.__log = log.getLogger(self.__class__.__name__)
+
+ def get_builder(self, request):
+ """
+ Property to get the ViewBuilder class we need to use.
+ """
+ version = common.get_api_version(request)
+ base_url = request.application_url
+ try:
+ return self._builder_dispatch[version](base_url)
+ except KeyError:
+ raise exc.HTTPNotFound()
def index(self, req):
"""
@@ -60,7 +75,7 @@ class Controller(wsgi.Controller):
"""
context = req.environ['nova.context']
images = self.__image.index(context)
- build = self._builder.build
+ build = self.get_builder(req).build
return dict(images=[build(req, image, False) for image in images])
def detail(self, req):
@@ -71,7 +86,7 @@ class Controller(wsgi.Controller):
"""
context = req.environ['nova.context']
images = self.__image.detail(context)
- build = self._builder.build
+ build = self.get_builder(req).build
return dict(images=[build(req, image, True) for image in images])
def show(self, req, image_id):
@@ -83,7 +98,7 @@ class Controller(wsgi.Controller):
"""
context = req.environ['nova.context']
image = self.__image.show(context, image_id)
- return self._builder.build(req, image, True)
+ return self.get_builder(req).build(req, image, True)
def delete(self, req, image_id):
"""
@@ -117,18 +132,18 @@ class Controller(wsgi.Controller):
raise exc.HTTPBadRequest()
image = self.__compute.snapshot(context, server_id, image_name)
- return self._builder.build(req, image, True)
+ return self.get_builder(req).build(req, image, True)
class ControllerV10(Controller):
"""
Version 1.0 specific controller logic.
"""
- _builder = images_view.ViewBuilderV10()
+ pass
class ControllerV11(Controller):
"""
Version 1.1 specific controller logic.
"""
- _builder = images_view.ViewBuilderV11()
+ pass
diff --git a/nova/api/openstack/views/images.py b/nova/api/openstack/views/images.py
index c41e60546..313ba2eba 100644
--- a/nova/api/openstack/views/images.py
+++ b/nova/api/openstack/views/images.py
@@ -22,7 +22,19 @@ class ViewBuilder(object):
information about images.
"""
- def build(self, request, image_obj, detail=False):
+ def __init__(self, base_url):
+ """
+ Initialize new `ViewBuilder`.
+ """
+ self._url = base_url
+
+ def generate_href(self, image_id):
+ """
+ Return an href string pointing to this object.
+ """
+ return "%s/images/%s" % (self._url, image_id)
+
+ def build(self, image_obj, detail=False):
"""
Return a standardized image structure for display by the API.
"""
@@ -50,12 +62,12 @@ class ViewBuilderV11(ViewBuilder):
OpenStack API v1.1 Image Builder
"""
- def build(self, request, image_obj, detail=False):
+ def build(self, image_obj, detail=False):
"""
Return a standardized image structure for display by the API.
"""
image = ViewBuilder.build(self, request, image_obj, detail)
- href = "%s/images/%s" % (request.application_url, image_obj["id"])
+ href = self.generate_url(image_obj["id"])
image["links"] = [{
"rel": "self",