in pkg/controllers/job/state/running.go [31:97]
func (ps *runningState) Execute(action v1alpha1.Action) error {
switch action {
case v1alpha1.RestartJobAction:
return KillJob(ps.job, PodRetainPhaseNone, func(status *vcbatch.JobStatus) bool {
status.State.Phase = vcbatch.Restarting
status.RetryCount++
return true
})
case v1alpha1.AbortJobAction:
return KillJob(ps.job, PodRetainPhaseSoft, func(status *vcbatch.JobStatus) bool {
status.State.Phase = vcbatch.Aborting
return true
})
case v1alpha1.TerminateJobAction:
return KillJob(ps.job, PodRetainPhaseSoft, func(status *vcbatch.JobStatus) bool {
status.State.Phase = vcbatch.Terminating
return true
})
case v1alpha1.CompleteJobAction:
return KillJob(ps.job, PodRetainPhaseSoft, func(status *vcbatch.JobStatus) bool {
status.State.Phase = vcbatch.Completing
return true
})
default:
return SyncJob(ps.job, func(status *vcbatch.JobStatus) bool {
jobReplicas := TotalTasks(ps.job.Job)
if jobReplicas == 0 {
// when scale down to zero, keep the current job phase
return false
}
minSuccess := ps.job.Job.Spec.MinSuccess
if minSuccess != nil && status.Succeeded >= *minSuccess {
status.State.Phase = vcbatch.Completed
return true
}
totalTaskMinAvailable := TotalTaskMinAvailable(ps.job.Job)
if status.Succeeded+status.Failed == jobReplicas {
if ps.job.Job.Spec.MinAvailable >= totalTaskMinAvailable {
for _, task := range ps.job.Job.Spec.Tasks {
if task.MinAvailable == nil {
continue
}
if taskStatus, ok := status.TaskStatusCount[task.Name]; ok {
if taskStatus.Phase[v1.PodSucceeded] < *task.MinAvailable {
status.State.Phase = vcbatch.Failed
return true
}
}
}
}
if minSuccess != nil && status.Succeeded < *minSuccess {
status.State.Phase = vcbatch.Failed
} else if status.Succeeded >= ps.job.Job.Spec.MinAvailable {
status.State.Phase = vcbatch.Completed
} else {
status.State.Phase = vcbatch.Failed
}
return true
}
return false
})
}
}