8000 Merge pull request #1477 from yue9944882/support-rfc3339micro-timestamp · tony-clarke-amdocs/java@a8c89e0 · GitHub
[go: up one dir, main page]

Skip to content

Commit a8c89e0

Browse files
authored
Merge pull request kubernetes-client#1477 from yue9944882/support-rfc3339micro-timestamp
Support rfc3339 micro-sec (6 digit) timestamp
2 parents 6267ff3 + 61cf85c commit a8c89e0

File tree

4 files changed

+77
-30
lines changed
  • e2e/src/test/java/io/kubernetes/client/e2e/extended/leaderelection
  • extended/src/main/java/io/kubernetes/client/extended/leaderelection/resourcelock
  • kubernetes/src

4 files changed

+77
-30
lines changed

e2e/src/test/java/io/kubernetes/client/e2e/extended/leaderelection/LeaderElectorTest.java

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,6 @@
2626
import java.io.IOException;
2727
import java.net.HttpURLConnection;
2828
import java.time.Duration;
29-
import java.time.format.DateTimeFormatter;
30-
import java.time.format.DateTimeFormatterBuilder;
3129
import java.util.ArrayList;
3230
import java.util.Collection;
3331
import java.util.List;
@@ -78,21 +76,6 @@ public LeaderElectorTest(LockType lockType) {
7876
} catch (IOException ex) {
7977
throw new RuntimeException("Couldn't create ApiClient", ex);
8078
}
81-
// Lease resource requires special care with DateTime
82-
if (lockType == LockType.Lease) {
83-
// TODO: switch date-time library so that micro-sec timestamp can be serialized
84-
// in RFC3339
85-
// format w/ correct precision without the hacks
86-
87-
// This formatter is used for Lease resource spec's acquire/renewTime
88-
DateTimeFormatter formatter =
89-
new DateTimeFormatterBuilder()
90-
.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'"))
91-
.appendOptional(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'"))
92-
.toFormatter();
93-
94-
apiClient.setOffsetDateTimeFormat(formatter);
95-
}
9679
this.lockType = lockType;
9780
}
9881

extended/src/main/java/io/kubernetes/client/extended/leaderelection/resourcelock/LeaseLock.java

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -135,15 +135,23 @@ private LeaderElectionRecord getRecordFromLease(V1LeaseSpec lease) {
135135
}
136136

137137
private V1LeaseSpec getLeaseFromRecord(LeaderElectionRecord record) {
138-
return new V1LeaseSpec()
139-
.acquireTime(
140-
OffsetDateTime.ofInstant(
141-
Instant.ofEpochMilli(record.getAcquireTime().getTime()), ZoneOffset.UTC))
142-
.renewTime(
143-
OffsetDateTime.ofInstant(
144-
Instant.ofEpochMilli(record.getRenewTime().getTime()), ZoneOffset.UTC))
145-
.holderIdentity(record.getHolderIdentity())
146-
.leaseDurationSeconds(record.getLeaseDurationSeconds())
147-
.leaseTransitions(record.getLeaderTransitions());
138+
V1LeaseSpec spec =
139+
new V1LeaseSpec()
140+
.holderIdentity(record.getHolderIdentity())
141+
.leaseDurationSeconds(record.getLeaseDurationSeconds())
142+
.leaseTransitions(record.getLeaderTransitions());
143+
if (record.getAcquireTime() != null) {
144+
spec =
145+
spec.acquireTime(
146+
OffsetDateTime.ofInstant(
147+
Instant.ofEpochMilli(record.getAcquireTime().getTime()), ZoneOffset.UTC));
148+
}
149+
if (record.getRenewTime() != null) {
150+
spec =
151+
spec.renewTime(
152+
OffsetDateTime.ofInstant(
153+
Instant.ofEpochMilli(record.getRenewTime().getTime()), ZoneOffset.UTC));
154+
}
155+
return spec;
148156
}
149157
}

