123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167 |
- /*
- Copyright 2019 The Kubernetes Authors.
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
- http://www.apache.org/licenses/LICENSE-2.0
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
- package topologymanager
- import (
- "reflect"
- "testing"
- )
- func TestPolicySingleNumaNodeCanAdmitPodResult(t *testing.T) {
- tcases := []struct {
- name string
- hint TopologyHint
- expected bool
- }{
- {
- name: "Preferred is set to false in topology hints",
- hint: TopologyHint{nil, false},
- expected: false,
- },
- }
- for _, tc := range tcases {
- numaNodes := []int{0, 1}
- policy := NewSingleNumaNodePolicy(numaNodes)
- result := policy.(*singleNumaNodePolicy).canAdmitPodResult(&tc.hint)
- if result != tc.expected {
- t.Errorf("Expected result to be %t, got %t", tc.expected, result)
- }
- }
- }
- 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 1/2",
- allResources: [][]TopologyHint{
- {
- {NUMANodeAffinity: nil, Preferred: false},
- },
- {
- {NUMANodeAffinity: nil, Preferred: true},
- },
- },
- expectedResources: [][]TopologyHint{
- []TopologyHint(nil),
- {
- {NUMANodeAffinity: nil, Preferred: true},
- },
- },
- },
- {
- name: "filter hints with nil socket mask 2/2",
- 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},
- {NUMANodeAffinity: nil, 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},
- },
- []TopologyHint(nil),
- []TopologyHint(nil),
- },
- },
- }
- for _, tc := range tcases {
- actual := filterSingleNumaHints(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 TestPolicySingleNumaNodeMerge(t *testing.T) {
- numaNodes := []int{0, 1}
- policy := NewSingleNumaNodePolicy(numaNodes)
- tcases := commonPolicyMergeTestCases(numaNodes)
- tcases = append(tcases, policy.(*singleNumaNodePolicy).mergeTestCases(numaNodes)...)
- testPolicyMerge(policy, tcases, t)
- }
|