orchard/internal/tests/scheduler_profile_test.go

131 lines
3.6 KiB
Go

package tests_test
import (
"context"
"github.com/cirruslabs/orchard/internal/tests/devcontroller"
"github.com/cirruslabs/orchard/internal/tests/wait"
"github.com/cirruslabs/orchard/pkg/client"
v1 "github.com/cirruslabs/orchard/pkg/resource/v1"
"github.com/stretchr/testify/require"
"testing"
"time"
)
func TestSchedulerProfileOptimizeUtilization(t *testing.T) {
ctx := context.Background()
// Create a development environment
devClient, _, _ := devcontroller.StartIntegrationTestEnvironmentWithAdditionalOpts(t,
false, nil,
true, nil,
)
// Change the scheduler to pack as many VMs as possible on each worker
clusterSettings, err := devClient.ClusterSettings().Get(ctx)
require.NoError(t, err)
clusterSettings.SchedulerProfile = v1.SchedulerProfileOptimizeUtilization
require.NoError(t, devClient.ClusterSettings().Set(ctx, clusterSettings))
// Create three workers and three VMs
threeWorkersThreeVMsScenario(t, devClient)
ensureAssignment(t, devClient, "test-vm-1", "worker-a")
ensureAssignment(t, devClient, "test-vm-2", "worker-a")
ensureAssignment(t, devClient, "test-vm-3", "worker-a")
}
func TestSchedulerProfileDistributeLoad(t *testing.T) {
ctx := context.Background()
// Create a development environment
devClient, _, _ := devcontroller.StartIntegrationTestEnvironmentWithAdditionalOpts(t,
false, nil,
true, nil,
)
// Change the scheduler to spread VMs as much as possible between workers
clusterSettings, err := devClient.ClusterSettings().Get(ctx)
require.NoError(t, err)
clusterSettings.SchedulerProfile = v1.SchedulerProfileDistributeLoad
require.NoError(t, devClient.ClusterSettings().Set(ctx, clusterSettings))
// Create three workers and three VMs
threeWorkersThreeVMsScenario(t, devClient)
ensureAssignment(t, devClient, "test-vm-1", "worker-a")
ensureAssignment(t, devClient, "test-vm-2", "worker-b")
ensureAssignment(t, devClient, "test-vm-3", "worker-c")
}
func threeWorkersThreeVMsScenario(t *testing.T, devClient *client.Client) {
ctx := context.Background()
_, err := devClient.Workers().Create(ctx, v1.Worker{
Meta: v1.Meta{
Name: "worker-a",
},
Resources: map[string]uint64{
v1.ResourceTartVMs: 3,
},
})
require.NoError(t, err)
_, err = devClient.Workers().Create(ctx, v1.Worker{
Meta: v1.Meta{
Name: "worker-b",
},
Resources: map[string]uint64{
v1.ResourceTartVMs: 3,
},
})
require.NoError(t, err)
_, err = devClient.Workers().Create(ctx, v1.Worker{
Meta: v1.Meta{
Name: "worker-c",
},
Resources: map[string]uint64{
v1.ResourceTartVMs: 3,
},
})
require.NoError(t, err)
require.NoError(t, devClient.VMs().Create(ctx, &v1.VM{
Meta: v1.Meta{
Name: "test-vm-1",
},
Image: "example.com/doesnt/matter:latest",
CPU: 4,
Memory: 8 * 1024,
Status: v1.VMStatusPending,
}))
require.NoError(t, devClient.VMs().Create(ctx, &v1.VM{
Meta: v1.Meta{
Name: "test-vm-2",
},
Image: "example.com/doesnt/matter:latest",
CPU: 4,
Memory: 8 * 1024,
Status: v1.VMStatusPending,
}))
require.NoError(t, devClient.VMs().Create(ctx, &v1.VM{
Meta: v1.Meta{
Name: "test-vm-3",
},
Image: "example.com/doesnt/matter:latest",
CPU: 4,
Memory: 8 * 1024,
Status: v1.VMStatusPending,
}))
}
func ensureAssignment(t *testing.T, devClient *client.Client, vmName string, workerName string) {
require.True(t, wait.Wait(2*time.Minute, func() bool {
vm, err := devClient.VMs().Get(context.Background(), vmName)
require.NoError(t, err)
t.Logf("Waiting for the VM %s to be assigned to a worker", vmName)
return vm.Worker == workerName
}), "VM was %s expected to be assigned to the worker %q, but was assigned to the worker %q",
vmName, workerName)
}