github.com/juju/juju@v0.0.0-20240430160146-1752b71fcf00/apiserver/facades/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/names/v5" 8 9 apiservererrors "github.com/juju/juju/apiserver/errors" 10 "github.com/juju/juju/apiserver/facade" 11 "github.com/juju/juju/core/crossmodel" 12 "github.com/juju/juju/rpc/params" 13 "github.com/juju/juju/state" 14 "github.com/juju/juju/state/watcher" 15 ) 16 17 // ExternalControllerUpdaterAPI provides access to the CrossModelRelations API facade. 18 type ExternalControllerUpdaterAPI struct { 19 externalControllers state.ExternalControllers 20 resources facade.Resources 21 } 22 23 // NewAPI creates a new server-side CrossModelRelationsAPI API facade backed 24 // by the given interfaces. 25 func NewAPI( 26 auth facade.Authorizer, 27 resources facade.Resources, 28 externalControllers state.ExternalControllers, 29 ) (*ExternalControllerUpdaterAPI, error) { 30 if !auth.AuthController() { 31 return nil, apiservererrors.ErrPerm 32 } 33 return &ExternalControllerUpdaterAPI{ 34 externalControllers, 35 resources, 36 }, nil 37 } 38 39 // WatchExternalControllers watches for the addition and removal of external 40 // controller records to the local controller's database. 41 func (api *ExternalControllerUpdaterAPI) WatchExternalControllers() (params.StringsWatchResults, error) { 42 w := api.externalControllers.Watch() 43 changes, ok := <-w.Changes() 44 if !ok { 45 return params.StringsWatchResults{ 46 []params.StringsWatchResult{{ 47 Error: apiservererrors.ServerError(watcher.EnsureErr(w)), 48 }}, 49 }, nil 50 } 51 return params.StringsWatchResults{ 52 []params.StringsWatchResult{{ 53 StringsWatcherId: api.resources.Register(w), 54 Changes: changes, 55 }}, 56 }, nil 57 } 58 59 // ExternalControllerInfo returns the info for the specified external controllers. 60 func (s *ExternalControllerUpdaterAPI) ExternalControllerInfo(args params.Entities) (params.ExternalControllerInfoResults, error) { 61 result := params.ExternalControllerInfoResults{ 62 Results: make([]params.ExternalControllerInfoResult, len(args.Entities)), 63 } 64 for i, entity := range args.Entities { 65 controllerTag, err := names.ParseControllerTag(entity.Tag) 66 if err != nil { 67 result.Results[i].Error = apiservererrors.ServerError(err) 68 continue 69 } 70 controller, err := s.externalControllers.Controller(controllerTag.Id()) 71 if err != nil { 72 result.Results[i].Error = apiservererrors.ServerError(err) 73 continue 74 } 75 info := controller.ControllerInfo() 76 result.Results[i].Result = ¶ms.ExternalControllerInfo{ 77 ControllerTag: controllerTag.String(), 78 Alias: info.Alias, 79 Addrs: info.Addrs, 80 CACert: info.CACert, 81 } 82 } 83 return result, nil 84 } 85 86 // SetExternalControllerInfo saves the info for the specified external controllers. 87 func (s *ExternalControllerUpdaterAPI) SetExternalControllerInfo(args params.SetExternalControllersInfoParams) (params.ErrorResults, error) { 88 result := params.ErrorResults{ 89 Results: make([]params.ErrorResult, len(args.Controllers)), 90 } 91 for i, arg := range args.Controllers { 92 controllerTag, err := names.ParseControllerTag(arg.Info.ControllerTag) 93 if err != nil { 94 result.Results[i].Error = apiservererrors.ServerError(err) 95 continue 96 } 97 if _, err := s.externalControllers.Save(crossmodel.ControllerInfo{ 98 ControllerTag: controllerTag, 99 Alias: arg.Info.Alias, 100 Addrs: arg.Info.Addrs, 101 CACert: arg.Info.CACert, 102 }); err != nil { 103 result.Results[i].Error = apiservererrors.ServerError(err) 104 continue 105 } 106 } 107 return result, nil 108 }