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