func (i *importer) constraints(cons description.Constraints) constraints.Value { var result constraints.Value if cons == nil { return result } if arch := cons.Architecture(); arch != "" { result.Arch = &arch } if container := instance.ContainerType(cons.Container()); container != "" { result.Container = &container } if cores := cons.CpuCores(); cores != 0 { result.CpuCores = &cores } if power := cons.CpuPower(); power != 0 { result.CpuPower = &power } if inst := cons.InstanceType(); inst != "" { result.InstanceType = &inst } if mem := cons.Memory(); mem != 0 { result.Mem = &mem } if disk := cons.RootDisk(); disk != 0 { result.RootDisk = &disk } if spaces := cons.Spaces(); len(spaces) > 0 { result.Spaces = &spaces } if tags := cons.Tags(); len(tags) > 0 { result.Tags = &tags } return result }
// MatchingInstanceTypes returns all instance types matching constraints and available // in region, sorted by increasing region-specific cost (if known). func MatchingInstanceTypes(allInstanceTypes []InstanceType, region string, cons constraints.Value) ([]InstanceType, error) { var itypes []InstanceType // Rules used to select instance types: // - non memory constraints like cpu-cores etc are always honoured // - if no mem constraint specified and instance-type not specified, // try opinionated default with enough mem to run a server. // - if no matches and no mem constraint specified, try again and // return any matching instance with the largest memory origCons := cons if !cons.HasInstanceType() && cons.Mem == nil { minMem := uint64(minMemoryHeuristic) cons.Mem = &minMem } itypes = matchingTypesForConstraint(allInstanceTypes, cons) // No matches using opinionated default, so if no mem constraint specified, // look for matching instance with largest memory. if len(itypes) == 0 && cons.Mem != origCons.Mem { itypes = matchingTypesForConstraint(allInstanceTypes, origCons) if len(itypes) > 0 { sort.Sort(byMemory(itypes)) itypes = []InstanceType{itypes[len(itypes)-1]} } } // If we have matching instance types, we can return those, sorted by cost. if len(itypes) > 0 { sort.Sort(byCost(itypes)) return itypes, nil } // No luck, so report the error. return nil, fmt.Errorf("no instance types in %s matching constraints %q", region, origCons) }
func (s *constraintsSuite) TestConstraints(c *gc.C) { for i, t := range newConstraintTests { var cv constraints.Value if t.arch != nil { cv.Arch = &t.arch.v } if t.cores != nil { cv.CpuCores = &t.cores.v } if t.power != nil { cv.CpuPower = &t.power.v } if t.mem != nil { cv.Mem = &t.mem.v } if t.disk != nil { cv.RootDisk = &t.disk.v } v := newConstraints(t.bootstrap, cv, img) if !c.Check(*v, gc.Equals, t.expected) { c.Logf("test (%d): %+v", i, t) } } }