github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/client/machinemanager/instance_information.go (about) 1 // Copyright 2016 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package machinemanager 5 6 import ( 7 "github.com/juju/errors" 8 9 "github.com/juju/juju/apiserver/common" 10 "github.com/juju/juju/apiserver/params" 11 "github.com/juju/juju/core/constraints" 12 "github.com/juju/juju/environs" 13 "github.com/juju/juju/state/stateenvirons" 14 ) 15 16 // InstanceTypes returns instance type information for the cloud and region 17 // in which the current model is deployed. 18 func (mm *MachineManagerAPI) InstanceTypes(cons params.ModelInstanceTypesConstraints) (params.InstanceTypesResults, error) { 19 return instanceTypes(mm, environs.GetEnviron, cons) 20 } 21 22 type environGetFunc func(st environs.EnvironConfigGetter, newEnviron environs.NewEnvironFunc) (environs.Environ, error) 23 24 func instanceTypes(mm *MachineManagerAPI, 25 getEnviron environGetFunc, 26 cons params.ModelInstanceTypesConstraints, 27 ) (params.InstanceTypesResults, error) { 28 model, err := mm.st.Model() 29 if err != nil { 30 return params.InstanceTypesResults{}, errors.Trace(err) 31 } 32 33 cloudSpec := func() (environs.CloudSpec, error) { 34 cloudName := model.Cloud() 35 regionName := model.CloudRegion() 36 credentialTag, _ := model.CloudCredential() 37 return stateenvirons.CloudSpec(mm.st, cloudName, regionName, credentialTag) 38 } 39 backend := common.EnvironConfigGetterFuncs{ 40 CloudSpecFunc: cloudSpec, 41 ModelConfigFunc: model.Config, 42 } 43 44 env, err := getEnviron(backend, environs.New) 45 result := make([]params.InstanceTypesResult, len(cons.Constraints)) 46 // TODO(perrito666) Cache the results to avoid excessive querying of the cloud. 47 for i, c := range cons.Constraints { 48 value := constraints.Value{} 49 if c.Value != nil { 50 value = *c.Value 51 } 52 itCons := common.NewInstanceTypeConstraints( 53 env, 54 mm.callContext, 55 value, 56 ) 57 it, err := common.InstanceTypes(itCons) 58 if err != nil { 59 it = params.InstanceTypesResult{Error: common.ServerError(err)} 60 } 61 result[i] = it 62 } 63 64 return params.InstanceTypesResults{Results: result}, nil 65 }