github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/common/controllerconfig.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  	"gopkg.in/juju/names.v2"
     9  
    10  	"github.com/juju/juju/apiserver/params"
    11  	"github.com/juju/juju/state"
    12  )
    13  
    14  // ControllerConfigAPI implements two common methods for use by various
    15  // facades - eg Provisioner and ControllerConfig.
    16  type ControllerConfigAPI struct {
    17  	st state.ControllerAccessor
    18  }
    19  
    20  // NewStateControllerConfig returns a new NewControllerConfigAPI.
    21  func NewStateControllerConfig(st *state.State) *ControllerConfigAPI {
    22  	return NewControllerConfig(&controllerStateShim{st})
    23  }
    24  
    25  // NewControllerConfig returns a new NewControllerConfigAPI.
    26  func NewControllerConfig(st state.ControllerAccessor) *ControllerConfigAPI {
    27  	return &ControllerConfigAPI{
    28  		st: st,
    29  	}
    30  }
    31  
    32  // ControllerConfig returns the controller's configuration.
    33  func (s *ControllerConfigAPI) ControllerConfig() (params.ControllerConfigResult, error) {
    34  	result := params.ControllerConfigResult{}
    35  	config, err := s.st.ControllerConfig()
    36  	if err != nil {
    37  		return result, err
    38  	}
    39  	result.Config = params.ControllerConfig(config)
    40  	return result, nil
    41  }
    42  
    43  // ControllerAPIInfoForModels returns the controller api connection details for the specified models.
    44  func (s *ControllerConfigAPI) ControllerAPIInfoForModels(args params.Entities) (params.ControllerAPIInfoResults, error) {
    45  	var result params.ControllerAPIInfoResults
    46  	result.Results = make([]params.ControllerAPIInfoResult, len(args.Entities))
    47  	for i, entity := range args.Entities {
    48  		modelTag, err := names.ParseModelTag(entity.Tag)
    49  		if err != nil {
    50  			result.Results[i].Error = ServerError(err)
    51  			continue
    52  		}
    53  		addrs, caCert, err := s.st.ControllerInfo(modelTag.Id())
    54  		if err != nil {
    55  			result.Results[i].Error = ServerError(err)
    56  			continue
    57  		}
    58  		result.Results[i].Addresses = addrs
    59  		result.Results[i].CACert = caCert
    60  	}
    61  	return result, nil
    62  }
    63  
    64  type controllerStateShim struct {
    65  	*state.State
    66  }
    67  
    68  // ControllerInfo returns the external controller details for the specified model.
    69  func (s *controllerStateShim) ControllerInfo(modelUUID string) (addrs []string, CACert string, _ error) {
    70  	// First see if the requested model UUID is hosted by this controller.
    71  	modelExists, err := s.State.ModelExists(modelUUID)
    72  	if err != nil {
    73  		return nil, "", errors.Trace(err)
    74  	}
    75  	if modelExists {
    76  		return StateControllerInfo(s.State)
    77  	}
    78  
    79  	// Now check any external controllers.
    80  	ec := state.NewExternalControllers(s.State)
    81  	info, err := ec.ControllerForModel(modelUUID)
    82  	if err != nil {
    83  		return nil, "", errors.Trace(err)
    84  	}
    85  	return info.ControllerInfo().Addrs, info.ControllerInfo().CACert, nil
    86  }
    87  
    88  // StateControllerInfo returns the local controller details for the given State.
    89  func StateControllerInfo(st *state.State) (addrs []string, caCert string, _ error) {
    90  	addr, err := apiAddresses(st)
    91  	if err != nil {
    92  		return nil, "", errors.Trace(err)
    93  	}
    94  	controllerConfig, err := st.ControllerConfig()
    95  	if err != nil {
    96  		return nil, "", errors.Trace(err)
    97  	}
    98  	caCert, _ = controllerConfig.CACert()
    99  	return addr, caCert, nil
   100  }