@@ -6,11 +6,13 @@ package main
6
6
7
7
import (
8
8
"bytes"
9
+ "context"
9
10
"encoding/json"
10
11
"flag"
11
12
"fmt"
12
13
"net"
13
14
"os"
15
+ "sync/atomic"
14
16
"time"
15
17
16
18
// Import all Kubernetes client auth plugins (e.g. Azure, GCP, OIDC, etc.)
59
61
60
62
scheme = runtime .NewScheme ()
61
63
setupLog = ctrl .Log .WithName ("setup" )
64
+
65
+ LeaderInstance atomic.Bool
62
66
)
63
67
64
68
func init () {
@@ -138,6 +142,11 @@ func main() {
138
142
139
143
mgrCtx := ctrl .SetupSignalHandler ()
140
144
145
+ go func () {
146
+ <- mgr .Elected ()
147
+ LeaderInstance .Store (true )
148
+ }()
149
+
141
150
maintenanceReconciler , err := controllers .NewMaintenanceReconciler (mgr .GetClient ())
142
151
if err != nil {
143
152
setupLog .Error (err , "unable to create maintenance controller" , "controller" , "Maintenance" )
@@ -177,6 +186,7 @@ func main() {
177
186
}
178
187
179
188
workspaceReconciler .OnReconcile = wsmanService .OnWorkspaceReconcile
189
+
180
190
if err = workspaceReconciler .SetupWithManager (mgr ); err != nil {
181
191
setupLog .Error (err , "unable to setup workspace controller with manager" , "controller" , "Workspace" )
182
192
os .Exit (1 )
@@ -228,8 +238,27 @@ func setupGRPCService(cfg *config.ServiceConfiguration, k8s client.Client, maint
228
238
metrics .Registry .MustRegister (grpcMetrics )
229
239
230
240
grpcOpts := common_grpc .ServerOptionsWithInterceptors (
231
- []grpc.StreamServerInterceptor {grpcMetrics .StreamServerInterceptor ()},
232
- []grpc.UnaryServerInterceptor {grpcMetrics .UnaryServerInterceptor (), ratelimits .UnaryInterceptor ()},
241
+ []grpc.StreamServerInterceptor {
242
+ grpcMetrics .StreamServerInterceptor (),
243
+ func (srv interface {}, ss grpc.ServerStream , info * grpc.StreamServerInfo , handler grpc.StreamHandler ) error {
244
+ if LeaderInstance .Load () {
245
+ return handler (srv , ss )
246
+ }
247
+
248
+ return fmt .Errorf ("Rejecting connection due leader election" )
249
+ },
250
+ },
251
+ []grpc.UnaryServerInterceptor {
252
+ grpcMetrics .UnaryServerInterceptor (),
253
+ ratelimits .UnaryInterceptor (),
254
+ func (ctx context.Context , req interface {}, info * grpc.UnaryServerInfo , handler grpc.UnaryHandler ) (resp interface {}, err error ) {
255
+ if LeaderInstance .Load () {
256
+ return handler (ctx , req )
257
+ }
258
+
259
+ return nil , fmt .Errorf ("Rejecting connection due leader election" )
260
+ },
261
+ },
233
262
)
234
263
if cfg .RPCServer .TLS .CA != "" && cfg .RPCServer .TLS .Certificate != "" && cfg .RPCServer .TLS .PrivateKey != "" {
235
264
tlsConfig , err := common_grpc .ClientAuthTLSConfig (
0 commit comments