From 7612dded25de93cbd58e0a43b64e3473f7a28ef7 Mon Sep 17 00:00:00 2001 From: Georgios Andrianakis Date: Thu, 30 Jun 2022 09:01:52 +0300 Subject: [PATCH] Make quarkus.container-image.push=false effective in all k8s extensions This change makes sure that quarkus.container-image.push=false is taken into account and always prevents container images from being pushed, even if a kubernetes extension requests a deployment. Resolves: #26385 --- .../kubernetes/deployment/KubernetesDeployer.java | 15 ++++++++++++--- .../KubernetesDeployerPrerequisite.java | 7 ++++--- .../deployment/KubernetesProcessor.java | 9 +++++++++ ...reventImplicitContainerImagePushBuildItem.java | 13 +++++++++++++ 4 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/PreventImplicitContainerImagePushBuildItem.java diff --git a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesDeployer.java b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesDeployer.java index cc5c1dee815e8..969be8042a97e 100644 --- a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesDeployer.java +++ b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesDeployer.java @@ -37,6 +37,7 @@ import io.fabric8.openshift.api.model.Route; import io.fabric8.openshift.client.OpenShiftClient; import io.quarkus.container.image.deployment.ContainerImageCapabilitiesUtil; +import io.quarkus.container.image.deployment.ContainerImageConfig; import io.quarkus.container.spi.ContainerImageInfoBuildItem; import io.quarkus.deployment.Capabilities; import io.quarkus.deployment.Capability; @@ -64,7 +65,9 @@ public class KubernetesDeployer { public void selectDeploymentTarget(ContainerImageInfoBuildItem containerImageInfo, EnabledKubernetesDeploymentTargetsBuildItem targets, Capabilities capabilities, - BuildProducer selectedDeploymentTarget) { + ContainerImageConfig containerImageConfig, + BuildProducer selectedDeploymentTarget, + BuildProducer preventImplicitContainerImagePush) { Optional activeContainerImageCapability = ContainerImageCapabilitiesUtil .getActiveContainerImageCapability(capabilities); @@ -75,8 +78,11 @@ public void selectDeploymentTarget(ContainerImageInfoBuildItem containerImageInf } final DeploymentTargetEntry selectedTarget = determineDeploymentTarget( - containerImageInfo, targets, activeContainerImageCapability.get()); + containerImageInfo, targets, activeContainerImageCapability.get(), containerImageConfig); selectedDeploymentTarget.produce(new SelectedKubernetesDeploymentTargetBuildItem(selectedTarget)); + if (MINIKUBE.equals(selectedTarget.getName())) { + preventImplicitContainerImagePush.produce(new PreventImplicitContainerImagePushBuildItem()); + } } @BuildStep @@ -141,7 +147,8 @@ public void deploy(KubernetesClientBuildItem kubernetesClient, */ private DeploymentTargetEntry determineDeploymentTarget( ContainerImageInfoBuildItem containerImageInfo, - EnabledKubernetesDeploymentTargetsBuildItem targets, String activeContainerImageCapability) { + EnabledKubernetesDeploymentTargetsBuildItem targets, String activeContainerImageCapability, + ContainerImageConfig containerImageConfig) { final DeploymentTargetEntry selectedTarget; boolean checkForMissingRegistry = true; @@ -180,6 +187,8 @@ private DeploymentTargetEntry determineDeploymentTarget( } else if (MINIKUBE.equals(selectedTarget.getName())) { checkForMissingRegistry = false; + } else if (containerImageConfig.isPushExplicitlyDisabled()) { + checkForMissingRegistry = false; } if (checkForMissingRegistry && !containerImageInfo.getRegistry().isPresent()) { diff --git a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesDeployerPrerequisite.java b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesDeployerPrerequisite.java index ce0665e9d0882..6a28b164fcc7e 100644 --- a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesDeployerPrerequisite.java +++ b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesDeployerPrerequisite.java @@ -1,5 +1,6 @@ package io.quarkus.kubernetes.deployment; +import java.util.List; import java.util.Optional; import io.quarkus.container.spi.ContainerImageBuildRequestBuildItem; @@ -16,6 +17,7 @@ public class KubernetesDeployerPrerequisite { public void prepare(ContainerImageInfoBuildItem containerImage, Optional selectedDeploymentTarget, Optional fallbackRegistry, + List preventImplicitContainerImagePush, BuildProducer buildRequestProducer, BuildProducer pushRequestProducer) { @@ -28,11 +30,10 @@ public void prepare(ContainerImageInfoBuildItem containerImage, //Let's communicate to the container-image plugin that we need an image build and an image push. buildRequestProducer.produce(new ContainerImageBuildRequestBuildItem()); // When a registry is present, we want to push the image - // However we need to make sure we don't push to the registry when deploying to Minikube + // However we need to make sure we don't push to the registry when deploying to a local cluster // since all updates are meant to find the image from the docker daemon boolean registryIsPresent = containerImage.getRegistry().isPresent() || fallbackRegistry.isPresent(); - if (registryIsPresent && - !selectedDeploymentTarget.get().getEntry().getName().equals(Constants.MINIKUBE)) { + if (registryIsPresent && preventImplicitContainerImagePush.isEmpty()) { pushRequestProducer.produce(new ContainerImagePushRequestBuildItem()); } } diff --git a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesProcessor.java b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesProcessor.java index 7fd89ee684eed..cb135082a2057 100644 --- a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesProcessor.java +++ b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesProcessor.java @@ -31,6 +31,7 @@ import io.dekorate.project.Project; import io.dekorate.utils.Maps; import io.dekorate.utils.Strings; +import io.quarkus.container.image.deployment.ContainerImageConfig; import io.quarkus.deployment.Capabilities; import io.quarkus.deployment.Feature; import io.quarkus.deployment.IsTest; @@ -81,6 +82,14 @@ public EnabledKubernetesDeploymentTargetsBuildItem enabledKubernetesDeploymentTa return new EnabledKubernetesDeploymentTargetsBuildItem(entries); } + @BuildStep + public void preventContainerPush(ContainerImageConfig containerImageConfig, + BuildProducer producer) { + if (containerImageConfig.isPushExplicitlyDisabled()) { + producer.produce(new PreventImplicitContainerImagePushBuildItem()); + } + } + @BuildStep(onlyIfNot = IsTest.class) public void build(ApplicationInfoBuildItem applicationInfo, OutputTargetBuildItem outputTarget, diff --git a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/PreventImplicitContainerImagePushBuildItem.java b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/PreventImplicitContainerImagePushBuildItem.java new file mode 100644 index 0000000000000..b02b4eddef128 --- /dev/null +++ b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/PreventImplicitContainerImagePushBuildItem.java @@ -0,0 +1,13 @@ +package io.quarkus.kubernetes.deployment; + +import io.quarkus.builder.item.MultiBuildItem; + +/** + * A build item that is used to prevent the Kubernetes processing from requesting + * a container image push request. + * This is useful for cases where the kubernetes cluster is local and the container image + * is built directly into a context (i.e. a docker daemon) which the cluster has access to. + */ +public final class PreventImplicitContainerImagePushBuildItem extends MultiBuildItem { + +}