Unverified Commit 5a13d0f2 authored by Kubernetes Submit Queue's avatar Kubernetes Submit Queue Committed by GitHub

Merge pull request #62735 from msau42/automated-cherry-pick-of-#62556-upstream-release-1.10

Automatic merge from submit-queue. [1.10] Automated cherry pick of #62556: Fix volume node affinity to OR node selector terms Cherry pick of #62556 on release-1.10. #62556: Fix volume node affinity to OR node selector terms **Release note**: ```release-note Fixes issue where PersistentVolume.NodeAffinity.NodeSelectorTerms were ANDed instead of ORed. ```
parents 2ee455ff d5e9d2b3
...@@ -289,10 +289,12 @@ func checkAlphaNodeAffinity(pv *v1.PersistentVolume, nodeLabels map[string]strin ...@@ -289,10 +289,12 @@ func checkAlphaNodeAffinity(pv *v1.PersistentVolume, nodeLabels map[string]strin
if err != nil { if err != nil {
return fmt.Errorf("Failed to parse MatchExpressions: %v", err) return fmt.Errorf("Failed to parse MatchExpressions: %v", err)
} }
if !selector.Matches(labels.Set(nodeLabels)) { if selector.Matches(labels.Set(nodeLabels)) {
return fmt.Errorf("NodeSelectorTerm %+v does not match node labels", term.MatchExpressions) // Terms are ORed, so only one needs to match
return nil
} }
} }
return fmt.Errorf("No matching NodeSelectorTerms")
} }
return nil return nil
} }
...@@ -310,10 +312,12 @@ func checkVolumeNodeAffinity(pv *v1.PersistentVolume, nodeLabels map[string]stri ...@@ -310,10 +312,12 @@ func checkVolumeNodeAffinity(pv *v1.PersistentVolume, nodeLabels map[string]stri
if err != nil { if err != nil {
return fmt.Errorf("Failed to parse MatchExpressions: %v", err) return fmt.Errorf("Failed to parse MatchExpressions: %v", err)
} }
if !selector.Matches(labels.Set(nodeLabels)) { if selector.Matches(labels.Set(nodeLabels)) {
return fmt.Errorf("NodeSelectorTerm %+v does not match node labels", term.MatchExpressions) // Terms are ORed, so only one needs to match
return nil
} }
} }
return fmt.Errorf("No matching NodeSelectorTerms")
} }
return nil return nil
} }
......
...@@ -132,6 +132,34 @@ func TestCheckAlphaNodeAffinity(t *testing.T) { ...@@ -132,6 +132,34 @@ func TestCheckAlphaNodeAffinity(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 { for _, c := range cases {
...@@ -165,7 +193,53 @@ func TestCheckVolumeNodeAffinity(t *testing.T) { ...@@ -165,7 +193,53 @@ func TestCheckVolumeNodeAffinity(t *testing.T) {
pv: testVolumeWithNodeAffinity(t, &v1.VolumeNodeAffinity{}), 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, expectSuccess: true,
pv: testVolumeWithNodeAffinity(t, &v1.VolumeNodeAffinity{ pv: testVolumeWithNodeAffinity(t, &v1.VolumeNodeAffinity{
Required: &v1.NodeSelector{ Required: &v1.NodeSelector{
...@@ -189,7 +263,7 @@ func TestCheckVolumeNodeAffinity(t *testing.T) { ...@@ -189,7 +263,7 @@ func TestCheckVolumeNodeAffinity(t *testing.T) {
}), }),
}, },
{ {
name: "invalid-key", name: "invalid-multiple-match-expressions-key",
expectSuccess: false, expectSuccess: false,
pv: testVolumeWithNodeAffinity(t, &v1.VolumeNodeAffinity{ pv: testVolumeWithNodeAffinity(t, &v1.VolumeNodeAffinity{
Required: &v1.NodeSelector{ Required: &v1.NodeSelector{
...@@ -213,7 +287,7 @@ func TestCheckVolumeNodeAffinity(t *testing.T) { ...@@ -213,7 +287,7 @@ func TestCheckVolumeNodeAffinity(t *testing.T) {
}), }),
}, },
{ {
name: "invalid-values", name: "invalid-multiple-match-expressions-values",
expectSuccess: false, expectSuccess: false,
pv: testVolumeWithNodeAffinity(t, &v1.VolumeNodeAffinity{ pv: testVolumeWithNodeAffinity(t, &v1.VolumeNodeAffinity{
Required: &v1.NodeSelector{ Required: &v1.NodeSelector{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment