131 lines
3.6 KiB
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)
|
|
}
|