Skip to content

Commit da04e2d

Browse files
fix(controller): remove finaliser in controller if k8s node owning the volume is not present
Signed-off-by: Abhilash Shetty <[email protected]>
1 parent 66cb3d7 commit da04e2d

File tree

2 files changed

+56
-3
lines changed

2 files changed

+56
-3
lines changed

pkg/driver/controller.go

Lines changed: 35 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
corev1 "k8s.io/api/core/v1"
2020
k8serror "k8s.io/apimachinery/pkg/api/errors"
2121
apimeta "k8s.io/apimachinery/pkg/api/meta"
22+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2223
"k8s.io/apimachinery/pkg/labels"
2324
kubeinformers "k8s.io/client-go/informers"
2425
"k8s.io/client-go/kubernetes"
@@ -365,7 +366,7 @@ func CreateLVMVolume(ctx context.Context, req *csi.CreateVolumeRequest,
365366
}
366367
klog.Infof("scheduling the volume %s/%s on node %s",
367368
params.VgPattern.String(), volName, owner)
368-
369+
369370
volObj, err := volbuilder.NewBuilder().
370371
WithName(volName).
371372
WithCapacity(capacity).
@@ -472,6 +473,28 @@ func (cs *controller) DeleteVolume(
472473
return csipayload.NewDeleteVolumeResponseBuilder().Build(), nil
473474
}
474475

476+
// Checks if k8s node is present. If the check fails with any other reason then NotFound.
477+
// We will return true and assume node is present.
478+
func isNodePresent(nodeId string) bool {
479+
cfg, err := k8sapi.Config().Get()
480+
if err != nil {
481+
return true
482+
}
483+
484+
kubeClient, err := kubernetes.NewForConfig(cfg)
485+
if err != nil {
486+
return true
487+
}
488+
489+
_, err = kubeClient.CoreV1().Nodes().Get(context.TODO(), nodeId, metav1.GetOptions{})
490+
if err != nil {
491+
if k8serror.IsNotFound(err) {
492+
return false
493+
}
494+
}
495+
return true
496+
}
497+
475498
func (cs *controller) deleteVolume(ctx context.Context, volumeID string) error {
476499
klog.Infof("received request to delete volume %q", volumeID)
477500
vol, err := lvm.GetLVMVolume(volumeID)
@@ -482,7 +505,6 @@ func (cs *controller) deleteVolume(ctx context.Context, volumeID string) error {
482505
return errors.Wrapf(err,
483506
"failed to get volume for {%s}", volumeID)
484507
}
485-
486508
// if volume is not already triggered for deletion, delete the volume.
487509
// otherwise, just wait for the existing deletion operation to complete.
488510
if vol.GetDeletionTimestamp() == nil {
@@ -491,6 +513,17 @@ func (cs *controller) deleteVolume(ctx context.Context, volumeID string) error {
491513
"failed to handle delete volume request for {%s}", volumeID)
492514
}
493515
}
516+
present := isNodePresent(vol.Spec.OwnerNodeID)
517+
if !present {
518+
klog.Warningf("Removing finalizer as node %s is not present in cluster", vol.Spec.OwnerNodeID)
519+
if err = lvm.RemoveVolFinalizer(vol); err != nil {
520+
return err
521+
}
522+
if err = lvm.VerifyLVMVolumeDestroy(volumeID); err != nil {
523+
return err
524+
}
525+
return nil
526+
}
494527
if err = lvm.WaitForLVMVolumeDestroy(ctx, volumeID); err != nil {
495528
return err
496529
}

pkg/lvm/volume.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func ProvisionVolume(vol *apis.LVMVolume) (*apis.LVMVolume, error) {
104104
func DeleteVolume(volumeID string) (err error) {
105105
err = volbuilder.NewKubeclient().WithNamespace(LvmNamespace).Delete(volumeID)
106106
if err == nil {
107-
klog.Infof("deprovisioned volume %s", volumeID)
107+
klog.Infof("deprovisioning volume %s", volumeID)
108108
}
109109

110110
return
@@ -164,6 +164,23 @@ func WaitForLVMVolumeDestroy(ctx context.Context, volumeID string) error {
164164
}
165165
}
166166

167+
// Verifies if lvmvolume CR got removed after removing finaliser.
168+
func VerifyLVMVolumeDestroy(volumeID string) error {
169+
for i := 0; i < 10; i++ {
170+
_, err := GetLVMVolume(volumeID)
171+
if err != nil {
172+
if k8serror.IsNotFound(err) {
173+
return nil
174+
}
175+
return status.Errorf(codes.Internal,
176+
"lvmvolume: destroy wait failed, not able to get the volume %s %s", volumeID, err.Error())
177+
}
178+
time.Sleep(time.Duration(100 * time.Millisecond))
179+
}
180+
return status.Errorf(codes.FailedPrecondition,
181+
"lvmvolume: %s not removed after removing finaliser", volumeID)
182+
}
183+
167184
// GetLVMVolumeState returns LVMVolume OwnerNode and State for
168185
// the given volume. CreateVolume request may call it again and
169186
// again until volume is "Ready".
@@ -219,6 +236,9 @@ func RemoveVolFinalizer(vol *apis.LVMVolume) error {
219236
vol.Finalizers = nil
220237

221238
_, err := volbuilder.NewKubeclient().WithNamespace(LvmNamespace).Update(vol)
239+
if err != nil {
240+
klog.Infof("Finalizer removed successfully for %s", vol.Name)
241+
}
222242
return err
223243
}
224244

0 commit comments

Comments
 (0)