def start(self, rootJob):
        self._assertContextManagerUsed()
        if self.config.restart:
            raise ToilConfigException('A workflow can only be started once. Use restart() to resume it.')

        try:
            self._batchSystem = self.createBatchSystem(self.config, jobStore=self._jobStore,
                                                       userScript=rootJob.getUserScript())
            self._setBatchSystemEnvVars()
            self._serialiseEnv()
            self._cacheAllJobs()

            # Make a file to store the root job's return value in
            rootJobReturnValueID = self._jobStore.getEmptyFileStoreID()

            # Add the root job return value as a promise
            if None not in rootJob._rvs:
                rootJob._rvs[None] = []
            rootJob._rvs[None].append(rootJobReturnValueID)

            # Write the name of the promise file in a shared file
            with self._jobStore.writeSharedFileStream("rootJobReturnValue") as fH:
                fH.write(rootJobReturnValueID)

            # Setup the first wrapper and cache it
            job = rootJob._serialiseFirstJob(self._jobStore)
            self._cacheJob(job)

            return self._runMainLoop(job)

        finally:
            self._shutdownBatchSystem()
Return device_owner names for ports that should be serviced by DVR
dataset/ETHPy150Open BD2KGenomics/toil/src/toil/common.py/Toil.start--crossover with--dataset/ETHPy150Open openstack/neutron/neutron/common/utils.py/get_other_dvr_serviced_device_owners