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 }