/
controller.go
83 lines (73 loc) · 2.5 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
package deployment
import (
"time"
"github.com/go-logr/logr"
"k8s.io/client-go/tools/record"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/builder"
"sigs.k8s.io/controller-runtime/pkg/predicate"
v2 "github.com/metal-stack/firewall-controller-manager/api/v2"
"github.com/metal-stack/firewall-controller-manager/api/v2/config"
"github.com/metal-stack/firewall-controller-manager/api/v2/defaults"
"github.com/metal-stack/firewall-controller-manager/api/v2/validation"
"github.com/metal-stack/firewall-controller-manager/controllers"
)
type controller struct {
c *config.ControllerConfig
log logr.Logger
lastSetCreation map[string]time.Time
recorder record.EventRecorder
}
func SetupWithManager(log logr.Logger, recorder record.EventRecorder, mgr ctrl.Manager, c *config.ControllerConfig) error {
g := controllers.NewGenericController(log, c.GetSeedClient(), c.GetSeedNamespace(), &controller{
c: c,
log: log,
recorder: recorder,
lastSetCreation: map[string]time.Time{},
})
return ctrl.NewControllerManagedBy(mgr).
For(
&v2.FirewallDeployment{},
builder.WithPredicates(
predicate.And(
predicate.Not(v2.AnnotationRemovedPredicate(v2.MaintenanceAnnotation)),
predicate.Or(
predicate.GenerationChangedPredicate{}, // prevents reconcile on status sub resource update
predicate.AnnotationChangedPredicate{},
predicate.LabelChangedPredicate{},
),
),
),
).
Named("FirewallDeployment").
Owns(
&v2.FirewallSet{},
builder.WithPredicates(
predicate.Not(
predicate.Or(
v2.AnnotationAddedPredicate(v2.ReconcileAnnotation),
v2.AnnotationRemovedPredicate(v2.ReconcileAnnotation),
),
),
),
).
WithEventFilter(predicate.NewPredicateFuncs(controllers.SkipOtherNamespace(c.GetSeedNamespace()))).
Complete(g)
}
func SetupWebhookWithManager(log logr.Logger, mgr ctrl.Manager, c *config.ControllerConfig) error {
defaulter, err := defaults.NewFirewallDeploymentDefaulter(log, c)
if err != nil {
return err
}
return ctrl.NewWebhookManagedBy(mgr).
For(&v2.FirewallDeployment{}).
WithDefaulter(defaulter).
WithValidator(validation.NewFirewallDeploymentValidator(log.WithName("validating-webhook"))).
Complete()
}
func (c *controller) New() *v2.FirewallDeployment {
return &v2.FirewallDeployment{}
}
func (c *controller) SetStatus(reconciled *v2.FirewallDeployment, refetched *v2.FirewallDeployment) {
refetched.Status = reconciled.Status
}