kubernetes/src/main/java/io/kubernetes/client/openapi/JSON.java

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232
import java.time.LocalDate;
3333
import java.time.OffsetDateTime;
3434
import java.time.format.DateTimeFormatter;
35+
import java.time.format.DateTimeFormatterBuilder;
36+
import java.time.format.DateTimeParseException;
37+
import java.time.temporal.ChronoField;
3538
import java.util.Date;
3639
import java.util.Map;
3740
import okio.ByteString;
@@ -42,11 +45,22 @@ public class JSON {
4245

4346
private boolean isLenientOnJson = false;
4447

48+
private static final DateTimeFormatter RFC3339MICRO_FORMATTER =
49+
new DateTimeFormatterBuilder()
50+
.parseDefaulting(ChronoField.OFFSET_SECONDS, 0)
51+
.append(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"))
52+
.optionalStart()
53+
.appendFraction(ChronoField.NANO_OF_SECOND, 6, 6, true)
54+
.optionalEnd()
55+
.appendLiteral("Z")
56+
.toFormatter();
57+
4558
private DateTypeAdapter dateTypeAdapter = new DateTypeAdapter();
4659

4760
private SqlDateTypeAdapter sqlDateTypeAdapter = new SqlDateTypeAdapter();
4861

49-
private OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter = new OffsetDateTimeTypeAdapter();
62+
private OffsetDateTimeTypeAdapter offsetDateTimeTypeAdapter =
63+
new OffsetDateTimeTypeAdapter(RFC3339MICRO_FORMATTER);
5064

5165
private LocalDateTypeAdapter localDateTypeAdapter = new LocalDateTypeAdapter();
5266

@@ -231,7 +245,12 @@ public OffsetDateTime read(JsonReader in) throws IOException {
231245
if (date.endsWith("+0000")) {
232246
date = date.substring(0, date.length() - 5) + "Z";
233247
}
234-
return OffsetDateTime.parse(date, formatter);
248+
try {
249+
return OffsetDateTime.parse(date, formatter);
250+
} catch (DateTimeParseException e) {
251+
// backward-compatibility for ISO8601 timestamp format
252+
return OffsetDateTime.parse(date, DateTimeFormatter.ISO_OFFSET_DATE_TIME);
253+
}
235254
}
236255
}
237256
}

kubernetes/src/test/java/io/kubernetes/client/openapi/JSONTest.java

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,16 @@
1515
import static org.hamcrest.CoreMatchers.is;
1616
import static org.junit.Assert.*;
1717

18+
import java.time.OffsetDateTime;
1819
import okio.ByteString;
1920
import org.junit.Test;
2021

2122
public class JSONTest {
2223

24+
private final JSON json = new JSON();
25+
2326
@Test
2427
public void testSerializeByteArray() {
25-
final JSON json = new JSON();
2628
final String plainText = "string that contains '=' when encoded";
2729
final String base64String = json.serialize(plainText.getBytes());
2830
// serialize returns string surrounded by quotes: "\"[base64]\""
@@ -36,4 +38,39 @@ public void testSerializeByteArray() {
3638
final String decodedText = new String(byteStr.toByteArray());
3739
assertThat(decodedText, is(plainText));
3840
}
41+
42+
@Test
43+
public void testOffsetDateTime1e6Parse() {
44+
String timeStr = "\"2018-04-03T11:32:26.123456Z\"";
45+
OffsetDateTime dateTime = json.deserialize(timeStr, OffsetDateTime.class);
46+
String serializedTsStr = json.serialize(dateTime);
47+
assertEquals(timeStr, serializedTsStr);
48+
}
49+
50+
@Test
51+
public void testOffsetDateTime1e4Parse() {
52+
String timeStr = "\"2018-04-03T11:32:26.1234Z\"";
53+
OffsetDateTime dateTime = json.deserialize(timeStr, OffsetDateTime.class);
54+
String serializedTsStr = json.serialize(dateTime);
55+
String expectedStr = "\"2018-04-03T11:32:26.123400Z\"";
56+
assertEquals(expectedStr, serializedTsStr);
57+
}
58+
59+
@Test
60+
public void testOffsetDateTime1e3Parse() {
61+
String timeStr = "\"2018-04-03T11:32:26.123Z\"";
62+
OffsetDateTime dateTime = json.deserialize(timeStr, OffsetDateTime.class);
63+
String serializedTsStr = json.serialize(dateTime);
64+
String expectedStr = "\"2018-04-03T11:32:26.123000Z\"";
65+
assertEquals(expectedStr, serializedTsStr);
66+
}
67+
68+
@Test
69+
public void testOffsetDateTimeNoFractionParse() {
70+
String timeStr = "\"2018-04-03T11:32:26Z\"";
71+
OffsetDateTime dateTime = json.deserialize(timeStr, OffsetDateTime.class);
72+
String serializedTsStr = json.serialize(dateTime);
73+
String expectedStr = "\"2018-04-03T11:32:26.000000Z\"";
74+
assertEquals(expectedStr, serializedTsStr);
75+
}
3976
}

0 commit comments

Comments
 (0)
0