in internal/handler/appdeployment.go [145:186]
func (a *AppDeploymentHandler) initializeJobAndAwaitCompletion(ctx context.Context, jobTemplate *batchv1.Job) error {
job := &batchv1.Job{}
// check if the job exists
if err := a.client.Get(ctx, client.ObjectKey{Namespace: a.appDeployment.Namespace, Name: jobTemplate.Name}, job); err != nil {
if !apierror.IsNotFound(err) {
return fmt.Errorf("failed to get job %s: %w", jobTemplate.Name, err)
}
// create a new job
if err := a.createJob(ctx, jobTemplate); err != nil {
a.recorder.Event(a.appDeployment, "Error", "FailedCreateJob", err.Error())
return fmt.Errorf("failed to create job %s: %w", jobTemplate.Name, err)
}
return errJobNotCompleted // requeue
}
// check if the job is running
switch ctrlutils.CheckJobStatus(ctx, job) {
// if job is failed then delete the job and create a new one
case ctrlutils.JobStatusFailed:
// delete the failed job
if err := a.client.Delete(ctx, job, client.PropagationPolicy(metav1.DeletePropagationBackground)); client.IgnoreNotFound(err) != nil {
a.recorder.Event(a.appDeployment, "Error", "FailedDeleteJob", err.Error())
return fmt.Errorf("failed to delete job %s: %w", job.Name, err)
}
// create a new job
if err := ctrl.SetControllerReference(a.appDeployment, jobTemplate, a.client.Scheme()); err != nil {
return fmt.Errorf("failed to set controller reference for job %s: %w", job.Name, err)
}
if err := a.client.Create(ctx, jobTemplate); err != nil {
return fmt.Errorf("failed to create job %s: %w", jobTemplate.Name, err)
}
// if job is succeeded then delete the job
case ctrlutils.JobStatusSucceeded:
// delete the succeeded job
if err := a.client.Delete(ctx, job, client.PropagationPolicy(metav1.DeletePropagationBackground)); client.IgnoreNotFound(err) != nil {
return fmt.Errorf("failed to delete succeeded job %s: %w", job.Name, err)
}
return nil
}
return errJobNotCompleted
}