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  }