author | Danek Duvall <danek.duvall@oracle.com> |
Mon, 20 Apr 2015 12:35:51 -0700 | |
branch | s11u2-sru |
changeset 4156 | 4b1def16fe9b |
child 5405 | 66fd59fecd68 |
permissions | -rw-r--r-- |
4156
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
1 |
Provide for HTTP Range requests in Glance API, and return correct 206 |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
2 |
Partial Content. |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
3 |
|
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
4 |
See community bugs: |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
5 |
https://bugs.launchpad.net/glance/+bug/1399851 |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
6 |
https://bugs.launchpad.net/glance/+bug/1417069 |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
7 |
|
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
8 |
--- glance-2014.2.2/glance/api/v2/image_data.py.~1~ 2015-02-05 07:19:44.000000000 -0800 |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
9 |
+++ glance-2014.2.2/glance/api/v2/image_data.py 2015-02-23 14:04:17.091921881 -0800 |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
10 |
@@ -199,6 +199,8 @@ class ResponseSerializer(wsgi.JSONRespon |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
11 |
|
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
12 |
def download(self, response, image): |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
13 |
offset, chunk_size = 0, None |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
14 |
+ |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
15 |
+ # Initially attempt to get "Content-Range" request |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
16 |
range_val = response.request.get_content_range() |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
17 |
|
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
18 |
if range_val: |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
19 |
@@ -210,6 +212,21 @@ class ResponseSerializer(wsgi.JSONRespon |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
20 |
if range_val.stop is not None: |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
21 |
chunk_size = range_val.stop - offset |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
22 |
|
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
23 |
+ # Return 206 Partial Content |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
24 |
+ response.status_int = 206 |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
25 |
+ else: |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
26 |
+ # Try for "Range" request header if ContentRange not present |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
27 |
+ range_obj = response.request.get_range() |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
28 |
+ if range_obj: |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
29 |
+ if range_obj.start is not None: |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
30 |
+ offset = range_obj.start |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
31 |
+ |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
32 |
+ if range_obj.end is not None: |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
33 |
+ chunk_size = range_obj.end - offset |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
34 |
+ |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
35 |
+ # Return 206 Partial Content |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
36 |
+ response.status_int = 206 |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
37 |
+ |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
38 |
response.headers['Content-Type'] = 'application/octet-stream' |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
39 |
|
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
40 |
try: |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
41 |
@@ -229,7 +246,9 @@ class ResponseSerializer(wsgi.JSONRespon |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
42 |
response.headers['Content-MD5'] = image.checksum |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
43 |
#NOTE(markwash): "response.app_iter = ..." also erroneously resets the |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
44 |
# content-length |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
45 |
- response.headers['Content-Length'] = str(image.size) |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
46 |
+ # NOTE(mattk): Should be set to chunk_size or image.size |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
47 |
+ response.headers['Content-Length'] = \ |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
48 |
+ str(chunk_size) if chunk_size != 0 else str(image.size) |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
49 |
|
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
50 |
def upload(self, response, result): |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
51 |
response.status_int = 204 |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
52 |
--- glance-2014.2.2/glance/common/wsgi.py.~1~ 2015-02-05 07:19:44.000000000 -0800 |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
53 |
+++ glance-2014.2.2/glance/common/wsgi.py 2015-02-23 14:04:17.092284573 -0800 |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
54 |
@@ -556,7 +556,7 @@ class Request(webob.Request): |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
55 |
return self.accept_language.best_match(langs) |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
56 |
|
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
57 |
def get_content_range(self): |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
58 |
- """Return the `Range` in a request.""" |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
59 |
+ """Return the `Content-Range` in a request.""" |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
60 |
range_str = self.headers.get('Content-Range') |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
61 |
if range_str is not None: |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
62 |
range_ = webob.byterange.ContentRange.parse(range_str) |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
63 |
@@ -565,6 +565,16 @@ class Request(webob.Request): |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
64 |
raise webob.exc.HTTPBadRequest(explanation=msg) |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
65 |
return range_ |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
66 |
|
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
67 |
+ def get_range(self): |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
68 |
+ """Return the 'Range' in a reqyest.""" |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
69 |
+ range_str = self.headers.get('Range') |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
70 |
+ if range_str is not None: |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
71 |
+ range_ = webob.byterange.Range.parse(range_str) |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
72 |
+ if range_ is None: |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
73 |
+ msg = _('Malformed Range header: %s') % range_str |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
74 |
+ raise webob.exc.HTTPBadRequest(explanation=msg) |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
75 |
+ return range_ |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
76 |
+ |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
77 |
|
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
78 |
class JSONRequestDeserializer(object): |
4b1def16fe9b
PSARC 2015/110 OpenStack service updates for Juno
Danek Duvall <danek.duvall@oracle.com>
parents:
diff
changeset
|
79 |
def has_body(self, request): |