-
Notifications
You must be signed in to change notification settings - Fork 22
/
controller.go
107 lines (91 loc) · 3.56 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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
// SPDX-FileCopyrightText: 2024 SAP SE or an SAP affiliate company and Gardener contributors
//
// SPDX-License-Identifier: Apache-2.0
package crdwatch
import (
"os"
"time"
ctrl "github.com/gardener/cert-management/pkg/controller"
"github.com/gardener/controller-manager-library/pkg/controllermanager/controller"
"github.com/gardener/controller-manager-library/pkg/controllermanager/controller/reconcile"
"github.com/gardener/controller-manager-library/pkg/logger"
"github.com/gardener/controller-manager-library/pkg/resources"
apiextensionsv1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
"k8s.io/apimachinery/pkg/labels"
)
// Controller is the controller name.
const Controller = "watch-gateways-crds"
func init() {
controller.Configure(Controller).
Reconciler(Create).
Cluster(ctrl.SourceCluster).
DefaultWorkerPool(1, 0*time.Second).
MainResource(apiextensionsv1.GroupName, "CustomResourceDefinition").
MustRegister(ctrl.ControllerGroupSource)
}
type reconciler struct {
reconcile.DefaultReconciler
controller controller.Interface
relevantCustomResourceDefinitionDeployed map[string]bool
}
var _ reconcile.Interface = &reconciler{}
///////////////////////////////////////////////////////////////////////////////
// Create creates the controller to watch for gateway CRDs.
func Create(controller controller.Interface) (reconcile.Interface, error) {
return &reconciler{
controller: controller,
relevantCustomResourceDefinitionDeployed: map[string]bool{
"gateways.networking.istio.io": false,
"virtualservices.networking.istio.io": false,
"gateways.gateway.networking.k8s.io": false,
"httproutes.gateway.networking.k8s.io": false,
},
}, nil
}
func (r *reconciler) Setup() error {
r.controller.Infof("### setup crds watch resources")
res, err := r.controller.GetMainCluster().Resources().GetByExample(&apiextensionsv1.CustomResourceDefinition{})
if err != nil {
return err
}
list, err := res.ListCached(labels.Everything())
if err != nil {
return err
}
for _, item := range list {
crd := item.Data().(*apiextensionsv1.CustomResourceDefinition)
switch crd.Spec.Group {
case "networking.istio.io", "gateway.networking.k8s.io":
name := crdName(crd)
if _, relevant := r.relevantCustomResourceDefinitionDeployed[name]; relevant {
r.relevantCustomResourceDefinitionDeployed[name] = true
}
}
}
return nil
}
///////////////////////////////////////////////////////////////////////////////
func (r *reconciler) Reconcile(logger logger.LogContext, obj resources.Object) reconcile.Status {
crd := obj.Data().(*apiextensionsv1.CustomResourceDefinition)
name := crdName(crd)
if alreadyDeployed, relevant := r.relevantCustomResourceDefinitionDeployed[name]; relevant && !alreadyDeployed {
logger.Infof("new relevant CRD %s deployed: need to restart to initialise controller", name)
os.Exit(2)
}
return reconcile.Succeeded(logger)
}
func (r *reconciler) Delete(logger logger.LogContext, obj resources.Object) reconcile.Status {
crd := obj.Data().(*apiextensionsv1.CustomResourceDefinition)
name := crdName(crd)
if alreadyDeployed, relevant := r.relevantCustomResourceDefinitionDeployed[name]; relevant && alreadyDeployed {
logger.Infof("new relevant CRD %s deleted: need to restart to disable controllers", name)
os.Exit(3)
}
return reconcile.Succeeded(logger)
}
func (r *reconciler) Deleted(logger logger.LogContext, _ resources.ClusterObjectKey) reconcile.Status {
return reconcile.Succeeded(logger)
}
func crdName(crd *apiextensionsv1.CustomResourceDefinition) string {
return crd.Spec.Names.Plural + "." + crd.Spec.Group
}