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