Merge pull request #80569 from klueska/upstream-get-topology-hints-map

Update GetTopologyHints() for TopologyManager Hint Providers to return a map
This commit is contained in:
Kubernetes Prow Robot 2019-08-20 00:15:34 -07:00 committed by GitHub
commit ddd45b7986
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 361 additions and 209 deletions

View File

@ -68,7 +68,7 @@ type Manager interface {
// GetTopologyHints implements the Topology Manager Interface and is // GetTopologyHints implements the Topology Manager Interface and is
// consulted to make Topology aware resource alignments // consulted to make Topology aware resource alignments
GetTopologyHints(pod v1.Pod, container v1.Container) []topologymanager.TopologyHint GetTopologyHints(pod v1.Pod, container v1.Container) map[string][]topologymanager.TopologyHint
} }
type manager struct { type manager struct {

View File

@ -47,9 +47,9 @@ func (m *fakeManager) RemoveContainer(containerID string) error {
return nil return nil
} }
func (m *fakeManager) GetTopologyHints(pod v1.Pod, container v1.Container) []topologymanager.TopologyHint { func (m *fakeManager) GetTopologyHints(pod v1.Pod, container v1.Container) map[string][]topologymanager.TopologyHint {
klog.Infof("[fake cpumanager] Get Topology Hints") klog.Infof("[fake cpumanager] Get Topology Hints")
return []topologymanager.TopologyHint{} return map[string][]topologymanager.TopologyHint{}
} }
func (m *fakeManager) State() state.Reader { func (m *fakeManager) State() state.Reader {

View File

@ -26,7 +26,7 @@ import (
"k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/socketmask" "k8s.io/kubernetes/pkg/kubelet/cm/topologymanager/socketmask"
) )
func (m *manager) GetTopologyHints(pod v1.Pod, container v1.Container) []topologymanager.TopologyHint { func (m *manager) GetTopologyHints(pod v1.Pod, container v1.Container) map[string][]topologymanager.TopologyHint {
// The 'none' policy does not generate topology hints. // The 'none' policy does not generate topology hints.
if m.policy.Name() == string(PolicyNone) { if m.policy.Name() == string(PolicyNone) {
return nil return nil
@ -60,7 +60,9 @@ func (m *manager) GetTopologyHints(pod v1.Pod, container v1.Container) []topolog
cpuHints := m.generateCPUTopologyHints(available, requested) cpuHints := m.generateCPUTopologyHints(available, requested)
klog.Infof("[cpumanager] TopologyHints generated for pod '%v', container '%v': %v", pod.Name, container.Name, cpuHints) klog.Infof("[cpumanager] TopologyHints generated for pod '%v', container '%v': %v", pod.Name, container.Name, cpuHints)
return cpuHints return map[string][]topologymanager.TopologyHint{
string(v1.ResourceCPU): cpuHints,
}
} }
// generateCPUtopologyHints generates a set of TopologyHints given the set of // generateCPUtopologyHints generates a set of TopologyHints given the set of

View File

@ -130,11 +130,11 @@ func TestGetTopologyHints(t *testing.T) {
name: "Request 11 CPUs, 4 available on Socket 0, 6 available on Socket 1", name: "Request 11 CPUs, 4 available on Socket 0, 6 available on Socket 1",
pod: *testPod4, pod: *testPod4,
container: *testContainer4, container: *testContainer4,
expectedHints: []topologymanager.TopologyHint{}, expectedHints: nil,
}, },
} }
for _, tc := range tcases { for _, tc := range tcases {
hints := m.GetTopologyHints(tc.pod, tc.container) hints := m.GetTopologyHints(tc.pod, tc.container)[string(v1.ResourceCPU)]
if len(tc.expectedHints) == 0 && len(hints) == 0 { if len(tc.expectedHints) == 0 && len(hints) == 0 {
continue continue
} }
@ -147,6 +147,5 @@ func TestGetTopologyHints(t *testing.T) {
if !reflect.DeepEqual(tc.expectedHints, hints) { if !reflect.DeepEqual(tc.expectedHints, hints) {
t.Errorf("Expected in result to be %v , got %v", tc.expectedHints, hints) t.Errorf("Expected in result to be %v , got %v", tc.expectedHints, hints)
} }
} }
} }

View File

