def __init__(self, clusterName, provisioner, zone=None): self.clusterName = clusterName self.zone = zone self.provisionerType = provisioner if provisioner == 'aws': from toil.provisioners.aws.awsProvisioner import AWSProvisioner self.provisioner = AWSProvisioner elif provisioner == 'gce': from toil.provisioners.gceProvisioner import GCEProvisioner self.provisioner = GCEProvisioner() else: assert False, "Invalid provisioner '%s'" % provisioner
def cluster_factory(provisioner, clusterName=None, clusterType='mesos', zone=None, nodeStorage=50, nodeStorageOverrides=None, sseKey=None): """ Find and instantiate the appropriate provisioner instance to make clusters in the given cloud. Raises ClusterTypeNotSupportedException if the given provisioner does not implement clusters of the given type. :param provisioner: The cloud type of the cluster. :param clusterName: The name of the cluster. :param clusterType: The type of cluster: 'mesos' or 'kubernetes'. :param zone: The cloud zone :return: A cluster object for the the cloud type. """ if provisioner == 'aws': try: from toil.provisioners.aws.awsProvisioner import AWSProvisioner except ImportError: logger.error('The aws extra must be installed to use this provisioner') raise return AWSProvisioner(clusterName, clusterType, zone, nodeStorage, nodeStorageOverrides, sseKey) elif provisioner == 'gce': try: from toil.provisioners.gceProvisioner import GCEProvisioner except ImportError: logger.error('The google extra must be installed to use this provisioner') raise return GCEProvisioner(clusterName, clusterType, zone, nodeStorage, nodeStorageOverrides, sseKey) else: raise RuntimeError("Invalid provisioner '%s'" % provisioner)
def cluster_factory(provisioner, clusterName=None, zone=None, nodeStorage=50, nodeStorageOverrides=None, sseKey=None): """ :param clusterName: The name of the cluster. :param provisioner: The cloud type of the cluster. :param zone: The cloud zone :return: A cluster object for the the cloud type. """ if provisioner == 'aws': try: from toil.provisioners.aws.awsProvisioner import AWSProvisioner except ImportError: logger.error( 'The aws extra must be installed to use this provisioner') raise return AWSProvisioner(clusterName, zone, nodeStorage, nodeStorageOverrides, sseKey) elif provisioner == 'gce': try: from toil.provisioners.gceProvisioner import GCEProvisioner except ImportError: logger.error( 'The google extra must be installed to use this provisioner') raise return GCEProvisioner(clusterName, zone, nodeStorage, nodeStorageOverrides, sseKey) else: raise RuntimeError("Invalid provisioner '%s'" % provisioner)
class Cluster(object): def __init__(self, clusterName, provisioner, zone=None): self.clusterName = clusterName self.zone = zone self.provisionerType = provisioner if provisioner == 'aws': from toil.provisioners.aws.awsProvisioner import AWSProvisioner self.provisioner = AWSProvisioner elif provisioner == 'gce': from toil.provisioners.gceProvisioner import GCEProvisioner self.provisioner = GCEProvisioner() else: assert False, "Invalid provisioner '%s'" % provisioner def sshCluster(self, args, **kwargs): self.provisioner.sshLeader(self.clusterName, args, self.zone, **kwargs) def rsyncCluster(self, args, **kwargs): self.provisioner.rsyncLeader(self.clusterName, args, self.zone, **kwargs) # Why was this added? It is undocumented and calling private methods. #ctx = self.provisioner._buildContext(self.clusterName, zone=self.zone) #instances = self.provisioner._getNodesInCluster(ctx, self.clusterName, both=True) #leader = self.provisioner._getLeader(self.clusterName, zone=self.zone) #workers = [i for i in instances if i.public_dns_name != leader.public_dns_name] #for instance in workers: # self.provisioner._waitForNode(instance, 'toil_worker') # self.provisioner._coreRsync(instance.public_dns_name, args, applianceName='toil_worker', **kwargs) def destroyCluster(self): self.provisioner.destroyCluster(self.clusterName, self.zone)
def clusterFactory(provisioner, clusterName=None, zone=None, nodeStorage=50, sseKey=None): """ :param clusterName: The name of the cluster. :param provisioner: The cloud type of the cluster. :param zone: The cloud zone :return: A cluster object for the the cloud type. """ if provisioner == 'aws': try: from toil.provisioners.aws.awsProvisioner import AWSProvisioner from toil.lib.ec2Credentials import enable_metadata_credential_caching except ImportError: logger.error( 'The aws extra must be installed to use this provisioner') raise enable_metadata_credential_caching() # monkey patch for AWS return AWSProvisioner(clusterName, zone, nodeStorage, sseKey) elif provisioner == 'gce': try: from toil.provisioners.gceProvisioner import GCEProvisioner except ImportError: logger.error( 'The google extra must be installed to use this provisioner') raise return GCEProvisioner(clusterName, zone, nodeStorage, sseKey) elif provisioner == 'azure': try: from toil.provisioners.azure.azureProvisioner import AzureProvisioner except ImportError: logger.error( 'The azure extra must be installed to use this provisioner') raise return AzureProvisioner(clusterName, zone, nodeStorage) else: raise RuntimeError("Invalid provisioner '%s'" % provisioner)
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)