Esempio n. 1
0
 def __init__(self, event, context):
     if context:
         get_logger().info('SUPERVISOR: Initializing AWS Lambda supervisor')
         self.lambda_instance = LambdaInstance(event, context)
         self.body = {}
     else:
         raise NoLambdaContextError()
Esempio n. 2
0
class LambdaSupervisor(DefaultSupervisor):
    """Supervisor class used in the Lambda environment."""

    def __init__(self, event, context):
        if context:
            get_logger().info('SUPERVISOR: Initializing AWS Lambda supervisor')
            self.lambda_instance = LambdaInstance(event, context)
            self.body = {}
        else:
            raise NoLambdaContextError()

    def _execute_batch(self):
        batch_ri = Batch(self.lambda_instance).invoke_batch_function()
        batch_logs = (f"Job delegated to batch.\n"
                      f"Check batch logs with:\n"
                      f"  scar log -n {self.lambda_instance.get_function_name()} -ri {batch_ri}")
        get_logger().info(batch_logs)
        self.body["udocker_output"] = batch_logs.encode('utf-8')

    def _execute_udocker(self):
        try:
            udocker = Udocker(self.lambda_instance)
            udocker.prepare_container()
            self.body["udocker_output"] = udocker.launch_udocker_container()
            get_logger().debug("CONTAINER OUTPUT:\n %s", self.body["udocker_output"])
        except subprocess.TimeoutExpired:
            get_logger().warning("Container execution timed out")
            if _is_lambda_batch_execution():
                self._execute_batch()

    def execute_function(self):
        if _is_batch_execution():
            self._execute_batch()
        else:
            self._execute_udocker()

    def create_error_response(self):
        exception_msg = traceback.format_exc()
        get_logger().error("Exception launched:\n %s", exception_msg)
        return {
            "statusCode": 500,
            "headers": {
                "amz-lambda-request-id": self.lambda_instance.get_request_id(),
                "amz-log-group-name": self.lambda_instance.get_log_group_name(),
                "amz-log-stream-name": self.lambda_instance.get_log_stream_name()
            },
            "body": StrUtils.dict_to_base64str({"exception" : exception_msg}),
            "isBase64Encoded": True,
        }

    def create_response(self):
        return {
            "statusCode": 200,
            "headers": {
                "amz-lambda-request-id": self.lambda_instance.get_request_id(),
                "amz-log-group-name": self.lambda_instance.get_log_group_name(),
                "amz-log-stream-name": self.lambda_instance.get_log_stream_name()
            },
            "body": StrUtils.bytes_to_base64str(self.body["udocker_output"]),
            "isBase64Encoded": True,
        }