From c26debecefd6cc64bcffd8258850cab975c7b7ba Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Wed, 29 Nov 2017 17:29:58 -0800 Subject: [PATCH] Return no volume match if prebound PV node affinity doesn't match node --- pkg/controller/volume/persistentvolume/index.go | 15 ++++++++++++++- .../volume/persistentvolume/index_test.go | 2 +- .../scheduler/algorithm/predicates/predicates.go | 6 +++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/pkg/controller/volume/persistentvolume/index.go b/pkg/controller/volume/persistentvolume/index.go index dd652471d7a..5c345744564 100644 --- a/pkg/controller/volume/persistentvolume/index.go +++ b/pkg/controller/volume/persistentvolume/index.go @@ -169,12 +169,13 @@ func findMatchingVolume( continue } + nodeAffinityValid := true if node != nil { // Scheduler path, check that the PV NodeAffinity // is satisfied by the node err := volumeutil.CheckNodeAffinity(volume, node.Labels) if err != nil { - continue + nodeAffinityValid = false } } @@ -185,6 +186,14 @@ func findMatchingVolume( if volumeQty.Cmp(requestedQty) < 0 { continue } + + // If PV node affinity is invalid, return no match. + // This means the prebound PV (and therefore PVC) + // is not suitable for this node. + if !nodeAffinityValid { + return nil, nil + } + return volume, nil } @@ -199,6 +208,7 @@ func findMatchingVolume( // - volumes bound to another claim // - volumes whose labels don't match the claim's selector, if specified // - volumes in Class that is not requested + // - volumes whose NodeAffinity does not match the node if volume.Spec.ClaimRef != nil { continue } else if selector != nil && !selector.Matches(labels.Set(volume.Labels)) { @@ -207,6 +217,9 @@ func findMatchingVolume( if v1helper.GetPersistentVolumeClass(volume) != requestedClass { continue } + if !nodeAffinityValid { + continue + } if node != nil { // Scheduler path diff --git a/pkg/controller/volume/persistentvolume/index_test.go b/pkg/controller/volume/persistentvolume/index_test.go index b734a67a991..5f5b50af50f 100644 --- a/pkg/controller/volume/persistentvolume/index_test.go +++ b/pkg/controller/volume/persistentvolume/index_test.go @@ -1218,7 +1218,7 @@ func TestFindMatchVolumeWithNode(t *testing.T) { pvc.Spec.StorageClassName = &classWait pvc.Name = "claim02" }), - node: node2, + node: node3, }, "success-bad-and-good-node-affinity": { expectedMatch: "affinity-pv3", diff --git a/plugin/pkg/scheduler/algorithm/predicates/predicates.go b/plugin/pkg/scheduler/algorithm/predicates/predicates.go index 917b35acf51..7b463699ea1 100644 --- a/plugin/pkg/scheduler/algorithm/predicates/predicates.go +++ b/plugin/pkg/scheduler/algorithm/predicates/predicates.go @@ -1475,12 +1475,12 @@ func (c *VolumeBindingChecker) predicate(pod *v1.Pod, meta algorithm.PredicateMe failReasons := []algorithm.PredicateFailureReason{} if !boundSatisfied { - glog.V(5).Info("Bound PVs not satisfied for pod %v/%v, node %q", pod.Namespace, pod.Name, node.Name) + glog.V(5).Infof("Bound PVs not satisfied for pod %v/%v, node %q", pod.Namespace, pod.Name, node.Name) failReasons = append(failReasons, ErrVolumeNodeConflict) } if !unboundSatisfied { - glog.V(5).Info("Couldn't find matching PVs for pod %v/%v, node %q", pod.Namespace, pod.Name, node.Name) + glog.V(5).Infof("Couldn't find matching PVs for pod %v/%v, node %q", pod.Namespace, pod.Name, node.Name) failReasons = append(failReasons, ErrVolumeBindConflict) } @@ -1489,6 +1489,6 @@ func (c *VolumeBindingChecker) predicate(pod *v1.Pod, meta algorithm.PredicateMe } // All volumes bound or matching PVs found for all unbound PVCs - glog.V(5).Info("All PVCs found matches for pod %v/%v, node %q", pod.Namespace, pod.Name, node.Name) + glog.V(5).Infof("All PVCs found matches for pod %v/%v, node %q", pod.Namespace, pod.Name, node.Name) return true, nil, nil }