// findInstanceSpec returns an InstanceSpec satisfying the supplied instanceConstraint. func findInstanceSpec( allImageMetadata []*imagemetadata.ImageMetadata, ic *instances.InstanceConstraint, ) (*instances.InstanceSpec, error) { // If the instance type is set, don't also set a default CPU power // as this is implied. cons := ic.Constraints if cons.CpuPower == nil && (cons.InstanceType == nil || *cons.InstanceType == "") { ic.Constraints.CpuPower = instances.CpuPower(defaultCpuPower) } suitableImages := filterImages(allImageMetadata, ic) images := instances.ImageMetadataToImages(suitableImages) // 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) }
func (s *environBrokerSuite) SetUpTest(c *gc.C) { s.BaseSuite.SetUpTest(c) mem := uint64(3750) amd64 := arch.AMD64 cpuCores := uint64(1) rootDiskMB := uint64(5) zoneName := "home-zone" s.hardware = &instance.HardwareCharacteristics{ Arch: &amd64, Mem: &mem, CpuCores: &cpuCores, CpuPower: instances.CpuPower(275), RootDisk: &rootDiskMB, AvailabilityZone: &zoneName, } s.spec = &instances.InstanceSpec{ InstanceType: s.InstanceType, Image: instances.Image{ Id: "ubuntu-1404-trusty-v20141212", Arch: amd64, VirtType: "kvm", }, } s.ic = &instances.InstanceConstraint{ Region: "home", Series: "trusty", Arches: []string{amd64}, Constraints: s.StartInstArgs.Constraints, } s.imageMetadata = []*imagemetadata.ImageMetadata{{ Id: "ubuntu-1404-trusty-v20141212", Arch: "amd64", Version: "14.04", RegionName: "us-central1", Endpoint: "https://www.googleapis.com", Stream: "<stream>", VirtType: "kvm", }} s.resolveInfo = &simplestreams.ResolveInfo{ Source: "", Signed: true, IndexURL: "", MirrorURL: "", } }
// findInstanceSpec returns an InstanceSpec satisfying the supplied instanceConstraint. func findInstanceSpec( sources []simplestreams.DataSource, stream string, ic *instances.InstanceConstraint) (*instances.InstanceSpec, error) { // If the instance type is set, don't also set a default CPU power // as this is implied. cons := ic.Constraints if cons.CpuPower == nil && (cons.InstanceType == nil || *cons.InstanceType == "") { ic.Constraints.CpuPower = instances.CpuPower(defaultCpuPower) } ec2Region := allRegions[ic.Region] imageConstraint := imagemetadata.NewImageConstraint(simplestreams.LookupParams{ CloudSpec: simplestreams.CloudSpec{ic.Region, ec2Region.EC2Endpoint}, Series: []string{ic.Series}, Arches: ic.Arches, Stream: stream, }) matchingImages, _, err := imagemetadata.Fetch(sources, imageConstraint, signedImageDataOnly) if err != nil { return nil, err } if len(matchingImages) == 0 { logger.Warningf("no matching image meta data for constraints: %v", ic) } suitableImages := filterImages(matchingImages, ic) images := instances.ImageMetadataToImages(suitableImages) // 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) }
arches = []string{arch.AMD64} ) // Instance types are not associated with disks in GCE, so we do not // set RootDisk. // TODO(ericsnow) Dynamically generate the type specs from the official // JSON file. // Shared-core machine types. var allInstanceTypes = []instances.InstanceType{ { // Standard machine types Name: "n1-standard-1", Arches: arches, CpuCores: 1, CpuPower: instances.CpuPower(275), Mem: 3750, VirtType: &vtype, }, { Name: "n1-standard-2", Arches: arches, CpuCores: 2, CpuPower: instances.CpuPower(550), Mem: 7500, VirtType: &vtype, }, { Name: "n1-standard-4", Arches: arches, CpuCores: 4, CpuPower: instances.CpuPower(1100), Mem: 15000,
both = []string{arch.AMD64, arch.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. // Note that while the EC2 root disk default is 8G, constraints on disk // for amazon will simply cause the root disk to grow to match the constraint var allInstanceTypes = []instances.InstanceType{ { // General purpose, 1st generation. Name: "m1.small", Arches: both, CpuCores: 1, CpuPower: instances.CpuPower(100), Mem: 1740, VirtType: ¶virtual, }, { Name: "m1.medium", Arches: both, CpuCores: 1, CpuPower: instances.CpuPower(200), Mem: 3840, VirtType: ¶virtual, }, { Name: "m1.large", Arches: amd64, CpuCores: 2, CpuPower: instances.CpuPower(400), Mem: 7680,