github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/common/addresses.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package common 5 6 import ( 7 "github.com/juju/juju/apiserver/facade" 8 "github.com/juju/juju/apiserver/params" 9 "github.com/juju/juju/network" 10 "github.com/juju/juju/state" 11 "github.com/juju/juju/state/watcher" 12 ) 13 14 // AddressAndCertGetter can be used to find out controller addresses 15 // and the CA public certificate. 16 type AddressAndCertGetter interface { 17 Addresses() ([]string, error) 18 ModelUUID() string 19 APIHostPortsForAgents() ([][]network.HostPort, error) 20 WatchAPIHostPortsForAgents() state.NotifyWatcher 21 } 22 23 // APIAddresser implements the APIAddresses method. 24 // Note that the getter backing for this implies that it is suitable for use by 25 // agents, which are bound by the configured controller management space. 26 // It is not suitable for callers requiring *all* available API addresses. 27 type APIAddresser struct { 28 resources facade.Resources 29 getter AddressAndCertGetter 30 } 31 32 // NewAPIAddresser returns a new APIAddresser that uses the given getter to 33 // fetch its addresses. 34 func NewAPIAddresser(getter AddressAndCertGetter, resources facade.Resources) *APIAddresser { 35 return &APIAddresser{ 36 getter: getter, 37 resources: resources, 38 } 39 } 40 41 // APIHostPorts returns the API server addresses. 42 func (a *APIAddresser) APIHostPorts() (params.APIHostPortsResult, error) { 43 servers, err := a.getter.APIHostPortsForAgents() 44 if err != nil { 45 return params.APIHostPortsResult{}, err 46 } 47 return params.APIHostPortsResult{ 48 Servers: params.FromNetworkHostsPorts(servers), 49 }, nil 50 } 51 52 // WatchAPIHostPorts watches the API server addresses. 53 func (a *APIAddresser) WatchAPIHostPorts() (params.NotifyWatchResult, error) { 54 watch := a.getter.WatchAPIHostPortsForAgents() 55 if _, ok := <-watch.Changes(); ok { 56 return params.NotifyWatchResult{ 57 NotifyWatcherId: a.resources.Register(watch), 58 }, nil 59 } 60 return params.NotifyWatchResult{}, watcher.EnsureErr(watch) 61 } 62 63 // APIAddresses returns the list of addresses used to connect to the API. 64 func (a *APIAddresser) APIAddresses() (params.StringsResult, error) { 65 addrs, err := apiAddresses(a.getter) 66 if err != nil { 67 return params.StringsResult{}, err 68 } 69 return params.StringsResult{ 70 Result: addrs, 71 }, nil 72 } 73 74 func apiAddresses(getter APIHostPortsForAgentsGetter) ([]string, error) { 75 apiHostPorts, err := getter.APIHostPortsForAgents() 76 if err != nil { 77 return nil, err 78 } 79 var addrs = make([]string, 0, len(apiHostPorts)) 80 for _, hostPorts := range apiHostPorts { 81 ordered := network.PrioritizeInternalHostPorts(hostPorts, false) 82 for _, addr := range ordered { 83 if addr != "" { 84 addrs = append(addrs, addr) 85 } 86 } 87 } 88 return addrs, nil 89 } 90 91 // ModelUUID returns the model UUID to connect to the model 92 // that the current connection is for. 93 func (a *APIAddresser) ModelUUID() params.StringResult { 94 return params.StringResult{Result: a.getter.ModelUUID()} 95 } 96 97 // StateAddresser implements a common set of methods for getting state 98 // server addresses, and the CA certificate used to authenticate them. 99 type StateAddresser struct { 100 getter AddressAndCertGetter 101 } 102 103 // NewStateAddresser returns a new StateAddresser that uses the given 104 // st value to fetch its addresses. 105 func NewStateAddresser(getter AddressAndCertGetter) *StateAddresser { 106 return &StateAddresser{getter} 107 } 108 109 // StateAddresses returns the list of addresses used to connect to the state. 110 func (a *StateAddresser) StateAddresses() (params.StringsResult, error) { 111 addrs, err := a.getter.Addresses() 112 if err != nil { 113 return params.StringsResult{}, err 114 } 115 return params.StringsResult{ 116 Result: addrs, 117 }, nil 118 }