Allows removal of ACLs
fixes bug 1049017 As per the bug report, the -remove- form of deletion only works with meta headers and not with x-container-read and x-container-write. This patch by Yukihiro KAWADA detects the container acls and sends them through to the backend empty like the other metadata values. patch2 extends metadata-helper in ContainerController tests so that the new functionality can be tested. patch3 changes the k.lower().startswith() commands for read/write to a single k.lower - thanks David :) patch4 fixes PEP8 patch5 fixes more than two hundred pep8 errors. Except one, where the pep8 tool complains of overindent, or underindent depending on the position on the line. No idea how to fix that one. patch6 fixes the remaining pep8 error - thanks Darrell Change-Id: I36c2dd72b4636136c5ce7db414bf2b61501090ad
This commit is contained in:
parent
1ef17d8284
commit
124e75bc1b
@ -107,11 +107,17 @@ class Controller(object):
|
||||
self.trans_id = '-'
|
||||
|
||||
def transfer_headers(self, src_headers, dst_headers):
|
||||
x_remove = 'x-remove-%s-meta-' % self.server_type.lower()
|
||||
x_meta = 'x-%s-meta-' % self.server_type.lower()
|
||||
|
||||
st = self.server_type.lower()
|
||||
x_remove = 'x-remove-%s-meta-' % st
|
||||
x_remove_read = 'x-remove-%s-read' % st
|
||||
x_remove_write = 'x-remove-%s-write' % st
|
||||
x_meta = 'x-%s-meta-' % st
|
||||
dst_headers.update((k.lower().replace('-remove', '', 1), '')
|
||||
for k in src_headers
|
||||
if k.lower().startswith(x_remove))
|
||||
if k.lower().startswith(x_remove) or
|
||||
k.lower() in (x_remove_read, x_remove_write))
|
||||
|
||||
dst_headers.update((k.lower(), v)
|
||||
for k, v in src_headers.iteritems()
|
||||
if k.lower() in self.pass_through_headers or
|
||||
@ -135,7 +141,8 @@ class Controller(object):
|
||||
"""
|
||||
self.error_increment(node)
|
||||
self.app.logger.error(_('%(msg)s %(ip)s:%(port)s'),
|
||||
{'msg': msg, 'ip': node['ip'], 'port': node['port']})
|
||||
{'msg': msg, 'ip': node['ip'],
|
||||
'port': node['port']})
|
||||
|
||||
def exception_occurred(self, node, typ, additional_info):
|
||||
"""
|
||||
@ -220,7 +227,8 @@ class Controller(object):
|
||||
try:
|
||||
with ConnectionTimeout(self.app.conn_timeout):
|
||||
conn = http_connect(node['ip'], node['port'],
|
||||
node['device'], partition, 'HEAD', path, headers)
|
||||
node['device'], partition, 'HEAD',
|
||||
path, headers)
|
||||
with Timeout(self.app.node_timeout):
|
||||
resp = conn.getresponse()
|
||||
body = resp.read()
|
||||
@ -241,7 +249,8 @@ class Controller(object):
|
||||
result_code = -1
|
||||
except (Exception, Timeout):
|
||||
self.exception_occurred(node, _('Account'),
|
||||
_('Trying to get account info for %s') % path)
|
||||
_('Trying to get account info for %s')
|
||||
% path)
|
||||
if result_code == HTTP_NOT_FOUND and autocreate:
|
||||
if len(account) > MAX_ACCOUNT_NAME_LENGTH:
|
||||
return None, None, None
|
||||
@ -252,7 +261,7 @@ class Controller(object):
|
||||
self.app.account_ring, partition, 'PUT',
|
||||
path, [headers] * len(nodes))
|
||||
if not is_success(resp.status_int):
|
||||
self.app.logger.warning('Could not autocreate account %r' % \
|
||||
self.app.logger.warning('Could not autocreate account %r' %
|
||||
path)
|
||||
return None, None, None
|
||||
result_code = HTTP_OK
|
||||
@ -262,7 +271,8 @@ class Controller(object):
|
||||
else:
|
||||
cache_timeout = self.app.recheck_account_existence * 0.1
|
||||
self.app.memcache.set(cache_key,
|
||||
{'status': result_code, 'container_count': container_count},
|
||||
{'status': result_code,
|
||||
'container_count': container_count},
|
||||
timeout=cache_timeout)
|
||||
if result_code == HTTP_OK:
|
||||
return partition, nodes, container_count
|
||||
|
@ -151,8 +151,11 @@ def setup():
|
||||
partition, nodes = prosrv.account_ring.get_nodes('a')
|
||||
for node in nodes:
|
||||
conn = swift.proxy.controllers.obj.http_connect(node['ip'],
|
||||
node['port'], node['device'], partition, 'PUT', '/a',
|
||||
{'X-Timestamp': ts, 'x-trans-id': 'test'})
|
||||
node['port'],
|
||||
node['device'],
|
||||
partition, 'PUT', '/a',
|
||||
{'X-Timestamp': ts,
|
||||
'x-trans-id': 'test'})
|
||||
resp = conn.getresponse()
|
||||
assert(resp.status == 201)
|
||||
# Create container
|
||||
@ -622,7 +625,9 @@ class TestProxyServer(unittest.TestCase):
|
||||
|
||||
def test_internal_method_request(self):
|
||||
baseapp = proxy_server.Application({},
|
||||
FakeMemcache(), container_ring=FakeRing(), object_ring=FakeRing(),
|
||||
FakeMemcache(),
|
||||
container_ring=FakeRing(),
|
||||
object_ring=FakeRing(),
|
||||
account_ring=FakeRing())
|
||||
resp = baseapp.handle_request(
|
||||
Request.blank('/v1/a', environ={'REQUEST_METHOD': '__init__'}))
|
||||
@ -630,7 +635,9 @@ class TestProxyServer(unittest.TestCase):
|
||||
|
||||
def test_inexistent_method_request(self):
|
||||
baseapp = proxy_server.Application({},
|
||||
FakeMemcache(), container_ring=FakeRing(), account_ring=FakeRing(),
|
||||
FakeMemcache(),
|
||||
container_ring=FakeRing(),
|
||||
account_ring=FakeRing(),
|
||||
object_ring=FakeRing())
|
||||
resp = baseapp.handle_request(
|
||||
Request.blank('/v1/a', environ={'REQUEST_METHOD': '!invalid'}))
|
||||
@ -644,7 +651,8 @@ class TestProxyServer(unittest.TestCase):
|
||||
with save_globals():
|
||||
set_http_connect(200)
|
||||
app = proxy_server.Application(None, FakeMemcache(),
|
||||
account_ring=FakeRing(), container_ring=FakeRing(),
|
||||
account_ring=FakeRing(),
|
||||
container_ring=FakeRing(),
|
||||
object_ring=FakeRing())
|
||||
req = Request.blank('/v1/a')
|
||||
req.environ['swift.authorize'] = authorize
|
||||
@ -659,7 +667,8 @@ class TestProxyServer(unittest.TestCase):
|
||||
called[0] = True
|
||||
return HTTPUnauthorized(request=req)
|
||||
app = proxy_server.Application(None, FakeMemcache(),
|
||||
account_ring=FakeRing(), container_ring=FakeRing(),
|
||||
account_ring=FakeRing(),
|
||||
container_ring=FakeRing(),
|
||||
object_ring=FakeRing())
|
||||
req = Request.blank('/v1/a')
|
||||
req.environ['swift.authorize'] = authorize
|
||||
@ -671,7 +680,8 @@ class TestProxyServer(unittest.TestCase):
|
||||
swift_dir = mkdtemp()
|
||||
try:
|
||||
baseapp = proxy_server.Application({'swift_dir': swift_dir},
|
||||
FakeMemcache(), FakeLogger(), FakeRing(), FakeRing(),
|
||||
FakeMemcache(), FakeLogger(),
|
||||
FakeRing(), FakeRing(),
|
||||
FakeRing())
|
||||
resp = baseapp.handle_request(
|
||||
Request.blank('/', environ={'CONTENT_LENGTH': '-1'}))
|
||||
@ -688,8 +698,10 @@ class TestProxyServer(unittest.TestCase):
|
||||
swift_dir = mkdtemp()
|
||||
try:
|
||||
baseapp = proxy_server.Application({'swift_dir': swift_dir,
|
||||
'deny_host_headers': 'invalid_host.com'},
|
||||
FakeMemcache(), FakeLogger(), FakeRing(), FakeRing(),
|
||||
'deny_host_headers':
|
||||
'invalid_host.com'},
|
||||
FakeMemcache(), FakeLogger(),
|
||||
FakeRing(), FakeRing(),
|
||||
FakeRing())
|
||||
resp = baseapp.handle_request(
|
||||
Request.blank('/v1/a/c/o',
|
||||
@ -698,11 +710,13 @@ class TestProxyServer(unittest.TestCase):
|
||||
finally:
|
||||
rmtree(swift_dir, ignore_errors=True)
|
||||
|
||||
|
||||
class TestObjectController(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.app = proxy_server.Application(None, FakeMemcache(),
|
||||
account_ring=FakeRing(), container_ring=FakeRing(),
|
||||
account_ring=FakeRing(),
|
||||
container_ring=FakeRing(),
|
||||
object_ring=FakeRing())
|
||||
monkey_patch_mimetools()
|
||||
|
||||
@ -714,7 +728,8 @@ class TestObjectController(unittest.TestCase):
|
||||
|
||||
set_http_connect(*statuses, **kwargs)
|
||||
self.app.memcache.store = {}
|
||||
req = Request.blank('/a/c/o', headers={'Content-Length': '0',
|
||||
req = Request.blank('/a/c/o',
|
||||
headers={'Content-Length': '0',
|
||||
'Content-Type': 'text/plain'})
|
||||
self.app.update_request(req)
|
||||
res = method(req)
|
||||
@ -723,7 +738,8 @@ class TestObjectController(unittest.TestCase):
|
||||
# repeat test
|
||||
set_http_connect(*statuses, **kwargs)
|
||||
self.app.memcache.store = {}
|
||||
req = Request.blank('/a/c/o', headers={'Content-Length': '0',
|
||||
req = Request.blank('/a/c/o',
|
||||
headers={'Content-Length': '0',
|
||||
'Content-Type': 'text/plain'})
|
||||
self.app.update_request(req)
|
||||
res = method(req)
|
||||
@ -756,7 +772,8 @@ class TestObjectController(unittest.TestCase):
|
||||
self.assertEqual(headers[:len(exp)], exp)
|
||||
req = Request.blank(path,
|
||||
environ={'REQUEST_METHOD': 'GET'},
|
||||
headers={'Content-Type': 'application/octet-stream',
|
||||
headers={'Content-Type':
|
||||
'application/octet-stream',
|
||||
'X-Newest': 'true'})
|
||||
res = req.get_response(prosrv)
|
||||
self.assertEqual(res.status_int, 200)
|
||||
@ -771,19 +788,23 @@ class TestObjectController(unittest.TestCase):
|
||||
'container', 'object')
|
||||
|
||||
def test_content_type(filename, expected):
|
||||
# The three responses here are for account_info() (HEAD to account server),
|
||||
# container_info() (HEAD to container server) and three calls to
|
||||
# _connect_put_node() (PUT to three object servers)
|
||||
# The three responses here are for account_info() (HEAD to
|
||||
# account server), container_info() (HEAD to container server)
|
||||
# and three calls to _connect_put_node() (PUT to three object
|
||||
# servers)
|
||||
set_http_connect(201, 201, 201, 201, 201,
|
||||
give_content_type=lambda content_type:
|
||||
self.assertEquals(content_type, expected.next()))
|
||||
self.assertEquals(content_type,
|
||||
expected.next()))
|
||||
# We need into include a transfer-encoding to get past
|
||||
# constraints.check_object_creation()
|
||||
req = Request.blank('/a/c/%s' % filename, {}, headers={'transfer-encoding': 'chunked'})
|
||||
req = Request.blank('/a/c/%s' % filename, {},
|
||||
headers={'transfer-encoding': 'chunked'})
|
||||
self.app.update_request(req)
|
||||
self.app.memcache.store = {}
|
||||
res = controller.PUT(req)
|
||||
# If we don't check the response here we could miss problems in PUT()
|
||||
# If we don't check the response here we could miss problems
|
||||
# in PUT()
|
||||
self.assertEquals(res.status_int, 201)
|
||||
|
||||
test_content_type('test.jpg', iter(['', '', 'image/jpeg',
|
||||
@ -799,7 +820,8 @@ class TestObjectController(unittest.TestCase):
|
||||
with open(os.path.join(swift_dir, 'mime.types'), 'w') as fp:
|
||||
fp.write('foo/bar foo\n')
|
||||
ba = proxy_server.Application({'swift_dir': swift_dir},
|
||||
FakeMemcache(), FakeLogger(), FakeRing(), FakeRing(),
|
||||
FakeMemcache(), FakeLogger(),
|
||||
FakeRing(), FakeRing(),
|
||||
FakeRing())
|
||||
self.assertEquals(proxy_server.mimetypes.guess_type('blah.foo')[0],
|
||||
'foo/bar')
|
||||
@ -856,7 +878,8 @@ class TestObjectController(unittest.TestCase):
|
||||
self.app.memcache.store = {}
|
||||
set_http_connect(*statuses)
|
||||
req = Request.blank('/a/c/o.jpg',
|
||||
environ={'REQUEST_METHOD': 'PUT'}, body='some data')
|
||||
environ={'REQUEST_METHOD': 'PUT'},
|
||||
body='some data')
|
||||
self.app.update_request(req)
|
||||
res = controller.PUT(req)
|
||||
expected = str(expected)
|
||||
@ -906,8 +929,8 @@ class TestObjectController(unittest.TestCase):
|
||||
def test_status_map(statuses, expected):
|
||||
set_http_connect(*statuses)
|
||||
self.app.memcache.store = {}
|
||||
req = Request.blank('/a/c/o', {}, headers={
|
||||
'Content-Type': 'foo/bar'})
|
||||
req = Request.blank('/a/c/o', {},
|
||||
headers={'Content-Type': 'foo/bar'})
|
||||
self.app.update_request(req)
|
||||
res = controller.POST(req)
|
||||
expected = str(expected)
|
||||
@ -928,8 +951,8 @@ class TestObjectController(unittest.TestCase):
|
||||
def test_status_map(statuses, expected):
|
||||
set_http_connect(*statuses)
|
||||
self.app.memcache.store = {}
|
||||
req = Request.blank('/a/c/o', {}, headers={
|
||||
'Content-Type': 'foo/bar'})
|
||||
req = Request.blank('/a/c/o', {},
|
||||
headers={'Content-Type': 'foo/bar'})
|
||||
self.app.update_request(req)
|
||||
res = controller.POST(req)
|
||||
expected = str(expected)
|
||||
@ -1006,12 +1029,18 @@ class TestObjectController(unittest.TestCase):
|
||||
expected_timestamp)
|
||||
|
||||
# acct cont obj obj obj
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '1', '2', '3'), '3')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '1', '3', '2'), '3')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '1', '3', '1'), '3')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '3', '3', '1'), '3')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', None, None, None), None)
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', None, None, '1'), '1')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '1',
|
||||
'2', '3'), '3')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '1',
|
||||
'3', '2'), '3')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '1',
|
||||
'3', '1'), '3')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '3',
|
||||
'3', '1'), '3')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', None,
|
||||
None, None), None)
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', None,
|
||||
None, '1'), '1')
|
||||
|
||||
def test_GET_newest(self):
|
||||
with save_globals():
|
||||
@ -1030,12 +1059,18 @@ class TestObjectController(unittest.TestCase):
|
||||
self.assertEquals(res.headers.get('last-modified'),
|
||||
expected_timestamp)
|
||||
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '1', '2', '3'), '3')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '1', '3', '2'), '3')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '1', '3', '1'), '3')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '3', '3', '1'), '3')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', None, None, None), None)
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', None, None, '1'), '1')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '1',
|
||||
'2', '3'), '3')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '1',
|
||||
'3', '2'), '3')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '1',
|
||||
'3', '1'), '3')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '3',
|
||||
'3', '1'), '3')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', None,
|
||||
None, None), None)
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', None,
|
||||
None, '1'), '1')
|
||||
|
||||
with save_globals():
|
||||
controller = proxy_server.ObjectController(self.app, 'account',
|
||||
@ -1053,11 +1088,16 @@ class TestObjectController(unittest.TestCase):
|
||||
self.assertEquals(res.headers.get('last-modified'),
|
||||
expected_timestamp)
|
||||
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '1', '2', '3'), '1')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '1', '3', '2'), '1')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '1', '3', '1'), '1')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '3', '3', '1'), '3')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', None, '1', '2'), None)
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '1',
|
||||
'2', '3'), '1')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '1',
|
||||
'3', '2'), '1')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '1',
|
||||
'3', '1'), '1')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', '3',
|
||||
'3', '1'), '3')
|
||||
test_status_map((200, 200, 200, 200, 200), 200, ('0', '0', None,
|
||||
'1', '2'), None)
|
||||
|
||||
def test_POST_meta_val_len(self):
|
||||
with save_globals():
|
||||
@ -1203,8 +1243,10 @@ class TestObjectController(unittest.TestCase):
|
||||
return ''
|
||||
|
||||
req = Request.blank('/a/c/o',
|
||||
environ={'REQUEST_METHOD': 'PUT', 'wsgi.input': SlowBody()},
|
||||
headers={'Content-Length': '4', 'Content-Type': 'text/plain'})
|
||||
environ={'REQUEST_METHOD': 'PUT',
|
||||
'wsgi.input': SlowBody()},
|
||||
headers={'Content-Length': '4',
|
||||
'Content-Type': 'text/plain'})
|
||||
self.app.update_request(req)
|
||||
controller = proxy_server.ObjectController(self.app, 'account',
|
||||
'container', 'object')
|
||||
@ -1214,8 +1256,10 @@ class TestObjectController(unittest.TestCase):
|
||||
self.assertEquals(resp.status_int, 201)
|
||||
self.app.client_timeout = 0.1
|
||||
req = Request.blank('/a/c/o',
|
||||
environ={'REQUEST_METHOD': 'PUT', 'wsgi.input': SlowBody()},
|
||||
headers={'Content-Length': '4', 'Content-Type': 'text/plain'})
|
||||
environ={'REQUEST_METHOD': 'PUT',
|
||||
'wsgi.input': SlowBody()},
|
||||
headers={'Content-Length': '4',
|
||||
'Content-Type': 'text/plain'})
|
||||
self.app.update_request(req)
|
||||
set_http_connect(201, 201, 201)
|
||||
# obj obj obj
|
||||
@ -1246,8 +1290,10 @@ class TestObjectController(unittest.TestCase):
|
||||
raise Exception('Disconnected')
|
||||
|
||||
req = Request.blank('/a/c/o',
|
||||
environ={'REQUEST_METHOD': 'PUT', 'wsgi.input': SlowBody()},
|
||||
headers={'Content-Length': '4', 'Content-Type': 'text/plain'})
|
||||
environ={'REQUEST_METHOD': 'PUT',
|
||||
'wsgi.input': SlowBody()},
|
||||
headers={'Content-Length': '4',
|
||||
'Content-Type': 'text/plain'})
|
||||
self.app.update_request(req)
|
||||
controller = proxy_server.ObjectController(self.app, 'account',
|
||||
'container', 'object')
|
||||
@ -1309,7 +1355,8 @@ class TestObjectController(unittest.TestCase):
|
||||
dev['port'] = 1
|
||||
req = Request.blank('/a/c/o',
|
||||
environ={'REQUEST_METHOD': 'PUT'},
|
||||
headers={'Content-Length': '4', 'Content-Type': 'text/plain'},
|
||||
headers={'Content-Length': '4',
|
||||
'Content-Type': 'text/plain'},
|
||||
body=' ')
|
||||
self.app.update_request(req)
|
||||
controller = proxy_server.ObjectController(self.app, 'account',
|
||||
@ -1321,7 +1368,8 @@ class TestObjectController(unittest.TestCase):
|
||||
set_http_connect(201, 201, 201, slow=True)
|
||||
req = Request.blank('/a/c/o',
|
||||
environ={'REQUEST_METHOD': 'PUT'},
|
||||
headers={'Content-Length': '4', 'Content-Type': 'text/plain'},
|
||||
headers={'Content-Length': '4',
|
||||
'Content-Type': 'text/plain'},
|
||||
body=' ')
|
||||
self.app.update_request(req)
|
||||
resp = controller.PUT(req)
|
||||
@ -1332,9 +1380,11 @@ class TestObjectController(unittest.TestCase):
|
||||
try:
|
||||
self.app.object_ring.max_more_nodes = 2
|
||||
controller = proxy_server.ObjectController(self.app, 'account',
|
||||
'container', 'object')
|
||||
'container',
|
||||
'object')
|
||||
partition, nodes = self.app.object_ring.get_nodes('account',
|
||||
'container', 'object')
|
||||
'container',
|
||||
'object')
|
||||
collected_nodes = []
|
||||
for node in controller.iter_nodes(partition, nodes,
|
||||
self.app.object_ring):
|
||||
@ -1343,9 +1393,11 @@ class TestObjectController(unittest.TestCase):
|
||||
|
||||
self.app.object_ring.max_more_nodes = 20
|
||||
controller = proxy_server.ObjectController(self.app, 'account',
|
||||
'container', 'object')
|
||||
'container',
|
||||
'object')
|
||||
partition, nodes = self.app.object_ring.get_nodes('account',
|
||||
'container', 'object')
|
||||
'container',
|
||||
'object')
|
||||
collected_nodes = []
|
||||
for node in controller.iter_nodes(partition, nodes,
|
||||
self.app.object_ring):
|
||||
@ -1356,9 +1408,11 @@ class TestObjectController(unittest.TestCase):
|
||||
self.app.logger = FakeLogger()
|
||||
self.app.object_ring.max_more_nodes = 2
|
||||
controller = proxy_server.ObjectController(self.app, 'account',
|
||||
'container', 'object')
|
||||
'container',
|
||||
'object')
|
||||
partition, nodes = self.app.object_ring.get_nodes('account',
|
||||
'container', 'object')
|
||||
'container',
|
||||
'object')
|
||||
collected_nodes = []
|
||||
for node in controller.iter_nodes(partition, nodes,
|
||||
self.app.object_ring):
|
||||
@ -1373,9 +1427,11 @@ class TestObjectController(unittest.TestCase):
|
||||
self.app.logger = FakeLogger()
|
||||
self.app.object_ring.max_more_nodes = 2
|
||||
controller = proxy_server.ObjectController(self.app, 'account',
|
||||
'container', 'object')
|
||||
'container',
|
||||
'object')
|
||||
partition, nodes = self.app.object_ring.get_nodes('account',
|
||||
'container', 'object')
|
||||
'container',
|
||||
'object')
|
||||
collected_nodes = []
|
||||
for node in controller.iter_nodes(partition, nodes,
|
||||
self.app.object_ring):
|
||||
@ -1393,7 +1449,9 @@ class TestObjectController(unittest.TestCase):
|
||||
'Object')
|
||||
self.assertEquals(resp.etag, None)
|
||||
resp = controller.best_response(req, [200] * 3, ['OK'] * 3, [''] * 3,
|
||||
'Object', etag='68b329da9893e34099c7d8ad5cb9c940')
|
||||
'Object',
|
||||
etag='68b329da9893e34099c7d8ad5cb9c940'
|
||||
)
|
||||
self.assertEquals(resp.etag, '68b329da9893e34099c7d8ad5cb9c940')
|
||||
|
||||
def test_proxy_passes_content_type(self):
|
||||
@ -1435,26 +1493,33 @@ class TestObjectController(unittest.TestCase):
|
||||
set_shuffle()
|
||||
controller = proxy_server.ObjectController(self.app, 'account',
|
||||
'container', 'object')
|
||||
self.assert_status_map(controller.HEAD, (200, 200, 503, 200, 200), 200)
|
||||
self.assert_status_map(controller.HEAD, (200, 200, 503, 200, 200),
|
||||
200)
|
||||
print controller.app.object_ring.devs
|
||||
self.assertEquals(controller.app.object_ring.devs[0]['errors'], 2)
|
||||
self.assert_('last_error' in controller.app.object_ring.devs[0])
|
||||
for _junk in xrange(self.app.error_suppression_limit):
|
||||
self.assert_status_map(controller.HEAD, (200, 200, 503, 503, 503), 503)
|
||||
self.assert_status_map(controller.HEAD, (200, 200, 503, 503,
|
||||
503), 503)
|
||||
self.assertEquals(controller.app.object_ring.devs[0]['errors'],
|
||||
self.app.error_suppression_limit + 1)
|
||||
self.assert_status_map(controller.HEAD, (200, 200, 200, 200, 200), 503)
|
||||
self.assert_status_map(controller.HEAD, (200, 200, 200, 200, 200),
|
||||
503)
|
||||
self.assert_('last_error' in controller.app.object_ring.devs[0])
|
||||
self.assert_status_map(controller.PUT, (200, 200, 200, 201, 201, 201), 503)
|
||||
self.assert_status_map(controller.PUT, (200, 200, 200, 201, 201,
|
||||
201), 503)
|
||||
self.assert_status_map(controller.POST,
|
||||
(200, 200, 200, 200, 200, 200, 202, 202, 202), 503)
|
||||
(200, 200, 200, 200, 200, 200, 202, 202,
|
||||
202), 503)
|
||||
self.assert_status_map(controller.DELETE,
|
||||
(200, 200, 200, 204, 204, 204), 503)
|
||||
self.app.error_suppression_interval = -300
|
||||
self.assert_status_map(controller.HEAD, (200, 200, 200, 200, 200), 200)
|
||||
self.assert_status_map(controller.HEAD, (200, 200, 200, 200, 200),
|
||||
200)
|
||||
self.assertRaises(BaseException,
|
||||
self.assert_status_map, controller.DELETE,
|
||||
(200, 200, 200, 204, 204, 204), 503, raise_exc=True)
|
||||
(200, 200, 200, 204, 204, 204), 503,
|
||||
raise_exc=True)
|
||||
|
||||
def test_acc_or_con_missing_returns_404(self):
|
||||
with save_globals():
|
||||
@ -1918,8 +1983,9 @@ class TestObjectController(unittest.TestCase):
|
||||
req.account = 'a'
|
||||
controller.object_name = 'o'
|
||||
set_http_connect(200, 200, 200, 200, 200, 201, 201, 201,
|
||||
# acct cont objc objc objc obj obj obj
|
||||
timestamps=('1', '1', '1', '3', '2', '4', '4', '4'))
|
||||
#act cont objc objc objc obj obj obj
|
||||
timestamps=('1', '1', '1', '3', '2', '4', '4',
|
||||
'4'))
|
||||
self.app.memcache.store = {}
|
||||
resp = controller.COPY(req)
|
||||
self.assertEquals(resp.status_int, 201)
|
||||
@ -1978,8 +2044,8 @@ class TestObjectController(unittest.TestCase):
|
||||
|
||||
def test_chunked_put_bad_version(self):
|
||||
# Check bad version
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis, obj2lis) = \
|
||||
_test_sockets
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis,
|
||||
obj2lis) = _test_sockets
|
||||
sock = connect_tcp(('localhost', prolis.getsockname()[1]))
|
||||
fd = sock.makefile()
|
||||
fd.write('GET /v0 HTTP/1.1\r\nHost: localhost\r\n'
|
||||
@ -1991,8 +2057,8 @@ class TestObjectController(unittest.TestCase):
|
||||
|
||||
def test_chunked_put_bad_path(self):
|
||||
# Check bad path
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis, obj2lis) = \
|
||||
_test_sockets
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis,
|
||||
obj2lis) = _test_sockets
|
||||
sock = connect_tcp(('localhost', prolis.getsockname()[1]))
|
||||
fd = sock.makefile()
|
||||
fd.write('GET invalid HTTP/1.1\r\nHost: localhost\r\n'
|
||||
@ -2004,8 +2070,8 @@ class TestObjectController(unittest.TestCase):
|
||||
|
||||
def test_chunked_put_bad_utf8(self):
|
||||
# Check invalid utf-8
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis, obj2lis) = \
|
||||
_test_sockets
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis,
|
||||
obj2lis) = _test_sockets
|
||||
sock = connect_tcp(('localhost', prolis.getsockname()[1]))
|
||||
fd = sock.makefile()
|
||||
fd.write('GET /v1/a%80 HTTP/1.1\r\nHost: localhost\r\n'
|
||||
@ -2018,8 +2084,8 @@ class TestObjectController(unittest.TestCase):
|
||||
|
||||
def test_chunked_put_bad_path_no_controller(self):
|
||||
# Check bad path, no controller
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis, obj2lis) = \
|
||||
_test_sockets
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis,
|
||||
obj2lis) = _test_sockets
|
||||
sock = connect_tcp(('localhost', prolis.getsockname()[1]))
|
||||
fd = sock.makefile()
|
||||
fd.write('GET /v1 HTTP/1.1\r\nHost: localhost\r\n'
|
||||
@ -2032,8 +2098,8 @@ class TestObjectController(unittest.TestCase):
|
||||
|
||||
def test_chunked_put_bad_method(self):
|
||||
# Check bad method
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis, obj2lis) = \
|
||||
_test_sockets
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis,
|
||||
obj2lis) = _test_sockets
|
||||
sock = connect_tcp(('localhost', prolis.getsockname()[1]))
|
||||
fd = sock.makefile()
|
||||
fd.write('LICK /v1/a HTTP/1.1\r\nHost: localhost\r\n'
|
||||
@ -2046,10 +2112,10 @@ class TestObjectController(unittest.TestCase):
|
||||
|
||||
def test_chunked_put_unhandled_exception(self):
|
||||
# Check unhandled exception
|
||||
(prosrv, acc1srv, acc2srv, con1srv, con2srv, obj1srv, obj2srv) = \
|
||||
_test_servers
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis, obj2lis) = \
|
||||
_test_sockets
|
||||
(prosrv, acc1srv, acc2srv, con1srv, con2srv, obj1srv,
|
||||
obj2srv) = _test_servers
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis,
|
||||
obj2lis) = _test_sockets
|
||||
orig_update_request = prosrv.update_request
|
||||
|
||||
def broken_update_request(*args, **kwargs):
|
||||
@ -2071,8 +2137,8 @@ class TestObjectController(unittest.TestCase):
|
||||
# Head account, just a double check and really is here to test
|
||||
# the part Application.log_request that 'enforces' a
|
||||
# content_length on the response.
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis, obj2lis) = \
|
||||
_test_sockets
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis,
|
||||
obj2lis) = _test_sockets
|
||||
sock = connect_tcp(('localhost', prolis.getsockname()[1]))
|
||||
fd = sock.makefile()
|
||||
fd.write('HEAD /v1/a HTTP/1.1\r\nHost: localhost\r\n'
|
||||
@ -2094,8 +2160,8 @@ class TestObjectController(unittest.TestCase):
|
||||
'\xbf\x86.Test'
|
||||
ustr_short = '\xe1\xbc\xb8\xce\xbf\xe1\xbd\xbatest'
|
||||
# Create ustr container
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis, obj2lis) = \
|
||||
_test_sockets
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis,
|
||||
obj2lis) = _test_sockets
|
||||
sock = connect_tcp(('localhost', prolis.getsockname()[1]))
|
||||
fd = sock.makefile()
|
||||
fd.write('PUT /v1/a/%s HTTP/1.1\r\nHost: localhost\r\n'
|
||||
@ -2205,8 +2271,8 @@ class TestObjectController(unittest.TestCase):
|
||||
|
||||
def test_chunked_put_chunked_put(self):
|
||||
# Do chunked object put
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis, obj2lis) = \
|
||||
_test_sockets
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis,
|
||||
obj2lis) = _test_sockets
|
||||
sock = connect_tcp(('localhost', prolis.getsockname()[1]))
|
||||
fd = sock.makefile()
|
||||
# Also happens to assert that x-storage-token is taken as a
|
||||
@ -2235,8 +2301,8 @@ class TestObjectController(unittest.TestCase):
|
||||
def test_version_manifest(self):
|
||||
versions_to_create = 3
|
||||
# Create a container for our versioned object testing
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis, obj2lis) = \
|
||||
_test_sockets
|
||||
(prolis, acc1lis, acc2lis, con1lis, con2lis, obj1lis,
|
||||
obj2lis) = _test_sockets
|
||||
sock = connect_tcp(('localhost', prolis.getsockname()[1]))
|
||||
fd = sock.makefile()
|
||||
fd.write('PUT /v1/a/versions HTTP/1.1\r\nHost: localhost\r\n'
|
||||
@ -2294,7 +2360,8 @@ class TestObjectController(unittest.TestCase):
|
||||
sock = connect_tcp(('localhost', prolis.getsockname()[1]))
|
||||
fd = sock.makefile()
|
||||
fd.write('GET /v1/a/versions/name HTTP/1.1\r\nHost: '
|
||||
'localhost\r\nConnection: close\r\nX-Auth-Token: t\r\n\r\n')
|
||||
'localhost\r\nConnection: close\r\nX-Auth-Token: t\r\n'
|
||||
'\r\n')
|
||||
fd.flush()
|
||||
headers = readuntil2crlfs(fd)
|
||||
exp = 'HTTP/1.1 200'
|
||||
@ -2363,8 +2430,8 @@ class TestObjectController(unittest.TestCase):
|
||||
for segment in xrange(versions_to_create - 1, 0, -1):
|
||||
sock = connect_tcp(('localhost', prolis.getsockname()[1]))
|
||||
fd = sock.makefile()
|
||||
fd.write('DELETE /v1/a/versions/name HTTP/1.1\r\nHost: '
|
||||
'localhost\r\nConnection: close\r\nX-Storage-Token: t\r\n\r\n')
|
||||
fd.write('DELETE /v1/a/versions/name HTTP/1.1\r\nHost: localhost\r'
|
||||
'\nConnection: close\r\nX-Storage-Token: t\r\n\r\n')
|
||||
fd.flush()
|
||||
headers = readuntil2crlfs(fd)
|
||||
exp = 'HTTP/1.1 2' # 2xx series response
|
||||
@ -2372,8 +2439,8 @@ class TestObjectController(unittest.TestCase):
|
||||
# Ensure retrieving the manifest file gets the latest version
|
||||
sock = connect_tcp(('localhost', prolis.getsockname()[1]))
|
||||
fd = sock.makefile()
|
||||
fd.write('GET /v1/a/versions/name HTTP/1.1\r\nHost: '
|
||||
'localhost\r\nConnection: close\r\nX-Auth-Token: t\r\n\r\n')
|
||||
fd.write('GET /v1/a/versions/name HTTP/1.1\r\nHost: localhost\r\n'
|
||||
'Connection: close\r\nX-Auth-Token: t\r\n\r\n')
|
||||
fd.flush()
|
||||
headers = readuntil2crlfs(fd)
|
||||
exp = 'HTTP/1.1 200'
|
||||
@ -2386,7 +2453,8 @@ class TestObjectController(unittest.TestCase):
|
||||
sock = connect_tcp(('localhost', prolis.getsockname()[1]))
|
||||
fd = sock.makefile()
|
||||
fd.write('GET /v1/a/vers?prefix=004name/ HTTP/1.1\r\nHost: '
|
||||
'localhost\r\nConnection: close\r\nX-Auth-Token: t\r\n\r\n')
|
||||
'localhost\r\nConnection: close\r\nX-Auth-Token: t\r\n\r'
|
||||
'\n')
|
||||
fd.flush()
|
||||
headers = readuntil2crlfs(fd)
|
||||
exp = 'HTTP/1.1 2' # 2xx series response
|
||||
@ -2407,8 +2475,8 @@ class TestObjectController(unittest.TestCase):
|
||||
# delete the last verision
|
||||
sock = connect_tcp(('localhost', prolis.getsockname()[1]))
|
||||
fd = sock.makefile()
|
||||
fd.write('DELETE /v1/a/versions/name HTTP/1.1\r\nHost: '
|
||||
'localhost\r\nConnection: close\r\nX-Storage-Token: t\r\n\r\n')
|
||||
fd.write('DELETE /v1/a/versions/name HTTP/1.1\r\nHost: localhost\r\n'
|
||||
'Connection: close\r\nX-Storage-Token: t\r\n\r\n')
|
||||
fd.flush()
|
||||
headers = readuntil2crlfs(fd)
|
||||
exp = 'HTTP/1.1 2' # 2xx series response
|
||||
@ -2487,8 +2555,8 @@ class TestObjectController(unittest.TestCase):
|
||||
self.assertEquals(headers[:len(exp)], exp)
|
||||
sock = connect_tcp(('localhost', prolis.getsockname()[1]))
|
||||
fd = sock.makefile()
|
||||
fd.write('DELETE /v1/a/versions/name HTTP/1.1\r\nHost: '
|
||||
'localhost\r\nConnection: close\r\nX-Storage-Token: t\r\n\r\n')
|
||||
fd.write('DELETE /v1/a/versions/name HTTP/1.1\r\nHost: localhost\r\n'
|
||||
'Connection: close\r\nX-Storage-Token: t\r\n\r\n')
|
||||
fd.flush()
|
||||
headers = readuntil2crlfs(fd)
|
||||
exp = 'HTTP/1.1 2' # 2xx series response
|
||||
@ -2538,8 +2606,8 @@ class TestObjectController(unittest.TestCase):
|
||||
# Delete the object
|
||||
sock = connect_tcp(('localhost', prolis.getsockname()[1]))
|
||||
fd = sock.makefile()
|
||||
fd.write('DELETE /v1/a/whoops/foo HTTP/1.1\r\nHost: '
|
||||
'localhost\r\nConnection: close\r\nX-Storage-Token: t\r\n\r\n')
|
||||
fd.write('DELETE /v1/a/whoops/foo HTTP/1.1\r\nHost: localhost\r\n'
|
||||
'Connection: close\r\nX-Storage-Token: t\r\n\r\n')
|
||||
fd.flush()
|
||||
headers = readuntil2crlfs(fd)
|
||||
exp = 'HTTP/1.1 2' # 2xx response
|
||||
@ -3104,7 +3172,8 @@ class TestObjectController(unittest.TestCase):
|
||||
t = time()
|
||||
proxy_server.time.time = lambda: t
|
||||
req = Request.blank('/a/c/o', {},
|
||||
headers={'Content-Type': 'foo/bar', 'X-Delete-After': '60'})
|
||||
headers={'Content-Type': 'foo/bar',
|
||||
'X-Delete-After': '60'})
|
||||
self.app.update_request(req)
|
||||
res = controller.POST(req)
|
||||
self.assertEquals(res.status, '202 Fake')
|
||||
@ -3113,11 +3182,13 @@ class TestObjectController(unittest.TestCase):
|
||||
|
||||
self.app.object_post_as_copy = False
|
||||
controller = proxy_server.ObjectController(self.app, 'account',
|
||||
'container', 'object')
|
||||
'container',
|
||||
'object')
|
||||
set_http_connect(200, 200, 202, 202, 202)
|
||||
self.app.memcache.store = {}
|
||||
req = Request.blank('/a/c/o', {},
|
||||
headers={'Content-Type': 'foo/bar', 'X-Delete-After': '60'})
|
||||
headers={'Content-Type': 'foo/bar',
|
||||
'X-Delete-After': '60'})
|
||||
self.app.update_request(req)
|
||||
res = controller.POST(req)
|
||||
self.assertEquals(res.status, '202 Fake')
|
||||
@ -3133,7 +3204,8 @@ class TestObjectController(unittest.TestCase):
|
||||
set_http_connect(200, 200, 200, 200, 200, 202, 202, 202)
|
||||
self.app.memcache.store = {}
|
||||
req = Request.blank('/a/c/o', {},
|
||||
headers={'Content-Type': 'foo/bar', 'X-Delete-After': '60.1'})
|
||||
headers={'Content-Type': 'foo/bar',
|
||||
'X-Delete-After': '60.1'})
|
||||
self.app.update_request(req)
|
||||
res = controller.POST(req)
|
||||
self.assertEquals(res.status, '400 Bad Request')
|
||||
@ -3146,7 +3218,8 @@ class TestObjectController(unittest.TestCase):
|
||||
set_http_connect(200, 200, 200, 200, 200, 202, 202, 202)
|
||||
self.app.memcache.store = {}
|
||||
req = Request.blank('/a/c/o', {},
|
||||
headers={'Content-Type': 'foo/bar', 'X-Delete-After': '-60'})
|
||||
headers={'Content-Type': 'foo/bar',
|
||||
'X-Delete-After': '-60'})
|
||||
self.app.update_request(req)
|
||||
res = controller.POST(req)
|
||||
self.assertEquals(res.status, '400 Bad Request')
|
||||
@ -3168,7 +3241,8 @@ class TestObjectController(unittest.TestCase):
|
||||
self.app.memcache.store = {}
|
||||
t = str(int(time() + 100))
|
||||
req = Request.blank('/a/c/o', {},
|
||||
headers={'Content-Type': 'foo/bar', 'X-Delete-At': t})
|
||||
headers={'Content-Type': 'foo/bar',
|
||||
'X-Delete-At': t})
|
||||
self.app.update_request(req)
|
||||
controller.POST(req)
|
||||
self.assertEquals(given_headers.get('X-Delete-At'), t)
|
||||
@ -3178,7 +3252,8 @@ class TestObjectController(unittest.TestCase):
|
||||
|
||||
t = str(int(time() + 100)) + '.1'
|
||||
req = Request.blank('/a/c/o', {},
|
||||
headers={'Content-Type': 'foo/bar', 'X-Delete-At': t})
|
||||
headers={'Content-Type': 'foo/bar',
|
||||
'X-Delete-At': t})
|
||||
self.app.update_request(req)
|
||||
resp = controller.POST(req)
|
||||
self.assertEquals(resp.status_int, 400)
|
||||
@ -3186,7 +3261,8 @@ class TestObjectController(unittest.TestCase):
|
||||
|
||||
t = str(int(time() - 100))
|
||||
req = Request.blank('/a/c/o', {},
|
||||
headers={'Content-Type': 'foo/bar', 'X-Delete-At': t})
|
||||
headers={'Content-Type': 'foo/bar',
|
||||
'X-Delete-At': t})
|
||||
self.app.update_request(req)
|
||||
resp = controller.POST(req)
|
||||
self.assertEquals(resp.status_int, 400)
|
||||
@ -3203,7 +3279,8 @@ class TestObjectController(unittest.TestCase):
|
||||
t = time()
|
||||
proxy_server.time.time = lambda: t
|
||||
req = Request.blank('/a/c/o', {},
|
||||
headers={'Content-Length': '0', 'Content-Type': 'foo/bar',
|
||||
headers={'Content-Length': '0',
|
||||
'Content-Type': 'foo/bar',
|
||||
'X-Delete-After': '60'})
|
||||
self.app.update_request(req)
|
||||
res = controller.PUT(req)
|
||||
@ -3220,7 +3297,8 @@ class TestObjectController(unittest.TestCase):
|
||||
set_http_connect(200, 200, 201, 201, 201)
|
||||
self.app.memcache.store = {}
|
||||
req = Request.blank('/a/c/o', {},
|
||||
headers={'Content-Length': '0', 'Content-Type': 'foo/bar',
|
||||
headers={'Content-Length': '0',
|
||||
'Content-Type': 'foo/bar',
|
||||
'X-Delete-After': '60.1'})
|
||||
self.app.update_request(req)
|
||||
res = controller.PUT(req)
|
||||
@ -3234,7 +3312,8 @@ class TestObjectController(unittest.TestCase):
|
||||
set_http_connect(200, 200, 201, 201, 201)
|
||||
self.app.memcache.store = {}
|
||||
req = Request.blank('/a/c/o', {},
|
||||
headers={'Content-Length': '0', 'Content-Type': 'foo/bar',
|
||||
headers={'Content-Length': '0',
|
||||
'Content-Type': 'foo/bar',
|
||||
'X-Delete-After': '-60'})
|
||||
self.app.update_request(req)
|
||||
res = controller.PUT(req)
|
||||
@ -3256,7 +3335,8 @@ class TestObjectController(unittest.TestCase):
|
||||
self.app.memcache.store = {}
|
||||
t = str(int(time() + 100))
|
||||
req = Request.blank('/a/c/o', {},
|
||||
headers={'Content-Length': '0', 'Content-Type': 'foo/bar',
|
||||
headers={'Content-Length': '0',
|
||||
'Content-Type': 'foo/bar',
|
||||
'X-Delete-At': t})
|
||||
self.app.update_request(req)
|
||||
controller.PUT(req)
|
||||
@ -3267,7 +3347,8 @@ class TestObjectController(unittest.TestCase):
|
||||
|
||||
t = str(int(time() + 100)) + '.1'
|
||||
req = Request.blank('/a/c/o', {},
|
||||
headers={'Content-Length': '0', 'Content-Type': 'foo/bar',
|
||||
headers={'Content-Length': '0',
|
||||
'Content-Type': 'foo/bar',
|
||||
'X-Delete-At': t})
|
||||
self.app.update_request(req)
|
||||
resp = controller.PUT(req)
|
||||
@ -3276,7 +3357,8 @@ class TestObjectController(unittest.TestCase):
|
||||
|
||||
t = str(int(time() - 100))
|
||||
req = Request.blank('/a/c/o', {},
|
||||
headers={'Content-Length': '0', 'Content-Type': 'foo/bar',
|
||||
headers={'Content-Length': '0',
|
||||
'Content-Type': 'foo/bar',
|
||||
'X-Delete-At': t})
|
||||
self.app.update_request(req)
|
||||
resp = controller.PUT(req)
|
||||
@ -3321,12 +3403,14 @@ class TestObjectController(unittest.TestCase):
|
||||
sock.close()
|
||||
self.assertEquals(before_request_instances, _request_instances)
|
||||
|
||||
|
||||
class TestContainerController(unittest.TestCase):
|
||||
"Test swift.proxy_server.ContainerController"
|
||||
|
||||
def setUp(self):
|
||||
self.app = proxy_server.Application(None, FakeMemcache(),
|
||||
account_ring=FakeRing(), container_ring=FakeRing(),
|
||||
account_ring=FakeRing(),
|
||||
container_ring=FakeRing(),
|
||||
object_ring=FakeRing())
|
||||
|
||||
def assert_status_map(self, method, statuses, expected,
|
||||
@ -3448,7 +3532,8 @@ class TestContainerController(unittest.TestCase):
|
||||
del dev['errors']
|
||||
del dev['last_error']
|
||||
controller = proxy_server.ContainerController(self.app,
|
||||
'account', 'container')
|
||||
'account',
|
||||
'container')
|
||||
if meth == 'PUT':
|
||||
set_http_connect(200, 200, 200, 200, 200, 200,
|
||||
missing_container=True)
|
||||
@ -3585,7 +3670,11 @@ class TestContainerController(unittest.TestCase):
|
||||
for test_header, test_value in (
|
||||
('X-Container-Meta-TestHeader', 'TestValue'),
|
||||
('X-Container-Meta-TestHeader', ''),
|
||||
('X-Remove-Container-Meta-TestHeader', 'anything')):
|
||||
('X-Remove-Container-Meta-TestHeader', 'anything'),
|
||||
('X-Container-Read', '.r:*'),
|
||||
('X-Remove-Container-Read', 'anything'),
|
||||
('X-Container-Write', 'anyone'),
|
||||
('X-Remove-Container-Write', 'anything')):
|
||||
test_errors = []
|
||||
|
||||
def test_connect(ipaddr, port, device, partition, method, path,
|
||||
@ -3808,7 +3897,8 @@ class TestAccountController(unittest.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
self.app = proxy_server.Application(None, FakeMemcache(),
|
||||
account_ring=FakeRing(), container_ring=FakeRing(),
|
||||
account_ring=FakeRing(),
|
||||
container_ring=FakeRing(),
|
||||
object_ring=FakeRing)
|
||||
|
||||
def assert_status_map(self, method, statuses, expected):
|
||||
@ -3859,7 +3949,6 @@ class TestAccountController(unittest.TestCase):
|
||||
self.assert_status_map(controller.GET,
|
||||
(404, 404, 404, 409, 409, 409, 409), 409)
|
||||
|
||||
|
||||
def test_HEAD(self):
|
||||
with save_globals():
|
||||
controller = proxy_server.AccountController(self.app, 'account')
|
||||
@ -4221,6 +4310,7 @@ class TestSegmentedIterable(unittest.TestCase):
|
||||
|
||||
def test_load_next_segment_rate_limiting(self):
|
||||
sleep_calls = []
|
||||
|
||||
def _stub_sleep(sleepy_time):
|
||||
sleep_calls.append(sleepy_time)
|
||||
orig_sleep = swift.proxy.controllers.obj.sleep
|
||||
@ -4231,22 +4321,25 @@ class TestSegmentedIterable(unittest.TestCase):
|
||||
{'name': 'o1'}, {'name': 'o2'}, {'name': 'o3'},
|
||||
{'name': 'o4'}, {'name': 'o5'}])
|
||||
|
||||
# rate_limit_after_segment == 3, so the first 3 segments should invoke
|
||||
# no sleeping.
|
||||
# rate_limit_after_segment == 3, so the first 3 segments should
|
||||
# invoke no sleeping.
|
||||
for _ in xrange(3):
|
||||
segit._load_next_segment()
|
||||
self.assertEquals([], sleep_calls)
|
||||
self.assertEquals(self.controller.GETorHEAD_base_args[4], '/a/lc/o3')
|
||||
self.assertEquals(self.controller.GETorHEAD_base_args[4],
|
||||
'/a/lc/o3')
|
||||
|
||||
# Loading of next (4th) segment starts rate-limiting.
|
||||
segit._load_next_segment()
|
||||
self.assertAlmostEqual(0.5, sleep_calls[0], places=2)
|
||||
self.assertEquals(self.controller.GETorHEAD_base_args[4], '/a/lc/o4')
|
||||
self.assertEquals(self.controller.GETorHEAD_base_args[4],
|
||||
'/a/lc/o4')
|
||||
|
||||
sleep_calls = []
|
||||
segit._load_next_segment()
|
||||
self.assertAlmostEqual(0.5, sleep_calls[0], places=2)
|
||||
self.assertEquals(self.controller.GETorHEAD_base_args[4], '/a/lc/o5')
|
||||
self.assertEquals(self.controller.GETorHEAD_base_args[4],
|
||||
'/a/lc/o5')
|
||||
finally:
|
||||
swift.proxy.controllers.obj.sleep = orig_sleep
|
||||
|
||||
@ -4280,8 +4373,8 @@ class TestSegmentedIterable(unittest.TestCase):
|
||||
|
||||
self.controller.GETorHEAD_base = local_GETorHEAD_base
|
||||
self.assertRaises(Exception,
|
||||
SegmentedIterable(self.controller, 'lc', [{'name':
|
||||
'o1'}])._load_next_segment)
|
||||
SegmentedIterable(self.controller, 'lc',
|
||||
[{'name': 'o1'}])._load_next_segment)
|
||||
self.assert_(self.controller.exception_args[0].startswith(
|
||||
'ERROR: While processing manifest'))
|
||||
self.assertEquals(str(self.controller.exception_info[1]),
|
||||
@ -4328,7 +4421,8 @@ class TestSegmentedIterable(unittest.TestCase):
|
||||
# Iterator value isn't a dict
|
||||
self.assertRaises(Exception,
|
||||
SegmentedIterable(self.controller, None,
|
||||
[None]).app_iter_range(None, None).next)
|
||||
[None]).app_iter_range(None,
|
||||
None).next)
|
||||
self.assert_(self.controller.exception_args[0].startswith(
|
||||
'ERROR: While processing manifest'))
|
||||
|
||||
@ -4380,8 +4474,8 @@ class TestSegmentedIterable(unittest.TestCase):
|
||||
|
||||
def test_app_iter_range_with_many_segments(self):
|
||||
listing = [{'name': 'o1', 'bytes': 1}, {'name': 'o2', 'bytes': 2},
|
||||
{'name': 'o3', 'bytes': 3}, {'name': 'o4', 'bytes': 4}, {'name':
|
||||
'o5', 'bytes': 5}]
|
||||
{'name': 'o3', 'bytes': 3}, {'name': 'o4', 'bytes': 4},
|
||||
{'name': 'o5', 'bytes': 5}]
|
||||
|
||||
segit = SegmentedIterable(self.controller, 'lc', listing)
|
||||
segit.response = Stub()
|
||||
|
Loading…
Reference in New Issue
Block a user