github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/common/instancetypes.go (about)

     1  // Copyright 2016 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package common
     5  
     6  import (
     7  	"github.com/juju/errors"
     8  
     9  	"github.com/juju/juju/core/constraints"
    10  	"github.com/juju/juju/environs"
    11  	"github.com/juju/juju/environs/context"
    12  	"github.com/juju/juju/environs/instances"
    13  	"github.com/juju/juju/rpc/params"
    14  )
    15  
    16  func toParamsInstanceTypeResult(itypes []instances.InstanceType) []params.InstanceType {
    17  	result := make([]params.InstanceType, len(itypes))
    18  	for i, t := range itypes {
    19  		virtType := ""
    20  		if t.VirtType != nil {
    21  			virtType = *t.VirtType
    22  		}
    23  		result[i] = params.InstanceType{
    24  			Name:         t.Name,
    25  			CPUCores:     int(t.CpuCores),
    26  			Memory:       int(t.Mem),
    27  			RootDiskSize: int(t.RootDisk),
    28  			VirtType:     virtType,
    29  			Cost:         int(t.Cost),
    30  		}
    31  		if t.Arch != "" {
    32  			result[i].Arches = []string{t.Arch}
    33  		}
    34  	}
    35  	return result
    36  }
    37  
    38  // NewInstanceTypeConstraints returns an instanceTypeConstraints with the passed
    39  // parameters.
    40  func NewInstanceTypeConstraints(env environs.Environ, ctx context.ProviderCallContext, constraints constraints.Value) instanceTypeConstraints {
    41  	return instanceTypeConstraints{
    42  		environ:     env,
    43  		constraints: constraints,
    44  		context:     ctx,
    45  	}
    46  }
    47  
    48  // instanceTypeConstraints holds necessary params to filter instance types.
    49  type instanceTypeConstraints struct {
    50  	constraints constraints.Value
    51  	environ     environs.Environ
    52  	context     context.ProviderCallContext
    53  }
    54  
    55  // InstanceTypes returns a list of the available instance types in the provider according
    56  // to the passed constraints.
    57  func InstanceTypes(cons instanceTypeConstraints) (params.InstanceTypesResult, error) {
    58  	instanceTypes, err := cons.environ.InstanceTypes(cons.context, cons.constraints)
    59  	if err != nil {
    60  		return params.InstanceTypesResult{}, errors.Trace(err)
    61  	}
    62  
    63  	return params.InstanceTypesResult{
    64  		InstanceTypes: toParamsInstanceTypeResult(instanceTypes.InstanceTypes),
    65  		CostUnit:      instanceTypes.CostUnit,
    66  		CostCurrency:  instanceTypes.CostCurrency,
    67  		CostDivisor:   instanceTypes.CostDivisor,
    68  	}, nil
    69  }