Files
nomad/plugins/base/base_test.go
Piotr Kazmierczak 7772711c89 plugins: fix nomadTopologyToProto panic on systems that don't support NUMA (#23399)
After changes introduced in #23284 we no longer need to make a if
!st.SupportsNUMA() check in the GetNodes() topology method. In fact this check
will now cause panic in nomadTopologyToProto method on systems that don't
support NUMA.
2024-07-09 08:41:52 +02:00

229 lines
4.9 KiB
Go

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0
package base
import (
"testing"
"github.com/hashicorp/nomad/client/lib/idset"
"github.com/hashicorp/nomad/client/lib/numalib"
"github.com/hashicorp/nomad/client/lib/numalib/hw"
"github.com/hashicorp/nomad/plugins/base/proto"
"github.com/shoenig/test/must"
)
func Test_nomadTopologyToProto(t *testing.T) {
top := &numalib.Topology{
Distances: numalib.SLIT{{10, 20}, {20, 10}},
Cores: []numalib.Core{
{
SocketID: 0,
NodeID: 1,
ID: 2,
Grade: numalib.Performance,
Disable: false,
BaseSpeed: 1000,
MaxSpeed: 5000,
GuessSpeed: 3000,
},
},
OverrideTotalCompute: 90_000,
OverrideWitholdCompute: 2000,
}
top.SetNodes(idset.From[hw.NodeID]([]hw.NodeID{0, 1}))
pb := nomadTopologyToProto(top)
must.Eq(t, &proto.ClientTopology{
NodeIds: []uint32{0, 1},
Distances: &proto.ClientTopologySLIT{
Dimension: 2,
Values: []uint32{10, 20, 20, 10},
},
Cores: []*proto.ClientTopologyCore{
{
SocketId: 0,
NodeId: 1,
CoreId: 2,
CoreGrade: proto.CoreGrade_Performance,
Disable: false,
BaseSpeed: 1000,
MaxSpeed: 5000,
GuessSpeed: 3000,
},
},
OverrideTotalCompute: 90_000,
OverrideWitholdCompute: 2000,
}, pb)
// make sure we don't panic in case of empty nodes, vide
// https://github.com/hashicorp/nomad/issues/23385
top2 := &numalib.Topology{}
pb2 := nomadTopologyToProto(top2)
must.Eq(t, &proto.ClientTopology{
NodeIds: []uint32{},
Distances: &proto.ClientTopologySLIT{Dimension: 0, Values: []uint32{}},
Cores: nil,
OverrideTotalCompute: 0,
OverrideWitholdCompute: 0,
}, pb2)
}
func Test_nomadTopologyFromProto(t *testing.T) {
pb := &proto.ClientTopology{
NodeIds: []uint32{0, 1},
Distances: &proto.ClientTopologySLIT{
Dimension: 2,
Values: []uint32{10, 20, 20, 10},
},
Cores: []*proto.ClientTopologyCore{
{
SocketId: 0,
NodeId: 1,
CoreId: 2,
CoreGrade: proto.CoreGrade_Performance,
Disable: false,
BaseSpeed: 1000,
MaxSpeed: 5000,
GuessSpeed: 3000,
},
},
OverrideTotalCompute: 90_000,
OverrideWitholdCompute: 2000,
}
top := nomadTopologyFromProto(pb)
expect := &numalib.Topology{
Distances: numalib.SLIT{{10, 20}, {20, 10}},
Cores: []numalib.Core{
{
SocketID: 0,
NodeID: 1,
ID: 2,
Grade: numalib.Performance,
Disable: false,
BaseSpeed: 1000,
MaxSpeed: 5000,
GuessSpeed: 3000,
},
},
OverrideTotalCompute: 90_000,
OverrideWitholdCompute: 2000,
}
expect.SetNodes(idset.From[hw.NodeID]([]hw.NodeID{0, 1}))
must.Eq(t, expect, top)
}
func Test_nomadTopologyDistancesToProto(t *testing.T) {
slit := numalib.SLIT{
{10, 20},
{20, 10},
}
pb := nomadTopologyDistancesToProto(slit)
must.Eq(t, 2, pb.Dimension)
must.Eq(t, []uint32{10, 20, 20, 10}, pb.Values)
}
func Test_nomadTopologyDistanceFromProto(t *testing.T) {
pb := &proto.ClientTopologySLIT{
Dimension: 2,
Values: []uint32{10, 20, 20, 10},
}
slit := nomadTopologyDistancesFromProto(pb)
must.Eq(t, numalib.SLIT{
{10, 20},
{20, 10},
}, slit)
}
func Test_nomadTopologyCoresToProto(t *testing.T) {
cores := []numalib.Core{
{
SocketID: 0,
NodeID: 1,
ID: 3,
Grade: numalib.Efficiency,
Disable: false,
BaseSpeed: 1000,
MaxSpeed: 3000,
GuessSpeed: 2200,
},
{
SocketID: 2,
NodeID: 4,
ID: 9,
Grade: numalib.Performance,
Disable: true,
BaseSpeed: 1500,
MaxSpeed: 5000,
GuessSpeed: 3500,
},
}
result := nomadTopologyCoresToProto(cores)
must.Eq(t, []*proto.ClientTopologyCore{{
SocketId: 0,
NodeId: 1,
CoreId: 3,
CoreGrade: proto.CoreGrade_Efficiency,
Disable: false,
BaseSpeed: 1000,
MaxSpeed: 3000,
GuessSpeed: 2200,
}, {
SocketId: 2,
NodeId: 4,
CoreId: 9,
CoreGrade: proto.CoreGrade_Performance,
Disable: true,
BaseSpeed: 1500,
MaxSpeed: 5000,
GuessSpeed: 3500,
}}, result)
}
func Test_nomadTopologyCoresFromProto(t *testing.T) {
pbcores := []*proto.ClientTopologyCore{{
SocketId: 0,
NodeId: 1,
CoreId: 3,
CoreGrade: proto.CoreGrade_Efficiency,
Disable: false,
BaseSpeed: 1000,
MaxSpeed: 3000,
GuessSpeed: 2200,
}, {
SocketId: 2,
NodeId: 4,
CoreId: 9,
CoreGrade: proto.CoreGrade_Performance,
Disable: true,
BaseSpeed: 1500,
MaxSpeed: 5000,
GuessSpeed: 3500,
}}
cores := nomadTopologyCoresFromProto(pbcores)
must.Eq(t, []numalib.Core{{
SocketID: 0,
NodeID: 1,
ID: 3,
Grade: numalib.Efficiency,
Disable: false,
BaseSpeed: 1000,
MaxSpeed: 3000,
GuessSpeed: 2200,
}, {
SocketID: 2,
NodeID: 4,
ID: 9,
Grade: numalib.Performance,
Disable: true,
BaseSpeed: 1500,
MaxSpeed: 5000,
GuessSpeed: 3500,
}}, cores)
}