diff --git a/extensions/kubernetes/kind/deployment/src/main/java/io/quarkus/kind/deployment/KindProcessor.java b/extensions/kubernetes/kind/deployment/src/main/java/io/quarkus/kind/deployment/KindProcessor.java index 47cba6debd7baf..ce3fca30d6399a 100644 --- a/extensions/kubernetes/kind/deployment/src/main/java/io/quarkus/kind/deployment/KindProcessor.java +++ b/extensions/kubernetes/kind/deployment/src/main/java/io/quarkus/kind/deployment/KindProcessor.java @@ -41,6 +41,7 @@ import io.quarkus.kubernetes.spi.KubernetesJobBuildItem; import io.quarkus.kubernetes.spi.KubernetesLabelBuildItem; import io.quarkus.kubernetes.spi.KubernetesPortBuildItem; +import io.quarkus.kubernetes.spi.KubernetesProbePortNameBuildItem; import io.quarkus.kubernetes.spi.KubernetesResourceMetadataBuildItem; import io.quarkus.kubernetes.spi.KubernetesRoleBindingBuildItem; import io.quarkus.kubernetes.spi.KubernetesRoleBuildItem; @@ -104,6 +105,7 @@ public List createDecorators(ApplicationInfoBuildItem applic Optional image, Optional command, List ports, + Optional portName, Optional livenessPath, Optional readinessPath, List roles, @@ -112,6 +114,7 @@ public List createDecorators(ApplicationInfoBuildItem applic return DevClusterHelper.createDecorators(KIND, applicationInfo, outputTarget, config, packageConfig, metricsConfiguration, initContainers, jobs, annotations, labels, envs, baseImage, image, command, ports, + portName, livenessPath, readinessPath, roles, roleBindings, customProjectRoot); diff --git a/extensions/kubernetes/minikube/deployment/src/main/java/io/quarkus/minikube/deployment/MinikubeProcessor.java b/extensions/kubernetes/minikube/deployment/src/main/java/io/quarkus/minikube/deployment/MinikubeProcessor.java index e2fc9e183e7c50..d1d34577a3c66b 100644 --- a/extensions/kubernetes/minikube/deployment/src/main/java/io/quarkus/minikube/deployment/MinikubeProcessor.java +++ b/extensions/kubernetes/minikube/deployment/src/main/java/io/quarkus/minikube/deployment/MinikubeProcessor.java @@ -38,6 +38,7 @@ import io.quarkus.kubernetes.spi.KubernetesJobBuildItem; import io.quarkus.kubernetes.spi.KubernetesLabelBuildItem; import io.quarkus.kubernetes.spi.KubernetesPortBuildItem; +import io.quarkus.kubernetes.spi.KubernetesProbePortNameBuildItem; import io.quarkus.kubernetes.spi.KubernetesResourceMetadataBuildItem; import io.quarkus.kubernetes.spi.KubernetesRoleBindingBuildItem; import io.quarkus.kubernetes.spi.KubernetesRoleBuildItem; @@ -100,6 +101,7 @@ public List createDecorators(ApplicationInfoBuildItem applic Optional image, Optional command, List ports, + Optional portName, Optional livenessPath, Optional readinessPath, List roles, @@ -108,6 +110,7 @@ public List createDecorators(ApplicationInfoBuildItem applic return DevClusterHelper.createDecorators(MINIKUBE, applicationInfo, outputTarget, config, packageConfig, metricsConfiguration, initContainers, jobs, annotations, labels, envs, baseImage, image, command, ports, + portName, livenessPath, readinessPath, roles, roleBindings, customProjectRoot); diff --git a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/ApplyHttpGetActionPortDecorator.java b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/ApplyHttpGetActionPortDecorator.java index 392539aeae0777..eb4fa1b1e4ecf3 100644 --- a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/ApplyHttpGetActionPortDecorator.java +++ b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/ApplyHttpGetActionPortDecorator.java @@ -1,33 +1,89 @@ - package io.quarkus.kubernetes.deployment; +import static io.dekorate.utils.Metadata.getMetadata; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + import io.dekorate.kubernetes.decorator.AddLivenessProbeDecorator; import io.dekorate.kubernetes.decorator.AddReadinessProbeDecorator; import io.dekorate.kubernetes.decorator.AddSidecarDecorator; -import io.dekorate.kubernetes.decorator.ApplicationContainerDecorator; import io.dekorate.kubernetes.decorator.Decorator; import io.dekorate.kubernetes.decorator.ResourceProvidingDecorator; +import io.fabric8.kubernetes.api.builder.Builder; +import io.fabric8.kubernetes.api.model.ContainerBuilder; import io.fabric8.kubernetes.api.model.HTTPGetActionFluent; -public class ApplyHttpGetActionPortDecorator extends ApplicationContainerDecorator> { +public class ApplyHttpGetActionPortDecorator extends Decorator> { + private final String deployment; + private final String container; private final Integer port; + private final String probeKind; public ApplyHttpGetActionPortDecorator(Integer port) { - this(ANY, ANY, port); + this(ANY, ANY, port, ANY); + } + + public ApplyHttpGetActionPortDecorator(Integer port, String probeKind) { + this(ANY, ANY, port, probeKind); } public ApplyHttpGetActionPortDecorator(String deployment, Integer port) { - this(deployment, ANY, port); + this(deployment, ANY, port, ANY); + } + + public ApplyHttpGetActionPortDecorator(String deployment, Integer port, String probeKind) { + this(deployment, ANY, port, probeKind); } public ApplyHttpGetActionPortDecorator(String deployment, String container, Integer port) { - super(deployment, container); + this(deployment, container, port, ANY); + } + + public ApplyHttpGetActionPortDecorator(String deployment, String container, Integer port, String probeKind) { + this.deployment = deployment; + this.container = container; this.port = port; + this.probeKind = probeKind; + } + + @Override + public void visit(List> path, HTTPGetActionFluent action) { + boolean inMatchingProbe = probeKind == ANY || path.stream().map(e -> e.getKey()).anyMatch(i -> i.equals(probeKind)); + if (!inMatchingProbe) { + return; + } + + boolean inMatchingContainer = container == ANY || path.stream() + .map(e -> e.getValue()) + .filter(v -> v instanceof ContainerBuilder) + .map(v -> (ContainerBuilder) v) + .anyMatch(c -> c.getName() != null && c.getName().equals(container)); + + if (!inMatchingContainer) { + return; + } + + boolean inMatchingResource = deployment == ANY || path.stream() + .map(e -> e.getValue()) + .filter(v -> v instanceof Builder) + .map(v -> (Builder) v) + .map(b -> getMetadata(b)) + .filter(m -> m.isPresent()) + .map(Optional::get) + .anyMatch(m -> m.getName() != null && m.getName().equals(deployment)); + + if (!inMatchingResource) { + return; + } + + visit(action); } @Override - public void andThenVisit(HTTPGetActionFluent action) { + public void visit(HTTPGetActionFluent action) { if (port == null) { // workaround to make sure we don't get a NPE action.withNewPort((String) null); diff --git a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/ApplyReadinesHttpPortDecorator.java b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/ApplyReadinesHttpPortDecorator.java new file mode 100644 index 00000000000000..da2c36a1b990cf --- /dev/null +++ b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/ApplyReadinesHttpPortDecorator.java @@ -0,0 +1,48 @@ +package io.quarkus.kubernetes.deployment; + +import java.util.List; +import java.util.Map; + +import io.dekorate.kubernetes.config.ContainerFluent; +import io.dekorate.kubernetes.decorator.AddLivenessProbeDecorator; +import io.dekorate.kubernetes.decorator.AddReadinessProbeDecorator; +import io.dekorate.kubernetes.decorator.Decorator; +import io.dekorate.kubernetes.decorator.ResourceProvidingDecorator; +import io.fabric8.kubernetes.api.model.HTTPGetActionFluent; +import io.fabric8.kubernetes.api.model.HasMetadata; + +public class ApplyReadinesHttpPortDecorator extends Decorator> { + + private Integer port; + + public ApplyReadinesHttpPortDecorator(String deploymentName, String containerName, Integer port) { + this.port = port; + addRequirement(HasMetadata.class, h -> deploymentName == null || deploymentName.equals(h.getMetadata().getName())); + addRequirement(ContainerFluent.class, c -> containerName == null || containerName.equals(c.getName())); + } + + @Override + public void visit(List> path, HTTPGetActionFluent action) { + if (path.stream().map(e -> e.getKey()).anyMatch(i -> i.equals("readinessProbe"))) { + visit(action); + } + } + + @Override + public void visit(HTTPGetActionFluent action) { + if (port == null) { + // workaround to make sure we don't get a NPE + action.withNewPort((String) null); + } else { + action.withNewPort(port); + } + + } + + @Override + public Class[] after() { + return new Class[] { ResourceProvidingDecorator.class, AddSidecarDecorator.class, + AddLivenessProbeDecorator.class, AddReadinessProbeDecorator.class, ApplyHttpGetActionPortDecorator.class }; + } + +} diff --git a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/ChangeDeploymentTriggerDecorator.java b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/ChangeDeploymentTriggerDecorator.java index badd3dd41eb384..f67f69d81243b9 100644 --- a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/ChangeDeploymentTriggerDecorator.java +++ b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/ChangeDeploymentTriggerDecorator.java @@ -1,6 +1,5 @@ package io.quarkus.kubernetes.deployment; -import io.dekorate.kubernetes.decorator.Decorator; import io.dekorate.openshift.decorator.ApplyDeploymentTriggerDecorator; public class ChangeDeploymentTriggerDecorator extends ApplyDeploymentTriggerDecorator { @@ -8,9 +7,4 @@ public class ChangeDeploymentTriggerDecorator extends ApplyDeploymentTriggerDeco public ChangeDeploymentTriggerDecorator(String containerName, String imageStreamTag) { super(containerName, imageStreamTag); } - - @Override - public Class[] after() { - return new Class[] { ApplyDeploymentTriggerDecorator.class, RemoveDeploymentTriggerDecorator.class }; - } } diff --git a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/DevClusterHelper.java b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/DevClusterHelper.java index a31cb79ff4d746..a7c7c44c2d0dda 100644 --- a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/DevClusterHelper.java +++ b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/DevClusterHelper.java @@ -1,7 +1,6 @@ package io.quarkus.kubernetes.deployment; -import static io.quarkus.kubernetes.deployment.Constants.DEFAULT_HTTP_PORT; import static io.quarkus.kubernetes.deployment.Constants.KUBERNETES; import static io.quarkus.kubernetes.deployment.Constants.MAX_NODE_PORT_VALUE; import static io.quarkus.kubernetes.deployment.Constants.MAX_PORT_NUMBER; @@ -42,6 +41,7 @@ import io.quarkus.kubernetes.spi.KubernetesJobBuildItem; import io.quarkus.kubernetes.spi.KubernetesLabelBuildItem; import io.quarkus.kubernetes.spi.KubernetesPortBuildItem; +import io.quarkus.kubernetes.spi.KubernetesProbePortNameBuildItem; import io.quarkus.kubernetes.spi.KubernetesRoleBindingBuildItem; import io.quarkus.kubernetes.spi.KubernetesRoleBuildItem; @@ -64,6 +64,7 @@ public static List createDecorators(String clusterKind, Optional image, Optional command, List ports, + Optional portName, Optional livenessPath, Optional readinessPath, List roles, @@ -118,8 +119,14 @@ public static List createDecorators(String clusterKind, } //Probe port handling - Integer portNumber = port.map(Port::getContainerPort).orElse(DEFAULT_HTTP_PORT); - result.add(new DecoratorBuildItem(clusterKind, new ApplyHttpGetActionPortDecorator(name, name, portNumber))); + result.add( + KubernetesCommonHelper.createProbeHttpPortDecorator(name, clusterKind, "livenessProbe", config.livenessProbe, + portName, + ports)); + result.add( + KubernetesCommonHelper.createProbeHttpPortDecorator(name, clusterKind, "readinessProbe", config.readinessProbe, + portName, + ports)); // Handle init Containers result.addAll(KubernetesCommonHelper.createInitContainerDecorators(clusterKind, name, initContainers, result)); diff --git a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KnativeProcessor.java b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KnativeProcessor.java index f5490ee7272240..d4d3029bf28c4c 100644 --- a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KnativeProcessor.java +++ b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KnativeProcessor.java @@ -282,7 +282,7 @@ public List createDecorators(ApplicationInfoBuildItem applic result.add(new DecoratorBuildItem(KNATIVE, new ApplyServiceTypeDecorator(name, config.getServiceType().name()))); //In Knative its expected that all http ports in probe are omitted (so we set them to null). - result.add(new DecoratorBuildItem(KNATIVE, new ApplyHttpGetActionPortDecorator(name, null))); + result.add(new DecoratorBuildItem(KNATIVE, new ApplyHttpGetActionPortDecorator(name, (Integer) null))); //Traffic Splitting config.revisionName.ifPresent(r -> { diff --git a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesCommonHelper.java b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesCommonHelper.java index 702f4481c3b4f0..959864deab4c12 100644 --- a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesCommonHelper.java +++ b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/KubernetesCommonHelper.java @@ -698,9 +698,15 @@ private static List createAnnotationDecorators(Optional portName, List ports) { @@ -714,7 +720,7 @@ public static DecoratorBuildItem createProbeHttpPortDecorator(String name, Strin Integer port = probeConfig.httpActionPort .orElse(ports.stream().filter(p -> httpPortName.equals(p.getName())) .map(KubernetesPortBuildItem::getPort).findFirst().orElse(DEFAULT_HTTP_PORT)); - return new DecoratorBuildItem(target, new ApplyHttpGetActionPortDecorator(name, name, port)); + return new DecoratorBuildItem(target, new ApplyHttpGetActionPortDecorator(name, name, port, probeKind)); } /** diff --git a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/OpenshiftProcessor.java b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/OpenshiftProcessor.java index 7867622f04775b..ffe3064fd66721 100644 --- a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/OpenshiftProcessor.java +++ b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/OpenshiftProcessor.java @@ -302,9 +302,13 @@ public List createDecorators(ApplicationInfoBuildItem applic } // Probe port handling - result.add(KubernetesCommonHelper.createProbeHttpPortDecorator(name, OPENSHIFT, config.livenessProbe, portName, ports)); + result.add(KubernetesCommonHelper.createProbeHttpPortDecorator(name, OPENSHIFT, "livenssProbe", config.livenessProbe, + portName, + ports)); result.add( - KubernetesCommonHelper.createProbeHttpPortDecorator(name, OPENSHIFT, config.readinessProbe, portName, ports)); + KubernetesCommonHelper.createProbeHttpPortDecorator(name, OPENSHIFT, "readinessProbe", config.readinessProbe, + portName, + ports)); // Handle non-openshift builds if (deploymentKind == DeploymentResourceKind.DeploymentConfig diff --git a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/RemoveDeploymentTriggerDecorator.java b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/RemoveDeploymentTriggerDecorator.java index 56a9f565d37dcd..408836eb8054d8 100644 --- a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/RemoveDeploymentTriggerDecorator.java +++ b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/RemoveDeploymentTriggerDecorator.java @@ -20,12 +20,12 @@ public void andThenVisit(DeploymentConfigSpecFluent deploymentConfigSpec, Obj } @Override - public Class[] after() { - return new Class[] { ApplyDeploymentTriggerDecorator.class }; + public Class[] before() { + return new Class[] { ChangeDeploymentTriggerDecorator.class }; } @Override - public Class[] before() { - return new Class[] { ChangeDeploymentTriggerDecorator.class }; + public Class[] after() { + return new Class[] { ApplyDeploymentTriggerDecorator.class }; } } diff --git a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/VanillaKubernetesProcessor.java b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/VanillaKubernetesProcessor.java index e4998f75fba96a..6119ea9c0ff443 100644 --- a/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/VanillaKubernetesProcessor.java +++ b/extensions/kubernetes/vanilla/deployment/src/main/java/io/quarkus/kubernetes/deployment/VanillaKubernetesProcessor.java @@ -243,9 +243,13 @@ public List createDecorators(ApplicationInfoBuildItem applic // Probe port handling result.add( - KubernetesCommonHelper.createProbeHttpPortDecorator(name, KUBERNETES, config.livenessProbe, portName, ports)); + KubernetesCommonHelper.createProbeHttpPortDecorator(name, KUBERNETES, "livenessProbe", config.livenessProbe, + portName, + ports)); result.add( - KubernetesCommonHelper.createProbeHttpPortDecorator(name, KUBERNETES, config.readinessProbe, portName, ports)); + KubernetesCommonHelper.createProbeHttpPortDecorator(name, KUBERNETES, "readinessProbe", config.readinessProbe, + portName, + ports)); // Handle remote debug configuration if (config.remoteDebug.enabled) { @@ -277,5 +281,4 @@ void externalizeInitTasks( decorators); } } - }