Files
core/cluster/resources_test.go
Ingo Oppermann 2dbe5b5685 Add GPU support
2024-10-24 15:08:26 +02:00

604 lines
9.7 KiB
Go

package cluster
import (
"testing"
"github.com/datarhei/core/v16/cluster/node"
"github.com/stretchr/testify/require"
)
func TestResources(t *testing.T) {
r := Resources{
CPU: 1,
Mem: 1,
}
require.False(t, r.HasGPU())
r.GPU = ResourcesGPU{
Index: 0,
Usage: 1,
Encoder: 0,
Decoder: 0,
Mem: 1,
}
require.True(t, r.HasGPU())
}
func TestResourcePlanner(t *testing.T) {
nodes := map[string]node.About{
"node1": {
State: "online",
Resources: node.Resources{
NCPU: 1,
CPU: 7,
Mem: 35,
CPULimit: 90,
MemLimit: 90,
},
},
"node2": {
State: "online",
Resources: node.Resources{
NCPU: 1,
CPU: 85,
Mem: 11,
CPULimit: 90,
MemLimit: 90,
},
},
}
planner := NewResourcePlanner(nodes)
require.Equal(t, map[string]node.Resources{
"node1": {
NCPU: 1,
CPU: 7,
Mem: 35,
CPULimit: 90,
MemLimit: 90,
},
"node2": {
NCPU: 1,
CPU: 85,
Mem: 11,
CPULimit: 90,
MemLimit: 90,
},
}, planner.Map())
}
func TestResourcePlannerBlocked(t *testing.T) {
nodes := map[string]node.About{
"node1": {
State: "degraded",
Resources: node.Resources{
NCPU: 1,
CPU: 7,
Mem: 35,
CPULimit: 90,
MemLimit: 90,
},
},
"node2": {
State: "online",
Resources: node.Resources{
NCPU: 1,
CPU: 85,
Mem: 11,
CPULimit: 90,
MemLimit: 90,
},
},
}
planner := NewResourcePlanner(nodes)
require.Equal(t, []string{"node1"}, planner.Blocked())
}
func TestResourcePlannerThrottling(t *testing.T) {
nodes := map[string]node.About{
"node1": {
State: "online",
Resources: node.Resources{
NCPU: 1,
CPU: 7,
Mem: 35,
CPULimit: 90,
MemLimit: 90,
},
},
"node2": {
State: "online",
Resources: node.Resources{
NCPU: 1,
CPU: 85,
Mem: 11,
CPULimit: 90,
MemLimit: 90,
},
},
}
planner := NewResourcePlanner(nodes)
require.True(t, planner.HasNodeEnough("node1", Resources{
CPU: 30,
Mem: 5,
}))
planner.Throttling("node1", true)
require.False(t, planner.HasNodeEnough("node1", Resources{
CPU: 30,
Mem: 5,
}))
planner.Throttling("node1", false)
require.True(t, planner.HasNodeEnough("node1", Resources{
CPU: 30,
Mem: 5,
}))
}
func TestRecourcePlannerHasNodeEnough(t *testing.T) {
nodes := map[string]node.About{
"node1": {
State: "online",
Resources: node.Resources{
NCPU: 1,
CPU: 7,
Mem: 35,
CPULimit: 90,
MemLimit: 90,
GPU: []node.ResourcesGPU{
{
Mem: 5,
MemLimit: 90,
Usage: 53,
UsageLimit: 90,
Encoder: 32,
Decoder: 26,
},
{
Mem: 85,
MemLimit: 90,
Usage: 64,
UsageLimit: 90,
Encoder: 43,
Decoder: 12,
},
},
},
},
"node2": {
State: "online",
Resources: node.Resources{
NCPU: 1,
CPU: 85,
Mem: 11,
CPULimit: 90,
MemLimit: 90,
GPU: []node.ResourcesGPU{
{
Mem: 5,
MemLimit: 90,
Usage: 53,
UsageLimit: 90,
Encoder: 32,
Decoder: 26,
},
},
},
},
}
planner := NewResourcePlanner(nodes)
require.True(t, planner.HasNodeEnough("node1", Resources{
CPU: 30,
Mem: 5,
}))
require.False(t, planner.HasNodeEnough("node2", Resources{
CPU: 30,
Mem: 5,
}))
require.True(t, planner.HasNodeEnough("node1", Resources{
CPU: 30,
Mem: 5,
GPU: ResourcesGPU{
Usage: 0,
Encoder: 0,
Decoder: 0,
Mem: 50,
},
}))
require.False(t, planner.HasNodeEnough("node1", Resources{
CPU: 30,
Mem: 5,
GPU: ResourcesGPU{
Usage: 0,
Encoder: 0,
Decoder: 0,
Mem: 86,
},
}))
require.True(t, planner.HasNodeEnough("node1", Resources{
CPU: 30,
Mem: 5,
GPU: ResourcesGPU{
Usage: 0,
Encoder: 50,
Decoder: 0,
Mem: 50,
},
}))
}
func TestResourcePlannerAdd(t *testing.T) {
nodes := map[string]node.About{
"node1": {
State: "online",
Resources: node.Resources{
NCPU: 1,
CPU: 7,
Mem: 35,
CPULimit: 90,
MemLimit: 90,
},
},
}
planner := NewResourcePlanner(nodes)
planner.Add("node1", Resources{
CPU: 42,
Mem: 33,
})
require.Equal(t, map[string]node.Resources{
"node1": {
NCPU: 1,
CPU: 49,
Mem: 68,
CPULimit: 90,
MemLimit: 90,
},
}, planner.Map())
}
func TestResourcePlannerNoGPUAddGPU(t *testing.T) {
nodes := map[string]node.About{
"node1": {
State: "online",
Resources: node.Resources{
NCPU: 1,
CPU: 7,
Mem: 35,
CPULimit: 90,
MemLimit: 90,
},
},
}
planner := NewResourcePlanner(nodes)
planner.Add("node1", Resources{
CPU: 42,
Mem: 33,
GPU: ResourcesGPU{
Index: 0,
Usage: 1,
Encoder: 2,
Decoder: 3,
Mem: 4,
},
})
require.Equal(t, map[string]node.Resources{
"node1": {
NCPU: 1,
CPU: 49,
Mem: 68,
CPULimit: 90,
MemLimit: 90,
},
}, planner.Map())
}
func TestResourcePlannerAddGPU(t *testing.T) {
nodes := map[string]node.About{
"node1": {
State: "online",
Resources: node.Resources{
NCPU: 1,
CPU: 7,
Mem: 35,
CPULimit: 90,
MemLimit: 90,
GPU: []node.ResourcesGPU{
{
Mem: 0,
MemLimit: 0,
Usage: 0,
UsageLimit: 0,
Encoder: 0,
Decoder: 0,
},
{
Mem: 0,
MemLimit: 100,
Usage: 0,
UsageLimit: 100,
Encoder: 0,
Decoder: 0,
},
},
},
},
}
planner := NewResourcePlanner(nodes)
planner.Add("node1", Resources{
CPU: 42,
Mem: 33,
GPU: ResourcesGPU{
Usage: 1,
Encoder: 2,
Decoder: 3,
Mem: 4,
},
})
require.Equal(t, map[string]node.Resources{
"node1": {
NCPU: 1,
CPU: 49,
Mem: 68,
CPULimit: 90,
MemLimit: 90,
GPU: []node.ResourcesGPU{
{
Mem: 0,
MemLimit: 0,
Usage: 0,
UsageLimit: 0,
Encoder: 0,
Decoder: 0,
},
{
Mem: 4,
MemLimit: 100,
Usage: 1,
UsageLimit: 100,
Encoder: 2,
Decoder: 3,
},
},
},
}, planner.Map())
}
func TestResourcePlannerRemove(t *testing.T) {
nodes := map[string]node.About{
"node1": {
State: "online",
Resources: node.Resources{
NCPU: 1,
CPU: 53,
Mem: 35,
CPULimit: 90,
MemLimit: 90,
},
},
}
planner := NewResourcePlanner(nodes)
planner.Remove("node1", Resources{
CPU: 13,
Mem: 20,
})
require.Equal(t, map[string]node.Resources{
"node1": {
NCPU: 1,
CPU: 40,
Mem: 15,
CPULimit: 90,
MemLimit: 90,
},
}, planner.Map())
}
func TestResourcePlannerRemoveTooMuch(t *testing.T) {
nodes := map[string]node.About{
"node1": {
State: "online",
Resources: node.Resources{
NCPU: 1,
CPU: 53,
Mem: 35,
CPULimit: 90,
MemLimit: 90,
},
},
}
planner := NewResourcePlanner(nodes)
planner.Remove("node1", Resources{
CPU: 100,
Mem: 100,
})
require.Equal(t, map[string]node.Resources{
"node1": {
NCPU: 1,
CPU: 0,
Mem: 0,
CPULimit: 90,
MemLimit: 90,
},
}, planner.Map())
}
func TestResourcePlannerRemoveGPU(t *testing.T) {
nodes := map[string]node.About{
"node1": {
State: "online",
Resources: node.Resources{
NCPU: 1,
CPU: 53,
Mem: 35,
CPULimit: 90,
MemLimit: 90,
GPU: []node.ResourcesGPU{
{
Mem: 4,
MemLimit: 100,
Usage: 1,
UsageLimit: 100,
Encoder: 2,
Decoder: 3,
},
{
Mem: 23,
MemLimit: 100,
Usage: 43,
UsageLimit: 100,
Encoder: 95,
Decoder: 12,
},
},
},
},
}
planner := NewResourcePlanner(nodes)
planner.Remove("node1", Resources{
CPU: 13,
Mem: 20,
GPU: ResourcesGPU{
Index: 1,
Usage: 3,
Encoder: 40,
Decoder: 0,
Mem: 5,
},
})
require.Equal(t, map[string]node.Resources{
"node1": {
NCPU: 1,
CPU: 40,
Mem: 15,
CPULimit: 90,
MemLimit: 90,
GPU: []node.ResourcesGPU{
{
Mem: 4,
MemLimit: 100,
Usage: 1,
UsageLimit: 100,
Encoder: 2,
Decoder: 3,
},
{
Mem: 18,
MemLimit: 100,
Usage: 40,
UsageLimit: 100,
Encoder: 55,
Decoder: 12,
},
},
},
}, planner.Map())
}
func TestResourcePlannerRemoveGPUTooMuch(t *testing.T) {
nodes := map[string]node.About{
"node1": {
State: "online",
Resources: node.Resources{
NCPU: 1,
CPU: 53,
Mem: 35,
CPULimit: 90,
MemLimit: 90,
GPU: []node.ResourcesGPU{
{
Mem: 4,
MemLimit: 100,
Usage: 1,
UsageLimit: 100,
Encoder: 2,
Decoder: 3,
},
{
Mem: 23,
MemLimit: 100,
Usage: 43,
UsageLimit: 100,
Encoder: 95,
Decoder: 12,
},
},
},
},
}
planner := NewResourcePlanner(nodes)
planner.Remove("node1", Resources{
CPU: 13,
Mem: 20,
GPU: ResourcesGPU{
Index: 1,
Usage: 100,
Encoder: 100,
Decoder: 100,
Mem: 100,
},
})
require.Equal(t, map[string]node.Resources{
"node1": {
NCPU: 1,
CPU: 40,
Mem: 15,
CPULimit: 90,
MemLimit: 90,
GPU: []node.ResourcesGPU{
{
Mem: 4,
MemLimit: 100,
Usage: 1,
UsageLimit: 100,
Encoder: 2,
Decoder: 3,
},
{
Mem: 0,
MemLimit: 100,
Usage: 0,
UsageLimit: 100,
Encoder: 0,
Decoder: 0,
},
},
},
}, planner.Map())
}