@@ -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+
475498func (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 }
0 commit comments