github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/gce/instance_information.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package gce 5 6 import ( 7 "strconv" 8 9 "github.com/juju/errors" 10 "github.com/juju/utils/arch" 11 12 "github.com/juju/juju/core/constraints" 13 "github.com/juju/juju/environs" 14 "github.com/juju/juju/environs/context" 15 "github.com/juju/juju/environs/instances" 16 "github.com/juju/juju/provider/gce/google" 17 ) 18 19 var _ environs.InstanceTypesFetcher = (*environ)(nil) 20 var virtType = "kvm" 21 22 // InstanceTypes implements InstanceTypesFetcher 23 func (env *environ) InstanceTypes(ctx context.ProviderCallContext, c constraints.Value) (instances.InstanceTypesWithCostMetadata, error) { 24 reg, err := env.Region() 25 if err != nil { 26 return instances.InstanceTypesWithCostMetadata{}, errors.Trace(err) 27 } 28 zones, err := env.gce.AvailabilityZones(reg.Region) 29 if err != nil { 30 return instances.InstanceTypesWithCostMetadata{}, google.HandleCredentialError(errors.Trace(err), ctx) 31 } 32 resultUnique := map[string]instances.InstanceType{} 33 34 for _, z := range zones { 35 if !z.Available() { 36 continue 37 } 38 machines, err := env.gce.ListMachineTypes(z.Name()) 39 if err != nil { 40 return instances.InstanceTypesWithCostMetadata{}, google.HandleCredentialError(errors.Trace(err), ctx) 41 } 42 for _, m := range machines { 43 i := instances.InstanceType{ 44 Id: strconv.FormatUint(m.Id, 10), 45 Name: m.Name, 46 CpuCores: uint64(m.GuestCpus), 47 Mem: uint64(m.MemoryMb), 48 Arches: []string{arch.AMD64}, 49 VirtType: &virtType, 50 } 51 resultUnique[m.Name] = i 52 } 53 } 54 55 result := make([]instances.InstanceType, len(resultUnique)) 56 i := 0 57 for _, it := range resultUnique { 58 result[i] = it 59 i++ 60 } 61 result, err = instances.MatchingInstanceTypes(result, "", c) 62 if err != nil { 63 return instances.InstanceTypesWithCostMetadata{}, errors.Trace(err) 64 } 65 return instances.InstanceTypesWithCostMetadata{InstanceTypes: result}, nil 66 }