-
Notifications
You must be signed in to change notification settings - Fork 8
/
reconcilers.go
135 lines (111 loc) · 5 KB
/
reconcilers.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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// Code generated by skv2. DO NOT EDIT.
//go:generate mockgen -source ./reconcilers.go -destination mocks/reconcilers.go
// Definitions for the Kubernetes Controllers
package controller
import (
"context"
multicluster_solo_io_v1alpha1 "github.com/solo-io/skv2/pkg/api/multicluster.solo.io/v1alpha1"
"github.com/pkg/errors"
"github.com/solo-io/skv2/pkg/ezkube"
"github.com/solo-io/skv2/pkg/reconcile"
"sigs.k8s.io/controller-runtime/pkg/manager"
"sigs.k8s.io/controller-runtime/pkg/predicate"
)
// Reconcile Upsert events for the KubernetesCluster Resource.
// implemented by the user
type KubernetesClusterReconciler interface {
ReconcileKubernetesCluster(obj *multicluster_solo_io_v1alpha1.KubernetesCluster) (reconcile.Result, error)
}
// Reconcile deletion events for the KubernetesCluster Resource.
// Deletion receives a reconcile.Request as we cannot guarantee the last state of the object
// before being deleted.
// implemented by the user
type KubernetesClusterDeletionReconciler interface {
ReconcileKubernetesClusterDeletion(req reconcile.Request) error
}
type KubernetesClusterReconcilerFuncs struct {
OnReconcileKubernetesCluster func(obj *multicluster_solo_io_v1alpha1.KubernetesCluster) (reconcile.Result, error)
OnReconcileKubernetesClusterDeletion func(req reconcile.Request) error
}
func (f *KubernetesClusterReconcilerFuncs) ReconcileKubernetesCluster(obj *multicluster_solo_io_v1alpha1.KubernetesCluster) (reconcile.Result, error) {
if f.OnReconcileKubernetesCluster == nil {
return reconcile.Result{}, nil
}
return f.OnReconcileKubernetesCluster(obj)
}
func (f *KubernetesClusterReconcilerFuncs) ReconcileKubernetesClusterDeletion(req reconcile.Request) error {
if f.OnReconcileKubernetesClusterDeletion == nil {
return nil
}
return f.OnReconcileKubernetesClusterDeletion(req)
}
// Reconcile and finalize the KubernetesCluster Resource
// implemented by the user
type KubernetesClusterFinalizer interface {
KubernetesClusterReconciler
// name of the finalizer used by this handler.
// finalizer names should be unique for a single task
KubernetesClusterFinalizerName() string
// finalize the object before it is deleted.
// Watchers created with a finalizing handler will a
FinalizeKubernetesCluster(obj *multicluster_solo_io_v1alpha1.KubernetesCluster) error
}
type KubernetesClusterReconcileLoop interface {
RunKubernetesClusterReconciler(ctx context.Context, rec KubernetesClusterReconciler, predicates ...predicate.Predicate) error
}
type kubernetesClusterReconcileLoop struct {
loop reconcile.Loop
}
func NewKubernetesClusterReconcileLoop(name string, mgr manager.Manager, options reconcile.Options) KubernetesClusterReconcileLoop {
return &kubernetesClusterReconcileLoop{
// empty cluster indicates this reconciler is built for the local cluster
loop: reconcile.NewLoop(name, "", mgr, &multicluster_solo_io_v1alpha1.KubernetesCluster{}, options),
}
}
func (c *kubernetesClusterReconcileLoop) RunKubernetesClusterReconciler(ctx context.Context, reconciler KubernetesClusterReconciler, predicates ...predicate.Predicate) error {
genericReconciler := genericKubernetesClusterReconciler{
reconciler: reconciler,
}
var reconcilerWrapper reconcile.Reconciler
if finalizingReconciler, ok := reconciler.(KubernetesClusterFinalizer); ok {
reconcilerWrapper = genericKubernetesClusterFinalizer{
genericKubernetesClusterReconciler: genericReconciler,
finalizingReconciler: finalizingReconciler,
}
} else {
reconcilerWrapper = genericReconciler
}
return c.loop.RunReconciler(ctx, reconcilerWrapper, predicates...)
}
// genericKubernetesClusterHandler implements a generic reconcile.Reconciler
type genericKubernetesClusterReconciler struct {
reconciler KubernetesClusterReconciler
}
func (r genericKubernetesClusterReconciler) Reconcile(object ezkube.Object) (reconcile.Result, error) {
obj, ok := object.(*multicluster_solo_io_v1alpha1.KubernetesCluster)
if !ok {
return reconcile.Result{}, errors.Errorf("internal error: KubernetesCluster handler received event for %T", object)
}
return r.reconciler.ReconcileKubernetesCluster(obj)
}
func (r genericKubernetesClusterReconciler) ReconcileDeletion(request reconcile.Request) error {
if deletionReconciler, ok := r.reconciler.(KubernetesClusterDeletionReconciler); ok {
return deletionReconciler.ReconcileKubernetesClusterDeletion(request)
}
return nil
}
// genericKubernetesClusterFinalizer implements a generic reconcile.FinalizingReconciler
type genericKubernetesClusterFinalizer struct {
genericKubernetesClusterReconciler
finalizingReconciler KubernetesClusterFinalizer
}
func (r genericKubernetesClusterFinalizer) FinalizerName() string {
return r.finalizingReconciler.KubernetesClusterFinalizerName()
}
func (r genericKubernetesClusterFinalizer) Finalize(object ezkube.Object) error {
obj, ok := object.(*multicluster_solo_io_v1alpha1.KubernetesCluster)
if !ok {
return errors.Errorf("internal error: KubernetesCluster handler received event for %T", object)
}
return r.finalizingReconciler.FinalizeKubernetesCluster(obj)
}