Beispiel #1
0
def make_workflow(subworkflows, output_path=None):
    workflow = {'stages': []}
    for i, (step, name, inputs) in enumerate(subworkflows):
        # Validate the inputs.
        missing_inputs = validation.get_missing_inputs(step, name, inputs)
        if len(missing_inputs) > 0:
            raise ValueError(
                f'subworkflow {name} for step {step} has missing inputs. The following inputs are missing: {missing_inputs}'
            )
        invalid_inputs = validation.get_invalid_inputs(step, name, inputs)
        if len(invalid_inputs) > 0:
            raise ValueError(
                f'subworkflow {name} for step {step} has invalid inputs. The following inputs are invalid: {invalid_inputs}'
            )

        # Create parameters dict from inputs + interface.
        workflow_path = utils.get_workflow_path(step, name)
        description = utils.get_description(step, name)
        parameters = {k: {'step': 'init', 'output': k} for k in inputs}
        interfaces = description['interfaces']
        if 'input' in interfaces:
            interface = utils.get_interface(interfaces['input'])
            for parameter in interface['parameters']:
                if parameter['name'] in parameters:
                    raise ValueError(
                        f'interface {interfaces["input"]} has a parameter {parameter["name"]} that conflicts with a parameter for workflow {name} for step {step}.'
                    )
                parameters[parameter['name']] = {
                    'step': subworkflows[i - 1].step,
                    'output': parameter['name']
                }
        # Write the rest of the yaml.
        scheduler = {
            'scheduler_type': 'singlestep-stage',
            'parameters': parameters,
            'workflow': {
                '$ref': workflow_path
            }
        }
        dependencies = ['init']
        if i > 0:
            dependencies.append(subworkflows[i - 1].subworkflow)
        workflow['stages'].append({
            'name': name,
            'dependencies': dependencies,
            'scheduler': scheduler
        })
    if output_path:
        with open('output_path', 'w+') as fd:
            yaml.dump(workflow, fd)
    return workflow
 def test_invalid_step(self):
     with pytest.raises(FileNotFoundError):
         assert validation.get_invalid_inputs(
             'fakestep', 'madgraph_pythia', {})
 def test_no_input(self):
     assert validation.get_invalid_inputs(
         'generation', 'madgraph_pythia', {}) == []
 def test_valid_input(self):
     assert validation.get_invalid_inputs('generation', 'madgraph_pythia', {
                                          'fakekey1': 'foofum', 'n_events': 10}) == ['fakekey1']
 def test_two_invalid_input(self):
     assert validation.get_invalid_inputs('generation', 'madgraph_pythia', {
                                          'fakekey1': 'foofum', 'fakekey2': 'foofi'}) == ['fakekey1', 'fakekey2']
 def test_one_invalid_input(self):
     assert validation.get_invalid_inputs('generation', 'madgraph_pythia', {
                                          'fakekey': 'foofum'}) == ['fakekey']
 def test_invalid_workflow_name(self):
     with pytest.raises(FileNotFoundError):
         assert validation.get_invalid_inputs(
             'generation', 'fakeworkflow', {})