volcano.sh/volcano@v1.9.0/test/e2e/jobp/job_lifecycle.go (about) 1 /* 2 Copyright 2021 The Volcano Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package jobp 18 19 import ( 20 "context" 21 22 . "github.com/onsi/ginkgo/v2" 23 . "github.com/onsi/gomega" 24 25 v1 "k8s.io/api/core/v1" 26 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 27 28 vcbatch "volcano.sh/apis/pkg/apis/batch/v1alpha1" 29 vcbus "volcano.sh/apis/pkg/apis/bus/v1alpha1" 30 31 e2eutil "volcano.sh/volcano/test/e2e/util" 32 ) 33 34 var _ = Describe("Job Life Cycle", func() { 35 It("Delete job that is pending state", func() { 36 ctx := e2eutil.InitTestContext(e2eutil.Options{}) 37 defer e2eutil.CleanupTestContext(ctx) 38 39 By("create job") 40 job := e2eutil.CreateJob(ctx, &e2eutil.JobSpec{ 41 Name: "pending-delete-job", 42 Tasks: []e2eutil.TaskSpec{ 43 { 44 Name: "success", 45 Img: e2eutil.DefaultNginxImage, 46 Min: 2, 47 Rep: 2, 48 Req: e2eutil.CPUResource("10000"), 49 }, 50 }, 51 }) 52 53 // job phase: pending 54 err := e2eutil.WaitJobPhases(ctx, job, []vcbatch.JobPhase{vcbatch.Pending}) 55 Expect(err).NotTo(HaveOccurred()) 56 57 By("delete job") 58 err = ctx.Vcclient.BatchV1alpha1().Jobs(job.Namespace).Delete(context.TODO(), job.Name, metav1.DeleteOptions{}) 59 Expect(err).NotTo(HaveOccurred()) 60 61 err = e2eutil.WaitJobCleanedUp(ctx, job) 62 Expect(err).NotTo(HaveOccurred()) 63 64 }) 65 66 It("Delete job that is Running state", func() { 67 ctx := e2eutil.InitTestContext(e2eutil.Options{}) 68 defer e2eutil.CleanupTestContext(ctx) 69 70 By("create job") 71 job := e2eutil.CreateJob(ctx, &e2eutil.JobSpec{ 72 Name: "running-delete-job", 73 Tasks: []e2eutil.TaskSpec{ 74 { 75 Name: "success", 76 Img: e2eutil.DefaultNginxImage, 77 Min: 2, 78 Rep: 2, 79 }, 80 }, 81 }) 82 83 // job phase: pending -> running 84 err := e2eutil.WaitJobPhases(ctx, job, []vcbatch.JobPhase{vcbatch.Pending, vcbatch.Running}) 85 Expect(err).NotTo(HaveOccurred()) 86 87 By("delete job") 88 err = ctx.Vcclient.BatchV1alpha1().Jobs(job.Namespace).Delete(context.TODO(), job.Name, metav1.DeleteOptions{}) 89 Expect(err).NotTo(HaveOccurred()) 90 91 err = e2eutil.WaitJobCleanedUp(ctx, job) 92 Expect(err).NotTo(HaveOccurred()) 93 94 }) 95 96 It("Delete job that is Completed state", func() { 97 ctx := e2eutil.InitTestContext(e2eutil.Options{}) 98 defer e2eutil.CleanupTestContext(ctx) 99 100 By("create job") 101 job := e2eutil.CreateJob(ctx, &e2eutil.JobSpec{ 102 Name: "complete-delete-job", 103 Tasks: []e2eutil.TaskSpec{ 104 { 105 Name: "completed-task", 106 Img: e2eutil.DefaultBusyBoxImage, 107 Min: 2, 108 Rep: 2, 109 // Sleep 5 seconds ensure job in running state 110 Command: "sleep 5", 111 }, 112 }, 113 }) 114 115 // job phase: pending -> running -> Completed 116 err := e2eutil.WaitJobPhases(ctx, job, []vcbatch.JobPhase{vcbatch.Pending, vcbatch.Running, vcbatch.Completed}) 117 Expect(err).NotTo(HaveOccurred()) 118 119 By("delete job") 120 err = ctx.Vcclient.BatchV1alpha1().Jobs(job.Namespace).Delete(context.TODO(), job.Name, metav1.DeleteOptions{}) 121 Expect(err).NotTo(HaveOccurred()) 122 123 err = e2eutil.WaitJobCleanedUp(ctx, job) 124 Expect(err).NotTo(HaveOccurred()) 125 126 }) 127 128 It("Delete job that is Failed job", func() { 129 ctx := e2eutil.InitTestContext(e2eutil.Options{}) 130 defer e2eutil.CleanupTestContext(ctx) 131 132 By("create job") 133 job := e2eutil.CreateJob(ctx, &e2eutil.JobSpec{ 134 Name: "failed-delete-job", 135 Policies: []vcbatch.LifecyclePolicy{ 136 { 137 Action: vcbus.AbortJobAction, 138 Event: vcbus.PodFailedEvent, 139 }, 140 }, 141 Tasks: []e2eutil.TaskSpec{ 142 { 143 Name: "fail", 144 Img: e2eutil.DefaultNginxImage, 145 Min: 1, 146 Rep: 1, 147 Command: "sleep 10s && exit 3", 148 RestartPolicy: v1.RestartPolicyNever, 149 }, 150 }, 151 }) 152 153 // job phase: pending -> running -> Aborted 154 err := e2eutil.WaitJobPhases(ctx, job, []vcbatch.JobPhase{vcbatch.Pending, vcbatch.Running, vcbatch.Aborted}) 155 Expect(err).NotTo(HaveOccurred()) 156 157 By("delete job") 158 err = ctx.Vcclient.BatchV1alpha1().Jobs(job.Namespace).Delete(context.TODO(), job.Name, metav1.DeleteOptions{}) 159 Expect(err).NotTo(HaveOccurred()) 160 161 err = e2eutil.WaitJobCleanedUp(ctx, job) 162 Expect(err).NotTo(HaveOccurred()) 163 164 }) 165 166 It("Delete job that is terminated job", func() { 167 ctx := e2eutil.InitTestContext(e2eutil.Options{}) 168 defer e2eutil.CleanupTestContext(ctx) 169 170 By("create job") 171 job := e2eutil.CreateJob(ctx, &e2eutil.JobSpec{ 172 Name: "terminate-delete-job", 173 Policies: []vcbatch.LifecyclePolicy{ 174 { 175 Action: vcbus.TerminateJobAction, 176 Event: vcbus.PodFailedEvent, 177 }, 178 }, 179 Tasks: []e2eutil.TaskSpec{ 180 { 181 Name: "fail", 182 Img: e2eutil.DefaultNginxImage, 183 Min: 1, 184 Rep: 1, 185 Command: "sleep 10s && exit 3", 186 RestartPolicy: v1.RestartPolicyNever, 187 }, 188 }, 189 }) 190 191 // job phase: pending -> running -> Terminated 192 err := e2eutil.WaitJobPhases(ctx, job, []vcbatch.JobPhase{vcbatch.Pending, vcbatch.Running, vcbatch.Terminated}) 193 Expect(err).NotTo(HaveOccurred()) 194 195 By("delete job") 196 err = ctx.Vcclient.BatchV1alpha1().Jobs(job.Namespace).Delete(context.TODO(), job.Name, metav1.DeleteOptions{}) 197 Expect(err).NotTo(HaveOccurred()) 198 199 err = e2eutil.WaitJobCleanedUp(ctx, job) 200 Expect(err).NotTo(HaveOccurred()) 201 202 }) 203 204 It("Create and Delete job with CPU requirement", func() { 205 ctx := e2eutil.InitTestContext(e2eutil.Options{}) 206 defer e2eutil.CleanupTestContext(ctx) 207 208 By("create job") 209 job := e2eutil.CreateJob(ctx, &e2eutil.JobSpec{ 210 Name: "terminate-delete-job", 211 Policies: []vcbatch.LifecyclePolicy{ 212 { 213 Action: vcbus.TerminateJobAction, 214 Event: vcbus.PodFailedEvent, 215 }, 216 }, 217 Tasks: []e2eutil.TaskSpec{ 218 { 219 Name: "complete", 220 Img: e2eutil.DefaultNginxImage, 221 Min: 1, 222 Rep: 1, 223 Command: "sleep 10s", 224 RestartPolicy: v1.RestartPolicyNever, 225 Req: e2eutil.CPUResource("1"), 226 }, 227 }, 228 }) 229 230 // job phase: pending -> running -> completed 231 err := e2eutil.WaitJobPhases(ctx, job, []vcbatch.JobPhase{vcbatch.Pending, vcbatch.Running, vcbatch.Completed}) 232 Expect(err).NotTo(HaveOccurred()) 233 234 By("delete job") 235 err = ctx.Vcclient.BatchV1alpha1().Jobs(job.Namespace).Delete(context.TODO(), job.Name, metav1.DeleteOptions{}) 236 Expect(err).NotTo(HaveOccurred()) 237 238 err = e2eutil.WaitJobCleanedUp(ctx, job) 239 Expect(err).NotTo(HaveOccurred()) 240 241 }) 242 243 It("Checking Event Generation for job", func() { 244 ctx := e2eutil.InitTestContext(e2eutil.Options{}) 245 defer e2eutil.CleanupTestContext(ctx) 246 247 job := e2eutil.CreateJob(ctx, &e2eutil.JobSpec{ 248 Name: "terminate-job", 249 Policies: []vcbatch.LifecyclePolicy{ 250 { 251 Action: vcbus.TerminateJobAction, 252 Event: vcbus.PodFailedEvent, 253 }, 254 }, 255 Tasks: []e2eutil.TaskSpec{ 256 { 257 Name: "complete", 258 Img: e2eutil.DefaultNginxImage, 259 Min: 1, 260 Rep: 1, 261 Command: "sleep 10s && xyz", 262 RestartPolicy: v1.RestartPolicyNever, 263 }, 264 }, 265 }) 266 267 err := e2eutil.WaitJobTerminateAction(ctx, job) 268 Expect(err).NotTo(HaveOccurred()) 269 }) 270 271 It("Checking Unschedulable Event Generation for job", func() { 272 ctx := e2eutil.InitTestContext(e2eutil.Options{}) 273 defer e2eutil.CleanupTestContext(ctx) 274 275 nodeName, rep := e2eutil.ComputeNode(ctx, e2eutil.OneCPU) 276 277 nodeAffinity := &v1.NodeAffinity{ 278 RequiredDuringSchedulingIgnoredDuringExecution: &v1.NodeSelector{ 279 NodeSelectorTerms: []v1.NodeSelectorTerm{ 280 { 281 MatchExpressions: []v1.NodeSelectorRequirement{ 282 { 283 Key: v1.LabelHostname, 284 Operator: v1.NodeSelectorOpIn, 285 Values: []string{nodeName}, 286 }, 287 }, 288 }, 289 }, 290 }, 291 } 292 293 job := e2eutil.CreateJob(ctx, &e2eutil.JobSpec{ 294 Name: "unschedulable-job", 295 Policies: []vcbatch.LifecyclePolicy{ 296 { 297 Action: vcbus.TerminateJobAction, 298 Event: vcbus.PodFailedEvent, 299 }, 300 }, 301 Tasks: []e2eutil.TaskSpec{ 302 { 303 Name: "complete", 304 Img: e2eutil.DefaultNginxImage, 305 Min: rep + 1, 306 Rep: rep + 1, 307 Command: "sleep 10s", 308 RestartPolicy: v1.RestartPolicyNever, 309 Req: e2eutil.CPUResource("1"), 310 Limit: e2eutil.CPUResource("1"), 311 Affinity: &v1.Affinity{NodeAffinity: nodeAffinity}, 312 }, 313 }, 314 }) 315 316 err := e2eutil.WaitJobUnschedulable(ctx, job) 317 Expect(err).NotTo(HaveOccurred()) 318 }) 319 320 })