From 4e32f4a617cb50168a27fe0ac4c07d249266cef6 Mon Sep 17 00:00:00 2001 From: Jose Date: Tue, 2 May 2023 12:12:21 +0200 Subject: [PATCH] Print valid api versions when specifying one in K8s Client Dev Services Plus, accept api-versions that use either the major version `v1` only or both the major and the minor versions `v1.22`. Fix https://github.com/quarkusio/quarkus/issues/33007 --- .../DevServicesKubernetesProcessor.java | 23 ++++++++++++------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/extensions/kubernetes-client/deployment/src/main/java/io/quarkus/kubernetes/client/deployment/DevServicesKubernetesProcessor.java b/extensions/kubernetes-client/deployment/src/main/java/io/quarkus/kubernetes/client/deployment/DevServicesKubernetesProcessor.java index 8deaab773cc08..48e507f612678 100644 --- a/extensions/kubernetes-client/deployment/src/main/java/io/quarkus/kubernetes/client/deployment/DevServicesKubernetesProcessor.java +++ b/extensions/kubernetes-client/deployment/src/main/java/io/quarkus/kubernetes/client/deployment/DevServicesKubernetesProcessor.java @@ -15,7 +15,7 @@ import java.util.Objects; import java.util.Optional; import java.util.function.Supplier; -import java.util.stream.Stream; +import java.util.stream.Collectors; import org.jboss.logging.Logger; import org.testcontainers.DockerClientFactory; @@ -199,17 +199,19 @@ private RunningDevService startKubernetes(DockerStatusBuildItem dockerStatusBuil switch (config.flavor) { case API_ONLY: container = new ApiServerContainer( - config.apiVersion.map(version -> findOrElseThrow(version, ApiServerContainerVersion.class)) + config.apiVersion + .map(version -> findOrElseThrow(config.flavor, version, ApiServerContainerVersion.class)) .orElseGet(() -> latest(ApiServerContainerVersion.class))); break; case K3S: container = new K3sContainer( - config.apiVersion.map(version -> findOrElseThrow(version, K3sContainerVersion.class)) + config.apiVersion.map(version -> findOrElseThrow(config.flavor, version, K3sContainerVersion.class)) .orElseGet(() -> latest(K3sContainerVersion.class))); break; case KIND: container = new KindContainer( - config.apiVersion.map(version -> findOrElseThrow(version, KindContainerVersion.class)) + config.apiVersion + .map(version -> findOrElseThrow(config.flavor, version, KindContainerVersion.class)) .orElseGet(() -> latest(KindContainerVersion.class))); break; default: @@ -241,12 +243,17 @@ private RunningDevService startKubernetes(DockerStatusBuildItem dockerStatusBuil .orElseGet(defaultKubernetesClusterSupplier); } - > T findOrElseThrow(final String version, final Class versions) { + > T findOrElseThrow(final Flavor flavor, final String version, final Class versions) { final String versionWithPrefix = !version.startsWith("v") ? "v" + version : version; - return Stream.of(versions.getEnumConstants()) - .filter(v -> v.descriptor().getKubernetesVersion().equalsIgnoreCase(versionWithPrefix)) + return KubernetesVersionEnum.ascending(versions) + .stream() + .filter(v -> v.descriptor().getKubernetesVersion().startsWith(versionWithPrefix)) .findFirst() - .orElseThrow(); + .orElseThrow(() -> new IllegalArgumentException( + String.format("Invalid API version '%s' for flavor '%s'. Options are: [%s]", versionWithPrefix, flavor, + KubernetesVersionEnum.ascending(versions).stream() + .map(v -> v.descriptor().getKubernetesVersion()) + .collect(Collectors.joining(", "))))); } private Map getKubernetesClientConfigFromKubeConfig(KubeConfig kubeConfig) {