def addService(self, service, parentService=None):
        if parentService is not None:
            # Do check to ensure that parentService is a service of this job
            def check(services):
                for s, jS in services:
                    if s == parentService or check(s._childServices):
                        return True
                return False
            if not check(self._services):
                raise JobException("Parent service is not a service of the given job")
            return parentService._addChild(service)
        else:
            if service._hasParent:
                raise JobException("The service already has a parent service")
            service._hasParent = True
            jobService = ServiceJob(service)
            self._services.append((service, jobService))
            return jobService.rv()

    ##Convenience functions for creating jobs
Called when a row of source data is found to be valid and is ready for saving
dataset/ETHPy150Open BD2KGenomics/toil/src/toil/job.py/Job.addService--crossover with--dataset/ETHPy150Open potatolondon/osmosis/osmosis/models.py/AbstractImportTask.import_row