mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 01:06:27 +00:00
Update single-numa-node policy unit tests
This commit is contained in:
parent
2825a7be1a
commit
f886d2a832
@ -17,6 +17,7 @@ limitations under the License.
|
|||||||
package topologymanager
|
package topologymanager
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -53,7 +54,276 @@ func TestPolicySingleNumaNodeCanAdmitPodResult(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSingleNumaNodePolicyMerge(t *testing.T) {
|
func TestPolicySingleNumaNodeFilterHints(t *testing.T) {
|
||||||
|
tcases := []struct {
|
||||||
|
name string
|
||||||
|
allResources [][]TopologyHint
|
||||||
|
expectedResources [][]TopologyHint
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "filter empty resources",
|
||||||
|
allResources: [][]TopologyHint{},
|
||||||
|
expectedResources: [][]TopologyHint(nil),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "filter hints with nil socket mask",
|
||||||
|
allResources: [][]TopologyHint{
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: nil, Preferred: false},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: nil, Preferred: true},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedResources: [][]TopologyHint{
|
||||||
|
[]TopologyHint(nil),
|
||||||
|
[]TopologyHint(nil),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "filter hints with nil socket mask",
|
||||||
|
allResources: [][]TopologyHint{
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(0), Preferred: true},
|
||||||
|
{NUMANodeAffinity: nil, Preferred: false},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(1), Preferred: true},
|
||||||
|
{NUMANodeAffinity: nil, Preferred: true},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedResources: [][]TopologyHint{
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(0), Preferred: true},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(1), Preferred: true},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "filter hints with empty resource socket mask",
|
||||||
|
allResources: [][]TopologyHint{
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(1), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(0), Preferred: true},
|
||||||
|
{NUMANodeAffinity: nil, Preferred: false},
|
||||||
|
},
|
||||||
|
{},
|
||||||
|
},
|
||||||
|
expectedResources: [][]TopologyHint{
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(1), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(0), Preferred: true},
|
||||||
|
},
|
||||||
|
[]TopologyHint(nil),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "filter hints with wide sockemask",
|
||||||
|
allResources: [][]TopologyHint{
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(0), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(1), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(1, 2), Preferred: false},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(0, 1, 2), Preferred: false},
|
||||||
|
{NUMANodeAffinity: nil, Preferred: false},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(1, 2), Preferred: false},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(0, 1, 2), Preferred: false},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(0, 2), Preferred: false},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(3), Preferred: false},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(1, 2), Preferred: false},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(0, 1, 2), Preferred: false},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(0, 2), Preferred: false},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedResources: [][]TopologyHint{
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(0), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(1), Preferred: true},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(3), Preferred: false},
|
||||||
|
},
|
||||||
|
[]TopologyHint(nil),
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
numaNodes := []int{0, 1, 2, 3}
|
||||||
|
for _, tc := range tcases {
|
||||||
|
policy := NewSingleNumaNodePolicy(numaNodes)
|
||||||
|
actual := policy.(*singleNumaNodePolicy).filterHints(tc.allResources)
|
||||||
|
if !reflect.DeepEqual(tc.expectedResources, actual) {
|
||||||
|
t.Errorf("Test Case: %s", tc.name)
|
||||||
|
t.Errorf("Expected result to be %v, got %v", tc.expectedResources, actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPolicySingleNumaNodeGetHintMatch(t *testing.T) {
|
||||||
|
tcases := []struct {
|
||||||
|
name string
|
||||||
|
resources [][]TopologyHint
|
||||||
|
expectedFound bool
|
||||||
|
expectedMatch TopologyHint
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "match single resource single hint",
|
||||||
|
resources: [][]TopologyHint{
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(3), Preferred: true},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedFound: true,
|
||||||
|
expectedMatch: TopologyHint{
|
||||||
|
NUMANodeAffinity: NewTestBitMask(3),
|
||||||
|
Preferred: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "match single resource multiple hints (Selected hint preferred is true) 1/2",
|
||||||
|
resources: [][]TopologyHint{
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(3), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(5), Preferred: false},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(2), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(1), Preferred: true},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedFound: true,
|
||||||
|
expectedMatch: TopologyHint{
|
||||||
|
NUMANodeAffinity: NewTestBitMask(1),
|
||||||
|
Preferred: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "match single resource multiple hints (Selected hint preferred is false) 2/2",
|
||||||
|
resources: [][]TopologyHint{
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(3), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(5), Preferred: false},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(2), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(1), Preferred: false},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedFound: true,
|
||||||
|
expectedMatch: TopologyHint{
|
||||||
|
NUMANodeAffinity: NewTestBitMask(1),
|
||||||
|
Preferred: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "match multiple resource single hint",
|
||||||
|
resources: [][]TopologyHint{
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(2), Preferred: true},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(2), Preferred: true},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(2), Preferred: false},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedFound: true,
|
||||||
|
expectedMatch: TopologyHint{
|
||||||
|
NUMANodeAffinity: NewTestBitMask(2),
|
||||||
|
Preferred: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "match multiple resource single hint no match",
|
||||||
|
resources: [][]TopologyHint{
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(0), Preferred: true},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(1), Preferred: true},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(2), Preferred: false},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedFound: false,
|
||||||
|
expectedMatch: TopologyHint{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "multiple resources no match",
|
||||||
|
resources: [][]TopologyHint{
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(3), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(4), Preferred: false},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(2), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(1), Preferred: false},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(3), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(5), Preferred: false},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(0), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(1), Preferred: false},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(0), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(5), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(4), Preferred: true},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedFound: false,
|
||||||
|
expectedMatch: TopologyHint{},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "multiple resources with match",
|
||||||
|
resources: [][]TopologyHint{
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(3), Preferred: false},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(4), Preferred: false},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(2), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(1), Preferred: true},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(3), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(5), Preferred: false},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(0), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(1), Preferred: false},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(0), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(5), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(4), Preferred: true},
|
||||||
|
{NUMANodeAffinity: NewTestBitMask(3), Preferred: true},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
expectedFound: true,
|
||||||
|
expectedMatch: TopologyHint{
|
||||||
|
NUMANodeAffinity: NewTestBitMask(3),
|
||||||
|
Preferred: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
numaNodes := []int{0, 1, 2, 3, 4, 5}
|
||||||
|
for _, tc := range tcases {
|
||||||
|
policy := NewSingleNumaNodePolicy(numaNodes)
|
||||||
|
found, match := policy.(*singleNumaNodePolicy).getHintMatch(tc.resources)
|
||||||
|
if found != tc.expectedFound {
|
||||||
|
t.Errorf("Test Case: %s", tc.name)
|
||||||
|
t.Errorf("Expected found to be %v, got %v", tc.expectedFound, found)
|
||||||
|
}
|
||||||
|
if found {
|
||||||
|
if !match.IsEqual(tc.expectedMatch) {
|
||||||
|
t.Errorf("Test Case: %s", tc.name)
|
||||||
|
t.Errorf("Expected match to be %v, got %v", tc.expectedMatch, match)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPolicySingleNumaNodeMerge(t *testing.T) {
|
||||||
numaNodes := []int{0, 1}
|
numaNodes := []int{0, 1}
|
||||||
policy := NewSingleNumaNodePolicy(numaNodes)
|
policy := NewSingleNumaNodePolicy(numaNodes)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user