// findInstanceSpec returns an InstanceSpec satisfying the supplied instanceConstraint. func findInstanceSpec(baseURLs []string, ic *instances.InstanceConstraint) (*instances.InstanceSpec, error) { if ic.Constraints.CpuPower == nil { ic.Constraints.CpuPower = instances.CpuPower(defaultCpuPower) } ec2Region := allRegions[ic.Region] imageConstraint := imagemetadata.ImageConstraint{ CloudSpec: imagemetadata.CloudSpec{ic.Region, ec2Region.EC2Endpoint}, Series: ic.Series, Arches: ic.Arches, } matchingImages, err := imagemetadata.Fetch( baseURLs, imagemetadata.DefaultIndexPath, &imageConstraint, signedImageDataOnly) if err != nil { return nil, err } if len(matchingImages) == 0 { logger.Warningf("no matching image meta data for constraints: %v", ic) } var images []instances.Image for _, imageMetadata := range matchingImages { // For now, we only want images with "ebs" storage. if imageMetadata.Storage != ebsStorage { continue } im := *imageMetadata images = append(images, instances.Image{ Id: im.Id, VType: im.VType, Arch: im.Arch, }) } // Make a copy of the known EC2 instance types, filling in the cost for the specified region. regionCosts := allRegionCosts[ic.Region] if len(regionCosts) == 0 && len(allRegionCosts) > 0 { return nil, fmt.Errorf("no instance types found in %s", ic.Region) } var itypesWithCosts []instances.InstanceType for _, itype := range allInstanceTypes { cost, ok := regionCosts[itype.Name] if !ok { continue } itWithCost := itype itWithCost.Cost = cost itypesWithCosts = append(itypesWithCosts, itWithCost) } return instances.FindInstanceSpec(images, ic, itypesWithCosts) }
var ( amd64 = []string{"amd64"} both = []string{"amd64", "i386"} ) // allRegions is defined here to allow tests to override the content. var allRegions = aws.Regions // allInstanceTypes holds the relevant attributes of every known // instance type. var allInstanceTypes = []instances.InstanceType{ { // First generation. Name: "m1.small", Arches: both, CpuCores: 1, CpuPower: instances.CpuPower(100), Mem: 1740, VType: ¶virtual, }, { Name: "m1.medium", Arches: both, CpuCores: 1, CpuPower: instances.CpuPower(200), Mem: 3840, VType: ¶virtual, }, { Name: "m1.large", Arches: amd64, CpuCores: 2, CpuPower: instances.CpuPower(400), Mem: 7680,