def create_valid_pipeline(self): p = Pipeline(family=PipelineFamily()) self.add_inputs(p, self.create_input(datatypes.STR_PK, dataset_idx=1)) m = Method() m.method = m self.add_inputs(m, self.create_input(datatypes.STR_PK, dataset_idx=1)) self.add_outputs(m, self.create_output(datatypes.STR_PK, dataset_idx=1)) step1 = PipelineStep(pipeline=p, transformation=m, step_num=1) p.steps.add(step1) cable = PipelineStepInputCable(pipelinestep=step1, source_step=0, source=p.inputs.all()[0], dest=m.inputs.all()[0]) cable.pipelinestepinputcable = cable step1.cables_in.add(cable) outcable = PipelineOutputCable(pipeline=p, output_idx=1, source_step=1, source=m.outputs.all()[0], output_cdt=m.outputs.all()[0].get_cdt()) p.outcables.add(outcable) yield p
def test_pipeline_many_valid_inputs_clean(self): """A Pipeline with multiple, properly indexed inputs is clean.""" p = Pipeline(family=PipelineFamily()) self.add_inputs(p, TransformationInput(dataset_idx=2), TransformationInput(dataset_idx=1), TransformationInput(dataset_idx=3)) p.clean()
def test_pipeline_one_invalid_input_clean(self): """A Pipeline with one input not numbered "1" is not clean.""" p = Pipeline(family=PipelineFamily()) self.add_inputs(p, TransformationInput(dataset_idx=4)) error = "Inputs are not consecutively numbered starting from 1" self.assertRaisesRegexp(ValidationError, error, p.clean) self.assertRaisesRegexp(ValidationError, error, p.complete_clean)
def test_pipeline_no_inputs_no_steps(self): """A Pipeline with no inputs and no steps is clean but not complete.""" p = Pipeline(family=PipelineFamily()) p.clean() self.assertRaisesRegexp( ValidationError, re.escape("Pipeline {} has no steps".format(p)), p.complete_clean)
def test_pipeline_many_invalid_inputs_clean(self): """A Pipeline with multiple, badly indexed inputs is not clean.""" p = Pipeline(family=PipelineFamily()) self.add_inputs(p, TransformationInput(dataset_idx=2), TransformationInput(dataset_idx=3), TransformationInput(dataset_idx=4)) self.assertRaisesRegexp( ValidationError, "Inputs are not consecutively numbered starting from 1", p.clean)
def test_pipeline_one_valid_input_no_steps(self): """A Pipeline with one valid input, but no steps, is clean but not complete.""" p = Pipeline(family=PipelineFamily()) self.add_inputs(p, TransformationInput(dataset_idx=1)) p.clean() self.assertRaisesRegexp( ValidationError, re.escape("Pipeline {} has no steps".format(p)), p.complete_clean)
def __init__(self, *args, **kwargs): super(PipelineSerializer, self).__init__(*args, **kwargs) # Set the querysets of the related model fields. curr_user = self.context["request"].user # LOGGER.debug("PL SERIALIZER INIT %s" % self.context.get("only_is_published", False)) revision_parent_field = self.fields["revision_parent"] revision_parent_field.queryset = Pipeline.filter_by_user(curr_user) family_field = self.fields["family"] family_field.queryset = PipelineFamily.filter_by_user(curr_user)
def test_pipeline_many_valid_steps_clean(self): """Test step index check, well-indexed multi-step case.""" p = Pipeline(family=PipelineFamily()) self.add_inputs(p, TransformationInput(dataset_idx=1)) m = Method() self.add_inputs(m, TransformationInput(dataset_idx=1)) p.steps.add(PipelineStep(pipeline=p, transformation=m, step_num=2)) p.steps.add(PipelineStep(pipeline=p, transformation=m, step_num=1)) p.steps.add(PipelineStep(pipeline=p, transformation=m, step_num=3)) p.clean()
def test_pipeline_many_invalid_steps_clean(self): """Test step index check, badly-indexed multi-step case.""" p = Pipeline(family=PipelineFamily()) self.add_inputs(p, TransformationInput(dataset_idx=1)) m = Method() self.add_inputs(m, TransformationInput(dataset_idx=1)) p.steps.add(PipelineStep(pipeline=p, transformation=m, step_num=1)) p.steps.add(PipelineStep(pipeline=p, transformation=m, step_num=4)) p.steps.add(PipelineStep(pipeline=p, transformation=m, step_num=5)) self.assertRaisesRegexp( ValidationError, "Steps are not consecutively numbered starting from 1", p.clean)
def test_build_removal_plan_for_used_image(self): image = DockerImage(id=99, name='doomed') method = image.methods.create(transformation_ptr_id=100) step = method.pipelinesteps.create(id=101) step.pipeline = Pipeline(transformation_ptr_id=102) step.pipeline.family = PipelineFamily() expected_plan = empty_removal_plan() expected_plan['DockerImages'].add(image) expected_plan['Methods'].add(method) expected_plan['Pipelines'].add(step.pipeline) plan = image.build_removal_plan() self.assertEqual(expected_plan, plan)
def test_pipeline_oneStep_invalid_cabling_incorrect_cdt_clean(self): """Bad cabling: input is of wrong CompoundDatatype.""" p = Pipeline(family=PipelineFamily()) self.add_inputs(p, self.create_input(datatypes.INT_PK, dataset_idx=1)) m = Method() self.add_inputs(m, self.create_input(datatypes.STR_PK, dataset_idx=1)) step1 = PipelineStep(pipeline=p, transformation=m, step_num=1) p.steps.add(step1) cable = PipelineStepInputCable(pipelinestep=step1, source_step=0, source=p.inputs.all()[0], dest=m.inputs.all()[0]) cable.pipelinestepinputcable = cable step1.cables_in.add(cable) cable.clean() self.assertRaisesRegexp( ValidationError, 'Custom wiring required for cable "{}"'.format(cable), cable.clean_and_completely_wired)