KubeUtil { public static Optional<Long> findFinishedTimestamp(V1Pod pod) { if (pod.getStatus() == null || pod.getStatus().getContainerStatuses() == null) { return Optional.empty(); } return pod.getStatus().getContainerStatuses().stream() .filter(status -> status.getState() != null && status.getState().getTerminated() != null && status.getState().getTerminated().getFinishedAt() != null) .findFirst() .map(terminatedState -> terminatedState.getState().getTerminated().getFinishedAt().getMillis()); }  static int estimatePodSize(V1Pod v1Pod); static boolean isPodPhaseTerminal(String phase); static Optional<Long> findFinishedTimestamp(V1Pod pod); static Optional<TitusExecutorDetails> getTitusExecutorDetails(V1Pod pod); static Optional<V1ContainerState> findContainerState(V1Pod pod); static Optional<V1ContainerStateTerminated> findTerminatedContainerStatus(V1Pod pod); static String formatV1ContainerState(V1ContainerState containerState); static Optional<String> findFarzoneId(DirectKubeConfiguration configuration, Job job); static boolean isOwnedByKubeScheduler(V1Pod v1Pod); static Optional<String> getNodeIpV4Address(V1Node node); static Map<String, String> createPodAnnotations(
            Job<?> job,
            Task task,
            byte[] containerInfoData,
            Map<String, String> passthroughAttributes,
            boolean includeJobDescriptor
    ); static Map<String, String> createPodAnnotationsFromJobParameters(Job<?> job); static boolean isNodeOwnedByFenzo(List<String> farzones, V1Node node); static boolean hasFenzoSchedulerTaint(V1Node node); static boolean isFarzoneNode(List<String> farzones, V1Node node); static String toErrorDetails(Throwable e); static Mono<T> toReact(KubeFunction<ApiCallback<T>, Call> handler); static String getMetadataName(V1ObjectMeta metadata); static Optional<V1NodeCondition> findNodeCondition(V1Node node, String type); static boolean hasUninitializedTaint(V1Node node); static final String TYPE_INTERNAL_IP; }
@Test public void testFindFinishedTimestamp() { V1Pod pod = new V1Pod().status(new V1PodStatus().containerStatuses(new ArrayList<>())); pod.getStatus().getContainerStatuses().add(new V1ContainerStatus() .state(new V1ContainerState().running(new V1ContainerStateRunning())) ); assertThat(KubeUtil.findFinishedTimestamp(pod)).isEmpty(); pod.getStatus().getContainerStatuses().add(new V1ContainerStatus() .state(new V1ContainerState().terminated(new V1ContainerStateTerminated())) ); assertThat(KubeUtil.findFinishedTimestamp(pod)).isEmpty(); DateTime now = DateTime.now(); pod.getStatus().getContainerStatuses().get(1).getState().getTerminated().finishedAt(now); assertThat(KubeUtil.findFinishedTimestamp(pod)).contains(now.getMillis()); }