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