mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-25 12:43:23 +00:00
Add CPUManager tests for TopologyHint generation
Co-Authored-By: Conor Nolan <conor.nolan@intel.com> Co-Authored-By: Kevin Klues <kklues@nvidia.com>
This commit is contained in:
parent
156b3f6af8
commit
7c626a2a00
@ -40,6 +40,7 @@ go_test(
|
|||||||
"policy_none_test.go",
|
"policy_none_test.go",
|
||||||
"policy_static_test.go",
|
"policy_static_test.go",
|
||||||
"policy_test.go",
|
"policy_test.go",
|
||||||
|
"topology_hints_test.go",
|
||||||
],
|
],
|
||||||
embed = [":go_default_library"],
|
embed = [":go_default_library"],
|
||||||
deps = [
|
deps = [
|
||||||
|
152
pkg/kubelet/cm/cpumanager/topology_hints_test.go
Normal file
152
pkg/kubelet/cm/cpumanager/topology_hints_test.go
Normal file
@ -0,0 +1,152 @@
|
|||||||
|
/*
|
||||||
|
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 cpumanager
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"sort"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
cadvisorapi "github.com/google/cadvisor/info/v1"
|
||||||
|
v1 "k8s.io/api/core/v1"
|
||||||
|
"k8s.io/kubernetes/pkg/kubelet/cm/cpuset"
|
||||||
|
"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager"
|
||||||
|
"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/socketmask"
|
||||||
|
)
|
||||||
|
|
||||||
|
func topologyHintLessThan(a topologymanager.TopologyHint, b topologymanager.TopologyHint) bool {
|
||||||
|
if a.Preferred != b.Preferred {
|
||||||
|
return a.Preferred == true
|
||||||
|
}
|
||||||
|
return a.SocketAffinity.IsNarrowerThan(b.SocketAffinity)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestGetTopologyHints(t *testing.T) {
|
||||||
|
testPod1 := makePod("2", "2")
|
||||||
|
testContainer1 := &testPod1.Spec.Containers[0]
|
||||||
|
testPod2 := makePod("5", "5")
|
||||||
|
testContainer2 := &testPod2.Spec.Containers[0]
|
||||||
|
testPod3 := makePod("7", "7")
|
||||||
|
testContainer3 := &testPod3.Spec.Containers[0]
|
||||||
|
testPod4 := makePod("11", "11")
|
||||||
|
testContainer4 := &testPod4.Spec.Containers[0]
|
||||||
|
|
||||||
|
firstSocketMask, _ := socketmask.NewSocketMask(0)
|
||||||
|
secondSocketMask, _ := socketmask.NewSocketMask(1)
|
||||||
|
crossSocketMask, _ := socketmask.NewSocketMask(0, 1)
|
||||||
|
|
||||||
|
m := manager{
|
||||||
|
policy: &staticPolicy{},
|
||||||
|
machineInfo: &cadvisorapi.MachineInfo{
|
||||||
|
NumCores: 12,
|
||||||
|
Topology: []cadvisorapi.Node{
|
||||||
|
{Id: 0,
|
||||||
|
Cores: []cadvisorapi.Core{
|
||||||
|
{Id: 0, Threads: []int{0, 6}},
|
||||||
|
{Id: 1, Threads: []int{1, 7}},
|
||||||
|
{Id: 2, Threads: []int{2, 8}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{Id: 1,
|
||||||
|
Cores: []cadvisorapi.Core{
|
||||||
|
{Id: 0, Threads: []int{3, 9}},
|
||||||
|
{Id: 1, Threads: []int{4, 10}},
|
||||||
|
{Id: 2, Threads: []int{5, 11}},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
state: &mockState{
|
||||||
|
defaultCPUSet: cpuset.NewCPUSet(2, 3, 4, 5, 6, 7, 8, 9, 10, 11),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
tcases := []struct {
|
||||||
|
name string
|
||||||
|
pod v1.Pod
|
||||||
|
container v1.Container
|
||||||
|
expectedHints []topologymanager.TopologyHint
|
||||||
|
}{
|
||||||
|
{
|
||||||
|
name: "Request 2 CPUs; 4 available on Socket 0, 6 available on Socket 1",
|
||||||
|
pod: *testPod1,
|
||||||
|
container: *testContainer1,
|
||||||
|
expectedHints: []topologymanager.TopologyHint{
|
||||||
|
{
|
||||||
|
SocketAffinity: firstSocketMask,
|
||||||
|
Preferred: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SocketAffinity: secondSocketMask,
|
||||||
|
Preferred: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SocketAffinity: crossSocketMask,
|
||||||
|
Preferred: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Request 5 CPUs; 4 available on Socket 0, 6 available on Socket 1",
|
||||||
|
pod: *testPod2,
|
||||||
|
container: *testContainer2,
|
||||||
|
expectedHints: []topologymanager.TopologyHint{
|
||||||
|
{
|
||||||
|
SocketAffinity: secondSocketMask,
|
||||||
|
Preferred: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
SocketAffinity: crossSocketMask,
|
||||||
|
Preferred: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Request 7 CPUs, 4 available on Socket 0, 6 available on Socket 1",
|
||||||
|
pod: *testPod3,
|
||||||
|
container: *testContainer3,
|
||||||
|
expectedHints: []topologymanager.TopologyHint{
|
||||||
|
{
|
||||||
|
SocketAffinity: crossSocketMask,
|
||||||
|
Preferred: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "Request 11 CPUs, 4 available on Socket 0, 6 available on Socket 1",
|
||||||
|
pod: *testPod4,
|
||||||
|
container: *testContainer4,
|
||||||
|
expectedHints: []topologymanager.TopologyHint{},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
for _, tc := range tcases {
|
||||||
|
hints := m.GetTopologyHints(tc.pod, tc.container)
|
||||||
|
if len(tc.expectedHints) == 0 && len(hints) == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
sort.SliceStable(hints, func(i, j int) bool {
|
||||||
|
return topologyHintLessThan(hints[i], hints[j])
|
||||||
|
})
|
||||||
|
sort.SliceStable(tc.expectedHints, func(i, j int) bool {
|
||||||
|
return topologyHintLessThan(tc.expectedHints[i], tc.expectedHints[j])
|
||||||
|
})
|
||||||
|
if !reflect.DeepEqual(tc.expectedHints, hints) {
|
||||||
|
t.Errorf("Expected in result to be %v , got %v", tc.expectedHints, hints)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user