def test_headers_to_container_info_values(self): headers = { "x-container-read": "readvalue", "x-container-write": "writevalue", "x-container-sync-key": "keyvalue", "x-container-meta-access-control-allow-origin": "here", } resp = headers_to_container_info(headers.items(), 200) self.assertEquals(resp["read_acl"], "readvalue") self.assertEquals(resp["write_acl"], "writevalue") self.assertEquals(resp["cors"]["allow_origin"], "here") headers["x-unused-header"] = "blahblahblah" self.assertEquals(resp, headers_to_container_info(headers.items(), 200))
def test_headers_to_container_info_values(self): headers = { 'x-container-read': 'readvalue', 'x-container-write': 'writevalue', 'x-container-sync-key': 'keyvalue', 'x-container-meta-access-control-allow-origin': 'here', } resp = headers_to_container_info(headers.items(), 200) self.assertEqual(resp['read_acl'], 'readvalue') self.assertEqual(resp['write_acl'], 'writevalue') self.assertEqual(resp['cors']['allow_origin'], 'here') headers['x-unused-header'] = 'blahblahblah' self.assertEqual(resp, headers_to_container_info(headers.items(), 200))
def test_headers_to_container_info_sys_meta(self): prefix = get_sys_meta_prefix("container") headers = {"%sWhatevs" % prefix: 14, "%ssomethingelse" % prefix: 0} resp = headers_to_container_info(headers.items(), 200) self.assertEquals(len(resp["sysmeta"]), 2) self.assertEquals(resp["sysmeta"]["whatevs"], 14) self.assertEquals(resp["sysmeta"]["somethingelse"], 0)
def test_headers_to_container_info_meta(self): headers = {'X-Container-Meta-Whatevs': 14, 'x-container-meta-somethingelse': 0} resp = headers_to_container_info(headers.items(), 200) self.assertEqual(len(resp['meta']), 2) self.assertEqual(resp['meta']['whatevs'], 14) self.assertEqual(resp['meta']['somethingelse'], 0)
def test_headers_to_container_info_values(self): headers = { 'x-container-read': 'readvalue', 'x-container-write': 'writevalue', 'x-container-sync-key': 'keyvalue', 'x-container-meta-access-control-allow-origin': 'here', } resp = headers_to_container_info(headers.items(), 200) self.assertEqual(resp['read_acl'], 'readvalue') self.assertEqual(resp['write_acl'], 'writevalue') self.assertEqual(resp['cors']['allow_origin'], 'here') headers['x-unused-header'] = 'blahblahblah' self.assertEqual( resp, headers_to_container_info(headers.items(), 200))
def GETorHEAD(self, req): """Handler for HTTP GET/HEAD requests.""" if not self.account_info(self.account_name, req)[1]: return HTTPNotFound(request=req) part = self.app.container_ring.get_part( self.account_name, self.container_name) resp = self.GETorHEAD_base( req, _('Container'), self.app.container_ring, part, req.path_info) if self.app.memcache: # set the memcache container size for ratelimiting cache_key = get_container_memcache_key(self.account_name, self.container_name) self.app.memcache.set( cache_key, headers_to_container_info(resp.headers, resp.status_int), time=self.app.recheck_container_existence) if 'swift.authorize' in req.environ: req.acl = resp.headers.get('x-container-read') aresp = req.environ['swift.authorize'](req) if aresp: return aresp if not req.environ.get('swift_owner', False): for key in ('x-container-read', 'x-container-write', 'x-container-sync-key', 'x-container-sync-to'): if key in resp.headers: del resp.headers[key] return resp
def get_container_info(self, app): """ get_container_info will return a result dict of get_container_info from the backend Swift. :returns: a dictionary of container info from swift.controllers.base.get_container_info :raises: NoSuchBucket when the container doesn't exist :raises: InternalError when the request failed without 404 """ if self.is_authenticated: # if we have already authenticated, yes we can use the account # name like as AUTH_xxx for performance efficiency sw_req = self.to_swift_req(app, self.container_name, None) info = get_container_info(sw_req.environ, app) if is_success(info['status']): return info elif info['status'] == 404: raise NoSuchBucket(self.container_name) else: raise InternalError( 'unexpected status code %d' % info['status']) else: # otherwise we do naive HEAD request with the authentication resp = self.get_response(app, 'HEAD', self.container_name, '') return headers_to_container_info( resp.sw_headers, resp.status_int) # pylint: disable-msg=E1101
def test_headers_to_container_info_sys_meta(self): prefix = get_sys_meta_prefix('container') headers = {'%sWhatevs' % prefix: 14, '%ssomethingelse' % prefix: 0} resp = headers_to_container_info(headers.items(), 200) self.assertEqual(len(resp['sysmeta']), 2) self.assertEqual(resp['sysmeta']['whatevs'], 14) self.assertEqual(resp['sysmeta']['somethingelse'], 0)
def test_headers_to_container_info_meta(self): headers = {'X-Container-Meta-Whatevs': 14, 'x-container-meta-somethingelse': 0} resp = headers_to_container_info(headers.items(), 200) self.assertEquals(len(resp['meta']), 2) self.assertEquals(resp['meta']['whatevs'], 14) self.assertEquals(resp['meta']['somethingelse'], 0)
def test_container_info_in_response_env(self): controller = proxy_server.ContainerController(self.app, "a", "c") with mock.patch("swift.proxy.controllers.base.http_connect", fake_http_connect(200, 200, body="")): req = Request.blank("/v1/a/c", {"PATH_INFO": "/v1/a/c"}) resp = controller.HEAD(req) self.assertEqual(2, resp.status_int // 100) self.assertTrue("swift.container/a/c" in resp.environ) self.assertEqual(headers_to_container_info(resp.headers), resp.environ["swift.container/a/c"])
def __init__(self, headers, env, account, container): self.headers = headers self.status_int = FakeResponse_status_int self.environ = env cache_key, env_key = _get_cache_key(account, container) if container: info = headers_to_container_info(headers, FakeResponse_status_int) else: info = headers_to_account_info(headers, FakeResponse_status_int) env[env_key] = info
def test_container_info(self): req = Request.blank('/v1/a/c', {'PATH_INFO': '/v1/a/c'}, method='HEAD') self.storage.container.container_show = Mock(return_value={}) resp = req.get_response(self.app) self.assertEqual(2, resp.status_int // 100) self.assertIn('swift.infocache', resp.environ) self.assertIn('container/a/c', resp.environ['swift.infocache']) self.assertEqual( headers_to_container_info(resp.headers, resp.status_int), resp.environ['swift.infocache']['container/a/c'])
def test_container_info_in_response_env(self): controller = proxy_server.ContainerController(self.app, 'a', 'c') with mock.patch('swift.proxy.controllers.base.http_connect', fake_http_connect(200, 200, body='')): req = Request.blank('/a/c', {'PATH_INFO': '/a/c'}) resp = controller.HEAD(req) self.assertEqual(2, resp.status_int // 100) self.assertTrue("swift.container/a/c" in resp.environ) self.assertEqual(headers_to_container_info(resp.headers), resp.environ['swift.container/a/c'])
def test_container_info_got_cached(self): controller = proxy_server.ContainerController(self.app, "a", "c") with mock.patch("swift.proxy.controllers.base.http_connect", fake_http_connect(200, 200, body="")): req = Request.blank("/v1/a/c", {"PATH_INFO": "/v1/a/c"}) resp = controller.HEAD(req) self.assertEqual(2, resp.status_int // 100) # Make sure it's in both swift.infocache and memcache self.assertIn("container/a/c", resp.environ["swift.infocache"]) self.assertEqual(headers_to_container_info(resp.headers), resp.environ["swift.infocache"]["container/a/c"]) from_memcache = self.app.memcache.get("container/a/c") self.assertTrue(from_memcache)
def test_container_info_got_cached(self): controller = proxy_server.ContainerController(self.app, 'a', 'c') with mock.patch('swift.proxy.controllers.base.http_connect', fake_http_connect(200, 200, body='')): req = Request.blank('/v1/a/c', {'PATH_INFO': '/v1/a/c'}) resp = controller.HEAD(req) self.assertEqual(2, resp.status_int // 100) # Make sure it's in both swift.infocache and memcache self.assertIn("container/a/c", resp.environ['swift.infocache']) self.assertEqual(headers_to_container_info(resp.headers), resp.environ['swift.infocache']['container/a/c']) from_memcache = self.app.memcache.get('container/a/c') self.assertTrue(from_memcache)
def _mock_infocache(self, env): if not self.skip_metadata: return req = Request(env) # don't fake obj metadata account, container, _ = self._extract_path(req.path_info) req.environ.setdefault('swift.infocache', {}) req.environ['swift.infocache'][get_cache_key(account)] = \ headers_to_account_info({}, 0) if container: key = get_cache_key(account, container) req.environ['swift.infocache'][key] = \ headers_to_container_info({}, 0)
def test_container_info_got_cached(self): controller = proxy_server.ContainerController(self.app, 'a', 'c') with mock.patch('swift.proxy.controllers.base.http_connect', fake_http_connect(200, 200, body='')): req = Request.blank('/v1/a/c', {'PATH_INFO': '/v1/a/c'}) resp = controller.HEAD(req) self.assertEqual(2, resp.status_int // 100) # Make sure it's in both swift.infocache and memcache self.assertIn("container/a/c", resp.environ['swift.infocache']) self.assertEqual( headers_to_container_info(resp.headers), resp.environ['swift.infocache']['container/a/c']) from_memcache = self.app.memcache.get('container/a/c') self.assertTrue(from_memcache)
def __init__(self, headers, env, account, container, obj): self.headers = headers self.status_int = FakeResponse_status_int self.environ = env if obj: env_key = get_object_env_key(account, container, obj) else: cache_key, env_key = _get_cache_key(account, container) if account and container and obj: info = headers_to_object_info(headers, FakeResponse_status_int) elif account and container: info = headers_to_container_info(headers, FakeResponse_status_int) else: info = headers_to_account_info(headers, FakeResponse_status_int) env[env_key] = info
def get_container_info(self, app): if self.is_authenticated: # if we have already authenticated, yes we can use the account # name like as AUTH_xxx for performance efficiency sw_req = self.to_swift_req(app, self.container_name, None) info = get_container_info(sw_req.environ, app) if is_success(info['status']): return info elif info['status'] == 404: raise NoSuchBucket(self.container_name) else: raise InternalError('unexpected status code %d' % info['status']) else: # otherwise we do naive HEAD request with the authentication resp = self.get_response(app, 'HEAD', self.container_name, '') return headers_to_container_info( resp.sw_headers, resp.status_int) # pylint: disable-msg=E1101
def test_headers_to_container_info_missing(self): resp = headers_to_container_info({}, 404) self.assertEqual(resp['status'], 404) self.assertIsNone(resp['read_acl']) self.assertIsNone(resp['write_acl'])
def test_headers_to_container_info_meta(self): headers = {"X-Container-Meta-Whatevs": 14, "x-container-meta-somethingelse": 0} resp = headers_to_container_info(headers.items(), 200) self.assertEquals(len(resp["meta"]), 2) self.assertEquals(resp["meta"]["whatevs"], 14) self.assertEquals(resp["meta"]["somethingelse"], 0)
def test_headers_to_container_info_missing(self): resp = headers_to_container_info({}, 404) self.assertEqual(resp['status'], 404) self.assertEqual(resp['read_acl'], None) self.assertEqual(resp['write_acl'], None)
def test_memcached_container_info_dict(self): mdict = headers_to_container_info({'x-container-object-count': '45'}) self.assertEquals(mdict['object_count'], '45')
def test_headers_to_container_info_missing(self): resp = headers_to_container_info({}, 404) self.assertEquals(resp["status"], 404) self.assertEquals(resp["read_acl"], None) self.assertEquals(resp["write_acl"], None)
def test_memcached_container_info_dict(self): mdict = headers_to_container_info({"x-container-object-count": "45"}) self.assertEqual(mdict["object_count"], "45")