7
7
"fmt"
8
8
"time"
9
9
10
- snapshotsv1 "github.com/kubernetes-csi/external-snapshotter/client/v8/clientset/versioned"
11
10
"github.com/loft-sh/vcluster/pkg/config"
12
11
"github.com/loft-sh/vcluster/pkg/constants"
13
12
snapshotMeta "github.com/loft-sh/vcluster/pkg/snapshot/meta"
@@ -19,14 +18,11 @@ import (
19
18
kerrors "k8s.io/apimachinery/pkg/api/errors"
20
19
"k8s.io/apimachinery/pkg/labels"
21
20
"k8s.io/apimachinery/pkg/types"
22
- "k8s.io/client-go/kubernetes"
23
- "k8s.io/client-go/rest"
24
21
"k8s.io/client-go/tools/record"
25
22
ctrl "sigs.k8s.io/controller-runtime"
26
23
"sigs.k8s.io/controller-runtime/pkg/builder"
27
24
"sigs.k8s.io/controller-runtime/pkg/client"
28
25
"sigs.k8s.io/controller-runtime/pkg/controller"
29
- "sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
30
26
"sigs.k8s.io/controller-runtime/pkg/predicate"
31
27
)
32
28
@@ -36,6 +32,7 @@ const (
36
32
)
37
33
38
34
type Reconciler struct {
35
+ reconcilerBase
39
36
vConfig * config.VirtualClusterConfig
40
37
snapshotRequestsKubeClient client.Client
41
38
snapshotRequestsManager ctrl.Manager
@@ -85,7 +82,19 @@ func NewController(registerContext *synccontext.RegisterContext) (*Reconciler, e
85
82
return nil , fmt .Errorf ("failed to create volume snapshotter: %w" , err )
86
83
}
87
84
85
+ reconciler := reconcilerBase {
86
+ vConfig : registerContext .Config ,
87
+ requestsKubeClient : snapshotRequestsManager .GetClient (),
88
+ requestsManager : snapshotRequestsManager ,
89
+ logger : logger ,
90
+ eventRecorder : snapshotRequestsManager .GetEventRecorderFor (controllerName ),
91
+ isHostMode : isHostMode ,
92
+ kind : snapshotReconciler ,
93
+ finalizer : ControllerFinalizer ,
94
+ requestKey : RequestKey ,
95
+ }
88
96
return & Reconciler {
97
+ reconcilerBase : reconciler ,
89
98
vConfig : registerContext .Config ,
90
99
snapshotRequestsKubeClient : snapshotRequestsManager .GetClient (),
91
100
snapshotRequestsManager : snapshotRequestsManager ,
@@ -96,24 +105,6 @@ func NewController(registerContext *synccontext.RegisterContext) (*Reconciler, e
96
105
}, nil
97
106
}
98
107
99
- func createClients (restConfig * rest.Config ) (* kubernetes.Clientset , * snapshotsv1.Clientset , error ) {
100
- if restConfig == nil {
101
- return nil , nil , errors .New ("rest config is nil" )
102
- }
103
-
104
- kubeClient , err := kubernetes .NewForConfig (restConfig )
105
- if err != nil {
106
- return nil , nil , fmt .Errorf ("could not create kube client: %w" , err )
107
- }
108
-
109
- snapshotClient , err := snapshotsv1 .NewForConfig (restConfig )
110
- if err != nil {
111
- return nil , nil , fmt .Errorf ("could not create snapshot client: %w" , err )
112
- }
113
-
114
- return kubeClient , snapshotClient , nil
115
- }
116
-
117
108
func (c * Reconciler ) Reconcile (ctx context.Context , req ctrl.Request ) (result ctrl.Result , retErr error ) {
118
109
c .logger .Infof ("Reconciling snapshot request ConfigMap %s" , req .NamespacedName )
119
110
@@ -242,15 +233,15 @@ func (c *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (result ct
242
233
return ctrl.Result {}, fmt .Errorf ("failed to reconcile failed snapshot request %s/%s: %w" , configMap .Namespace , configMap .Name , err )
243
234
}
244
235
default :
245
- return ctrl.Result {}, fmt .Errorf ("unknown snapshot request phase %s" , snapshotRequest .Status .Phase )
236
+ return ctrl.Result {}, fmt .Errorf ("invalid snapshot request phase %s" , snapshotRequest .Status .Phase )
246
237
}
247
238
248
239
return ctrl.Result {}, nil
249
240
}
250
241
251
242
func (c * Reconciler ) Register () error {
252
243
isVolumeSnapshotsConfig := predicate .NewPredicateFuncs (func (obj client.Object ) bool {
253
- if obj .GetNamespace () != c .getSnapshotRequestNamespace () {
244
+ if obj .GetNamespace () != c .getRequestNamespace () {
254
245
return false
255
246
}
256
247
@@ -337,166 +328,6 @@ func (c *Reconciler) reconcileCreatingEtcdBackup(ctx context.Context, configMap
337
328
return false , nil
338
329
}
339
330
340
- // reconcileCompletedRequest cleans up the completed snapshot request resources.
341
- func (c * Reconciler ) reconcileCompletedRequest (ctx context.Context , configMap * corev1.ConfigMap ) error {
342
- c .logger .Infof ("Snapshot request from ConfigMap %s/%s has been completed" , configMap .Namespace , configMap .Name )
343
- err := c .reconcileDoneRequest (ctx , configMap )
344
- if err != nil {
345
- return fmt .Errorf ("failed to delete snapshot request Secret %s/%s: %w" , configMap .Namespace , configMap .Name , err )
346
- }
347
- return nil
348
- }
349
-
350
- // reconcileFailedRequest cleans up the failed snapshot request resources.
351
- func (c * Reconciler ) reconcileFailedRequest (ctx context.Context , configMap * corev1.ConfigMap ) error {
352
- c .logger .Errorf ("Snapshot request from ConfigMap %s/%s has failed" , configMap .Namespace , configMap .Name )
353
- err := c .reconcileDoneRequest (ctx , configMap )
354
- if err != nil {
355
- return fmt .Errorf ("failed to delete snapshot request Secret %s/%s: %w" , configMap .Namespace , configMap .Name , err )
356
- }
357
- return nil
358
- }
359
-
360
- // reconcileDeletedRequest deletes the snapshot request Secret and removes the finalizer from the
361
- // snapshot request ConfigMap.
362
- func (c * Reconciler ) reconcileDeletedRequest (ctx context.Context , configMap * corev1.ConfigMap ) (retErr error ) {
363
- // snapshot request ConfigMap deleted, so delete Secret as well
364
- c .logger .Infof ("Snapshot request ConfigMap %s/%s deleted" , configMap .Namespace , configMap .Name )
365
-
366
- err := c .reconcileDoneRequest (ctx , configMap )
367
- if err != nil {
368
- return fmt .Errorf ("failed to delete snapshot request Secret %s/%s: %w" , configMap .Namespace , configMap .Name , err )
369
- }
370
- return nil
371
- }
372
-
373
- // reconcileDoneRequest deletes the snapshot request Secret and removes the finalizer from the
374
- // snapshot request ConfigMap.
375
- func (c * Reconciler ) reconcileDoneRequest (ctx context.Context , configMap * corev1.ConfigMap ) (retErr error ) {
376
- defer func () {
377
- if retErr != nil {
378
- // an error occurred, don't remove the finalizer
379
- return
380
- }
381
- err := c .removeFinalizer (ctx , configMap )
382
- if err != nil {
383
- retErr = fmt .Errorf ("failed to remove vCluster snapshot controller finalizer from the snapshot request ConfigMap %s/%s: %w" , configMap .Namespace , configMap .Name , err )
384
- }
385
- }()
386
-
387
- err := c .deleteSnapshotRequestSecret (ctx , configMap )
388
- if err != nil {
389
- return fmt .Errorf ("failed to delete snapshot request Secret %s/%s: %w" , configMap .Namespace , configMap .Name , err )
390
- }
391
- return nil
392
- }
393
-
394
- func (c * Reconciler ) addFinalizer (ctx context.Context , configMap * corev1.ConfigMap ) (bool , error ) {
395
- if controllerutil .ContainsFinalizer (configMap , ControllerFinalizer ) {
396
- return false , nil
397
- }
398
-
399
- c .logger .Infof (
400
- "Adding vCluster snapshot controller finalizer %s to the snapshot request ConfigMap %s/%s" ,
401
- ControllerFinalizer ,
402
- configMap .Namespace ,
403
- configMap .Name )
404
-
405
- // before the change
406
- oldConfigMap := client .MergeFrom (configMap .DeepCopy ())
407
-
408
- // add the snapshot controller finalizer to the snapshot request ConfigMap
409
- controllerutil .AddFinalizer (configMap , ControllerFinalizer )
410
-
411
- // patch the object
412
- err := c .client ().Patch (ctx , configMap , oldConfigMap )
413
- if err != nil {
414
- return false , fmt .Errorf ("failed to patch snapshot request ConfigMap %s/%s finalizers: %w" , configMap .Namespace , configMap .Name , err )
415
- }
416
-
417
- c .logger .Infof (
418
- "Added vCluster snapshot controller finalizer %s to the snapshot request ConfigMap %s/%s" ,
419
- ControllerFinalizer ,
420
- configMap .Namespace ,
421
- configMap .Name )
422
- return true , nil
423
- }
424
-
425
- func (c * Reconciler ) removeFinalizer (ctx context.Context , configMap * corev1.ConfigMap ) error {
426
- if ! controllerutil .ContainsFinalizer (configMap , ControllerFinalizer ) {
427
- return nil
428
- }
429
-
430
- c .logger .Infof (
431
- "Removing vCluster snapshot controller finalizer %s from the snapshot request ConfigMap %s/%s" ,
432
- ControllerFinalizer ,
433
- configMap .Namespace ,
434
- configMap .Name )
435
-
436
- // before the change
437
- oldConfigMap := client .MergeFrom (configMap .DeepCopy ())
438
-
439
- // add the snapshot controller finalizer to the snapshot request ConfigMap
440
- controllerutil .RemoveFinalizer (configMap , ControllerFinalizer )
441
-
442
- // patch the object
443
- err := c .client ().Patch (ctx , configMap , oldConfigMap )
444
- if err != nil {
445
- return fmt .Errorf ("failed to patch snapshot request ConfigMap %s/%s finalizers: %w" , configMap .Namespace , configMap .Name , err )
446
- }
447
-
448
- c .logger .Infof (
449
- "Removed vCluster snapshot controller finalizer %s from the snapshot request ConfigMap %s/%s" ,
450
- ControllerFinalizer ,
451
- configMap .Namespace ,
452
- configMap .Name )
453
- return nil
454
- }
455
-
456
- func (c * Reconciler ) deleteSnapshotRequestSecret (ctx context.Context , configMap * corev1.ConfigMap ) error {
457
- namespace := configMap .Namespace
458
- name := configMap .Name
459
- c .logger .Debugf ("Deleting snapshot request Secret %s/%s" , namespace , name )
460
-
461
- // find snapshot request secret
462
- var secret corev1.Secret
463
- secretObjectKey := client.ObjectKey {
464
- Namespace : namespace ,
465
- Name : name ,
466
- }
467
- err := c .client ().Get (ctx , secretObjectKey , & secret )
468
- if kerrors .IsNotFound (err ) {
469
- c .logger .Debugf ("Snapshot request Secret %s/%s aleady deleted" , namespace , name )
470
- return nil
471
- } else if err != nil {
472
- return fmt .Errorf ("failed to get snapshot request Secret %s/%s: %w" , namespace , name , err )
473
- }
474
-
475
- // delete snapshot request secret
476
- err = c .client ().Delete (ctx , & secret )
477
- if kerrors .IsNotFound (err ) {
478
- c .logger .Debugf ("Snapshot request Secret %s/%s aleady deleted" , namespace , name )
479
- return nil
480
- } else if err != nil {
481
- return fmt .Errorf ("failed to delete snapshot request Secret %s/%s: %w" , namespace , name , err )
482
- }
483
-
484
- c .logger .Debugf ("Deleted snapshot request Secret %s/%s" , namespace , name )
485
- c .eventRecorder .Eventf (configMap , corev1 .EventTypeNormal , "SnapshotRequestCleanup" , "Snapshot request Secret %s/%s has been deleted" , configMap .Namespace , configMap .Name )
486
- return nil
487
- }
488
-
489
- func (c * Reconciler ) client () client.Client {
490
- return c .snapshotRequestsKubeClient
491
- }
492
-
493
- func (c * Reconciler ) getSnapshotRequestNamespace () string {
494
- if c .isHostMode {
495
- return c .vConfig .HostNamespace
496
- }
497
- return "kube-system"
498
- }
499
-
500
331
func (c * Reconciler ) updateRequest (ctx context.Context , previousConfigMapState client.Patch , configMap * corev1.ConfigMap , snapshotRequest Request ) error {
501
332
snapshotRequestJSON , err := json .Marshal (snapshotRequest )
502
333
if err != nil {
@@ -517,7 +348,7 @@ func (c *Reconciler) getOngoingSnapshotRequestsResourceNames(ctx context.Context
517
348
// list options with label selector
518
349
var configMaps corev1.ConfigMapList
519
350
listOptions := & client.ListOptions {
520
- Namespace : c .getSnapshotRequestNamespace (),
351
+ Namespace : c .getRequestNamespace (),
521
352
LabelSelector : labels .SelectorFromSet (map [string ]string {
522
353
snapshotMeta .RequestLabel : "" ,
523
354
}),
0 commit comments