@@ -18,6 +18,7 @@ import (
1818 corev1 "k8s.io/api/core/v1"
1919 k8serror "k8s.io/apimachinery/pkg/api/errors"
2020 apimeta "k8s.io/apimachinery/pkg/api/meta"
21+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
2122 "k8s.io/apimachinery/pkg/labels"
2223 kubeinformers "k8s.io/client-go/informers"
2324 "k8s.io/client-go/kubernetes"
@@ -393,6 +394,28 @@ func (cs *controller) DeleteVolume(
393394 return csipayload .NewDeleteVolumeResponseBuilder ().Build (), nil
394395}
395396
397+ // Checks if k8s node is present. If the check fails with any other reason then NotFound.
398+ // We will return true and assume node is present.
399+ func isNodePresent (nodeId string ) bool {
400+ cfg , err := k8sapi .Config ().Get ()
401+ if err != nil {
402+ return true
403+ }
404+
405+ kubeClient , err := kubernetes .NewForConfig (cfg )
406+ if err != nil {
407+ return true
408+ }
409+
410+ _ , err = kubeClient .CoreV1 ().Nodes ().Get (context .TODO (), nodeId , metav1.GetOptions {})
411+ if err != nil {
412+ if k8serror .IsNotFound (err ) {
413+ return false
414+ }
415+ }
416+ return true
417+ }
418+
396419func (cs * controller ) deleteVolume (ctx context.Context , volumeID string ) error {
397420 klog .Infof ("received request to delete volume %q" , volumeID )
398421 vol , err := lvm .GetLVMVolume (volumeID )
@@ -403,7 +426,6 @@ func (cs *controller) deleteVolume(ctx context.Context, volumeID string) error {
403426 return errors .Wrapf (err ,
404427 "failed to get volume for {%s}" , volumeID )
405428 }
406-
407429 // if volume is not already triggered for deletion, delete the volume.
408430 // otherwise, just wait for the existing deletion operation to complete.
409431 if vol .GetDeletionTimestamp () == nil {
@@ -412,6 +434,14 @@ func (cs *controller) deleteVolume(ctx context.Context, volumeID string) error {
412434 "failed to handle delete volume request for {%s}" , volumeID )
413435 }
414436 }
437+ present := isNodePresent (vol .Spec .OwnerNodeID )
438+ if ! present {
439+ klog .Infof ("Removing finalizer as node %s is not present in cluster" , vol .Spec .OwnerNodeID )
440+ if err = lvm .RemoveVolFinalizer (vol ); err != nil {
441+ return nil
442+ }
443+ }
444+
415445 if err = lvm .WaitForLVMVolumeDestroy (ctx , volumeID ); err != nil {
416446 return err
417447 }
0 commit comments