generated from SAP/repository-template
/
main.go
130 lines (111 loc) · 3.68 KB
/
main.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
/*
SPDX-FileCopyrightText: 2023 SAP SE or an SAP affiliate company and cap-operator contributors
SPDX-License-Identifier: Apache-2.0
*/
package main
import (
"context"
"os"
"os/signal"
"syscall"
"time"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/leaderelection"
"k8s.io/client-go/tools/leaderelection/resourcelock"
"k8s.io/klog/v2"
certManager "github.com/cert-manager/cert-manager/pkg/client/clientset/versioned"
gardenerCert "github.com/gardener/cert-management/pkg/client/cert/clientset/versioned"
dns "github.com/gardener/external-dns-management/pkg/client/dns/clientset/versioned"
"github.com/google/uuid"
"github.com/sap/cap-operator/internal/controller"
"github.com/sap/cap-operator/internal/util"
"github.com/sap/cap-operator/pkg/client/clientset/versioned"
istio "istio.io/client-go/pkg/clientset/versioned"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
const (
LeaseLockName = "capoperator-lease-lock"
)
func main() {
config := util.GetConfig()
if config == nil {
klog.Fatal("Config not found")
}
leaseLockNamespace := util.GetNamespace()
leaseLockId := uuid.New().String()
coreClient, err := kubernetes.NewForConfig(config)
if err != nil {
klog.Fatal("Could not create kubernetes core client: ", err.Error())
}
crdClient, err := versioned.NewForConfig(config)
if err != nil {
klog.Fatal("could not create client for custom resources: ", err.Error())
}
istioClient, err := istio.NewForConfig(config)
if err != nil {
klog.Fatal("could not create client for istio resources: ", err.Error())
}
certClient, err := gardenerCert.NewForConfig(config)
if err != nil {
klog.Fatal("could not create client for certificate resources: ", err.Error())
}
certManagerClient, err := certManager.NewForConfig(config)
if err != nil {
klog.Fatal("could not create client for certManager certificate resources: ", err.Error())
}
dnsClient, err := dns.NewForConfig(config)
if err != nil {
klog.Fatal("could not create client for dns resources: ", err.Error())
}
// context for the reconciliation controller
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// Handle sys exits to ensure cleanup of controller code before stopping leading
leaseCh := make(chan os.Signal, 1)
signal.Notify(leaseCh, os.Interrupt, syscall.SIGTERM)
go func() {
<-leaseCh
klog.Info("Interrupt received, shutting down operator context")
cancel()
}()
// Create a LeaseLock resource
leaseLock := &resourcelock.LeaseLock{
LeaseMeta: metav1.ObjectMeta{
Name: LeaseLockName,
Namespace: leaseLockNamespace,
},
Client: coreClient.CoordinationV1(),
LockConfig: resourcelock.ResourceLockConfig{
Identity: leaseLockId,
},
}
// Run leader election
leaderelection.RunOrDie(ctx, leaderelection.LeaderElectionConfig{
Lock: leaseLock,
LeaseDuration: 15 * time.Second,
RenewDeadline: 10 * time.Second,
RetryPeriod: 5 * time.Second,
ReleaseOnCancel: true,
Callbacks: leaderelection.LeaderCallbacks{
OnStartedLeading: func(ctx context.Context) {
klog.Infof("Started leading: %s - %s", LeaseLockName, leaseLockId)
checkDone := make(chan bool, 1)
go checkHashedLabels(checkDone, coreClient, crdClient, istioClient, certClient, certManagerClient, dnsClient)
<-checkDone
klog.Info("check & update of hashed labels done")
c := controller.NewController(coreClient, crdClient, istioClient, certClient, certManagerClient, dnsClient)
go c.Start(ctx)
},
OnStoppedLeading: func() {
klog.Infof("Stopped leading: %s - %s", LeaseLockName, leaseLockId)
os.Exit(0)
},
OnNewLeader: func(id string) {
if id == leaseLockId {
return
}
klog.Infof("Leader exists: %s", id)
},
},
})
}