diff options
Diffstat (limited to 'test/unit/proxy/test_server.py')
-rw-r--r-- | test/unit/proxy/test_server.py | 561 |
1 files changed, 349 insertions, 212 deletions
diff --git a/test/unit/proxy/test_server.py b/test/unit/proxy/test_server.py index 4c75562..f669b9d 100644 --- a/test/unit/proxy/test_server.py +++ b/test/unit/proxy/test_server.py @@ -39,16 +39,18 @@ import gluster.swift.common.Glusterfs as gfs gfs.RUN_DIR = mkdtemp() from test.unit import connect_tcp, readuntil2crlfs, FakeLogger, \ - fake_http_connect, FakeRing, FakeMemcache, DebugLogger + fake_http_connect, FakeRing, FakeMemcache, debug_logger from gluster.swift.proxy import server as proxy_server from gluster.swift.account import server as account_server from gluster.swift.container import server as container_server from gluster.swift.obj import server as object_server from swift.common import ring +from swift.common.middleware import proxy_logging from swift.common.exceptions import ChunkReadTimeout, SegmentError from swift.common.constraints import MAX_META_NAME_LENGTH, \ MAX_META_VALUE_LENGTH, MAX_META_COUNT, MAX_META_OVERALL_SIZE, \ - MAX_FILE_SIZE, MAX_ACCOUNT_NAME_LENGTH, MAX_CONTAINER_NAME_LENGTH + MAX_FILE_SIZE, MAX_ACCOUNT_NAME_LENGTH, MAX_CONTAINER_NAME_LENGTH, \ + ACCOUNT_LISTING_LIMIT, CONTAINER_LISTING_LIMIT, MAX_OBJECT_NAME_LENGTH from swift.common import utils from swift.common.utils import mkdirs, normalize_timestamp, NullLogger from swift.common.wsgi import monkey_patch_mimetools @@ -144,17 +146,26 @@ def do_setup(the_object_server): {'id': 1, 'zone': 1, 'device': 'a', 'ip': '127.0.0.1', 'port': obj2lis.getsockname()[1]}], 30), f) - prosrv = proxy_server.Application(conf, FakeMemcacheReturnsNone()) - acc1srv = account_server.AccountController(conf) - acc2srv = account_server.AccountController(conf) - con1srv = container_server.ContainerController(conf) - con2srv = container_server.ContainerController(conf) - obj1srv = the_object_server.ObjectController(conf) - obj2srv = the_object_server.ObjectController(conf) + prosrv = proxy_server.Application(conf, FakeMemcacheReturnsNone(), + logger=debug_logger('proxy')) + acc1srv = account_server.AccountController( + conf, logger=debug_logger('acct1')) + acc2srv = account_server.AccountController( + conf, logger=debug_logger('acct2')) + con1srv = container_server.ContainerController( + conf, logger=debug_logger('cont1')) + con2srv = container_server.ContainerController( + conf, logger=debug_logger('cont2')) + obj1srv = the_object_server.ObjectController( + conf, logger=debug_logger('obj1')) + obj2srv = the_object_server.ObjectController( + conf, logger=debug_logger('obj2')) _test_servers = \ (prosrv, acc1srv, acc2srv, con1srv, con2srv, obj1srv, obj2srv) - nl = DebugLogger() - prospa = spawn(wsgi.server, prolis, prosrv, nl) + nl = NullLogger() + logging_prosv = proxy_logging.ProxyLoggingMiddleware(prosrv, conf, + logger=prosrv.logger) + prospa = spawn(wsgi.server, prolis, logging_prosv, nl) acc1spa = spawn(wsgi.server, acc1lis, acc1srv, nl) acc2spa = spawn(wsgi.server, acc2lis, acc2srv, nl) con1spa = spawn(wsgi.server, con1lis, con1srv, nl) @@ -348,7 +359,8 @@ class TestController(unittest.TestCase): 'container_count': '12345', 'total_object_count': None, 'bytes': None, - 'meta': {}} + 'meta': {}, + 'sysmeta': {}} self.assertEquals(container_info, self.memcache.get(cache_key)) @@ -374,7 +386,8 @@ class TestController(unittest.TestCase): 'container_count': None, # internally keep None 'total_object_count': None, 'bytes': None, - 'meta': {}} + 'meta': {}, + 'sysmeta': {}} self.assertEquals(account_info, self.memcache.get(cache_key)) @@ -523,7 +536,7 @@ class TestProxyServer(unittest.TestCase): app = MyApp(None, FakeMemcache(), account_ring=FakeRing(), container_ring=FakeRing(), object_ring=FakeRing()) - req = Request.blank('/account', environ={'REQUEST_METHOD': 'HEAD'}) + req = Request.blank('/v1/account', environ={'REQUEST_METHOD': 'HEAD'}) app.update_request(req) resp = app.handle_request(req) self.assertEquals(resp.status_int, 500) @@ -710,7 +723,7 @@ class TestObjectController(unittest.TestCase): set_http_connect(*statuses, **kwargs) self.app.memcache.store = {} - req = Request.blank('/a/c/o', + req = Request.blank('/v1/a/c/o', headers={'Content-Length': '0', 'Content-Type': 'text/plain'}) self.app.update_request(req) @@ -720,7 +733,7 @@ class TestObjectController(unittest.TestCase): # repeat test set_http_connect(*statuses, **kwargs) self.app.memcache.store = {} - req = Request.blank('/a/c/o', + req = Request.blank('/v1/a/c/o', headers={'Content-Length': '0', 'Content-Type': 'text/plain'}) self.app.update_request(req) @@ -773,7 +786,7 @@ class TestObjectController(unittest.TestCase): # 100. Perfectly straightforward. set_http_connect(200, 200, (201, -4), (201, -4), (201, -4), give_connect=test_connect) - req = Request.blank('/a/c/o.jpg', {}) + req = Request.blank('/v1/a/c/o.jpg', {}) req.content_length = 0 self.app.update_request(req) self.app.memcache.store = {} @@ -796,7 +809,7 @@ class TestObjectController(unittest.TestCase): proxy_server.ObjectController(self.app, 'a', 'c', 'o.jpg') set_http_connect(200, 200, 201, 201, 201, give_connect=test_connect) - req = Request.blank('/a/c/o.jpg', {}) + req = Request.blank('/v1/a/c/o.jpg', {}) req.content_length = 1 req.body = 'a' self.app.update_request(req) @@ -824,7 +837,7 @@ class TestObjectController(unittest.TestCase): proxy_server.ObjectController(self.app, 'a', 'c', 'o.jpg') set_http_connect(200, 200, 201, 201, 201, give_connect=test_connect) - req = Request.blank('/a/c/o.jpg', {}) + req = Request.blank('/v1/a/c/o.jpg', {}) req.content_length = 1 req.body = 'a' self.app.memcache.store = {} @@ -861,7 +874,7 @@ class TestObjectController(unittest.TestCase): set_http_connect(200, 200, # account, container 201, 201, 201, # 3 working backends give_connect=test_connect) - req = Request.blank('/a/c/o.jpg', {}) + req = Request.blank('/v1/a/c/o.jpg', {}) req.content_length = 1 req.body = 'a' self.app.memcache.store = {} @@ -1044,6 +1057,56 @@ class TestObjectController(unittest.TestCase): finally: swift.proxy.controllers.obj.MAX_FILE_SIZE = MAX_FILE_SIZE + def test_PUT_last_modified(self): + prolis = _test_sockets[0] + sock = connect_tcp(('localhost', prolis.getsockname()[1])) + fd = sock.makefile() + fd.write('PUT /v1/a/c/o.last_modified HTTP/1.1\r\n' + 'Host: localhost\r\nConnection: close\r\n' + 'X-Storage-Token: t\r\nContent-Length: 0\r\n\r\n') + fd.flush() + headers = readuntil2crlfs(fd) + exp = 'HTTP/1.1 201' + lm_hdr = 'Last-Modified: ' + self.assertEqual(headers[:len(exp)], exp) + + last_modified_put = [line for line in headers.split('\r\n') + if lm_hdr in line][0][len(lm_hdr):] + sock = connect_tcp(('localhost', prolis.getsockname()[1])) + fd = sock.makefile() + fd.write('HEAD /v1/a/c/o.last_modified HTTP/1.1\r\n' + 'Host: localhost\r\nConnection: close\r\n' + 'X-Storage-Token: t\r\n\r\n') + fd.flush() + headers = readuntil2crlfs(fd) + exp = 'HTTP/1.1 200' + self.assertEqual(headers[:len(exp)], exp) + last_modified_head = [line for line in headers.split('\r\n') + if lm_hdr in line][0][len(lm_hdr):] + self.assertEqual(last_modified_put, last_modified_head) + + sock = connect_tcp(('localhost', prolis.getsockname()[1])) + fd = sock.makefile() + fd.write('GET /v1/a/c/o.last_modified HTTP/1.1\r\n' + 'Host: localhost\r\nConnection: close\r\n' + 'If-Modified-Since: %s\r\n' + 'X-Storage-Token: t\r\n\r\n' % last_modified_put) + fd.flush() + headers = readuntil2crlfs(fd) + exp = 'HTTP/1.1 304' + self.assertEqual(headers[:len(exp)], exp) + + sock = connect_tcp(('localhost', prolis.getsockname()[1])) + fd = sock.makefile() + fd.write('GET /v1/a/c/o.last_modified HTTP/1.1\r\n' + 'Host: localhost\r\nConnection: close\r\n' + 'If-Unmodified-Since: %s\r\n' + 'X-Storage-Token: t\r\n\r\n' % last_modified_put) + fd.flush() + headers = readuntil2crlfs(fd) + exp = 'HTTP/1.1 200' + self.assertEqual(headers[:len(exp)], exp) + def test_expirer_DELETE_on_versioned_object(self): test_errors = [] @@ -1070,7 +1133,7 @@ class TestObjectController(unittest.TestCase): body_iter=body_iter, headers={'x-versions-location': 'foo'}) self.app.memcache.store = {} - req = Request.blank('/a/c/o', + req = Request.blank('/v1/a/c/o', headers={'X-If-Delete-At': 1}, environ={'REQUEST_METHOD': 'DELETE'}) self.app.update_request(req) @@ -1097,7 +1160,7 @@ class TestObjectController(unittest.TestCase): headers=hdict, body_iter=response_bodies) - req = Request.blank('/a/c/manifest') + req = Request.blank('/v1/a/c/manifest') resp = controller.GET(req) self.assertEqual(resp.status_int, 200) self.assertEqual(resp.body, '') @@ -1176,7 +1239,7 @@ class TestObjectController(unittest.TestCase): body_iter=response_bodies, give_connect=capture_requested_paths) - req = Request.blank('/a/c/manifest') + req = Request.blank('/v1/a/c/manifest') resp = controller.GET(req) self.assertEqual(resp.status_int, 200) self.assertEqual(resp.body, 'AaBbCcDdEe') @@ -1249,7 +1312,7 @@ class TestObjectController(unittest.TestCase): body_iter=response_bodies, give_connect=capture_requested_paths) - req = Request.blank('/a/c/manifest') + req = Request.blank('/v1/a/c/manifest') resp = controller.GET(req) self.assertEqual(resp.status_int, 200) self.assertEqual(resp.body, 'AaBb') @@ -1301,7 +1364,7 @@ class TestObjectController(unittest.TestCase): body_iter=response_bodies, give_connect=capture_requested_paths) - req = Request.blank('/a/c/manifest?multipart-manifest=get') + req = Request.blank('/v1/a/c/manifest?multipart-manifest=get') resp = controller.GET(req) self.assertEqual(resp.status_int, 200) self.assertEqual(resp.body, json_listing) @@ -1351,7 +1414,7 @@ class TestObjectController(unittest.TestCase): body_iter=response_bodies, give_connect=capture_requested_paths) - req = Request.blank('/a/c/manifest?multipart-manifest=get', + req = Request.blank('/v1/a/c/manifest?multipart-manifest=get', headers={'x-copy-from': '/a/c/manifest'}) resp = controller.GET(req) self.assertEqual(resp.status_int, 200) @@ -1404,7 +1467,7 @@ class TestObjectController(unittest.TestCase): 'content-type': 'text/html; swift_bytes=4'}, {}, {}], body_iter=response_bodies, give_connect=capture_requested_paths) - req = Request.blank('/a/c/manifest') + req = Request.blank('/v1/a/c/manifest') resp = controller.GET(req) self.assertEqual(resp.status_int, 200) self.assertEqual(resp.content_length, 4) # content incomplete @@ -1484,7 +1547,7 @@ class TestObjectController(unittest.TestCase): headers=[{}, {}, slob_headers, slob_headers, {}, {}, {}, {}], body_iter=response_bodies, give_connect=capture_requested_paths) - req = Request.blank('/a/c/manifest') + req = Request.blank('/v1/a/c/manifest') resp = controller.GET(req) self.assertEqual(resp.status_int, 200) self.assertEqual(resp.content_length, 8) @@ -1587,7 +1650,7 @@ class TestObjectController(unittest.TestCase): body_iter=response_bodies, give_connect=capture_requested_paths) - req = Request.blank('/a/c/manifest') + req = Request.blank('/v1/a/c/manifest') req.range = 'bytes=4-7' resp = controller.GET(req) got_called = [False, ] @@ -1659,7 +1722,7 @@ class TestObjectController(unittest.TestCase): 'content-type': 'text/html; swift_bytes=4'}, {}, {}], body_iter=response_bodies, give_connect=capture_requested_paths) - req = Request.blank('/a/c/manifest') + req = Request.blank('/v1/a/c/manifest') resp = controller.GET(req) self.assertEqual(resp.status_int, 200) self.assertEqual(resp.content_length, 6) # content incomplete @@ -1716,7 +1779,7 @@ class TestObjectController(unittest.TestCase): body_iter=response_bodies, give_connect=capture_requested_paths) - req = Request.blank('/a/c/manifest', + req = Request.blank('/v1/a/c/manifest', environ={'REQUEST_METHOD': 'HEAD'}) resp = controller.HEAD(req) self.assertEqual(resp.status_int, 200) @@ -1744,7 +1807,7 @@ class TestObjectController(unittest.TestCase): expected.next())) # We need into include a transfer-encoding to get past # constraints.check_object_creation() - req = Request.blank('/a/c/%s' % filename, {}, + req = Request.blank('/v1/a/c/%s' % filename, {}, headers={'transfer-encoding': 'chunked'}) self.app.update_request(req) self.app.memcache.store = {} @@ -1783,7 +1846,7 @@ class TestObjectController(unittest.TestCase): def test_status_map(statuses, expected): set_http_connect(*statuses) - req = Request.blank('/a/c/o.jpg', {}) + req = Request.blank('/v1/a/c/o.jpg', {}) req.content_length = 0 self.app.update_request(req) self.app.memcache.store = {} @@ -1803,7 +1866,7 @@ class TestObjectController(unittest.TestCase): def test_status_map(statuses, expected): set_http_connect(*statuses) self.app.memcache.store = {} - req = Request.blank('/a/c/o.jpg', {}) + req = Request.blank('/v1/a/c/o.jpg', {}) req.content_length = 0 self.app.update_request(req) res = controller.PUT(req) @@ -1823,7 +1886,7 @@ class TestObjectController(unittest.TestCase): def test_status_map(statuses, expected): self.app.memcache.store = {} set_http_connect(*statuses) - req = Request.blank('/a/c/o.jpg', + req = Request.blank('/v1/a/c/o.jpg', environ={'REQUEST_METHOD': 'PUT'}, body='some data') self.app.update_request(req) @@ -1839,7 +1902,7 @@ class TestObjectController(unittest.TestCase): set_http_connect(201, 201, 201) controller = proxy_server.ObjectController(self.app, 'account', 'container', 'object') - req = Request.blank('/a/c/o', {}, headers={ + req = Request.blank('/v1/a/c/o', {}, headers={ 'Content-Length': str(MAX_FILE_SIZE + 1), 'Content-Type': 'foo/bar'}) self.app.update_request(req) @@ -1851,7 +1914,7 @@ class TestObjectController(unittest.TestCase): set_http_connect(201, 201, 201) controller = proxy_server.ObjectController(self.app, 'account', 'container', 'object') - req = Request.blank('/a/c/o', {}, headers={ + req = Request.blank('/v1/a/c/o', {}, headers={ 'Content-Length': 0, 'Content-Type': 'foo/bar;swift_hey=45'}) self.app.update_request(req) res = controller.PUT(req) @@ -1866,7 +1929,7 @@ class TestObjectController(unittest.TestCase): def test_status_map(statuses, expected): self.app.memcache.store = {} set_http_connect(*statuses) - req = Request.blank('/a/c/o.jpg', {}) + req = Request.blank('/v1/a/c/o.jpg', {}) req.content_length = 0 self.app.update_request(req) res = controller.PUT(req) @@ -2315,18 +2378,6 @@ class TestObjectController(unittest.TestCase): def test_node_read_timeout_retry(self): with save_globals(): - self.app.account_ring.get_nodes('account') - for dev in self.app.account_ring.devs.values(): - dev['ip'] = '127.0.0.1' - dev['port'] = 1 - self.app.container_ring.get_nodes('account') - for dev in self.app.container_ring.devs.values(): - dev['ip'] = '127.0.0.1' - dev['port'] = 1 - self.app.object_ring.get_nodes('account') - for dev in self.app.object_ring.devs.values(): - dev['ip'] = '127.0.0.1' - dev['port'] = 1 req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'GET'}) self.app.update_request(req) @@ -2522,7 +2573,7 @@ class TestObjectController(unittest.TestCase): def test_best_response_sets_headers(self): controller = proxy_server.ObjectController(self.app, 'account', 'container', 'object') - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'GET'}) + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'GET'}) resp = controller.best_response(req, [200] * 3, ['OK'] * 3, [''] * 3, 'Object', headers=[{'X-Test': '1'}, {'X-Test': '2'}, @@ -2532,7 +2583,7 @@ class TestObjectController(unittest.TestCase): def test_best_response_sets_etag(self): controller = proxy_server.ObjectController(self.app, 'account', 'container', 'object') - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'GET'}) + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'GET'}) resp = controller.best_response(req, [200] * 3, ['OK'] * 3, [''] * 3, 'Object') self.assertEquals(resp.etag, None) @@ -2561,7 +2612,8 @@ class TestObjectController(unittest.TestCase): def test_proxy_passes_content_length_on_head(self): with save_globals(): - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'HEAD'}) + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'HEAD'}) self.app.update_request(req) controller = proxy_server.ObjectController(self.app, 'account', 'container', 'object') @@ -2618,7 +2670,8 @@ class TestObjectController(unittest.TestCase): controller = proxy_server.ObjectController(self.app, 'account', 'container', 'object') set_http_connect(200, 200, 200, 200, 200, 200) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'DELETE'}) + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'DELETE'}) self.app.update_request(req) resp = getattr(controller, 'DELETE')(req) self.assertEquals(resp.status_int, 200) @@ -2626,49 +2679,56 @@ class TestObjectController(unittest.TestCase): set_http_connect(404, 404, 404) # acct acct acct # make sure to use a fresh request without cached env - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'DELETE'}) + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'DELETE'}) resp = getattr(controller, 'DELETE')(req) self.assertEquals(resp.status_int, 404) set_http_connect(503, 404, 404) # acct acct acct # make sure to use a fresh request without cached env - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'DELETE'}) + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'DELETE'}) resp = getattr(controller, 'DELETE')(req) self.assertEquals(resp.status_int, 404) set_http_connect(503, 503, 404) # acct acct acct # make sure to use a fresh request without cached env - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'DELETE'}) + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'DELETE'}) resp = getattr(controller, 'DELETE')(req) self.assertEquals(resp.status_int, 404) set_http_connect(503, 503, 503) # acct acct acct # make sure to use a fresh request without cached env - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'DELETE'}) + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'DELETE'}) resp = getattr(controller, 'DELETE')(req) self.assertEquals(resp.status_int, 404) set_http_connect(200, 200, 204, 204, 204) # acct cont obj obj obj # make sure to use a fresh request without cached env - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'DELETE'}) + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'DELETE'}) resp = getattr(controller, 'DELETE')(req) self.assertEquals(resp.status_int, 204) set_http_connect(200, 404, 404, 404) # acct cont cont cont # make sure to use a fresh request without cached env - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'DELETE'}) + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'DELETE'}) resp = getattr(controller, 'DELETE')(req) self.assertEquals(resp.status_int, 404) set_http_connect(200, 503, 503, 503) # acct cont cont cont # make sure to use a fresh request without cached env - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'DELETE'}) + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'DELETE'}) resp = getattr(controller, 'DELETE')(req) self.assertEquals(resp.status_int, 404) @@ -2679,7 +2739,8 @@ class TestObjectController(unittest.TestCase): # acct [isn't actually called since everything # is error limited] # make sure to use a fresh request without cached env - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'DELETE'}) + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'DELETE'}) resp = getattr(controller, 'DELETE')(req) self.assertEquals(resp.status_int, 404) @@ -2692,7 +2753,8 @@ class TestObjectController(unittest.TestCase): # acct cont [isn't actually called since # everything is error limited] # make sure to use a fresh request without cached env - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'DELETE'}) + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'DELETE'}) resp = getattr(controller, 'DELETE')(req) self.assertEquals(resp.status_int, 404) @@ -2704,13 +2766,15 @@ class TestObjectController(unittest.TestCase): 'container', 'object') set_http_connect(200, 404, 404, 404, 200, 200, 200) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}) + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'PUT'}) self.app.update_request(req) resp = controller.PUT(req) self.assertEquals(resp.status_int, 404) set_http_connect(200, 404, 404, 404, 200, 200) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'POST'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'POST'}, headers={'Content-Type': 'text/plain'}) self.app.update_request(req) resp = controller.POST(req) @@ -2722,13 +2786,14 @@ class TestObjectController(unittest.TestCase): controller = proxy_server.ObjectController(self.app, 'account', 'container', 'object') set_http_connect(200, 404, 404, 404, 200, 200, 200) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}) + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}) self.app.update_request(req) resp = controller.PUT(req) self.assertEquals(resp.status_int, 404) set_http_connect(200, 404, 404, 404, 200, 200, 200, 200, 200, 200) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'POST'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'POST'}, headers={'Content-Type': 'text/plain'}) self.app.update_request(req) resp = controller.POST(req) @@ -2740,14 +2805,14 @@ class TestObjectController(unittest.TestCase): 'container', 'object') set_http_connect(200, 200, 201, 201, 201) # acct cont obj obj obj - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0'}) self.app.update_request(req) resp = controller.PUT(req) self.assertEquals(resp.status_int, 201) set_http_connect(201, 201, 201) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0', 'X-Object-Meta-' + ('a' * MAX_META_NAME_LENGTH): 'v'}) @@ -2755,7 +2820,7 @@ class TestObjectController(unittest.TestCase): resp = controller.PUT(req) self.assertEquals(resp.status_int, 201) set_http_connect(201, 201, 201) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0', 'X-Object-Meta-' + ('a' * (MAX_META_NAME_LENGTH + 1)): 'v'}) @@ -2764,7 +2829,7 @@ class TestObjectController(unittest.TestCase): self.assertEquals(resp.status_int, 400) set_http_connect(201, 201, 201) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0', 'X-Object-Meta-Too-Long': 'a' * MAX_META_VALUE_LENGTH}) @@ -2772,7 +2837,7 @@ class TestObjectController(unittest.TestCase): resp = controller.PUT(req) self.assertEquals(resp.status_int, 201) set_http_connect(201, 201, 201) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0', 'X-Object-Meta-Too-Long': 'a' * (MAX_META_VALUE_LENGTH + 1)}) @@ -2784,7 +2849,7 @@ class TestObjectController(unittest.TestCase): headers = {'Content-Length': '0'} for x in xrange(MAX_META_COUNT): headers['X-Object-Meta-%d' % x] = 'v' - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers=headers) self.app.update_request(req) resp = controller.PUT(req) @@ -2793,7 +2858,7 @@ class TestObjectController(unittest.TestCase): headers = {'Content-Length': '0'} for x in xrange(MAX_META_COUNT + 1): headers['X-Object-Meta-%d' % x] = 'v' - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers=headers) self.app.update_request(req) resp = controller.PUT(req) @@ -2812,7 +2877,7 @@ class TestObjectController(unittest.TestCase): if MAX_META_OVERALL_SIZE - size > 1: headers['X-Object-Meta-a'] = \ 'a' * (MAX_META_OVERALL_SIZE - size - 1) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers=headers) self.app.update_request(req) resp = controller.PUT(req) @@ -2820,7 +2885,7 @@ class TestObjectController(unittest.TestCase): set_http_connect(201, 201, 201) headers['X-Object-Meta-a'] = \ 'a' * (MAX_META_OVERALL_SIZE - size) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers=headers) self.app.update_request(req) resp = controller.PUT(req) @@ -2831,7 +2896,7 @@ class TestObjectController(unittest.TestCase): controller = proxy_server.ObjectController(self.app, 'account', 'container', 'object') # initial source object PUT - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0'}) self.app.update_request(req) set_http_connect(200, 200, 201, 201, 201) @@ -2840,7 +2905,7 @@ class TestObjectController(unittest.TestCase): self.assertEquals(resp.status_int, 201) # basic copy - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0', 'X-Copy-From': 'c/o'}) self.app.update_request(req) @@ -2852,7 +2917,7 @@ class TestObjectController(unittest.TestCase): self.assertEquals(resp.headers['x-copied-from'], 'c/o') # non-zero content length - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '5', 'X-Copy-From': 'c/o'}) self.app.update_request(req) @@ -2863,7 +2928,7 @@ class TestObjectController(unittest.TestCase): self.assertEquals(resp.status_int, 400) # extra source path parsing - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0', 'X-Copy-From': 'c/o/o2'}) req.account = 'a' @@ -2875,7 +2940,7 @@ class TestObjectController(unittest.TestCase): self.assertEquals(resp.headers['x-copied-from'], 'c/o/o2') # space in soure path - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0', 'X-Copy-From': 'c/o%20o2'}) req.account = 'a' @@ -2887,7 +2952,7 @@ class TestObjectController(unittest.TestCase): self.assertEquals(resp.headers['x-copied-from'], 'c/o%20o2') # repeat tests with leading / - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0', 'X-Copy-From': '/c/o'}) self.app.update_request(req) @@ -2898,7 +2963,7 @@ class TestObjectController(unittest.TestCase): self.assertEquals(resp.status_int, 201) self.assertEquals(resp.headers['x-copied-from'], 'c/o') - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0', 'X-Copy-From': '/c/o/o2'}) req.account = 'a' @@ -2912,7 +2977,7 @@ class TestObjectController(unittest.TestCase): # negative tests # invalid x-copy-from path - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0', 'X-Copy-From': '/c'}) self.app.update_request(req) @@ -2921,7 +2986,7 @@ class TestObjectController(unittest.TestCase): self.assertEquals(resp.status_int // 100, 4) # client error # server error - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0', 'X-Copy-From': '/c/o'}) self.app.update_request(req) @@ -2932,7 +2997,7 @@ class TestObjectController(unittest.TestCase): self.assertEquals(resp.status_int, 503) # not found - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0', 'X-Copy-From': '/c/o'}) self.app.update_request(req) @@ -2943,7 +3008,7 @@ class TestObjectController(unittest.TestCase): self.assertEquals(resp.status_int, 404) # some missing containers - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0', 'X-Copy-From': '/c/o'}) self.app.update_request(req) @@ -2954,7 +3019,7 @@ class TestObjectController(unittest.TestCase): self.assertEquals(resp.status_int, 201) # test object meta data - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0', 'X-Copy-From': '/c/o', 'X-Object-Meta-Ours': 'okay'}) @@ -2970,7 +3035,7 @@ class TestObjectController(unittest.TestCase): self.assertEquals(resp.headers.get('x-delete-at'), '9876543210') # copy-from object is too large to fit in target object - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0', 'X-Copy-From': '/c/o'}) self.app.update_request(req) @@ -2993,7 +3058,7 @@ class TestObjectController(unittest.TestCase): def test_COPY(self): with save_globals(): controller = proxy_server.ObjectController(self.app, 'a', 'c', 'o') - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0'}) req.account = 'a' set_http_connect(200, 200, 201, 201, 201) @@ -3001,7 +3066,8 @@ class TestObjectController(unittest.TestCase): resp = controller.PUT(req) self.assertEquals(resp.status_int, 201) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'COPY'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'COPY'}, headers={'Destination': 'c/o'}) req.account = 'a' set_http_connect(200, 200, 200, 200, 200, 201, 201, 201, 200, 200) @@ -3011,7 +3077,7 @@ class TestObjectController(unittest.TestCase): self.assertEquals(resp.status_int, 201) self.assertEquals(resp.headers['x-copied-from'], 'c/o') - req = Request.blank('/a/c/o/o2', + req = Request.blank('/v1/a/c/o/o2', environ={'REQUEST_METHOD': 'COPY'}, headers={'Destination': 'c/o'}) req.account = 'a' @@ -3023,7 +3089,8 @@ class TestObjectController(unittest.TestCase): self.assertEquals(resp.status_int, 201) self.assertEquals(resp.headers['x-copied-from'], 'c/o/o2') - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'COPY'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'COPY'}, headers={'Destination': '/c/o'}) req.account = 'a' controller.object_name = 'o' @@ -3034,7 +3101,7 @@ class TestObjectController(unittest.TestCase): self.assertEquals(resp.status_int, 201) self.assertEquals(resp.headers['x-copied-from'], 'c/o') - req = Request.blank('/a/c/o/o2', + req = Request.blank('/v1/a/c/o/o2', environ={'REQUEST_METHOD': 'COPY'}, headers={'Destination': '/c/o'}) req.account = 'a' @@ -3046,7 +3113,8 @@ class TestObjectController(unittest.TestCase): self.assertEquals(resp.status_int, 201) self.assertEquals(resp.headers['x-copied-from'], 'c/o/o2') - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'COPY'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'COPY'}, headers={'Destination': 'c_o'}) req.account = 'a' controller.object_name = 'o' @@ -3056,7 +3124,8 @@ class TestObjectController(unittest.TestCase): resp = controller.COPY(req) self.assertEquals(resp.status_int, 412) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'COPY'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'COPY'}, headers={'Destination': '/c/o'}) req.account = 'a' controller.object_name = 'o' @@ -3066,7 +3135,8 @@ class TestObjectController(unittest.TestCase): resp = controller.COPY(req) self.assertEquals(resp.status_int, 503) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'COPY'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'COPY'}, headers={'Destination': '/c/o'}) req.account = 'a' controller.object_name = 'o' @@ -3076,7 +3146,8 @@ class TestObjectController(unittest.TestCase): resp = controller.COPY(req) self.assertEquals(resp.status_int, 404) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'COPY'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'COPY'}, headers={'Destination': '/c/o'}) req.account = 'a' controller.object_name = 'o' @@ -3086,7 +3157,8 @@ class TestObjectController(unittest.TestCase): resp = controller.COPY(req) self.assertEquals(resp.status_int, 201) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'COPY'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'COPY'}, headers={'Destination': '/c/o', 'X-Object-Meta-Ours': 'okay'}) req.account = 'a' @@ -3101,7 +3173,8 @@ class TestObjectController(unittest.TestCase): self.assertEquals(resp.headers.get('x-object-meta-ours'), 'okay') self.assertEquals(resp.headers.get('x-delete-at'), '9876543210') - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'COPY'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'COPY'}, headers={'Destination': '/c/o'}) self.app.update_request(req) @@ -3123,7 +3196,8 @@ class TestObjectController(unittest.TestCase): def test_COPY_newest(self): with save_globals(): controller = proxy_server.ObjectController(self.app, 'a', 'c', 'o') - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'COPY'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'COPY'}, headers={'Destination': '/c/o'}) req.account = 'a' controller.object_name = 'o' @@ -3150,7 +3224,8 @@ class TestObjectController(unittest.TestCase): controller._connect_put_node = fake_connect_put_node set_http_connect(200, 200, 200, 200, 200, 201, 201, 201) self.app.memcache.store = {} - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'COPY'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'COPY'}, headers={'Destination': '/c/o'}) self.app.update_request(req) @@ -3186,7 +3261,8 @@ class TestObjectController(unittest.TestCase): set_http_connect(201, 201, 201, 201) controller = proxy_server.ObjectController(self.app, 'account', 'container', 'object') - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'COPY'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'COPY'}, headers={'Transfer-Encoding': 'chunked', 'Content-Type': 'foo/bar'}) @@ -3198,7 +3274,8 @@ class TestObjectController(unittest.TestCase): # test 413 entity to large set_http_connect(201, 201, 201, 201) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'COPY'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'COPY'}, headers={'Transfer-Encoding': 'chunked', 'Content-Type': 'foo/bar'}) req.body_file = ChunkedFile(11) @@ -4290,7 +4367,7 @@ class TestObjectController(unittest.TestCase): # no etag supplied, object servers return success w/ diff values controller = proxy_server.ObjectController(self.app, 'account', 'container', 'object') - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '0'}) self.app.update_request(req) set_http_connect(200, 201, 201, 201, @@ -4302,7 +4379,7 @@ class TestObjectController(unittest.TestCase): self.assertEquals(resp.status_int // 100, 5) # server error # req supplies etag, object servers return 422 - mismatch - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={ 'Content-Length': '0', 'ETag': '68b329da9893e34099c7d8ad5cb9c940', @@ -4318,7 +4395,7 @@ class TestObjectController(unittest.TestCase): def test_response_get_accept_ranges_header(self): with save_globals(): - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'GET'}) + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'GET'}) self.app.update_request(req) controller = proxy_server.ObjectController(self.app, 'account', 'container', 'object') @@ -4329,7 +4406,8 @@ class TestObjectController(unittest.TestCase): def test_response_head_accept_ranges_header(self): with save_globals(): - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'HEAD'}) + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'HEAD'}) self.app.update_request(req) controller = proxy_server.ObjectController(self.app, 'account', 'container', 'object') @@ -4348,7 +4426,7 @@ class TestObjectController(unittest.TestCase): set_http_connect(200, 200, 201, 201, 201) controller = proxy_server.ObjectController(self.app, 'account', 'container', 'object') - req = Request.blank('/a/c/o') + req = Request.blank('/v1/a/c/o') req.environ['swift.authorize'] = authorize self.app.update_request(req) controller.GET(req) @@ -4364,7 +4442,7 @@ class TestObjectController(unittest.TestCase): set_http_connect(200, 200, 201, 201, 201) controller = proxy_server.ObjectController(self.app, 'account', 'container', 'object') - req = Request.blank('/a/c/o', {'REQUEST_METHOD': 'HEAD'}) + req = Request.blank('/v1/a/c/o', {'REQUEST_METHOD': 'HEAD'}) req.environ['swift.authorize'] = authorize self.app.update_request(req) controller.HEAD(req) @@ -4381,7 +4459,8 @@ class TestObjectController(unittest.TestCase): set_http_connect(200, 200, 201, 201, 201) controller = proxy_server.ObjectController(self.app, 'account', 'container', 'object') - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'POST'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'POST'}, headers={'Content-Length': '5'}, body='12345') req.environ['swift.authorize'] = authorize self.app.update_request(req) @@ -4398,7 +4477,8 @@ class TestObjectController(unittest.TestCase): set_http_connect(200, 200, 200, 200, 200, 201, 201, 201) controller = proxy_server.ObjectController(self.app, 'account', 'container', 'object') - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'POST'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'POST'}, headers={'Content-Length': '5'}, body='12345') req.environ['swift.authorize'] = authorize self.app.update_request(req) @@ -4415,7 +4495,7 @@ class TestObjectController(unittest.TestCase): set_http_connect(200, 200, 201, 201, 201) controller = proxy_server.ObjectController(self.app, 'account', 'container', 'object') - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '5'}, body='12345') req.environ['swift.authorize'] = authorize self.app.update_request(req) @@ -4432,7 +4512,8 @@ class TestObjectController(unittest.TestCase): set_http_connect(200, 200, 200, 200, 200, 201, 201, 201) controller = proxy_server.ObjectController(self.app, 'account', 'container', 'object') - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'COPY'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'COPY'}, headers={'Destination': 'c/o'}) req.environ['swift.authorize'] = authorize self.app.update_request(req) @@ -4450,7 +4531,7 @@ class TestObjectController(unittest.TestCase): try: t = time.time() time.time = lambda: t - req = Request.blank('/a/c/o', {}, + req = Request.blank('/v1/a/c/o', {}, headers={'Content-Type': 'foo/bar', 'X-Delete-After': '60'}) self.app.update_request(req) @@ -4465,7 +4546,7 @@ class TestObjectController(unittest.TestCase): 'object') set_http_connect(200, 200, 202, 202, 202) self.app.memcache.store = {} - req = Request.blank('/a/c/o', {}, + req = Request.blank('/v1/a/c/o', {}, headers={'Content-Type': 'foo/bar', 'X-Delete-After': '60'}) self.app.update_request(req) @@ -4483,7 +4564,7 @@ class TestObjectController(unittest.TestCase): 'container', 'object') set_http_connect(200, 200, 200, 200, 200, 202, 202, 202) self.app.memcache.store = {} - req = Request.blank('/a/c/o', {}, + req = Request.blank('/v1/a/c/o', {}, headers={'Content-Type': 'foo/bar', 'X-Delete-After': '60.1'}) self.app.update_request(req) @@ -4498,7 +4579,7 @@ class TestObjectController(unittest.TestCase): 'container', 'object') set_http_connect(200, 200, 200, 200, 200, 202, 202, 202) self.app.memcache.store = {} - req = Request.blank('/a/c/o', {}, + req = Request.blank('/v1/a/c/o', {}, headers={'Content-Type': 'foo/bar', 'X-Delete-After': '-60'}) self.app.update_request(req) @@ -4522,7 +4603,7 @@ class TestObjectController(unittest.TestCase): set_http_connect(200, 200) self.app.memcache.store = {} t = str(int(time.time() + 100)) - req = Request.blank('/a/c/o', {}, + req = Request.blank('/v1/a/c/o', {}, headers={'Content-Type': 'foo/bar', 'X-Delete-At': t}) self.app.update_request(req) @@ -4534,7 +4615,7 @@ class TestObjectController(unittest.TestCase): self.assertTrue('X-Delete-At-Container' in given_headers) t = str(int(time.time() + 100)) + '.1' - req = Request.blank('/a/c/o', {}, + req = Request.blank('/v1/a/c/o', {}, headers={'Content-Type': 'foo/bar', 'X-Delete-At': t}) self.app.update_request(req) @@ -4543,7 +4624,7 @@ class TestObjectController(unittest.TestCase): self.assertTrue('Non-integer X-Delete-At' in resp.body) t = str(int(time.time() - 100)) - req = Request.blank('/a/c/o', {}, + req = Request.blank('/v1/a/c/o', {}, headers={'Content-Type': 'foo/bar', 'X-Delete-At': t}) self.app.update_request(req) @@ -4562,7 +4643,7 @@ class TestObjectController(unittest.TestCase): try: t = time.time() time.time = lambda: t - req = Request.blank('/a/c/o', {}, + req = Request.blank('/v1/a/c/o', {}, headers={'Content-Length': '0', 'Content-Type': 'foo/bar', 'X-Delete-After': '60'}) @@ -4581,7 +4662,7 @@ class TestObjectController(unittest.TestCase): 'container', 'object') set_http_connect(200, 200, 201, 201, 201) self.app.memcache.store = {} - req = Request.blank('/a/c/o', {}, + req = Request.blank('/v1/a/c/o', {}, headers={'Content-Length': '0', 'Content-Type': 'foo/bar', 'X-Delete-After': '60.1'}) @@ -4597,7 +4678,7 @@ class TestObjectController(unittest.TestCase): 'container', 'object') set_http_connect(200, 200, 201, 201, 201) self.app.memcache.store = {} - req = Request.blank('/a/c/o', {}, + req = Request.blank('/v1/a/c/o', {}, headers={'Content-Length': '0', 'Content-Type': 'foo/bar', 'X-Delete-After': '-60'}) @@ -4621,7 +4702,7 @@ class TestObjectController(unittest.TestCase): set_http_connect(200, 200) self.app.memcache.store = {} t = str(int(time.time() + 100)) - req = Request.blank('/a/c/o', {}, + req = Request.blank('/v1/a/c/o', {}, headers={'Content-Length': '0', 'Content-Type': 'foo/bar', 'X-Delete-At': t}) @@ -4634,7 +4715,7 @@ class TestObjectController(unittest.TestCase): self.assertTrue('X-Delete-At-Container' in given_headers) t = str(int(time.time() + 100)) + '.1' - req = Request.blank('/a/c/o', {}, + req = Request.blank('/v1/a/c/o', {}, headers={'Content-Length': '0', 'Content-Type': 'foo/bar', 'X-Delete-At': t}) @@ -4644,7 +4725,7 @@ class TestObjectController(unittest.TestCase): self.assertTrue('Non-integer X-Delete-At' in resp.body) t = str(int(time.time() - 100)) - req = Request.blank('/a/c/o', {}, + req = Request.blank('/v1/a/c/o', {}, headers={'Content-Length': '0', 'Content-Type': 'foo/bar', 'X-Delete-At': t}) @@ -4674,7 +4755,10 @@ class TestObjectController(unittest.TestCase): # Remember Request instance count, make sure the GC is run for pythons # without reference counting. for i in xrange(4): + sleep(0) # let eventlet do its thing gc.collect() + else: + sleep(0) before_request_instances = len(_request_instances) # GET test file, but disconnect early sock = connect_tcp(('localhost', prolis.getsockname()[1])) @@ -4691,10 +4775,12 @@ class TestObjectController(unittest.TestCase): fd.read(1) fd.close() sock.close() - sleep(0) # let eventlet do it's thing # Make sure the GC is run again for pythons without reference counting for i in xrange(4): + sleep(0) # let eventlet do its thing gc.collect() + else: + sleep(0) self.assertEquals(before_request_instances, len(_request_instances)) def test_OPTIONS(self): @@ -4706,7 +4792,7 @@ class TestObjectController(unittest.TestCase): return {} controller.container_info = my_empty_container_info req = Request.blank( - '/a/c/o.jpg', + '/v1/a/c/o.jpg', {'REQUEST_METHOD': 'OPTIONS'}, headers={'Origin': 'http://foo.com', 'Access-Control-Request-Method': 'GET'}) @@ -4717,7 +4803,7 @@ class TestObjectController(unittest.TestCase): return {'cors': {'allow_origin': None}} controller.container_info = my_empty_origin_container_info req = Request.blank( - '/a/c/o.jpg', + '/v1/a/c/o.jpg', {'REQUEST_METHOD': 'OPTIONS'}, headers={'Origin': 'http://foo.com', 'Access-Control-Request-Method': 'GET'}) @@ -4733,7 +4819,7 @@ class TestObjectController(unittest.TestCase): } controller.container_info = my_container_info req = Request.blank( - '/a/c/o.jpg', + '/v1/a/c/o.jpg', {'REQUEST_METHOD': 'OPTIONS'}, headers={'Origin': 'https://foo.bar', 'Access-Control-Request-Method': 'GET'}) @@ -4751,13 +4837,13 @@ class TestObjectController(unittest.TestCase): 7) self.assertEquals('999', resp.headers['access-control-max-age']) req = Request.blank( - '/a/c/o.jpg', + '/v1/a/c/o.jpg', {'REQUEST_METHOD': 'OPTIONS'}, headers={'Origin': 'https://foo.bar'}) req.content_length = 0 resp = controller.OPTIONS(req) self.assertEquals(401, resp.status_int) - req = Request.blank('/a/c/o.jpg', {'REQUEST_METHOD': 'OPTIONS'}) + req = Request.blank('/v1/a/c/o.jpg', {'REQUEST_METHOD': 'OPTIONS'}) req.content_length = 0 resp = controller.OPTIONS(req) self.assertEquals(200, resp.status_int) @@ -4766,13 +4852,13 @@ class TestObjectController(unittest.TestCase): verb in resp.headers['Allow']) self.assertEquals(len(resp.headers['Allow'].split(', ')), 7) req = Request.blank( - '/a/c/o.jpg', + '/v1/a/c/o.jpg', {'REQUEST_METHOD': 'OPTIONS'}, headers={'Origin': 'http://foo.com'}) resp = controller.OPTIONS(req) self.assertEquals(401, resp.status_int) req = Request.blank( - '/a/c/o.jpg', + '/v1/a/c/o.jpg', {'REQUEST_METHOD': 'OPTIONS'}, headers={'Origin': 'http://foo.bar', 'Access-Control-Request-Method': 'GET'}) @@ -4789,7 +4875,7 @@ class TestObjectController(unittest.TestCase): } controller.container_info = my_container_info_wildcard req = Request.blank( - '/a/c/o.jpg', + '/v1/a/c/o.jpg', {'REQUEST_METHOD': 'OPTIONS'}, headers={'Origin': 'https://bar.baz', 'Access-Control-Request-Method': 'GET'}) @@ -4826,7 +4912,7 @@ class TestObjectController(unittest.TestCase): }) req = Request.blank( - '/a/c/o.jpg', + '/v1/a/c/o.jpg', {'REQUEST_METHOD': 'GET'}, headers={'Origin': 'http://foo.bar'}) @@ -4876,7 +4962,7 @@ class TestObjectController(unittest.TestCase): key=lambda d: d.get(header_list[0]) or 'z') def test_PUT_x_container_headers_with_equal_replicas(self): - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '5'}, body='12345') controller = proxy_server.ObjectController(self.app, 'a', 'c', 'o') seen_headers = self._gather_x_container_headers( @@ -4897,7 +4983,7 @@ class TestObjectController(unittest.TestCase): def test_PUT_x_container_headers_with_fewer_container_replicas(self): self.app.container_ring.set_replicas(2) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '5'}, body='12345') controller = proxy_server.ObjectController(self.app, 'a', 'c', 'o') seen_headers = self._gather_x_container_headers( @@ -4919,7 +5005,7 @@ class TestObjectController(unittest.TestCase): def test_PUT_x_container_headers_with_more_container_replicas(self): self.app.container_ring.set_replicas(4) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Length': '5'}, body='12345') controller = proxy_server.ObjectController(self.app, 'a', 'c', 'o') seen_headers = self._gather_x_container_headers( @@ -4942,7 +5028,8 @@ class TestObjectController(unittest.TestCase): self.app.container_ring.set_replicas(4) self.app.object_post_as_copy = False - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'POST'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'POST'}, headers={'Content-Type': 'application/stuff'}) controller = proxy_server.ObjectController(self.app, 'a', 'c', 'o') seen_headers = self._gather_x_container_headers( @@ -4964,7 +5051,8 @@ class TestObjectController(unittest.TestCase): def test_DELETE_x_container_headers_with_more_container_replicas(self): self.app.container_ring.set_replicas(4) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'DELETE'}, + req = Request.blank('/v1/a/c/o', + environ={'REQUEST_METHOD': 'DELETE'}, headers={'Content-Type': 'application/stuff'}) controller = proxy_server.ObjectController(self.app, 'a', 'c', 'o') seen_headers = self._gather_x_container_headers( @@ -4993,7 +5081,7 @@ class TestObjectController(unittest.TestCase): delete_at_timestamp / self.app.expiring_objects_container_divisor * self.app.expiring_objects_container_divisor) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Type': 'application/stuff', 'Content-Length': '0', 'X-Delete-At': str(delete_at_timestamp)}) @@ -5031,7 +5119,7 @@ class TestObjectController(unittest.TestCase): delete_at_timestamp / self.app.expiring_objects_container_divisor * self.app.expiring_objects_container_divisor) - req = Request.blank('/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c/o', environ={'REQUEST_METHOD': 'PUT'}, headers={'Content-Type': 'application/stuff', 'Content-Length': 0, 'X-Delete-At': str(delete_at_timestamp)}) @@ -5086,14 +5174,14 @@ class TestContainerController(unittest.TestCase): kwargs['missing_container'] = missing_container set_http_connect(*statuses, **kwargs) self.app.memcache.store = {} - req = Request.blank('/a/c', headers={'Content-Length': '0', + req = Request.blank('/v1/a/c', headers={'Content-Length': '0', 'Content-Type': 'text/plain'}) self.app.update_request(req) res = method(req) self.assertEquals(res.status_int, expected) set_http_connect(*statuses, **kwargs) self.app.memcache.store = {} - req = Request.blank('/a/c/', headers={'Content-Length': '0', + req = Request.blank('/v1/a/c/', headers={'Content-Length': '0', 'Content-Type': 'text/plain'}) self.app.update_request(req) res = method(req) @@ -5107,7 +5195,7 @@ class TestContainerController(unittest.TestCase): c_expected=None, a_expected=None, **kwargs): set_http_connect(*statuses, **kwargs) self.app.memcache.store = {} - req = Request.blank('/a/c', {}) + req = Request.blank('/v1/a/c', {}) self.app.update_request(req) res = controller.HEAD(req) self.assertEquals(res.status[:len(str(expected))], @@ -5131,7 +5219,7 @@ class TestContainerController(unittest.TestCase): set_http_connect(*statuses, **kwargs) self.app.memcache.store = {} - req = Request.blank('/a/c', {}) + req = Request.blank('/v1/a/c', {}) self.app.update_request(req) res = controller.GET(req) self.assertEquals(res.status[:len(str(expected))], @@ -5181,7 +5269,7 @@ class TestContainerController(unittest.TestCase): def test_status_map(statuses, expected, **kwargs): set_http_connect(*statuses, **kwargs) self.app.memcache.store = {} - req = Request.blank('/a/c', {}) + req = Request.blank('/v1/a/c', {}) req.content_length = 0 self.app.update_request(req) res = controller.PUT(req) @@ -5239,7 +5327,7 @@ class TestContainerController(unittest.TestCase): def test_status_map(statuses, expected, **kwargs): set_http_connect(*statuses, **kwargs) self.app.memcache.store = {} - req = Request.blank('/a/c', {}) + req = Request.blank('/v1/a/c', {}) req.content_length = 0 self.app.update_request(req) res = controller.POST(req) @@ -5318,26 +5406,30 @@ class TestContainerController(unittest.TestCase): else: set_http_connect(200, 200, 200, 200) self.app.memcache.store = {} - req = Request.blank('/a/c', environ={'REQUEST_METHOD': meth}) + req = Request.blank('/v1/a/c', + environ={'REQUEST_METHOD': meth}) self.app.update_request(req) resp = getattr(controller, meth)(req) self.assertEquals(resp.status_int, 200) set_http_connect(404, 404, 404, 200, 200, 200) # Make sure it is a blank request wthout env caching - req = Request.blank('/a/c', environ={'REQUEST_METHOD': meth}) + req = Request.blank('/v1/a/c', + environ={'REQUEST_METHOD': meth}) resp = getattr(controller, meth)(req) self.assertEquals(resp.status_int, 404) set_http_connect(503, 404, 404) # Make sure it is a blank request wthout env caching - req = Request.blank('/a/c', environ={'REQUEST_METHOD': meth}) + req = Request.blank('/v1/a/c', + environ={'REQUEST_METHOD': meth}) resp = getattr(controller, meth)(req) self.assertEquals(resp.status_int, 404) set_http_connect(503, 404, raise_exc=True) # Make sure it is a blank request wthout env caching - req = Request.blank('/a/c', environ={'REQUEST_METHOD': meth}) + req = Request.blank('/v1/a/c', + environ={'REQUEST_METHOD': meth}) resp = getattr(controller, meth)(req) self.assertEquals(resp.status_int, 404) @@ -5346,7 +5438,8 @@ class TestContainerController(unittest.TestCase): dev['last_error'] = time.time() set_http_connect(200, 200, 200, 200, 200, 200) # Make sure it is a blank request wthout env caching - req = Request.blank('/a/c', environ={'REQUEST_METHOD': meth}) + req = Request.blank('/v1/a/c', + environ={'REQUEST_METHOD': meth}) resp = getattr(controller, meth)(req) self.assertEquals(resp.status_int, 404) @@ -5371,7 +5464,7 @@ class TestContainerController(unittest.TestCase): self.app.memcache = MockMemcache(allow_lock=True) set_http_connect(200, 201, 201, 201, missing_container=True) - req = Request.blank('/a/c', environ={'REQUEST_METHOD': 'PUT'}) + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': 'PUT'}) self.app.update_request(req) res = controller.PUT(req) self.assertEquals(res.status_int, 201) @@ -5429,7 +5522,7 @@ class TestContainerController(unittest.TestCase): set_http_connect(200, 200, body='{}') controller = proxy_server.ContainerController(self.app, 'account', 'container') - req = Request.blank('/a/c?format=json') + req = Request.blank('/v1/a/c?format=json') self.app.update_request(req) res = controller.GET(req) self.assert_('accept-ranges' in res.headers) @@ -5440,7 +5533,7 @@ class TestContainerController(unittest.TestCase): set_http_connect(200, 200, body='{}') controller = proxy_server.ContainerController(self.app, 'account', 'container') - req = Request.blank('/a/c?format=json') + req = Request.blank('/v1/a/c?format=json') self.app.update_request(req) res = controller.HEAD(req) self.assert_('accept-ranges' in res.headers) @@ -5483,7 +5576,8 @@ class TestContainerController(unittest.TestCase): controller = \ proxy_server.ContainerController(self.app, 'a', 'c') set_http_connect(200, 201, 201, 201, give_connect=test_connect) - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}, + req = Request.blank('/v1/a/c', + environ={'REQUEST_METHOD': method}, headers={test_header: test_value}) self.app.update_request(req) getattr(controller, method)(req) @@ -5499,20 +5593,20 @@ class TestContainerController(unittest.TestCase): with save_globals(): controller = proxy_server.ContainerController(self.app, 'a', 'c') set_http_connect(200, 201, 201, 201) - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}) + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': method}) self.app.update_request(req) resp = getattr(controller, method)(req) self.assertEquals(resp.status_int, 201) set_http_connect(201, 201, 201) - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': method}, headers={'X-Container-Meta-' + ('a' * MAX_META_NAME_LENGTH): 'v'}) self.app.update_request(req) resp = getattr(controller, method)(req) self.assertEquals(resp.status_int, 201) set_http_connect(201, 201, 201) - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': method}, headers={'X-Container-Meta-' + ('a' * (MAX_META_NAME_LENGTH + 1)): 'v'}) self.app.update_request(req) @@ -5520,14 +5614,14 @@ class TestContainerController(unittest.TestCase): self.assertEquals(resp.status_int, 400) set_http_connect(201, 201, 201) - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': method}, headers={'X-Container-Meta-Too-Long': 'a' * MAX_META_VALUE_LENGTH}) self.app.update_request(req) resp = getattr(controller, method)(req) self.assertEquals(resp.status_int, 201) set_http_connect(201, 201, 201) - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': method}, headers={'X-Container-Meta-Too-Long': 'a' * (MAX_META_VALUE_LENGTH + 1)}) self.app.update_request(req) @@ -5538,7 +5632,7 @@ class TestContainerController(unittest.TestCase): headers = {} for x in xrange(MAX_META_COUNT): headers['X-Container-Meta-%d' % x] = 'v' - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': method}, headers=headers) self.app.update_request(req) resp = getattr(controller, method)(req) @@ -5547,7 +5641,7 @@ class TestContainerController(unittest.TestCase): headers = {} for x in xrange(MAX_META_COUNT + 1): headers['X-Container-Meta-%d' % x] = 'v' - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': method}, headers=headers) self.app.update_request(req) resp = getattr(controller, method)(req) @@ -5565,7 +5659,7 @@ class TestContainerController(unittest.TestCase): if MAX_META_OVERALL_SIZE - size > 1: headers['X-Container-Meta-a'] = \ 'a' * (MAX_META_OVERALL_SIZE - size - 1) - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': method}, headers=headers) self.app.update_request(req) resp = getattr(controller, method)(req) @@ -5573,7 +5667,7 @@ class TestContainerController(unittest.TestCase): set_http_connect(201, 201, 201) headers['X-Container-Meta-a'] = \ 'a' * (MAX_META_OVERALL_SIZE - size) - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': method}, headers=headers) self.app.update_request(req) resp = getattr(controller, method)(req) @@ -5589,7 +5683,7 @@ class TestContainerController(unittest.TestCase): set_http_connect(200, 201, 201, 201) controller = proxy_server.ContainerController(self.app, 'account', 'container') - req = Request.blank('/a/c', environ={'REQUEST_METHOD': 'POST'}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': 'POST'}, headers={'X-Container-Read': '.r:*'}) req.environ['swift.clean_acl'] = clean_acl self.app.update_request(req) @@ -5600,7 +5694,7 @@ class TestContainerController(unittest.TestCase): set_http_connect(200, 201, 201, 201) controller = proxy_server.ContainerController(self.app, 'account', 'container') - req = Request.blank('/a/c', environ={'REQUEST_METHOD': 'POST'}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': 'POST'}, headers={'X-Container-Write': '.r:*'}) req.environ['swift.clean_acl'] = clean_acl self.app.update_request(req) @@ -5617,7 +5711,7 @@ class TestContainerController(unittest.TestCase): set_http_connect(200, 201, 201, 201) controller = proxy_server.ContainerController(self.app, 'account', 'container') - req = Request.blank('/a/c', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': 'PUT'}, headers={'X-Container-Read': '.r:*'}) req.environ['swift.clean_acl'] = clean_acl self.app.update_request(req) @@ -5628,7 +5722,7 @@ class TestContainerController(unittest.TestCase): set_http_connect(200, 201, 201, 201) controller = proxy_server.ContainerController(self.app, 'account', 'container') - req = Request.blank('/a/c', environ={'REQUEST_METHOD': 'PUT'}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': 'PUT'}, headers={'X-Container-Write': '.r:*'}) req.environ['swift.clean_acl'] = clean_acl self.app.update_request(req) @@ -5640,9 +5734,10 @@ class TestContainerController(unittest.TestCase): set_http_connect(200, 204, 204, 204) controller = proxy_server.ContainerController(self.app, 'account', 'container') - req = Request.blank('/a/c') + req = Request.blank('/v1/a/c') self.app.update_request(req) res = controller.GET(req) + self.assertEquals(res.status_int, 204) self.assertEquals( res.environ['swift.container/a/c']['status'], 204) self.assertEquals(res.content_length, 0) @@ -5658,7 +5753,7 @@ class TestContainerController(unittest.TestCase): set_http_connect(200, 201, 201, 201) controller = proxy_server.ContainerController(self.app, 'account', 'container') - req = Request.blank('/a/c') + req = Request.blank('/v1/a/c') req.environ['swift.authorize'] = authorize self.app.update_request(req) res = controller.GET(req) @@ -5675,7 +5770,7 @@ class TestContainerController(unittest.TestCase): set_http_connect(200, 201, 201, 201) controller = proxy_server.ContainerController(self.app, 'account', 'container') - req = Request.blank('/a/c', {'REQUEST_METHOD': 'HEAD'}) + req = Request.blank('/v1/a/c', {'REQUEST_METHOD': 'HEAD'}) req.environ['swift.authorize'] = authorize self.app.update_request(req) controller.HEAD(req) @@ -5689,7 +5784,7 @@ class TestContainerController(unittest.TestCase): return {} controller.container_info = my_empty_container_info req = Request.blank( - '/a/c', + '/v1/a/c', {'REQUEST_METHOD': 'OPTIONS'}, headers={'Origin': 'http://foo.com', 'Access-Control-Request-Method': 'GET'}) @@ -5700,7 +5795,7 @@ class TestContainerController(unittest.TestCase): return {'cors': {'allow_origin': None}} controller.container_info = my_empty_origin_container_info req = Request.blank( - '/a/c', + '/v1/a/c', {'REQUEST_METHOD': 'OPTIONS'}, headers={'Origin': 'http://foo.com', 'Access-Control-Request-Method': 'GET'}) @@ -5716,7 +5811,7 @@ class TestContainerController(unittest.TestCase): } controller.container_info = my_container_info req = Request.blank( - '/a/c', + '/v1/a/c', {'REQUEST_METHOD': 'OPTIONS'}, headers={'Origin': 'https://foo.bar', 'Access-Control-Request-Method': 'GET'}) @@ -5734,13 +5829,13 @@ class TestContainerController(unittest.TestCase): 6) self.assertEquals('999', resp.headers['access-control-max-age']) req = Request.blank( - '/a/c', + '/v1/a/c', {'REQUEST_METHOD': 'OPTIONS'}, headers={'Origin': 'https://foo.bar'}) req.content_length = 0 resp = controller.OPTIONS(req) self.assertEquals(401, resp.status_int) - req = Request.blank('/a/c', {'REQUEST_METHOD': 'OPTIONS'}) + req = Request.blank('/v1/a/c', {'REQUEST_METHOD': 'OPTIONS'}) req.content_length = 0 resp = controller.OPTIONS(req) self.assertEquals(200, resp.status_int) @@ -5749,14 +5844,14 @@ class TestContainerController(unittest.TestCase): verb in resp.headers['Allow']) self.assertEquals(len(resp.headers['Allow'].split(', ')), 6) req = Request.blank( - '/a/c', + '/v1/a/c', {'REQUEST_METHOD': 'OPTIONS'}, headers={'Origin': 'http://foo.bar', 'Access-Control-Request-Method': 'GET'}) resp = controller.OPTIONS(req) self.assertEquals(401, resp.status_int) req = Request.blank( - '/a/c', + '/v1/a/c', {'REQUEST_METHOD': 'OPTIONS'}, headers={'Origin': 'http://foo.bar', 'Access-Control-Request-Method': 'GET'}) @@ -5773,7 +5868,7 @@ class TestContainerController(unittest.TestCase): } controller.container_info = my_container_info_wildcard req = Request.blank( - '/a/c/o.jpg', + '/v1/a/c/o.jpg', {'REQUEST_METHOD': 'OPTIONS'}, headers={'Origin': 'https://bar.baz', 'Access-Control-Request-Method': 'GET'}) @@ -5792,7 +5887,7 @@ class TestContainerController(unittest.TestCase): self.assertEquals('999', resp.headers['access-control-max-age']) req = Request.blank( - '/a/c/o.jpg', + '/v1/a/c/o.jpg', {'REQUEST_METHOD': 'OPTIONS'}, headers={'Origin': 'https://bar.baz', 'Access-Control-Request-Headers': @@ -5825,7 +5920,7 @@ class TestContainerController(unittest.TestCase): }) req = Request.blank( - '/a/c', + '/v1/a/c', {'REQUEST_METHOD': 'GET'}, headers={'Origin': 'http://foo.bar'}) @@ -5875,7 +5970,7 @@ class TestContainerController(unittest.TestCase): def test_PUT_x_account_headers_with_fewer_account_replicas(self): self.app.account_ring.set_replicas(2) - req = Request.blank('/a/c', headers={'': ''}) + req = Request.blank('/v1/a/c', headers={'': ''}) controller = proxy_server.ContainerController(self.app, 'a', 'c') seen_headers = self._gather_x_account_headers( @@ -5895,7 +5990,7 @@ class TestContainerController(unittest.TestCase): def test_PUT_x_account_headers_with_more_account_replicas(self): self.app.account_ring.set_replicas(4) - req = Request.blank('/a/c', headers={'': ''}) + req = Request.blank('/v1/a/c', headers={'': ''}) controller = proxy_server.ContainerController(self.app, 'a', 'c') seen_headers = self._gather_x_account_headers( @@ -5915,7 +6010,7 @@ class TestContainerController(unittest.TestCase): def test_DELETE_x_account_headers_with_fewer_account_replicas(self): self.app.account_ring.set_replicas(2) - req = Request.blank('/a/c', headers={'': ''}) + req = Request.blank('/v1/a/c', headers={'': ''}) controller = proxy_server.ContainerController(self.app, 'a', 'c') seen_headers = self._gather_x_account_headers( @@ -5935,7 +6030,7 @@ class TestContainerController(unittest.TestCase): def test_DELETE_x_account_headers_with_more_account_replicas(self): self.app.account_ring.set_replicas(4) - req = Request.blank('/a/c', headers={'': ''}) + req = Request.blank('/v1/a/c', headers={'': ''}) controller = proxy_server.ContainerController(self.app, 'a', 'c') seen_headers = self._gather_x_account_headers( @@ -5953,6 +6048,19 @@ class TestContainerController(unittest.TestCase): 'X-Account-Device': 'sdc'} ]) + def test_node_read_timeout_retry_to_container(self): + with save_globals(): + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': 'GET'}) + self.app.node_timeout = 0.1 + set_http_connect(200, 200, 200, body='abcdef', slow=[2]) + resp = req.get_response(self.app) + got_exc = False + try: + resp.body + except ChunkReadTimeout: + got_exc = True + self.assert_(got_exc) + class TestAccountController(unittest.TestCase): @@ -5965,7 +6073,7 @@ class TestAccountController(unittest.TestCase): def assert_status_map(self, method, statuses, expected, env_expected=None): with save_globals(): set_http_connect(*statuses) - req = Request.blank('/a', {}) + req = Request.blank('/v1/a', {}) self.app.update_request(req) res = method(req) self.assertEquals(res.status_int, expected) @@ -5973,7 +6081,7 @@ class TestAccountController(unittest.TestCase): self.assertEquals(res.environ['swift.account/a']['status'], env_expected) set_http_connect(*statuses) - req = Request.blank('/a/', {}) + req = Request.blank('/v1/a/', {}) self.app.update_request(req) res = method(req) self.assertEquals(res.status_int, expected) @@ -5985,7 +6093,7 @@ class TestAccountController(unittest.TestCase): with save_globals(): self.app.allow_account_management = False controller = proxy_server.AccountController(self.app, 'account') - req = Request.blank('/account', {'REQUEST_METHOD': 'OPTIONS'}) + req = Request.blank('/v1/account', {'REQUEST_METHOD': 'OPTIONS'}) req.content_length = 0 resp = controller.OPTIONS(req) self.assertEquals(200, resp.status_int) @@ -5999,7 +6107,7 @@ class TestAccountController(unittest.TestCase): self.app.allow_account_management = False controller = proxy_server.AccountController(self.app, 'account') req = Request.blank( - '/account', {'REQUEST_METHOD': 'OPTIONS'}, + '/v1/account', {'REQUEST_METHOD': 'OPTIONS'}, headers={'Origin': 'http://foo.com', 'Access-Control-Request-Method': 'GET'}) req.content_length = 0 @@ -6012,7 +6120,7 @@ class TestAccountController(unittest.TestCase): self.app.allow_account_management = True controller = proxy_server.AccountController(self.app, 'account') - req = Request.blank('/account', {'REQUEST_METHOD': 'OPTIONS'}) + req = Request.blank('/v1/account', {'REQUEST_METHOD': 'OPTIONS'}) req.content_length = 0 resp = controller.OPTIONS(req) self.assertEquals(200, resp.status_int) @@ -6130,7 +6238,7 @@ class TestAccountController(unittest.TestCase): dev['ip'] = '127.0.0.1' dev['port'] = 1 # can't connect on this port controller = proxy_server.AccountController(self.app, 'account') - req = Request.blank('/account', environ={'REQUEST_METHOD': 'HEAD'}) + req = Request.blank('/v1/account', environ={'REQUEST_METHOD': 'HEAD'}) self.app.update_request(req) resp = controller.HEAD(req) self.assertEquals(resp.status_int, 503) @@ -6141,7 +6249,7 @@ class TestAccountController(unittest.TestCase): dev['ip'] = '127.0.0.1' dev['port'] = -1 # invalid port number controller = proxy_server.AccountController(self.app, 'account') - req = Request.blank('/account', environ={'REQUEST_METHOD': 'HEAD'}) + req = Request.blank('/v1/account', environ={'REQUEST_METHOD': 'HEAD'}) self.app.update_request(req) resp = controller.HEAD(req) self.assertEquals(resp.status_int, 503) @@ -6150,7 +6258,7 @@ class TestAccountController(unittest.TestCase): with save_globals(): set_http_connect(200, 200, body='{}') controller = proxy_server.AccountController(self.app, 'account') - req = Request.blank('/a?format=json') + req = Request.blank('/v1/a?format=json') self.app.update_request(req) res = controller.GET(req) self.assert_('accept-ranges' in res.headers) @@ -6160,7 +6268,7 @@ class TestAccountController(unittest.TestCase): with save_globals(): set_http_connect(200, 200, body='{}') controller = proxy_server.AccountController(self.app, 'account') - req = Request.blank('/a?format=json') + req = Request.blank('/v1/a?format=json') self.app.update_request(req) res = controller.HEAD(req) res.body @@ -6174,7 +6282,7 @@ class TestAccountController(unittest.TestCase): def test_status_map(statuses, expected, **kwargs): set_http_connect(*statuses, **kwargs) self.app.memcache.store = {} - req = Request.blank('/a', {}) + req = Request.blank('/v1/a', {}) req.content_length = 0 self.app.update_request(req) res = controller.PUT(req) @@ -6239,7 +6347,8 @@ class TestAccountController(unittest.TestCase): controller = \ proxy_server.AccountController(self.app, 'a') set_http_connect(201, 201, 201, give_connect=test_connect) - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}, + req = Request.blank('/v1/a/c', + environ={'REQUEST_METHOD': method}, headers={test_header: test_value}) self.app.update_request(req) getattr(controller, method)(req) @@ -6256,20 +6365,20 @@ class TestAccountController(unittest.TestCase): self.app.allow_account_management = True controller = proxy_server.AccountController(self.app, 'a') set_http_connect(200, 201, 201, 201) - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}) + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': method}) self.app.update_request(req) resp = getattr(controller, method)(req) self.assertEquals(resp.status_int, 201) set_http_connect(201, 201, 201) - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': method}, headers={'X-Account-Meta-' + ('a' * MAX_META_NAME_LENGTH): 'v'}) self.app.update_request(req) resp = getattr(controller, method)(req) self.assertEquals(resp.status_int, 201) set_http_connect(201, 201, 201) - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': method}, headers={'X-Account-Meta-' + ('a' * (MAX_META_NAME_LENGTH + 1)): 'v'}) self.app.update_request(req) @@ -6277,14 +6386,14 @@ class TestAccountController(unittest.TestCase): self.assertEquals(resp.status_int, 400) set_http_connect(201, 201, 201) - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': method}, headers={'X-Account-Meta-Too-Long': 'a' * MAX_META_VALUE_LENGTH}) self.app.update_request(req) resp = getattr(controller, method)(req) self.assertEquals(resp.status_int, 201) set_http_connect(201, 201, 201) - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': method}, headers={'X-Account-Meta-Too-Long': 'a' * (MAX_META_VALUE_LENGTH + 1)}) self.app.update_request(req) @@ -6295,7 +6404,7 @@ class TestAccountController(unittest.TestCase): headers = {} for x in xrange(MAX_META_COUNT): headers['X-Account-Meta-%d' % x] = 'v' - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': method}, headers=headers) self.app.update_request(req) resp = getattr(controller, method)(req) @@ -6304,7 +6413,7 @@ class TestAccountController(unittest.TestCase): headers = {} for x in xrange(MAX_META_COUNT + 1): headers['X-Account-Meta-%d' % x] = 'v' - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': method}, headers=headers) self.app.update_request(req) resp = getattr(controller, method)(req) @@ -6322,7 +6431,7 @@ class TestAccountController(unittest.TestCase): if MAX_META_OVERALL_SIZE - size > 1: headers['X-Account-Meta-a'] = \ 'a' * (MAX_META_OVERALL_SIZE - size - 1) - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': method}, headers=headers) self.app.update_request(req) resp = getattr(controller, method)(req) @@ -6330,7 +6439,7 @@ class TestAccountController(unittest.TestCase): set_http_connect(201, 201, 201) headers['X-Account-Meta-a'] = \ 'a' * (MAX_META_OVERALL_SIZE - size) - req = Request.blank('/a/c', environ={'REQUEST_METHOD': method}, + req = Request.blank('/v1/a/c', environ={'REQUEST_METHOD': method}, headers=headers) self.app.update_request(req) resp = getattr(controller, method)(req) @@ -6343,7 +6452,7 @@ class TestAccountController(unittest.TestCase): def test_status_map(statuses, expected, **kwargs): set_http_connect(*statuses, **kwargs) self.app.memcache.store = {} - req = Request.blank('/a', {'REQUEST_METHOD': 'DELETE'}) + req = Request.blank('/v1/a', {'REQUEST_METHOD': 'DELETE'}) req.content_length = 0 self.app.update_request(req) res = controller.DELETE(req) @@ -6366,7 +6475,8 @@ class TestAccountController(unittest.TestCase): def test_status_map(statuses, expected, **kwargs): set_http_connect(*statuses, **kwargs) self.app.memcache.store = {} - req = Request.blank('/a?whoops', {'REQUEST_METHOD': 'DELETE'}) + req = Request.blank('/v1/a?whoops', + environ={'REQUEST_METHOD': 'DELETE'}) req.content_length = 0 self.app.update_request(req) res = controller.DELETE(req) @@ -6856,7 +6966,7 @@ class TestProxyObjectPerformance(unittest.TestCase): self.obj_len = obj_len def test_GET_debug_large_file(self): - for i in range(0, 10): + for i in range(10): start = time.time() prolis = _test_sockets[0] @@ -6885,6 +6995,33 @@ class TestProxyObjectPerformance(unittest.TestCase): print "Run %02d took %07.03f" % (i, end - start) +class TestSwiftInfo(unittest.TestCase): + def setUp(self): + utils._swift_info = {} + utils._swift_admin_info = {} + + def test_registered_defaults(self): + proxy_server.Application({}, FakeMemcache(), + account_ring=FakeRing(), + container_ring=FakeRing(), + object_ring=FakeRing) + + si = utils.get_swift_info()['swift'] + self.assertTrue('version' in si) + self.assertEqual(si['max_file_size'], MAX_FILE_SIZE) + self.assertEqual(si['max_meta_name_length'], MAX_META_NAME_LENGTH) + self.assertEqual(si['max_meta_value_length'], MAX_META_VALUE_LENGTH) + self.assertEqual(si['max_meta_count'], MAX_META_COUNT) + self.assertEqual(si['account_listing_limit'], ACCOUNT_LISTING_LIMIT) + self.assertEqual(si['container_listing_limit'], + CONTAINER_LISTING_LIMIT) + self.assertEqual(si['max_account_name_length'], + MAX_ACCOUNT_NAME_LENGTH) + self.assertEqual(si['max_container_name_length'], + MAX_CONTAINER_NAME_LENGTH) + self.assertEqual(si['max_object_name_length'], MAX_OBJECT_NAME_LENGTH) + + if __name__ == '__main__': setup() try: |