/
upgrader.go
60 lines (51 loc) · 1.56 KB
/
upgrader.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
// Copyright 2019 Canonical Ltd.
// Licensed under the AGPLv3, see LICENCE file for details.
package caasoperatorupgrader
import (
"github.com/juju/loggo"
"github.com/juju/names/v5"
apiservererrors "github.com/juju/juju/apiserver/errors"
"github.com/juju/juju/apiserver/facade"
"github.com/juju/juju/caas"
"github.com/juju/juju/rpc/params"
)
var logger = loggo.GetLogger("juju.controller.caasoperatorupgrader")
type API struct {
auth facade.Authorizer
broker caas.Upgrader
}
// NewCAASOperatorUpgraderAPI returns a new CAAS operator upgrader API facade.
func NewCAASOperatorUpgraderAPI(
authorizer facade.Authorizer,
broker caas.Upgrader,
) (*API, error) {
if !authorizer.AuthController() &&
!authorizer.AuthApplicationAgent() &&
!authorizer.AuthUnitAgent() && // For sidecar applications.
!authorizer.AuthModelAgent() {
return nil, apiservererrors.ErrPerm
}
return &API{
auth: authorizer,
broker: broker,
}, nil
}
// UpgradeOperator upgrades the operator for the specified agents.
func (api *API) UpgradeOperator(arg params.KubernetesUpgradeArg) (params.ErrorResult, error) {
serverErr := func(err error) params.ErrorResult {
return params.ErrorResult{Error: apiservererrors.ServerError(err)}
}
tag, err := names.ParseTag(arg.AgentTag)
if err != nil {
return serverErr(err), nil
}
if !api.auth.AuthOwner(tag) {
return serverErr(apiservererrors.ErrPerm), nil
}
logger.Debugf("upgrading caas agent for %s", tag)
err = api.broker.Upgrade(arg.AgentTag, arg.Version)
if err != nil {
return serverErr(err), nil
}
return params.ErrorResult{}, nil
}