func checkContainersForError()

in pkg/controllers/common_utils.go [108:149]


func checkContainersForError(containerStatuses []corev1.ContainerStatus, podName string) (errs []string) {
	for _, containerStatus := range containerStatuses {
		containerState := containerStatus.State
		if containerStatus.Ready ||
			containerState.Running != nil {
			// Container is either ready or running
			// No errors yet in the current run.
			continue
		}

		if containerState.Waiting != nil {
			if containerState.Waiting.Reason != PodInitializing &&
				containerState.Waiting.Reason != ContainerCreating {
				msg := fmt.Sprintf("pod %q struck in waiting state : %s", podName,
					containerState.Waiting.Reason)
				if containerState.Waiting.Message != "" {
					// Append the message to err
					msg += " : " + containerState.Waiting.Message
				}
				errs = append(errs, msg)
			}

			// Container is waiting, check for failure in LastTerminationState if any
			containerState = containerStatus.LastTerminationState
		}

		// Check if the container was terminated and if terminated, check the exit code :
		// only 0 (graceful shutdown) and 137 (killed by SIGKILL) are allowed.
		if containerState.Terminated != nil &&
			containerState.Terminated.ExitCode != 0 && containerState.Terminated.ExitCode != 137 {
			msg := fmt.Sprintf("pod %q failed : container %q terminated with exit code %d",
				podName, containerStatus.Name, containerState.Terminated.ExitCode)
			if containerState.Terminated.Message != "" {
				// Append the message to err
				msg += " : " + containerState.Terminated.Message
			}
			errs = append(errs, msg)
		}
	}

	return errs
}