github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/apiserver/facades/controller/crosscontroller/crosscontroller.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package crosscontroller 5 6 import ( 7 "github.com/juju/loggo" 8 9 "github.com/juju/juju/apiserver/common" 10 "github.com/juju/juju/apiserver/facade" 11 "github.com/juju/juju/apiserver/params" 12 "github.com/juju/juju/state" 13 "github.com/juju/juju/state/watcher" 14 ) 15 16 var logger = loggo.GetLogger("juju.apiserver.crosscontroller") 17 18 type localControllerInfoFunc func() ([]string, string, error) 19 type watchLocalControllerInfoFunc func() state.NotifyWatcher 20 21 // CrossControllerAPI provides access to the CrossModelRelations API facade. 22 type CrossControllerAPI struct { 23 resources facade.Resources 24 localControllerInfo localControllerInfoFunc 25 watchLocalControllerInfo watchLocalControllerInfoFunc 26 } 27 28 // NewStateCrossControllerAPI creates a new server-side CrossModelRelations API facade 29 // backed by global state. 30 func NewStateCrossControllerAPI(ctx facade.Context) (*CrossControllerAPI, error) { 31 st := ctx.State() 32 return NewCrossControllerAPI( 33 ctx.Resources(), 34 func() ([]string, string, error) { return common.StateControllerInfo(st) }, 35 st.WatchAPIHostPortsForClients, 36 ) 37 } 38 39 // NewCrossControllerAPI returns a new server-side CrossControllerAPI facade. 40 func NewCrossControllerAPI( 41 resources facade.Resources, 42 localControllerInfo localControllerInfoFunc, 43 watchLocalControllerInfo watchLocalControllerInfoFunc, 44 ) (*CrossControllerAPI, error) { 45 return &CrossControllerAPI{ 46 resources: resources, 47 localControllerInfo: localControllerInfo, 48 watchLocalControllerInfo: watchLocalControllerInfo, 49 }, nil 50 } 51 52 // WatchControllerInfo creates a watcher that notifies when the API info 53 // for the controller changes. 54 func (api *CrossControllerAPI) WatchControllerInfo() (params.NotifyWatchResults, error) { 55 results := params.NotifyWatchResults{ 56 Results: make([]params.NotifyWatchResult, 1), 57 } 58 w := api.watchLocalControllerInfo() 59 if _, ok := <-w.Changes(); !ok { 60 results.Results[0].Error = common.ServerError(watcher.EnsureErr(w)) 61 return results, nil 62 } 63 results.Results[0].NotifyWatcherId = api.resources.Register(w) 64 return results, nil 65 } 66 67 // ControllerInfo returns the API info for the controller. 68 func (api *CrossControllerAPI) ControllerInfo() (params.ControllerAPIInfoResults, error) { 69 results := params.ControllerAPIInfoResults{ 70 Results: make([]params.ControllerAPIInfoResult, 1), 71 } 72 addrs, caCert, err := api.localControllerInfo() 73 if err != nil { 74 results.Results[0].Error = common.ServerError(err) 75 return results, nil 76 } 77 results.Results[0].Addresses = addrs 78 results.Results[0].CACert = caCert 79 return results, nil 80 }