def main(): parser = getBasicOptionParser() parser = addBasicProvisionerOptions(parser) parser.add_argument("--nodeType", dest='nodeType', required=True, help="Node type for {non-|}preemptable nodes. The syntax depends on the " "provisioner used. For the aws provisioner this is the name of an " "EC2 instance type followed by a colon and the price in dollar to " "bid for a spot instance, for example 'c3.8xlarge:0.42'.") parser.add_argument("--keyPairName", dest='keyPairName', required=True, help="The name of the AWS key pair to include on the instance") parser.add_argument("-t", "--tag", metavar='NAME=VALUE', dest='tags', default=[], action='append', help="Tags are added to the AWS cluster for this node and all of its" "children. Tags are of the form: " " -t key1=value1 --tag key2=value2 " "Multiple tags are allowed and each tag needs its own flag. By " "default the cluster is tagged with " " {" " \"Name\": clusterName," " \"Owner\": IAM username" " }. ") parser.add_argument("--vpcSubnet", help="VPC subnet ID to launch cluster in. Uses default subnet if not specified." "This subnet needs to have auto assign IPs turned on.") parser.add_argument("-w", "--workers", dest='workers', default=0, type=int, help="Specify a number of workers to launch alongside the leader when the " "cluster is created. This can be useful if running toil without " "auto-scaling but with need of more hardware support") config = parseBasicOptions(parser) setLoggingFromOptions(config) tagsDict = None if config.tags is None else createTagsDict(config.tags) spotBid = None if config.provisioner == 'aws': logger.info('Using aws provisioner.') try: from toil.provisioners.aws.awsProvisioner import AWSProvisioner except ImportError: raise RuntimeError('The aws extra must be installed to use this provisioner') provisioner = AWSProvisioner() parsedBid = config.nodeType.split(':', 1) if len(config.nodeType) != len(parsedBid[0]): # there is a bid spotBid = float(parsedBid[1]) config.nodeType = parsedBid[0] else: assert False provisioner.launchCluster(instanceType=config.nodeType, keyName=config.keyPairName, clusterName=config.clusterName, workers=config.workers, spotBid=spotBid, userTags=tagsDict, zone=config.zone, vpcSubnet=config.vpcSubnet)
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)
def main(): parser = getBasicOptionParser() parser = addBasicProvisionerOptions(parser) parser.add_argument("--leaderNodeType", dest="leaderNodeType", required=True, help="Non-preemptable node type to use for the cluster leader.") parser.add_argument("--keyPairName", dest='keyPairName', required=True, help="The name of the AWS or ssh key pair to include on the instance") parser.add_argument("--boto", dest='botoPath', help="The path to the boto credentials directory. This is transferred to all " " nodes in order to access the AWS jobStore from non-AWS instances.") parser.add_argument("-t", "--tag", metavar='NAME=VALUE', dest='tags', default=[], action='append', help="Tags are added to the AWS cluster for this node and all of its " "children. Tags are of the form:\n" " -t key1=value1 --tag key2=value2\n" "Multiple tags are allowed and each tag needs its own flag. By " "default the cluster is tagged with " " {\n" " \"Name\": clusterName,\n" " \"Owner\": IAM username\n" " }. ") parser.add_argument("--vpcSubnet", help="VPC subnet ID to launch cluster in. Uses default subnet if not specified. " "This subnet needs to have auto assign IPs turned on.") parser.add_argument("--nodeTypes", dest='nodeTypes', default=None, type=str, help="Comma-separated list of node types to create while launching the leader. The " "syntax for each node type depends on the " "provisioner used. For the aws provisioner this is the name of an " "EC2 instance type followed by a colon and the price in dollar to " "bid for a spot instance, for example 'c3.8xlarge:0.42'. Must also provide " "the --workers argument to specify how many workers of each node type to create") parser.add_argument("-w", "--workers", dest='workers', default=None, type=str, help="Comma-separated list of the number of workers of each node type to launch " "alongside the leader when the " "cluster is created. This can be useful if running toil without " "auto-scaling but with need of more hardware support") parser.add_argument("--leaderStorage", dest='leaderStorage', type=int, default=50, help="Specify the size (in gigabytes) of the root volume for the leader instance. " "This is an EBS volume.") parser.add_argument("--nodeStorage", dest='nodeStorage', type=int, default=50, help="Specify the size (in gigabytes) of the root volume for any worker instances " "created when using the -w flag. This is an EBS volume.") config = parseBasicOptions(parser) tagsDict = None if config.tags is None else createTagsDict(config.tags) spotBids = [] nodeTypes = [] preemptableNodeTypes = [] numNodes = [] numPreemptableNodes = [] leaderSpotBid = None if config.provisioner == 'aws': logger.info('Using aws provisioner.') try: from toil.provisioners.aws.awsProvisioner import AWSProvisioner except ImportError: logger.error('The aws extra must be installed to use this provisioner') raise provisioner = AWSProvisioner() elif config.provisioner == 'gce': logger.info('Using a gce provisioner.') try: from toil.provisioners.gceProvisioner import GCEProvisioner except ImportError: logger.error('The google extra must be installed to use this provisioner') raise provisioner = GCEProvisioner() else: assert False #Parse leader node type and spot bid parsedBid = config.leaderNodeType.split(':', 1) if len(config.leaderNodeType) != len(parsedBid[0]): leaderSpotBid = float(parsedBid[1]) config.leaderNodeType = parsedBid[0] if (config.nodeTypes or config.workers) and not (config.nodeTypes and config.workers): raise RuntimeError("The --nodeTypes and --workers options must be specified together,") if config.nodeTypes: nodeTypesList = config.nodeTypes.split(",") numWorkersList = config.workers.split(",") if not len(nodeTypesList) == len(numWorkersList): raise RuntimeError("List of node types must be same length as list of numbers of workers.") for nodeTypeStr, num in zip(nodeTypesList, numWorkersList): parsedBid = nodeTypeStr.split(':', 1) if len(nodeTypeStr) != len(parsedBid[0]): #Is a preemptable node preemptableNodeTypes.append(parsedBid[0]) spotBids.append(float(parsedBid[1])) numPreemptableNodes.append(int(num)) else: nodeTypes.append(nodeTypeStr) numNodes.append(int(num)) provisioner.launchCluster(leaderNodeType=config.leaderNodeType, leaderSpotBid=leaderSpotBid, nodeTypes=nodeTypes, preemptableNodeTypes=preemptableNodeTypes, numWorkers=numNodes, numPreemptableWorkers = numPreemptableNodes, keyName=config.keyPairName, botoPath=config.botoPath, clusterName=config.clusterName, spotBids=spotBids, userTags=tagsDict, zone=config.zone, leaderStorage=config.leaderStorage, nodeStorage=config.nodeStorage, vpcSubnet=config.vpcSubnet)
def main(): parser = getBasicOptionParser() parser = addBasicProvisionerOptions(parser) parser.add_argument( "--leaderNodeType", dest="leaderNodeType", required=True, help="Non-preemptable node type to use for the cluster leader.") parser.add_argument( "--keyPairName", dest='keyPairName', required=True, help="On AWS, the name of the AWS key pair to include on the instance." " On Google/GCE, this is the ssh key pair." " On Azure, this will be used as the owner tag.") parser.add_argument( "--publicKeyFile", dest='publicKeyFile', default="~/.ssh/id_rsa.pub", help="On Azure, the file" " containing the key pairs (the first key pair will be used).") parser.add_argument( "--boto", dest='botoPath', help="The path to the boto credentials directory. This is transferred " "to all nodes in order to access the AWS jobStore from non-AWS instances." ) parser.add_argument( "-t", "--tag", metavar='NAME=VALUE', dest='tags', default=[], action='append', help="Tags are added to the AWS cluster for this node and all of its " "children. Tags are of the form:\n" " -t key1=value1 --tag key2=value2\n" "Multiple tags are allowed and each tag needs its own flag. By " "default the cluster is tagged with " " {\n" " \"Name\": clusterName,\n" " \"Owner\": IAM username\n" " }. ") parser.add_argument( "--vpcSubnet", help="VPC subnet ID to launch cluster in. Uses default subnet if not " "specified. This subnet needs to have auto assign IPs turned on.") parser.add_argument( "--nodeTypes", dest='nodeTypes', default=None, type=str, help="Comma-separated list of node types to create while launching the " "leader. The syntax for each node type depends on the provisioner " "used. For the aws provisioner this is the name of an EC2 instance " "type followed by a colon and the price in dollar to bid for a spot " "instance, for example 'c3.8xlarge:0.42'. Must also provide the " "--workers argument to specify how many workers of each node type " "to create.") parser.add_argument( "-w", "--workers", dest='workers', default=None, type=str, help= "Comma-separated list of the number of workers of each node type to " "launch alongside the leader when the cluster is created. This can be " "useful if running toil without auto-scaling but with need of more " "hardware support") parser.add_argument( "--leaderStorage", dest='leaderStorage', type=int, default=50, help="Specify the size (in gigabytes) of the root volume for the leader " "instance. This is an EBS volume.") parser.add_argument( "--nodeStorage", dest='nodeStorage', type=int, default=50, help="Specify the size (in gigabytes) of the root volume for any worker " "instances created when using the -w flag. This is an EBS volume.") parser.add_argument( '--forceDockerAppliance', dest='forceDockerAppliance', action='store_true', default=False, help= "Disables sanity checking the existence of the docker image specified " "by TOIL_APPLIANCE_SELF, which Toil uses to provision mesos for " "autoscaling.") parser.add_argument( "--azureStorageCredentials", dest='azureStorageCredentials', type=str, default=credential_file_path, help= "The location of the file containing the Azure storage credentials. If not specified," " the default file is used with Azure provisioning. Use 'None' to disable" " the transfer of credentials.") config = parseBasicOptions(parser) tagsDict = None if config.tags is None else createTagsDict(config.tags) # checks the validity of TOIL_APPLIANCE_SELF before proceeding checkToilApplianceSelf = applianceSelf( forceDockerAppliance=config.forceDockerAppliance) spotBids = [] nodeTypes = [] preemptableNodeTypes = [] numNodes = [] numPreemptableNodes = [] leaderSpotBid = None if config.provisioner == 'aws': logger.info('Using aws provisioner.') try: from toil.provisioners.aws.awsProvisioner import AWSProvisioner except ImportError: logger.error( 'The aws extra must be installed to use this provisioner') raise provisioner = AWSProvisioner() elif config.provisioner == 'azure': try: from toil.provisioners.azure.azureProvisioner import AzureProvisioner except ImportError: raise RuntimeError( 'The aws extra must be installed to use this provisioner') provisioner = AzureProvisioner() elif config.provisioner == 'gce': logger.info('Using a gce provisioner.') try: from toil.provisioners.gceProvisioner import GCEProvisioner except ImportError: logger.error( 'The google extra must be installed to use this provisioner') raise provisioner = GCEProvisioner() else: assert False #Parse leader node type and spot bid parsedBid = config.leaderNodeType.split(':', 1) if len(config.leaderNodeType) != len(parsedBid[0]): leaderSpotBid = float(parsedBid[1]) config.leaderNodeType = parsedBid[0] if (config.nodeTypes or config.workers) and not (config.nodeTypes and config.workers): raise RuntimeError( "The --nodeTypes and --workers options must be specified together," ) if config.nodeTypes: nodeTypesList = config.nodeTypes.split(",") numWorkersList = config.workers.split(",") if not len(nodeTypesList) == len(numWorkersList): raise RuntimeError( "List of node types must be the same length as the list of workers." ) for nodeTypeStr, num in zip(nodeTypesList, numWorkersList): parsedBid = nodeTypeStr.split(':', 1) if len(nodeTypeStr) != len(parsedBid[0]): #Is a preemptable node preemptableNodeTypes.append(parsedBid[0]) spotBids.append(float(parsedBid[1])) numPreemptableNodes.append(int(num)) else: nodeTypes.append(nodeTypeStr) numNodes.append(int(num)) provisioner.launchCluster( leaderNodeType=config.leaderNodeType, leaderSpotBid=leaderSpotBid, nodeTypes=nodeTypes, preemptableNodeTypes=preemptableNodeTypes, numWorkers=numNodes, numPreemptableWorkers=numPreemptableNodes, keyName=config.keyPairName, botoPath=config.botoPath, clusterName=config.clusterName, spotBids=spotBids, userTags=tagsDict, zone=config.zone, leaderStorage=config.leaderStorage, nodeStorage=config.nodeStorage, vpcSubnet=config.vpcSubnet, publicKeyFile=config.publicKeyFile, azureStorageCredentials=config.azureStorageCredentials)
def main(): parser = getBasicOptionParser() parser = addBasicProvisionerOptions(parser) parser.add_argument("--nodeType", dest='nodeType', required=True, help="Node type for {non-|}preemptable nodes. The syntax depends on the " "provisioner used. For the aws provisioner this is the name of an " "EC2 instance type followed by a colon and the price in dollar to " "bid for a spot instance, for example 'c3.8xlarge:0.42'.") parser.add_argument("--keyPairName", dest='keyPairName', required=True, help="The name of the AWS key pair to include on the instance") parser.add_argument("-t", "--tag", metavar='NAME=VALUE', dest='tags', default=[], action='append', help="Tags are added to the AWS cluster for this node and all of its " "children. Tags are of the form:\n" " --t key1=value1 --tag key2=value2\n" "Multiple tags are allowed and each tag needs its own flag. By " "default the cluster is tagged with " " {\n" " \"Name\": clusterName,\n" " \"Owner\": IAM username\n" " }. ") parser.add_argument("--vpcSubnet", help="VPC subnet ID to launch cluster in. Uses default subnet if not specified. " "This subnet needs to have auto assign IPs turned on.") parser.add_argument("-w", "--workers", dest='workers', default=0, type=int, help="Specify a number of workers to launch alongside the leader when the " "cluster is created. This can be useful if running toil without " "auto-scaling but with need of more hardware support") parser.add_argument("--leaderStorage", dest='leaderStorage', type=int, default=50, help="Specify the size (in gigabytes) of the root volume for the leader instance. " "This is an EBS volume.") parser.add_argument("--nodeStorage", dest='nodeStorage', type=int, default=50, help="Specify the size (in gigabytes) of the root volume for any worker instances " "created when using the -w flag. This is an EBS volume.") config = parseBasicOptions(parser) tagsDict = None if config.tags is None else createTagsDict(config.tags) spotBid = None if config.provisioner == 'aws': logger.info('Using aws provisioner.') try: from toil.provisioners.aws.awsProvisioner import AWSProvisioner except ImportError: raise RuntimeError('The aws extra must be installed to use this provisioner') provisioner = AWSProvisioner() parsedBid = config.nodeType.split(':', 1) if len(config.nodeType) != len(parsedBid[0]): # there is a bid spotBid = float(parsedBid[1]) config.nodeType = parsedBid[0] else: assert False provisioner.launchCluster(instanceType=config.nodeType, keyName=config.keyPairName, clusterName=config.clusterName, workers=config.workers, spotBid=spotBid, userTags=tagsDict, zone=config.zone, leaderStorage=config.leaderStorage, nodeStorage=config.nodeStorage, vpcSubnet=config.vpcSubnet)