github.com/juju/juju@v0.0.0-20240327075706-a90865de2538/api/controller/externalcontrollerupdater/externalcontrollerupdater.go (about) 1 // Copyright 2017 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package externalcontrollerupdater 5 6 import ( 7 "github.com/juju/errors" 8 "github.com/juju/names/v5" 9 10 "github.com/juju/juju/api/base" 11 apiwatcher "github.com/juju/juju/api/watcher" 12 apiservererrors "github.com/juju/juju/apiserver/errors" 13 "github.com/juju/juju/core/crossmodel" 14 "github.com/juju/juju/core/watcher" 15 "github.com/juju/juju/rpc/params" 16 ) 17 18 const Facade = "ExternalControllerUpdater" 19 20 // Client provides access to the ExternalControllerUpdater API facade. 21 type Client struct { 22 facade base.FacadeCaller 23 } 24 25 // New creates a new client-side ExternalControllerUpdater facade. 26 func New(caller base.APICaller) *Client { 27 return &Client{base.NewFacadeCaller(caller, Facade)} 28 } 29 30 // WatchExternalControllers watches for the addition and removal of external 31 // controllers. 32 func (c *Client) WatchExternalControllers() (watcher.StringsWatcher, error) { 33 var results params.StringsWatchResults 34 err := c.facade.FacadeCall("WatchExternalControllers", nil, &results) 35 if err != nil { 36 return nil, err 37 } 38 if n := len(results.Results); n != 1 { 39 return nil, errors.Errorf("expected 1 result, got %d", n) 40 } 41 result := results.Results[0] 42 if result.Error != nil { 43 err := apiservererrors.RestoreError(result.Error) 44 return nil, errors.Trace(err) 45 } 46 w := apiwatcher.NewStringsWatcher(c.facade.RawAPICaller(), result) 47 return w, nil 48 } 49 50 // ExternalControllerInfo returns the info for the external controller with the specified UUID. 51 func (c *Client) ExternalControllerInfo(controllerUUID string) (*crossmodel.ControllerInfo, error) { 52 if !names.IsValidController(controllerUUID) { 53 return nil, errors.NotValidf("controller UUID %q", controllerUUID) 54 } 55 controllerTag := names.NewControllerTag(controllerUUID) 56 args := params.Entities{[]params.Entity{{ 57 Tag: controllerTag.String(), 58 }}} 59 var results params.ExternalControllerInfoResults 60 err := c.facade.FacadeCall("ExternalControllerInfo", args, &results) 61 if err != nil { 62 return nil, errors.Trace(err) 63 } 64 if len(results.Results) != 1 { 65 return nil, errors.Errorf("expected 1 result, got %d", len(results.Results)) 66 } 67 result := results.Results[0] 68 if result.Error != nil { 69 err := apiservererrors.RestoreError(result.Error) 70 return nil, errors.Trace(err) 71 } 72 return &crossmodel.ControllerInfo{ 73 ControllerTag: controllerTag, 74 Alias: result.Result.Alias, 75 Addrs: result.Result.Addrs, 76 CACert: result.Result.CACert, 77 }, nil 78 } 79 80 // SetExternalControllerInfo saves the given controller info. 81 func (c *Client) SetExternalControllerInfo(info crossmodel.ControllerInfo) error { 82 var results params.ErrorResults 83 args := params.SetExternalControllersInfoParams{ 84 Controllers: []params.SetExternalControllerInfoParams{{ 85 Info: params.ExternalControllerInfo{ 86 ControllerTag: info.ControllerTag.String(), 87 Alias: info.Alias, 88 Addrs: info.Addrs, 89 CACert: info.CACert, 90 }, 91 }}, 92 } 93 err := c.facade.FacadeCall("SetExternalControllerInfo", args, &results) 94 if err != nil { 95 return errors.Trace(err) 96 } 97 return results.OneError() 98 }