From 4567a4310106cda31d74add7a241629f3b8dd6c7 Mon Sep 17 00:00:00 2001 From: Abdullah Gharaibeh Date: Mon, 31 May 2021 22:44:34 -0400 Subject: [PATCH] Return UnschedulableAndUnresolvable when looking up volume-related resources returns NotFound error --- pkg/scheduler/framework/fake/listers.go | 8 ++++++- .../plugins/volumezone/volume_zone.go | 24 +++++++++++++------ 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/pkg/scheduler/framework/fake/listers.go b/pkg/scheduler/framework/fake/listers.go index 0352bf38217..1b4482fa3d2 100644 --- a/pkg/scheduler/framework/fake/listers.go +++ b/pkg/scheduler/framework/fake/listers.go @@ -22,6 +22,7 @@ import ( appsv1 "k8s.io/api/apps/v1" v1 "k8s.io/api/core/v1" storagev1 "k8s.io/api/storage/v1" + "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" appslisters "k8s.io/client-go/listers/apps/v1" @@ -311,7 +312,12 @@ func (classes StorageClassLister) Get(name string) (*storagev1.StorageClass, err return &sc, nil } } - return nil, fmt.Errorf("unable to find storage class: %s", name) + return nil, &errors.StatusError{ + ErrStatus: metav1.Status{ + Reason: metav1.StatusReasonNotFound, + Message: fmt.Sprintf("unable to find storage class: %s", name), + }, + } } // List lists all StorageClass in the indexer. diff --git a/pkg/scheduler/framework/plugins/volumezone/volume_zone.go b/pkg/scheduler/framework/plugins/volumezone/volume_zone.go index eca8d3301ab..3c0da9e3de6 100644 --- a/pkg/scheduler/framework/plugins/volumezone/volume_zone.go +++ b/pkg/scheduler/framework/plugins/volumezone/volume_zone.go @@ -22,6 +22,7 @@ import ( v1 "k8s.io/api/core/v1" storage "k8s.io/api/storage/v1" + "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/sets" corelisters "k8s.io/client-go/listers/core/v1" @@ -112,8 +113,8 @@ func (pl *VolumeZone) Filter(ctx context.Context, _ *framework.CycleState, pod * return framework.NewStatus(framework.UnschedulableAndUnresolvable, "PersistentVolumeClaim had no name") } pvc, err := pl.pvcLister.PersistentVolumeClaims(pod.Namespace).Get(pvcName) - if err != nil { - return framework.NewStatus(framework.UnschedulableAndUnresolvable, err.Error()) + if s := getErrorAsStatus(err); !s.IsSuccess() { + return s } pvName := pvc.Spec.VolumeName @@ -124,9 +125,8 @@ func (pl *VolumeZone) Filter(ctx context.Context, _ *framework.CycleState, pod * } class, err := pl.scLister.Get(scName) - if err != nil { - return framework.NewStatus(framework.UnschedulableAndUnresolvable, err.Error()) - + if s := getErrorAsStatus(err); !s.IsSuccess() { + return s } if class.VolumeBindingMode == nil { return framework.NewStatus(framework.UnschedulableAndUnresolvable, fmt.Sprintf("VolumeBindingMode not set for StorageClass %q", scName)) @@ -140,8 +140,8 @@ func (pl *VolumeZone) Filter(ctx context.Context, _ *framework.CycleState, pod * } pv, err := pl.pvLister.Get(pvName) - if err != nil { - return framework.NewStatus(framework.UnschedulableAndUnresolvable, err.Error()) + if s := getErrorAsStatus(err); !s.IsSuccess() { + return s } for k, v := range pv.ObjectMeta.Labels { @@ -164,6 +164,16 @@ func (pl *VolumeZone) Filter(ctx context.Context, _ *framework.CycleState, pod * return nil } +func getErrorAsStatus(err error) *framework.Status { + if err != nil { + if errors.IsNotFound(err) { + return framework.NewStatus(framework.UnschedulableAndUnresolvable, err.Error()) + } + return framework.AsStatus(err) + } + return nil +} + // EventsToRegister returns the possible events that may make a Pod // failed by this plugin schedulable. func (pl *VolumeZone) EventsToRegister() []framework.ClusterEvent {