public boolean isTerminated(ContainerCreationStatus container) { Pod pod = client.pods().withName(container.getContainerName()).get(); if (pod == null) { logger.info("Container {} has no pod - terminal.", container); return true; } else { List<ContainerStatus> containerStatuses = pod.getStatus().getContainerStatuses(); Optional<ContainerStateTerminated> terminated = containerStatuses.stream() .flatMap(status -> Optional.ofNullable(status.getState()).map(Stream::of).orElse(Stream.empty())) .flatMap(state -> Optional.ofNullable(state.getTerminated()).map(Stream::of).orElse(Stream.empty())) .findFirst(); terminated.ifPresent(state -> logger.info("Container {} is {} - terminal.", container, state)); return terminated.isPresent(); } }
protected static boolean isWaiting(List<ContainerStatus> containerStatuses) { for (ContainerStatus status : containerStatuses) { ContainerState state = status.getState(); if (state != null && state.getWaiting() != null) { return true; } } return false; }
static boolean isTerminated(ContainerStatus cs) { return cs.getState().getTerminated() != null; }
@Override public boolean test(ContainerStatus containerStatus) { return containerStatus.getLastState() != null && containerStatus.getState() != null && containerStatus.getLastState().getTerminated() != null && containerStatus.getState().getWaiting() != null && containerStatus.getState().getWaiting().getReason() != null && containerStatus.getState().getWaiting().getReason().contains("CrashLoopBackOff"); } });
static boolean hasPullImageError(ContainerStatus cs) { ContainerStateWaiting waiting = cs.getState().getWaiting(); return waiting != null && ( "PullImageError".equals(waiting.getReason()) || "ErrImagePull".equals(waiting.getReason()) || "ImagePullBackOff".equals(waiting.getReason())); }
private boolean isNonDeletePeriodExpired(ContainerStatus cs) { final ContainerStateTerminated t = cs.getState().getTerminated(); if (t.getFinishedAt() == null) { return true; } final Instant finishedAt; try { finishedAt = Instant.parse(t.getFinishedAt()); } catch (DateTimeParseException e) { LOG.warn("Failed to parse container state terminated finishedAt: '{}'", t.getFinishedAt(), e); return true; } final Instant deadline = time.get().minus(Duration.ofSeconds(podDeletionDelaySeconds)); return finishedAt.isBefore(deadline); }
public boolean test(ContainerStatus containerStatus) { return containerStatus.getLastState() != null && containerStatus.getState() != null && containerStatus.getLastState().getTerminated() != null && containerStatus.getLastState().getTerminated().getReason() != null && containerStatus.getLastState().getTerminated().getReason().contains("Error") && containerStatus.getState().getTerminated() != null && containerStatus.getState().getTerminated().getReason() != null && containerStatus.getState().getTerminated().getReason().contains("Error"); } }, new ContainerStatusCondition("last state exit code == exit code") {
/** * Returns the containers state, lazily creating any objects if required. */ public static ContainerState getOrCreateContainerState(Pod pod, String containerName) { ContainerStatus containerInfo = getOrCreateContainerInfo(pod, containerName); ContainerState state = containerInfo.getState(); if (state == null) { state = new ContainerState(); containerInfo.setState(state); } return state; }
@Override public boolean test(ContainerStatus containerStatus) { return containerStatus.getLastState().getTerminated().getExitCode().equals( containerStatus.getState().getTerminated().getExitCode()); } });
private static Optional<Event> isInErrorState(WorkflowInstance workflowInstance, Pod pod, Optional<ContainerStatus> mainContainerStatusOpt) { final PodStatus status = pod.getStatus(); final String phase = status.getPhase(); if ("NodeLost".equals(pod.getStatus().getReason())) { return Optional.of(Event.runError(workflowInstance, "Lost node running pod")); } switch (phase) { case "Pending": // check if one or more docker contains failed to pull their image, a possible silent error return mainContainerStatusOpt .filter(KubernetesPodEventTranslator::hasPullImageError) .map(x -> Event.runError(workflowInstance, "One or more containers failed to pull their image")); case "Succeeded": case "Failed": if (!mainContainerStatusOpt.isPresent()) { return Optional.of(Event.runError(workflowInstance, "Could not find our container in pod")); } final ContainerStatus containerStatus = mainContainerStatusOpt.get(); final ContainerStateTerminated terminated = containerStatus.getState().getTerminated(); if (terminated == null) { return Optional.of(Event.runError(workflowInstance, "Unexpected null terminated status")); } return Optional.empty(); case "Unknown": return Optional.of(Event.runError(workflowInstance, "Pod entered Unknown phase")); default: return Optional.empty(); } }
private void waitUntilContainerIsReady() throws IOException { try { Pod pod = client.pods().inNamespace(namespace).withName(podName) .waitUntilReady(CONTAINER_READY_TIMEOUT, TimeUnit.MINUTES); if (pod == null || pod.getStatus() == null || pod.getStatus().getContainerStatuses() == null) { throw new IOException("Failed to execute shell script inside container " + "[" + containerName + "] of pod [" + podName + "]." + "Failed to get container status"); } for (ContainerStatus info : pod.getStatus().getContainerStatuses()) { if (info.getName().equals(containerName)) { if (info.getReady()) { return; } else { // container died in the meantime throw new IOException("container [" + containerName + "] of pod [" + podName + "] is not ready, state is " + info.getState()); } } } throw new IOException("container [" + containerName + "] does not exist in pod [" + podName + "]"); } catch (InterruptedException | KubernetesClientTimeoutException e) { throw new IOException("Failed to execute shell script inside container " + "[" + containerName + "] of pod [" + podName + "]." + " Timed out waiting for container to become ready!", e); } } };
@Override public Boolean call() throws Exception { boolean result = true; List<Pod> pods = kubernetesClient.getPods(session.getNamespace()).getItems(); if (pods.isEmpty()) { result = false; session.getLogger().warn("No pods are available yet, waiting..."); } for (Pod pod : pods) { result = result && Objects.equal(PodStatus.OK, KubernetesHelper.getPodStatus(pod)); if (!result) { if (pod.getCurrentState().getInfo() != null) { for (Map.Entry<String, ContainerStatus> entry : pod.getCurrentState().getInfo().entrySet()) { String containerId = entry.getKey(); ContainerStatus status = entry.getValue(); if (status.getState().getWaiting() != null) { session.getLogger().warn("Waiting for container:" + containerId + ". Reason:" + status.getState().getWaiting().getReason()); } } } } } return result; }
public ContainerStatusFluentImpl(ContainerStatus instance){ this.withContainerID(instance.getContainerID()); this.withImage(instance.getImage()); this.withImageID(instance.getImageID()); this.withLastState(instance.getLastState()); this.withName(instance.getName()); this.withReady(instance.getReady()); this.withRestartCount(instance.getRestartCount()); this.withState(instance.getState()); }
public ContainerStatusBuilder(ContainerStatus instance,Boolean validationEnabled){ this.fluent = this; this.withContainerID(instance.getContainerID()); this.withImage(instance.getImage()); this.withImageID(instance.getImageID()); this.withLastState(instance.getLastState()); this.withName(instance.getName()); this.withReady(instance.getReady()); this.withRestartCount(instance.getRestartCount()); this.withState(instance.getState()); this.validationEnabled = validationEnabled; }
public ContainerStatusBuilder(ContainerStatusFluent<?> fluent,ContainerStatus instance,Boolean validationEnabled){ this.fluent = fluent; fluent.withContainerID(instance.getContainerID()); fluent.withImage(instance.getImage()); fluent.withImageID(instance.getImageID()); fluent.withLastState(instance.getLastState()); fluent.withName(instance.getName()); fluent.withReady(instance.getReady()); fluent.withRestartCount(instance.getRestartCount()); fluent.withState(instance.getState()); this.validationEnabled = validationEnabled; } public ContainerStatusBuilder(ContainerStatus instance){
public ContainerStatusBuilder( ContainerStatusFluent<?> fluent , ContainerStatus instance ){ this.fluent = fluent; fluent.withContainerID(instance.getContainerID()); fluent.withImage(instance.getImage()); fluent.withImageID(instance.getImageID()); fluent.withLastState(instance.getLastState()); fluent.withName(instance.getName()); fluent.withReady(instance.getReady()); fluent.withRestartCount(instance.getRestartCount()); fluent.withState(instance.getState()); } public ContainerStatusBuilder( ContainerStatus instance ){
public ContainerStatusBuilder( ContainerStatusFluent<?> fluent , ContainerStatus instance ){ this.fluent = fluent; fluent.withContainerID(instance.getContainerID()); fluent.withImage(instance.getImage()); fluent.withImageID(instance.getImageID()); fluent.withLastState(instance.getLastState()); fluent.withName(instance.getName()); fluent.withReady(instance.getReady()); fluent.withRestartCount(instance.getRestartCount()); fluent.withState(instance.getState()); } public ContainerStatusBuilder( ContainerStatus instance ){
public ContainerStatusBuilder( ContainerStatus instance ){ this.fluent = this; this.withContainerID(instance.getContainerID()); this.withImage(instance.getImage()); this.withImageID(instance.getImageID()); this.withLastState(instance.getLastState()); this.withName(instance.getName()); this.withReady(instance.getReady()); this.withRestartCount(instance.getRestartCount()); this.withState(instance.getState()); }
public ContainerStatusBuilder( ContainerStatus instance ){ this.fluent = this; this.withContainerID(instance.getContainerID()); this.withImage(instance.getImage()); this.withImageID(instance.getImageID()); this.withLastState(instance.getLastState()); this.withName(instance.getName()); this.withReady(instance.getReady()); this.withRestartCount(instance.getRestartCount()); this.withState(instance.getState()); }