@@ -36,16 +36,16 @@ import (
36
36
"k8s.io/client-go/kubernetes/scheme"
37
37
typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
38
38
"k8s.io/client-go/tools/record"
39
+ ctrl "sigs.k8s.io/controller-runtime"
39
40
"sigs.k8s.io/controller-runtime/pkg/client"
40
41
"sigs.k8s.io/controller-runtime/pkg/client/config"
41
42
"sigs.k8s.io/controller-runtime/pkg/controller"
42
43
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
43
- "sigs.k8s.io/controller-runtime/pkg/handler"
44
44
"sigs.k8s.io/controller-runtime/pkg/manager"
45
+ "sigs.k8s.io/controller-runtime/pkg/predicate"
45
46
"sigs.k8s.io/controller-runtime/pkg/reconcile"
46
- "sigs.k8s.io/controller-runtime/pkg/source"
47
47
cnsoperatorapis "sigs.k8s.io/vsphere-csi-driver/v3/pkg/apis/cnsoperator"
48
- cnsfileaccessconfigv1alpha1 "sigs.k8s.io/vsphere-csi-driver/v3/pkg/apis/cnsoperator/cnsfileaccessconfig/v1alpha1"
48
+ v1a1 "sigs.k8s.io/vsphere-csi-driver/v3/pkg/apis/cnsoperator/cnsfileaccessconfig/v1alpha1"
49
49
volumes "sigs.k8s.io/vsphere-csi-driver/v3/pkg/common/cns-lib/volume"
50
50
commonconfig "sigs.k8s.io/vsphere-csi-driver/v3/pkg/common/config"
51
51
"sigs.k8s.io/vsphere-csi-driver/v3/pkg/csi/service/common"
@@ -179,25 +179,17 @@ func add(mgr manager.Manager, r reconcile.Reconciler) error {
179
179
maxWorkerThreads := util .GetMaxWorkerThreads (ctx ,
180
180
workerThreadsEnvVar , defaultMaxWorkerThreads )
181
181
// Create a new controller.
182
- c , err := controller .New ("cnsfileaccessconfig-controller" , mgr ,
183
- controller.Options {Reconciler : r , MaxConcurrentReconciles : maxWorkerThreads })
182
+ err := ctrl .NewControllerManagedBy (mgr ).Named ("cnsfileaccessconfig-controller" ).
183
+ For (& v1a1.CnsFileAccessConfig {}).
184
+ WithEventFilter (predicate.GenerationChangedPredicate {}).
185
+ WithOptions (controller.Options {MaxConcurrentReconciles : maxWorkerThreads }).
186
+ Complete (r )
184
187
if err != nil {
185
- log .Errorf ("Failed to create new CnsFileAccessConfig controller with error : %+ v" , err )
188
+ log .Errorf ("Failed to build application controller. Err : %v" , err )
186
189
return err
187
190
}
188
191
189
192
backOffDuration = make (map [types.NamespacedName ]time.Duration )
190
-
191
- // Watch for changes to primary resource CnsFileAccessConfig.
192
- err = c .Watch (source .Kind (
193
- mgr .GetCache (),
194
- & cnsfileaccessconfigv1alpha1.CnsFileAccessConfig {},
195
- & handler.TypedEnqueueRequestForObject [* cnsfileaccessconfigv1alpha1.CnsFileAccessConfig ]{},
196
- ))
197
- if err != nil {
198
- log .Errorf ("Failed to watch for changes to CnsFileAccessConfig resource with error: %+v" , err )
199
- return err
200
- }
201
193
return nil
202
194
}
203
195
@@ -228,7 +220,7 @@ func (r *ReconcileCnsFileAccessConfig) Reconcile(ctx context.Context,
228
220
request reconcile.Request ) (reconcile.Result , error ) {
229
221
log := logger .GetLogger (ctx )
230
222
// Fetch the CnsFileAccessConfig instance.
231
- instance := & cnsfileaccessconfigv1alpha1 .CnsFileAccessConfig {}
223
+ instance := & v1a1 .CnsFileAccessConfig {}
232
224
err := r .client .Get (ctx , request .NamespacedName , instance )
233
225
if err != nil {
234
226
if apierrors .IsNotFound (err ) {
@@ -297,11 +289,10 @@ func (r *ReconcileCnsFileAccessConfig) Reconcile(ctx context.Context,
297
289
}
298
290
299
291
// Remove finalizer from CnsFileAccessConfig CRD
300
- removeFinalizerFromCRDInstance (ctx , instance )
301
- err = updateCnsFileAccessConfig (ctx , r .client , instance )
292
+ err = k8s .RemoveFinalizer (ctx , r .client , instance , cnsoperatortypes .CNSFinalizer )
302
293
if err != nil {
303
- msg := fmt .Sprintf ("failed to update CnsFileAccessConfig instance: %q on namespace: %q. Error: %+v" ,
304
- instance .Name , instance .Namespace , err )
294
+ msg := fmt .Sprintf ("failed to remove finalizer from CnsFileAccessConfig " +
295
+ "instance: %q on namespace: %q. Error: %+v" , instance .Name , instance .Namespace , err )
305
296
recordEvent (ctx , r , instance , v1 .EventTypeWarning , msg )
306
297
return reconcile.Result {RequeueAfter : timeout }, nil
307
298
}
@@ -370,8 +361,7 @@ func (r *ReconcileCnsFileAccessConfig) Reconcile(ctx context.Context,
370
361
return reconcile.Result {RequeueAfter : timeout }, nil
371
362
}
372
363
}
373
- removeFinalizerFromCRDInstance (ctx , instance )
374
- err = updateCnsFileAccessConfig (ctx , r .client , instance )
364
+ err = k8s .RemoveFinalizer (ctx , r .client , instance , cnsoperatortypes .CNSFinalizer )
375
365
if err != nil {
376
366
msg := fmt .Sprintf ("failed to update CnsFileAccessConfig instance: %q on namespace: %q. Error: %+v" ,
377
367
instance .Name , instance .Namespace , err )
@@ -396,24 +386,14 @@ func (r *ReconcileCnsFileAccessConfig) Reconcile(ctx context.Context,
396
386
backOffDurationMapMutex .Unlock ()
397
387
return reconcile.Result {}, nil
398
388
}
399
- cnsFinalizerExists := false
400
- // Check if finalizer already exists.
401
- for _ , finalizer := range instance .Finalizers {
402
- if finalizer == cnsoperatortypes .CNSFinalizer {
403
- cnsFinalizerExists = true
404
- break
405
- }
406
- }
407
- if ! cnsFinalizerExists {
408
- // Add finalizer.
409
- instance .Finalizers = append (instance .Finalizers , cnsoperatortypes .CNSFinalizer )
410
- err = updateCnsFileAccessConfig (ctx , r .client , instance )
411
- if err != nil {
412
- msg := fmt .Sprintf ("failed to update CnsFileAccessConfig instance: %q on namespace: %q. Error: %+v" ,
413
- instance .Name , instance .Namespace , err )
414
- recordEvent (ctx , r , instance , v1 .EventTypeWarning , msg )
415
- return reconcile.Result {RequeueAfter : timeout }, nil
416
- }
389
+
390
+ // Add finalizer to CnsFileAccessConfig instance if it does not already exist.
391
+ err = k8s .AddFinalizer (ctx , r .client , instance , cnsoperatortypes .CNSFinalizer )
392
+ if err != nil {
393
+ msg := fmt .Sprintf ("failed to add finalizer on CnsFileAccessConfig instance: %q on namespace: %q. Error: %+v" ,
394
+ instance .Name , instance .Namespace , err )
395
+ recordEvent (ctx , r , instance , v1 .EventTypeWarning , msg )
396
+ return reconcile.Result {RequeueAfter : timeout }, nil
417
397
}
418
398
419
399
vmOwnerRefExists := false
@@ -528,7 +508,7 @@ func (r *ReconcileCnsFileAccessConfig) Reconcile(ctx context.Context,
528
508
// addPvcFinalizer checks if CnsPvcFinalizer exists on PVC.
529
509
// If it does not exist, it updates the PVC with it.
530
510
func addPvcFinalizer (ctx context.Context ,
531
- instance * cnsfileaccessconfigv1alpha1 .CnsFileAccessConfig , client client.Client ) error {
511
+ instance * v1a1 .CnsFileAccessConfig , client client.Client ) error {
532
512
log := logger .GetLogger (ctx )
533
513
534
514
if ! commonco .ContainerOrchestratorUtility .IsFSSEnabled (ctx , common .FileVolumesWithVmService ) {
@@ -566,7 +546,7 @@ func addPvcFinalizer(ctx context.Context,
566
546
567
547
// isPvcInUse returns true if there is at least 1 VM which is using the given PVC.
568
548
func isPvcInUse (ctx context.Context , pvcName string ,
569
- instance * cnsfileaccessconfigv1alpha1 .CnsFileAccessConfig ) (bool , error ) {
549
+ instance * v1a1 .CnsFileAccessConfig ) (bool , error ) {
570
550
log := logger .GetLogger (ctx )
571
551
572
552
cnsFileVolumeClientInstance , err := cnsfilevolumeclient .GetFileVolumeClientInstance (ctx )
@@ -581,7 +561,7 @@ func isPvcInUse(ctx context.Context, pvcName string,
581
561
// removeFinalizerFromPVC will remove the CNS Finalizer, cns.vmware.com/pvc-protection,
582
562
// from a given PersistentVolumeClaim.
583
563
func removeFinalizerFromPVC (ctx context.Context , client client.Client ,
584
- instance * cnsfileaccessconfigv1alpha1 .CnsFileAccessConfig ) error {
564
+ instance * v1a1 .CnsFileAccessConfig ) error {
585
565
log := logger .GetLogger (ctx )
586
566
587
567
if ! commonco .ContainerOrchestratorUtility .IsFSSEnabled (ctx , common .FileVolumesWithVmService ) {
@@ -640,7 +620,7 @@ func removeFinalizerFromPVC(ctx context.Context, client client.Client,
640
620
// This method is used when we don't have VM instance. It fetches the VM IP from CNSFileVolumeClient
641
621
// instance for the VM name associated with CnsFileAccessConfig.
642
622
func (r * ReconcileCnsFileAccessConfig ) removePermissionsForFileVolume (ctx context.Context , volumeID string ,
643
- instance * cnsfileaccessconfigv1alpha1 .CnsFileAccessConfig , skipConfigureVolumeACL bool ) error {
623
+ instance * v1a1 .CnsFileAccessConfig , skipConfigureVolumeACL bool ) error {
644
624
log := logger .GetLogger (ctx )
645
625
volumePermissionLock , _ := volumePermissionLockMap .LoadOrStore (volumeID , & sync.Mutex {})
646
626
instanceLock , _ := volumePermissionLock .(* sync.Mutex )
@@ -685,7 +665,7 @@ func (r *ReconcileCnsFileAccessConfig) removePermissionsForFileVolume(ctx contex
685
665
// permissions by setting the parameter removePermission to true or false
686
666
// respectively. Returns error if any operation fails.
687
667
func (r * ReconcileCnsFileAccessConfig ) configureNetPermissionsForFileVolume (ctx context.Context ,
688
- volumeID string , vm * vmoperatortypes.VirtualMachine , instance * cnsfileaccessconfigv1alpha1 .CnsFileAccessConfig ,
668
+ volumeID string , vm * vmoperatortypes.VirtualMachine , instance * v1a1 .CnsFileAccessConfig ,
689
669
removePermission bool ) error {
690
670
log := logger .GetLogger (ctx )
691
671
volumePermissionLock , _ := volumePermissionLockMap .LoadOrStore (volumeID , & sync.Mutex {})
@@ -865,10 +845,10 @@ func validateVmAndPvc(ctx context.Context, instanceLabels map[string]string, ins
865
845
// setInstanceSuccess sets instance to success and records an event on the
866
846
// CnsFileAccessConfig instance.
867
847
func setInstanceSuccess (ctx context.Context , r * ReconcileCnsFileAccessConfig ,
868
- instance * cnsfileaccessconfigv1alpha1 .CnsFileAccessConfig , msg string ) error {
848
+ instance * v1a1 .CnsFileAccessConfig , msg string ) error {
869
849
instance .Status .Done = true
870
850
instance .Status .Error = ""
871
- err := updateCnsFileAccessConfig (ctx , r .client , instance )
851
+ err := k8s . UpdateStatus (ctx , r .client , instance )
872
852
if err != nil {
873
853
return err
874
854
}
@@ -879,18 +859,18 @@ func setInstanceSuccess(ctx context.Context, r *ReconcileCnsFileAccessConfig,
879
859
// setInstanceError sets error and records an event on the CnsFileAccessConfig
880
860
// instance.
881
861
func setInstanceError (ctx context.Context , r * ReconcileCnsFileAccessConfig ,
882
- instance * cnsfileaccessconfigv1alpha1 .CnsFileAccessConfig , errMsg string ) {
862
+ instance * v1a1 .CnsFileAccessConfig , errMsg string ) {
883
863
log := logger .GetLogger (ctx )
884
864
instance .Status .Error = errMsg
885
- err := updateCnsFileAccessConfig (ctx , r .client , instance )
865
+ err := k8s . UpdateStatus (ctx , r .client , instance )
886
866
if err != nil {
887
867
log .Errorf ("updateCnsFileAccessConfig failed. err: %v" , err )
888
868
}
889
869
recordEvent (ctx , r , instance , v1 .EventTypeWarning , errMsg )
890
870
}
891
871
892
872
func updateCnsFileAccessConfig (ctx context.Context , client client.Client ,
893
- instance * cnsfileaccessconfigv1alpha1 .CnsFileAccessConfig ) error {
873
+ instance * v1a1 .CnsFileAccessConfig ) error {
894
874
log := logger .GetLogger (ctx )
895
875
err := client .Update (ctx , instance )
896
876
if err != nil {
@@ -904,7 +884,7 @@ func updateCnsFileAccessConfig(ctx context.Context, client client.Client,
904
884
// appropriately and logs the message.
905
885
// backOffDuration is reset to 1 second on success and doubled on failure.
906
886
func recordEvent (ctx context.Context , r * ReconcileCnsFileAccessConfig ,
907
- instance * cnsfileaccessconfigv1alpha1 .CnsFileAccessConfig , eventtype string , msg string ) {
887
+ instance * v1a1 .CnsFileAccessConfig , eventtype string , msg string ) {
908
888
log := logger .GetLogger (ctx )
909
889
log .Debugf ("Event type is %s" , eventtype )
910
890
namespacedName := types.NamespacedName {
@@ -927,17 +907,3 @@ func recordEvent(ctx context.Context, r *ReconcileCnsFileAccessConfig,
927
907
backOffDurationMapMutex .Unlock ()
928
908
}
929
909
}
930
-
931
- // removeFinalizerFromCRDInstance will remove the CNS Finalizer = cns.vmware.com,
932
- // from a given CnsFileAccessConfig instance.
933
- func removeFinalizerFromCRDInstance (ctx context.Context , instance * cnsfileaccessconfigv1alpha1.CnsFileAccessConfig ) {
934
- log := logger .GetLogger (ctx )
935
- for i , finalizer := range instance .Finalizers {
936
- if finalizer == cnsoperatortypes .CNSFinalizer {
937
- log .Debugf ("Removing %q finalizer from CnsFileAccessConfig instance with name: %q on namespace: %q" ,
938
- cnsoperatortypes .CNSFinalizer , instance .Name , instance .Namespace )
939
- instance .Finalizers = append (instance .Finalizers [:i ], instance .Finalizers [i + 1 :]... )
940
- break
941
- }
942
- }
943
- }
0 commit comments