func()

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
}