|
1 | | -// Copyright (c) 2018, 2024, Oracle and/or its affiliates. |
| 1 | +// Copyright (c) 2018, 2025, Oracle and/or its affiliates. |
2 | 2 | // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. |
3 | 3 |
|
4 | 4 | package oracle.kubernetes.operator.helpers; |
5 | 5 |
|
6 | 6 | import java.time.OffsetDateTime; |
| 7 | +import java.time.temporal.ChronoUnit; |
7 | 8 | import java.util.ArrayList; |
8 | 9 | import java.util.Collection; |
9 | 10 | import java.util.Collections; |
|
60 | 61 | import static oracle.kubernetes.common.logging.MessageKeys.INTROSPECTOR_FLUENTD_CONTAINER_TERMINATED; |
61 | 62 | import static oracle.kubernetes.common.logging.MessageKeys.INTROSPECTOR_JOB_FAILED; |
62 | 63 | import static oracle.kubernetes.common.logging.MessageKeys.INTROSPECTOR_JOB_FAILED_DETAIL; |
| 64 | +import static oracle.kubernetes.common.logging.MessageKeys.JOB_DEADLINE_EXCEEDED_MESSAGE; |
63 | 65 | import static oracle.kubernetes.operator.DomainSourceType.FROM_MODEL; |
64 | 66 | import static oracle.kubernetes.operator.DomainStatusUpdater.createIntrospectionFailureSteps; |
65 | 67 | import static oracle.kubernetes.operator.DomainStatusUpdater.createRemoveFailuresStep; |
@@ -208,6 +210,18 @@ private static class IntrospectionStartStep extends Step { |
208 | 210 |
|
209 | 211 | } |
210 | 212 |
|
| 213 | + private static boolean isJobPodTimedOut(V1Pod jobPod) { |
| 214 | + return "DeadlineExceeded".equals(getJobPodStatusReason(jobPod)); |
| 215 | + } |
| 216 | + |
| 217 | + private static String getJobPodStatusReason(V1Pod jobPod) { |
| 218 | + return Optional.ofNullable(jobPod.getStatus()).map(V1PodStatus::getReason).orElse(null); |
| 219 | + } |
| 220 | + |
| 221 | + private static boolean isJobTimedOut(V1Job job) { |
| 222 | + return "DeadlineExceeded".equals(JobWatcher.getFailedReason(job)); |
| 223 | + } |
| 224 | + |
211 | 225 | private static class IntrospectorJobStepContext extends JobStepContext { |
212 | 226 |
|
213 | 227 | IntrospectorJobStepContext(Packet packet) { |
@@ -861,14 +875,6 @@ protected Throwable createTerminationException(Packet packet) { |
861 | 875 | return new JobWatcher.DeadlineExceededException((V1Job) packet.get(DOMAIN_INTROSPECTOR_JOB)); |
862 | 876 | } |
863 | 877 |
|
864 | | - private boolean isJobPodTimedOut(V1Pod jobPod) { |
865 | | - return "DeadlineExceeded".equals(getJobPodStatusReason(jobPod)); |
866 | | - } |
867 | | - |
868 | | - private String getJobPodStatusReason(V1Pod jobPod) { |
869 | | - return Optional.ofNullable(jobPod.getStatus()).map(V1PodStatus::getReason).orElse(null); |
870 | | - } |
871 | | - |
872 | 878 | private Step createIntrospectorConfigMap() { |
873 | 879 | return ConfigMapHelper.createIntrospectorConfigMapStep(null); |
874 | 880 | } |
@@ -955,7 +961,21 @@ private static void logIntrospectorFailure(Packet packet, V1Job domainIntrospect |
955 | 961 | domainIntrospectorJob.getMetadata().getNamespace(), |
956 | 962 | domainIntrospectorJob.getMetadata().getName(), |
957 | 963 | domainIntrospectorJob.toString()); |
| 964 | + if (isJobTimedOut(domainIntrospectorJob) || (jobPod != null && isJobPodTimedOut(jobPod))) { |
| 965 | + LOGGER.info(JOB_DEADLINE_EXCEEDED_MESSAGE, |
| 966 | + Optional.of(domainIntrospectorJob).map(V1Job::getMetadata).map(V1ObjectMeta::getName).orElse(""), |
| 967 | + Optional.of(domainIntrospectorJob).map(V1Job::getSpec) |
| 968 | + .map(V1JobSpec::getActiveDeadlineSeconds).map(Object::toString).orElse(""), |
| 969 | + getJobStartedSeconds(domainIntrospectorJob)); |
| 970 | + } |
| 971 | + } |
| 972 | + } |
| 973 | + |
| 974 | + private static long getJobStartedSeconds(V1Job job) { |
| 975 | + if (job.getStatus() != null && job.getStatus().getStartTime() != null) { |
| 976 | + return ChronoUnit.SECONDS.between(job.getStatus().getStartTime(), SystemClock.now()); |
958 | 977 | } |
| 978 | + return -1; |
959 | 979 | } |
960 | 980 |
|
961 | 981 | private static String getName(V1Pod pod) { |
|
0 commit comments