@ -54,7 +54,7 @@ type manager struct {
//HintProvider interface is to be implemented by Hint Providers //HintProvider interface is to be implemented by Hint Providers
type HintProvider interface { type HintProvider interface {
GetTopologyHints(pod v1.Pod, container v1.Container) []TopologyHint GetTopologyHints(pod v1.Pod, container v1.Container) map[string][]TopologyHint
} }
//Store interface is to allow Hint Providers to retrieve pod affinity //Store interface is to allow Hint Providers to retrieve pod affinity
@ -164,16 +164,35 @@ func (m *manager) calculateAffinity(pod v1.Pod, container v1.Container) Topology
// Get the TopologyHints from a provider. // Get the TopologyHints from a provider.
hints := provider.GetTopologyHints(pod, container) hints := provider.GetTopologyHints(pod, container)
// If hints is nil, overwrite 'hints' with a preferred any-socket affinity. // If hints is nil, insert a single, preferred any-socket hint into allProviderHints.
if hints == nil || len(hints) == 0 { if hints == nil || len(hints) == 0 {
klog.Infof("[topologymanager] Hint Provider has no preference for socket affinity") klog.Infof("[topologymanager] Hint Provider has no preference for socket affinity with any resource")
affinity, _ := socketmask.NewSocketMask() affinity, _ := socketmask.NewSocketMask()
affinity.Fill() affinity.Fill()
hints = []TopologyHint{{affinity, true}} allProviderHints = append(allProviderHints, []TopologyHint{{affinity, true}})
continue
} }
// Accumulate the sorted hints into a [][]TopologyHint slice // Otherwise, accumulate the hints for each resource type into allProviderHints.
allProviderHints = append(allProviderHints, hints) for resource := range hints {
if hints[resource] == nil {
klog.Infof("[topologymanager] Hint Provider has no preference for socket affinity with resource '%s'", resource)
affinity, _ := socketmask.NewSocketMask()
affinity.Fill()
allProviderHints = append(allProviderHints, []TopologyHint{{affinity, true}})
continue
}
if len(hints[resource]) == 0 {
klog.Infof("[topologymanager] Hint Provider has no possible socket affinities for resource '%s'", resource)
affinity, _ := socketmask.NewSocketMask()
affinity.Fill()
allProviderHints = append(allProviderHints, []TopologyHint{{affinity, false}})
continue
}
allProviderHints = append(allProviderHints, hints[resource])
}
} }
// Iterate over all permutations of hints in 'allProviderHints'. Merge the // Iterate over all permutations of hints in 'allProviderHints'. Merge the

View File

