|
59 | 59 | import org.apache.flink.runtime.rest.handler.async.AsynchronousOperationResult; |
60 | 60 | import org.apache.flink.runtime.rest.handler.async.TriggerResponse; |
61 | 61 | import org.apache.flink.runtime.rest.messages.DashboardConfiguration; |
| 62 | +import org.apache.flink.runtime.rest.messages.JobExceptionsInfoWithHistory; |
62 | 63 | import org.apache.flink.runtime.rest.messages.MessageHeaders; |
63 | 64 | import org.apache.flink.runtime.rest.messages.MessageParameters; |
64 | 65 | import org.apache.flink.runtime.rest.messages.RequestBody; |
|
111 | 112 | import io.fabric8.kubernetes.client.KubernetesClientException; |
112 | 113 | import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; |
113 | 114 | import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; |
| 115 | +import lombok.SneakyThrows; |
114 | 116 | import org.junit.jupiter.api.Assertions; |
115 | 117 | import org.junit.jupiter.api.BeforeEach; |
116 | 118 | import org.junit.jupiter.api.Test; |
|
147 | 149 | import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; |
148 | 150 | import static org.junit.jupiter.api.Assertions.assertEquals; |
149 | 151 | import static org.junit.jupiter.api.Assertions.assertFalse; |
| 152 | +import static org.junit.jupiter.api.Assertions.assertNotNull; |
150 | 153 | import static org.junit.jupiter.api.Assertions.assertNull; |
151 | 154 | import static org.junit.jupiter.api.Assertions.assertThrows; |
152 | 155 | import static org.junit.jupiter.api.Assertions.assertTrue; |
@@ -1315,6 +1318,51 @@ public void testBlockingDeletionDeleteCallErrorHandling() { |
1315 | 1318 | assertTrue(remaining.toMillis() < 1000); |
1316 | 1319 | } |
1317 | 1320 |
|
| 1321 | + @Test |
| 1322 | + public void listingJobExceptionsIsCompatibleWihFlinkV1_17Test() throws Exception { |
| 1323 | + var flinkV117JsonResponse = |
| 1324 | + "{\n" |
| 1325 | + + " \"root-exception\": \"org.apache.flink.util.FlinkExpectedException: The TaskExecutor is shutting down.\\n\\tat org.apache.flink.runtime.taskexecutor.TaskExecutor.onStop(TaskExecutor.java:476)\\n\\tat org.apache.flink.runtime.rpc.RpcEndpoint.internalCallOnStop(RpcEndpoint.java:239)\\n\\tat org.apache.flink.runtime.rpc.akka.AkkaRpcActor$StartedState.lambda$terminate$0(AkkaRpcActor.java:578)\\n\\tat org.apache.flink.runtime.concurrent.akka.ClassLoadingUtils.runWithContextClassLoader(ClassLoadingUtils.java:83)\\n\\tat org.apache.flink.runtime.rpc.akka.AkkaRpcActor$StartedState.terminate(AkkaRpcActor.java:577)\\n\\tat org.apache.flink.runtime.rpc.akka.AkkaRpcActor.handleControlMessage(AkkaRpcActor.java:196)\\n\\tat akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:24)\\n\\tat akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:20)\\n\\tat scala.PartialFunction.applyOrElse(PartialFunction.scala:127)\\n\\tat scala.PartialFunction.applyOrElse$(PartialFunction.scala:126)\\n\\tat akka.japi.pf.UnitCaseStatement.applyOrElse(CaseStatements.scala:20)\\n\\tat scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:175)\\n\\tat scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:176)\\n\\tat akka.actor.Actor.aroundReceive(Actor.scala:537)\\n\\tat akka.actor.Actor.aroundReceive$(Actor.scala:535)\\n\\tat akka.actor.AbstractActor.aroundReceive(AbstractActor.scala:220)\\n\\tat akka.actor.ActorCell.receiveMessage(ActorCell.scala:579)\\n\\tat akka.actor.ActorCell.invoke(ActorCell.scala:547)\\n\\tat akka.dispatch.Mailbox.processMailbox(Mailbox.scala:270)\\n\\tat akka.dispatch.Mailbox.run(Mailbox.scala:231)\\n\\tat akka.dispatch.Mailbox.exec(Mailbox.scala:243)\\n\\tat java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source)\\n\\tat java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source)\\n\\tat java.base/java.util.concurrent.ForkJoinPool.scan(Unknown Source)\\n\\tat java.base/java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)\\n\\tat java.base/java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)\\n\",\n" |
| 1326 | + + " \"timestamp\": 1755995361447,\n" |
| 1327 | + + " \"all-exceptions\": [],\n" |
| 1328 | + + " \"truncated\": false,\n" |
| 1329 | + + " \"exceptionHistory\": {\n" |
| 1330 | + + " \"entries\": [\n" |
| 1331 | + + " {\n" |
| 1332 | + + " \"exceptionName\": \"org.apache.flink.util.FlinkExpectedException\",\n" |
| 1333 | + + " \"stacktrace\": \"org.apache.flink.util.FlinkExpectedException: The TaskExecutor is shutting down.\\n\\tat org.apache.flink.runtime.taskexecutor.TaskExecutor.onStop(TaskExecutor.java:476)\\n\\tat org.apache.flink.runtime.rpc.RpcEndpoint.internalCallOnStop(RpcEndpoint.java:239)\\n\\tat org.apache.flink.runtime.rpc.akka.AkkaRpcActor$StartedState.lambda$terminate$0(AkkaRpcActor.java:578)\\n\\tat org.apache.flink.runtime.concurrent.akka.ClassLoadingUtils.runWithContextClassLoader(ClassLoadingUtils.java:83)\\n\\tat org.apache.flink.runtime.rpc.akka.AkkaRpcActor$StartedState.terminate(AkkaRpcActor.java:577)\\n\\tat org.apache.flink.runtime.rpc.akka.AkkaRpcActor.handleControlMessage(AkkaRpcActor.java:196)\\n\\tat akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:24)\\n\\tat akka.japi.pf.UnitCaseStatement.apply(CaseStatements.scala:20)\\n\\tat scala.PartialFunction.applyOrElse(PartialFunction.scala:127)\\n\\tat scala.PartialFunction.applyOrElse$(PartialFunction.scala:126)\\n\\tat akka.japi.pf.UnitCaseStatement.applyOrElse(CaseStatements.scala:20)\\n\\tat scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:175)\\n\\tat scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:176)\\n\\tat akka.actor.Actor.aroundReceive(Actor.scala:537)\\n\\tat akka.actor.Actor.aroundReceive$(Actor.scala:535)\\n\\tat akka.actor.AbstractActor.aroundReceive(AbstractActor.scala:220)\\n\\tat akka.actor.ActorCell.receiveMessage(ActorCell.scala:579)\\n\\tat akka.actor.ActorCell.invoke(ActorCell.scala:547)\\n\\tat akka.dispatch.Mailbox.processMailbox(Mailbox.scala:270)\\n\\tat akka.dispatch.Mailbox.run(Mailbox.scala:231)\\n\\tat akka.dispatch.Mailbox.exec(Mailbox.scala:243)\\n\\tat java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source)\\n\\tat java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source)\\n\\tat java.base/java.util.concurrent.ForkJoinPool.scan(Unknown Source)\\n\\tat java.base/java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)\\n\\tat java.base/java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)\\n\",\n" |
| 1334 | + + " \"timestamp\": 1755995361447,\n" |
| 1335 | + + " \"taskName\": \"Source: Custom Source (2/2) - execution #0\",\n" |
| 1336 | + + " \"location\": \"10.244.0.93:37079\",\n" |
| 1337 | + + " \"taskManagerId\": \"basic-example-taskmanager-1-1\",\n" |
| 1338 | + + " \"concurrentExceptions\": []\n" |
| 1339 | + + " }\n" |
| 1340 | + + " ],\n" |
| 1341 | + + " \"truncated\": false\n" |
| 1342 | + + " }\n" |
| 1343 | + + "}"; |
| 1344 | + var flinkService = |
| 1345 | + getTestingService( |
| 1346 | + (messageHeaders, messageParameters, requestBody) -> |
| 1347 | + CompletableFuture.completedFuture( |
| 1348 | + parseExceptionsJsonResponse(flinkV117JsonResponse))); |
| 1349 | + |
| 1350 | + var jobExceptions = |
| 1351 | + flinkService.getJobExceptions( |
| 1352 | + TestUtils.buildApplicationCluster(), new JobID(), new Configuration()); |
| 1353 | + assertNotNull(jobExceptions); |
| 1354 | + assertEquals(1, jobExceptions.getExceptionHistory().getEntries().size()); |
| 1355 | + } |
| 1356 | + |
| 1357 | + @SneakyThrows |
| 1358 | + private static JobExceptionsInfoWithHistory parseExceptionsJsonResponse( |
| 1359 | + String flinkV117JsonResponse) { |
| 1360 | + var jsonNode = RestMapperUtils.getStrictObjectMapper().readTree(flinkV117JsonResponse); |
| 1361 | + var jsonParser = RestMapperUtils.getStrictObjectMapper().treeAsTokens(jsonNode); |
| 1362 | + return RestMapperUtils.getFlexibleObjectMapper() |
| 1363 | + .readValue(jsonParser, JobExceptionsInfoWithHistory.class); |
| 1364 | + } |
| 1365 | + |
1318 | 1366 | class TestingService extends AbstractFlinkService { |
1319 | 1367 |
|
1320 | 1368 | RestClusterClient<String> clusterClient; |
|
0 commit comments