From d2ab5f2973f7e8b99e535c5d099ed27bfc36237d Mon Sep 17 00:00:00 2001 From: Michelle Au Date: Fri, 13 Apr 2018 10:46:07 -0700 Subject: [PATCH] Fix volume node affinity to OR node selector terms --- pkg/volume/util/util.go | 6 ++- pkg/volume/util/util_test.go | 80 ++++++++++++++++++++++++++++++++++-- 2 files changed, 81 insertions(+), 5 deletions(-) diff --git a/pkg/volume/util/util.go b/pkg/volume/util/util.go index 05959589b15..981618e2a51 100644 --- a/pkg/volume/util/util.go +++ b/pkg/volume/util/util.go @@ -282,10 +282,12 @@ func checkVolumeNodeAffinity(pv *v1.PersistentVolume, nodeLabels map[string]stri if err != nil { return fmt.Errorf("Failed to parse MatchExpressions: %v", err) } - if !selector.Matches(labels.Set(nodeLabels)) { - return fmt.Errorf("NodeSelectorTerm %+v does not match node labels", term.MatchExpressions) + if selector.Matches(labels.Set(nodeLabels)) { + // Terms are ORed, so only one needs to match + return nil } } + return fmt.Errorf("No matching NodeSelectorTerms") } return nil } diff --git a/pkg/volume/util/util_test.go b/pkg/volume/util/util_test.go index 5809211d5c0..a6809e89e1c 100644 --- a/pkg/volume/util/util_test.go +++ b/pkg/volume/util/util_test.go @@ -65,7 +65,53 @@ func TestCheckVolumeNodeAffinity(t *testing.T) { pv: testVolumeWithNodeAffinity(t, &v1.VolumeNodeAffinity{}), }, { - name: "valid-constraints", + name: "select-nothing", + expectSuccess: false, + pv: testVolumeWithNodeAffinity(t, &v1.VolumeNodeAffinity{Required: &v1.NodeSelector{}}), + }, + { + name: "select-nothing-empty-terms", + expectSuccess: false, + pv: testVolumeWithNodeAffinity(t, &v1.VolumeNodeAffinity{ + Required: &v1.NodeSelector{ + NodeSelectorTerms: []v1.NodeSelectorTerm{ + { + MatchExpressions: []v1.NodeSelectorRequirement{}, + }, + }, + }, + }), + }, + { + name: "valid-multiple-terms", + expectSuccess: true, + pv: testVolumeWithNodeAffinity(t, &v1.VolumeNodeAffinity{ + Required: &v1.NodeSelector{ + NodeSelectorTerms: []v1.NodeSelectorTerm{ + { + MatchExpressions: []v1.NodeSelectorRequirement{ + { + Key: "test-key3", + Operator: v1.NodeSelectorOpIn, + Values: []string{"test-value1", "test-value3"}, + }, + }, + }, + { + MatchExpressions: []v1.NodeSelectorRequirement{ + { + Key: "test-key2", + Operator: v1.NodeSelectorOpIn, + Values: []string{"test-value0", "test-value2"}, + }, + }, + }, + }, + }, + }), + }, + { + name: "valid-multiple-match-expressions", expectSuccess: true, pv: testVolumeWithNodeAffinity(t, &v1.VolumeNodeAffinity{ Required: &v1.NodeSelector{ @@ -89,7 +135,7 @@ func TestCheckVolumeNodeAffinity(t *testing.T) { }), }, { - name: "invalid-key", + name: "invalid-multiple-match-expressions-key", expectSuccess: false, pv: testVolumeWithNodeAffinity(t, &v1.VolumeNodeAffinity{ Required: &v1.NodeSelector{ @@ -113,7 +159,7 @@ func TestCheckVolumeNodeAffinity(t *testing.T) { }), }, { - name: "invalid-values", + name: "invalid-multiple-match-expressions-values", expectSuccess: false, pv: testVolumeWithNodeAffinity(t, &v1.VolumeNodeAffinity{ Required: &v1.NodeSelector{ @@ -136,6 +182,34 @@ func TestCheckVolumeNodeAffinity(t *testing.T) { }, }), }, + { + name: "invalid-multiple-terms", + expectSuccess: false, + pv: testVolumeWithNodeAffinity(t, &v1.VolumeNodeAffinity{ + Required: &v1.NodeSelector{ + NodeSelectorTerms: []v1.NodeSelectorTerm{ + { + MatchExpressions: []v1.NodeSelectorRequirement{ + { + Key: "test-key3", + Operator: v1.NodeSelectorOpIn, + Values: []string{"test-value1", "test-value3"}, + }, + }, + }, + { + MatchExpressions: []v1.NodeSelectorRequirement{ + { + Key: "test-key2", + Operator: v1.NodeSelectorOpIn, + Values: []string{"test-value0", "test-value1"}, + }, + }, + }, + }, + }, + }), + }, } for _, c := range cases {