def _getScript(self): def userScript(): from toil.job import Job from toil.common import Toil # Because this is the only job in the pipeline and because it is preemptable, # there will be no non-preemptable jobs. The non-preemptable scaler will therefore # not request any nodes initially. And since we made it impossible for the # preemptable scaler to allocate any nodes (using an abnormally low spot bid), # we will observe a deficit of preemptable nodes that the non-preemptable scaler will # compensate for by spinning up non-preemptable nodes instead. # def job(job, disk='10M', cores=1, memory='10M', preemptable=True): pass if __name__ == '__main__': options = Job.Runner.getDefaultArgumentParser().parse_args() with Toil(options) as toil: if toil.config.restart: toil.restart() else: toil.start(Job.wrapJobFn(job)) script = dedent('\n'.join(getsource(userScript).split('\n')[1:])) # use appliance ssh method instead of sshutil so we can specify input param AWSProvisioner._sshAppliance(self.leader.ip_address, 'tee', '/home/userScript.py', input=script)
def _getScript(self): def restartScript(): from toil.job import Job import argparse import os def f0(job): if 'FAIL' in os.environ: raise RuntimeError('failed on purpose') if __name__ == '__main__': parser = argparse.ArgumentParser() Job.Runner.addToilOptions(parser) options = parser.parse_args() rootJob = Job.wrapJobFn(f0, cores=0.5, memory='50 M', disk='50 M') Job.Runner.startToil(rootJob, options) script = dedent('\n'.join(getsource(restartScript).split('\n')[1:])) # use appliance ssh method instead of sshutil so we can specify input param AWSProvisioner._sshAppliance(self.leader.ip_address, 'tee', self.scriptName, input=script)
def _getScript(self): def userScript(): from toil.job import Job from toil.common import Toil # Because this is the only job in the pipeline and because it is preemptable, # there will be no non-preemptable jobs. The non-preemptable scaler will therefore # not request any nodes initially. And since we made it impossible for the # preemptable scaler to allocate any nodes (using an abnormally low spot bid), # we will observe a deficit of preemptable nodes that the non-preemptable scaler will # compensate for by spinning up non-preemptable nodes instead. # def job(job, disk='10M', cores=1, memory='10M', preemptable=True): pass if __name__ == '__main__': options = Job.Runner.getDefaultArgumentParser().parse_args() with Toil(options) as toil: if toil.config.restart: toil.restart() else: toil.start(Job.wrapJobFn(job)) script = dedent('\n'.join(getsource(userScript).split('\n')[1:])) # use appliance ssh method instead of sshutil so we can specify input param AWSProvisioner._sshAppliance(self.leader.ip_address, 'tee', '/home/userScript.py', input=script)
def _getScript(self): def restartScript(): from toil.job import Job import argparse import os def f0(job): if 'FAIL' in os.environ: raise RuntimeError('failed on purpose') if __name__ == '__main__': parser = argparse.ArgumentParser() Job.Runner.addToilOptions(parser) options = parser.parse_args() rootJob = Job.wrapJobFn(f0, cores=0.5, memory='50 M', disk='50 M') Job.Runner.startToil(rootJob, options) script = dedent('\n'.join(getsource(restartScript).split('\n')[1:])) # use appliance ssh method instead of sshutil so we can specify input param AWSProvisioner._sshAppliance(self.leader.ip_address, 'tee', self.scriptName, input=script)
def _test(self, spotInstances=False): from toil.provisioners.aws.awsProvisioner import AWSProvisioner leader = AWSProvisioner.launchCluster(instanceType=self.instanceType, keyName=self.keyName, clusterName=self.clusterName) # --never-download prevents silent upgrades to pip, wheel and setuptools venv_command = 'virtualenv --system-site-packages --never-download /home/venv' AWSProvisioner._sshAppliance(leader.ip_address, command=venv_command) upgrade_command = '/home/venv/bin/pip install setuptools==28.7.1' AWSProvisioner._sshAppliance(leader.ip_address, command=upgrade_command) yaml_command = '/home/venv/bin/pip install pyyaml==3.12' AWSProvisioner._sshAppliance(leader.ip_address, command=yaml_command) # install toil scripts install_command = ('/home/venv/bin/pip install toil-scripts==%s' % self.toilScripts) AWSProvisioner._sshAppliance(leader.ip_address, command=install_command) # install curl install_command = 'sudo apt-get -y install curl' AWSProvisioner._sshAppliance(leader.ip_address, command=install_command) toilOptions = [ '--batchSystem=mesos', '--workDir=/var/lib/toil', '--mesosMaster=%s:5050' % leader.private_ip_address, '--clean=always', '--retryCount=0' ] toilOptions.extend([ '--provisioner=aws', '--nodeType=' + self.instanceType, '--maxNodes=%s' % self.numWorkers, '--logDebug' ]) if spotInstances: toilOptions.extend([ '--preemptableNodeType=%s:%s' % (self.instanceType, self.spotBid), # The RNASeq pipeline does not specify a preemptability requirement so we # need to specify a default, otherwise jobs would never get scheduled. '--defaultPreemptable', '--maxPreemptableNodes=%s' % self.numWorkers ]) toilOptions = ' '.join(toilOptions) runCommand = 'bash -c \\"export PATH=/home/venv/bin/:$PATH;export TOIL_SCRIPTS_TEST_NUM_SAMPLES=%i; export TOIL_SCRIPTS_TEST_TOIL_OPTIONS=' + pipes.quote(toilOptions) + \ '; export TOIL_SCRIPTS_TEST_JOBSTORE=' + self.jobStore + \ '; /home/venv/bin/python -m unittest -v' + \ ' toil_scripts.rnaseq_cgl.test.test_rnaseq_cgl.RNASeqCGLTest.test_manifest\\"' runCommand %= self.numSamples AWSProvisioner._sshAppliance(leader.ip_address, runCommand)