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', {})