Improve ut coverage about storlet_docker_gateway

Change-Id: If0a86431186734bd1feadad1defff30e130f6adc
This commit is contained in:
Takashi Kajinami
2016-02-02 12:27:54 +09:00
parent ac402c562c
commit 390f30d4ff
2 changed files with 116 additions and 7 deletions

View File

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

View File

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