From fd6983c70f9d3c8816e6d6f71f57435e907f054e Mon Sep 17 00:00:00 2001 From: caiweidong Date: Fri, 1 Nov 2019 01:11:56 +0800 Subject: [PATCH] simplify volume zone checker --- .../algorithm/predicates/predicates.go | 111 ++++++++++-------- .../plugins/volumezone/volume_zone_test.go | 18 +-- 2 files changed, 69 insertions(+), 60 deletions(-) diff --git a/pkg/scheduler/algorithm/predicates/predicates.go b/pkg/scheduler/algorithm/predicates/predicates.go index 44ba22daf0f..1d36bec3bb0 100644 --- a/pkg/scheduler/algorithm/predicates/predicates.go +++ b/pkg/scheduler/algorithm/predicates/predicates.go @@ -677,62 +677,69 @@ func (c *VolumeZoneChecker) predicate(pod *v1.Pod, meta PredicateMetadata, nodeI manifest := &(pod.Spec) for i := range manifest.Volumes { volume := &manifest.Volumes[i] - if volume.PersistentVolumeClaim != nil { - pvcName := volume.PersistentVolumeClaim.ClaimName - if pvcName == "" { - return false, nil, fmt.Errorf("PersistentVolumeClaim had no name") + if volume.PersistentVolumeClaim == nil { + continue + } + pvcName := volume.PersistentVolumeClaim.ClaimName + if pvcName == "" { + return false, nil, fmt.Errorf("PersistentVolumeClaim had no name") + } + pvc, err := c.pvcLister.PersistentVolumeClaims(namespace).Get(pvcName) + if err != nil { + return false, nil, err + } + + if pvc == nil { + return false, nil, fmt.Errorf("PersistentVolumeClaim was not found: %q", pvcName) + } + + pvName := pvc.Spec.VolumeName + if pvName == "" { + scName := v1helper.GetPersistentVolumeClaimClass(pvc) + if len(scName) == 0 { + return false, nil, fmt.Errorf("PersistentVolumeClaim had no pv name and storageClass name") } - pvc, err := c.pvcLister.PersistentVolumeClaims(namespace).Get(pvcName) + + class, _ := c.scLister.Get(scName) + if class == nil { + return false, nil, fmt.Errorf("StorageClass %q claimed by PersistentVolumeClaim %q not found", + scName, pvcName) + + } + if class.VolumeBindingMode == nil { + return false, nil, fmt.Errorf("VolumeBindingMode not set for StorageClass %q", scName) + } + if *class.VolumeBindingMode == storage.VolumeBindingWaitForFirstConsumer { + // Skip unbound volumes + continue + } + + return false, nil, fmt.Errorf("PersistentVolume had no name") + } + + pv, err := c.pvLister.Get(pvName) + if err != nil { + return false, nil, err + } + + if pv == nil { + return false, nil, fmt.Errorf("PersistentVolume was not found: %q", pvName) + } + + for k, v := range pv.ObjectMeta.Labels { + if k != v1.LabelZoneFailureDomain && k != v1.LabelZoneRegion { + continue + } + nodeV, _ := nodeConstraints[k] + volumeVSet, err := volumehelpers.LabelZonesToSet(v) if err != nil { - return false, nil, err + klog.Warningf("Failed to parse label for %q: %q. Ignoring the label. err=%v. ", k, v, err) + continue } - if pvc == nil { - return false, nil, fmt.Errorf("PersistentVolumeClaim was not found: %q", pvcName) - } - - pvName := pvc.Spec.VolumeName - if pvName == "" { - scName := v1helper.GetPersistentVolumeClaimClass(pvc) - if len(scName) > 0 { - class, _ := c.scLister.Get(scName) - if class != nil { - if class.VolumeBindingMode == nil { - return false, nil, fmt.Errorf("VolumeBindingMode not set for StorageClass %q", scName) - } - if *class.VolumeBindingMode == storage.VolumeBindingWaitForFirstConsumer { - // Skip unbound volumes - continue - } - } - } - return false, nil, fmt.Errorf("PersistentVolumeClaim was not found: %q", pvcName) - } - - pv, err := c.pvLister.Get(pvName) - if err != nil { - return false, nil, err - } - - if pv == nil { - return false, nil, fmt.Errorf("PersistentVolume was not found: %q", pvName) - } - - for k, v := range pv.ObjectMeta.Labels { - if k != v1.LabelZoneFailureDomain && k != v1.LabelZoneRegion { - continue - } - nodeV, _ := nodeConstraints[k] - volumeVSet, err := volumehelpers.LabelZonesToSet(v) - if err != nil { - klog.Warningf("Failed to parse label for %q: %q. Ignoring the label. err=%v. ", k, v, err) - continue - } - - if !volumeVSet.Has(nodeV) { - klog.V(10).Infof("Won't schedule pod %q onto node %q due to volume %q (mismatch on %q)", pod.Name, node.Name, pvName, k) - return false, []PredicateFailureReason{ErrVolumeZoneConflict}, nil - } + if !volumeVSet.Has(nodeV) { + klog.V(10).Infof("Won't schedule pod %q onto node %q due to volume %q (mismatch on %q)", pod.Name, node.Name, pvName, k) + return false, []PredicateFailureReason{ErrVolumeZoneConflict}, nil } } } diff --git a/pkg/scheduler/framework/plugins/volumezone/volume_zone_test.go b/pkg/scheduler/framework/plugins/volumezone/volume_zone_test.go index 43e352da508..6f6a537ccf6 100644 --- a/pkg/scheduler/framework/plugins/volumezone/volume_zone_test.go +++ b/pkg/scheduler/framework/plugins/volumezone/volume_zone_test.go @@ -317,16 +317,18 @@ func TestWithBinding(t *testing.T) { Node: testNode, }, { - name: "unbound volume empty storage class", - Pod: createPodWithVolume("pod_1", "vol_1", "PVC_EmptySC"), - Node: testNode, - wantStatus: framework.NewStatus(framework.Error, "PersistentVolumeClaim was not found: \"PVC_EmptySC\""), + name: "unbound volume empty storage class", + Pod: createPodWithVolume("pod_1", "vol_1", "PVC_EmptySC"), + Node: testNode, + wantStatus: framework.NewStatus(framework.Error, + "PersistentVolumeClaim had no pv name and storageClass name"), }, { - name: "unbound volume no storage class", - Pod: createPodWithVolume("pod_1", "vol_1", "PVC_NoSC"), - Node: testNode, - wantStatus: framework.NewStatus(framework.Error, "PersistentVolumeClaim was not found: \"PVC_NoSC\""), + name: "unbound volume no storage class", + Pod: createPodWithVolume("pod_1", "vol_1", "PVC_NoSC"), + Node: testNode, + wantStatus: framework.NewStatus(framework.Error, + "StorageClass \"Class_0\" claimed by PersistentVolumeClaim \"PVC_NoSC\" not found"), }, { name: "unbound volume immediate binding mode",