github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/api/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/errors" 8 "github.com/juju/loggo" 9 10 "github.com/juju/juju/api/base" 11 apiwatcher "github.com/juju/juju/api/watcher" 12 "github.com/juju/juju/apiserver/params" 13 "github.com/juju/juju/core/watcher" 14 ) 15 16 var logger = loggo.GetLogger("juju.api.crosscontroller") 17 18 // Client provides access to the CrossController API facade. 19 type Client struct { 20 base.ClientFacade 21 facade base.FacadeCaller 22 } 23 24 // NewClient creates a new client-side CrossModelRelations facade. 25 func NewClient(caller base.APICallCloser) *Client { 26 frontend, backend := base.NewClientFacade(caller, "CrossController") 27 return &Client{ 28 ClientFacade: frontend, 29 facade: backend, 30 } 31 } 32 33 // ControllerInfo contains the information about the controller that will be 34 // returned by the ControllerInfo method. 35 type ControllerInfo struct { 36 Addrs []string 37 CACert string 38 } 39 40 // ControllerInfo returns the remote controller's API information. 41 func (c *Client) ControllerInfo() (*ControllerInfo, error) { 42 var results params.ControllerAPIInfoResults 43 if err := c.facade.FacadeCall("ControllerInfo", nil, &results); err != nil { 44 return nil, errors.Trace(err) 45 } 46 if len(results.Results) != 1 { 47 return nil, errors.Errorf("expected 1 result, got %d", len(results.Results)) 48 } 49 if err := results.Results[0].Error; err != nil { 50 return nil, errors.Trace(err) 51 } 52 info := results.Results[0] 53 return &ControllerInfo{ 54 Addrs: info.Addresses, 55 CACert: info.CACert, 56 }, nil 57 } 58 59 // WatchControllerInfo returns a watcher that is notified when the remote 60 // controller's API information changes. 61 func (c *Client) WatchControllerInfo() (watcher.NotifyWatcher, error) { 62 var results params.NotifyWatchResults 63 if err := c.facade.FacadeCall("WatchControllerInfo", nil, &results); err != nil { 64 return nil, errors.Trace(err) 65 } 66 if len(results.Results) != 1 { 67 return nil, errors.Errorf("expected 1 result, got %d", len(results.Results)) 68 } 69 if err := results.Results[0].Error; err != nil { 70 return nil, errors.Trace(err) 71 } 72 w := apiwatcher.NewNotifyWatcher(c.facade.RawAPICaller(), results.Results[0]) 73 return w, nil 74 }