diff --git a/CHANGELOG.md b/CHANGELOG.md index b3ef5f46c1..74c60b1fef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ * Fix #4535: The shell command string will now have single quotes sanitized * Fix #4543: (Java Generator) additionalProperties JsonAny setter method generated as setAdditionalProperty * Fix #4547: preventing timing issues with leader election cancel +* Fix #4540: treating GenericKubernetesResource and RawExtension as buildable * Fix #4569: fixing jdk httpclient regression with 0 timeouts #### Improvements diff --git a/kubernetes-model-generator/kubernetes-model-jsonschema2pojo/src/main/java/io/fabric8/kubernetes/jsonschema2pojo/ExtensionTypeAnnotator.java b/kubernetes-model-generator/kubernetes-model-jsonschema2pojo/src/main/java/io/fabric8/kubernetes/jsonschema2pojo/ExtensionTypeAnnotator.java index 67db8c5b80..9752a7ec49 100644 --- a/kubernetes-model-generator/kubernetes-model-jsonschema2pojo/src/main/java/io/fabric8/kubernetes/jsonschema2pojo/ExtensionTypeAnnotator.java +++ b/kubernetes-model-generator/kubernetes-model-jsonschema2pojo/src/main/java/io/fabric8/kubernetes/jsonschema2pojo/ExtensionTypeAnnotator.java @@ -16,12 +16,12 @@ package io.fabric8.kubernetes.jsonschema2pojo; -import com.sun.codemodel.JAnnotationArrayMember; -import com.sun.codemodel.JClassAlreadyExistsException; -import com.sun.codemodel.JCodeModel; +import com.sun.codemodel.JDefinedClass; import io.sundr.builder.annotations.BuildableReference; import org.jsonschema2pojo.GenerationConfig; +import java.util.List; + /** * Adds more {@link BuildableReference}s to regular annotator to minimize * the code changes in the built-in types from combining annotators. @@ -33,15 +33,12 @@ public ExtensionTypeAnnotator(GenerationConfig generationConfig) { } @Override - protected void addBuildableTypes(JAnnotationArrayMember arrayMember) throws JClassAlreadyExistsException { - arrayMember.annotate(BuildableReference.class).param(BUILDABLE_REFERENCE_VALUE, - new JCodeModel()._class("io.fabric8.kubernetes.api.model.EnvVar")); - arrayMember.annotate(BuildableReference.class).param(BUILDABLE_REFERENCE_VALUE, - new JCodeModel()._class("io.fabric8.kubernetes.api.model.ContainerPort")); - arrayMember.annotate(BuildableReference.class).param(BUILDABLE_REFERENCE_VALUE, - new JCodeModel()._class("io.fabric8.kubernetes.api.model.Volume")); - arrayMember.annotate(BuildableReference.class).param(BUILDABLE_REFERENCE_VALUE, - new JCodeModel()._class("io.fabric8.kubernetes.api.model.VolumeMount")); + protected void addBuildableTypes(JDefinedClass clazz, List types) { + super.addBuildableTypes(clazz, types); + types.add("io.fabric8.kubernetes.api.model.EnvVar"); + types.add("io.fabric8.kubernetes.api.model.ContainerPort"); + types.add("io.fabric8.kubernetes.api.model.Volume"); + types.add("io.fabric8.kubernetes.api.model.VolumeMount"); } } diff --git a/kubernetes-model-generator/kubernetes-model-jsonschema2pojo/src/main/java/io/fabric8/kubernetes/jsonschema2pojo/KubernetesCoreTypeAnnotator.java b/kubernetes-model-generator/kubernetes-model-jsonschema2pojo/src/main/java/io/fabric8/kubernetes/jsonschema2pojo/KubernetesCoreTypeAnnotator.java index fefc55921c..4bdae804ef 100644 --- a/kubernetes-model-generator/kubernetes-model-jsonschema2pojo/src/main/java/io/fabric8/kubernetes/jsonschema2pojo/KubernetesCoreTypeAnnotator.java +++ b/kubernetes-model-generator/kubernetes-model-jsonschema2pojo/src/main/java/io/fabric8/kubernetes/jsonschema2pojo/KubernetesCoreTypeAnnotator.java @@ -23,6 +23,9 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.sun.codemodel.JAnnotationArrayMember; +import com.sun.codemodel.JAnnotationUse; +import com.sun.codemodel.JClassAlreadyExistsException; +import com.sun.codemodel.JCodeModel; import com.sun.codemodel.JDefinedClass; import com.sun.codemodel.JExpressionImpl; import com.sun.codemodel.JFieldVar; @@ -31,6 +34,7 @@ import io.fabric8.kubernetes.model.annotation.Version; import io.fabric8.kubernetes.model.jackson.JsonUnwrappedDeserializer; import io.sundr.builder.annotations.Buildable; +import io.sundr.builder.annotations.BuildableReference; import io.sundr.transform.annotations.TemplateTransformation; import io.sundr.transform.annotations.TemplateTransformations; import lombok.EqualsAndHashCode; @@ -41,13 +45,18 @@ import org.jsonschema2pojo.Jackson2Annotator; import java.lang.annotation.Annotation; +import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Set; public class KubernetesCoreTypeAnnotator extends Jackson2Annotator { + + public static final String BUILDABLE_REFERENCE_VALUE = "value"; + protected static final String ANNOTATION_VALUE = "value"; protected static final String API_VERSION = "apiVersion"; protected static final String METADATA = "metadata"; @@ -185,12 +194,34 @@ public void propertyField(JFieldVar field, JDefinedClass clazz, String propertyN } protected void processBuildable(JDefinedClass clazz) { - clazz.annotate(Buildable.class) + JAnnotationUse buildable = clazz.annotate(Buildable.class) .param("editableEnabled", false) .param("validationEnabled", false) - .param("generateBuilderPackage", true) + .param("generateBuilderPackage", generateBuilderPackage()) .param("lazyCollectionInitEnabled", false) .param("builderPackage", "io.fabric8.kubernetes.api.builder"); + + List types = new ArrayList<>(); + addBuildableTypes(clazz, types); + if (!types.isEmpty()) { + JAnnotationArrayMember arrayMember = buildable.paramArray("refs"); + types.stream().forEach(s -> { + try { + arrayMember.annotate(BuildableReference.class).param(BUILDABLE_REFERENCE_VALUE, + new JCodeModel()._class(s)); + } catch (JClassAlreadyExistsException e) { + e.printStackTrace(); + } + }); + } + } + + protected boolean generateBuilderPackage() { + return true; + } + + protected void addBuildableTypes(JDefinedClass clazz, List types) { + } private boolean hasInterfaceFields(JsonNode propertiesNode) { diff --git a/kubernetes-model-generator/kubernetes-model-jsonschema2pojo/src/main/java/io/fabric8/kubernetes/jsonschema2pojo/KubernetesTypeAnnotator.java b/kubernetes-model-generator/kubernetes-model-jsonschema2pojo/src/main/java/io/fabric8/kubernetes/jsonschema2pojo/KubernetesTypeAnnotator.java index 24dfafc720..9af96eefa3 100644 --- a/kubernetes-model-generator/kubernetes-model-jsonschema2pojo/src/main/java/io/fabric8/kubernetes/jsonschema2pojo/KubernetesTypeAnnotator.java +++ b/kubernetes-model-generator/kubernetes-model-jsonschema2pojo/src/main/java/io/fabric8/kubernetes/jsonschema2pojo/KubernetesTypeAnnotator.java @@ -15,60 +15,40 @@ */ package io.fabric8.kubernetes.jsonschema2pojo; -import com.sun.codemodel.JAnnotationArrayMember; -import com.sun.codemodel.JAnnotationUse; -import com.sun.codemodel.JClassAlreadyExistsException; -import com.sun.codemodel.JCodeModel; import com.sun.codemodel.JDefinedClass; -import io.sundr.builder.annotations.Buildable; -import io.sundr.builder.annotations.BuildableReference; import org.jsonschema2pojo.GenerationConfig; -public class KubernetesTypeAnnotator extends KubernetesCoreTypeAnnotator { +import java.util.List; - public static final String BUILDABLE_REFERENCE_VALUE = "value"; +public class KubernetesTypeAnnotator extends KubernetesCoreTypeAnnotator { public KubernetesTypeAnnotator(GenerationConfig generationConfig) { super(generationConfig); } @Override - public void processBuildable(JDefinedClass clazz) { - try { - JAnnotationUse buildable = clazz.annotate(Buildable.class) - .param("editableEnabled", false) - .param("validationEnabled", false) - .param("generateBuilderPackage", false) - .param("lazyCollectionInitEnabled", false) - .param("builderPackage", "io.fabric8.kubernetes.api.builder"); - - JAnnotationArrayMember arrayMember = buildable.paramArray("refs"); - arrayMember.annotate(BuildableReference.class).param(BUILDABLE_REFERENCE_VALUE, - new JCodeModel()._class("io.fabric8.kubernetes.api.model.ObjectMeta")); - arrayMember.annotate(BuildableReference.class).param(BUILDABLE_REFERENCE_VALUE, - new JCodeModel()._class("io.fabric8.kubernetes.api.model.LabelSelector")); - arrayMember.annotate(BuildableReference.class).param(BUILDABLE_REFERENCE_VALUE, - new JCodeModel()._class("io.fabric8.kubernetes.api.model.Container")); - arrayMember.annotate(BuildableReference.class).param(BUILDABLE_REFERENCE_VALUE, - new JCodeModel()._class("io.fabric8.kubernetes.api.model.PodTemplateSpec")); - arrayMember.annotate(BuildableReference.class).param(BUILDABLE_REFERENCE_VALUE, - new JCodeModel()._class("io.fabric8.kubernetes.api.model.ResourceRequirements")); - arrayMember.annotate(BuildableReference.class).param(BUILDABLE_REFERENCE_VALUE, - new JCodeModel()._class("io.fabric8.kubernetes.api.model.IntOrString")); - arrayMember.annotate(BuildableReference.class).param(BUILDABLE_REFERENCE_VALUE, - new JCodeModel()._class("io.fabric8.kubernetes.api.model.ObjectReference")); - arrayMember.annotate(BuildableReference.class).param(BUILDABLE_REFERENCE_VALUE, - new JCodeModel()._class("io.fabric8.kubernetes.api.model.LocalObjectReference")); - arrayMember.annotate(BuildableReference.class).param(BUILDABLE_REFERENCE_VALUE, - new JCodeModel()._class("io.fabric8.kubernetes.api.model.PersistentVolumeClaim")); - addBuildableTypes(arrayMember); - } catch (JClassAlreadyExistsException e) { - e.printStackTrace(); - } + protected boolean generateBuilderPackage() { + return false; } - protected void addBuildableTypes(JAnnotationArrayMember arrayMember) throws JClassAlreadyExistsException { - + @Override + protected void addBuildableTypes(JDefinedClass clazz, List types) { + types.add("io.fabric8.kubernetes.api.model.ObjectMeta"); + types.add("io.fabric8.kubernetes.api.model.LabelSelector"); + types.add("io.fabric8.kubernetes.api.model.Container"); + types.add("io.fabric8.kubernetes.api.model.PodTemplateSpec"); + types.add("io.fabric8.kubernetes.api.model.ResourceRequirements"); + types.add("io.fabric8.kubernetes.api.model.IntOrString"); + types.add("io.fabric8.kubernetes.api.model.ObjectReference"); + types.add("io.fabric8.kubernetes.api.model.LocalObjectReference"); + types.add("io.fabric8.kubernetes.api.model.PersistentVolumeClaim"); + if (clazz.fields().values().stream() + .anyMatch(f -> f.type().fullName().contains("io.fabric8.kubernetes.api.model.KubernetesResource") + || f.type().fullName().contains("io.fabric8.kubernetes.api.model.HasMetadata") + || f.type().fullName().contains("io.fabric8.kubernetes.api.model.RawExtension"))) { + types.add("io.fabric8.kubernetes.api.model.GenericKubernetesResource"); + types.add("io.fabric8.kubernetes.api.model.runtime.RawExtension"); + } } }