package overcommit
import (
"testing"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/equality"
"volcano.sh/apis/pkg/apis/scheduling"
schedulingv1 "volcano.sh/apis/pkg/apis/scheduling/v1beta1"
"volcano.sh/volcano/pkg/scheduler/api"
"volcano.sh/volcano/pkg/scheduler/conf"
"volcano.sh/volcano/pkg/scheduler/framework"
"volcano.sh/volcano/pkg/scheduler/uthelper"
"volcano.sh/volcano/pkg/scheduler/util"
)
func TestOvercommitPlugin(t *testing.T) {
n1 := util.BuildNode("n1", api.BuildResourceList("2", "4Gi"), make(map[string]string))
n2 := util.BuildNode("n2", api.BuildResourceList("4", "16Gi"), make(map[string]string))
hugeResource := api.BuildResourceList("20000m", "20G")
normalResource := api.BuildResourceList("2000m", "2G")
smallResource := api.BuildResourceList("200m", "0.5G")
pg1 := util.BuildPodGroup("pg1", "test-namespace", "c1", 2, nil, schedulingv1.PodGroupPhase(scheduling.PodGroupInqueue))
pg1.Spec.MinResources = &normalResource
pg2 := util.BuildPodGroup("pg2", "test-namespace", "c1", 2, nil, schedulingv1.PodGroupPhase(scheduling.PodGroupInqueue))
pg2.Spec.MinResources = &hugeResource
pg3 := util.BuildPodGroup("pg2", "test-namespace", "c1", 2, nil, schedulingv1.PodGroupPhase(scheduling.PodGroupInqueue))
queue1 := util.BuildQueue("c1", 1, nil)
queue2 := util.BuildQueue("c1", 1, smallResource)
tests := []struct {
uthelper.TestCommonStruct
arguments framework.Arguments
expectedEnqueueAble bool
}{
{
TestCommonStruct: uthelper.TestCommonStruct{
Name: "overCommitFactor is more than 0",
Plugins: map[string]framework.PluginBuilder{PluginName: New},
PodGroups: []*schedulingv1.PodGroup{pg1},
Queues: []*schedulingv1.Queue{queue1},
Nodes: []*v1.Node{n1, n2},
},
arguments: framework.Arguments{
overCommitFactor: 1.2,
},
expectedEnqueueAble: true,
},
{
TestCommonStruct: uthelper.TestCommonStruct{
Name: "overCommitFactor is less than 0",
Plugins: map[string]framework.PluginBuilder{PluginName: New},
PodGroups: []*schedulingv1.PodGroup{pg1},
Queues: []*schedulingv1.Queue{queue1},
Nodes: []*v1.Node{n1, n2},
},
arguments: framework.Arguments{
overCommitFactor: 0.8,
},
expectedEnqueueAble: true,
},
{
TestCommonStruct: uthelper.TestCommonStruct{
Name: "when the required resources of pg are too large",
Plugins: map[string]framework.PluginBuilder{PluginName: New},
PodGroups: []*schedulingv1.PodGroup{pg2},
Queues: []*schedulingv1.Queue{queue1},
Nodes: []*v1.Node{n1, n2},
},
arguments: framework.Arguments{
overCommitFactor: 1.2,
},
expectedEnqueueAble: false,
},
{
TestCommonStruct: uthelper.TestCommonStruct{
Name: "when pg does not fill MinResources",
Plugins: map[string]framework.PluginBuilder{PluginName: New},
PodGroups: []*schedulingv1.PodGroup{pg3},
Queues: []*schedulingv1.Queue{queue2},
Nodes: []*v1.Node{n1, n2},
},
arguments: framework.Arguments{
overCommitFactor: 1.2,
},
expectedEnqueueAble: true,
},
}
for _, test := range tests {
t.Run(test.Name, func(t *testing.T) {
trueValue := true
tiers := []conf.Tier{
{
Plugins: []conf.PluginOption{
{
Name: PluginName,
EnabledJobEnqueued: &trueValue,
Arguments: test.arguments,
},
},
},
}
ssn := test.RegisterSession(tiers, nil)
defer test.Close()
for _, job := range ssn.Jobs {
ssn.JobEnqueued(job)
isEnqueue := ssn.JobEnqueueable(job)
if !equality.Semantic.DeepEqual(test.expectedEnqueueAble, isEnqueue) {
t.Errorf("case: %s error, expect %v, but get %v", test.Name, test.expectedEnqueueAble, isEnqueue)
}
}
})
}
}