py3: make swift_middleware as py3 compatible

Change-Id: Ia1790e50e0029f31767b8eebe4985532e5885543
This commit is contained in:
Kota Tsuyuzaki 2018-07-25 17:43:31 +09:00
parent d5a038f4ac
commit 2fc038973b
6 changed files with 98 additions and 99 deletions
storlets/swift_middleware/handlers
tests/unit/swift_middleware/handlers
tox.ini

@ -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'

@ -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