From 390f30d4ffebfc77113da90228bbdc4aef76ca11 Mon Sep 17 00:00:00 2001 From: Takashi Kajinami Date: Tue, 2 Feb 2016 12:27:54 +0900 Subject: [PATCH] Improve ut coverage about storlet_docker_gateway Change-Id: If0a86431186734bd1feadad1defff30e130f6adc --- .../storlet_gateway/storlet_docker_gateway.py | 10 +- .../test_storlet_docker_gateway.py | 113 +++++++++++++++++- 2 files changed, 116 insertions(+), 7 deletions(-) diff --git a/Engine/swift/storlet_gateway/storlet_docker_gateway.py b/Engine/swift/storlet_gateway/storlet_docker_gateway.py index 4bb3fb45..2d8cacf2 100644 --- a/Engine/swift/storlet_gateway/storlet_docker_gateway.py +++ b/Engine/swift/storlet_gateway/storlet_docker_gateway.py @@ -65,14 +65,12 @@ class DockerStorletRequest(object): 2. Metadata identifying the stream """ - def user_metadata(self, headers): + def _get_user_metadata(self, headers): metadata = {} for key in headers: - if (key.startswith('X-Storlet') or - key.startswith('X-Object-Meta-Storlet')): + if key.startswith('X-Object-Meta-Storlet'): pass - elif (key.startswith('X-Object-Meta-') or - key.startswith('X-Object-Meta-'.lower())): + elif key.startswith('X-Object-Meta-'): short_key = key[len('X-Object-Meta-'):] metadata[short_key] = headers[key] return metadata @@ -84,7 +82,7 @@ class DockerStorletRequest(object): self.generate_log = request.headers.get('X-Storlet-Generate-Log', False) self.storlet_id = request.headers.get('X-Object-Meta-Storlet-Main') - self.user_metadata = self.user_metadata(request.headers) + self.user_metadata = self._get_user_metadata(request.headers) self.params = params self.account = account self.request = request diff --git a/tests/unit/swift/storlet_gateway/test_storlet_docker_gateway.py b/tests/unit/swift/storlet_gateway/test_storlet_docker_gateway.py index 0c34cd24..f6a1e3e2 100644 --- a/tests/unit/swift/storlet_gateway/test_storlet_docker_gateway.py +++ b/tests/unit/swift/storlet_gateway/test_storlet_docker_gateway.py @@ -14,7 +14,8 @@ # limitations under the License. from tests.unit.swift import FakeLogger -from storlet_gateway.storlet_docker_gateway import StorletGatewayDocker +from storlet_gateway.storlet_docker_gateway import DockerStorletRequest, \ + StorletGatewayDocker from swift.common.swob import HTTPException, Request, Response import unittest @@ -26,6 +27,30 @@ class FakeApp(object): env, start_response) +class TestDockerStorletRequest(unittest.TestCase): + + def test_init(self): + account = 'a' + headers = {'X-Object-Meta-Storlet-Main': 'main', + 'X-Storlet-Key0': 'Value0', + 'x-storlet-key1': 'Value1', + 'X-Object-Meta-Storlet-Key2': 'Value2', + 'x-object-meta-storlet-key3': 'Value3', + 'X-Object-Meta-Key4': 'Value4', + 'x-object-meta-key5': 'Value5'} + params = {'Param6': 'Value6', + 'Param7': 'Value7'} + req = Request.blank('', headers=headers) + dsreq = DockerStorletRequest(account, req, params) + + self.assertEqual(dsreq.generate_log, False) + self.assertEqual(dsreq.storlet_id, 'main') + self.assertEqual(dsreq.user_metadata, + {'Key4': 'Value4', + 'Key5': 'Value5'}) + self.assertEqual(dsreq.account, account) + + class TestStorletGatewayDocker(unittest.TestCase): def setUp(self): @@ -197,6 +222,50 @@ class TestStorletGatewayDocker(unittest.TestCase): for key in sheaders.keys(): self.assertEqual(sheaders[key], gw.storlet_metadata[key]) + def test_augmentStorletExcecution(self): + a = 'a' + c = 'c' + o = 'o' + so = 'storlets-1.0.jar' + path = '/'.join(['/v1', a, c, o]) + + # Metadata specific to Storlet + sheaders = { + 'X-Object-Meta-Storlet-Language': 'java', + 'X-Object-Meta-Storlet-Interface-Version': '1.0', + 'X-Object-Meta-Storlet-Dependency': 'dep_file', + 'X-Object-Meta-Storlet-Object-Metadata': 'no'} + + # Normal Metadata about object + oheaders = {'X-Timestamp': '1450000000.000', + 'Content-Length': '1024', + 'X-Object-Meta-Key': 'Value'} + oheaders.update(sheaders) + + class FakeApp200(object): + def __call__(self, env, start_response): + req = Request(env) + return Response(request=req, headers=oheaders)( + env, start_response) + + gw = StorletGatewayDocker(self.sconf, self.logger, FakeApp200(), 'v1', + a, c, o) + env = {'REQUEST_METHOD': 'GET'} + req = Request.blank(path, environ=env, + headers={'X-Run-Storlet': so}) + + # Set storlet_metadata + gw.authorizeStorletExecution(req) + + gw.augmentStorletRequest(req) + + for key in sheaders: + self.assertEqual(req.headers[key], sheaders[key]) + self.assertEqual(req.headers['X-Storlet-X-Timestamp'], + '1450000000.000') + self.assertEqual(req.headers['X-Storlet-Content-Length'], + '1024') + def test_verify_access(self): a = 'a' c = 'c' @@ -214,6 +283,8 @@ class TestStorletGatewayDocker(unittest.TestCase): class FakeApp200(object): def __call__(self, env, start_response): req = Request(env) + if req.path != '/'.join(['/v1', a, sc, so]): + raise Exception('Request for wrong path: %s' % req.path) return Response(request=req, headers=sheaders)( env, start_response) @@ -229,6 +300,8 @@ class TestStorletGatewayDocker(unittest.TestCase): class FakeApp401(object): def __call__(self, env, start_response): req = Request(env) + if req.path != '/'.join(['/v1', a, sc, so]): + raise Exception('Request for wrong path: %s' % req.path) return Response(request=req, status='401 Unauthorized')( env, start_response) @@ -243,6 +316,8 @@ class TestStorletGatewayDocker(unittest.TestCase): class FakeApp404(object): def __call__(self, env, start_response): req = Request(env) + if req.path != '/'.join(['/v1', a, sc, so]): + raise Exception('Request for wrong path: %s' % req.path) return Response(request=req, status='404 Not Found')( env, start_response) @@ -254,6 +329,42 @@ class TestStorletGatewayDocker(unittest.TestCase): self.assertRaisesWithStatus(401, gw._verify_access, req, 'v1', a, sc, so) + def test_clean_storlet_stuff_from_request(self): + a = 'a' + c = 'c' + o = 'o' + path = '/'.join(['/v1', a, c, o]) + gw = StorletGatewayDocker(self.sconf, self.logger, FakeApp(), 'v1', + a, c, o) + + headers = {'X-Storlet-Key1': 'Value1', + 'X-Key2': 'Value2', + 'X-Object-Meta-Storlet-Key3': 'Value3', + 'X-Object-Meta-Key4': 'Value4'} + req = Request.blank(path, headers=headers) + gw._clean_storlet_stuff_from_request(req.headers) + + self.assertFalse('X-Storlet-Key1' in req.headers) + self.assertEqual(req.headers['X-Key2'], 'Value2') + self.assertFalse('X-Object-Meta-Storlet-Key3' in req.headers) + self.assertEqual(req.headers['X-Object-Meta-Key4'], 'Value4') + + def test_set_metadata_in_headers(self): + a = 'a' + c = 'c' + o = 'o' + gw = StorletGatewayDocker(self.sconf, self.logger, FakeApp(), 'v1', + a, c, o) + headers = {'HeaderKey1': 'HeaderValue1'} + gw._set_metadata_in_headers(headers, {}) + self.assertEqual(headers, {'HeaderKey1': 'HeaderValue1'}) + + md = {'MetaKey1': 'MetaValue1'} + gw._set_metadata_in_headers(headers, md) + self.assertEqual(headers, + {'HeaderKey1': 'HeaderValue1', + 'X-Object-Meta-MetaKey1': 'MetaValue1'}) + if __name__ == '__main__': unittest.main()