def test_validate_dependency_registration(self):
        # w/o dependency parameter
        obj = 'dep_file'
        params = {'Dependency-Version': '1.0'}
        StorletGatewayDocker.validate_dependency_registration(params, obj)

        # w/ correct dependency parameter
        params = {
            'Dependency-Permissions': '755',
            'Dependency-Version': '1.0'}
        StorletGatewayDocker.validate_dependency_registration(params, obj)

        # w/ wrong dependency parameter
        params = {
            'Dependency-Permissions': '400',
            'Dependency-Version': '1.0'}
        with self.assertRaises(ValueError):
            StorletGatewayDocker.validate_dependency_registration(params, obj)

        # w/ invalid dependency parameter
        params = {
            'Dependency-Permissions': 'foo',
            'Dependency-Version': '1.0'}
        with self.assertRaises(ValueError):
            StorletGatewayDocker.validate_dependency_registration(params, obj)

        params = {
            'Dependency-Permissions': '888',
            'Dependency-Version': '1.0'}
        with self.assertRaises(ValueError):
            StorletGatewayDocker.validate_dependency_registration(params, obj)
    def test_check_mandatory_params(self):
        params = {'keyA': 'valueA',
                  'keyB': 'valueB',
                  'keyC': 'valueC'}

        # all mandatory headers are included
        StorletGatewayDocker._check_mandatory_params(
            params, ['keyA', 'keyB'])

        # some of mandatory headers are missing
        with self.assertRaises(ValueError):
            StorletGatewayDocker._check_mandatory_params(
                params, ['keyA', 'KeyD'])
    def set_storlet_request(self, req_resp, params):

        self.gateway = StorletGatewayDocker(self.conf, self.logger, self.app,
                                            self.version, self.account,
                                            self.container, self.obj)

        self.gateway_method = getattr(self.gateway, "gateway" +
                                      self.server.title() +
                                      self.method.title() + "Flow")

        # Set the Storlet Metadata to storletgateway
        md = {}
        md['X-Object-Meta-Storlet-Main'] = self.storlet_metadata['main']
        md['X-Object-Meta-Storlet-Dependency'] = self.storlet_metadata['dependencies']
        md['Content-Length'] = self.storlet_metadata['size']
        #md['ETag'] = self.storlet_metadata['etag']
        self.gateway.storlet_metadata = md
        
        # Simulate Storlet request
        new_env = dict(req_resp.environ)
        req = Request.blank(new_env['PATH_INFO'], new_env)
        req.headers['X-Run-Storlet'] = self.storlet_name
        self.gateway.augmentStorletRequest(req)
        req.environ['QUERY_STRING'] = params.replace(',', '&')

        return req
    def test_validate_storlet_registration(self):
        # correct name and headers
        obj = 'storlet-1.0.jar'
        params = {'Language': 'java',
                  'Interface-Version': '1.0',
                  'Dependency': 'dep_file',
                  'Object-Metadata': 'no',
                  'Main': 'path.to.storlet.class'}
        StorletGatewayDocker.validate_storlet_registration(params, obj)

        # some header keys are missing
        params = {'Language': 'java',
                  'Interface-Version': '1.0',
                  'Dependency': 'dep_file',
                  'Object-Metadata': 'no'}
        with self.assertRaises(ValueError):
            StorletGatewayDocker.validate_storlet_registration(params, obj)

        # wrong name
        obj = 'storlet.jar'
        params = {'Language': 'java',
                  'Interface-Version': '1.0',
                  'Dependency': 'dep_file',
                  'Object-Metadata': 'no',
                  'Main': 'path.to.storlet.class'}
        with self.assertRaises(ValueError):
            StorletGatewayDocker.validate_storlet_registration(params, obj)
class SDSGatewayStorlet():

    def __init__(self, conf, logger, request_data):
        self.conf = conf
        self.logger = logger
        self.app = request_data['app']
        self.version = request_data['api_version']
        self.account = request_data['account']
        self.container = request_data['container']
        self.obj = request_data['object']
        self.gateway = None
        self.storlet_metadata = None
        self.storlet_name = None
        self.method = request_data['method']
        self.server = self.conf['execution_server']
        self.gateway_method = None

    def set_storlet_request(self, req_resp, params):

        self.gateway = StorletGatewayDocker(self.conf, self.logger, self.app,
                                            self.version, self.account,
                                            self.container, self.obj)

        self.gateway_method = getattr(self.gateway, "gateway" +
                                      self.server.title() +
                                      self.method.title() + "Flow")

        # Set the Storlet Metadata to storletgateway
        md = {}
        md['X-Object-Meta-Storlet-Main'] = self.storlet_metadata['main']
        md['X-Object-Meta-Storlet-Dependency'] = self.storlet_metadata['dependencies']
        md['Content-Length'] = self.storlet_metadata['size']
        #md['ETag'] = self.storlet_metadata['etag']
        self.gateway.storlet_metadata = md
        
        # Simulate Storlet request
        new_env = dict(req_resp.environ)
        req = Request.blank(new_env['PATH_INFO'], new_env)
        req.headers['X-Run-Storlet'] = self.storlet_name
        self.gateway.augmentStorletRequest(req)
        req.environ['QUERY_STRING'] = params.replace(',', '&')

        return req

    def launch_storlet(self, req_resp, params, input_pipe=None):
        req = self.set_storlet_request(req_resp, params)

        (_, app_iter) = self.gateway_method(req, self.container,
                                            self.obj, req_resp,
                                            input_pipe)

        return app_iter

    def execute_storlet(self, req_resp, storlet_data, app_iter):
        storlet = storlet_data['name']
        params = storlet_data['params']
        self.storlet_name = storlet
        self.storlet_metadata = storlet_data

        self.logger.info('Crystal Filters - Go to execute ' + storlet +
                         ' storlet with parameters "' + params + '"')
                
        app_iter = self.launch_storlet(req_resp, params, app_iter)
        
        return app_iter