From 0ab720ae2a64bdc3eccd4a7c44e35875df0dc6a8 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Wed, 4 Aug 2021 22:20:46 +0530 Subject: [PATCH] Fix #815: ClassCastException during oc:build when OpenShift not present Using OpenShiftClient to store result of `clusterAccess.createDefaultClient()` seems to cause ClassCastException when return value is of type DefaultKubernetesClient. Instead, Use a temporaty KubernetesClient variable for `clusterAccess.createDefaultClient()` and type cast it to OpenShiftClient in case it's adaptable to OpenShiftClient interface. Signed-off-by: Rohan Kumar --- CHANGELOG.md | 1 + .../openshift/OpenshiftBuildService.java | 6 +++-- .../openshift/OpenShiftBuildServiceTest.java | 24 +++++++++++++++++++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f52fc5ecc6..ee69b0cc3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Usage: ./scripts/extract-changelog-for-version.sh 1.3.37 5 ``` ### 1.5.0-SNAPSHOT +* Fix #815: `java.lang.ClassCastException` during `oc:build` when OpenShift not present ### 1.4.0 (2021-07-27) * Fix #253: Refactor JKubeServiceHub's BuildService election mechanism via ServiceLoader diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftBuildService.java index aed994dc20..82bcd0fd9f 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftBuildService.java @@ -26,6 +26,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; +import io.fabric8.kubernetes.client.KubernetesClient; import org.eclipse.jkube.kit.build.api.auth.AuthConfig; import org.eclipse.jkube.kit.build.service.docker.auth.AuthConfigFactory; import org.eclipse.jkube.kit.common.KitLogger; @@ -231,10 +232,11 @@ private void initClient() { clusterAccess = new ClusterAccess(log, ClusterConfiguration.from(System.getProperties(), jKubeServiceHub.getConfiguration().getProject().getProperties()).build()); } - client = clusterAccess.createDefaultClient(); - if (!isOpenShift(client)) { + KubernetesClient k8sClient = clusterAccess.createDefaultClient(); + if (!isOpenShift(k8sClient)) { throw new IllegalStateException("OpenShift platform has been specified but OpenShift has not been detected!"); } + client = (OpenShiftClient) k8sClient; } private void validateSourceType(String buildName, BuildConfigSpec spec) { diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceTest.java index eaa3cf926c..f961fb009d 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceTest.java @@ -16,12 +16,17 @@ import mockit.Mocked; import mockit.Verifications; import org.eclipse.jkube.kit.common.RegistryConfig; +import org.eclipse.jkube.kit.config.image.ImageConfiguration; +import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.service.JKubeServiceException; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; import org.junit.Test; import java.util.Collections; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertThrows; + @SuppressWarnings("unused") public class OpenShiftBuildServiceTest { @@ -39,4 +44,23 @@ public void push_withDefaults_shouldLogWarning() throws JKubeServiceException { }}; // @formatter:on } + + @Test + public void initClient_withNoOpenShift_shouldThrowException() { + // Given + // @formatter:off + ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .name("foo/bar:latest") + .build(BuildConfiguration.builder() + .from("baseimage:latest") + .build()) + .build(); + // @formatter:on + OpenshiftBuildService openshiftBuildService = new OpenshiftBuildService(jKubeServiceHub); + + // When + Then + IllegalStateException illegalStateException = assertThrows(IllegalStateException.class, () -> openshiftBuildService.build(imageConfiguration)); + assertThat(illegalStateException.getMessage()) + .isEqualTo("OpenShift platform has been specified but OpenShift has not been detected!"); + } }