forked from juju/juju
/
controller.go
88 lines (72 loc) · 1.78 KB
/
controller.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
// Copyright 2020 Canonical Ltd.
// Licensed under the AGPLv3, see LICENCE file for details.
package caasadmission
import (
"fmt"
"net/http"
"net/url"
"github.com/juju/errors"
"github.com/juju/worker/v3/catacomb"
)
type Mux interface {
AddHandler(string, string, http.Handler) error
RemoveHandler(string, string)
}
// Kubernetes controller responsible
type Controller struct {
catacomb catacomb.Catacomb
logger Logger
}
func AdmissionPathForModel(modelUUID string) string {
return fmt.Sprintf("/k8s/admission/%s", url.PathEscape(modelUUID))
}
func NewController(
logger Logger,
mux Mux,
path string,
legacyLabels bool,
admissionCreator AdmissionCreator,
rbacMapper RBACMapper) (*Controller, error) {
c := &Controller{
logger: logger,
}
if err := catacomb.Invoke(catacomb.Plan{
Site: &c.catacomb,
Work: c.makeLoop(admissionCreator,
admissionHandler(logger, rbacMapper, legacyLabels),
logger, mux, path),
}); err != nil {
return c, errors.Trace(err)
}
return c, nil
}
func (c *Controller) Kill() {
c.catacomb.Kill(nil)
}
func (c *Controller) makeLoop(
admissionCreator AdmissionCreator,
handler http.Handler,
logger Logger,
mux Mux,
path string) func() error {
return func() error {
logger.Debugf("installing caas admission handler at %s", path)
if err := mux.AddHandler(http.MethodPost, path, handler); err != nil {
return errors.Trace(err)
}
defer mux.RemoveHandler(http.MethodPost, path)
logger.Infof("ensuring model k8s webhook configurations")
admissionCleanup, err := admissionCreator.EnsureMutatingWebhookConfiguration()
if err != nil {
return errors.Trace(err)
}
defer admissionCleanup()
select {
case <-c.catacomb.Dying():
return c.catacomb.ErrDying()
}
}
}
func (c *Controller) Wait() error {
return c.catacomb.Wait()
}