From 21ee5fb19c3681ed7c63b432f91ef69ff504618e Mon Sep 17 00:00:00 2001 From: Steve Hawkins Date: Fri, 25 Feb 2022 13:29:35 -0500 Subject: [PATCH] fix #3628 removing sorting from lists and templates --- doc/MIGRATION-v6.md | 5 + .../fabric8/kubernetes/client/DryRunTest.java | 8 +- .../kubernetes/api/model/KubernetesList.java | 4 +- .../openshift-model/pom.xml | 19 -- .../fabric8/openshift/api/model/Template.java | 204 ++++++++---------- .../resources/schema/validation-schema.json | 13 +- .../kubernetes/api/model/TemplateTest.java | 39 +--- .../client/server/mock/OpenShiftLoadTest.java | 2 +- 8 files changed, 112 insertions(+), 182 deletions(-) rename kubernetes-model-generator/openshift-model/src/{main => generated}/java/io/fabric8/openshift/api/model/Template.java (54%) diff --git a/doc/MIGRATION-v6.md b/doc/MIGRATION-v6.md index a9d5eb485a7..c8ca649b8ef 100644 --- a/doc/MIGRATION-v6.md +++ b/doc/MIGRATION-v6.md @@ -4,6 +4,7 @@ - [API/Impl split](#api-impl-split) - [Deprecation Removals](#deprecation-removals) - [IntOrString changes](#intorstring-changes) +- [Object sorting](#object-sorting) ## API/Impl split @@ -64,3 +65,7 @@ We've removed setter methods `setIntVal`, `setKind`, `setStrVal` from the class. IntOrString i2 = new IntOrString("3000"); String strValue = i2.getStrVal(); ``` + +## Object Sorting + +KubernetesList and Template will no longer automatically sort their objects by default. You may use the HasMetadataComparator to sort the items as needed. diff --git a/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/DryRunTest.java b/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/DryRunTest.java index 053e80bb429..6aab592b8b0 100644 --- a/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/DryRunTest.java +++ b/kubernetes-client/src/test/java/io/fabric8/kubernetes/client/DryRunTest.java @@ -182,8 +182,8 @@ void testResourceListCreateOrReplace() throws IOException { // Then verify(mockClient, times(2)).send(any(), any()); - assertRequest("POST", "/api/v1/namespaces/ns1/services", "dryRun=All"); - assertRequest(1, "POST", "/api/v1/namespaces/ns1/pods", "dryRun=All"); + assertRequest("POST", "/api/v1/namespaces/ns1/pods", "dryRun=All"); + assertRequest(1, "POST", "/api/v1/namespaces/ns1/services", "dryRun=All"); } @Test @@ -197,8 +197,8 @@ void testResourceListDelete() throws IOException { // Then verify(mockClient, times(2)).send(any(), any()); - assertRequest("DELETE", "/api/v1/namespaces/ns1/services/svc1", "dryRun=All"); - assertRequest(1, "DELETE", "/api/v1/namespaces/ns1/pods/pod1", "dryRun=All"); + assertRequest("DELETE", "/api/v1/namespaces/ns1/pods/pod1", "dryRun=All"); + assertRequest(1, "DELETE", "/api/v1/namespaces/ns1/services/svc1", "dryRun=All"); } private Pod getPod(String name) { diff --git a/kubernetes-model-generator/kubernetes-model-core/src/main/java/io/fabric8/kubernetes/api/model/KubernetesList.java b/kubernetes-model-generator/kubernetes-model-core/src/main/java/io/fabric8/kubernetes/api/model/KubernetesList.java index 4a80e4f1e89..e5429024308 100644 --- a/kubernetes-model-generator/kubernetes-model-core/src/main/java/io/fabric8/kubernetes/api/model/KubernetesList.java +++ b/kubernetes-model-generator/kubernetes-model-core/src/main/java/io/fabric8/kubernetes/api/model/KubernetesList.java @@ -71,8 +71,6 @@ public String getApiVersion() { @Override public List getItems() { - List sortedItems = new ArrayList<>(super.getItems()); - Collections.sort(sortedItems, new HasMetadataComparator()); - return sortedItems; + return super.getItems(); } } diff --git a/kubernetes-model-generator/openshift-model/pom.xml b/kubernetes-model-generator/openshift-model/pom.xml index 0959f08b87f..baee9e0029e 100644 --- a/kubernetes-model-generator/openshift-model/pom.xml +++ b/kubernetes-model-generator/openshift-model/pom.xml @@ -99,25 +99,6 @@ org.jsonschema2pojo jsonschema2pojo-maven-plugin - - maven-antrun-plugin - - - generate-sources - - - Removing the duplicate generated class - - - - - run - - - - diff --git a/kubernetes-model-generator/openshift-model/src/main/java/io/fabric8/openshift/api/model/Template.java b/kubernetes-model-generator/openshift-model/src/generated/java/io/fabric8/openshift/api/model/Template.java similarity index 54% rename from kubernetes-model-generator/openshift-model/src/main/java/io/fabric8/openshift/api/model/Template.java rename to kubernetes-model-generator/openshift-model/src/generated/java/io/fabric8/openshift/api/model/Template.java index e78847dd615..2fe2b8afe2b 100644 --- a/kubernetes-model-generator/openshift-model/src/main/java/io/fabric8/openshift/api/model/Template.java +++ b/kubernetes-model-generator/openshift-model/src/generated/java/io/fabric8/openshift/api/model/Template.java @@ -1,36 +1,31 @@ -/** - * Copyright (C) 2015 Red Hat, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ + package io.fabric8.openshift.api.model; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import com.fasterxml.jackson.annotation.JsonAnyGetter; import com.fasterxml.jackson.annotation.JsonAnySetter; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.annotation.JsonPropertyOrder; -import com.fasterxml.jackson.databind.JsonDeserializer; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; +import io.fabric8.kubernetes.api.model.Container; import io.fabric8.kubernetes.api.model.HasMetadata; -import io.fabric8.kubernetes.api.model.HasMetadataComparator; +import io.fabric8.kubernetes.api.model.IntOrString; +import io.fabric8.kubernetes.api.model.LabelSelector; +import io.fabric8.kubernetes.api.model.LocalObjectReference; import io.fabric8.kubernetes.api.model.Namespaced; -import io.fabric8.kubernetes.api.model.ObjectMeta; -import io.fabric8.kubernetes.model.annotation.Generated; +import io.fabric8.kubernetes.api.model.ObjectReference; +import io.fabric8.kubernetes.api.model.PersistentVolumeClaim; +import io.fabric8.kubernetes.api.model.PodTemplateSpec; +import io.fabric8.kubernetes.api.model.ResourceRequirements; import io.fabric8.kubernetes.model.annotation.Group; import io.fabric8.kubernetes.model.annotation.Version; 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; @@ -38,222 +33,197 @@ import lombok.ToString; import lombok.experimental.Accessors; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - - -/** - * - * - */ +@JsonDeserialize(using = com.fasterxml.jackson.databind.JsonDeserializer.None.class) @JsonInclude(JsonInclude.Include.NON_NULL) -@Generated("org.jsonschema2pojo") @JsonPropertyOrder({ - "apiVersion", - "kind", - "metadata", - "labels", - "objects", - "parameters" + "apiVersion", + "kind", + "metadata", + "labels", + "message", + "objects", + "parameters" }) -@JsonDeserialize(using = JsonDeserializer.None.class) -@EqualsAndHashCode @ToString +@EqualsAndHashCode @Setter @Accessors(prefix = { "_", "" }) -@Buildable(editableEnabled = false, validationEnabled = false, generateBuilderPackage=false, builderPackage = "io.fabric8.kubernetes.api.builder") +@Buildable(editableEnabled = false, validationEnabled = false, generateBuilderPackage = false, lazyCollectionInitEnabled = false, builderPackage = "io.fabric8.kubernetes.api.builder", refs = { + @BuildableReference(io.fabric8.kubernetes.api.model.ObjectMeta.class), + @BuildableReference(LabelSelector.class), + @BuildableReference(Container.class), + @BuildableReference(PodTemplateSpec.class), + @BuildableReference(ResourceRequirements.class), + @BuildableReference(IntOrString.class), + @BuildableReference(ObjectReference.class), + @BuildableReference(LocalObjectReference.class), + @BuildableReference(PersistentVolumeClaim.class) +}) @Version("v1") -@Group("") +@Group("template.openshift.io") @TemplateTransformations({ @TemplateTransformation(value = "/manifest.vm", outputPath = "openshift.properties", gather = true) }) -public class Template implements HasMetadata, Namespaced { +public class Template implements HasMetadata, Namespaced +{ /** + * * (Required) + * */ @JsonProperty("apiVersion") - private String apiVersion = "template.openshift.io/v1"; + private java.lang.String apiVersion = "template.openshift.io/v1"; /** + * * (Required) + * */ @JsonProperty("kind") private java.lang.String kind = "Template"; - /** - * - * - */ @JsonProperty("labels") private Map labels; - /** - * - * - */ + @JsonProperty("message") + private java.lang.String message; @JsonProperty("metadata") - private ObjectMeta metadata; - /** - * - * - */ + private io.fabric8.kubernetes.api.model.ObjectMeta metadata; @JsonProperty("objects") - private List objects = new ArrayList<>(); - /** - * - * - */ + private List objects = new ArrayList(); @JsonProperty("parameters") - private List parameters = new ArrayList<>(); - + @JsonInclude(JsonInclude.Include.NON_EMPTY) + private List parameters = new ArrayList(); @JsonIgnore - private Map additionalProperties = new HashMap<>(); - + private Map additionalProperties = new HashMap(); /** * No args constructor for use in serialization + * */ public Template() { } /** + * + * @param metadata * @param apiVersion - * @param labels - * @param parameters - * @param objects * @param kind - * @param metadata + * @param objects + * @param message + * @param parameters + * @param labels */ - public Template(String apiVersion, java.lang.String kind, Map labels, ObjectMeta metadata, List objects, List parameters) { + public Template(java.lang.String apiVersion, java.lang.String kind, Map labels, java.lang.String message, io.fabric8.kubernetes.api.model.ObjectMeta metadata, List objects, List parameters) { + super(); this.apiVersion = apiVersion; this.kind = kind; this.labels = labels; + this.message = message; this.metadata = metadata; - this.parameters = parameters; this.objects = objects; + this.parameters = parameters; } /** + * * (Required) - * - * @return The apiVersion + * */ - @Override @JsonProperty("apiVersion") - public String getApiVersion() { + public java.lang.String getApiVersion() { return apiVersion; } /** + * * (Required) - * - * @param apiVersion The apiVersion + * */ - @Override @JsonProperty("apiVersion") - public void setApiVersion(String apiVersion) { + public void setApiVersion(java.lang.String apiVersion) { this.apiVersion = apiVersion; } /** + * * (Required) - * - * @return The kind + * */ - @Override @JsonProperty("kind") public java.lang.String getKind() { return kind; } /** + * * (Required) - * - * @param kind The kind + * */ @JsonProperty("kind") public void setKind(java.lang.String kind) { this.kind = kind; } - /** - * @return The labels - */ @JsonProperty("labels") public Map getLabels() { return labels; } - /** - * @param labels The labels - */ @JsonProperty("labels") public void setLabels(Map labels) { this.labels = labels; } - /** - * @return The metadata - */ - @Override + @JsonProperty("message") + public java.lang.String getMessage() { + return message; + } + + @JsonProperty("message") + public void setMessage(java.lang.String message) { + this.message = message; + } + @JsonProperty("metadata") - public ObjectMeta getMetadata() { + public io.fabric8.kubernetes.api.model.ObjectMeta getMetadata() { return metadata; } - /** - * @param metadata The metadata - */ - @Override @JsonProperty("metadata") - public void setMetadata(ObjectMeta metadata) { + public void setMetadata(io.fabric8.kubernetes.api.model.ObjectMeta metadata) { this.metadata = metadata; } - /** - * @return The objects - */ @JsonProperty("objects") public List getObjects() { - if (objects == null) { - return Collections.emptyList(); - } - final List sortedObjects = new ArrayList<>(objects); - sortedObjects.sort(new HasMetadataComparator()); - return sortedObjects; + return objects; } + @JsonProperty("objects") public void setObjects(List objects) { this.objects = objects; } - /** - * @return The parameters - */ @JsonProperty("parameters") public List getParameters() { return parameters; } - /** - * @param parameters The parameters - */ @JsonProperty("parameters") public void setParameters(List parameters) { this.parameters = parameters; } @JsonAnyGetter - public Map getAdditionalProperties() { + public Map getAdditionalProperties() { return this.additionalProperties; } @JsonAnySetter - public void setAdditionalProperty(java.lang.String name, java.lang.Object value) { + public void setAdditionalProperty(java.lang.String name, Object value) { this.additionalProperties.put(name, value); } + } diff --git a/kubernetes-model-generator/openshift-model/src/main/resources/schema/validation-schema.json b/kubernetes-model-generator/openshift-model/src/main/resources/schema/validation-schema.json index 1362fd78c98..816c59c7036 100644 --- a/kubernetes-model-generator/openshift-model/src/main/resources/schema/validation-schema.json +++ b/kubernetes-model-generator/openshift-model/src/main/resources/schema/validation-schema.json @@ -21851,7 +21851,13 @@ }, "objectreference": { "properties": { - "group": { + "apiVersion": { + "type": "string" + }, + "fieldPath": { + "type": "string" + }, + "kind": { "type": "string" }, "name": { @@ -21860,7 +21866,10 @@ "namespace": { "type": "string" }, - "resource": { + "resourceVersion": { + "type": "string" + }, + "uid": { "type": "string" } }, diff --git a/kubernetes-model-generator/openshift-model/src/test/java/io/fabric8/kubernetes/api/model/TemplateTest.java b/kubernetes-model-generator/openshift-model/src/test/java/io/fabric8/kubernetes/api/model/TemplateTest.java index 8bbbde6606f..98d19441fda 100644 --- a/kubernetes-model-generator/openshift-model/src/test/java/io/fabric8/kubernetes/api/model/TemplateTest.java +++ b/kubernetes-model-generator/openshift-model/src/test/java/io/fabric8/kubernetes/api/model/TemplateTest.java @@ -15,44 +15,22 @@ */ package io.fabric8.kubernetes.api.model; -import com.fasterxml.jackson.databind.ObjectMapper; import io.fabric8.openshift.api.model.Project; import io.fabric8.openshift.api.model.ProjectBuilder; import io.fabric8.openshift.api.model.Template; import io.fabric8.openshift.api.model.TemplateBuilder; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -import java.io.IOException; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; class TemplateTest { - private static ObjectMapper objectMapper; - - @BeforeAll - static void beforeAll() { - objectMapper = new ObjectMapper(); - } - @Test - @DisplayName("getObjects, with objects member field null, should return empty List") - void getObjectsWithNullFieldShouldReturnEmptyList() { - // Given - final Template template = new Template(); - template.setObjects(null); - // When - final List result = template.getObjects(); - // Then - assertThat(result).isNotNull().isEmpty(); - } - - @Test - @DisplayName("getObjects, with objects, should return sorted List") - void getObjectsWithObjectsShouldReturnSortedList() { + @DisplayName("getObjects, with objects, should return List") + void getObjectsWithObjectsShouldReturnList() { // Given final Template template = new TemplateBuilder() .addToObjects(new SecretBuilder().build()) @@ -64,18 +42,7 @@ void getObjectsWithObjectsShouldReturnSortedList() { // Then assertThat(result) .extracting("class") - .containsExactly(Project.class, Secret.class, Service.class); + .containsExactly(Secret.class, Service.class, Project.class); } - @Test - @DisplayName("serialize from deserialized, with null objects, should serialize") - void serializeFromDeserializedWithNullObjectsShouldSerialize() throws IOException { - // Given - final Template template = objectMapper.readValue( - TemplateTest.class.getResource("/template-with-null-objects.json").openStream(), Template.class); - // When - final String result = objectMapper.writeValueAsString(template); - // Then - assertThat(result).contains("\"objects\":[]"); - } } diff --git a/kubernetes-tests/src/test/java/io/fabric8/openshift/client/server/mock/OpenShiftLoadTest.java b/kubernetes-tests/src/test/java/io/fabric8/openshift/client/server/mock/OpenShiftLoadTest.java index 52b0a45f707..38c5feb568e 100644 --- a/kubernetes-tests/src/test/java/io/fabric8/openshift/client/server/mock/OpenShiftLoadTest.java +++ b/kubernetes-tests/src/test/java/io/fabric8/openshift/client/server/mock/OpenShiftLoadTest.java @@ -39,7 +39,7 @@ void testResourceGetFromLoadWhenSingleDocumentsWithStartingDelimiter() { // then assertNotNull(result); assertEquals(5, result.size()); - HasMetadata deploymentResource = result.get(1); + HasMetadata deploymentResource = result.get(2); assertEquals("v1", deploymentResource.getApiVersion()); assertEquals("ImageStream", deploymentResource.getKind()); assertEquals("eap-app", deploymentResource.getMetadata().getName());