Skip to content

Commit

Permalink
feat: add e2e test
Browse files Browse the repository at this point in the history
Signed-off-by: Rui-Gan <ganrui.cs@gmail.com>
  • Loading branch information
Rui-Gan committed Oct 16, 2024
1 parent 85be62a commit 005ab18
Show file tree
Hide file tree
Showing 7 changed files with 286 additions and 8 deletions.
10 changes: 5 additions & 5 deletions hack/run-e2e-kind.sh
Original file line number Diff line number Diff line change
Expand Up @@ -83,14 +83,14 @@ function show-log() {

# clean up
function cleanup {
uninstall-volcano
# uninstall-volcano

echo "Running kind: [kind delete cluster ${CLUSTER_CONTEXT}]"
kind delete cluster ${CLUSTER_CONTEXT}
# kind delete cluster ${CLUSTER_CONTEXT}

if [[ ${SHOW_VOLCANO_LOGS} -eq 1 ]]; then
show-log
fi
# if [[ ${SHOW_VOLCANO_LOGS} -eq 1 ]]; then
# show-log
# fi
}

echo $* | grep -E -q "\-\-help|\-h"
Expand Down
97 changes: 97 additions & 0 deletions test/e2e/jobp/admission.go
Original file line number Diff line number Diff line change
Expand Up @@ -1349,6 +1349,103 @@ var _ = ginkgo.Describe("Job E2E Test: Test Admission service", func() {
gomega.Expect(err).To(gomega.HaveOccurred())
})

ginkgo.It("job validate check: create job with root queue", func() {
ctx := e2eutil.InitTestContext(e2eutil.Options{})
defer e2eutil.CleanupTestContext(ctx)

var job v1alpha1.Job
jsonData := []byte(`{
"apiVersion": "batch.volcano.sh/v1alpha1",
"kind": "Job",
"metadata": {
"name": "test-job"
},
"spec": {
"minAvailable": 1,
"queue": "root",
"tasks": [
{
"replicas": 2,
"template": {
"spec": {
"containers": [
{
"image": "nginx",
"imagePullPolicy": "IfNotPresent",
"name": "nginx",
"resources": {
"requests": {
"cpu": "1"
}
}
}
],
"restartPolicy": "Never"
}
}
}
]
}
}`)
err := json.Unmarshal(jsonData, &job)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
_, err = ctx.Vcclient.BatchV1alpha1().Jobs(ctx.Namespace).Create(context.TODO(), &job, v1.CreateOptions{})
gomega.Expect(err).To(gomega.HaveOccurred())
})

ginkgo.It("job validate check: create job with non-leaf queue", func() {

ctx := e2eutil.InitTestContext(e2eutil.Options{
Queues: []string{"q1", "q11"},
QueueParent: map[string]string{
"q1": "root",
"q11": "q1",
},
})
defer e2eutil.CleanupTestContext(ctx)

var job v1alpha1.Job
jsonData := []byte(`{
"apiVersion": "batch.volcano.sh/v1alpha1",
"kind": "Job",
"metadata": {
"name": "test-job"
},
"spec": {
"minAvailable": 1,
"queue": "q1",
"tasks": [
{
"replicas": 2,
"template": {
"spec": {
"containers": [
{
"image": "nginx",
"imagePullPolicy": "IfNotPresent",
"name": "nginx",
"resources": {
"requests": {
"cpu": "1"
}
}
}
],
"restartPolicy": "Never"
}
}
}
]
}
}`)
err := json.Unmarshal(jsonData, &job)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
_, err = ctx.Vcclient.BatchV1alpha1().Jobs(ctx.Namespace).Create(context.TODO(), &job, v1.CreateOptions{})
gomega.Expect(err).To(gomega.HaveOccurred())

e2eutil.DeleteQueue(ctx, "q11")
})

ginkgo.It("job validate check: create job with priviledged container", func() {
ctx := e2eutil.InitTestContext(e2eutil.Options{})
defer e2eutil.CleanupTestContext(ctx)
Expand Down
59 changes: 59 additions & 0 deletions test/e2e/jobseq/queue.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package jobseq

import (
"context"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
Expand Down Expand Up @@ -65,4 +66,62 @@ var _ = Describe("Queue E2E Test", func() {
Expect(err).NotTo(HaveOccurred(), "Wait for reopen queue %s failed", q1)

})

It("Queue Command Close And Open With Hierarchical Queues", func() {
q1 := "queue1"
q2 := "queue2"
q11 := "queue11"
defaultQueue := "default"
rootQueue := "root"
ctx := e2eutil.InitTestContext(e2eutil.Options{
Queues: []string{q1, q2, q11},
QueueParent: map[string]string{
q1: rootQueue,
q2: rootQueue,
q11: q1,
},
})
defer e2eutil.CleanupTestContext(ctx)

By("Close queue with child queues")
err := util.CreateQueueCommand(ctx.Vcclient, defaultQueue, q1, busv1alpha1.CloseQueueAction)
if err != nil {
Expect(err).NotTo(HaveOccurred(), "Error send close queue command")
}

err = e2eutil.WaitQueueStatus(func() (bool, error) {
queue, err := ctx.Vcclient.SchedulingV1beta1().Queues().Get(context.TODO(), q11, metav1.GetOptions{})
Expect(err).NotTo(HaveOccurred(), "Get queue %s failed", q11)
return queue.Status.State == schedulingv1beta1.QueueStateClosed, nil
})
Expect(err).NotTo(HaveOccurred(), "Wait for closed queue %s failed", q11)

By("Open queue with closed parent queue")
err = util.CreateQueueCommand(ctx.Vcclient, defaultQueue, q11, busv1alpha1.OpenQueueAction)
if err != nil {
Expect(err).NotTo(HaveOccurred(), "Error send open queue command")
}

err = e2eutil.WaitQueueStatus(func() (bool, error) {
queue, err := ctx.Vcclient.SchedulingV1beta1().Queues().Get(context.TODO(), q11, metav1.GetOptions{})
Expect(err).NotTo(HaveOccurred(), "Get queue %s failed", q11)
return queue.Status.State == schedulingv1beta1.QueueStateClosed, nil
})
Expect(err).NotTo(HaveOccurred(), "Wait for reopen queue %s failed", q11)

By("Open queue with open parent queue")
err = util.CreateQueueCommand(ctx.Vcclient, defaultQueue, q1, busv1alpha1.OpenQueueAction)
if err != nil {
Expect(err).NotTo(HaveOccurred(), "Error send open queue command")
}

err = e2eutil.WaitQueueStatus(func() (bool, error) {
queue, err := ctx.Vcclient.SchedulingV1beta1().Queues().Get(context.TODO(), q1, metav1.GetOptions{})
Expect(err).NotTo(HaveOccurred(), "Get queue %s failed", q1)
return queue.Status.State == schedulingv1beta1.QueueStateOpen, nil
})
Expect(err).NotTo(HaveOccurred(), "Wait for reopen queue %s failed", q1)

e2eutil.DeleteQueue(ctx, q11)
})
})
118 changes: 118 additions & 0 deletions test/e2e/schedulingaction/reclaim.go
Original file line number Diff line number Diff line change
Expand Up @@ -649,6 +649,124 @@ var _ = Describe("Reclaim E2E Test", func() {

})

// Reclaim for hierarchical capacity plugin.
It("Capacity Reclaim Case 12: Multi reclaimed queue", func() {
// First replace configmap with hierarchical capacity plugin.
cmc := e2eutil.NewConfigMapCase("volcano-system", "integration-scheduler-configmap")
cmc.ChangeBy(func(data map[string]string) (changed bool, changedBefore map[string]string) {
vcScheConfStr, ok := data["volcano-scheduler-ci.conf"]
Expect(ok).To(BeTrue())

schedulerConf := &e2eutil.SchedulerConfiguration{}
err := yaml.Unmarshal([]byte(vcScheConfStr), schedulerConf)
Expect(err).NotTo(HaveOccurred())
trueValue := true
schedulerConf.Tiers = []e2eutil.Tier{
{
Plugins: []e2eutil.PluginOption{
{
Name: "capacity",
EnabledHierarchy: &trueValue,
EnabledJobOrder: &trueValue,
EnabledReclaimable: &trueValue,
EnabledQueueOrder: &trueValue,
},
},
},
}
newVCScheConfBytes, err := yaml.Marshal(schedulerConf)
Expect(err).NotTo(HaveOccurred())

changed = true
changedBefore = make(map[string]string)
changedBefore["volcano-scheduler-ci.conf"] = vcScheConfStr
data["volcano-scheduler-ci.conf"] = string(newVCScheConfBytes)
return
})
defer cmc.UndoChanged()

q1 := "reclaim-q1"
q2 := "reclaim-q2"
q11 := "reclaim-q11"
q12 := "reclaim-q12"
rootQueue := "root"
ctx := e2eutil.InitTestContext(e2eutil.Options{
Queues: []string{q1, q2, q11, q12},
NodesNumLimit: 4,
DeservedResource: map[string]v1.ResourceList{
q1: {v1.ResourceCPU: *resource.NewQuantity(4, resource.DecimalSI), v1.ResourceMemory: *resource.NewQuantity(4*1024*1024*1024, resource.BinarySI)},
q2: {v1.ResourceCPU: *resource.NewQuantity(4, resource.DecimalSI), v1.ResourceMemory: *resource.NewQuantity(4*1024*1024*1024, resource.BinarySI)},
q11: {v1.ResourceCPU: *resource.NewQuantity(2, resource.DecimalSI), v1.ResourceMemory: *resource.NewQuantity(2*1024*1024*1024, resource.BinarySI)},
q12: {v1.ResourceCPU: *resource.NewQuantity(2, resource.DecimalSI), v1.ResourceMemory: *resource.NewQuantity(2*1024*1024*1024, resource.BinarySI)},
},
QueueParent: map[string]string{
q1: rootQueue,
q2: rootQueue,
q11: q1,
q12: q1,
},
NodesResourceLimit: e2eutil.CPU2Mem2,
PriorityClasses: map[string]int32{
"low-priority": 10,
},
})

defer e2eutil.CleanupTestContext(ctx)

By("Setup initial jobs")

spec := &e2eutil.JobSpec{
Tasks: []e2eutil.TaskSpec{
{
Img: e2eutil.DefaultNginxImage,
Req: e2eutil.CPU2Mem2,
Min: 1,
Rep: 1,
Labels: map[string]string{schedulingv1beta1.PodPreemptable: "true"},
},
},
}

spec.Name = "reclaim-j1"
spec.Queue = q2
spec.Pri = "low-priority"
job1 := e2eutil.CreateJob(ctx, spec)
err := e2eutil.WaitJobReady(ctx, job1)
Expect(err).NotTo(HaveOccurred())

spec.Name = "reclaim-j2"
spec.Queue = q11
spec.Pri = "low-priority"
job2 := e2eutil.CreateJob(ctx, spec)
err = e2eutil.WaitJobReady(ctx, job2)
Expect(err).NotTo(HaveOccurred())

err = WaitQueueStatus(ctx, "Running", 1, q2)
Expect(err).NotTo(HaveOccurred(), "Error waiting for queue11 running")

err = WaitQueueStatus(ctx, "Running", 1, q11)
Expect(err).NotTo(HaveOccurred(), "Error waiting for queue2 running")

By("Create coming jobs")

_, err = CreateReclaimJob(ctx, e2eutil.CPU1Mem1, "reclaim-j3", q12, "low-priority", "", true)
Expect(err).NotTo(HaveOccurred(), "Wait for job3 failed")

_, err = CreateReclaimJob(ctx, e2eutil.CPU1Mem1, "reclaim-j4", q11, "low-priority", "", true)
Expect(err).NotTo(HaveOccurred(), "Wait for job4 failed")

By("Make sure all job running")

err = WaitQueueStatus(ctx, "Running", 1, q12)
Expect(err).NotTo(HaveOccurred(), "Error waiting for queue12 running")

err = WaitQueueStatus(ctx, "Running", 2, q11)
Expect(err).NotTo(HaveOccurred(), "Error waiting for queue11 running")

e2eutil.DeleteQueue(ctx, q11)
e2eutil.DeleteQueue(ctx, q12)
})

It("Reclaim", func() {
Skip("skip: the case has some problem")
q1, q2 := "reclaim-q1", "reclaim-q2"
Expand Down
2 changes: 1 addition & 1 deletion test/e2e/stress/queue.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ var _ = ginkgo.Describe("[Stress] Queue Test", func() {
defer wg.Done()

queueName := fmt.Sprintf("queue-%d", index)
e2eutil.CreateQueue(ctx, queueName, nil)
e2eutil.CreateQueue(ctx, queueName, nil, "")
err := e2eutil.WaitQueueStatus(func() (bool, error) {
queue, err := ctx.Vcclient.SchedulingV1beta1().Queues().Get(context.TODO(), queueName, metav1.GetOptions{})
gomega.Expect(err).NotTo(gomega.HaveOccurred())
Expand Down
5 changes: 3 additions & 2 deletions test/e2e/util/queue.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ func CreateQueueWithQueueSpec(ctx *TestContext, queueSpec *QueueSpec) {
}

// CreateQueue creates Queue with the specified name
func CreateQueue(ctx *TestContext, q string, deservedResource v1.ResourceList) {
func CreateQueue(ctx *TestContext, q string, deservedResource v1.ResourceList, parent string) {
_, err := ctx.Vcclient.SchedulingV1beta1().Queues().Get(context.TODO(), q, metav1.GetOptions{})
if err != nil {
_, err := ctx.Vcclient.SchedulingV1beta1().Queues().Create(context.TODO(), &schedulingv1beta1.Queue{
Expand All @@ -68,6 +68,7 @@ func CreateQueue(ctx *TestContext, q string, deservedResource v1.ResourceList) {
},
Spec: schedulingv1beta1.QueueSpec{
Weight: 1,
Parent: parent,
Deserved: deservedResource,
},
}, metav1.CreateOptions{})
Expand All @@ -80,7 +81,7 @@ func CreateQueues(ctx *TestContext) {
By("Creating Queues")

for _, queue := range ctx.Queues {
CreateQueue(ctx, queue, ctx.DeservedResource[queue])
CreateQueue(ctx, queue, ctx.DeservedResource[queue], ctx.QueueParent[queue])
}

// wait for all queues state open
Expand Down
3 changes: 3 additions & 0 deletions test/e2e/util/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,7 @@ type TestContext struct {
Namespace string
Queues []string
DeservedResource map[string]v1.ResourceList
QueueParent map[string]string
PriorityClasses map[string]int32
UsingPlaceHolder bool
}
Expand All @@ -129,6 +130,7 @@ type Options struct {
Namespace string
Queues []string
DeservedResource map[string]v1.ResourceList
QueueParent map[string]string
PriorityClasses map[string]int32
NodesNumLimit int
NodesResourceLimit v1.ResourceList
Expand All @@ -147,6 +149,7 @@ func InitTestContext(o Options) *TestContext {
Namespace: o.Namespace,
Queues: o.Queues,
DeservedResource: o.DeservedResource,
QueueParent: o.QueueParent,
PriorityClasses: o.PriorityClasses,
Vcclient: VcClient,
Kubeclient: KubeClient,
Expand Down

0 comments on commit 005ab18

Please sign in to comment.