Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

#### _**Note**_: Breaking changes
* Fix #2718: KubernetesResourceUtil.isResourceReady was deprecated. Use
* Fix #5279: (java-generator) Add native support for `date-time` fields, they are now mapped to native `java.time.ZonedDateTime`

### 6.7.2 (2023-06-15)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ public abstract class AbstractJSONSchema2Pojo {
static final String FLOAT_CRD_TYPE = "float";
static final String DOUBLE_CRD_TYPE = "double";
static final String STRING_CRD_TYPE = "string";
static final String DATETIME_CRD_TYPE = "date-time";
static final String OBJECT_CRD_TYPE = "object";
static final String ARRAY_CRD_TYPE = "array";

Expand All @@ -48,6 +49,9 @@ public static final AnnotationExpr newGeneratedAnnotation() {
new StringLiteralExpr("io.fabric8.java.generator.CRGeneratorRunner"));
}

// RFC 3339 - from: https://swagger.io/docs/specification/data-models/data-types/
public static final String DATETIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ssX";

protected final String description;
protected final Config config;
protected final boolean isNullable;
Expand Down Expand Up @@ -197,7 +201,17 @@ public static AbstractJSONSchema2Pojo fromJsonSchema(
return fromJsonSchema.apply(JPrimitiveNameAndType.DOUBLE);
}
case STRING_CRD_TYPE:
return fromJsonSchema.apply(JPrimitiveNameAndType.STRING);
String stringFormat = prop.getFormat();
if (stringFormat == null)
stringFormat = STRING_CRD_TYPE;

switch (stringFormat) {
case DATETIME_CRD_TYPE:
return fromJsonSchema.apply(JPrimitiveNameAndType.DATETIME);
case STRING_CRD_TYPE:
default:
return fromJsonSchema.apply(JPrimitiveNameAndType.STRING);
}
case OBJECT_CRD_TYPE:
if (prop.getAdditionalProperties() != null && prop.getAdditionalProperties().getSchema() != null) {
return fromJsonSchema.apply(new JMapNameAndType(key));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@
import java.util.*;
import java.util.stream.Collectors;

import static io.fabric8.java.generator.nodes.JPrimitiveNameAndType.DATETIME_NAME;

public class JObject extends AbstractJSONSchema2Pojo implements JObjectExtraAnnotations {

public static final String DEPRECATED_FIELD_MARKER = "deprecated";
Expand Down Expand Up @@ -215,6 +217,12 @@ public GeneratorResult generateJava() {
new Name("com.fasterxml.jackson.annotation.JsonProperty"),
new StringLiteralExpr(originalFieldName)));

if (prop.getClassType().equals(DATETIME_NAME)) {
objField.addAnnotation(new SingleMemberAnnotationExpr(
new Name("com.fasterxml.jackson.annotation.JsonFormat"),
new NameExpr("timezone = \"UTC\", pattern = \"" + DATETIME_FORMAT + "\"")));
}

if (isRequired) {
objField.addAnnotation("io.fabric8.generator.annotation.Required");
}
Expand Down Expand Up @@ -347,6 +355,9 @@ private Expression generatePrimitiveDefaultInitializerExpression(AbstractJSONSch
return new DoubleLiteralExpr(value + "f");
} else if (prop.getClassType().equals("Boolean") && prop.getDefaultValue().isBoolean()) {
return new BooleanLiteralExpr(prop.getDefaultValue().booleanValue());
} else if (prop.getClassType().equals(DATETIME_NAME) && prop.getDefaultValue().isTextual()) {
return new NameExpr(DATETIME_NAME + ".parse(" + prop.getDefaultValue()
+ ", java.time.format.DateTimeFormatter.ofPattern(\"" + DATETIME_FORMAT + "\"))");
} else {
return new NameExpr(value);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,15 @@
package io.fabric8.java.generator.nodes;

public class JPrimitiveNameAndType extends JavaNameAndType {
static final String DATETIME_NAME = "java.time.ZonedDateTime";
static final JPrimitiveNameAndType INT_OR_STRING = new JPrimitiveNameAndType("io.fabric8.kubernetes.api.model.IntOrString");
static final JPrimitiveNameAndType BOOL = new JPrimitiveNameAndType("Boolean");
static final JPrimitiveNameAndType INTEGER = new JPrimitiveNameAndType("Integer");
static final JPrimitiveNameAndType LONG = new JPrimitiveNameAndType("Long");
static final JPrimitiveNameAndType FLOAT = new JPrimitiveNameAndType("Float");
static final JPrimitiveNameAndType DOUBLE = new JPrimitiveNameAndType("Double");
static final JPrimitiveNameAndType STRING = new JPrimitiveNameAndType("String");
static final JPrimitiveNameAndType DATETIME = new JPrimitiveNameAndType(DATETIME_NAME);
static final JPrimitiveNameAndType ANY_TYPE = new JPrimitiveNameAndType("io.fabric8.kubernetes.api.model.AnyType");

public JPrimitiveNameAndType(String name) {
Expand Down
3 changes: 3 additions & 0 deletions java-generator/core/src/test/resources/crontab-crd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ spec:
type: string
replicas:
type: integer
issuedAt:
format: date-time
type: string
status:
type: object
properties:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ public class CronTab extends io.fabric8.kubernetes.client.CustomResource<org.tes
CrontabJavaCr[1] = package org.test.v1;

@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)
@com.fasterxml.jackson.annotation.JsonPropertyOrder({"cronSpec","image","replicas"})
@com.fasterxml.jackson.annotation.JsonPropertyOrder({"cronSpec","image","issuedAt","replicas"})
@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.fasterxml.jackson.databind.JsonDeserializer.None.class)
@javax.annotation.processing.Generated("io.fabric8.java.generator.CRGeneratorRunner")
public class CronTabSpec implements io.fabric8.kubernetes.api.model.KubernetesResource {
Expand Down Expand Up @@ -40,6 +40,19 @@ public class CronTabSpec implements io.fabric8.kubernetes.api.model.KubernetesRe
this.image = image;
}

@com.fasterxml.jackson.annotation.JsonProperty("issuedAt")
@com.fasterxml.jackson.annotation.JsonFormat(timezone = "UTC", pattern = "yyyy-MM-dd'T'HH:mm:ssX")
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SKIP)
private java.time.ZonedDateTime issuedAt;

public java.time.ZonedDateTime getIssuedAt() {
return issuedAt;
}

public void setIssuedAt(java.time.ZonedDateTime issuedAt) {
this.issuedAt = issuedAt;
}

@com.fasterxml.jackson.annotation.JsonProperty("replicas")
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SKIP)
private Long replicas;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ public class CronTab extends io.fabric8.kubernetes.client.CustomResource<org.tes
CrontabJavaExtraAnnotationsCr[1] = package org.test.v1;

