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 }