From 4b83328fe1826c01efdb7e47943b7ecba520f508 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Thu, 11 Nov 2021 20:28:20 +0530 Subject: [PATCH] Fix #802: Update Fabric8 Kubernetes Client to v5.10.1 Signed-off-by: Rohan Kumar --- CHANGELOG.md | 1 + .../kit/common/GenericCustomResource.java | 98 ------------ .../common/GenericCustomResourceBuilder.java | 43 ------ .../kit/common/util/KubernetesHelper.java | 58 +++---- .../jkube/kit/common/util/ResourceUtil.java | 16 +- ...nericCustomResourceEqualsHashCodeTest.java | 78 ---------- ...enericCustomResourceSerializationTest.java | 132 ---------------- .../kit/common/util/KubernetesHelperTest.java | 104 ++++--------- .../kit/common/util/ResourceUtilTest.java | 10 +- .../kit/config/service/ApplyService.java | 44 +++--- .../kubernetes/KubernetesClientUtil.java | 30 +--- .../kubernetes/KubernetesUndeployService.java | 22 +-- .../kit/config/service/ApplyServiceTest.java | 144 +++++++++--------- .../kubernetes/KubernetesClientUtilTest.java | 3 +- .../KubernetesUndeployServiceTest.java | 33 ++-- .../OpenshiftBuildServiceIntegrationTest.java | 34 ++--- .../api/util/KubernetesResourceUtil.java | 4 +- .../generic/DefaultMetadataEnricherTest.java | 7 +- jkube-kit/parent/pom.xml | 2 +- .../kit/resource/service/WriteUtilTest.java | 6 +- .../src/main/jkube/framework-crd.yml | 16 +- .../src/main/jkube/framework-crd.yml | 16 +- 22 files changed, 229 insertions(+), 672 deletions(-) delete mode 100644 jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/GenericCustomResource.java delete mode 100644 jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/GenericCustomResourceBuilder.java delete mode 100644 jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/GenericCustomResourceEqualsHashCodeTest.java delete mode 100644 jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/GenericCustomResourceSerializationTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 59811171cd..db4ae9a6ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ Usage: ``` ### 1.6.0-SNAPSHOT * Fix #887: Incorrect warning about overriding environment variable +* Fix #802: Update Fabric8 kubernetes Client to v5.10.1 ### 1.5.1 (2021-10-28) * Fix #1084: Gradle dependencies should be test or provided scope diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/GenericCustomResource.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/GenericCustomResource.java deleted file mode 100644 index d775b3ec08..0000000000 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/GenericCustomResource.java +++ /dev/null @@ -1,98 +0,0 @@ -/** - * Copyright (c) 2019 Red Hat, Inc. - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at: - * - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * Red Hat, Inc. - initial API and implementation - */ -package org.eclipse.jkube.kit.common; - -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.databind.JsonDeserializer; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; -import io.fabric8.kubernetes.api.model.HasMetadata; -import io.fabric8.kubernetes.api.model.ObjectMeta; - -import java.util.HashMap; -import java.util.Map; -import java.util.Objects; - -// Required if using any of the ObjectMappers provided by KubernetesDeserializer (yamlMapper, jsonMapper) -@JsonDeserialize( - using = JsonDeserializer.None.class -) -@JsonInclude(JsonInclude.Include.NON_NULL) -public class GenericCustomResource implements HasMetadata { - - @JsonProperty("apiVersion") - private String apiVersion; - @JsonProperty("kind") - private String kind; - @JsonProperty("metadata") - private ObjectMeta metadata; - @JsonIgnore - private transient Map additionalProperties = new HashMap<>(); - - @Override - public String getApiVersion() { - return apiVersion; - } - - public void setApiVersion(String apiVersion) { - this.apiVersion = apiVersion; - } - - @Override - public String getKind() { - return kind; - } - - public void setKind(String kind) { - this.kind = kind; - } - - public ObjectMeta getMetadata() { - return metadata; - } - - public void setMetadata(ObjectMeta metadata) { - this.metadata = metadata; - } - - @JsonAnyGetter - public Map getAdditionalProperties() { - return this.additionalProperties; - } - - public void setAdditionalProperties(Map additionalProperties) { - this.additionalProperties = additionalProperties; - } - - @JsonAnySetter - public void setAdditionalProperty(String name, Object value) { - this.additionalProperties.put(name, value); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - GenericCustomResource that = (GenericCustomResource) o; - return Objects.equals(apiVersion, that.apiVersion) && Objects.equals(kind, that.kind) && Objects.equals(metadata, that.metadata) && Objects.equals(additionalProperties, that.additionalProperties); - } - - @Override - public int hashCode() { - return Objects.hash(apiVersion, kind, metadata, additionalProperties); - } -} diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/GenericCustomResourceBuilder.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/GenericCustomResourceBuilder.java deleted file mode 100644 index b887932237..0000000000 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/GenericCustomResourceBuilder.java +++ /dev/null @@ -1,43 +0,0 @@ -/** - * Copyright (c) 2019 Red Hat, Inc. - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at: - * - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * Red Hat, Inc. - initial API and implementation - */ -package org.eclipse.jkube.kit.common; - -import io.fabric8.kubernetes.api.builder.BaseFluent; -import io.fabric8.kubernetes.api.builder.VisitableBuilder; -import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; - -import java.util.HashMap; - -public class GenericCustomResourceBuilder extends BaseFluent - implements VisitableBuilder { - - private final GenericCustomResource genericCustomResource; - private final ObjectMetaBuilder metadata; - - public GenericCustomResourceBuilder(GenericCustomResource item) { - this.genericCustomResource = new GenericCustomResource(); - this.genericCustomResource.setApiVersion(item.getApiVersion()); - this.genericCustomResource.setKind(item.getKind()); - this.genericCustomResource.setAdditionalProperties(new HashMap<>(item.getAdditionalProperties())); - metadata = item.getMetadata() == null ? new ObjectMetaBuilder() : new ObjectMetaBuilder(item.getMetadata()); - _visitables.get("metadata").add(this.metadata); - } - - @Override - public GenericCustomResource build() { - genericCustomResource.setMetadata(metadata.build()); - return genericCustomResource; - } - -} diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/KubernetesHelper.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/KubernetesHelper.java index 0c805ed840..3474f98b3a 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/KubernetesHelper.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/KubernetesHelper.java @@ -36,12 +36,15 @@ import java.util.Objects; import java.util.Optional; import java.util.concurrent.CountDownLatch; -import java.util.function.Predicate; import java.util.regex.Pattern; import java.util.stream.Collectors; +import io.fabric8.kubernetes.api.model.APIResource; +import io.fabric8.kubernetes.api.model.APIResourceList; +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.api.model.HTTPHeader; -import org.eclipse.jkube.kit.common.GenericCustomResource; +import io.fabric8.kubernetes.client.utils.ApiVersionUtil; +import io.fabric8.kubernetes.model.Scope; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.ResourceFileType; @@ -70,9 +73,6 @@ import io.fabric8.kubernetes.api.model.ReplicationController; import io.fabric8.kubernetes.api.model.ReplicationControllerSpec; import io.fabric8.kubernetes.api.model.Service; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionList; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionVersion; import io.fabric8.kubernetes.api.model.apps.DaemonSet; import io.fabric8.kubernetes.api.model.apps.DaemonSetSpec; import io.fabric8.kubernetes.api.model.apps.Deployment; @@ -99,8 +99,6 @@ import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; -import static io.fabric8.kubernetes.client.utils.ApiVersionUtil.trimGroup; -import static io.fabric8.kubernetes.client.utils.ApiVersionUtil.trimVersion; /** * @author roland @@ -952,10 +950,21 @@ public static boolean isControllerResource(HasMetadata h) { return Arrays.stream(POD_CONTROLLER_KINDS).anyMatch(c -> c.equals(h.getKind())); } - public static CustomResourceDefinitionContext getCrdContext(CustomResourceDefinitionList customResourceDefinitionList, GenericCustomResource customResource) { - return findCrdForCustomResource(customResourceDefinitionList, customResource) - .map(CustomResourceDefinitionContext::fromCrd) + public static CustomResourceDefinitionContext getCrdContext(APIResourceList customResourceDefinitionList, GenericKubernetesResource customResource) { + APIResource apiResource = customResourceDefinitionList.getResources().stream() + .filter(r -> r.getSingularName().equals(customResource.getKind().toLowerCase())) + .findFirst() .orElse(null); + if (apiResource != null) { + return new CustomResourceDefinitionContext.Builder() + .withGroup(ApiVersionUtil.trimGroup(customResource.getApiVersion())) + .withVersion(ApiVersionUtil.trimVersion(customResource.getApiVersion())) + .withScope(Boolean.TRUE.equals(apiResource.getNamespaced()) ? Scope.NAMESPACED.value() : Scope.CLUSTER.value()) + .withPlural(apiResource.getName()) + .withKind(apiResource.getKind()) + .build(); + } + return null; } public static List convertMapToHTTPHeaderList(Map headers) { @@ -967,34 +976,5 @@ public static List convertMapToHTTPHeaderList(Map he } return httpHeaders; } - - private static Optional findCrdForCustomResource(CustomResourceDefinitionList crdList, GenericCustomResource gcr) { - return crdList.getItems().stream() - .filter(hasGroup(gcr)) - .filter(isVersionPresentInSpecVersion(gcr).or(isVersionPresentInVersionsList(gcr))) - .filter(hasKind(gcr)) - .findFirst(); - } - - private static Predicate hasGroup(GenericCustomResource gcr) { - return crd -> crd.getSpec().getGroup().equals(trimGroup(gcr.getApiVersion())); - } - - private static Predicate isVersionPresentInSpecVersion(GenericCustomResource gcr) { - final String gcrVersion = trimVersion(gcr.getApiVersion()); - return crd -> crd.getSpec().getVersion() != null && crd.getSpec().getVersion().equals(gcrVersion); - } - - private static Predicate isVersionPresentInVersionsList(GenericCustomResource gcr) { - final String gcrVersion = trimVersion(gcr.getApiVersion()); - return crd -> crd.getSpec().getVersions() != null && crd.getSpec().getVersions() - .stream() - .map(CustomResourceDefinitionVersion::getName) - .anyMatch(n -> n.equals(gcrVersion)); - } - - private static Predicate hasKind(GenericCustomResource gcr) { - return crd -> crd.getSpec().getNames().getKind().equals(gcr.getKind()); - } } diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/ResourceUtil.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/ResourceUtil.java index 65f6045981..31ff2890ea 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/ResourceUtil.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/ResourceUtil.java @@ -32,13 +32,13 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.google.gson.JsonObject; +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.api.model.KubernetesList; import io.fabric8.kubernetes.api.model.KubernetesResource; import io.fabric8.openshift.api.model.Template; import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; -import org.eclipse.jkube.kit.common.GenericCustomResource; import org.eclipse.jkube.kit.common.ResourceFileType; import org.apache.commons.lang3.StringUtils; @@ -95,7 +95,7 @@ private static List parseKubernetesListOrTemplate(ObjectMapper mapp private static List parseKubernetesList(ObjectMapper mapper, Map manifest) { final List> items = (List>)manifest.get("items"); return items.stream().map(item -> { - final GenericCustomResource fallback = mapper.convertValue(item, GenericCustomResource.class); + final GenericKubernetesResource fallback = mapper.convertValue(item, GenericKubernetesResource.class); try { // Convert Using KubernetesDeserializer or fail and return fallback generic return mapper.convertValue(fallback, HasMetadata.class); @@ -111,8 +111,8 @@ public static T load(File file, Class clazz) t return load(file, clazz, type); } - private static boolean isGenericCustomResourceCompatible(Class clazz){ - return clazz.isAssignableFrom(GenericCustomResource.class); + private static boolean isGenericKubernetesResourceCompatible(Class clazz){ + return clazz.isAssignableFrom(GenericKubernetesResource.class); } public static T load(File file, Class clazz, ResourceFileType resourceFileType) @@ -120,8 +120,8 @@ public static T load(File file, Class clazz, R try { return getObjectMapper(resourceFileType).readValue(file, clazz); } catch(IOException ex) { - if (isGenericCustomResourceCompatible(clazz)) { - return clazz.cast(getObjectMapper(resourceFileType).readValue(file, GenericCustomResource.class)); + if (isGenericKubernetesResourceCompatible(clazz)) { + return clazz.cast(getObjectMapper(resourceFileType).readValue(file, GenericKubernetesResource.class)); } throw ex; } @@ -134,8 +134,8 @@ public static T load(InputStream in, Class cla IOUtils.copy(in, baos); return getObjectMapper(resourceFileType).readValue(baos.toByteArray(), clazz); } catch(IOException ex) { - if (isGenericCustomResourceCompatible(clazz)) { - return clazz.cast(getObjectMapper(resourceFileType).readValue(baos.toByteArray(), GenericCustomResource.class)); + if (isGenericKubernetesResourceCompatible(clazz)) { + return clazz.cast(getObjectMapper(resourceFileType).readValue(baos.toByteArray(), GenericKubernetesResource.class)); } throw ex; } diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/GenericCustomResourceEqualsHashCodeTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/GenericCustomResourceEqualsHashCodeTest.java deleted file mode 100644 index 2729111c58..0000000000 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/GenericCustomResourceEqualsHashCodeTest.java +++ /dev/null @@ -1,78 +0,0 @@ -/** - * Copyright (c) 2019 Red Hat, Inc. - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at: - * - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * Red Hat, Inc. - initial API and implementation - */ -package org.eclipse.jkube.kit.common; - -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Set; - -import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; -import org.junit.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -public class GenericCustomResourceEqualsHashCodeTest { - - @Test - public void equals_withNull_shouldBeFalse() { - // Given - final GenericCustomResource gcr = new GenericCustomResource(); - // When - Then - final boolean result = gcr.equals(null); - // Then - assertThat(result).isFalse(); - } - - @Test - public void equals_withSameFields_shouldBeTrue() { - // Given - final GenericCustomResource one = initGenericCustomResource(); - final GenericCustomResource other = initGenericCustomResource(); - // When - Then - assertThat(one).isEqualTo(other).isNotSameAs(other); - } - - @Test - public void equals_withDifferentMapFields_shouldBeFalse() { - // Given - final GenericCustomResource one = initGenericCustomResource(); - final GenericCustomResource other = initGenericCustomResource(); - other.setAdditionalProperty("extra", "other"); - // When - Then - assertThat(one).isNotEqualTo(other).isNotSameAs(other); - } - - @Test - public void hashSet_withSomeDuplicates_duplicatesAreRemoved() { - // Given - final Set uniqueValues = new HashSet<>(); - uniqueValues.add(initGenericCustomResource()); - uniqueValues.add(initGenericCustomResource()); - final GenericCustomResource different = initGenericCustomResource(); - different.setKind("Other"); - uniqueValues.add(different); - // When - Then - assertThat(uniqueValues).hasSize(2).extracting("kind").containsExactlyInAnyOrder("Kind", "Other"); - } - - private GenericCustomResource initGenericCustomResource() { - final GenericCustomResource gcr = new GenericCustomResource(); - gcr.setApiVersion("v1"); - gcr.setKind("Kind"); - gcr.setMetadata(new ObjectMetaBuilder().withName("name").build()); - gcr.setAdditionalProperties(new HashMap<>(Collections.singletonMap("key", "value"))); - return gcr; - } -} diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/GenericCustomResourceSerializationTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/GenericCustomResourceSerializationTest.java deleted file mode 100644 index ce2c641ab0..0000000000 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/GenericCustomResourceSerializationTest.java +++ /dev/null @@ -1,132 +0,0 @@ -/** - * Copyright (c) 2019 Red Hat, Inc. - * This program and the accompanying materials are made - * available under the terms of the Eclipse Public License 2.0 - * which is available at: - * - * https://www.eclipse.org/legal/epl-2.0/ - * - * SPDX-License-Identifier: EPL-2.0 - * - * Contributors: - * Red Hat, Inc. - initial API and implementation - */ -package org.eclipse.jkube.kit.common; - -import io.fabric8.kubernetes.api.builder.TypedVisitor; -import io.fabric8.kubernetes.api.model.KubernetesList; -import io.fabric8.kubernetes.api.model.KubernetesListBuilder; -import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; -import io.fabric8.kubernetes.client.utils.Serialization; -import org.junit.Test; - -import java.io.IOException; -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; - -public class GenericCustomResourceSerializationTest { - - @Test - public void deserializeCustomResource() throws IOException { - // When - final GenericCustomResource result = Serialization.yamlMapper() - .readValue(GenericCustomResourceSerializationTest.class.getResourceAsStream("/generic-resource/strimzi-cr.yaml"), GenericCustomResource.class); - // Then - assertThat(result) - .hasFieldOrPropertyWithValue("metadata.name", "my-cluster") - .extracting(GenericCustomResource::getAdditionalProperties) - .hasFieldOrPropertyWithValue("spec.kafka.version", "2.6.0") - .hasFieldOrPropertyWithValue("spec.kafka.storage.type", "jbod"); - } - - @Test - public void serializeRandomResource() throws IOException { - // Given - final GenericCustomResource input = new GenericCustomResource(); - Map additionalProperties = new HashMap<>(); - additionalProperties.put("field-1", "val-1"); - additionalProperties.put("field-2", "val-2"); - input.setMetadata(new ObjectMetaBuilder().withName("random-resource").build()); - input.setAdditionalProperties(new LinkedHashMap<>()); //Preserve insertion order for verification - input.getAdditionalProperties().put("kind", "Kind"); - input.setAdditionalProperty("spec", additionalProperties); - // When - final String result = Serialization.yamlMapper().writeValueAsString(input); - // Then - assertThat(result).isEqualTo( - "---\n" + - "metadata:\n" + - " name: \"random-resource\"\n" + - "kind: \"Kind\"\n" + - "spec:\n" + - " field-1: \"val-1\"\n" + - " field-2: \"val-2\"\n" - ); - } - - @Test - public void serializeRandomResourceInListWithVisitor() throws IOException { - // Given - final GenericCustomResource gr = new GenericCustomResource(); - gr.setKind("Kind"); - gr.setApiVersion("test.marcnuri.com/v1beta1"); - gr.setMetadata(new ObjectMetaBuilder().withName("random-resource").build()); - final KubernetesList kl = new KubernetesListBuilder() - .addToItems(gr) - .accept(new TypedVisitor() { - @Override - public void visit(ObjectMetaBuilder element) { - element.addToAnnotations("test", "annotation"); - } - }) - .build(); - // When - final String result = Serialization.yamlMapper().writeValueAsString(kl); - // Then - assertThat(result).isEqualTo( - "---\n" + - "apiVersion: \"v1\"\n" + - "kind: \"List\"\n" + - "items:\n" + - "- apiVersion: \"test.marcnuri.com/v1beta1\"\n" + - " kind: \"Kind\"\n" + - " metadata:\n" + - " annotations:\n" + - " test: \"annotation\"\n" + - " name: \"random-resource\"\n" - ); - } - - @Test - public void serializeRandomResourceInList() throws IOException { - // Given - final GenericCustomResource gr = new GenericCustomResource(); - gr.setKind("Kind"); - gr.setApiVersion("test.marcnuri.com/v1beta1"); - gr.setMetadata(new ObjectMetaBuilder().withName("random-resource").build()); - final KubernetesList kl = new KubernetesListBuilder() - .addNewPodItem().withNewMetadata().withName("test-pod").endMetadata().endPodItem() - .addToItems(gr) - .build(); - // When - final String result = Serialization.yamlMapper().writeValueAsString(kl); - // Then - assertThat(result).isEqualTo( - "---\n" + - "apiVersion: \"v1\"\n" + - "kind: \"List\"\n" + - "items:\n" + - "- apiVersion: \"test.marcnuri.com/v1beta1\"\n" + - " kind: \"Kind\"\n" + - " metadata:\n" + - " name: \"random-resource\"\n" + - "- apiVersion: \"v1\"\n" + - " kind: \"Pod\"\n" + - " metadata:\n" + - " name: \"test-pod\"\n" - ); - } -} diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/KubernetesHelperTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/KubernetesHelperTest.java index 66db8e5235..b9bacb4aec 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/KubernetesHelperTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/KubernetesHelperTest.java @@ -24,9 +24,12 @@ import java.util.Map; import java.util.Set; +import io.fabric8.kubernetes.api.model.APIResource; +import io.fabric8.kubernetes.api.model.APIResourceBuilder; +import io.fabric8.kubernetes.api.model.APIResourceList; +import io.fabric8.kubernetes.api.model.APIResourceListBuilder; +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.api.model.HTTPHeader; -import org.assertj.core.api.AssertionsForClassTypes; -import org.eclipse.jkube.kit.common.GenericCustomResource; import org.eclipse.jkube.kit.common.KitLogger; import io.fabric8.kubernetes.api.model.ConfigMapBuilder; @@ -36,18 +39,11 @@ import io.fabric8.kubernetes.api.model.EnvVarBuilder; import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.api.model.Namespace; -import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.fabric8.kubernetes.api.model.Quantity; import io.fabric8.kubernetes.api.model.ReplicationControllerBuilder; import io.fabric8.kubernetes.api.model.Service; import io.fabric8.kubernetes.api.model.ServiceBuilder; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionBuilder; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionList; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionListBuilder; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionNamesBuilder; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionSpecBuilder; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionVersionBuilder; + import io.fabric8.kubernetes.api.model.apps.DaemonSetBuilder; import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder; import io.fabric8.kubernetes.api.model.apps.ReplicaSetBuilder; @@ -425,7 +421,7 @@ public void loadResourcesWithNestedTemplateAndDuplicateResources() throws IOExce // Then assertThat(result) .hasSize(3) - .hasOnlyElementsOfTypes(Namespace.class, GenericCustomResource.class, Template.class) + .hasOnlyElementsOfTypes(Namespace.class, GenericKubernetesResource.class, Template.class) .extracting("metadata.name") .containsExactly("should-be-first", "custom-resource", "template-example"); } @@ -440,7 +436,7 @@ public void loadResourcesWithDuplicateAndSameNameCustomResources() throws IOExce // Then assertThat(result) .hasSize(3) - .hasOnlyElementsOfTypes(Namespace.class, GenericCustomResource.class) + .hasOnlyElementsOfTypes(Namespace.class, GenericKubernetesResource.class) .extracting("metadata.name") .containsExactly("should-be-first", "custom-resource", "custom-resource"); } @@ -448,12 +444,12 @@ public void loadResourcesWithDuplicateAndSameNameCustomResources() throws IOExce @Test public void testGetCrdContextReturnsValidCrdContext() { // Given - final CustomResourceDefinitionList crdList = crdList(); - GenericCustomResource genericCustomResource = new GenericCustomResource(); - genericCustomResource.setApiVersion("jkube.eclipse.org/v1alpha1"); - genericCustomResource.setKind("JKubeCustomResource"); + final APIResourceList crdList = resourceList(); + GenericKubernetesResource genericKubernetesResource = new GenericKubernetesResource(); + genericKubernetesResource.setApiVersion("jkube.eclipse.org/v1alpha1"); + genericKubernetesResource.setKind("JKubeCustomResource"); // When - CustomResourceDefinitionContext result = KubernetesHelper.getCrdContext(crdList, genericCustomResource); + CustomResourceDefinitionContext result = KubernetesHelper.getCrdContext(crdList, genericKubernetesResource); // Then assertThat(result) .hasFieldOrPropertyWithValue("group", "jkube.eclipse.org") @@ -463,33 +459,15 @@ public void testGetCrdContextReturnsValidCrdContext() { .hasFieldOrPropertyWithValue("plural", "jkubecustomresources"); } - @Test - public void testGetCrdContextWithVersionInListReturnsValidCrdContext() { - // Given - final CustomResourceDefinitionList crdList = crdList(); - GenericCustomResource genericCustomResource = new GenericCustomResource(); - genericCustomResource.setApiVersion("jkube.eclipse.org/v1"); - genericCustomResource.setKind("JKubeCustomResource"); - // When - CustomResourceDefinitionContext result = KubernetesHelper.getCrdContext(crdList, genericCustomResource); - // Then - assertThat(result) - .hasFieldOrPropertyWithValue("group", "jkube.eclipse.org") - .hasFieldOrPropertyWithValue("kind", "JKubeCustomResource") - .hasFieldOrPropertyWithValue("version", "v1") - .hasFieldOrPropertyWithValue("scope", "Namespaced") - .hasFieldOrPropertyWithValue("plural", "jkubecustomresourcesinlist"); - } - @Test public void testGetCrdContextReturnsNullCrdContext() { // Given - final CustomResourceDefinitionList crdList = crdList(); - GenericCustomResource genericCustomResource = new GenericCustomResource(); - genericCustomResource.setApiVersion("jkube.eclipse.org/v1alpha1"); - genericCustomResource.setKind("Unknown"); + final APIResourceList crdList = resourceList(); + GenericKubernetesResource genericKubernetesResource = new GenericKubernetesResource(); + genericKubernetesResource.setApiVersion("jkube.eclipse.org/v1alpha1"); + genericKubernetesResource.setKind("Unknown"); // When - CustomResourceDefinitionContext crdContext = KubernetesHelper.getCrdContext(crdList, genericCustomResource); + CustomResourceDefinitionContext crdContext = KubernetesHelper.getCrdContext(crdList, genericKubernetesResource); // Then assertThat(crdContext).isNull(); } @@ -537,44 +515,20 @@ private List getRemoteFragments() { return remoteStrList; } - private static CustomResourceDefinitionList crdList() { - return new CustomResourceDefinitionListBuilder().addToItems( - crd("jkubecustomresources", "jkube.eclipse.org", "v1beta1", "JKubeCustomResource"), - crd("jkubecustomresources", "jkube.eclipse.org", "v1alpha1", "JKubeCustomResource"), - crd("jkubecustomresources", "jkube.eclipse.org", "v2", "JKubeCustomResource"), - crdVL("jkubecustomresourcesinlist", "jkube.eclipse.org", "v1", "JKubeCustomResource"), - crd("jkubepods", "jkube.eclipse.org", "v2", "JKubePods"), - crd("jkubepods", "jkube.eclipse.org", "v1alpha1", "JKubePods"), - crdVL("jkubepods", "jkube.eclipse.org", "v1", "JKubePods"), - crdVL("odds", "other.eclipse.org", "v1", "Odd") + private static APIResourceList resourceList() { + return new APIResourceListBuilder().addToResources( + resource("jkubecustomresources", "jkube.eclipse.org", "JKubeCustomResource"), + resource("jkubepods", "jkube.eclipse.org", "JKubePods") ).build(); } - private static CustomResourceDefinition crd(String plural, String group, String version, String kind) { - return new CustomResourceDefinitionBuilder() - .withMetadata(new ObjectMetaBuilder() - .withName(plural + group) - .build()) - .withSpec(new CustomResourceDefinitionSpecBuilder() - .withGroup(group) - .withVersion(version) - .withScope("Namespaced") - .withNames(new CustomResourceDefinitionNamesBuilder() - .withKind(kind) - .withPlural(plural) - .build()) - .build()) - .build(); - } - - private static CustomResourceDefinition crdVL(String plural, String group, String version, String kind) { - return new CustomResourceDefinitionBuilder(crd(plural, group, version, kind)) - .editSpec() - .withVersion(null) - .withVersions(new CustomResourceDefinitionVersionBuilder() - .withName(version) - .build()) - .endSpec() + private static APIResource resource(String plural, String group, String kind) { + return new APIResourceBuilder() + .withName(plural) + .withGroup(group) + .withKind(kind) + .withNamespaced(true) + .withSingularName(kind.toLowerCase()) .build(); } diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/ResourceUtilTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/ResourceUtilTest.java index 20cd22e3e3..cbeb8dce9c 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/ResourceUtilTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/ResourceUtilTest.java @@ -17,6 +17,7 @@ import com.google.gson.JsonParser; import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.api.model.EnvVarBuilder; +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.api.model.Pod; import io.fabric8.kubernetes.api.model.Service; @@ -24,7 +25,6 @@ import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition; import io.fabric8.openshift.api.model.Template; import org.assertj.core.api.InstanceOfAssertFactories; -import org.eclipse.jkube.kit.common.GenericCustomResource; import org.eclipse.jkube.kit.common.ResourceFileType; import org.junit.Test; @@ -134,7 +134,7 @@ public void testDeserializeKubernetesListOrTemplateWithTemplateFile() throws IOE } @Test - public void load_withCustomResourceFile_shouldLoadGenericCustomResource() throws Exception { + public void load_withCustomResourceFile_shouldLoadGenericKubernetesResource() throws Exception { // When final HasMetadata result = ResourceUtil.load( new File(ResourceUtilTest.class.getResource( "/util/resource-util/custom-resource-cr.yml").getFile()), @@ -142,13 +142,13 @@ public void load_withCustomResourceFile_shouldLoadGenericCustomResource() throws ); // Then assertThat(result) - .isInstanceOf(GenericCustomResource.class) + .isInstanceOf(GenericKubernetesResource.class) .hasFieldOrPropertyWithValue("kind", "SomeCustomResource") .hasFieldOrPropertyWithValue("metadata.name", "my-custom-resource"); } @Test - public void load_withCustomResourceStream_shouldLoadGenericCustomResource() throws Exception { + public void load_withCustomResourceStream_shouldLoadGenericKubernetesResource() throws Exception { // When final HasMetadata result = ResourceUtil.load( ResourceUtilTest.class.getResourceAsStream( "/util/resource-util/custom-resource-cr.yml"), @@ -157,7 +157,7 @@ public void load_withCustomResourceStream_shouldLoadGenericCustomResource() thro ); // Then assertThat(result) - .isInstanceOf(GenericCustomResource.class) + .isInstanceOf(GenericKubernetesResource.class) .hasFieldOrPropertyWithValue("kind", "SomeCustomResource") .hasFieldOrPropertyWithValue("metadata.name", "my-custom-resource"); } diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/ApplyService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/ApplyService.java index 8fdfc78726..2bde882127 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/ApplyService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/ApplyService.java @@ -26,7 +26,8 @@ import java.util.Set; import java.util.stream.Collectors; -import org.eclipse.jkube.kit.common.GenericCustomResource; +import io.fabric8.kubernetes.api.model.APIResourceList; +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.FileUtil; import org.eclipse.jkube.kit.common.util.KubernetesHelper; @@ -50,7 +51,6 @@ import io.fabric8.kubernetes.api.model.Service; import io.fabric8.kubernetes.api.model.ServiceAccount; import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionList; import io.fabric8.kubernetes.api.model.apps.DaemonSet; import io.fabric8.kubernetes.api.model.apps.Deployment; import io.fabric8.kubernetes.api.model.apps.ReplicaSet; @@ -65,7 +65,6 @@ import io.fabric8.kubernetes.client.dsl.MixedOperation; import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.kubernetes.client.dsl.base.CustomResourceDefinitionContext; -import io.fabric8.kubernetes.client.utils.Serialization; import io.fabric8.openshift.api.model.BuildConfig; import io.fabric8.openshift.api.model.DeploymentConfig; import io.fabric8.openshift.api.model.ImageStream; @@ -207,8 +206,8 @@ private void applyEntity(Object dto, String sourceName) { applyNamespace((Namespace) dto); } else if (dto instanceof Project) { applyProject((Project) dto); - } else if (dto instanceof GenericCustomResource) { - applyGenericCustomResource((GenericCustomResource) dto, sourceName); + } else if (dto instanceof GenericKubernetesResource) { + applyGenericKubernetesResource((GenericKubernetesResource) dto, sourceName); } else if (dto instanceof HasMetadata) { HasMetadata entity = (HasMetadata) dto; try { @@ -222,17 +221,14 @@ private void applyEntity(Object dto, String sourceName) { } } - public void applyGenericCustomResource(GenericCustomResource dto, String sourceName) { - try { - CustomResourceDefinitionList crdList = kubernetesClient.apiextensions().v1beta1().customResourceDefinitions().list(); - CustomResourceDefinitionContext crdContext = getCrdContext(crdList, dto); - if (crdContext == null) { - onApplyError(String.format("Unable to find CustomResourceDefinition for CustomResource: %s#%s", - dto.getApiVersion(), dto.getKind()), null); - } + public void applyGenericKubernetesResource(GenericKubernetesResource dto, String sourceName) { + APIResourceList apiResourceList = kubernetesClient.getApiResources(dto.getApiVersion()); + CustomResourceDefinitionContext crdContext = getCrdContext(apiResourceList, dto); + if (crdContext != null) { applyCustomResource(crdContext, dto, sourceName); - } catch (IOException exception) { - onApplyError("Failed to apply " + getKind(dto) + " from " + sourceName + ". ", exception); + } else { + onApplyError(String.format("Unable to find CustomResourceDefinition for CustomResource: %s#%s", + dto.getApiVersion(), dto.getKind()), null); } } @@ -483,27 +479,25 @@ private void doCreateCustomResourceDefinition(CustomResourceDefinition entity, S } } - private void applyCustomResource(CustomResourceDefinitionContext context, GenericCustomResource genericCustomResource, String sourceName) - throws IOException { - - String name = genericCustomResource.getMetadata().getName(); - String applyNamespace = applicableNamespace(genericCustomResource, namespace, fallbackNamespace); + private void applyCustomResource(CustomResourceDefinitionContext context, GenericKubernetesResource genericKubernetesResource, String sourceName) { + String name = genericKubernetesResource.getMetadata().getName(); + String applyNamespace = applicableNamespace(genericKubernetesResource, namespace, fallbackNamespace); String apiGroupWithKind = KubernetesHelper.getFullyQualifiedApiGroupWithKind(context); - Objects.requireNonNull(name, "No name for " + genericCustomResource + " " + sourceName); + Objects.requireNonNull(name, "No name for " + genericKubernetesResource + " " + sourceName); if (isRecreateMode()) { log.info("Attempting to delete Custom Resource: %s %s/%s", apiGroupWithKind, namespace, name); KubernetesClientUtil.doDeleteAndWait(kubernetesClient, context, applyNamespace, name, 10L); } - final GenericCustomResource existentCR = KubernetesClientUtil.doGetCustomResource(kubernetesClient, context, applyNamespace, name); + final GenericKubernetesResource existentCR = KubernetesClientUtil.doGetCustomResource(kubernetesClient, context, applyNamespace, name); if (existentCR != null && isBlank(existentCR.getMetadata().getDeletionTimestamp())) { log.info("Replacing Custom Resource: %s %s/%s", KubernetesHelper.getFullyQualifiedApiGroupWithKind(context), applyNamespace, name); - genericCustomResource.getMetadata().setResourceVersion(existentCR.getMetadata().getResourceVersion()); + genericKubernetesResource.getMetadata().setResourceVersion(existentCR.getMetadata().getResourceVersion()); } - kubernetesClient.customResource(context).inNamespace(applyNamespace).withName(name) - .createOrReplace(Serialization.jsonMapper().writeValueAsString(genericCustomResource)); + kubernetesClient.genericKubernetesResources(context).inNamespace(applyNamespace).withName(name) + .createOrReplace(genericKubernetesResource); log.info("Created Custom Resource: %s %s/%s", apiGroupWithKind, applyNamespace, name); } diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesClientUtil.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesClientUtil.java index 153313839c..3690b5f4b9 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesClientUtil.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesClientUtil.java @@ -18,9 +18,10 @@ import java.util.Collections; import java.util.List; import java.util.Objects; -import java.util.function.Supplier; +import java.util.concurrent.TimeUnit; -import org.eclipse.jkube.kit.common.GenericCustomResource; +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; +import io.fabric8.kubernetes.client.dsl.Resource; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.OpenshiftHelper; @@ -38,8 +39,6 @@ import io.fabric8.kubernetes.client.Watcher; import io.fabric8.kubernetes.client.dsl.Scaleable; import io.fabric8.kubernetes.client.dsl.base.CustomResourceDefinitionContext; -import io.fabric8.kubernetes.client.dsl.internal.RawCustomResourceOperationsImpl; -import io.fabric8.kubernetes.client.utils.Serialization; import io.fabric8.openshift.api.model.DeploymentConfig; import io.fabric8.openshift.client.OpenShiftClient; import org.apache.commons.lang3.StringUtils; @@ -155,12 +154,9 @@ protected static String getPodCondition(Pod pod) { return ""; } - public static GenericCustomResource doGetCustomResource(KubernetesClient kubernetesClient, CustomResourceDefinitionContext crdContext, String namespace, String name) { + public static GenericKubernetesResource doGetCustomResource(KubernetesClient kubernetesClient, CustomResourceDefinitionContext crdContext, String namespace, String name) { try { - return Serialization.jsonMapper().convertValue( - kubernetesClient.customResource(crdContext).inNamespace(namespace).withName(name).get(), - GenericCustomResource.class - ); + return kubernetesClient.genericKubernetesResources(crdContext).inNamespace(namespace).withName(name).get(); } catch (Exception exception) { // Not found exception return null; } @@ -168,21 +164,11 @@ public static GenericCustomResource doGetCustomResource(KubernetesClient kuberne public static void doDeleteAndWait(KubernetesClient kubernetesClient, CustomResourceDefinitionContext context, String namespace, String name, long seconds) { - final RawCustomResourceOperationsImpl crClient = kubernetesClient.customResource(context) + final Resource crClient = kubernetesClient.genericKubernetesResources(context) .inNamespace(namespace) .withName(name); - try { - crClient.delete(); - /* Not implemented in Fabric8 Kubernetes Client ----> TODO: replace when sth like this is available - crClient.waitUntilCondition(Objects::isNull, seconds, TimeUnit.SECONDS); - */ - final Supplier getter = () -> doGetCustomResource(kubernetesClient, context, namespace, name); - while (seconds-- > 0 && !Objects.isNull(getter.get())) { - Thread.sleep(1000L); - } - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - } + crClient.delete(); + crClient.waitUntilCondition(Objects::isNull, seconds, TimeUnit.SECONDS); } public static String applicableNamespace(HasMetadata resource, String namespace, String fallbackNamespace) { diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployService.java index cc4669399a..f9184187b3 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployService.java @@ -24,7 +24,8 @@ import java.util.stream.Collectors; import java.util.stream.Stream; -import org.eclipse.jkube.kit.common.GenericCustomResource; +import io.fabric8.kubernetes.api.model.APIResourceList; +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.config.resource.ResourceConfig; @@ -33,7 +34,6 @@ import io.fabric8.kubernetes.api.model.DeletionPropagation; import io.fabric8.kubernetes.api.model.HasMetadata; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionList; import io.fabric8.kubernetes.client.dsl.base.CustomResourceDefinitionContext; import static org.eclipse.jkube.kit.common.util.KubernetesHelper.getCrdContext; @@ -45,7 +45,7 @@ public class KubernetesUndeployService implements UndeployService { private final JKubeServiceHub jKubeServiceHub; private final KitLogger logger; - private static final Predicate isCustomResource = item -> item instanceof GenericCustomResource; + private static final Predicate isCustomResource = GenericKubernetesResource.class::isInstance; public KubernetesUndeployService(JKubeServiceHub jKubeServiceHub, KitLogger logger) { this.jKubeServiceHub = jKubeServiceHub; @@ -95,31 +95,31 @@ protected Consumer resourceDeleter(String namespace, String fallbac protected Consumer customResourceDeleter(String namespace, String fallbackNamespace) { return customResource -> { String undeployNamespace = applicableNamespace(customResource, namespace, fallbackNamespace); - GenericCustomResource genericCustomResource = (GenericCustomResource) customResource; - CustomResourceDefinitionList crdList = jKubeServiceHub.getClient().apiextensions().v1beta1().customResourceDefinitions().list(); - deleteCustomResourceIfCustomResourceDefinitionContextPresent(genericCustomResource, undeployNamespace, getCrdContext(crdList, genericCustomResource)); + GenericKubernetesResource genericKubernetesResource = (GenericKubernetesResource) customResource; + APIResourceList apiResourceList = jKubeServiceHub.getClient().getApiResources(customResource.getApiVersion()); + deleteCustomResourceIfCustomResourceDefinitionContextPresent(genericKubernetesResource, undeployNamespace, getCrdContext(apiResourceList, genericKubernetesResource)); }; } - private void deleteCustomResourceIfCustomResourceDefinitionContextPresent(GenericCustomResource customResource, String namespace, CustomResourceDefinitionContext crdContext) { + private void deleteCustomResourceIfCustomResourceDefinitionContextPresent(GenericKubernetesResource customResource, String namespace, CustomResourceDefinitionContext crdContext) { if (crdContext != null) { deleteCustomResourceIfPresent(customResource, namespace, crdContext); } } - private void deleteCustomResourceIfPresent(GenericCustomResource customResource, String namespace, CustomResourceDefinitionContext crdContext) { - final GenericCustomResource cr = KubernetesClientUtil.doGetCustomResource(jKubeServiceHub.getClient(), crdContext, namespace, customResource.getMetadata().getName()); + private void deleteCustomResourceIfPresent(GenericKubernetesResource customResource, String namespace, CustomResourceDefinitionContext crdContext) { + final GenericKubernetesResource cr = KubernetesClientUtil.doGetCustomResource(jKubeServiceHub.getClient(), crdContext, namespace, customResource.getMetadata().getName()); if (cr != null) { deleteCustomResource(customResource, namespace, crdContext); } } - private void deleteCustomResource(GenericCustomResource customResource, String namespace, CustomResourceDefinitionContext crdContext) { + private void deleteCustomResource(GenericKubernetesResource customResource, String namespace, CustomResourceDefinitionContext crdContext) { String name = customResource.getMetadata().getName(); String apiVersionAndKind = KubernetesHelper.getFullyQualifiedApiGroupWithKind(crdContext); try { logger.info("Deleting Custom Resource %s %s", apiVersionAndKind, name); - jKubeServiceHub.getClient().customResource(crdContext).inNamespace(namespace).withName(name).delete(); + jKubeServiceHub.getClient().genericKubernetesResources(crdContext).inNamespace(namespace).withName(name).delete(); } catch (Exception exception) { logger.error("Unable to undeploy %s %s/%s", apiVersionAndKind, namespace, name); } diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ApplyServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ApplyServiceTest.java index f8f3a43a35..4bd5184b73 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ApplyServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ApplyServiceTest.java @@ -21,12 +21,17 @@ import java.util.List; import java.util.Set; +import io.fabric8.kubernetes.api.model.APIResource; +import io.fabric8.kubernetes.api.model.APIResourceBuilder; +import io.fabric8.kubernetes.api.model.APIResourceListBuilder; import io.fabric8.kubernetes.api.model.ConfigMap; +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; +import io.fabric8.kubernetes.api.model.GenericKubernetesResourceBuilder; import io.fabric8.kubernetes.api.model.ServiceAccount; import io.fabric8.kubernetes.api.model.ServiceAccountBuilder; import io.fabric8.kubernetes.api.model.networking.v1.Ingress; import io.fabric8.kubernetes.api.model.networking.v1.IngressBuilder; -import org.eclipse.jkube.kit.common.GenericCustomResource; +import io.fabric8.openshift.client.server.mock.OpenShiftServer; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.config.service.openshift.WebServerEventCollector; @@ -34,15 +39,9 @@ import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.api.model.Namespace; import io.fabric8.kubernetes.api.model.NamespaceBuilder; -import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.fabric8.kubernetes.api.model.PodBuilder; import io.fabric8.kubernetes.api.model.ReplicationControllerBuilder; import io.fabric8.kubernetes.api.model.ServiceBuilder; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionBuilder; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionListBuilder; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionNamesBuilder; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionSpecBuilder; import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder; import io.fabric8.kubernetes.api.model.networking.v1.NetworkPolicyBuilder; import io.fabric8.kubernetes.client.utils.Serialization; @@ -51,7 +50,6 @@ import io.fabric8.openshift.api.model.ProjectBuilder; import io.fabric8.openshift.api.model.Route; import io.fabric8.openshift.api.model.RouteBuilder; -import io.fabric8.openshift.client.server.mock.OpenShiftServer; import mockit.Mocked; import org.junit.Before; import org.junit.Rule; @@ -71,7 +69,7 @@ public class ApplyServiceTest { private KitLogger log; @Rule - public final OpenShiftServer mockServer = new OpenShiftServer(false); + public OpenShiftServer mockServer = new OpenShiftServer(false); private ApplyService applyService; @@ -194,7 +192,7 @@ public void testCreateRouteInServiceOnlyMode() { applyService.apply(route, "route.yml"); collector.assertEventsNotRecorded("get-route"); - assertEquals(1, mockServer.getMockServer().getRequestCount()); + assertEquals(0, mockServer.getOpenShiftMockServer().getRequestCount()); } @Test @@ -211,21 +209,21 @@ public void testCreateRouteNotAllowed() { applyService.apply(route, "route.yml"); collector.assertEventsRecordedInOrder("get-route"); - assertEquals(2, mockServer.getMockServer().getRequestCount()); + assertEquals(1, mockServer.getOpenShiftMockServer().getRequestCount()); } @Test - public void testApplyGenericCustomResource() throws Exception { + public void testApplyGenericKubernetesResource() throws Exception { // Given File gatewayFragment = new File(getClass().getResource("/gateway-cr.yml").getFile()); File virtualServiceFragment = new File(getClass().getResource("/virtualservice-cr.yml").getFile()); - GenericCustomResource gateway = Serialization.yamlMapper().readValue(gatewayFragment, GenericCustomResource.class); - GenericCustomResource virtualService = Serialization.yamlMapper().readValue(virtualServiceFragment, GenericCustomResource.class); + GenericKubernetesResource gateway = Serialization.yamlMapper().readValue(gatewayFragment, GenericKubernetesResource.class); + GenericKubernetesResource virtualService = Serialization.yamlMapper().readValue(virtualServiceFragment, GenericKubernetesResource.class); WebServerEventCollector collector = new WebServerEventCollector(); mockServer.expect().get() - .withPath("/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions") - .andReply(collector.record("get-crds").andReturn(HTTP_OK, new CustomResourceDefinitionListBuilder() - .withItems(virtualServiceCRD(), gatewayCRD()).build())) + .withPath("/apis/networking.istio.io/v1alpha3") + .andReply(collector.record("get-resources").andReturn(HTTP_OK, new APIResourceListBuilder() + .addToResources(virtualServiceResource(), gatewayResource()).build())) .times(2); mockServer.expect().post() .withPath("/apis/networking.istio.io/v1alpha3/namespaces/default/virtualservices") @@ -237,12 +235,12 @@ public void testApplyGenericCustomResource() throws Exception { .once(); // When - applyService.applyGenericCustomResource(gateway, gatewayFragment.getName()); - applyService.applyGenericCustomResource(virtualService, virtualServiceFragment.getName()); + applyService.applyGenericKubernetesResource(gateway, gatewayFragment.getName()); + applyService.applyGenericKubernetesResource(virtualService, virtualServiceFragment.getName()); // Then - collector.assertEventsRecordedInOrder("get-crds", "post-cr-gateway", "get-crds", "post-cr-virtualservice"); - assertEquals(7, mockServer.getMockServer().getRequestCount()); + collector.assertEventsRecordedInOrder("get-resources", "post-cr-gateway", "get-resources", "post-cr-virtualservice"); + assertEquals(6, mockServer.getOpenShiftMockServer().getRequestCount()); } @Test @@ -250,14 +248,14 @@ public void testProcessCustomEntitiesReplaceCustomResources() throws Exception { // Given File gatewayFragment = new File(getClass().getResource("/gateway-cr.yml").getFile()); File virtualServiceFragment = new File(getClass().getResource("/virtualservice-cr.yml").getFile()); - GenericCustomResource gateway = Serialization.yamlMapper().readValue(gatewayFragment, GenericCustomResource.class); - GenericCustomResource virtualService = Serialization.yamlMapper().readValue(virtualServiceFragment, GenericCustomResource.class); + GenericKubernetesResource gateway = Serialization.yamlMapper().readValue(gatewayFragment, GenericKubernetesResource.class); + GenericKubernetesResource virtualService = Serialization.yamlMapper().readValue(virtualServiceFragment, GenericKubernetesResource.class); WebServerEventCollector collector = new WebServerEventCollector(); mockServer.expect().get() - .withPath("/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions") - .andReply(collector.record("get-crds").andReturn(HTTP_OK, new CustomResourceDefinitionListBuilder() - .withItems(virtualServiceCRD(), gatewayCRD()).build())) - .times(2); + .withPath("/apis/networking.istio.io/v1alpha3") + .andReply(collector.record("get-resources").andReturn(HTTP_OK, new APIResourceListBuilder() + .addToResources(virtualServiceResource(), gatewayResource()).build())) + .times(2); mockServer.expect().get() .withPath("/apis/networking.istio.io/v1alpha3/namespaces/default/virtualservices/reviews-route") .andReply(collector.record("get-cr-virtualservice").andReturn(HTTP_OK, "{\"metadata\":{\"resourceVersion\":\"1001\"}}")) @@ -280,14 +278,14 @@ public void testProcessCustomEntitiesReplaceCustomResources() throws Exception { .once(); // When - applyService.applyGenericCustomResource(gateway, gatewayFragment.getName()); - applyService.applyGenericCustomResource(virtualService, virtualServiceFragment.getName()); + applyService.applyGenericKubernetesResource(gateway, gatewayFragment.getName()); + applyService.applyGenericKubernetesResource(virtualService, virtualServiceFragment.getName()); // Then collector.assertEventsRecordedInOrder( - "get-crds", "get-cr-gateway", "post-cr-gateway", "put-cr-gateway", - "get-crds", "get-cr-virtualservice", "post-cr-virtualservice"); - assertEquals(8, mockServer.getMockServer().getRequestCount()); + "get-resources", "get-cr-gateway", "post-cr-gateway", "put-cr-gateway", + "get-resources", "get-cr-virtualservice", "post-cr-virtualservice"); + assertEquals(7, mockServer.getOpenShiftMockServer().getRequestCount()); } @Test @@ -295,14 +293,30 @@ public void testProcessCustomEntitiesRecreateModeTrue() throws Exception { // Given File gatewayFragment = new File(getClass().getResource("/gateway-cr.yml").getFile()); File virtualServiceFragment = new File(getClass().getResource("/virtualservice-cr.yml").getFile()); - GenericCustomResource gateway = Serialization.yamlMapper().readValue(gatewayFragment, GenericCustomResource.class); - GenericCustomResource virtualService = Serialization.yamlMapper().readValue(virtualServiceFragment, GenericCustomResource.class); + GenericKubernetesResource gateway = Serialization.yamlMapper().readValue(gatewayFragment, GenericKubernetesResource.class); + GenericKubernetesResource virtualService = Serialization.yamlMapper().readValue(virtualServiceFragment, GenericKubernetesResource.class); WebServerEventCollector collector = new WebServerEventCollector(); mockServer.expect().get() - .withPath("/apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions") - .andReply(collector.record("get-crds").andReturn(HTTP_OK, new CustomResourceDefinitionListBuilder() - .withItems(virtualServiceCRD(), gatewayCRD()).build())) - .times(2); + .withPath("/apis/networking.istio.io/v1alpha3") + .andReply(collector.record("get-resources").andReturn(HTTP_OK, new APIResourceListBuilder() + .addToResources(virtualServiceResource(), gatewayResource()).build())) + .times(2); + mockServer.expect().get() + .withPath("/apis/networking.istio.io/v1alpha3/namespaces/default/gateways?fieldSelector=metadata.name%3Dmygateway-https") + .andReturn(HTTP_OK, new GenericKubernetesResourceBuilder() + .withApiVersion("networking.istio.io/v1alpha3") + .withKind("Gateway") + .withNewMetadata().withName("mygateway-https").endMetadata() + .build()) + .once(); + mockServer.expect().get() + .withPath("/apis/networking.istio.io/v1alpha3/namespaces/default/virtualservices?fieldSelector=metadata.name%3Dreviews-route") + .andReturn(HTTP_OK, new GenericKubernetesResourceBuilder() + .withApiVersion("networking.istio.io/v1alpha3") + .withKind("VirtualService") + .withNewMetadata().withName("reviews-route").endMetadata() + .build()) + .once(); mockServer.expect().delete() .withPath("/apis/networking.istio.io/v1alpha3/namespaces/default/virtualservices/reviews-route") .andReply(collector.record("delete-cr-virtualservice").andReturn(HTTP_OK, "{\"kind\":\"Status\",\"status\":\"Success\"}")) @@ -322,12 +336,12 @@ public void testProcessCustomEntitiesRecreateModeTrue() throws Exception { applyService.setRecreateMode(true); // When - applyService.applyGenericCustomResource(gateway, gatewayFragment.getName()); - applyService.applyGenericCustomResource(virtualService, virtualServiceFragment.getName()); + applyService.applyGenericKubernetesResource(gateway, gatewayFragment.getName()); + applyService.applyGenericKubernetesResource(virtualService, virtualServiceFragment.getName()); // Then - collector.assertEventsRecordedInOrder("get-crds", "delete-cr-gateway", "post-cr-gateway", "get-crds", "delete-cr-virtualservice", "post-cr-virtualservice"); - assertEquals(11, mockServer.getMockServer().getRequestCount()); + collector.assertEventsRecordedInOrder("get-resources", "delete-cr-gateway", "post-cr-gateway", "get-resources", "delete-cr-virtualservice", "post-cr-virtualservice"); + assertEquals(10, mockServer.getOpenShiftMockServer().getRequestCount()); applyService.setRecreateMode(false); } @@ -397,7 +411,7 @@ public void testApplyToMultipleNamespaceNoNamespaceConfigured() throws Interrupt // Then collector.assertEventsRecordedInOrder("configmap-ns1-create", "serviceaccount-default-create", "ingress-ns2-create"); - assertEquals(6, mockServer.getMockServer().getRequestCount()); + assertEquals(5, mockServer.getOpenShiftMockServer().getRequestCount()); applyService.setFallbackNamespace(null); applyService.setNamespace(configuredNamespace); } @@ -429,7 +443,7 @@ public void testApplyToMultipleNamespacesOverriddenWhenNamespaceConfigured() thr // Then collector.assertEventsRecordedInOrder("configmap-default-ns-create", "serviceaccount-default-ns-create", "ingress-default-ns-create"); - assertEquals(6, mockServer.getMockServer().getRequestCount()); + assertEquals(5, mockServer.getOpenShiftMockServer().getRequestCount()); applyService.setFallbackNamespace(null); } @@ -449,37 +463,23 @@ private Route buildRoute() { .build(); } - private static CustomResourceDefinition gatewayCRD() { - return new CustomResourceDefinitionBuilder() - .withMetadata(new ObjectMetaBuilder() - .withName("gateways.networking.istio.io") - .build()) - .withSpec(new CustomResourceDefinitionSpecBuilder() - .withGroup("networking.istio.io") - .withScope("Namespaced") - .withVersion("v1alpha3") - .withNames(new CustomResourceDefinitionNamesBuilder() - .withKind("Gateway") - .withPlural("gateways") - .build()) - .build()) + private static APIResource virtualServiceResource() { + return new APIResourceBuilder() + .withName("gateways") + .withNamespaced(true) + .withGroup("networking.istio.io") + .withKind("Gateway") + .withSingularName("gateway") .build(); } - private static CustomResourceDefinition virtualServiceCRD() { - return new CustomResourceDefinitionBuilder() - .withMetadata(new ObjectMetaBuilder() - .withName("virtualservices.networking.istio.io") - .build()) - .withSpec(new CustomResourceDefinitionSpecBuilder() - .withGroup("networking.istio.io") - .withScope("Namespaced") - .withVersion("v1alpha3") - .withNames(new CustomResourceDefinitionNamesBuilder() - .withKind("VirtualService") - .withPlural("virtualservices") - .build()) - .build()) + private static APIResource gatewayResource() { + return new APIResourceBuilder() + .withName("virtualservices") + .withNamespaced(true) + .withGroup("networking.istio.io") + .withKind("VirtualService") + .withSingularName("virtualservice") .build(); } } \ No newline at end of file diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesClientUtilTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesClientUtilTest.java index 67b74780aa..cae596fd49 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesClientUtilTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesClientUtilTest.java @@ -35,8 +35,7 @@ public void doDeleteAndWait_withExistingResource_shouldDeleteAndReachWaitLimit() // Then // @formatter:off new Verifications(){{ - kubernetesClient.customResource(context).inNamespace("namespace").withName("name").delete(); times = 1; - kubernetesClient.customResource(context).inNamespace("namespace").withName("name").get(); times = 2; + kubernetesClient.genericKubernetesResources(context).inNamespace("namespace").withName("name").delete(); times = 1; }}; // @formatter:on } diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployServiceTest.java index 281ecc938a..519ea24081 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployServiceTest.java @@ -16,9 +16,14 @@ import java.io.File; import java.util.Arrays; +import io.fabric8.kubernetes.api.model.APIResource; +import io.fabric8.kubernetes.api.model.APIResourceBuilder; +import io.fabric8.kubernetes.api.model.APIResourceListBuilder; import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.api.model.ConfigMapBuilder; -import org.eclipse.jkube.kit.common.GenericCustomResource; +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; +import io.fabric8.kubernetes.api.model.GenericKubernetesResourceBuilder; +import io.fabric8.kubernetes.client.dsl.base.ResourceDefinitionContext; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.config.resource.ResourceConfig; @@ -32,9 +37,6 @@ import io.fabric8.kubernetes.api.model.Pod; import io.fabric8.kubernetes.api.model.PodBuilder; import io.fabric8.kubernetes.api.model.Service; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionBuilder; -import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinitionListBuilder; import io.fabric8.kubernetes.client.dsl.base.CustomResourceDefinitionContext; import mockit.Expectations; import mockit.Mocked; @@ -117,20 +119,21 @@ public void undeployWithManifestAndCustomResourcesShouldDeleteAllEntities( final File crManifest = temporaryFolder.newFile("temp-cr.yml"); final String crdId = "org.eclipse.jkube/v1alpha1#Crd"; final Service service = new Service(); - final GenericCustomResource customResource = new GenericCustomResource(); + final GenericKubernetesResource customResource = new GenericKubernetesResourceBuilder() + .withApiVersion("org.eclipse.jkube/v1alpha1") + .build(); customResource.setMetadata(new ObjectMetaBuilder().withName("my-cr").build()); - final CustomResourceDefinition crd = new CustomResourceDefinitionBuilder() - .withNewMetadata().withName(crdId).endMetadata() - .withNewSpec().withGroup("org.eclipse.jkube").withVersion("v1alpha1").withScope("Cluster") - .withNewNames() - .withKind("Crd") - .withPlural("crds") - .endNames().endSpec() - .withKind(crdId).build(); + final APIResource customResourceApiResource = new APIResourceBuilder() + .withGroup("org.eclipse.jkube") + .withNamespaced(false) + .withKind("Crd") + .withName("crds") + .withSingularName("crd") + .build(); // @formatter:off new Expectations() {{ kubernetesHelper.loadResources(manifest); result = Arrays.asList(service, customResource); - jKubeServiceHub.getClient().apiextensions().v1beta1().customResourceDefinitions().list(); result = new CustomResourceDefinitionListBuilder().withItems(crd).build(); + jKubeServiceHub.getClient().getApiResources("org.eclipse.jkube/v1alpha1"); result = new APIResourceListBuilder().addToResources(customResourceApiResource).build(); kubernetesHelper.getFullyQualifiedApiGroupWithKind((CustomResourceDefinitionContext)any); result = crdId; }}; @@ -140,7 +143,7 @@ public void undeployWithManifestAndCustomResourcesShouldDeleteAllEntities( // Then // @formatter:off new Verifications() {{ - jKubeServiceHub.getClient().customResource((CustomResourceDefinitionContext)any).inNamespace(null).withName("my-cr").delete(); + jKubeServiceHub.getClient().genericKubernetesResources((ResourceDefinitionContext)any).inNamespace(null).withName("my-cr").delete(); times = 1; }}; // @formatter:on diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftBuildServiceIntegrationTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftBuildServiceIntegrationTest.java index 05ebe91566..e6faf06810 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftBuildServiceIntegrationTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftBuildServiceIntegrationTest.java @@ -28,7 +28,9 @@ import io.fabric8.openshift.api.model.ImageStreamBuilder; import io.fabric8.openshift.api.model.ImageStreamStatusBuilder; import io.fabric8.openshift.api.model.NamedTagEventListBuilder; +import io.fabric8.openshift.client.server.mock.OpenShiftMockServer; import io.fabric8.openshift.client.server.mock.OpenShiftServer; +import okhttp3.mockwebserver.RecordedRequest; import org.apache.commons.io.FileUtils; import org.eclipse.jkube.kit.build.api.assembly.JKubeBuildTarArchiver; import org.eclipse.jkube.kit.common.RegistryConfig; @@ -45,16 +47,12 @@ import org.eclipse.jkube.kit.config.service.JKubeServiceException; import mockit.Expectations; import mockit.Mocked; -import okhttp3.mockwebserver.MockWebServer; -import okhttp3.mockwebserver.RecordedRequest; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; @@ -70,8 +68,6 @@ public class OpenshiftBuildServiceIntegrationTest { - private static final Logger LOG = LoggerFactory.getLogger(OpenshiftBuildServiceIntegrationTest.class); - private static final int MAX_TIMEOUT_RETRIES = 5; @Rule @@ -177,7 +173,7 @@ public void testSuccessfulBuild() throws Exception { new OpenshiftBuildService(jKubeServiceHub).build(image); // we should find a better way to assert that a certain call has been made - assertTrue(mockServer.getMockServer().getRequestCount() > 8); + assertTrue(mockServer.getOpenShiftMockServer().getRequestCount() > 8); collector.assertEventsRecordedInOrder("build-config-check", "new-build-config", "pushed"); assertEquals("{\"apiVersion\":\"build.openshift.io/v1\",\"kind\":\"BuildConfig\",\"metadata\":{\"name\":\"myapp-s2i-suffix2\"},\"spec\":{\"output\":{\"to\":{\"kind\":\"ImageStreamTag\",\"name\":\"myapp:latest\"}},\"source\":{\"type\":\"Binary\"},\"strategy\":{\"sourceStrategy\":{\"forcePull\":false,\"from\":{\"kind\":\"DockerImage\",\"name\":\"myapp\"}},\"type\":\"Source\"}}}", collector.getBodies().get(1)); collector.assertEventsNotRecorded("patch-build-config"); @@ -195,7 +191,7 @@ public void testSuccessfulBuildNoS2iSuffix() throws Exception { new OpenshiftBuildService(jKubeServiceHub).build(image); // we should find a better way to assert that a certain call has been made - assertTrue(mockServer.getMockServer().getRequestCount() > 8); + assertTrue(mockServer.getOpenShiftMockServer().getRequestCount() > 8); collector.assertEventsRecordedInOrder("build-config-check", "new-build-config", "pushed"); assertEquals("{\"apiVersion\":\"build.openshift.io/v1\",\"kind\":\"BuildConfig\",\"metadata\":{\"name\":\"myapp-s2i\"},\"spec\":{\"output\":{\"to\":{\"kind\":\"ImageStreamTag\",\"name\":\"myapp:latest\"}},\"source\":{\"type\":\"Binary\"},\"strategy\":{\"sourceStrategy\":{\"forcePull\":false,\"from\":{\"kind\":\"DockerImage\",\"name\":\"myapp\"}},\"type\":\"Source\"}}}", collector.getBodies().get(1)); collector.assertEventsNotRecorded("patch-build-config"); @@ -215,7 +211,7 @@ public void testDockerBuild() throws Exception { new OpenshiftBuildService(jKubeServiceHub).build(image); - assertTrue(mockServer.getMockServer().getRequestCount() > 8); + assertTrue(mockServer.getOpenShiftMockServer().getRequestCount() > 8); collector.assertEventsRecordedInOrder("build-config-check", "new-build-config", "pushed"); assertEquals("{\"apiVersion\":\"build.openshift.io/v1\",\"kind\":\"BuildConfig\",\"metadata\":{\"name\":\"myapp-docker\"},\"spec\":{\"output\":{\"to\":{\"kind\":\"ImageStreamTag\",\"name\":\"myapp:latest\"}},\"source\":{\"type\":\"Binary\"},\"strategy\":{\"dockerStrategy\":{\"from\":{\"kind\":\"DockerImage\",\"name\":\"myapp\"},\"noCache\":false},\"type\":\"Docker\"}}}", collector.getBodies().get(1)); collector.assertEventsNotRecorded("patch-build-config"); @@ -236,7 +232,7 @@ public void testDockerBuildWithMultiComponentImageName() throws Exception { new OpenshiftBuildService(jKubeServiceHub).build(image); - assertTrue(mockServer.getMockServer().getRequestCount() > 8); + assertTrue(mockServer.getOpenShiftMockServer().getRequestCount() > 8); collector.assertEventsRecordedInOrder("build-config-check", "new-build-config", "pushed"); assertEquals("{\"apiVersion\":\"build.openshift.io/v1\",\"kind\":\"BuildConfig\",\"metadata\":{\"name\":\"component1-component2-name-docker\"},\"spec\":{\"output\":{\"to\":{\"kind\":\"ImageStreamTag\",\"name\":\"component1-component2-name:tag\"}},\"source\":{\"type\":\"Binary\"},\"strategy\":{\"dockerStrategy\":{\"from\":{\"kind\":\"DockerImage\",\"name\":\"myapp\"},\"noCache\":false},\"type\":\"Docker\"}}}", collector.getBodies().get(1)); collector.assertEventsNotRecorded("patch-build-config"); @@ -256,7 +252,7 @@ public void testDockerBuildNoS2iSuffix() throws Exception { new OpenshiftBuildService(jKubeServiceHub).build(image); - assertTrue(mockServer.getMockServer().getRequestCount() > 8); + assertTrue(mockServer.getOpenShiftMockServer().getRequestCount() > 8); collector.assertEventsRecordedInOrder("build-config-check", "new-build-config", "pushed"); assertEquals("{\"apiVersion\":\"build.openshift.io/v1\",\"kind\":\"BuildConfig\",\"metadata\":{\"name\":\"myapp\"},\"spec\":{\"output\":{\"to\":{\"kind\":\"ImageStreamTag\",\"name\":\"myapp:latest\"}},\"source\":{\"type\":\"Binary\"},\"strategy\":{\"dockerStrategy\":{\"from\":{\"kind\":\"DockerImage\",\"name\":\"myapp\"},\"noCache\":false},\"type\":\"Docker\"}}}", collector.getBodies().get(1)); collector.assertEventsNotRecorded("patch-build-config"); @@ -289,7 +285,7 @@ public void testDockerBuildFromExt() throws Exception { service.build(fromExtImage); - assertTrue(mockServer.getMockServer().getRequestCount() > 8); + assertTrue(mockServer.getOpenShiftMockServer().getRequestCount() > 8); collector.assertEventsRecordedInOrder("build-config-check", "new-build-config", "pushed"); assertEquals("{\"apiVersion\":\"build.openshift.io/v1\",\"kind\":\"BuildConfig\",\"metadata\":{\"name\":\"myapp-docker\"},\"spec\":{\"output\":{\"to\":{\"kind\":\"ImageStreamTag\",\"name\":\"myapp:latest\"}},\"source\":{\"type\":\"Binary\"},\"strategy\":{\"dockerStrategy\":{\"from\":{\"kind\":\"ImageStreamTag\",\"name\":\"app:1.2-1\",\"namespace\":\"my-project\"},\"noCache\":true},\"type\":\"Docker\"}}}", collector.getBodies().get(1)); collector.assertEventsNotRecorded("patch-build-config"); @@ -305,7 +301,7 @@ public void testSuccessfulBuildSecret() throws Exception { new OpenshiftBuildService(jKubeServiceHub).build(image); // we should find a better way to assert that a certain call has been made - assertTrue(mockServer.getMockServer().getRequestCount() > 8); + assertTrue(mockServer.getOpenShiftMockServer().getRequestCount() > 8); collector.assertEventsRecordedInOrder("build-config-check", "new-build-config", "pushed"); collector.assertEventsNotRecorded("patch-build-config"); }); @@ -377,10 +373,10 @@ public void testSuccessfulDockerImageOutputBuild() throws Exception { new OpenshiftBuildService(jKubeServiceHub).build(image); // we should add a better way to assert that a certain call has been made - assertTrue(mockServer.getMockServer().getRequestCount() > 8); + assertTrue(mockServer.getOpenShiftMockServer().getRequestCount() > 7); collector.assertEventsRecordedInOrder("build-config-check", "new-build-config", "pushed"); assertEquals("{\"apiVersion\":\"build.openshift.io/v1\",\"kind\":\"BuildConfig\",\"metadata\":{\"name\":\"myapp-s2i-suffix2\"},\"spec\":{\"output\":{\"to\":{\"kind\":\"DockerImage\",\"name\":\"myapp:latest\"}},\"source\":{\"type\":\"Binary\"},\"strategy\":{\"sourceStrategy\":{\"forcePull\":false,\"from\":{\"kind\":\"DockerImage\",\"name\":\"myapp\"}},\"type\":\"Source\"}}}", collector.getBodies().get(1)); - collector.assertEventsNotRecorded("patch-build-config"); + collector.assertEventsNotRecorded("patch-build-config"); assertFalse(containsRequest("imagestreams")); }); } @@ -394,7 +390,7 @@ public void testSuccessfulDockerImageOutputBuildSecret() throws Exception { new OpenshiftBuildService(jKubeServiceHub).build(image); // we should find a better way to assert that a certain call has been made - assertTrue(mockServer.getMockServer().getRequestCount() > 8); + assertTrue(mockServer.getOpenShiftMockServer().getRequestCount() > 7); collector.assertEventsRecordedInOrder("build-config-check", "new-build-config", "pushed"); assertEquals("{\"apiVersion\":\"build.openshift.io/v1\",\"kind\":\"BuildConfig\",\"metadata\":{\"name\":\"myapp-s2i-suffix2\"},\"spec\":{\"output\":{\"pushSecret\":{\"name\":\"pushsecret-fabric8\"},\"to\":{\"kind\":\"DockerImage\",\"name\":\"myapp:latest\"}},\"source\":{\"type\":\"Binary\"},\"strategy\":{\"sourceStrategy\":{\"forcePull\":false,\"from\":{\"kind\":\"DockerImage\",\"name\":\"myapp\"}},\"type\":\"Source\"}}}", collector.getBodies().get(1)); collector.assertEventsNotRecorded("patch-build-config"); @@ -577,12 +573,9 @@ private Throwable getRootCause(Throwable aThrowable) { return result; } - /** - * Helper method to verify request url path - */ private Boolean containsRequest(String path) { try { - MockWebServer mock = mockServer.getMockServer(); + OpenShiftMockServer mock = mockServer.getOpenShiftMockServer(); int count = mock.getRequestCount(); RecordedRequest request = null; while ( count-- > 0 ) { @@ -596,5 +589,4 @@ private Boolean containsRequest(String path) { } return false; } - } diff --git a/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtil.java b/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtil.java index 4bc72d02b6..60b7387cf2 100644 --- a/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtil.java +++ b/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtil.java @@ -34,8 +34,8 @@ import java.util.Set; import java.util.regex.Matcher; +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.client.utils.Serialization; -import org.eclipse.jkube.kit.common.GenericCustomResource; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.KindFilenameMapperUtil; import org.eclipse.jkube.kit.common.util.KubernetesHelper; @@ -165,7 +165,7 @@ private static HasMetadata convertFragmentToHasMetadata(PlatformMode platformMod } private static HasMetadata getCustomResource(File file) throws IOException { - return Serialization.yamlMapper().readValue(file, GenericCustomResource.class); + return Serialization.yamlMapper().readValue(file, GenericKubernetesResource.class); } private static boolean isCustomResourceFragment(String fileName) { diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultMetadataEnricherTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultMetadataEnricherTest.java index 0387524c00..ed97fbb276 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultMetadataEnricherTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/DefaultMetadataEnricherTest.java @@ -14,13 +14,12 @@ package org.eclipse.jkube.enricher.generic; import io.fabric8.kubernetes.api.model.ConfigMapBuilder; +import io.fabric8.kubernetes.api.model.GenericKubernetesResourceBuilder; import io.fabric8.kubernetes.api.model.KubernetesListBuilder; import io.fabric8.kubernetes.api.model.ServiceAccountBuilder; import io.fabric8.kubernetes.api.model.extensions.DeploymentBuilder; import mockit.Expectations; import mockit.Mocked; -import org.eclipse.jkube.kit.common.GenericCustomResource; -import org.eclipse.jkube.kit.common.GenericCustomResourceBuilder; import org.eclipse.jkube.kit.config.resource.MetaDataConfig; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.config.resource.ResourceConfig; @@ -44,7 +43,7 @@ public class DefaultMetadataEnricherTest { private DefaultMetadataEnricher defaultMetadataEnricher; private ConfigMapBuilder configMap; private DeploymentBuilder deployment; - private GenericCustomResourceBuilder genericResource; + private GenericKubernetesResourceBuilder genericResource; private io.fabric8.kubernetes.api.model.networking.v1.IngressBuilder ingressV1; private io.fabric8.kubernetes.api.model.networking.v1beta1.IngressBuilder ingressV1beta1; private ServiceAccountBuilder serviceAccount; @@ -76,7 +75,7 @@ public void setUp() throws Exception { defaultMetadataEnricher = new DefaultMetadataEnricher(buildContext); configMap = new ConfigMapBuilder().withNewMetadata().endMetadata(); deployment = new DeploymentBuilder(); - genericResource = new GenericCustomResourceBuilder(new GenericCustomResource()); + genericResource = new GenericKubernetesResourceBuilder().withNewMetadata().endMetadata(); ingressV1 = new io.fabric8.kubernetes.api.model.networking.v1.IngressBuilder(); ingressV1beta1 = new io.fabric8.kubernetes.api.model.networking.v1beta1.IngressBuilder(); serviceAccount = new ServiceAccountBuilder(); diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index e522dfb0e0..03ad74902d 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -51,7 +51,7 @@ 2.2.1 3.0.2 1.1.1 - 5.4.0 + 5.10.1 1.18.12 3.5.0 3.6.3 diff --git a/jkube-kit/resource/service/src/test/java/org/eclipse/jkube/kit/resource/service/WriteUtilTest.java b/jkube-kit/resource/service/src/test/java/org/eclipse/jkube/kit/resource/service/WriteUtilTest.java index c1d63fa53f..2d912b526c 100644 --- a/jkube-kit/resource/service/src/test/java/org/eclipse/jkube/kit/resource/service/WriteUtilTest.java +++ b/jkube-kit/resource/service/src/test/java/org/eclipse/jkube/kit/resource/service/WriteUtilTest.java @@ -16,8 +16,8 @@ import java.io.File; import java.io.IOException; +import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; -import org.eclipse.jkube.kit.common.GenericCustomResource; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.ResourceUtil; @@ -148,8 +148,8 @@ private void verifyResourceUtilSave(File file, int numTimes) throws IOException // @formatter:on } - private static GenericCustomResource genericCustomResource(String kind, String name) { - final GenericCustomResource gcr = new GenericCustomResource(); + private static GenericKubernetesResource genericCustomResource(String kind, String name) { + final GenericKubernetesResource gcr = new GenericKubernetesResource(); gcr.setKind(kind); gcr.setMetadata(new ObjectMetaBuilder().withName(name).build()); return gcr; diff --git a/quickstarts/gradle/spring-boot-crd/src/main/jkube/framework-crd.yml b/quickstarts/gradle/spring-boot-crd/src/main/jkube/framework-crd.yml index 3753c064fe..70c33e7104 100644 --- a/quickstarts/gradle/spring-boot-crd/src/main/jkube/framework-crd.yml +++ b/quickstarts/gradle/spring-boot-crd/src/main/jkube/framework-crd.yml @@ -12,7 +12,7 @@ # Red Hat, Inc. - initial API and implementation # -apiVersion: apiextensions.k8s.io/v1beta1 +apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: frameworks.jkube.eclipse.org @@ -22,16 +22,16 @@ spec: - name: v1beta1 served: true storage: true - validation: - openAPIV3Schema: - type: object - properties: - name: - type: string + schema: + openAPIV3Schema: + type: object + properties: + name: + type: string scope: Namespaced names: plural: frameworks singular: framework kind: Framework shortNames: - - fwk \ No newline at end of file + - fwk diff --git a/quickstarts/maven/spring-boot-crd/src/main/jkube/framework-crd.yml b/quickstarts/maven/spring-boot-crd/src/main/jkube/framework-crd.yml index 3753c064fe..70c33e7104 100644 --- a/quickstarts/maven/spring-boot-crd/src/main/jkube/framework-crd.yml +++ b/quickstarts/maven/spring-boot-crd/src/main/jkube/framework-crd.yml @@ -12,7 +12,7 @@ # Red Hat, Inc. - initial API and implementation # -apiVersion: apiextensions.k8s.io/v1beta1 +apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: name: frameworks.jkube.eclipse.org @@ -22,16 +22,16 @@ spec: - name: v1beta1 served: true storage: true - validation: - openAPIV3Schema: - type: object - properties: - name: - type: string + schema: + openAPIV3Schema: + type: object + properties: + name: + type: string scope: Namespaced names: plural: frameworks singular: framework kind: Framework shortNames: - - fwk \ No newline at end of file + - fwk