@ -80,10 +80,10 @@ func TestNewManager(t *testing.T) {
} }
type mockHintProvider struct { type mockHintProvider struct {
th []TopologyHint th map[string][]TopologyHint
} }
func (m *mockHintProvider) GetTopologyHints(pod v1.Pod, container v1.Container) []TopologyHint { func (m *mockHintProvider) GetTopologyHints(pod v1.Pod, container v1.Container) map[string][]TopologyHint {
return m.th return m.th
} }
@ -125,10 +125,10 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
{ {
name: "HintProvider returns empty non-nil []TopologyHint", name: "HintProvider returns empty non-nil map[string][]TopologyHint",
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{}, map[string][]TopologyHint{},
}, },
}, },
expected: TopologyHint{ expected: TopologyHint{
@ -136,12 +136,40 @@ func TestCalculateAffinity(t *testing.T) {
Preferred: true, Preferred: true,
}, },
}, },
{
name: "HintProvider returns -nil map[string][]TopologyHint from provider",
hp: []HintProvider{
&mockHintProvider{
map[string][]TopologyHint{
"resource": nil,
},
},
},
expected: TopologyHint{
SocketAffinity: NewTestSocketMaskFull(),
Preferred: true,
},
},
{
name: "HintProvider returns empty non-nil map[string][]TopologyHint from provider",
hp: []HintProvider{
&mockHintProvider{
map[string][]TopologyHint{
"resource": {},
},
},
},
expected: TopologyHint{
SocketAffinity: NewTestSocketMaskFull(),
Preferred: false,
},
},
{ {
name: "Single TopologyHint with Preferred as true and SocketAffinity as nil", name: "Single TopologyHint with Preferred as true and SocketAffinity as nil",
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource": {
{ {
SocketAffinity: nil, SocketAffinity: nil,
Preferred: true, Preferred: true,
@ -149,6 +177,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMaskFull(), SocketAffinity: NewTestSocketMaskFull(),
Preferred: true, Preferred: true,
@ -158,7 +187,8 @@ func TestCalculateAffinity(t *testing.T) {
name: "Single TopologyHint with Preferred as false and SocketAffinity as nil", name: "Single TopologyHint with Preferred as false and SocketAffinity as nil",
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource": {
{ {
SocketAffinity: nil, SocketAffinity: nil,
Preferred: false, Preferred: false,
@ -166,6 +196,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMaskFull(), SocketAffinity: NewTestSocketMaskFull(),
Preferred: true, Preferred: true,
@ -175,15 +206,18 @@ func TestCalculateAffinity(t *testing.T) {
name: "Two providers, 1 hint each, same mask, both preferred 1/2", name: "Two providers, 1 hint each, same mask, both preferred 1/2",
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource1": {
{ {
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
}, },
}, },
},
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource2": {
{ {
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
@ -191,6 +225,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
@ -200,15 +235,18 @@ func TestCalculateAffinity(t *testing.T) {
name: "Two providers, 1 hint each, same mask, both preferred 2/2", name: "Two providers, 1 hint each, same mask, both preferred 2/2",
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource1": {
{ {
SocketAffinity: NewTestSocketMask(1), SocketAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
}, },
},
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource2": {
{ {
SocketAffinity: NewTestSocketMask(1), SocketAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
@ -216,6 +254,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(1), SocketAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
@ -225,15 +264,18 @@ func TestCalculateAffinity(t *testing.T) {
name: "Two providers, 1 hint each, 1 wider mask, both preferred 1/2", name: "Two providers, 1 hint each, 1 wider mask, both preferred 1/2",
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource1": {
{ {
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
}, },
}, },
},
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource2": {
{ {
SocketAffinity: NewTestSocketMask(0, 1), SocketAffinity: NewTestSocketMask(0, 1),
Preferred: true, Preferred: true,
@ -241,6 +283,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
@ -250,15 +293,18 @@ func TestCalculateAffinity(t *testing.T) {
name: "Two providers, 1 hint each, 1 wider mask, both preferred 1/2", name: "Two providers, 1 hint each, 1 wider mask, both preferred 1/2",
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource1": {
{ {
SocketAffinity: NewTestSocketMask(1), SocketAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
}, },
},
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource2": {
{ {
SocketAffinity: NewTestSocketMask(0, 1), SocketAffinity: NewTestSocketMask(0, 1),
Preferred: true, Preferred: true,
@ -266,6 +312,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(1), SocketAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
@ -275,15 +322,18 @@ func TestCalculateAffinity(t *testing.T) {
name: "Two providers, 1 hint each, no common mask", name: "Two providers, 1 hint each, no common mask",
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource1": {
{ {
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
}, },
}, },
},
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource2": {
{ {
SocketAffinity: NewTestSocketMask(1), SocketAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
@ -291,6 +341,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMaskFull(), SocketAffinity: NewTestSocketMaskFull(),
Preferred: false, Preferred: false,
@ -300,15 +351,18 @@ func TestCalculateAffinity(t *testing.T) {
name: "Two providers, 1 hint each, same mask, 1 preferred, 1 not 1/2", name: "Two providers, 1 hint each, same mask, 1 preferred, 1 not 1/2",
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource1": {
{ {
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
}, },
}, },
}, },
},
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource2": {
{ {
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: false, Preferred: false,
@ -316,6 +370,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: false, Preferred: false,
@ -325,15 +380,18 @@ func TestCalculateAffinity(t *testing.T) {
name: "Two providers, 1 hint each, same mask, 1 preferred, 1 not 2/2", name: "Two providers, 1 hint each, same mask, 1 preferred, 1 not 2/2",
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource1": {
{ {
SocketAffinity: NewTestSocketMask(1), SocketAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
}, },
}, },
}, },
},
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource2": {
{ {
SocketAffinity: NewTestSocketMask(1), SocketAffinity: NewTestSocketMask(1),
Preferred: false, Preferred: false,
@ -341,6 +399,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(1), SocketAffinity: NewTestSocketMask(1),
Preferred: false, Preferred: false,
@ -351,7 +410,8 @@ func TestCalculateAffinity(t *testing.T) {
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{}, &mockHintProvider{},
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource": {
{ {
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
@ -359,6 +419,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
@ -369,7 +430,8 @@ func TestCalculateAffinity(t *testing.T) {
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{}, &mockHintProvider{},
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource": {
{ {
SocketAffinity: NewTestSocketMask(1), SocketAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
@ -377,6 +439,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(1), SocketAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
@ -386,7 +449,8 @@ func TestCalculateAffinity(t *testing.T) {
name: "Two providers, 1 with 2 hints, 1 with single hint matching 1/2", name: "Two providers, 1 with 2 hints, 1 with single hint matching 1/2",
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource1": {
{ {
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
@ -397,8 +461,10 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource2": {
{ {
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
@ -406,6 +472,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
@ -415,7 +482,8 @@ func TestCalculateAffinity(t *testing.T) {
name: "Two providers, 1 with 2 hints, 1 with single hint matching 2/2", name: "Two providers, 1 with 2 hints, 1 with single hint matching 2/2",
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource1": {
{ {
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
@ -426,8 +494,10 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource2": {
{ {
SocketAffinity: NewTestSocketMask(1), SocketAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
@ -435,6 +505,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(1), SocketAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
@ -444,7 +515,8 @@ func TestCalculateAffinity(t *testing.T) {
name: "Two providers, 1 with 2 hints, 1 with single non-preferred hint matching", name: "Two providers, 1 with 2 hints, 1 with single non-preferred hint matching",
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource1": {
{ {
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
@ -455,8 +527,10 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource2": {
{ {
SocketAffinity: NewTestSocketMask(0, 1), SocketAffinity: NewTestSocketMask(0, 1),
Preferred: false, Preferred: false,
@ -464,6 +538,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: false, Preferred: false,
@ -473,7 +548,8 @@ func TestCalculateAffinity(t *testing.T) {
name: "Two providers, both with 2 hints, matching narrower preferred hint from both", name: "Two providers, both with 2 hints, matching narrower preferred hint from both",
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource1": {
{ {
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
@ -484,8 +560,10 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource2": {
{ {
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
@ -497,6 +575,7 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
@ -506,7 +585,8 @@ func TestCalculateAffinity(t *testing.T) {
name: "Ensure less narrow preferred hints are chosen over narrower non-preferred hints", name: "Ensure less narrow preferred hints are chosen over narrower non-preferred hints",
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource1": {
{ {
SocketAffinity: NewTestSocketMask(1), SocketAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
@ -517,8 +597,10 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource2": {
{ {
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
@ -534,6 +616,44 @@ func TestCalculateAffinity(t *testing.T) {
}, },
}, },
}, },
},
expected: TopologyHint{
SocketAffinity: NewTestSocketMask(1),
Preferred: true,
},
},
{
name: "Multiple resources, same provider",
hp: []HintProvider{
&mockHintProvider{
map[string][]TopologyHint{
"resource1": {
{
SocketAffinity: NewTestSocketMask(1),
Preferred: true,
},
{
SocketAffinity: NewTestSocketMask(0, 1),
Preferred: false,
},
},
"resource2": {
{
SocketAffinity: NewTestSocketMask(0),
Preferred: true,
},
{
SocketAffinity: NewTestSocketMask(1),
Preferred: true,
},
{
SocketAffinity: NewTestSocketMask(0, 1),
Preferred: false,
},
},
},
},
},
expected: TopologyHint{ expected: TopologyHint{
SocketAffinity: NewTestSocketMask(1), SocketAffinity: NewTestSocketMask(1),
Preferred: true, Preferred: true,
@ -678,7 +798,8 @@ func TestAdmit(t *testing.T) {
policy: NewBestEffortPolicy(), policy: NewBestEffortPolicy(),
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource": {
{ {
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
@ -690,6 +811,7 @@ func TestAdmit(t *testing.T) {
}, },
}, },
}, },
},
expected: true, expected: true,
}, },
{ {
@ -698,7 +820,8 @@ func TestAdmit(t *testing.T) {
policy: NewBestEffortPolicy(), policy: NewBestEffortPolicy(),
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource": {
{ {
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
@ -714,6 +837,7 @@ func TestAdmit(t *testing.T) {
}, },
}, },
}, },
},
expected: true, expected: true,
}, },
{ {
@ -722,7 +846,8 @@ func TestAdmit(t *testing.T) {
policy: NewBestEffortPolicy(), policy: NewBestEffortPolicy(),
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource": {
{ {
SocketAffinity: NewTestSocketMask(0, 1), SocketAffinity: NewTestSocketMask(0, 1),
Preferred: false, Preferred: false,
@ -730,6 +855,7 @@ func TestAdmit(t *testing.T) {
}, },
}, },
}, },
},
expected: true, expected: true,
}, },
{ {
@ -738,7 +864,8 @@ func TestAdmit(t *testing.T) {
policy: NewStrictPolicy(), policy: NewStrictPolicy(),
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource": {
{ {
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
@ -750,6 +877,7 @@ func TestAdmit(t *testing.T) {
}, },
}, },
}, },
},
expected: true, expected: true,
}, },
{ {
@ -758,7 +886,8 @@ func TestAdmit(t *testing.T) {
policy: NewStrictPolicy(), policy: NewStrictPolicy(),
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource": {
{ {
SocketAffinity: NewTestSocketMask(0), SocketAffinity: NewTestSocketMask(0),
Preferred: true, Preferred: true,
@ -774,6 +903,7 @@ func TestAdmit(t *testing.T) {
}, },
}, },
}, },
},
expected: true, expected: true,
}, },
{ {
@ -782,7 +912,8 @@ func TestAdmit(t *testing.T) {
policy: NewStrictPolicy(), policy: NewStrictPolicy(),
hp: []HintProvider{ hp: []HintProvider{
&mockHintProvider{ &mockHintProvider{
[]TopologyHint{ map[string][]TopologyHint{
"resource": {
{ {
SocketAffinity: NewTestSocketMask(0, 1), SocketAffinity: NewTestSocketMask(0, 1),
Preferred: false, Preferred: false,
@ -790,6 +921,7 @@ func TestAdmit(t *testing.T) {
}, },
}, },
}, },
},
expected: false, expected: false,
}, },
} }