py3: make swift_middleware as py3 compatible
Change-Id: Ia1790e50e0029f31767b8eebe4985532e5885543
This commit is contained in:
parent
d5a038f4ac
commit
2fc038973b
@ -13,7 +13,7 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
import urllib
|
||||
from six.moves.urllib.parse import unquote
|
||||
from swift.common.internal_client import InternalClient
|
||||
from swift.common.swob import HTTPBadRequest, Response, Range
|
||||
from swift.common.utils import config_true_value
|
||||
@ -378,7 +378,7 @@ class StorletBaseHandler(object):
|
||||
for param in self.request.headers:
|
||||
if param.lower().startswith('x-storlet-parameter'):
|
||||
keyvalue = self.request.headers[param]
|
||||
keyvalue = urllib.unquote(keyvalue)
|
||||
keyvalue = unquote(keyvalue)
|
||||
key, value = keyvalue.split(':', 1)
|
||||
parameters[key] = value
|
||||
self.request.params.update(parameters)
|
||||
|
@ -95,7 +95,7 @@ class StorletObjectHandler(StorletBaseHandler):
|
||||
# The HTTP Range header is not allowed
|
||||
if self.is_range_request and not self.is_storlet_range_request:
|
||||
raise HTTPRequestedRangeNotSatisfiable(
|
||||
'Storlet execution with range header is not supported',
|
||||
b'Storlet execution with range header is not supported',
|
||||
request=self.request)
|
||||
|
||||
orig_resp = self.request.get_response(self.app)
|
||||
|
@ -67,7 +67,7 @@ class StorletProxyHandler(StorletBaseHandler):
|
||||
if not config_true_value(storlets_enabled):
|
||||
msg = 'Account disabled for storlets'
|
||||
self.logger.debug(msg)
|
||||
raise HTTPBadRequest(msg, request=self.request)
|
||||
raise HTTPBadRequest(msg.encode('utf8'), request=self.request)
|
||||
|
||||
if self.is_storlet_acl_update:
|
||||
self.acl_string = self._validate_acl_update(self.request)
|
||||
@ -88,7 +88,7 @@ class StorletProxyHandler(StorletBaseHandler):
|
||||
if request.referer and REFERER_PREFIX in request.referer:
|
||||
msg = 'Referrer containing %s is not allowed' % REFERER_PREFIX
|
||||
self.logger.debug(msg)
|
||||
raise HTTPForbidden(msg, request=self.request)
|
||||
raise HTTPForbidden(msg.encode('utf8'), request=self.request)
|
||||
|
||||
def _parse_vaco(self):
|
||||
return self.request.split_path(3, 4, rest_with_last=True)
|
||||
@ -164,7 +164,7 @@ class StorletProxyHandler(StorletBaseHandler):
|
||||
params, self.obj)
|
||||
except ValueError as e:
|
||||
self.logger.exception('Bad parameter')
|
||||
raise HTTPBadRequest(e.message)
|
||||
raise HTTPBadRequest(e.args[0].encode('utf8'))
|
||||
|
||||
def _build_acl_string(self, user, storlet):
|
||||
acl_string = '%s.%s_%s' % (REFERER_PREFIX, user, storlet)
|
||||
@ -181,14 +181,14 @@ class StorletProxyHandler(StorletBaseHandler):
|
||||
"""
|
||||
# Make sure we are not meddling with the storlet containers
|
||||
if self.container in self.storlet_containers:
|
||||
msg = 'storlet ACL update cannot be a storlet container'
|
||||
msg = b'storlet ACL update cannot be a storlet container'
|
||||
raise HTTPBadRequest(msg)
|
||||
|
||||
# Make sure the expected headers are supplied
|
||||
user_name = req.headers.get("X-Storlet-Container-Read", None)
|
||||
storlet_name = req.headers.get("X-Storlet-Name", None)
|
||||
if not user_name or not storlet_name:
|
||||
msg = 'storlet ACL update request is missing a mandatory header'
|
||||
msg = b'storlet ACL update request is missing a mandatory header'
|
||||
raise HTTPBadRequest(msg)
|
||||
|
||||
# Make sure the resulting acl is valid
|
||||
@ -198,13 +198,13 @@ class StorletProxyHandler(StorletBaseHandler):
|
||||
except ValueError as e:
|
||||
msg = ('storlet ACL update request has invalid values %s'
|
||||
% e.message)
|
||||
raise HTTPBadRequest(msg)
|
||||
raise HTTPBadRequest(msg.encode('utf8'))
|
||||
|
||||
# Make sure the resulting acl permits a single entity
|
||||
if ',' in acl_string:
|
||||
msg = ('storlet ACL update request has '
|
||||
'mulformed storlet or user name')
|
||||
raise HTTPBadRequest(msg)
|
||||
msg = 'storlet ACL update request has ' \
|
||||
'mulformed storlet or user name'
|
||||
raise HTTPBadRequest(msg.encode('utf8'))
|
||||
|
||||
# The request is valid. Keep the ACL string
|
||||
return acl_string
|
||||
@ -222,12 +222,12 @@ class StorletProxyHandler(StorletBaseHandler):
|
||||
self.logger.debug('Verify access to %s' % spath)
|
||||
|
||||
new_env = dict(self.request.environ)
|
||||
if 'HTTP_TRANSFER_ENCODING' in new_env.keys():
|
||||
if 'HTTP_TRANSFER_ENCODING' in new_env:
|
||||
del new_env['HTTP_TRANSFER_ENCODING']
|
||||
|
||||
for key in CONDITIONAL_KEYS:
|
||||
env_key = 'HTTP_' + key
|
||||
if env_key in new_env.keys():
|
||||
if env_key in new_env:
|
||||
del new_env[env_key]
|
||||
|
||||
auth_token = self.request.headers.get('X-Auth-Token')
|
||||
@ -238,10 +238,11 @@ class StorletProxyHandler(StorletBaseHandler):
|
||||
|
||||
resp = storlet_req.get_response(self.app)
|
||||
if not resp.is_success:
|
||||
raise HTTPUnauthorized('Failed to verify access to the storlet. '
|
||||
'Either the storlet does not exist or '
|
||||
'you are not authorized to run the '
|
||||
'storlet.',
|
||||
msg = 'Failed to verify access to the storlet. ' \
|
||||
'Either the storlet does not exist or ' \
|
||||
'you are not authorized to run the ' \
|
||||
'storlet.'
|
||||
raise HTTPUnauthorized(msg.encode('utf8'),
|
||||
request=self.request)
|
||||
|
||||
params = self._parse_storlet_params(resp.headers)
|
||||
@ -313,8 +314,9 @@ class StorletProxyHandler(StorletBaseHandler):
|
||||
GET handler on Proxy
|
||||
"""
|
||||
if self.is_range_request:
|
||||
raise HTTPBadRequest('Storlet execution with range header is not'
|
||||
' supported', request=self.request)
|
||||
msg = 'Storlet execution with range header is not supported'
|
||||
raise HTTPBadRequest(msg.encode('utf8'),
|
||||
request=self.request)
|
||||
|
||||
params = self.verify_access_to_storlet()
|
||||
self.augment_storlet_request(params)
|
||||
@ -341,7 +343,7 @@ class StorletProxyHandler(StorletBaseHandler):
|
||||
# The requester is not even an authenticated user.
|
||||
self.logger.info(('Storlet run request by an'
|
||||
' authenticated user'))
|
||||
raise HTTPUnauthorized('User is not authorized')
|
||||
raise HTTPUnauthorized(b'User is not authorized')
|
||||
|
||||
user_name = self.request.environ['HTTP_X_USER_NAME']
|
||||
storlet_name = self.request.headers['X-Run-Storlet']
|
||||
@ -394,9 +396,8 @@ class StorletProxyHandler(StorletBaseHandler):
|
||||
|
||||
for header in unsupported_headers:
|
||||
if header in self.request.headers:
|
||||
raise HTTPBadRequest(
|
||||
'Storlet on copy with %s is not supported' %
|
||||
header)
|
||||
msg = 'Storlet on copy with %s is not supported' % header
|
||||
raise HTTPBadRequest(msg.encode('utf8'))
|
||||
|
||||
def handle_put_copy_response(self, app_iter):
|
||||
self._remove_storlet_headers(self.request.headers)
|
||||
@ -408,7 +409,7 @@ class StorletProxyHandler(StorletBaseHandler):
|
||||
return self.request.get_response(self.app)
|
||||
|
||||
def _remove_storlet_headers(self, headers):
|
||||
for key in headers.keys():
|
||||
for key in list(headers):
|
||||
if (key.startswith('X-Storlet-') or
|
||||
key.startswith('X-Object-Meta-Storlet') or
|
||||
key == 'X-Run-Storlet'):
|
||||
@ -489,7 +490,7 @@ class StorletProxyHandler(StorletBaseHandler):
|
||||
|
||||
# TODO(takashi): chunk size should be configurable
|
||||
reader = self.request.environ['wsgi.input'].read
|
||||
body_iter = iter(lambda: reader(65536), '')
|
||||
body_iter = iter(lambda: reader(65536), b'')
|
||||
sreq = self._build_storlet_request(
|
||||
self.request, self.request.headers, body_iter)
|
||||
|
||||
|
@ -65,10 +65,10 @@ class TestStorletMiddlewareObject(BaseTestStorletMiddleware):
|
||||
req = Request.blank(
|
||||
path, environ={'REQUEST_METHOD': 'GET'},
|
||||
headers={'X-Backend-Storlet-Policy-Index': '0'})
|
||||
self.base_app.register('GET', path, HTTPOk, body='FAKE APP')
|
||||
self.base_app.register('GET', path, HTTPOk, body=b'FAKE APP')
|
||||
resp = self.get_response(req)
|
||||
self.assertEqual('200 OK', resp.status)
|
||||
self.assertEqual('FAKE APP', resp.body)
|
||||
self.assertEqual(b'FAKE APP', resp.body)
|
||||
self.base_app.reset_all()
|
||||
|
||||
for target in ('/sda1/p/AUTH_a', '/sda1/p/AUTH_a/c',
|
||||
@ -77,7 +77,7 @@ class TestStorletMiddlewareObject(BaseTestStorletMiddleware):
|
||||
|
||||
def test_GET_with_storlets(self):
|
||||
target = '/sda1/p/AUTH_a/c/o'
|
||||
self.base_app.register('GET', target, HTTPOk, body='FAKE APP')
|
||||
self.base_app.register('GET', target, HTTPOk, body=b'FAKE APP')
|
||||
|
||||
req = Request.blank(
|
||||
target, environ={'REQUEST_METHOD': 'GET'},
|
||||
@ -85,11 +85,11 @@ class TestStorletMiddlewareObject(BaseTestStorletMiddleware):
|
||||
'X-Run-Storlet': 'Storlet-1.0.jar'})
|
||||
resp = self.get_response(req)
|
||||
self.assertEqual('200 OK', resp.status)
|
||||
self.assertEqual('FAKE APP', resp.body)
|
||||
self.assertEqual(b'FAKE APP', resp.body)
|
||||
|
||||
def test_GET_with_storlets_and_http_range(self):
|
||||
target = '/sda1/p/AUTH_a/c/o'
|
||||
self.base_app.register('GET', target, HTTPOk, body='FAKE APP')
|
||||
self.base_app.register('GET', target, HTTPOk, body=b'FAKE APP')
|
||||
|
||||
req = Request.blank(
|
||||
target, environ={'REQUEST_METHOD': 'GET'},
|
||||
@ -102,7 +102,7 @@ class TestStorletMiddlewareObject(BaseTestStorletMiddleware):
|
||||
|
||||
def test_GET_with_storlets_and_storlet_range(self):
|
||||
target = '/sda1/p/AUTH_a/c/o'
|
||||
self.base_app.register('GET', target, HTTPOk, body='FAKE APP')
|
||||
self.base_app.register('GET', target, HTTPOk, body=b'FAKE APP')
|
||||
|
||||
req = Request.blank(
|
||||
target, environ={'REQUEST_METHOD': 'GET'},
|
||||
@ -112,13 +112,13 @@ class TestStorletMiddlewareObject(BaseTestStorletMiddleware):
|
||||
'Range': 'bytes=1-6'})
|
||||
resp = self.get_response(req)
|
||||
self.assertEqual('200 OK', resp.status)
|
||||
self.assertEqual('AKE AP', resp.body)
|
||||
self.assertEqual(b'AKE AP', resp.body)
|
||||
self.assertEqual('bytes 1-6/8',
|
||||
resp.headers.get('Storlet-Input-Range'))
|
||||
|
||||
def test_GET_with_storlets_and_storlet_proxy_range(self):
|
||||
target = '/sda1/p/AUTH_a/c/o'
|
||||
self.base_app.register('GET', target, HTTPOk, body='FAKE APP')
|
||||
self.base_app.register('GET', target, HTTPOk, body=b'FAKE APP')
|
||||
|
||||
req = Request.blank(
|
||||
target, environ={'REQUEST_METHOD': 'GET'},
|
||||
@ -129,7 +129,7 @@ class TestStorletMiddlewareObject(BaseTestStorletMiddleware):
|
||||
'X-Storlet-Run-On-Proxy': ''})
|
||||
resp = self.get_response(req)
|
||||
self.assertEqual('206 Partial Content', resp.status)
|
||||
self.assertEqual('AKE AP', resp.body)
|
||||
self.assertEqual(b'AKE AP', resp.body)
|
||||
self.assertEqual('bytes 1-6/8',
|
||||
resp.headers.get('Content-Range'))
|
||||
|
||||
@ -137,7 +137,7 @@ class TestStorletMiddlewareObject(BaseTestStorletMiddleware):
|
||||
target = '/sda1/p/AUTH_a/c/o'
|
||||
self.base_app.register('GET', target, HTTPOk,
|
||||
headers={'X-Static-Large-Object': 'True'},
|
||||
body='FAKE MANIFEST')
|
||||
body=b'FAKE MANIFEST')
|
||||
|
||||
req = Request.blank(
|
||||
target, environ={'REQUEST_METHOD': 'GET'},
|
||||
@ -145,13 +145,13 @@ class TestStorletMiddlewareObject(BaseTestStorletMiddleware):
|
||||
'X-Run-Storlet': 'Storlet-1.0.jar'})
|
||||
resp = self.get_response(req)
|
||||
self.assertEqual('200 OK', resp.status)
|
||||
self.assertEqual('FAKE MANIFEST', resp.body)
|
||||
self.assertEqual(b'FAKE MANIFEST', resp.body)
|
||||
|
||||
def test_GET_slo_segment_with_storlets(self):
|
||||
target = '/sda1/p/AUTH_a/c/o'
|
||||
self.base_app.register('GET', target, HTTPOk,
|
||||
headers={'X-Static-Large-Object': 'True'},
|
||||
body='FAKE SEGMENT')
|
||||
body=b'FAKE SEGMENT')
|
||||
|
||||
req = Request.blank(
|
||||
target, environ={'REQUEST_METHOD': 'GET'},
|
||||
@ -160,7 +160,7 @@ class TestStorletMiddlewareObject(BaseTestStorletMiddleware):
|
||||
'X-Run-Storlet': 'Storlet-1.0.jar'})
|
||||
resp = self.get_response(req)
|
||||
self.assertEqual('200 OK', resp.status)
|
||||
self.assertEqual('FAKE SEGMENT', resp.body)
|
||||
self.assertEqual(b'FAKE SEGMENT', resp.body)
|
||||
|
||||
def test_storlets_with_invalid_method(self):
|
||||
target = '/sda1/p/AUTH_a/c/o'
|
||||
|
@ -53,16 +53,19 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
self.fail('Application loading got an error')
|
||||
|
||||
def get_request_response(self, target, method, headers=None, body=None):
|
||||
# Ensure the body is byte format on py3, this is needed until
|
||||
# swift's Request supports byte format body when body is None in args
|
||||
body = body or b''
|
||||
req = Request.blank(target, environ={'REQUEST_METHOD': method},
|
||||
headers=headers, body=body)
|
||||
return self.get_response(req)
|
||||
|
||||
def test_GET_without_storlets(self):
|
||||
def basic_get(path):
|
||||
self.base_app.register('GET', path, HTTPOk, body='FAKE APP')
|
||||
self.base_app.register('GET', path, HTTPOk, body=b'FAKE APP')
|
||||
resp = self.get_request_response(path, 'GET')
|
||||
self.assertEqual('200 OK', resp.status)
|
||||
self.assertEqual('FAKE APP', resp.body)
|
||||
self.assertEqual(b'FAKE APP', resp.body)
|
||||
self.base_app.reset_all()
|
||||
|
||||
for target in ('AUTH_a', 'AUTH_a/c', 'AUTH_a/c/o'):
|
||||
@ -72,17 +75,17 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
def test_GET_with_storlets(self):
|
||||
# TODO(takashi): decide request path based on config value
|
||||
target = '/v1/AUTH_a/c/o'
|
||||
self.base_app.register('GET', target, HTTPOk, body='FAKE RESULT')
|
||||
self.base_app.register('GET', target, HTTPOk, body=b'FAKE RESULT')
|
||||
storlet = '/v1/AUTH_a/storlet/Storlet-1.0.jar'
|
||||
self.base_app.register('GET', storlet, HTTPOk, headers={},
|
||||
body='jar binary')
|
||||
body=b'jar binary')
|
||||
|
||||
acc_info = {'meta': {'storlet-enabled': 'true'}}
|
||||
with fake_acc_info(acc_info):
|
||||
headers = {'X-Run-Storlet': 'Storlet-1.0.jar'}
|
||||
resp = self.get_request_response(target, 'GET', headers=headers)
|
||||
self.assertEqual('200 OK', resp.status)
|
||||
self.assertEqual('FAKE RESULT', resp.body)
|
||||
self.assertEqual(b'FAKE RESULT', resp.body)
|
||||
calls = self.base_app.get_calls()
|
||||
|
||||
# Make sure now we sent two requests to swift
|
||||
@ -112,7 +115,7 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
target = '/v1/AUTH_a/c/o'
|
||||
self.base_app.register('GET', target, HTTPNotFound)
|
||||
storlet = '/v1/AUTH_a/storlet/Storlet-1.0.jar'
|
||||
self.base_app.register('GET', storlet, HTTPOk, body='jar binary')
|
||||
self.base_app.register('GET', storlet, HTTPOk, body=b'jar binary')
|
||||
|
||||
with storlet_enabled():
|
||||
headers = {'X-Run-Storlet': 'Storlet-1.0.jar'}
|
||||
@ -133,9 +136,9 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
|
||||
def test_GET_with_storlets_and_storlet_range(self):
|
||||
target = '/v1/AUTH_a/c/o'
|
||||
self.base_app.register('GET', target, HTTPOk, body='FAKE APP')
|
||||
self.base_app.register('GET', target, HTTPOk, body=b'FAKE APP')
|
||||
storlet = '/v1/AUTH_a/storlet/Storlet-1.0.jar'
|
||||
self.base_app.register('GET', storlet, HTTPOk, body='jar binary')
|
||||
self.base_app.register('GET', storlet, HTTPOk, body=b'jar binary')
|
||||
|
||||
with storlet_enabled():
|
||||
req_range = 'bytes=1-6'
|
||||
@ -144,7 +147,7 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
'X-Storlet-Range': req_range}
|
||||
resp = self.get_request_response(target, 'GET', headers=headers)
|
||||
self.assertEqual('200 OK', resp.status)
|
||||
self.assertEqual('AKE AP', resp.body)
|
||||
self.assertEqual(b'AKE AP', resp.body)
|
||||
|
||||
self.assertNotIn('Content-Range', resp.headers)
|
||||
self.assertEqual('bytes 1-6/8',
|
||||
@ -158,9 +161,9 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
# Create a single range request that needs to be
|
||||
# processed by the object handler
|
||||
target = '/v1/AUTH_a/c/o'
|
||||
self.base_app.register('GET', target, HTTPOk, body='FAKE APP')
|
||||
self.base_app.register('GET', target, HTTPOk, body=b'FAKE APP')
|
||||
storlet = '/v1/AUTH_a/storlet/Storlet-1.0.jar'
|
||||
self.base_app.register('GET', storlet, HTTPOk, body='jar binary')
|
||||
self.base_app.register('GET', storlet, HTTPOk, body=b'jar binary')
|
||||
|
||||
with storlet_enabled():
|
||||
req_range = 'bytes=1-6'
|
||||
@ -170,22 +173,22 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
# We assert that nothing actually happens
|
||||
# by the proxy handler
|
||||
self.assertEqual('200 OK', resp.status)
|
||||
self.assertEqual('FAKE APP', resp.body)
|
||||
self.assertEqual(b'FAKE APP', resp.body)
|
||||
|
||||
def test_GET_with_storlets_and_extra_resourece(self):
|
||||
target = '/v1/AUTH_a/c/o'
|
||||
self.base_app.register('GET', target, HTTPOk, body='FAKE APP')
|
||||
self.base_app.register('GET', target, HTTPOk, body=b'FAKE APP')
|
||||
extra_target = '/v1/AUTH_a/c2/o2'
|
||||
self.base_app.register('GET', extra_target, HTTPOk, body='Whooa')
|
||||
self.base_app.register('GET', extra_target, HTTPOk, body=b'Whooa')
|
||||
storlet = '/v1/AUTH_a/storlet/Storlet-1.0.jar'
|
||||
self.base_app.register('GET', storlet, HTTPOk, body='jar binary')
|
||||
self.base_app.register('GET', storlet, HTTPOk, body=b'jar binary')
|
||||
|
||||
with storlet_enabled():
|
||||
headers = {'X-Run-Storlet': 'Storlet-1.0.jar',
|
||||
'X-Storlet-Extra-Resources': '/c2/o2'}
|
||||
resp = self.get_request_response(target, 'GET', headers=headers)
|
||||
self.assertEqual('200 OK', resp.status)
|
||||
self.assertEqual('FAKE APP', resp.body)
|
||||
self.assertEqual(b'FAKE APP', resp.body)
|
||||
|
||||
# GET target called
|
||||
self.assertTrue(any(self.base_app.get_calls('GET', target)))
|
||||
@ -196,23 +199,23 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
target = '/v1/AUTH_a/c/slo_manifest'
|
||||
self.base_app.register('GET', target, HTTPOk,
|
||||
headers={'x-static-large-object': 'True'},
|
||||
body='FAKE APP')
|
||||
body=b'FAKE APP')
|
||||
resp = self.get_request_response(target, 'GET')
|
||||
self.assertEqual('FAKE APP', resp.body)
|
||||
self.assertEqual(b'FAKE APP', resp.body)
|
||||
|
||||
def test_GET_slo_with_storlets(self):
|
||||
target = '/v1/AUTH_a/c/slo_manifest'
|
||||
self.base_app.register('GET', target, HTTPOk,
|
||||
headers={'x-static-large-object': 'True'},
|
||||
body='FAKE APP')
|
||||
body=b'FAKE APP')
|
||||
storlet = '/v1/AUTH_a/storlet/Storlet-1.0.jar'
|
||||
self.base_app.register('GET', storlet, HTTPOk, body='jar binary')
|
||||
self.base_app.register('GET', storlet, HTTPOk, body=b'jar binary')
|
||||
|
||||
with storlet_enabled():
|
||||
headers = {'X-Run-Storlet': 'Storlet-1.0.jar'}
|
||||
resp = self.get_request_response(target, 'GET', headers=headers)
|
||||
self.assertEqual('200 OK', resp.status)
|
||||
self.assertEqual('FAKE APP', resp.body)
|
||||
self.assertEqual(b'FAKE APP', resp.body)
|
||||
|
||||
calls = self.base_app.get_calls()
|
||||
self.assertEqual(2, len(calls))
|
||||
@ -220,12 +223,12 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
def test_GET_with_storlets_no_object(self):
|
||||
target = '/v1/AUTH_a/c/'
|
||||
self.base_app.register('GET', target, HTTPOk,
|
||||
body='FAKE APP')
|
||||
body=b'FAKE APP')
|
||||
with storlet_enabled():
|
||||
headers = {'X-Run-Storlet': 'Storlet-1.0.jar'}
|
||||
resp = self.get_request_response(target, 'GET', headers=headers)
|
||||
self.assertEqual('200 OK', resp.status)
|
||||
self.assertEqual('FAKE APP', resp.body)
|
||||
self.assertEqual(b'FAKE APP', resp.body)
|
||||
|
||||
# Make sure now we sent one request to swift
|
||||
# that is, storlets path was not executed
|
||||
@ -246,14 +249,14 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
|
||||
def test_PUT_with_storlets(self):
|
||||
target = '/v1/AUTH_a/c/o'
|
||||
self.base_app.register('PUT', target, HTTPCreated)
|
||||
self.base_app.register('PUT', target, HTTPCreated, body=b'')
|
||||
storlet = '/v1/AUTH_a/storlet/Storlet-1.0.jar'
|
||||
self.base_app.register('GET', storlet, HTTPOk, body='jar binary')
|
||||
self.base_app.register('GET', storlet, HTTPOk, body=b'jar binary')
|
||||
|
||||
with storlet_enabled():
|
||||
headers = {'X-Run-Storlet': 'Storlet-1.0.jar'}
|
||||
resp = self.get_request_response(target, 'PUT', headers=headers,
|
||||
body='FAKE APP')
|
||||
body=b'FAKE APP')
|
||||
self.assertEqual('201 Created', resp.status)
|
||||
|
||||
calls = self.base_app.get_calls()
|
||||
@ -267,7 +270,7 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
# The last one is PUT request about processed object
|
||||
self.assertEqual('PUT', calls[-1][0])
|
||||
self.assertEqual(target, calls[-1][1])
|
||||
self.assertEqual('FAKE APP', calls[-1][3])
|
||||
self.assertEqual(b'FAKE APP', calls[-1][3])
|
||||
|
||||
def test_PUT_with_storlets_no_object(self):
|
||||
target = '/v1/AUTH_a/c/'
|
||||
@ -275,7 +278,7 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
with storlet_enabled():
|
||||
headers = {'X-Run-Storlet': 'Storlet-1.0.jar'}
|
||||
resp = self.get_request_response(target, 'PUT', headers=headers,
|
||||
body='FAKE APP')
|
||||
body=b'FAKE APP')
|
||||
self.assertEqual('201 Created', resp.status)
|
||||
|
||||
calls = self.base_app.get_calls()
|
||||
@ -300,10 +303,10 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
copy_from = 'c/so'
|
||||
self.base_app.register('GET', source, HTTPOk,
|
||||
headers={'x-object-meta-name': 'name'},
|
||||
body='source body')
|
||||
body=b'source body')
|
||||
self.base_app.register('PUT', target, HTTPCreated)
|
||||
storlet = '/v1/AUTH_a/storlet/Storlet-1.0.jar'
|
||||
self.base_app.register('GET', storlet, HTTPOk, body='jar binary')
|
||||
self.base_app.register('GET', storlet, HTTPOk, body=b'jar binary')
|
||||
|
||||
with storlet_enabled():
|
||||
headers = {'X-Copy-From': copy_from,
|
||||
@ -313,12 +316,12 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
self.assertEqual('201 Created', resp.status)
|
||||
get_calls = self.base_app.get_calls('GET', source)
|
||||
self.assertEqual(1, len(get_calls))
|
||||
self.assertEqual('', get_calls[-1][3])
|
||||
self.assertEqual(b'', get_calls[-1][3])
|
||||
self.assertEqual(source, get_calls[-1][1])
|
||||
self.assertIn('X-Run-Storlet', get_calls[-1][2])
|
||||
put_calls = self.base_app.get_calls('PUT', target)
|
||||
self.assertEqual(1, len(put_calls))
|
||||
self.assertEqual('source body', put_calls[-1][3])
|
||||
self.assertEqual(b'source body', put_calls[-1][3])
|
||||
self.assertIn('X-Object-Meta-Name', dict(put_calls[-1][2]))
|
||||
self.assertEqual('name', put_calls[-1][2]['X-Object-Meta-Name'])
|
||||
self.assertNotIn('X-Run-Storlet', put_calls[-1][2])
|
||||
@ -332,10 +335,10 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
copy_from = 'c/so'
|
||||
self.base_app.register('GET', source, HTTPOk,
|
||||
headers={'x-object-meta-name': 'name'},
|
||||
body='source body')
|
||||
body=b'source body')
|
||||
self.base_app.register('PUT', target, HTTPCreated)
|
||||
storlet = '/v1/AUTH_a/storlet/Storlet-1.0.jar'
|
||||
self.base_app.register('GET', storlet, HTTPOk, body='jar binary')
|
||||
self.base_app.register('GET', storlet, HTTPOk, body=b'jar binary')
|
||||
|
||||
with storlet_enabled():
|
||||
headers = {'X-Copy-From': copy_from,
|
||||
@ -346,12 +349,12 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
self.assertEqual('201 Created', resp.status)
|
||||
get_calls = self.base_app.get_calls('GET', source)
|
||||
self.assertEqual(1, len(get_calls))
|
||||
self.assertEqual('', get_calls[-1][3])
|
||||
self.assertEqual(b'', get_calls[-1][3])
|
||||
self.assertEqual(source, get_calls[-1][1])
|
||||
self.assertNotIn('X-Run-Storlet', get_calls[-1][2])
|
||||
put_calls = self.base_app.get_calls('PUT', target)
|
||||
self.assertEqual(1, len(put_calls))
|
||||
self.assertEqual('source body', put_calls[-1][3])
|
||||
self.assertEqual(b'source body', put_calls[-1][3])
|
||||
self.assertIn('X-Object-Meta-Name', dict(put_calls[-1][2]))
|
||||
self.assertEqual('name', put_calls[-1][2]['X-Object-Meta-Name'])
|
||||
self.assertNotIn('X-Run-Storlet', put_calls[-1][2])
|
||||
@ -378,10 +381,10 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
destination = 'c/to'
|
||||
self.base_app.register('GET', source, HTTPOk,
|
||||
headers={'x-object-meta-name': 'name'},
|
||||
body='source body')
|
||||
body=b'source body')
|
||||
self.base_app.register('PUT', target, HTTPCreated)
|
||||
storlet = '/v1/AUTH_a/storlet/Storlet-1.0.jar'
|
||||
self.base_app.register('GET', storlet, HTTPOk, body='jar binary')
|
||||
self.base_app.register('GET', storlet, HTTPOk, body=b'jar binary')
|
||||
|
||||
with storlet_enabled():
|
||||
headers = {'Destination': destination,
|
||||
@ -391,12 +394,12 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
self.assertEqual('201 Created', resp.status)
|
||||
get_calls = self.base_app.get_calls('GET', source)
|
||||
self.assertEqual(1, len(get_calls))
|
||||
self.assertEqual('', get_calls[-1][3])
|
||||
self.assertEqual(b'', get_calls[-1][3])
|
||||
self.assertEqual(source, get_calls[-1][1])
|
||||
self.assertIn('X-Run-Storlet', get_calls[-1][2])
|
||||
put_calls = self.base_app.get_calls('PUT', target)
|
||||
self.assertEqual(1, len(put_calls))
|
||||
self.assertEqual('source body', put_calls[-1][3])
|
||||
self.assertEqual(b'source body', put_calls[-1][3])
|
||||
self.assertEqual('name', put_calls[-1][2]['X-Object-Meta-Name'])
|
||||
self.assertNotIn('X-Run-Storlet', put_calls[-1][2])
|
||||
# no invocation at proxy
|
||||
@ -409,10 +412,10 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
destination = 'c/to'
|
||||
self.base_app.register('GET', source, HTTPOk,
|
||||
headers={'x-object-meta-name': 'name'},
|
||||
body='source body')
|
||||
body=b'source body')
|
||||
self.base_app.register('PUT', target, HTTPCreated)
|
||||
storlet = '/v1/AUTH_a/storlet/Storlet-1.0.jar'
|
||||
self.base_app.register('GET', storlet, HTTPOk, body='jar binary')
|
||||
self.base_app.register('GET', storlet, HTTPOk, body=b'jar binary')
|
||||
|
||||
with storlet_enabled():
|
||||
headers = {'Destination': destination,
|
||||
@ -423,12 +426,12 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
self.assertEqual('201 Created', resp.status)
|
||||
get_calls = self.base_app.get_calls('GET', source)
|
||||
self.assertEqual(1, len(get_calls))
|
||||
self.assertEqual('', get_calls[-1][3])
|
||||
self.assertEqual(b'', get_calls[-1][3])
|
||||
self.assertEqual(source, get_calls[-1][1])
|
||||
self.assertNotIn('X-Run-Storlet', get_calls[-1][2])
|
||||
put_calls = self.base_app.get_calls('PUT', target)
|
||||
self.assertEqual(1, len(put_calls))
|
||||
self.assertEqual('source body', put_calls[-1][3])
|
||||
self.assertEqual(b'source body', put_calls[-1][3])
|
||||
self.assertEqual('name', put_calls[-1][2]['X-Object-Meta-Name'])
|
||||
self.assertNotIn('X-Run-Storlet', put_calls[-1][2])
|
||||
# no invocation at proxy
|
||||
@ -441,7 +444,7 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
def test_copy_with_unsupported_headers(self):
|
||||
target = '/v1/AUTH_a/c/o'
|
||||
storlet = '/v1/AUTH_a/storlet/Storlet-1.0.jar'
|
||||
self.base_app.register('GET', storlet, HTTPOk, body='jar binary')
|
||||
self.base_app.register('GET', storlet, HTTPOk, body=b'jar binary')
|
||||
|
||||
def copy_400(method, copy_header):
|
||||
base_headers = {'X-Run-Storlet': 'Storlet-1.0.jar',
|
||||
@ -523,12 +526,12 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
'X-Object-Meta-Storlet-Main':
|
||||
'org.openstack.storlet.Storlet'}
|
||||
self.base_app.register('GET', target, HTTPOk, headers=sheaders,
|
||||
body='jar binary')
|
||||
body=b'jar binary')
|
||||
|
||||
with storlet_enabled():
|
||||
resp = self.get_request_response(target, 'GET')
|
||||
self.assertEqual('200 OK', resp.status)
|
||||
self.assertEqual('jar binary', resp.body)
|
||||
self.assertEqual(b'jar binary', resp.body)
|
||||
for key in sheaders:
|
||||
self.assertEqual(sheaders[key], resp.headers.get(key))
|
||||
|
||||
@ -557,12 +560,12 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
sheaders = {'X-Object-Meta-Storlet-Dependency-Version': '1',
|
||||
'X-Object-Meta-Storlet-Dependency-Permissions': '0755'}
|
||||
self.base_app.register('GET', target, HTTPOk, headers=sheaders,
|
||||
body='FAKE APP')
|
||||
body=b'FAKE APP')
|
||||
|
||||
with storlet_enabled():
|
||||
resp = self.get_request_response(target, 'GET')
|
||||
self.assertEqual('200 OK', resp.status)
|
||||
self.assertEqual('FAKE APP', resp.body)
|
||||
self.assertEqual(b'FAKE APP', resp.body)
|
||||
for key in sheaders:
|
||||
self.assertEqual(sheaders[key], resp.headers.get(key))
|
||||
|
||||
@ -579,7 +582,7 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
headers = {'X-Storlet-Container-Read': 'aa',
|
||||
'X-Storlet-Name': 'bb'}
|
||||
target = '/v1/AUTH_a/c/o'
|
||||
self.base_app.register('POST', target, HTTPNoContent, body='')
|
||||
self.base_app.register('POST', target, HTTPNoContent, body=b'')
|
||||
with storlet_enabled():
|
||||
resp = self.get_request_response(target, 'POST', headers=headers)
|
||||
self.assertEqual('204 No Content', resp.status)
|
||||
@ -591,9 +594,8 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
resp = self.get_request_response(target, 'POST',
|
||||
headers=headers)
|
||||
self.assertEqual('400 Bad Request', resp.status)
|
||||
self.assertEqual(('storlet ACL update cannot be'
|
||||
' a storlet container'),
|
||||
resp.body)
|
||||
msg = b'storlet ACL update cannot be a storlet container'
|
||||
self.assertEqual(msg, resp.body)
|
||||
|
||||
# Test wrong headers content
|
||||
hlist = [{'X-Storlet-Container-Read': ''},
|
||||
@ -606,7 +608,7 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
resp = self.get_request_response(target, 'POST',
|
||||
headers=headers)
|
||||
self.assertEqual('400 Bad Request', resp.status)
|
||||
self.assertTrue('missing a mandatory header' in resp.body)
|
||||
self.assertIn(b'missing a mandatory header', resp.body)
|
||||
|
||||
# Test wrong ACL content
|
||||
hlist = [{'X-Storlet-Container-Read': 'a,b',
|
||||
@ -619,7 +621,7 @@ class TestStorletMiddlewareProxy(BaseTestStorletMiddleware):
|
||||
resp = self.get_request_response(target, 'POST',
|
||||
headers=headers)
|
||||
self.assertEqual('400 Bad Request', resp.status)
|
||||
self.assertTrue('mulformed storlet or user name' in resp.body)
|
||||
self.assertIn(b'mulformed storlet or user name', resp.body)
|
||||
|
||||
def test_POST_storlet_acl(self):
|
||||
target = '/v1/AUTH_a/c'
|
||||
|
6
tox.ini
6
tox.ini
@ -32,11 +32,7 @@ commands =
|
||||
[testenv:py35]
|
||||
basepython = python3
|
||||
commands =
|
||||
nosetests -v \
|
||||
tests/unit/gateway \
|
||||
tests/unit/sbus \
|
||||
tests/unit/tools \
|
||||
tests/unit/agent
|
||||
nosetests -v tests/unit
|
||||
|
||||
[testenv:py36]
|
||||
basepython = python3
|
||||
|
Loading…
x
Reference in New Issue
Block a user