Skip to content

Commit c4f2ec4

Browse files
committed
controllers: delete nfs driver if nfs is not enabled
Signed-off-by: Rohan Gupta <[email protected]>
1 parent e2cf70a commit c4f2ec4

File tree

1 file changed

+61
-3
lines changed

1 file changed

+61
-3
lines changed

internal/controller/operatorconfigmap_controller.go

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)