Skip PV patch step in Restoe workflow for WaitForFirstConsumer VolumeBindingMode Pending state PVCs (#7953)
add changelog file change log level and add more detailed comments make update add return for sc get call if error Signed-off-by: Shubham Pampattiwar <spampatt@redhat.com>pull/8008/head
parent
255a51f695
commit
3bd8a7da7d
|
@ -0,0 +1 @@
|
|||
Skip PV patch step in Restoe workflow for WaitForFirstConsumer VolumeBindingMode Pending state PVCs
|
|
@ -22,6 +22,8 @@ import (
|
|||
"sync"
|
||||
"time"
|
||||
|
||||
storagev1api "k8s.io/api/storage/v1"
|
||||
|
||||
"github.com/pkg/errors"
|
||||
"github.com/sirupsen/logrus"
|
||||
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
||||
|
@ -304,6 +306,27 @@ func (ctx *finalizerContext) patchDynamicPVWithVolumeInfo() (errs results.Result
|
|||
return false, err
|
||||
}
|
||||
|
||||
// We are handling a common but specific scenario where a PVC is in a pending state and uses a storage class with
|
||||
// VolumeBindingMode set to WaitForFirstConsumer. In this case, the PV patch step is skipped to avoid
|
||||
// failures due to the PVC not being bound, which could cause a timeout and result in a failed restore.
|
||||
if pvc != nil && pvc.Status.Phase == v1.ClaimPending {
|
||||
// check if storage class used has VolumeBindingMode as WaitForFirstConsumer
|
||||
scName := *pvc.Spec.StorageClassName
|
||||
sc := &storagev1api.StorageClass{}
|
||||
err = ctx.crClient.Get(context.Background(), client.ObjectKey{Name: scName}, sc)
|
||||
|
||||
if err != nil {
|
||||
errs.Add(restoredNamespace, err)
|
||||
return false, err
|
||||
}
|
||||
// skip PV patch step for this scenario
|
||||
// because pvc would not be bound and the PV patch step would fail due to timeout thus failing the restore
|
||||
if *sc.VolumeBindingMode == storagev1api.VolumeBindingWaitForFirstConsumer {
|
||||
log.Warnf("skipping PV patch to restore custom reclaim policy, if any: StorageClass %s used by PVC %s has VolumeBindingMode set to WaitForFirstConsumer, and the PVC is also in a pending state", scName, pvc.Name)
|
||||
return true, nil
|
||||
}
|
||||
}
|
||||
|
||||
if pvc.Status.Phase != v1.ClaimBound || pvc.Spec.VolumeName == "" {
|
||||
log.Debugf("PVC: %s not ready", pvc.Name)
|
||||
return false, nil
|
||||
|
|
Loading…
Reference in New Issue