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  })