@com.fasterxml.jackson.annotation.JsonInclude(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL)
@com.fasterxml.jackson.annotation.JsonPropertyOrder({"cronSpec","image","replicas"})
@com.fasterxml.jackson.annotation.JsonPropertyOrder({"cronSpec","image","issuedAt","replicas"})
@com.fasterxml.jackson.databind.annotation.JsonDeserialize(using = com.fasterxml.jackson.databind.JsonDeserializer.None.class)
@javax.annotation.processing.Generated("io.fabric8.java.generator.CRGeneratorRunner")
@lombok.ToString()
Expand Down Expand Up @@ -74,6 +74,19 @@ public class CronTabSpec implements io.fabric8.kubernetes.api.model.KubernetesRe
this.image = image;
}

@com.fasterxml.jackson.annotation.JsonProperty("issuedAt")
@com.fasterxml.jackson.annotation.JsonFormat(timezone = "UTC", pattern = "yyyy-MM-dd'T'HH:mm:ssX")
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SKIP)
private java.time.ZonedDateTime issuedAt;

public java.time.ZonedDateTime getIssuedAt() {
return issuedAt;
}

public void setIssuedAt(java.time.ZonedDateTime issuedAt) {
this.issuedAt = issuedAt;
}

@com.fasterxml.jackson.annotation.JsonProperty("replicas")
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SKIP)
private Long replicas;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,17 @@
import io.fabric8.kubernetes.client.utils.Serialization;
import org.junit.jupiter.api.Test;

import java.time.format.DateTimeFormatter;
import java.time.ZonedDateTime;
import java.util.List;

import static io.cert_manager.v1.CertificateRequestSpec.*;
import static org.junit.jupiter.api.Assertions.assertEquals;

class TestDefaultValues {

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssX");

@Test
void testDefaultValues() throws Exception {
// Arrange
Expand All @@ -46,6 +50,7 @@ void testDefaultValues() throws Exception {
List<String> nine = cr.getSpec().getNine();
Ten ten = cr.getSpec().getTen();
Eleven eleven = cr.getSpec().getEleven();
ZonedDateTime twelve = cr.getSpec().getTwelve();

// Assert
assertEquals("one", one);
Expand All @@ -62,5 +67,6 @@ void testDefaultValues() throws Exception {
assertEquals("tenone", ten.getTenOne());
assertEquals("tentwo", ten.getTenTwo());
assertEquals(Eleven.BAZ, eleven);
assertEquals(ZonedDateTime.parse("2017-07-21T17:32:28Z", formatter), twelve);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -97,5 +97,9 @@ spec:
- "bar"
- "baz"
default: "baz"
twelve:
type: string
format: date-time
default: "2017-07-21T17:32:28Z"
served: true
storage: true
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,16 @@
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.Files;
import java.time.format.DateTimeFormatter;
import java.time.ZonedDateTime;
import java.util.List;

import static org.junit.jupiter.api.Assertions.assertEquals;

class TestEnumSerialization {

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssX");

@Test
void testDeserialization() {
// Arrange
Expand All @@ -47,6 +51,8 @@ void testDeserialization() {
assertEquals(CertificateRequestSpec.Usages.DIGITAL_SIGNATURE, usagesList.get(2));
assertEquals(CertificateRequestSpec.Usages.SERVER_AUTH, usagesList.get(3));
assertEquals(CertificateRequestSpec.Usages.S_MIME, usagesList.get(4));

assertEquals(ZonedDateTime.parse("2017-07-21T17:32:28Z", formatter), sample.getSpec().getDatetime());
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,6 +92,9 @@ spec:
- issuerRef
- request
properties:
datetime:
format: date-time
type: string
duration:
description: The requested 'duration' (i.e. lifetime) of the Certificate. This option may be ignored/overridden by some issuer types.
type: string
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ kind: CertificateRequest
metadata:
name: my-ca-cr
spec:
datetime: "2017-07-21T17:32:28Z"
request: dGVzdAo=
isCA: false
usages:
Expand All @@ -31,4 +32,4 @@ spec:
issuerRef:
name: ca-issuer
kind: Issuer
group: cert-manager.io
group: cert-manager.io
2 changes: 2 additions & 0 deletions java-generator/it/src/it/plugin/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
.gradle
build