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  }