18
18
from nova import compute
19
19
from nova import exception
20
20
from nova import flags
21
22
from nova import log
22
23
from nova import utils
23
24
from nova.api.openstack import common
24
25
from nova.api.openstack import faults
25
26
from nova.api.openstack.views import images as images_view
27
from nova.api.openstack import wsgi
28
30
LOG = log.getLogger('nova.api.openstack.images')
31
33
SUPPORTED_FILTERS = ['name', 'status']
34
class Controller(common.OpenstackController):
35
"""Base `wsgi.Controller` for retrieving/displaying images."""
37
_serialization_metadata = {
40
"image": ["id", "name", "updated", "created", "status",
41
"serverId", "progress"],
42
"link": ["rel", "type", "href"],
36
class Controller(object):
37
"""Base controller for retrieving/displaying images."""
47
39
def __init__(self, image_service=None, compute_service=None):
48
40
"""Initialize new `ImageController`.
50
42
:param compute_service: `nova.compute.api:API`
51
43
:param image_service: `nova.image.service:BaseImageService`
53
_default_service = utils.import_object(flags.FLAGS.image_service)
55
46
self._compute_service = compute_service or compute.API()
56
self._image_service = image_service or _default_service
59
"""Return an index listing of images available to the request.
61
:param req: `wsgi.Request` object
63
context = req.environ['nova.context']
64
filters = self._get_filters(req)
65
images = self._image_service.index(context, filters)
66
images = common.limited(images, req)
67
builder = self.get_builder(req).build
68
return dict(images=[builder(image, detail=False) for image in images])
70
def detail(self, req):
71
"""Return a detailed index listing of images available to the request.
73
:param req: `wsgi.Request` object.
75
context = req.environ['nova.context']
76
filters = self._get_filters(req)
77
images = self._image_service.detail(context, filters)
78
images = common.limited(images, req)
79
builder = self.get_builder(req).build
80
return dict(images=[builder(image, detail=True) for image in images])
47
self._image_service = image_service or \
48
nova.image.get_default_image_service()
82
50
def _get_filters(self, req):
97
65
"""Return detailed information about a specific image.
99
67
:param req: `wsgi.Request` object
100
:param id: Image identifier (integer)
68
:param id: Image identifier
102
70
context = req.environ['nova.context']
73
image = self._image_service.show(context, id)
74
except (exception.NotFound, exception.InvalidImageRef):
107
75
explanation = _("Image not found.")
108
76
raise faults.Fault(webob.exc.HTTPNotFound(explanation=explanation))
111
image = self._image_service.show(context, image_id)
112
except exception.NotFound:
113
explanation = _("Image '%d' not found.") % (image_id)
114
raise faults.Fault(webob.exc.HTTPNotFound(explanation=explanation))
116
78
return dict(image=self.get_builder(req).build(image, detail=True))
118
80
def delete(self, req, id):
121
83
:param req: `wsgi.Request` object
122
84
:param id: Image identifier (integer)
125
86
context = req.environ['nova.context']
126
self._image_service.delete(context, image_id)
87
self._image_service.delete(context, id)
127
88
return webob.exc.HTTPNoContent()
129
def create(self, req):
90
def create(self, req, body):
130
91
"""Snapshot a server instance and save the image.
132
93
:param req: `wsgi.Request` object
134
95
context = req.environ['nova.context']
135
96
content_type = req.get_content_type()
136
image = self._deserialize(req.body, content_type)
139
99
raise webob.exc.HTTPBadRequest()
142
server_id = image["image"]["serverId"]
143
image_name = image["image"]["name"]
102
server_id = self._server_id_from_req_data(body)
103
image_name = body["image"]["name"]
145
105
raise webob.exc.HTTPBadRequest()
151
111
"""Indicates that you must use a Controller subclass."""
152
112
raise NotImplementedError
114
def _server_id_from_req_data(self, data):
115
raise NotImplementedError()
155
118
class ControllerV10(Controller):
156
119
"""Version 1.0 specific controller logic."""
160
123
base_url = request.application_url
161
124
return images_view.ViewBuilderV10(base_url)
126
def index(self, req):
127
"""Return an index listing of images available to the request.
129
:param req: `wsgi.Request` object
132
context = req.environ['nova.context']
133
filters = self._get_filters(req)
134
images = self._image_service.index(context, filters)
135
images = common.limited(images, req)
136
builder = self.get_builder(req).build
137
return dict(images=[builder(image, detail=False) for image in images])
139
def detail(self, req):
140
"""Return a detailed index listing of images available to the request.
142
:param req: `wsgi.Request` object.
145
context = req.environ['nova.context']
146
filters = self._get_filters(req)
147
images = self._image_service.detail(context, filters)
148
images = common.limited(images, req)
149
builder = self.get_builder(req).build
150
return dict(images=[builder(image, detail=True) for image in images])
152
def _server_id_from_req_data(self, data):
153
return data['image']['serverId']
164
156
class ControllerV11(Controller):
165
157
"""Version 1.1 specific controller logic."""
169
161
base_url = request.application_url
170
162
return images_view.ViewBuilderV11(base_url)
172
def get_default_xmlns(self, req):
173
return common.XML_NS_V11
164
def index(self, req):
165
"""Return an index listing of images available to the request.
167
:param req: `wsgi.Request` object
170
context = req.environ['nova.context']
171
filters = self._get_filters(req)
172
(marker, limit) = common.get_pagination_params(req)
173
images = self._image_service.index(
174
context, filters=filters, marker=marker, limit=limit)
175
builder = self.get_builder(req).build
176
return dict(images=[builder(image, detail=False) for image in images])
178
def detail(self, req):
179
"""Return a detailed index listing of images available to the request.
181
:param req: `wsgi.Request` object.
184
context = req.environ['nova.context']
185
filters = self._get_filters(req)
186
(marker, limit) = common.get_pagination_params(req)
187
images = self._image_service.detail(
188
context, filters=filters, marker=marker, limit=limit)
189
builder = self.get_builder(req).build
190
return dict(images=[builder(image, detail=True) for image in images])
192
def _server_id_from_req_data(self, data):
193
return data['image']['serverRef']
196
def create_resource(version='1.0'):
198
'1.0': ControllerV10,
199
'1.1': ControllerV11,
203
'1.0': wsgi.XMLNS_V10,
204
'1.1': wsgi.XMLNS_V11,
209
"image": ["id", "name", "updated", "created", "status",
210
"serverId", "progress", "serverRef"],
211
"link": ["rel", "type", "href"],
216
'application/xml': wsgi.XMLDictSerializer(xmlns=xmlns,
220
return wsgi.Resource(controller, serializers=serializers)