Example #1
0
    def split_job(job):
        parallel_input = None
        for input_name, input_val in six.iteritems(job.inputs):
            io = job.app.get_input(input_name)
            val_d = Executor.depth(input_val)
            if val_d == io.depth:
                continue
            if val_d > io.depth + 1:
                raise RabixError("Depth difference to large")
            if val_d < io.depth:
                raise RabixError("Insufficient dimensionality")
            if parallel_input:
                raise RabixError("Already parallelized by input '%%s'" % parallel_input)

            parallel_input = input_name

        if parallel_input:
            jobs = []
            for i, val in enumerate(job.inputs[parallel_input]):
                inputs = copy.deepcopy(job.inputs)
                inputs[parallel_input] = val
                jobs.append(Job(job.id+"_"+six.text_type(i), job.app, inputs, {}, job.context))
            return jobs
        else:
            return job
Example #2
0
def get_command_line():
    data = request.get_json(force=True)
    tool = process_builder(ctx, data['tool_cfg'])
    inputs = {
        strip_prefix(k): construct_files(v, tool._inputs[k].validator)
        for k, v in data['input_map'].iteritems()
    }
    job = Job('Fake job ID', tool, inputs, {'cpu': 1, 'mem': 1024}, ctx)
    cli_job = CLIJob(job)
    return json.dumps(
        {
            'arguments': cli_job.make_arg_list(),
            'stdin': cli_job.stdin,
            'stdout': cli_job.stdout,
        },
        indent=2)
Example #3
0
def get_outputs():
    data = request.get_json(force=True)
    tool = process_builder(ctx, data['tool_cfg'])
    inputs = {
        strip_prefix(k): construct_files(v, tool._inputs[k].validator)
        for k, v in data['input_map'].iteritems()
    }
    job = Job('Fake job ID', tool, inputs, {'cpu': 1, 'mem': 1024}, ctx)
    cli_job = CLIJob(job)
    status = 'SUCCESS' if data['exit_code'] in data['tool_cfg'].get('successCodes', [0])\
        else 'FAILURE'
    return json.dumps(
        {
            'status': status,
            'outputs': cli_job.get_outputs(data['job_dir'], job),
        },
        indent=2)
Example #4
0
    def run(self, job, job_dir=None):
        job_dir = os.path.abspath(job_dir or job.id)
        if not job_dir.endswith('/'):
            job_dir += '/'

        os.mkdir(job_dir)
        os.chmod(job_dir,
                 os.stat(job_dir).st_mode | stat.S_IROTH | stat.S_IWOTH)
        self.cli_job = CLIJob(job)

        if self.container:
            self.ensure_files(job, job_dir)
            abspath_job = Job(job.id, job.app, copy.deepcopy(job.inputs),
                              job.allocated_resources, job.context)
            self.install(job=job)

            cmd_line = self.command_line(job, job_dir)
            self.job_dump(job, job_dir)
            self.container.run(cmd_line, job_dir)
            result_path = os.path.abspath(job_dir) + '/result.cwl.json'
            if os.path.exists(result_path):
                with open(result_path, 'r') as res:
                    outputs = json.load(res)
            else:
                with open(result_path, 'w') as res:
                    outputs = self.cli_job.get_outputs(
                        os.path.abspath(job_dir), abspath_job)
                    json.dump(outputs, res)

            outputs = {
                o.id: construct_files(outputs.get(o.id), o.validator)
                for o in job.app.outputs
            }

            self.unmap_paths(outputs)

            def write_rbx(f):
                if isinstance(f, File):
                    with open(f.path + '.rbx.json', 'w') as rbx:
                        json.dump(f.to_dict(), rbx)

            map_rec_collection(write_rbx, outputs)

            return outputs
Example #5
0
 def job(self):
     return Job(None, self.app, self.inputs, {}, self.context)
Example #6
0
    def run(self, job, job_dir=None):
        self.load_input_content(job)
        job_dir = os.path.abspath(job_dir or job.id)
        if not job_dir.endswith('/'):
            job_dir += '/'

        if not os.path.exists(job_dir):
            os.mkdir(job_dir)

        os.chmod(job_dir,
                 os.stat(job_dir).st_mode | stat.S_IROTH | stat.S_IWOTH)
        self.cli_job = CLIJob(job)

        eval = ValueResolver(job)

        cfr = self.get_requirement_or_hint(CreateFileRequirement)
        if cfr:
            cfr.create_files(job_dir, eval)

        env = None
        evr = self.get_requirement_or_hint(EnvVarRequirement)
        if evr:
            env = evr.var_map(eval)

        self.ensure_files(job, job_dir)
        self.install(job=job)

        abspath_job = Job(job.id, job.app, copy.deepcopy(job.inputs),
                          job.allocated_resources, job.context)

        cmd_line = self.command_line(job, job_dir)
        log.info("Running: %s" % cmd_line)
        self.job_dump(job, job_dir)

        if self.container:
            self.container.run(cmd_line, job_dir, env)
        else:
            ret = subprocess.call(['bash', '-c', cmd_line], cwd=job_dir)
            if ret != 0:
                raise RabixError("Command failed with exit status %s" % ret)

        result_path = os.path.abspath(job_dir) + '/cwl.output.json'
        if os.path.exists(result_path):
            with open(result_path, 'r') as res:
                outputs = json.load(res)
        else:
            with open(result_path, 'w') as res:
                outputs = self.cli_job.get_outputs(os.path.abspath(job_dir),
                                                   abspath_job)
                json.dump(job.context.to_primitive(outputs), res)

        self.unmap_paths(outputs)

        def write_rbx(f):
            if isinstance(f, File):
                with open(f.path + '.rbx.json', 'w') as rbx:
                    json.dump(f.to_dict(), rbx)

        map_rec_collection(write_rbx, outputs)

        return outputs