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