Fix 500 error from image-stage call

Adds a RequestDeserializer for the stage and adjusts the image
status transitions so that they can handle the 'uploading' status
of an image with data in the stage.

Closes-bug: #1710958

Change-Id: I6f1cfe44a01542bc93a43cbd518956686adb366d
(cherry picked from commit e17a349306)
This commit is contained in:
Brian Rosmaita 2017-08-15 19:14:22 -04:00
parent 3a281182c6
commit beb3e98445
3 changed files with 22 additions and 3 deletions

View File

@ -276,7 +276,7 @@ class ImageDataController(object):
# NOTE(jokke): this is horrible way to do it but as long as
# glance_store is in a shape it is, the only way. Don't hold me
# accountable for it.
def _build_staging_store(self):
def _build_staging_store():
conf = cfg.ConfigOpts()
backend.register_opts(conf)
conf.set_override('filesystem_store_datadir',
@ -374,6 +374,21 @@ class RequestDeserializer(wsgi.JSONRequestDeserializer):
image_size = request.content_length or None
return {'size': image_size, 'data': request.body_file}
def stage(self, request):
if not CONF.enable_image_import:
msg = _("Image import is not supported at this site.")
raise webob.exc.HTTPNotFound(explanation=msg)
try:
request.get_content_type(('application/octet-stream',))
except exception.InvalidContentType as e:
raise webob.exc.HTTPUnsupportedMediaType(explanation=e.msg)
if self.is_valid_encoding(request) and self.is_valid_method(request):
request.is_body_readable = True
image_size = request.content_length or None
return {'size': image_size, 'data': request.body_file}
class ResponseSerializer(wsgi.JSONResponseSerializer):
@ -460,6 +475,9 @@ class ResponseSerializer(wsgi.JSONResponseSerializer):
def upload(self, response, result):
response.status_int = 204
def stage(self, response, result):
response.status_int = 204
def create_resource():
"""Image data resource factory method"""

View File

@ -61,7 +61,7 @@ LOG = logging.getLogger(__name__)
STATUSES = ['active', 'saving', 'queued', 'killed', 'pending_delete',
'deleted', 'deactivated']
'deleted', 'deactivated', 'importing', 'uploading']
CONF = cfg.CONF
CONF.import_group("profiler", "glance.common.wsgi")

View File

@ -101,8 +101,9 @@ class Image(object):
# NOTE(flwang): In v2, we are deprecating the 'killed' status, so it's
# allowed to restore image from 'saving' to 'queued' so that upload
# can be retried.
'queued': ('saving', 'importing', 'active', 'deleted'),
'queued': ('saving', 'uploading', 'importing', 'active', 'deleted'),
'saving': ('active', 'killed', 'deleted', 'queued'),
'uploading': ('importing', 'queued', 'deleted'),
'importing': ('active', 'deleted', 'queued'),
'active': ('pending_delete', 'deleted', 'deactivated'),
'killed': ('deleted',),