@@ -33,6 +33,7 @@ import (
3333
3434 csiopv1 "github.com/ceph/ceph-csi-operator/api/v1"
3535 "github.com/go-logr/logr"
36+ snapapi "github.com/kubernetes-csi/external-snapshotter/client/v8/apis/volumesnapshot/v1"
3637 nbv1 "github.com/noobaa/noobaa-operator/v5/pkg/apis/noobaa/v1alpha1"
3738 configv1 "github.com/openshift/api/config/v1"
3839 secv1 "github.com/openshift/api/security/v1"
@@ -85,6 +86,9 @@ const (
8586 cniNetworksAnnotationKey = "k8s.v1.cni.cncf.io/networks"
8687 noobaaCrdName = "noobaas.noobaa.io"
8788 noobaaCrName = "noobaa-remote"
89+
90+ pvDriverIndexName = "index:persistentVolumeDriver"
91+ vscDriverIndexName = "index:volumeSnapshotContentDriver"
8892)
8993
9094// OperatorConfigMapReconciler reconciles a ClusterVersion object
@@ -114,6 +118,28 @@ func (c *OperatorConfigMapReconciler) SetupWithManager(mgr ctrl.Manager) error {
114118 return fmt .Errorf ("unable to set up FieldIndexer for subscription package name: %v" , err )
115119 }
116120
121+ // Index PVs by CSI driver name
122+ if err := mgr .GetCache ().IndexField (ctx , & corev1.PersistentVolume {}, pvDriverIndexName , func (o client.Object ) []string {
123+ pv := o .(* corev1.PersistentVolume )
124+ if pv != nil && pv .Spec .CSI != nil && pv .Spec .CSI .Driver != "" {
125+ return []string {pv .Spec .CSI .Driver }
126+ }
127+ return nil
128+ }); err != nil {
129+ return fmt .Errorf ("unable to set up FieldIndexer for persistent volume driver name: %v" , err )
130+ }
131+
132+ // Index VolumeSnapshotContent by CSI driver name
133+ if err := mgr .GetCache ().IndexField (ctx , & snapapi.VolumeSnapshotContent {}, vscDriverIndexName , func (o client.Object ) []string {
134+ vsc := o .(* snapapi.VolumeSnapshotContent )
135+ if vsc != nil && vsc .Spec .Driver != "" {
136+ return []string {vsc .Spec .Driver }
137+ }
138+ return nil
139+ }); err != nil {
140+ return fmt .Errorf ("unable to set up FieldIndexer for volume snapshot content driver name: %v" , err )
141+ }
142+
117143 clusterVersionPredicates := builder .WithPredicates (
118144 predicate.GenerationChangedPredicate {},
119145 )
@@ -627,10 +653,10 @@ func (c *OperatorConfigMapReconciler) reconcileDelegatedCSI(storageClients *v1al
627653 }
628654
629655 // nfs driver config
656+ nfsDriver := & csiopv1.Driver {}
657+ nfsDriver .Name = templates .NfsDriverName
658+ nfsDriver .Namespace = c .OperatorNamespace
630659 if enableNfsDriver {
631- nfsDriver := & csiopv1.Driver {}
632- nfsDriver .Name = templates .NfsDriverName
633- nfsDriver .Namespace = c .OperatorNamespace
634660 if err := c .createOrUpdate (nfsDriver , func () error {
635661 if err := c .own (nfsDriver ); err != nil {
636662 return fmt .Errorf ("failed to own csi nfs driver: %v" , err )
@@ -643,6 +669,22 @@ func (c *OperatorConfigMapReconciler) reconcileDelegatedCSI(storageClients *v1al
643669 }); err != nil {
644670 return fmt .Errorf ("failed to reconcile nfs driver: %v" , err )
645671 }
672+ } else {
673+ if hasPvs , err := c .hasPersistentVolumesWithNfsDriver (); err != nil {
674+ return fmt .Errorf ("failed to check if NFS driver has PVs: %v" , err )
675+ } else if hasPvs {
676+ c .log .Info ("NFS driver has PVs, skipping deletion" )
677+ return nil
678+ }
679+ if hasVscs , err := c .hasVolumeSnapshotContentsWithNfsDriver (); err != nil {
680+ return fmt .Errorf ("failed to check if NFS driver has volumesnapshotcontents: %v" , err )
681+ } else if hasVscs {
682+ c .log .Info ("NFS driver has volumesnapshotcontents, skipping deletion" )
683+ return nil
684+ }
685+ if err := c .delete (nfsDriver ); err != nil {
686+ return fmt .Errorf ("failed to delete csi nfs driver: %v" , err )
687+ }
646688 }
647689
648690 return nil
@@ -1157,3 +1199,19 @@ func (c *OperatorConfigMapReconciler) removeNoobaaOperator() error {
11571199
11581200 return nil
11591201}
1202+
1203+ func (c * OperatorConfigMapReconciler ) hasPersistentVolumesWithNfsDriver () (bool , error ) {
1204+ pvList := & corev1.PersistentVolumeList {}
1205+ if err := c .list (pvList , client.MatchingFields {pvDriverIndexName : templates .NfsDriverName }, client .Limit (1 )); err != nil {
1206+ return false , fmt .Errorf ("failed to list NFS driver PVs: %v" , err )
1207+ }
1208+ return len (pvList .Items ) != 0 , nil
1209+ }
1210+
1211+ func (c * OperatorConfigMapReconciler ) hasVolumeSnapshotContentsWithNfsDriver () (bool , error ) {
1212+ vscList := & snapapi.VolumeSnapshotContentList {}
1213+ if err := c .list (vscList , client.MatchingFields {vscDriverIndexName : templates .NfsDriverName }, client .Limit (1 )); err != nil {
1214+ return false , fmt .Errorf ("failed to list NFS driver VolumeSnapshotContents: %v" , err )
1215+ }
1216+ return len (vscList .Items ) != 0 , nil
1217+ }
0 commit comments