mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 01:06:27 +00:00
Fix volume node affinity to OR node selector terms
This commit is contained in:
parent
3b038bfebc
commit
d2ab5f2973
@ -282,10 +282,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
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,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{
|
||||||
@ -89,7 +135,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{
|
||||||
@ -113,7 +159,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{
|
||||||
@ -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 {
|
for _, c := range cases {
|
||||||
|
Loading…
Reference in New Issue
Block a user