diff --git a/e2e/src/test/java/io/kubernetes/client/e2e/extended/leaderelection/LeaderElectorTest.java b/e2e/src/test/java/io/kubernetes/client/e2e/extended/leaderelection/LeaderElectorTest.java index 59af2f38d7..2e6651990c 100644 --- a/e2e/src/test/java/io/kubernetes/client/e2e/extended/leaderelection/LeaderElectorTest.java +++ b/e2e/src/test/java/io/kubernetes/client/e2e/extended/leaderelection/LeaderElectorTest.java @@ -34,6 +34,7 @@ import java.util.concurrent.CyclicBarrier; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicReference; +import org.joda.time.format.*; import org.junit.Assert; import org.junit.Before; import org.junit.Test; @@ -77,6 +78,27 @@ public LeaderElectorTest(LockType lockType) { throw new RuntimeException("Couldn't create ApiClient", ex); } this.lockType = lockType; + + // Lease resource requires special care with DateTime + if (lockType == LockType.Lease) { + // This formatter is used for Lease resource spec's acquire/renewTime + DateTimeFormatter isoWithFractionalMicroSecsFormatter = + DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'"); + + DateTimeFormatter formatter = + new DateTimeFormatterBuilder() + .append( + isoWithFractionalMicroSecsFormatter.getPrinter(), + new DateTimeParser[] { + isoWithFractionalMicroSecsFormatter.getParser(), + // need this one to parse "creationTimestamp" format e.g. "2020-12-30T09:29:13Z" + // in Lease resource returned from server + ISODateTimeFormat.dateOptionalTimeParser().getParser(), + }) + .toFormatter(); + + apiClient.setDateTimeFormat(formatter); + } } @Before diff --git a/extended/src/main/java/io/kubernetes/client/extended/leaderelection/LeaderElector.java b/extended/src/main/java/io/kubernetes/client/extended/leaderelection/LeaderElector.java index 20cf090c52..ccafc65df6 100644 --- a/extended/src/main/java/io/kubernetes/client/extended/leaderelection/LeaderElector.java +++ b/extended/src/main/java/io/kubernetes/client/extended/leaderelection/LeaderElector.java @@ -414,6 +414,9 @@ public void close() { LeaderElectionRecord emptyRecord = new LeaderElectionRecord(); // maintain leaderTransitions count emptyRecord.setLeaderTransitions(observedRecord.getLeaderTransitions()); + // LeaseLock impl requires a non-zero value for leaseDuration + emptyRecord.setLeaseDurationSeconds( + Long.valueOf(config.getLeaseDuration().getSeconds()).intValue()); boolean status = this.config.getLock().update(emptyRecord); if (!status) { diff --git a/extended/src/main/java/io/kubernetes/client/extended/leaderelection/resourcelock/LeaseLock.java b/extended/src/main/java/io/kubernetes/client/extended/leaderelection/resourcelock/LeaseLock.java index aea94a22f1..b1f7486c0e 100644 --- a/extended/src/main/java/io/kubernetes/client/extended/leaderelection/resourcelock/LeaseLock.java +++ b/extended/src/main/java/io/kubernetes/client/extended/leaderelection/resourcelock/LeaseLock.java @@ -99,9 +99,9 @@ public boolean update(LeaderElectionRecord record) { return true; } catch (ApiException e) { if (e.getCode() == HttpURLConnection.HTTP_CONFLICT) { - log.debug("received {} when creating lease lock", e.getCode(), e); + log.debug("received {} when updating lease lock", e.getCode(), e); } else { - log.error("received {} when creating lease lock", e.getCode(), e); + log.error("received {} when updating lease lock", e.getCode(), e); } return false; }