From 764a4e1255ea0b6876eee385b6963eddb8f46009 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 23:11:55 +0000 Subject: [PATCH 001/289] chore(deps): Bump org.fusesource.jansi:jansi from 2.4.0 to 2.4.1 Bumps [org.fusesource.jansi:jansi](https://github.com/fusesource/jansi) from 2.4.0 to 2.4.1. - [Release notes](https://github.com/fusesource/jansi/releases) - [Changelog](https://github.com/fusesource/jansi/blob/master/changelog.md) - [Commits](https://github.com/fusesource/jansi/compare/jansi-2.4.0...jansi-2.4.1) --- updated-dependencies: - dependency-name: org.fusesource.jansi:jansi dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- jkube-kit/parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index 91e5f30d9c..b5aa78d922 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -42,7 +42,7 @@ 4.4.16 4.5.14 0.0.1 - 2.4.0 + 2.4.1 3.29.2-GA 5.12.0.202106070339-r From aad15651ede64e5a07298bf61faea20e27861c7b Mon Sep 17 00:00:00 2001 From: Jonathanlemon <43302879+Jonathanlemon@users.noreply.github.com> Date: Tue, 9 Apr 2024 00:55:07 -0400 Subject: [PATCH 002/289] fix: added paramterized type for ArchiveInputStream (#2869) --- .../eclipse/jkube/kit/common/archive/ArchiveDecompressor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/archive/ArchiveDecompressor.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/archive/ArchiveDecompressor.java index 13b19bac15..a75106f820 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/archive/ArchiveDecompressor.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/archive/ArchiveDecompressor.java @@ -88,7 +88,7 @@ private static void extractArchiveContents(InputStream is, File targetDirectory) FileUtil.cleanDirectory(targetDirectory); } FileUtil.createDirectory(targetDirectory); - try (ArchiveInputStream ais = new ArchiveStreamFactory().createArchiveInputStream(is)) { + try (ArchiveInputStream ais = new ArchiveStreamFactory().createArchiveInputStream(is)) { ArchiveEntry entry; while ((entry = ais.getNextEntry()) != null) { final File extractTo = new File(targetDirectory, fileName(entry.getName())); From 24ceb7c0c03639dddf4d13327cf1dc6b66d7a734 Mon Sep 17 00:00:00 2001 From: Abhay Kumar Gupta Date: Tue, 9 Apr 2024 12:48:34 +0530 Subject: [PATCH 003/289] fix: remove redundant method from ResourceMojo defined in superclass (#2883) --- .../eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java index 4a87d479d3..7a7819344c 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java @@ -179,11 +179,6 @@ public void executeInternal() throws MojoExecutionException, MojoFailureExceptio } } - @Override - protected RuntimeMode getRuntimeMode() { - return RuntimeMode.KUBERNETES; - } - protected PlatformMode getPlatformMode() { return PlatformMode.kubernetes; } From 4cfb00728d455273827d0552376f304104fbed24 Mon Sep 17 00:00:00 2001 From: Wayne Kirimi <37283450+waynemorphic@users.noreply.github.com> Date: Tue, 9 Apr 2024 10:25:53 +0300 Subject: [PATCH 004/289] refactor(quickstarts): replaced RequestMapping with specific GetMapping annotation --- .../jkube/maven/sample/springboot/jib/HelloController.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/quickstarts/maven/spring-boot-with-jib/src/main/java/org/eclipse/jkube/maven/sample/springboot/jib/HelloController.java b/quickstarts/maven/spring-boot-with-jib/src/main/java/org/eclipse/jkube/maven/sample/springboot/jib/HelloController.java index ee5ca22a9c..bb2edd6b2b 100644 --- a/quickstarts/maven/spring-boot-with-jib/src/main/java/org/eclipse/jkube/maven/sample/springboot/jib/HelloController.java +++ b/quickstarts/maven/spring-boot-with-jib/src/main/java/org/eclipse/jkube/maven/sample/springboot/jib/HelloController.java @@ -13,16 +13,13 @@ */ package org.eclipse.jkube.maven.sample.springboot.jib; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; - @RestController public class HelloController { - - @RequestMapping("/") + @GetMapping("/") public String index() { return "Greetings from Spring Boot(Powered by JIB)!!"; } - } From b05bf93f442d5ed9941566856ed04cffa85a3a17 Mon Sep 17 00:00:00 2001 From: Akshay Agrawal <44442353+akshay11agrawal@users.noreply.github.com> Date: Tue, 9 Apr 2024 08:42:48 +0100 Subject: [PATCH 005/289] fix(gradle): updated the register method signature (#2863) --- .../org/eclipse/jkube/gradle/plugin/AbstractJKubePlugin.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/AbstractJKubePlugin.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/AbstractJKubePlugin.java index 110e105a3a..c180aaf788 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/AbstractJKubePlugin.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/AbstractJKubePlugin.java @@ -68,10 +68,9 @@ private void configureTasks(Project project) { }); } - protected final TaskProvider register(Project project, String name, Class type) { + protected final void register(Project project, String name, Class type) { final TaskProvider registeredTask = project.getTasks().register(name, type, extensionClass); registeredTasks.add(registeredTask); - return registeredTask; } private static Function taskByName(Project evaluatedProject) { From 579e7df2005531a8f6ba86e037ea975385d807a9 Mon Sep 17 00:00:00 2001 From: Tanmay Mathpal Date: Tue, 9 Apr 2024 13:28:12 +0530 Subject: [PATCH 006/289] chore(quickstart): updated quarkus-customized-image to latest version of Quarkus (#2865) --- quickstarts/maven/quarkus-customized-image/pom.xml | 2 +- .../quarkus/rest/CoolApplicationResource.java | 12 ++++++------ .../quarkus/rest/CoolApplicationService.java | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/quickstarts/maven/quarkus-customized-image/pom.xml b/quickstarts/maven/quarkus-customized-image/pom.xml index 96793a89c7..704ef88ffa 100644 --- a/quickstarts/maven/quarkus-customized-image/pom.xml +++ b/quickstarts/maven/quarkus-customized-image/pom.xml @@ -34,7 +34,7 @@ ${project.version} quarkus-bom io.quarkus.platform - 2.13.3.Final + 3.9.1 12819530-ocp42-exposed-env-pull-secret-pull-secret diff --git a/quickstarts/maven/quarkus-customized-image/src/main/java/org/eclipse/jkube/quickstart/quarkus/rest/CoolApplicationResource.java b/quickstarts/maven/quarkus-customized-image/src/main/java/org/eclipse/jkube/quickstart/quarkus/rest/CoolApplicationResource.java index 39cd8f46d5..5ecea09b12 100644 --- a/quickstarts/maven/quarkus-customized-image/src/main/java/org/eclipse/jkube/quickstart/quarkus/rest/CoolApplicationResource.java +++ b/quickstarts/maven/quarkus-customized-image/src/main/java/org/eclipse/jkube/quickstart/quarkus/rest/CoolApplicationResource.java @@ -13,12 +13,12 @@ */ package org.eclipse.jkube.quickstart.quarkus.rest; -import javax.inject.Inject; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.inject.Inject; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; @Path("/") public class CoolApplicationResource { diff --git a/quickstarts/maven/quarkus-customized-image/src/main/java/org/eclipse/jkube/quickstart/quarkus/rest/CoolApplicationService.java b/quickstarts/maven/quarkus-customized-image/src/main/java/org/eclipse/jkube/quickstart/quarkus/rest/CoolApplicationService.java index e910716430..05e4a91117 100644 --- a/quickstarts/maven/quarkus-customized-image/src/main/java/org/eclipse/jkube/quickstart/quarkus/rest/CoolApplicationService.java +++ b/quickstarts/maven/quarkus-customized-image/src/main/java/org/eclipse/jkube/quickstart/quarkus/rest/CoolApplicationService.java @@ -13,7 +13,7 @@ */ package org.eclipse.jkube.quickstart.quarkus.rest; -import javax.inject.Singleton; +import jakarta.inject.Singleton; @Singleton public class CoolApplicationService { From adc99b6d14c56f4daee3c4a3822053d520b22e4d Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Tue, 9 Apr 2024 10:16:49 +0200 Subject: [PATCH 007/289] fix(quickstart): set quarkus-compatible base image Signed-off-by: Marc Nuri --- quickstarts/maven/quarkus-customized-image/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quickstarts/maven/quarkus-customized-image/pom.xml b/quickstarts/maven/quarkus-customized-image/pom.xml index 704ef88ffa..c82e598072 100644 --- a/quickstarts/maven/quarkus-customized-image/pom.xml +++ b/quickstarts/maven/quarkus-customized-image/pom.xml @@ -98,7 +98,7 @@ ${project.groupId}/${project.artifactId} - registry.redhat.io/openjdk/openjdk-11-rhel8:1.2-3.1587486933 + registry.access.redhat.com/ubi9/openjdk-21:1.18-1 latest ${project.version} From 54b74ee985a3c385f400cbaa00ac24aa912d8c99 Mon Sep 17 00:00:00 2001 From: Tejasree <60323760+Teja-11@users.noreply.github.com> Date: Tue, 9 Apr 2024 06:06:05 -0400 Subject: [PATCH 008/289] test: removed non-thrown declared Exception from method signature (#2882) --- .../jkube/gradle/plugin/tests/ITGradleRunnerExtension.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ITGradleRunnerExtension.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ITGradleRunnerExtension.java index 83b0a034bb..38e37d8499 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ITGradleRunnerExtension.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ITGradleRunnerExtension.java @@ -38,7 +38,7 @@ public void beforeEach(ExtensionContext context) throws Exception { } @Override - public void afterEach(ExtensionContext context) throws Exception { + public void afterEach(ExtensionContext context) { gradleRunner = null; } From 66eb2e24259e12cd2441ae968f589c88a03c6467 Mon Sep 17 00:00:00 2001 From: LaythonChilders <140751994+LaythonChilders@users.noreply.github.com> Date: Tue, 9 Apr 2024 06:12:15 -0400 Subject: [PATCH 009/289] fix: remove unused variable 'useReplicaSet' from ResourceMojo (#2881) --- .../eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java index 7a7819344c..4f1cfd2e53 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java @@ -116,10 +116,6 @@ public class ResourceMojo extends AbstractJKubeMojo { @Parameter private ProcessorConfig generator; - // Whether to use replica sets or replication controller. Could be configurable - // but for now leave it hidden. - private boolean useReplicaSet = true; - // The image configuration after resolving and customization protected List resolvedImages; From ce647addabfbd0d96ad73a66dd96db61441c75ee Mon Sep 17 00:00:00 2001 From: Wayne Kirimi <37283450+waynemorphic@users.noreply.github.com> Date: Tue, 9 Apr 2024 13:20:35 +0300 Subject: [PATCH 010/289] refactor(quickstarts): replaced RequestMapping with specific GetMapping annotation --- .../jkube/maven/sample/spring/boot/HelloController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/quickstarts/maven/spring-boot/src/main/java/org/eclipse/jkube/maven/sample/spring/boot/HelloController.java b/quickstarts/maven/spring-boot/src/main/java/org/eclipse/jkube/maven/sample/spring/boot/HelloController.java index 0a3cf43b52..71140bd7b5 100644 --- a/quickstarts/maven/spring-boot/src/main/java/org/eclipse/jkube/maven/sample/spring/boot/HelloController.java +++ b/quickstarts/maven/spring-boot/src/main/java/org/eclipse/jkube/maven/sample/spring/boot/HelloController.java @@ -13,7 +13,7 @@ */ package org.eclipse.jkube.maven.sample.spring.boot; -import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -24,7 +24,7 @@ @RestController public class HelloController { - @RequestMapping("/") + @GetMapping("/") public String index() { return "Greetings from Spring Boot!!"; } From df3924b1e7ceaceace14a3a567904279076fa0bf Mon Sep 17 00:00:00 2001 From: rschulm <146111691+rschulm@users.noreply.github.com> Date: Tue, 9 Apr 2024 06:58:12 -0400 Subject: [PATCH 011/289] test: removed use of Thread.sleep in PortForwardServiceTest (#2868) --- .../eclipse/jkube/kit/config/service/PortForwardServiceTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/PortForwardServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/PortForwardServiceTest.java index d4cafdcf63..d963c26df7 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/PortForwardServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/PortForwardServiceTest.java @@ -96,7 +96,6 @@ void simpleScenario() throws Exception { PortForwardService service = new PortForwardService(logger); try (Closeable c = service.forwardPortAsync(client, new LabelSelectorBuilder().withMatchLabels(Collections.singletonMap("mykey", "myvalue")).build(), 8080, 9000)) { - Thread.sleep(3000); } } From 89b5f22d833ffb0d21c85a69c3b56bd5a3411516 Mon Sep 17 00:00:00 2001 From: Oleksandr Krutko <46520164+arsenalzp@users.noreply.github.com> Date: Tue, 9 Apr 2024 13:00:56 +0200 Subject: [PATCH 012/289] doc: add Maven quickstart for Micronaut 4 (#2821) --- quickstarts/maven/micronaut4/README.md | 43 ++++ quickstarts/maven/micronaut4/pom.xml | 189 ++++++++++++++++++ .../micronaut/custom/Application.java | 23 +++ .../quickstart/micronaut/custom/Resource.java | 35 ++++ .../src/main/resources/application.yml | 22 ++ .../micronaut4/src/main/resources/logback.xml | 30 +++ .../micronaut/custom/SimpleClient.java | 31 +++ .../micronaut/custom/SimpleTest.java | 42 ++++ 8 files changed, 415 insertions(+) create mode 100644 quickstarts/maven/micronaut4/README.md create mode 100644 quickstarts/maven/micronaut4/pom.xml create mode 100644 quickstarts/maven/micronaut4/src/main/java/org/eclipse/jkube/quickstart/micronaut/custom/Application.java create mode 100644 quickstarts/maven/micronaut4/src/main/java/org/eclipse/jkube/quickstart/micronaut/custom/Resource.java create mode 100644 quickstarts/maven/micronaut4/src/main/resources/application.yml create mode 100644 quickstarts/maven/micronaut4/src/main/resources/logback.xml create mode 100644 quickstarts/maven/micronaut4/src/test/java/org/eclipse/jkube/quickstart/micronaut/custom/SimpleClient.java create mode 100644 quickstarts/maven/micronaut4/src/test/java/org/eclipse/jkube/quickstart/micronaut/custom/SimpleTest.java diff --git a/quickstarts/maven/micronaut4/README.md b/quickstarts/maven/micronaut4/README.md new file mode 100644 index 0000000000..ded609c08b --- /dev/null +++ b/quickstarts/maven/micronaut4/README.md @@ -0,0 +1,43 @@ +--- +name: "Maven :: Micronaut 4" +description: | + Micronaut 4 application featuring REST endpoints (micronaut-http) with validation (micronaut-validation). +--- +# Eclipse JKube Micronaut 4 quickstart + +Micronaut 4 application featuring REST endpoints (micronaut-http) with validation (micronaut-validation). + +## Requirements + +- JDK 17+ +- Kubernetes Cluster (Minikube, OpenShift, CRC, etc.) + +## Building and deploying the application + +```shell script +# Kubernetes +$ mvn clean package k8s:build k8s:resource k8s:apply +# OpenShift +$ mvn clean package oc:build oc:resource oc:apply +``` +## Expected output + +Once you've deployed the application, you should be able to perform requests: + +### Minikube + +```shell script +$ curl $(minikube ip):$(kubectl get svc micronaut -n default -o jsonpath='{.spec.ports[].nodePort}') +Hello from Micronaut deployed with JKube! +$ curl $(minikube ip):$(kubectl get svc micronaut -n default -o jsonpath='{.spec.ports[].nodePort}')/hello/world +Hello word! +``` + +### OpenShift + +```shell script +$ curl $(oc get routes.route.openshift.io micronaut -o jsonpath='{.spec.host}') +Hello from Micronaut deployed with JKube! +$ curl $(oc get routes.route.openshift.io micronaut -o jsonpath='{.spec.host}')/hello/world +Hello world! +``` diff --git a/quickstarts/maven/micronaut4/pom.xml b/quickstarts/maven/micronaut4/pom.xml new file mode 100644 index 0000000000..b9d9c6d51a --- /dev/null +++ b/quickstarts/maven/micronaut4/pom.xml @@ -0,0 +1,189 @@ + + + + 4.0.0 + + + io.micronaut.platform + micronaut-parent + 4.1.0 + + + org.eclipse.jkube.quickstarts.maven + micronaut + 1.16.1 + Eclipse JKube :: Quickstarts :: Maven :: Micronaut 4 + + Micronaut application featuring REST endpoints (micronaut-http) with validation (micronaut-validation). + + + + 17 + 17 + ${project.version} + ${project.parent.version} + org.eclipse.jkube.quickstart.micronaut.custom.Application + NodePort + + + + + io.micronaut + micronaut-jackson-databind + compile + + + io.micronaut.testresources + micronaut-test-resources-client + provided + + + io.micronaut.test + micronaut-test-junit5 + test + + + io.micronaut + micronaut-inject + compile + + + io.micronaut.validation + micronaut-validation + compile + + + io.micronaut + micronaut-http-server-netty + compile + + + io.micronaut + micronaut-http-client + compile + + + io.micronaut + micronaut-runtime + compile + + + io.micronaut + micronaut-management + compile + + + io.projectreactor + reactor-core + compile + + + javax.annotation + javax.annotation-api + compile + + + ch.qos.logback + logback-classic + runtime + + + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + io.micronaut.test + micronaut-test-junit5 + test + + + + + + io.micronaut.maven + micronaut-maven-plugin + + + org.apache.maven.plugins + maven-shade-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + + + + + + io.micronaut + micronaut-inject-java + ${micronaut.core.version} + + + io.micronaut.validation + micronaut-validation-processor + ${micronaut.version} + + + + -Amicronaut.processing.group=org.eclipse.jkube.quickstart.micronaut4 + -Amicronaut.processing.module=micronaut + + + + + test-compile + + testCompile + + + + + io.micronaut + micronaut-inject-java + ${micronaut.core.version} + + + io.micronaut.validation + micronaut-validation-processor + ${micronaut.version} + + + + + + + + org.eclipse.jkube + kubernetes-maven-plugin + ${jkube.version} + + + org.eclipse.jkube + openshift-maven-plugin + ${jkube.version} + + + + diff --git a/quickstarts/maven/micronaut4/src/main/java/org/eclipse/jkube/quickstart/micronaut/custom/Application.java b/quickstarts/maven/micronaut4/src/main/java/org/eclipse/jkube/quickstart/micronaut/custom/Application.java new file mode 100644 index 0000000000..a614747cbc --- /dev/null +++ b/quickstarts/maven/micronaut4/src/main/java/org/eclipse/jkube/quickstart/micronaut/custom/Application.java @@ -0,0 +1,23 @@ +/* + * 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.quickstart.micronaut.custom; + +import io.micronaut.runtime.Micronaut; + +public class Application { + + public static void main(String... args) { + Micronaut.run(Application.class, args); + } +} \ No newline at end of file diff --git a/quickstarts/maven/micronaut4/src/main/java/org/eclipse/jkube/quickstart/micronaut/custom/Resource.java b/quickstarts/maven/micronaut4/src/main/java/org/eclipse/jkube/quickstart/micronaut/custom/Resource.java new file mode 100644 index 0000000000..a13e5ec4ed --- /dev/null +++ b/quickstarts/maven/micronaut4/src/main/java/org/eclipse/jkube/quickstart/micronaut/custom/Resource.java @@ -0,0 +1,35 @@ +/* + * 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.quickstart.micronaut.custom; + +import io.micronaut.http.annotation.Controller; +import io.micronaut.http.annotation.Get; +import io.micronaut.context.annotation.Primary; +import jakarta.inject.Singleton; + +@Primary +@Singleton +@Controller("/") +public class Resource { + + @Get + public String get() { + return "Hello from Micronaut deployed with JKube!"; + } + + @Get(uri = "hello/{name}") + public String hello(String name) { + return String.format("Hello %s!", name); + } +} \ No newline at end of file diff --git a/quickstarts/maven/micronaut4/src/main/resources/application.yml b/quickstarts/maven/micronaut4/src/main/resources/application.yml new file mode 100644 index 0000000000..ad21bac338 --- /dev/null +++ b/quickstarts/maven/micronaut4/src/main/resources/application.yml @@ -0,0 +1,22 @@ +# +# 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 +# + +micronaut: + application: + name: micronaut-customized-image + server: + port: 9080 +endpoints: + health: + enabled: true diff --git a/quickstarts/maven/micronaut4/src/main/resources/logback.xml b/quickstarts/maven/micronaut4/src/main/resources/logback.xml new file mode 100644 index 0000000000..428fc691f4 --- /dev/null +++ b/quickstarts/maven/micronaut4/src/main/resources/logback.xml @@ -0,0 +1,30 @@ + + + + + true + + + %cyan(%d{HH:mm:ss.SSS}) %gray([%thread]) %highlight(%-5level) %magenta(%logger{36}) - %msg%n + + + + + + + \ No newline at end of file diff --git a/quickstarts/maven/micronaut4/src/test/java/org/eclipse/jkube/quickstart/micronaut/custom/SimpleClient.java b/quickstarts/maven/micronaut4/src/test/java/org/eclipse/jkube/quickstart/micronaut/custom/SimpleClient.java new file mode 100644 index 0000000000..454d2d4e92 --- /dev/null +++ b/quickstarts/maven/micronaut4/src/test/java/org/eclipse/jkube/quickstart/micronaut/custom/SimpleClient.java @@ -0,0 +1,31 @@ +/* + * 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.quickstart.micronaut.custom; + +import io.micronaut.http.annotation.Get; +import io.micronaut.http.client.annotation.Client; +import io.micronaut.core.async.annotation.SingleResult; +import org.reactivestreams.Publisher; + +@Client("/") +public interface SimpleClient { + + @Get + @SingleResult + Publisher get(); + + @Get(uri = "hello/{name}") + @SingleResult + Publisher hello(String name); +} diff --git a/quickstarts/maven/micronaut4/src/test/java/org/eclipse/jkube/quickstart/micronaut/custom/SimpleTest.java b/quickstarts/maven/micronaut4/src/test/java/org/eclipse/jkube/quickstart/micronaut/custom/SimpleTest.java new file mode 100644 index 0000000000..b9b51c59a3 --- /dev/null +++ b/quickstarts/maven/micronaut4/src/test/java/org/eclipse/jkube/quickstart/micronaut/custom/SimpleTest.java @@ -0,0 +1,42 @@ +/* + * 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.quickstart.micronaut.custom; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import io.micronaut.test.extensions.junit5.annotation.MicronautTest; +import org.junit.jupiter.api.Test; +import reactor.core.publisher.Mono; +import jakarta.inject.Inject; + +@MicronautTest +class SimpleTest { + + + @Inject + SimpleClient simpleClient; + + @Test + void testHello() { + assertEquals( + "Hello Fred!", + Mono.from(simpleClient.hello("Fred")).block()); + } + + @Test + void testGetRootPath() { + assertEquals( + "Hello from Micronaut deployed with JKube!", + Mono.from(simpleClient.get()).block()); + } +} From bfd84530e87dce442496ae0fe344ac72b9c3aa14 Mon Sep 17 00:00:00 2001 From: Mary Love Gurrieri <126700658+mgurrie@users.noreply.github.com> Date: Wed, 10 Apr 2024 06:56:38 -0400 Subject: [PATCH 013/289] fix: removed non-thrown declared Exception from method signature (#2866) --- .../eclipse/jkube/maven/plugin/mojo/develop/RemoteDevMojo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/RemoteDevMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/RemoteDevMojo.java index 430cff09c6..6921a08cc6 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/RemoteDevMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/RemoteDevMojo.java @@ -34,7 +34,7 @@ public class RemoteDevMojo extends AbstractJKubeMojo { protected RemoteDevelopmentConfig remoteDevelopment; @Override - public void executeInternal() throws MojoExecutionException, MojoFailureException { + public void executeInternal() { final RemoteDevelopmentService remoteDevelopmentService = new RemoteDevelopmentService(jkubeServiceHub.getLog(), jkubeServiceHub.getClient(), remoteDevelopment); Runtime.getRuntime().addShutdownHook(new Thread(() -> { From 88e901e64716f731079db7b85b799746856cb51a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Apr 2024 23:25:57 +0000 Subject: [PATCH 014/289] chore(deps): Bump org.apache.maven.plugins:maven-plugin-plugin Bumps [org.apache.maven.plugins:maven-plugin-plugin](https://github.com/apache/maven-plugin-tools) from 3.9.0 to 3.12.0. - [Release notes](https://github.com/apache/maven-plugin-tools/releases) - [Commits](https://github.com/apache/maven-plugin-tools/compare/maven-plugin-tools-3.9.0...maven-plugin-tools-3.12.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-plugin-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e99e5f23a3..ce179f19db 100644 --- a/pom.xml +++ b/pom.xml @@ -116,7 +116,7 @@ 3.6.0 3.3.0 3.5.0 - 3.9.0 + 3.12.0 3.0.1 3.3.1 3.3.0 From 8f3834d0342bac49b98fcb23fccc68308510193d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Apr 2024 23:30:42 +0000 Subject: [PATCH 015/289] chore(deps): Bump org.apache.maven.plugins:maven-gpg-plugin Bumps [org.apache.maven.plugins:maven-gpg-plugin](https://github.com/apache/maven-gpg-plugin) from 3.1.0 to 3.2.2. - [Release notes](https://github.com/apache/maven-gpg-plugin/releases) - [Commits](https://github.com/apache/maven-gpg-plugin/compare/maven-gpg-plugin-3.1.0...maven-gpg-plugin-3.2.2) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-gpg-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ce179f19db..2f56ca62ed 100644 --- a/pom.xml +++ b/pom.xml @@ -112,7 +112,7 @@ 3.11.0 3.4.0 3.1.2 - 3.1.0 + 3.2.2 3.6.0 3.3.0 3.5.0 From eb91ad59ed9ba86b27e8327949a9326ff7e34895 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Apr 2024 00:02:29 +0000 Subject: [PATCH 016/289] chore(deps): Bump version.asciidoctorj from 2.2.0 to 2.3.0 Bumps `version.asciidoctorj` from 2.2.0 to 2.3.0. Updates `org.asciidoctor:asciidoctorj` from 2.2.0 to 2.3.0 - [Release notes](https://github.com/asciidoctor/asciidoctorj/releases) - [Changelog](https://github.com/asciidoctor/asciidoctorj/blob/main/CHANGELOG.adoc) - [Commits](https://github.com/asciidoctor/asciidoctorj/compare/v2.2.0...v2.3.0) Updates `org.asciidoctor:asciidoctorj-diagram` from 2.2.0 to 2.3.0 - [Release notes](https://github.com/asciidoctor/asciidoctorj-diagram/releases) - [Commits](https://github.com/asciidoctor/asciidoctorj-diagram/commits) --- updated-dependencies: - dependency-name: org.asciidoctor:asciidoctorj dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: org.asciidoctor:asciidoctorj-diagram dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2f56ca62ed..e86ee3cf9d 100644 --- a/pom.xml +++ b/pom.xml @@ -91,7 +91,7 @@ UTF-8 false 2.2.4 - 2.2.0 + 2.3.0 3.24.2 3.4.0 1.26.1 From 8c5e12633ecf69cfdef5b51e27523a62d4695067 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Apr 2024 00:02:37 +0000 Subject: [PATCH 017/289] chore(deps): Bump org.codehaus.plexus:plexus-component-metadata Bumps [org.codehaus.plexus:plexus-component-metadata](https://github.com/codehaus-plexus/plexus-containers) from 2.1.1 to 2.2.0. - [Release notes](https://github.com/codehaus-plexus/plexus-containers/releases) - [Changelog](https://github.com/codehaus-plexus/plexus-containers/blob/master/ReleaseNotes.md) - [Commits](https://github.com/codehaus-plexus/plexus-containers/compare/plexus-containers-2.1.1...plexus-containers-2.2.0) --- updated-dependencies: - dependency-name: org.codehaus.plexus:plexus-component-metadata dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e86ee3cf9d..9ef2280b10 100644 --- a/pom.xml +++ b/pom.xml @@ -123,7 +123,7 @@ 3.1.2 4.6.1 1.6.13 - 2.1.1 + 2.2.0 1.7.36 3.9.1.2184 2.9.2 From 5931629ea51e061bd852cd75d8561a547bdf9711 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Thu, 11 Apr 2024 18:18:25 +0530 Subject: [PATCH 018/289] refactor (jkube-kit) : Move Dockerfile opinionated ImageConfig logic from `ConfigHelper.initImageConfiguration` to a dedicated generator (#2802) * refactor (jkube-kit) : Move Dockerfile opinionated ImageConfig logic from `ConfigHelper.initImageConfiguration` to a dedicated generator + ConfigHelper modifies the provided set of ImageConfigurations when it detects a `Dockerfile` in project root directory. This is actually a feature called Simple Dockerfile Mode. However, this mutation of ImageConfiguration from within `initImageConfiguration` does not look appropriate. It can be moved to a dedicated generator that will get activated when `Dockerfile` is present in project base directory. + Add a new generator SimpleDockerfileGenerator, it adds a simple ImageConfiguration with Dockerfile configured in build and adds it to existing set of ImageConfigurations. + Remove check from BaseGenerator to skip generation if it's simple Dockerfile mode Move it to SimpleDockerfileGenerator.isApplicable instead * review: IT for gradle and maven plugin precedence --- .../Dockerfile | 16 ++ .../build.gradle | 33 +++ .../Dockerfile | 16 ++ .../build.gradle | 33 +++ ...DockerfileSimpleExtensionPrecedenceIT.java | 59 +++++ .../plugin/tests/ITGradleRunnerExtension.java | 10 + gradle-plugin/kubernetes/pom.xml | 7 + .../META-INF/jkube/profiles-default.yml | 2 + .../plugin/TestKubernetesExtension.java | 3 +- .../plugin/task/KubernetesBuildTaskTest.java | 1 + .../META-INF/jkube/profiles-default.yml | 2 + .../kit/build/api/helper/ConfigHelper.java | 31 --- .../kit/build/api/helper/DockerFileUtil.java | 58 ----- .../build/api/helper/ConfigHelperTest.java | 93 +++----- .../build/api/helper/DockerFileUtilTest.java | 81 ------- .../common/util/BuildReferenceDateUtil.java | 6 +- .../jkube/kit/common/util/EnvUtil.java | 5 +- .../api/DefaultGeneratorManager.java | 20 +- .../generator/api/support/BaseGenerator.java | 12 +- .../api/support/BaseGeneratorTest.java | 17 -- jkube-kit/generator/dockerfile-simple/pom.xml | 46 ++++ .../simple/SimpleDockerfileGenerator.java | 57 +++++ .../simple/SimpleDockerfileUtil.java | 90 ++++++++ .../META-INF/jkube/generator-default | 5 + .../simple/SimpleDockerfileGeneratorTest.java | 214 ++++++++++++++++++ .../simple/SimpleDockerfileUtilTest.java | 151 ++++++++++++ .../test/resources}/Dockerfile_expose_ports | 0 .../resources/dummy-javaproject/Dockerfile | 0 jkube-kit/parent/pom.xml | 6 + jkube-kit/pom.xml | 1 + .../Dockerfile | 16 ++ .../invoker.properties | 17 ++ .../pom.xml | 54 +++++ .../maven/sample/spring/boot/Application.java | 26 +++ .../sample/spring/boot/HelloController.java | 27 +++ .../verify.groovy | 18 ++ kubernetes-maven-plugin/plugin/pom.xml | 5 + .../META-INF/jkube/profiles-default.yml | 2 + .../plugin/mojo/develop/WatchMojoTest.java | 1 + .../Dockerfile | 16 ++ .../invoker.properties | 17 ++ .../pom.xml | 54 +++++ .../maven/sample/spring/boot/Application.java | 26 +++ .../sample/spring/boot/HelloController.java | 27 +++ .../verify.groovy | 18 ++ .../META-INF/jkube/profiles-default.yml | 2 + 46 files changed, 1131 insertions(+), 270 deletions(-) create mode 100644 gradle-plugin/it/src/it/dockerfile-simple-generator-precedence-kubernetes/Dockerfile create mode 100644 gradle-plugin/it/src/it/dockerfile-simple-generator-precedence-kubernetes/build.gradle create mode 100644 gradle-plugin/it/src/it/dockerfile-simple-generator-precedence-openshift/Dockerfile create mode 100644 gradle-plugin/it/src/it/dockerfile-simple-generator-precedence-openshift/build.gradle create mode 100644 gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DockerfileSimpleExtensionPrecedenceIT.java create mode 100644 jkube-kit/generator/dockerfile-simple/pom.xml create mode 100644 jkube-kit/generator/dockerfile-simple/src/main/java/org/eclipse/jkube/generator/dockerfile/simple/SimpleDockerfileGenerator.java create mode 100644 jkube-kit/generator/dockerfile-simple/src/main/java/org/eclipse/jkube/generator/dockerfile/simple/SimpleDockerfileUtil.java create mode 100644 jkube-kit/generator/dockerfile-simple/src/main/resources/META-INF/jkube/generator-default create mode 100644 jkube-kit/generator/dockerfile-simple/src/test/java/org/eclipse/jkube/generator/dockerfile/simple/SimpleDockerfileGeneratorTest.java create mode 100644 jkube-kit/generator/dockerfile-simple/src/test/java/org/eclipse/jkube/generator/dockerfile/simple/SimpleDockerfileUtilTest.java rename jkube-kit/{build/api/src/test/resources/docker => generator/dockerfile-simple/src/test/resources}/Dockerfile_expose_ports (100%) rename jkube-kit/{build/api => generator/dockerfile-simple}/src/test/resources/dummy-javaproject/Dockerfile (100%) create mode 100644 kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/Dockerfile create mode 100644 kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/invoker.properties create mode 100644 kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/pom.xml create mode 100644 kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/src/main/java/io/fabric8/maven/sample/spring/boot/Application.java create mode 100644 kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/src/main/java/io/fabric8/maven/sample/spring/boot/HelloController.java create mode 100644 kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/verify.groovy create mode 100644 openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/Dockerfile create mode 100644 openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/invoker.properties create mode 100644 openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/pom.xml create mode 100644 openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/src/main/java/io/fabric8/maven/sample/spring/boot/Application.java create mode 100644 openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/src/main/java/io/fabric8/maven/sample/spring/boot/HelloController.java create mode 100644 openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/verify.groovy diff --git a/gradle-plugin/it/src/it/dockerfile-simple-generator-precedence-kubernetes/Dockerfile b/gradle-plugin/it/src/it/dockerfile-simple-generator-precedence-kubernetes/Dockerfile new file mode 100644 index 0000000000..cc3f5db285 --- /dev/null +++ b/gradle-plugin/it/src/it/dockerfile-simple-generator-precedence-kubernetes/Dockerfile @@ -0,0 +1,16 @@ +# +# 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 +# + +FROM busybox:latest +EXPOSE 9080 \ No newline at end of file diff --git a/gradle-plugin/it/src/it/dockerfile-simple-generator-precedence-kubernetes/build.gradle b/gradle-plugin/it/src/it/dockerfile-simple-generator-precedence-kubernetes/build.gradle new file mode 100644 index 0000000000..f7c967df5e --- /dev/null +++ b/gradle-plugin/it/src/it/dockerfile-simple-generator-precedence-kubernetes/build.gradle @@ -0,0 +1,33 @@ +/* + * 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 + */ +plugins { + id 'org.eclipse.jkube.kubernetes' version "${jKubeVersion}" + id 'org.springframework.boot' version '2.7.17' + id 'io.spring.dependency-management' version '1.0.15.RELEASE' + id 'java' +} + +group = 'org.eclipse.jkube.integration.tests.gradle' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = '11' + +repositories { + mavenCentral() +} + +def extensionConfig = { + offline = true +} + +kubernetes(extensionConfig) diff --git a/gradle-plugin/it/src/it/dockerfile-simple-generator-precedence-openshift/Dockerfile b/gradle-plugin/it/src/it/dockerfile-simple-generator-precedence-openshift/Dockerfile new file mode 100644 index 0000000000..cc3f5db285 --- /dev/null +++ b/gradle-plugin/it/src/it/dockerfile-simple-generator-precedence-openshift/Dockerfile @@ -0,0 +1,16 @@ +# +# 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 +# + +FROM busybox:latest +EXPOSE 9080 \ No newline at end of file diff --git a/gradle-plugin/it/src/it/dockerfile-simple-generator-precedence-openshift/build.gradle b/gradle-plugin/it/src/it/dockerfile-simple-generator-precedence-openshift/build.gradle new file mode 100644 index 0000000000..4ffbcf0cbf --- /dev/null +++ b/gradle-plugin/it/src/it/dockerfile-simple-generator-precedence-openshift/build.gradle @@ -0,0 +1,33 @@ +/* + * 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 + */ +plugins { + id 'org.eclipse.jkube.openshift' version "${jKubeVersion}" + id 'org.springframework.boot' version '2.7.17' + id 'io.spring.dependency-management' version '1.0.15.RELEASE' + id 'java' +} + +group = 'org.eclipse.jkube.integration.tests.gradle' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = '11' + +repositories { + mavenCentral() +} + +def extensionConfig = { + offline = true +} + +openshift(extensionConfig) diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DockerfileSimpleExtensionPrecedenceIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DockerfileSimpleExtensionPrecedenceIT.java new file mode 100644 index 0000000000..b8b7661295 --- /dev/null +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/DockerfileSimpleExtensionPrecedenceIT.java @@ -0,0 +1,59 @@ +/* + * 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.gradle.plugin.tests; + +import org.gradle.testkit.runner.BuildResult; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import java.io.File; +import java.util.stream.Collectors; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class DockerfileSimpleExtensionPrecedenceIT { + + + @RegisterExtension + private final ITGradleRunnerExtension gradleRunner = new ITGradleRunnerExtension(); + + @Test + void k8sResource_whenRun_generatesK8sManifests() { + // Remove kubernetes-gradle-plugin from classpath to avoid using its profiles-default.yml + gradleRunner.withPluginClassPath(gradleRunner.pluginClassPath().stream() + .filter(f -> !f.getAbsolutePath().contains("gradle-plugin" + File.separator + "openshift")) + .collect(Collectors.toList()) + ); + // When + final BuildResult result = gradleRunner + .withITProject("dockerfile-simple-generator-precedence-kubernetes") + .withArguments("k8sResource", "--stacktrace") + .build(); + // Then + assertThat(result).extracting(BuildResult::getOutput).asString() + .contains("Running generator dockerfile-simple"); + } + + @Test + void ocResource_whenRun_generatesOpenShiftManifests() { + // When + final BuildResult result = gradleRunner + .withITProject("dockerfile-simple-generator-precedence-openshift") + .withArguments("ocResource") + .build(); + // Then + assertThat(result).extracting(BuildResult::getOutput).asString() + .contains("Running generator dockerfile-simple"); + } +} diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ITGradleRunnerExtension.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ITGradleRunnerExtension.java index 38e37d8499..37a7d4bb1b 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ITGradleRunnerExtension.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ITGradleRunnerExtension.java @@ -23,6 +23,7 @@ import java.net.URI; import java.nio.file.Path; import java.util.Arrays; +import java.util.List; import java.util.stream.Collectors; public class ITGradleRunnerExtension implements BeforeEachCallback, AfterEachCallback { @@ -58,6 +59,15 @@ public ITGradleRunnerExtension withArguments(String... originalArguments) { return this; } + public List pluginClassPath() { + return gradleRunner.getPluginClasspath(); + } + + public ITGradleRunnerExtension withPluginClassPath(Iterable pluginClassPath) { + gradleRunner = gradleRunner.withPluginClasspath(pluginClassPath); + return this; + } + public File resolveFile(String... relativePaths) { Path path = gradleRunner.getProjectDir().toPath(); for (String rp : relativePaths) { diff --git a/gradle-plugin/kubernetes/pom.xml b/gradle-plugin/kubernetes/pom.xml index 0ea24f1d38..022a011145 100644 --- a/gradle-plugin/kubernetes/pom.xml +++ b/gradle-plugin/kubernetes/pom.xml @@ -72,6 +72,13 @@ jkube-kit-generator-java-exec ${jkube.kit.version} + + + org.eclipse.jkube + jkube-kit-generator-dockerfile-simple + ${jkube.kit.version} + + org.eclipse.jkube jkube-kit-generator-karaf diff --git a/gradle-plugin/kubernetes/src/main/resources/META-INF/jkube/profiles-default.yml b/gradle-plugin/kubernetes/src/main/resources/META-INF/jkube/profiles-default.yml index 092aa586f2..b9fe92ba3f 100644 --- a/gradle-plugin/kubernetes/src/main/resources/META-INF/jkube/profiles-default.yml +++ b/gradle-plugin/kubernetes/src/main/resources/META-INF/jkube/profiles-default.yml @@ -86,6 +86,7 @@ generator: # The order given in "includes" is the order in which generators are called includes: + - dockerfile-simple - quarkus - spring-boot - thorntail-v2 @@ -118,6 +119,7 @@ generator: # The order given in "includes" is the order in which generators are called includes: + - dockerfile-simple - spring-boot - thorntail-v2 - wildfly-jar diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/TestKubernetesExtension.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/TestKubernetesExtension.java index 5e562cf084..3560eb9dae 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/TestKubernetesExtension.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/TestKubernetesExtension.java @@ -33,6 +33,7 @@ public class TestKubernetesExtension extends KubernetesExtension { public String buildRecreate; public Boolean isForcePull; public Boolean isFailOnNoKubernetesJson; + public Boolean isSkipPush; public TestKubernetesExtension() { javaProject = mock(JavaProject.class, RETURNS_DEEP_STUBS); @@ -300,7 +301,7 @@ public Property getServiceUrlWaitTimeSeconds() { @Override public Property getSkipPush() { - return property(Boolean.class); + return property(Boolean.class).value(isSkipPush); } @Override diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesBuildTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesBuildTaskTest.java index 4693f3c7b0..751c4aca46 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesBuildTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesBuildTaskTest.java @@ -137,4 +137,5 @@ public Property getSkipBuild() { assertThat(dockerBuildServiceMockedConstruction.constructed()).isEmpty(); verify(buildTask.jKubeServiceHub.getBuildService(), times(0)).build(any()); } + } diff --git a/gradle-plugin/openshift/src/main/resources/META-INF/jkube/profiles-default.yml b/gradle-plugin/openshift/src/main/resources/META-INF/jkube/profiles-default.yml index e0744ef0ba..9273956573 100644 --- a/gradle-plugin/openshift/src/main/resources/META-INF/jkube/profiles-default.yml +++ b/gradle-plugin/openshift/src/main/resources/META-INF/jkube/profiles-default.yml @@ -87,6 +87,7 @@ generator: # The order given in "includes" is the order in which generators are called includes: + - dockerfile-simple - quarkus - spring-boot - thorntail-v2 @@ -119,6 +120,7 @@ generator: # The order given in "includes" is the order in which generators are called includes: + - dockerfile-simple - spring-boot - thorntail-v2 - wildfly-jar diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelper.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelper.java index 35bb48dce5..af052a6e18 100644 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelper.java +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelper.java @@ -23,7 +23,6 @@ import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.JKubeProjectUtil; -import java.io.File; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; @@ -33,12 +32,6 @@ import java.util.Set; import java.util.stream.Collectors; -import static org.eclipse.jkube.kit.build.api.helper.DockerFileUtil.addSimpleDockerfileConfig; -import static org.eclipse.jkube.kit.build.api.helper.DockerFileUtil.createSimpleDockerfileConfig; -import static org.eclipse.jkube.kit.build.api.helper.DockerFileUtil.getTopLevelDockerfile; -import static org.eclipse.jkube.kit.build.api.helper.DockerFileUtil.isSimpleDockerFileMode; -import static org.eclipse.jkube.kit.common.util.PropertiesUtil.getValueFromProperties; - /** * Utility class which helps in resolving, customizing, initializing and validating * image configuration. @@ -174,16 +167,6 @@ public static List initImageConfiguration(Date buildTimeStam filter, // A filter which image to process generatorManager); // GeneratorManager which will invoke generator - // Check for simple Dockerfile mode - ImageConfiguration dockerFileImageConfig = createImageConfigurationForSimpleDockerfile(resolvedImages, jKubeConfiguration, imageNameFormatter); - if (dockerFileImageConfig != null) { - if (resolvedImages.isEmpty()) { - resolvedImages.add(dockerFileImageConfig); - } else { - resolvedImages.set(0, dockerFileImageConfig); - } - } - // Init and validate Image configurations. After this step, getResolvedImages() contains the valid configuration. for (ImageConfiguration imageConfiguration : resolvedImages) { imageConfiguration.setName(imageNameFormatter.format(imageConfiguration.getName())); @@ -196,20 +179,6 @@ public static List initImageConfiguration(Date buildTimeStam return resolvedImages; } - private static ImageConfiguration createImageConfigurationForSimpleDockerfile(List resolvedImages, JKubeConfiguration jKubeConfiguration, ImageNameFormatter imageNameFormatter) { - if (isSimpleDockerFileMode(jKubeConfiguration.getBasedir())) { - File topDockerfile = getTopLevelDockerfile(jKubeConfiguration.getBasedir()); - String defaultImageName = imageNameFormatter.format(getValueFromProperties(jKubeConfiguration.getProject().getProperties(), - "jkube.image.name", "jkube.generator.name")); - if (resolvedImages.isEmpty()) { - return createSimpleDockerfileConfig(topDockerfile, defaultImageName); - } else if (resolvedImages.size() == 1 && resolvedImages.get(0).getBuildConfiguration() == null) { - return addSimpleDockerfileConfig(resolvedImages.get(0), topDockerfile); - } - } - return null; - } - // ========================================================================= private static void printDockerfileInfoIfDockerfileMode(ImageConfiguration imageConfiguration, KitLogger log, JKubeConfiguration jKubeConfiguration) { diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/DockerFileUtil.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/DockerFileUtil.java index ef73c086bc..8e03cf7cdc 100644 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/DockerFileUtil.java +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/DockerFileUtil.java @@ -18,14 +18,12 @@ import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Properties; import java.util.Set; import java.util.regex.Matcher; @@ -34,7 +32,6 @@ import com.fasterxml.jackson.core.type.TypeReference; import org.eclipse.jkube.kit.common.JKubeFileInterpolator; import org.eclipse.jkube.kit.common.util.Serialization; -import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.apache.commons.lang3.StringUtils; @@ -192,42 +189,6 @@ public static Map readDockerConfig() { } } - public static boolean isSimpleDockerFileMode(File projectBaseDirectory) { - if (projectBaseDirectory != null) { - return getTopLevelDockerfile(projectBaseDirectory).exists(); - } - return false; - } - - public static File getTopLevelDockerfile(File projectBaseDirectory) { - return new File(projectBaseDirectory, "Dockerfile"); - } - - public static ImageConfiguration createSimpleDockerfileConfig(File dockerFile, String defaultImageName) { - if (defaultImageName == null) { - // Default name group/artifact:version (or 'latest' if SNAPSHOT) - defaultImageName = "%g/%a:%l"; - } - - final BuildConfiguration buildConfig = BuildConfiguration.builder() - .dockerFile(dockerFile.getPath()) - .ports(extractPorts(dockerFile)) - .build(); - - return ImageConfiguration.builder() - .name(defaultImageName) - .build(buildConfig) - .build(); - } - - public static ImageConfiguration addSimpleDockerfileConfig(ImageConfiguration image, File dockerfile) { - final BuildConfiguration buildConfig = BuildConfiguration.builder() - .dockerFile(dockerfile.getPath()) - .ports(extractPorts(dockerfile)) - .build(); - return image.toBuilder().build(buildConfig).build(); - } - private static void updateMapWithArgValue(Map result, Map args, String argString) { if (argString.contains("=") || argString.contains(":")) { String[] argStringParts = argString.split("[=:]"); @@ -269,25 +230,6 @@ private static void validateArgValue(String argStringParam) { } } - static List extractPorts(File dockerFile) { - Properties properties = new Properties(); - try { - return extractPorts(extractLines(dockerFile, "EXPOSE", properties, null)); - } catch (IOException ioException) { - throw new IllegalArgumentException("Error in reading Dockerfile", ioException); - } - } - - static List extractPorts(List dockerLinesContainingExpose) { - Set ports = new HashSet<>(); - dockerLinesContainingExpose.forEach(line -> Arrays.stream(line) - .skip(1) - .filter(Objects::nonNull) - .filter(StringUtils::isNotBlank) - .forEach(ports::add)); - return new ArrayList<>(ports); - } - static String resolveDockerfileFilter(String filter) { return filter != null ? filter : BuildConfiguration.DEFAULT_FILTER; } diff --git a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelperTest.java b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelperTest.java index ce236af37f..33ee6b1529 100644 --- a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelperTest.java +++ b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelperTest.java @@ -13,35 +13,36 @@ */ package org.eclipse.jkube.kit.build.api.helper; +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.List; +import java.util.Properties; + import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.config.image.GeneratorManager; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.List; -import java.util.Objects; -import java.util.Properties; +import org.junit.jupiter.api.io.TempDir; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.mockito.Mockito.eq; class ConfigHelperTest { private KitLogger logger; @@ -85,56 +86,6 @@ void initImageConfiguration_withSimpleImageConfiguration_shouldReturnImageConfig .isEqualTo(dummyImageConfiguration); } - @Test - void initImageConfiguration_withSimpleDockerFileInProjectBaseDir_shouldCreateImageConfiguration() { - List images = new ArrayList<>(); - File dockerFile = new File(Objects.requireNonNull(getClass().getResource("/dummy-javaproject/Dockerfile")).getFile()); - jKubeConfiguration = jKubeConfiguration.toBuilder() - .project(javaProject.toBuilder() - .baseDirectory(dockerFile.getParentFile()) - .build()) - .build(); - - // When - List resolvedImages = ConfigHelper.initImageConfiguration(new Date(), images, imageConfigResolver, logger, null, generatorManager, jKubeConfiguration); - - // Then - assertThat(resolvedImages).isNotNull() - .singleElement() - .hasFieldOrPropertyWithValue("name", "jkube/test-java-project:latest") - .hasFieldOrPropertyWithValue("build.dockerFile", dockerFile) - .hasFieldOrPropertyWithValue("build.ports", Collections.singletonList("8080")); - } - - @Test - void initImageConfiguration_withSimpleDockerFileModeEnabledAndImageConfigurationWithNoBuild_shouldModifyExistingImageConfiguration() { - ImageConfiguration dummyImageConfiguration = ImageConfiguration.builder() - .name("imageconfiguration-no-build:latest") - .build(); - List images = new ArrayList<>(); - images.add(dummyImageConfiguration); - File dockerFile = new File(getClass().getResource("/dummy-javaproject/Dockerfile").getFile()); - jKubeConfiguration = jKubeConfiguration.toBuilder() - .project(javaProject.toBuilder() - .baseDirectory(dockerFile.getParentFile()) - .build()) - .build(); - when(imageConfigResolver.resolve(dummyImageConfiguration, jKubeConfiguration.getProject())).thenReturn(images); - when(generatorManager.generate(images)).thenReturn(images); - - // When - List resolvedImages = ConfigHelper.initImageConfiguration(new Date(), images, imageConfigResolver, logger, null, generatorManager, jKubeConfiguration); - - // Then - assertThat(resolvedImages).isNotNull() - .singleElement() - .hasFieldOrPropertyWithValue("name", "imageconfiguration-no-build:latest") - .hasFieldOrPropertyWithValue("build.dockerFile", dockerFile) - .hasFieldOrPropertyWithValue("build.ports", Collections.singletonList("8080")); - verify(logger).info(eq("Using Dockerfile: %s"), anyString()); - verify(logger).info(eq("Using Docker Context Directory: %s"), any(File.class)); - } - @Test void initImageConfiguration_whenImageConfigurationNameBlank_thenThrowException() { // Given @@ -163,6 +114,28 @@ void initImageConfiguration_whenNoMatchForImageFilter_thenLogWarning() { verify(logger).warn("None of the resolved images [%s] match the configured filter '%s'", "foo/bar:latest", "i-dont-exist"); } + @Test + void initImageConfiguration_whenDockerfileUsed_thenLogDockerfilePathAndContextDir(@TempDir File temporaryFolder) { + File dockerFile = temporaryFolder.toPath().resolve("Dockerfile").toFile(); + ImageConfiguration dummyImageConfiguration = ImageConfiguration.builder() + .name("imageconfiguration-no-build:latest") + .build(BuildConfiguration.builder() + .dockerFile(dockerFile.getAbsolutePath()) + .build()) + .build(); + List images = new ArrayList<>(); + images.add(dummyImageConfiguration); + when(imageConfigResolver.resolve(dummyImageConfiguration, jKubeConfiguration.getProject())).thenReturn(images); + when(generatorManager.generate(images)).thenReturn(images); + + // When + ConfigHelper.initImageConfiguration(new Date(), images, imageConfigResolver, logger, null, generatorManager, jKubeConfiguration); + + // Then + verify(logger).info(eq("Using Dockerfile: %s"), anyString()); + verify(logger).info(eq("Using Docker Context Directory: %s"), any(File.class)); + } + @Test void validateExternalPropertyActivation_withMultipleImagesWithoutExplicitExternalConfig_shouldThrowException() { // Given diff --git a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/DockerFileUtilTest.java b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/DockerFileUtilTest.java index fa1f5716c4..ff641a8c58 100644 --- a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/DockerFileUtilTest.java +++ b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/DockerFileUtilTest.java @@ -15,7 +15,6 @@ import org.apache.commons.io.FileUtils; import org.eclipse.jkube.kit.common.util.EnvUtil; -import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -25,7 +24,6 @@ import org.junit.jupiter.params.provider.MethodSource; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.StandardCharsets; @@ -128,43 +126,6 @@ void interpolate_withNullFilter_shouldPickDefaultFilter() throws IOException { "ENTRYPOINT [\"java\", \"-jar\", \"target/docker-file-simple.jar\"]"); } - @Test - void createSimpleDockerfileConfig() throws IOException { - // Given - File dockerFile = Files.createTempFile("Dockerfile", "-test").toFile(); - // When - ImageConfiguration imageConfiguration1 = DockerFileUtil.createSimpleDockerfileConfig(dockerFile, null); - ImageConfiguration imageConfiguration2 = DockerFileUtil.createSimpleDockerfileConfig(dockerFile, "someImage:0.0.1"); - // Then - assertThat(imageConfiguration1).isNotNull() - .hasFieldOrPropertyWithValue("name", "%g/%a:%l") - .extracting(ImageConfiguration::getBuild) - .extracting(BuildConfiguration::getDockerFileRaw) - .isEqualTo(dockerFile.getPath()); - assertThat(imageConfiguration2).isNotNull() - .hasFieldOrPropertyWithValue("name", "someImage:0.0.1") - .extracting(ImageConfiguration::getBuild) - .extracting(BuildConfiguration::getDockerFileRaw) - .isEqualTo(dockerFile.getPath()); - } - - @Test - void addSimpleDockerfileConfig() throws IOException { - // Given - ImageConfiguration imageConfiguration = ImageConfiguration.builder() - .name("test-image") - .build(); - File dockerFile = Files.createTempFile("Dockerfile", "-test").toFile(); - - // When - ImageConfiguration result = DockerFileUtil.addSimpleDockerfileConfig(imageConfiguration, dockerFile); - - // Then - assertThat(result.getBuild()).isNotNull() - .extracting(BuildConfiguration::getDockerFileRaw) - .isEqualTo(dockerFile.getPath()); - } - @Test void customInterpolation() throws IOException { // Given @@ -330,48 +291,6 @@ void readDockerConfig_fromMissing() { } - @Test - void createSimpleDockerfileConfig_withPorts() { - // Given - File dockerFile = new File(getClass().getResource("/docker/Dockerfile_expose_ports").getFile()); - // When - ImageConfiguration imageConfiguration1 = DockerFileUtil.createSimpleDockerfileConfig(dockerFile, null); - // Then - assertThat(imageConfiguration1.getBuild().getDockerFileRaw()).isEqualTo(dockerFile.getPath()); - assertThat(imageConfiguration1).isNotNull() - .hasFieldOrPropertyWithValue("name", "%g/%a:%l") - .extracting(ImageConfiguration::getBuild) - .extracting(BuildConfiguration::getPorts).isNotNull() - .asList() - .hasSize(5) - .containsExactly("80/tcp", "8080/udp", "80", "8080", "99/udp"); - } - - @Test - void extractPorts_fromInvalidDockerFile_shouldThrowException() { - assertThatIllegalArgumentException() - .isThrownBy(() -> DockerFileUtil.extractPorts(new File("iDoNotExist"))) - .withMessage("Error in reading Dockerfile"); - } - - @Test - void extractPorts_fromDockerFileLines() { - // Given - List input1 = Arrays.asList(new String[]{"EXPOSE", "8080", "9090", "9999"} , new String[]{"EXPOSE", "9010"}); - List input2 = Arrays.asList(new String[]{"EXPOSE", "9001"}, new String[]{"EXPOSE", null}); - List input3 = Arrays.asList(new String[]{"EXPOSE", ""}, new String[]{"EXPOSE", "8001"}); - - // When - List result1 = DockerFileUtil.extractPorts(input1); - List result2 = DockerFileUtil.extractPorts(input2); - List result3 = DockerFileUtil.extractPorts(input3); - - // Then - assertThat(result1).containsExactly("9090", "8080", "9999", "9010"); - assertThat(result2).containsExactly("9001"); - assertThat(result3).containsExactly("8001"); - } - @Test void resolveDockerfileFilter() { assertThat(DockerFileUtil.resolveDockerfileFilter(null)).isEqualTo(BuildConfiguration.DEFAULT_FILTER); diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/BuildReferenceDateUtil.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/BuildReferenceDateUtil.java index a1ca423043..9f73894ed4 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/BuildReferenceDateUtil.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/BuildReferenceDateUtil.java @@ -14,7 +14,6 @@ package org.eclipse.jkube.kit.common.util; import java.io.File; -import java.io.IOException; import java.util.Date; import java.util.Map; import java.util.Optional; @@ -22,7 +21,7 @@ public class BuildReferenceDateUtil { private BuildReferenceDateUtil() { } - static Date getBuildReferenceDate(String buildDirectory, String dockerBuildTimestampFile) throws IOException { + static Date getBuildReferenceDate(String buildDirectory, String dockerBuildTimestampFile) { return Optional.ofNullable(EnvUtil.loadTimestamp(getBuildTimestampFile(buildDirectory, dockerBuildTimestampFile))) .orElse(new Date()); } @@ -40,10 +39,9 @@ public static File getBuildTimestampFile(String projectBuildDirectory, String do * @param projectBuildDir project's build directory * @param dockerBuildTimestampFile docker build timestamp file * @return timestamp to use - * @throws IOException If failure in reading build timestamp file */ public static Date getBuildTimestamp(Map pluginContext, String buildTimestampContextKey, - String projectBuildDir, String dockerBuildTimestampFile) throws IOException { + String projectBuildDir, String dockerBuildTimestampFile) { Date now = (Date) (pluginContext != null ? pluginContext.get(buildTimestampContextKey) : null); if (now == null) { now = getBuildReferenceDate(projectBuildDir, dockerBuildTimestampFile); diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/EnvUtil.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/EnvUtil.java index faa0762444..235beaa4f4 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/EnvUtil.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/EnvUtil.java @@ -14,6 +14,7 @@ package org.eclipse.jkube.kit.common.util; import org.apache.commons.lang3.StringUtils; +import org.eclipse.jkube.kit.common.JKubeException; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -446,7 +447,7 @@ public static void storeTimestamp(File tsFile, Date buildDate) throws IOExceptio } } - public static Date loadTimestamp(File tsFile) throws IOException { + public static Date loadTimestamp(File tsFile) { try { if (tsFile.exists()) { final String ts = new String(Files.readAllBytes(tsFile.toPath()), StandardCharsets.US_ASCII); @@ -455,7 +456,7 @@ public static Date loadTimestamp(File tsFile) throws IOException { return null; } } catch (IOException e) { - throw new IOException("Cannot read timestamp " + tsFile, e); + throw JKubeException.launderThrowable("Cannot read timestamp " + tsFile, e); } } diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java index e62d1abcbc..b52862bbd7 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java @@ -40,17 +40,9 @@ public DefaultGeneratorManager(GeneratorContext context) { @Override public List generate(List imageConfigs) { - - final PluginServiceFactory pluginFactory = new PluginServiceFactory<>(genCtx); - if (genCtx.isUseProjectClasspath()) { - pluginFactory.addAdditionalClassLoader( - ClassUtil.createProjectClassLoader(genCtx.getProject().getCompileClassPathElements(), genCtx.getLogger())); - } - List ret = imageConfigs; final KitLogger log = genCtx.getLogger(); - final List generators = pluginFactory.createServiceObjects(SERVICE_PATHS); - final List usableGenerators = genCtx.getConfig().prepareProcessors(generators, "generator"); + List usableGenerators = createUsableGeneratorList(); log.verbose("Generators:"); for (Generator generator : usableGenerators) { log.verbose(" - %s", generator.getName()); @@ -61,4 +53,14 @@ public List generate(List imageConfigs) } return ret; } + + private List createUsableGeneratorList() { + final PluginServiceFactory pluginFactory = new PluginServiceFactory<>(genCtx); + if (genCtx.isUseProjectClasspath()) { + pluginFactory.addAdditionalClassLoader( + ClassUtil.createProjectClassLoader(genCtx.getProject().getCompileClassPathElements(), genCtx.getLogger())); + } + final List generators = pluginFactory.createServiceObjects(SERVICE_PATHS); + return genCtx.getConfig().prepareProcessors(generators, "generator"); + } } diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java index 3659ae5f56..8658888a49 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java @@ -26,7 +26,6 @@ import org.eclipse.jkube.generator.api.Generator; import org.eclipse.jkube.generator.api.GeneratorConfig; import org.eclipse.jkube.generator.api.GeneratorContext; -import org.eclipse.jkube.kit.build.api.helper.DockerFileUtil; import org.eclipse.jkube.kit.common.Configs; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.PrefixedLogger; @@ -49,6 +48,9 @@ */ public abstract class BaseGenerator implements Generator { + public static final String PROPERTY_JKUBE_IMAGE_NAME = "jkube.image.name"; + public static final String PROPERTY_JKUBE_GENERATOR_NAME = "jkube.generator.name"; + private static final String LABEL_SCHEMA_VERSION = "1.0"; private static final String GIT_REMOTE = "origin"; @@ -186,9 +188,9 @@ protected void addFrom(BuildConfiguration.BuildConfigurationBuilder builder) { */ protected String getImageName() { if (getContext().getRuntimeMode() == RuntimeMode.OPENSHIFT) { - return getConfigWithFallback(Config.NAME, "jkube.generator.name", "%a:%l"); + return getConfigWithFallback(Config.NAME, PROPERTY_JKUBE_GENERATOR_NAME, "%a:%l"); } else { - return getConfigWithFallback(Config.NAME, "jkube.generator.name", "%g/%a:%l"); + return getConfigWithFallback(Config.NAME, PROPERTY_JKUBE_GENERATOR_NAME, "%g/%a:%l"); } } @@ -215,10 +217,6 @@ protected String getAlias() { } protected boolean shouldAddGeneratedImageConfiguration(List configs) { - if (getProject() != null && getProject().getBaseDirectory() != null && getProject().getBaseDirectory().exists() - && DockerFileUtil.isSimpleDockerFileMode(getContext().getProject().getBaseDirectory())) { - return false; - } if (containsBuildConfiguration(configs)) { return Boolean.parseBoolean(getConfigWithFallback(Config.ADD, "jkube.generator.add", "false")); } diff --git a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java index 412dc52430..fa2a410e46 100644 --- a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java +++ b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java @@ -327,23 +327,6 @@ void shouldAddDefaultImage() { .returns(false, g -> g.shouldAddGeneratedImageConfiguration(Collections.singletonList(ic1))); } - @Test - @DisplayName("should not add default image in case of simple dockerfile") - void shouldNotAddDefaultImageInCaseOfSimpleDockerfile(@TempDir Path folder) throws IOException { - // Given - File projectBaseDir = Files.createDirectory(folder.resolve("test-project-dir")).toFile(); - File dockerFile = new File(projectBaseDir, "Dockerfile"); - boolean isTestDockerfileCreated = dockerFile.createNewFile(); - when(ctx.getProject()).thenReturn(project); - when(project.getBaseDirectory()).thenReturn(projectBaseDir); - // When - BaseGenerator generator = createGenerator(null); - - // Then - assertThat(isTestDockerfileCreated).isTrue(); - assertThat(generator.shouldAddGeneratedImageConfiguration(Collections.emptyList())).isFalse(); - } - @Test @DisplayName("should add generated image configuration when add enabled via config, should return true") void shouldAddGeneratedImageConfiguration_whenAddEnabledViaConfig_shouldReturnTrue() { diff --git a/jkube-kit/generator/dockerfile-simple/pom.xml b/jkube-kit/generator/dockerfile-simple/pom.xml new file mode 100644 index 0000000000..8b267a2249 --- /dev/null +++ b/jkube-kit/generator/dockerfile-simple/pom.xml @@ -0,0 +1,46 @@ + + + + 4.0.0 + + + org.eclipse.jkube + jkube-kit-parent + 1.17-SNAPSHOT + ../../parent/pom.xml + + + jkube-kit-generator-dockerfile-simple + + JKube Kit :: Generator :: Dockerfile Simple + + + + org.eclipse.jkube + jkube-kit-generator-api + + + + org.junit.jupiter + junit-jupiter-engine + + + org.assertj + assertj-core + + + diff --git a/jkube-kit/generator/dockerfile-simple/src/main/java/org/eclipse/jkube/generator/dockerfile/simple/SimpleDockerfileGenerator.java b/jkube-kit/generator/dockerfile-simple/src/main/java/org/eclipse/jkube/generator/dockerfile/simple/SimpleDockerfileGenerator.java new file mode 100644 index 0000000000..eac1616af9 --- /dev/null +++ b/jkube-kit/generator/dockerfile-simple/src/main/java/org/eclipse/jkube/generator/dockerfile/simple/SimpleDockerfileGenerator.java @@ -0,0 +1,57 @@ +/* + * 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.generator.dockerfile.simple; + +import org.eclipse.jkube.generator.api.GeneratorContext; +import org.eclipse.jkube.generator.api.support.BaseGenerator; +import org.eclipse.jkube.kit.build.api.helper.ImageNameFormatter; +import org.eclipse.jkube.kit.config.image.ImageConfiguration; + +import java.io.File; +import java.util.List; + +import static org.eclipse.jkube.generator.dockerfile.simple.SimpleDockerfileUtil.addSimpleDockerfileConfig; +import static org.eclipse.jkube.generator.dockerfile.simple.SimpleDockerfileUtil.createSimpleDockerfileConfig; +import static org.eclipse.jkube.generator.dockerfile.simple.SimpleDockerfileUtil.getTopLevelDockerfile; +import static org.eclipse.jkube.generator.dockerfile.simple.SimpleDockerfileUtil.isSimpleDockerFileMode; +import static org.eclipse.jkube.kit.common.util.BuildReferenceDateUtil.getBuildTimestamp; +import static org.eclipse.jkube.kit.common.util.PropertiesUtil.getValueFromProperties; + +public class SimpleDockerfileGenerator extends BaseGenerator { + public SimpleDockerfileGenerator(GeneratorContext context) { + super(context, "dockerfile-simple"); + } + + @Override + public boolean isApplicable(List configs) { + return shouldAddGeneratedImageConfiguration(configs) && + isSimpleDockerFileMode(getContext().getProject().getBaseDirectory()); + } + + @Override + public List customize(List configs, boolean prePackagePhase) { + ImageNameFormatter imageNameFormatter = new ImageNameFormatter(getContext().getProject(), + getBuildTimestamp(null, null, getContext().getProject().getBuildDirectory().getAbsolutePath(), + "docker/build.timestamp")); + File topDockerfile = getTopLevelDockerfile(getContext().getProject().getBaseDirectory()); + String defaultImageName = imageNameFormatter.format(getValueFromProperties(getContext().getProject().getProperties(), + PROPERTY_JKUBE_IMAGE_NAME, PROPERTY_JKUBE_GENERATOR_NAME)); + if (configs.isEmpty()) { + configs.add(createSimpleDockerfileConfig(topDockerfile, defaultImageName)); + } else if (configs.size() == 1 && configs.get(0).getBuildConfiguration() == null) { + configs.set(0, addSimpleDockerfileConfig(configs.get(0), topDockerfile)); + } + return configs; + } +} diff --git a/jkube-kit/generator/dockerfile-simple/src/main/java/org/eclipse/jkube/generator/dockerfile/simple/SimpleDockerfileUtil.java b/jkube-kit/generator/dockerfile-simple/src/main/java/org/eclipse/jkube/generator/dockerfile/simple/SimpleDockerfileUtil.java new file mode 100644 index 0000000000..a7297d07eb --- /dev/null +++ b/jkube-kit/generator/dockerfile-simple/src/main/java/org/eclipse/jkube/generator/dockerfile/simple/SimpleDockerfileUtil.java @@ -0,0 +1,90 @@ +/* + * 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.generator.dockerfile.simple; + +import org.apache.commons.lang3.StringUtils; +import org.eclipse.jkube.kit.config.image.ImageConfiguration; +import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Properties; +import java.util.Set; + +import static org.eclipse.jkube.kit.build.api.helper.DockerFileUtil.extractLines; + +public class SimpleDockerfileUtil { + private SimpleDockerfileUtil() { + } + + public static boolean isSimpleDockerFileMode(File projectBaseDirectory) { + if (projectBaseDirectory != null) { + return getTopLevelDockerfile(projectBaseDirectory).exists(); + } + return false; + } + + public static File getTopLevelDockerfile(File projectBaseDirectory) { + return new File(projectBaseDirectory, "Dockerfile"); + } + + public static ImageConfiguration createSimpleDockerfileConfig(File dockerFile, String defaultImageName) { + if (defaultImageName == null) { + // Default name group/artifact:version (or 'latest' if SNAPSHOT) + defaultImageName = "%g/%a:%l"; + } + + final BuildConfiguration buildConfig = BuildConfiguration.builder() + .dockerFile(dockerFile.getPath()) + .ports(extractPorts(dockerFile)) + .build(); + + return ImageConfiguration.builder() + .name(defaultImageName) + .build(buildConfig) + .build(); + } + + public static ImageConfiguration addSimpleDockerfileConfig(ImageConfiguration image, File dockerfile) { + final BuildConfiguration buildConfig = BuildConfiguration.builder() + .dockerFile(dockerfile.getPath()) + .ports(extractPorts(dockerfile)) + .build(); + return image.toBuilder().build(buildConfig).build(); + } + + static List extractPorts(File dockerFile) { + Properties properties = new Properties(); + try { + return extractPorts(extractLines(dockerFile, "EXPOSE", properties, null)); + } catch (IOException ioException) { + throw new IllegalArgumentException("Error in reading Dockerfile", ioException); + } + } + + static List extractPorts(List dockerLinesContainingExpose) { + Set ports = new HashSet<>(); + dockerLinesContainingExpose.forEach(line -> Arrays.stream(line) + .skip(1) + .filter(Objects::nonNull) + .filter(StringUtils::isNotBlank) + .forEach(ports::add)); + return new ArrayList<>(ports); + } +} diff --git a/jkube-kit/generator/dockerfile-simple/src/main/resources/META-INF/jkube/generator-default b/jkube-kit/generator/dockerfile-simple/src/main/resources/META-INF/jkube/generator-default new file mode 100644 index 0000000000..82c49bb62c --- /dev/null +++ b/jkube-kit/generator/dockerfile-simple/src/main/resources/META-INF/jkube/generator-default @@ -0,0 +1,5 @@ +# The order of the generators used is defined in the active profile +# (which is the profile "default" by default) +# You can find the default profiles in "profiles-default.yml" + +org.eclipse.jkube.generator.dockerfile.simple.SimpleDockerfileGenerator \ No newline at end of file diff --git a/jkube-kit/generator/dockerfile-simple/src/test/java/org/eclipse/jkube/generator/dockerfile/simple/SimpleDockerfileGeneratorTest.java b/jkube-kit/generator/dockerfile-simple/src/test/java/org/eclipse/jkube/generator/dockerfile/simple/SimpleDockerfileGeneratorTest.java new file mode 100644 index 0000000000..82efb8d06f --- /dev/null +++ b/jkube-kit/generator/dockerfile-simple/src/test/java/org/eclipse/jkube/generator/dockerfile/simple/SimpleDockerfileGeneratorTest.java @@ -0,0 +1,214 @@ +/* + * 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.generator.dockerfile.simple; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.Properties; + +import org.eclipse.jkube.generator.api.GeneratorContext; +import org.eclipse.jkube.kit.common.JavaProject; +import org.eclipse.jkube.kit.config.image.ImageConfiguration; + +import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +class SimpleDockerfileGeneratorTest { + @TempDir + private File temporaryFolder; + private File dockerFile; + private SimpleDockerfileGenerator simpleDockerfileGenerator; + private Properties properties; + + @BeforeEach + void setUp() throws IOException { + dockerFile = temporaryFolder.toPath().resolve("Dockerfile").toFile(); + File srcDockerFile = new File(Objects.requireNonNull(getClass().getResource("/dummy-javaproject/Dockerfile")).getFile()); + Files.copy(srcDockerFile.toPath(), dockerFile.toPath()); + properties = new Properties(); + JavaProject javaProject = JavaProject.builder() + .baseDirectory(temporaryFolder) + .buildDirectory(temporaryFolder.toPath().resolve("target").toFile()) + .properties(properties) + .build(); + GeneratorContext generatorContext = GeneratorContext.builder() + .project(javaProject) + .build(); + simpleDockerfileGenerator = new SimpleDockerfileGenerator(generatorContext); + } + + @Nested + @DisplayName("isApplicable") + class IsApplicable { + @Test + @DisplayName("Dockerfile present in project base directory, return true") + void whenDockerFilePresentInProjectBaseDir_thenReturnTrue() { + assertThat(simpleDockerfileGenerator.isApplicable(Collections.emptyList())).isTrue(); + } + + @Test + @DisplayName("Dockerfile present in project base directory and ImageConfiguration present, return false") + void whenImageConfigurationAlreadyProvided_thenReturnFalse() { + // Given + List imageConfigurationList = new ArrayList<>(); + imageConfigurationList.add(ImageConfiguration.builder() + .name("foo/bar:latest") + .build(BuildConfiguration.builder() + .from("foo/base:latest") + .build()) + .build()); + + // When + assertThat(simpleDockerfileGenerator.isApplicable(imageConfigurationList)).isFalse(); + } + + @Test + @DisplayName("Dockerfile present in project base directory and ImageConfiguration does not contain BuildConfig, return true") + void whenProvidedImageConfigurationDoesNotContainBuildConfig_thenReturnFalse() { + // Given + List imageConfigurationList = new ArrayList<>(); + imageConfigurationList.add(ImageConfiguration.builder() + .name("foo/bar:latest") + .build()); + + // When + assertThat(simpleDockerfileGenerator.isApplicable(imageConfigurationList)).isTrue(); + } + + @Test + @DisplayName("Dockerfile NOT present in project base directory, return false") + void whenDockerFileAbsentInProjectBaseDir_thenReturnFalse() throws IOException { + // Given + Files.delete(dockerFile.toPath()); + + // When + Then + assertThat(simpleDockerfileGenerator.isApplicable(Collections.emptyList())).isFalse(); + } + } + + @Nested + @DisplayName("customize") + class Customize { + @Test + @DisplayName("no existing ImageConfiguration, create opinionated ImageConfiguration for Dockerfile") + void whenNoExistingImageConfiguration_thenCreateImageConfiguration() { + List images = new ArrayList<>(); + + // When + List resolvedImages = simpleDockerfileGenerator.customize(images, false); + resolvedImages.forEach(i -> i.getBuild().initAndValidate()); + + // Then + assertThat(resolvedImages).isNotNull() + .singleElement() + .hasFieldOrPropertyWithValue("name", "%g/%a:%l") + .hasFieldOrPropertyWithValue("build.dockerFile", dockerFile) + .hasFieldOrPropertyWithValue("build.ports", Collections.singletonList("8080")); + } + + @Test + @DisplayName("no existing ImageConfiguration and jkube.image.name property provided, create opinionated ImageConfiguration with configured name for Dockerfile") + void whenNoExistingImageConfigurationAndImageNamePropertyProvided_thenCreateImageConfiguration() { + List images = new ArrayList<>(); + properties.put("jkube.image.name", "configured-via-jkube-image-name-property:latest"); + + // When + List resolvedImages = simpleDockerfileGenerator.customize(images, false); + resolvedImages.forEach(i -> i.getBuild().initAndValidate()); + + // Then + assertThat(resolvedImages).isNotNull() + .singleElement() + .hasFieldOrPropertyWithValue("name", "configured-via-jkube-image-name-property:latest") + .hasFieldOrPropertyWithValue("build.dockerFile", dockerFile) + .hasFieldOrPropertyWithValue("build.ports", Collections.singletonList("8080")); + } + + @Test + @DisplayName("no existing ImageConfiguration and jkube.generator.name property provided, create opinionated ImageConfiguration with configured name for Dockerfile") + void whenNoExistingImageConfigurationAndGeneratorNamePropertyProvided_thenCreateImageConfiguration() { + List images = new ArrayList<>(); + properties.put("jkube.generator.name", "configured-via-jkube-generator-name-property:latest"); + + // When + List resolvedImages = simpleDockerfileGenerator.customize(images, false); + resolvedImages.forEach(i -> i.getBuild().initAndValidate()); + + // Then + assertThat(resolvedImages).isNotNull() + .singleElement() + .hasFieldOrPropertyWithValue("name", "configured-via-jkube-generator-name-property:latest") + .hasFieldOrPropertyWithValue("build.dockerFile", dockerFile) + .hasFieldOrPropertyWithValue("build.ports", Collections.singletonList("8080")); + } + + @Test + @DisplayName("ImageConfiguration without BuildConfig provided, merge opinionated ImageConfiguration for Dockerfile with provided ImageConfig") + void whenProvidedImageConfigurationWithNoBuild_shouldMergeOpinionatedWithExistingImageConfiguration() { + ImageConfiguration dummyImageConfiguration = ImageConfiguration.builder() + .name("imageconfiguration-no-build:latest") + .build(); + List images = new ArrayList<>(); + images.add(dummyImageConfiguration); + + // When + List resolvedImages = simpleDockerfileGenerator.customize(images, false); + resolvedImages.forEach(i -> i.getBuild().initAndValidate()); + + // Then + assertThat(resolvedImages).isNotNull() + .singleElement() + .hasFieldOrPropertyWithValue("name", "imageconfiguration-no-build:latest") + .hasFieldOrPropertyWithValue("build.dockerFileFile", dockerFile) + .hasFieldOrPropertyWithValue("build.ports", Collections.singletonList("8080")); + } + + @Test + @DisplayName("Valid ImageConfiguration already provided, then do not change provided ImageConfiguration") + void whenImageConfigurationProvided_thenDoNotModifyExistingImageConfiguration() { + ImageConfiguration dummyImageConfiguration = ImageConfiguration.builder() + .name("imageconfiguration-no-build:latest") + .build(BuildConfiguration.builder() + .from("foo/base:latest") + .port("8002") + .build()) + .build(); + List images = new ArrayList<>(); + images.add(dummyImageConfiguration); + + // When + List resolvedImages = simpleDockerfileGenerator.customize(images, false); + resolvedImages.forEach(i -> i.getBuild().initAndValidate()); + + // Then + assertThat(resolvedImages).isNotNull() + .singleElement() + .hasFieldOrPropertyWithValue("name", "imageconfiguration-no-build:latest") + .hasFieldOrPropertyWithValue("build.dockerFileFile", null) + .hasFieldOrPropertyWithValue("build.from", "foo/base:latest") + .hasFieldOrPropertyWithValue("build.ports", Collections.singletonList("8002")); + } + } +} diff --git a/jkube-kit/generator/dockerfile-simple/src/test/java/org/eclipse/jkube/generator/dockerfile/simple/SimpleDockerfileUtilTest.java b/jkube-kit/generator/dockerfile-simple/src/test/java/org/eclipse/jkube/generator/dockerfile/simple/SimpleDockerfileUtilTest.java new file mode 100644 index 0000000000..ef62a6db16 --- /dev/null +++ b/jkube-kit/generator/dockerfile-simple/src/test/java/org/eclipse/jkube/generator/dockerfile/simple/SimpleDockerfileUtilTest.java @@ -0,0 +1,151 @@ +/* + * 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.generator.dockerfile.simple; + +import org.eclipse.jkube.kit.config.image.ImageConfiguration; +import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +class SimpleDockerfileUtilTest { + @Nested + @DisplayName("isSimpleDockerfileMode") + class IsSimpleDockerFileMode { + @Test + @DisplayName("Dockerfile present in base directory, return true") + void whenDockerfilePresentInBaseDirectory_thenReturnTrue() { + // Given + File projectDir = new File(Objects.requireNonNull(getClass().getResource("/dummy-javaproject")).getFile()); + // When + boolean result = SimpleDockerfileUtil.isSimpleDockerFileMode(projectDir); + // Then + assertThat(result).isTrue(); + } + + @Test + @DisplayName("Dockerfile absent in base directory, return false") + void whenNoDockerfilePresentInBaseDirectory_thenReturnFalse(@TempDir File temporaryFolder) { + assertThat(SimpleDockerfileUtil.isSimpleDockerFileMode(temporaryFolder)).isFalse(); + } + + @Test + @DisplayName("When project directory is null, return false") + void whenNullProjectBaseDirectory_thenReturnFalse() { + assertThat(SimpleDockerfileUtil.isSimpleDockerFileMode(null)).isFalse(); + } + } + + @Nested + @DisplayName("createSimpleDockerfileConfig") + class CreateSimpleDockerfileConfig { + @Test + @DisplayName("simple Dockerfile, should generate ImageConfiguration") + void simple() throws IOException { + // Given + File dockerFile = Files.createTempFile("Dockerfile", "-test").toFile(); + // When + ImageConfiguration imageConfiguration1 = SimpleDockerfileUtil.createSimpleDockerfileConfig(dockerFile, null); + ImageConfiguration imageConfiguration2 = SimpleDockerfileUtil.createSimpleDockerfileConfig(dockerFile, "someImage:0.0.1"); + // Then + assertThat(imageConfiguration1).isNotNull() + .hasFieldOrPropertyWithValue("name", "%g/%a:%l") + .extracting(ImageConfiguration::getBuild) + .extracting(BuildConfiguration::getDockerFileRaw) + .isEqualTo(dockerFile.getPath()); + assertThat(imageConfiguration2).isNotNull() + .hasFieldOrPropertyWithValue("name", "someImage:0.0.1") + .extracting(ImageConfiguration::getBuild) + .extracting(BuildConfiguration::getDockerFileRaw) + .isEqualTo(dockerFile.getPath()); + } + + @Test + @DisplayName("Dockerfile with EXPOSE statement, then generated ImageConfiguration contains ports") + void exposeStatementsInDockerfileAddedAsPortsInImageConfiguration() { + // Given + File dockerFile = new File(Objects.requireNonNull(getClass().getResource("/Dockerfile_expose_ports")).getFile()); + // When + ImageConfiguration imageConfiguration1 = SimpleDockerfileUtil.createSimpleDockerfileConfig(dockerFile, null); + // Then + assertThat(imageConfiguration1.getBuild().getDockerFileRaw()).isEqualTo(dockerFile.getPath()); + assertThat(imageConfiguration1).isNotNull() + .hasFieldOrPropertyWithValue("name", "%g/%a:%l") + .extracting(ImageConfiguration::getBuild) + .extracting(BuildConfiguration::getPorts).isNotNull() + .asList() + .hasSize(5) + .containsExactly("80/tcp", "8080/udp", "80", "8080", "99/udp"); + } + } + + @Test + void addSimpleDockerfileConfig() throws IOException { + // Given + ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .name("test-image") + .build(); + File dockerFile = Files.createTempFile("Dockerfile", "-test").toFile(); + + // When + ImageConfiguration result = SimpleDockerfileUtil.addSimpleDockerfileConfig(imageConfiguration, dockerFile); + + // Then + assertThat(result.getBuild()).isNotNull() + .extracting(BuildConfiguration::getDockerFileRaw) + .isEqualTo(dockerFile.getPath()); + } + + @Nested + @DisplayName("extractPorts") + class ExtractPorts { + @Test + @DisplayName("should throw exception on Invalid Dockerfile provided") + void fromInvalidDockerFile_shouldThrowException() { + assertThatIllegalArgumentException() + .isThrownBy(() -> SimpleDockerfileUtil.extractPorts(new File("iDoNotExist"))) + .withMessage("Error in reading Dockerfile"); + } + + @Test + @DisplayName("should extract port numbers from EXPOSE statements in Dockerfile") + void fromDockerFileLines() { + // Given + List input1 = Arrays.asList(new String[]{"EXPOSE", "8080", "9090", "9999"} , new String[]{"EXPOSE", "9010"}); + List input2 = Arrays.asList(new String[]{"EXPOSE", "9001"}, new String[]{"EXPOSE", null}); + List input3 = Arrays.asList(new String[]{"EXPOSE", ""}, new String[]{"EXPOSE", "8001"}); + + // When + List result1 = SimpleDockerfileUtil.extractPorts(input1); + List result2 = SimpleDockerfileUtil.extractPorts(input2); + List result3 = SimpleDockerfileUtil.extractPorts(input3); + + // Then + assertThat(result1).containsExactly("9090", "8080", "9999", "9010"); + assertThat(result2).containsExactly("9001"); + assertThat(result3).containsExactly("8001"); + } + } +} diff --git a/jkube-kit/build/api/src/test/resources/docker/Dockerfile_expose_ports b/jkube-kit/generator/dockerfile-simple/src/test/resources/Dockerfile_expose_ports similarity index 100% rename from jkube-kit/build/api/src/test/resources/docker/Dockerfile_expose_ports rename to jkube-kit/generator/dockerfile-simple/src/test/resources/Dockerfile_expose_ports diff --git a/jkube-kit/build/api/src/test/resources/dummy-javaproject/Dockerfile b/jkube-kit/generator/dockerfile-simple/src/test/resources/dummy-javaproject/Dockerfile similarity index 100% rename from jkube-kit/build/api/src/test/resources/dummy-javaproject/Dockerfile rename to jkube-kit/generator/dockerfile-simple/src/test/resources/dummy-javaproject/Dockerfile diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index b5aa78d922..a5e3ba5340 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -250,6 +250,12 @@ ${project.version} + + org.eclipse.jkube + jkube-kit-generator-dockerfile-simple + ${project.version} + + org.eclipse.jkube jkube-kit-enricher-api diff --git a/jkube-kit/pom.xml b/jkube-kit/pom.xml index 3654da48bf..294932c054 100644 --- a/jkube-kit/pom.xml +++ b/jkube-kit/pom.xml @@ -47,6 +47,7 @@ generator/java-exec generator/karaf generator/webapp + generator/dockerfile-simple enricher/api enricher/generic enricher/specific diff --git a/kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/Dockerfile b/kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/Dockerfile new file mode 100644 index 0000000000..cc3f5db285 --- /dev/null +++ b/kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/Dockerfile @@ -0,0 +1,16 @@ +# +# 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 +# + +FROM busybox:latest +EXPOSE 9080 \ No newline at end of file diff --git a/kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/invoker.properties b/kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/invoker.properties new file mode 100644 index 0000000000..13ffb54f36 --- /dev/null +++ b/kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/invoker.properties @@ -0,0 +1,17 @@ +# +# 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 +# + +invoker.goals.1=clean k8s:resource +invoker.mavenOpts=-Djkube.verbose -Djkube.offline=true +invoker.debug=false \ No newline at end of file diff --git a/kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/pom.xml b/kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/pom.xml new file mode 100644 index 0000000000..902155ee86 --- /dev/null +++ b/kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/pom.xml @@ -0,0 +1,54 @@ + + + + + 4.0.0 + + dockerfile-simple-generator-precedence-kubernetes + org.eclipse.jkube + 0.1-SNAPSHOT + jar + + + org.springframework.boot + spring-boot-starter-parent + 2.7.17 + + + + + org.springframework.boot + spring-boot-starter-web + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.eclipse.jkube + kubernetes-maven-plugin + @jkube.version@ + + + + + diff --git a/kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/src/main/java/io/fabric8/maven/sample/spring/boot/Application.java b/kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/src/main/java/io/fabric8/maven/sample/spring/boot/Application.java new file mode 100644 index 0000000000..75794b3b8d --- /dev/null +++ b/kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/src/main/java/io/fabric8/maven/sample/spring/boot/Application.java @@ -0,0 +1,26 @@ +/* + * 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.maven.sample.spring.boot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/src/main/java/io/fabric8/maven/sample/spring/boot/HelloController.java b/kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/src/main/java/io/fabric8/maven/sample/spring/boot/HelloController.java new file mode 100644 index 0000000000..945b2d95ab --- /dev/null +++ b/kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/src/main/java/io/fabric8/maven/sample/spring/boot/HelloController.java @@ -0,0 +1,27 @@ +/* + * 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.maven.sample.spring.boot; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HelloController { + + @RequestMapping("/") + public String index() { + return "Greetings from Spring Boot!!"; + } + +} diff --git a/kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/verify.groovy b/kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/verify.groovy new file mode 100644 index 0000000000..613b7fdfa7 --- /dev/null +++ b/kubernetes-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/verify.groovy @@ -0,0 +1,18 @@ +/* + * 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 + */ +import org.eclipse.jkube.maven.it.Verify + +var text = new File(basedir, "build.log").text +assert text.contains("Running generator dockerfile-simple") + diff --git a/kubernetes-maven-plugin/plugin/pom.xml b/kubernetes-maven-plugin/plugin/pom.xml index 6ee310a556..b938c8573d 100644 --- a/kubernetes-maven-plugin/plugin/pom.xml +++ b/kubernetes-maven-plugin/plugin/pom.xml @@ -71,6 +71,11 @@ jkube-kit-generator-java-exec + + org.eclipse.jkube + jkube-kit-generator-dockerfile-simple + + org.eclipse.jkube jkube-kit-generator-karaf diff --git a/kubernetes-maven-plugin/plugin/src/main/resources/META-INF/jkube/profiles-default.yml b/kubernetes-maven-plugin/plugin/src/main/resources/META-INF/jkube/profiles-default.yml index 9dacc0a91b..10ba02b687 100644 --- a/kubernetes-maven-plugin/plugin/src/main/resources/META-INF/jkube/profiles-default.yml +++ b/kubernetes-maven-plugin/plugin/src/main/resources/META-INF/jkube/profiles-default.yml @@ -86,6 +86,7 @@ generator: # The order given in "includes" is the order in which generators are called includes: + - dockerfile-simple - quarkus - spring-boot - thorntail-v2 @@ -118,6 +119,7 @@ generator: # The order given in "includes" is the order in which generators are called includes: + - dockerfile-simple - spring-boot - thorntail-v2 - wildfly-jar diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java index ef6431b14e..038b9d42c8 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java @@ -84,6 +84,7 @@ void setUp(@TempDir Path temporaryFolder) throws Exception { when(mavenProject.getCompileClasspathElements()).thenReturn(Collections.emptyList()); when(mavenProject.getDependencies()).thenReturn(Collections.emptyList()); when(mavenProject.getDevelopers()).thenReturn(Collections.emptyList()); + when(mavenProject.getBasedir()).thenReturn(temporaryFolder.toFile()); when(mavenProject.getBuild().getDirectory()).thenReturn(targetDir.getAbsolutePath()); when(mavenProject.getBuild().getOutputDirectory()).thenReturn(targetDir.getAbsolutePath()); mavenSettings = mock(Settings.class); diff --git a/openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/Dockerfile b/openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/Dockerfile new file mode 100644 index 0000000000..cc3f5db285 --- /dev/null +++ b/openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/Dockerfile @@ -0,0 +1,16 @@ +# +# 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 +# + +FROM busybox:latest +EXPOSE 9080 \ No newline at end of file diff --git a/openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/invoker.properties b/openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/invoker.properties new file mode 100644 index 0000000000..3c8670a0a2 --- /dev/null +++ b/openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/invoker.properties @@ -0,0 +1,17 @@ +# +# 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 +# + +invoker.goals.1=clean oc:resource +invoker.mavenOpts=-Djkube.verbose -Djkube.offline=true +invoker.debug=false diff --git a/openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/pom.xml b/openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/pom.xml new file mode 100644 index 0000000000..94ff4b42c3 --- /dev/null +++ b/openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/pom.xml @@ -0,0 +1,54 @@ + + + + + 4.0.0 + + dockerfile-simple-generator-precedence-openshift + org.eclipse.jkube + 0.1-SNAPSHOT + jar + + + org.springframework.boot + spring-boot-starter-parent + 2.7.17 + + + + + org.springframework.boot + spring-boot-starter-web + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.eclipse.jkube + openshift-maven-plugin + @jkube.version@ + + + + + diff --git a/openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/src/main/java/io/fabric8/maven/sample/spring/boot/Application.java b/openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/src/main/java/io/fabric8/maven/sample/spring/boot/Application.java new file mode 100644 index 0000000000..75794b3b8d --- /dev/null +++ b/openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/src/main/java/io/fabric8/maven/sample/spring/boot/Application.java @@ -0,0 +1,26 @@ +/* + * 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.maven.sample.spring.boot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/src/main/java/io/fabric8/maven/sample/spring/boot/HelloController.java b/openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/src/main/java/io/fabric8/maven/sample/spring/boot/HelloController.java new file mode 100644 index 0000000000..945b2d95ab --- /dev/null +++ b/openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/src/main/java/io/fabric8/maven/sample/spring/boot/HelloController.java @@ -0,0 +1,27 @@ +/* + * 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.maven.sample.spring.boot; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class HelloController { + + @RequestMapping("/") + public String index() { + return "Greetings from Spring Boot!!"; + } + +} diff --git a/openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/verify.groovy b/openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/verify.groovy new file mode 100644 index 0000000000..613b7fdfa7 --- /dev/null +++ b/openshift-maven-plugin/it/src/it/dockerfile-simple-generator-precedence/verify.groovy @@ -0,0 +1,18 @@ +/* + * 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 + */ +import org.eclipse.jkube.maven.it.Verify + +var text = new File(basedir, "build.log").text +assert text.contains("Running generator dockerfile-simple") + diff --git a/openshift-maven-plugin/plugin/src/main/resources/META-INF/jkube/profiles-default.yml b/openshift-maven-plugin/plugin/src/main/resources/META-INF/jkube/profiles-default.yml index c9123ed1f9..f203b6e58a 100644 --- a/openshift-maven-plugin/plugin/src/main/resources/META-INF/jkube/profiles-default.yml +++ b/openshift-maven-plugin/plugin/src/main/resources/META-INF/jkube/profiles-default.yml @@ -87,6 +87,7 @@ generator: # The order given in "includes" is the order in which generators are called includes: + - dockerfile-simple - quarkus - spring-boot - thorntail-v2 @@ -119,6 +120,7 @@ generator: # The order given in "includes" is the order in which generators are called includes: + - dockerfile-simple - spring-boot - thorntail-v2 - wildfly-jar From 928864a90482398f9e3c010e0cf0912b0fd136db Mon Sep 17 00:00:00 2001 From: Sun Seng David TAN Date: Thu, 11 Apr 2024 11:50:12 +0200 Subject: [PATCH 019/289] fix(oc-build): Correctly pass Docker build-arg from the build configuration to the Openshift build strategy Signed-off-by: Sun Seng David TAN --- CHANGELOG.md | 1 + .../openshift/OpenShiftBuildServiceUtils.java | 6 ++++ .../OpenShiftBuildServiceUtilsTest.java | 29 +++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index c298e9c3a8..89bf73421a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ Usage: ### 1.17-SNAPSHOT * Fix #2335: Add support for configuring nodeSelector spec for controller via xml/groovy DSL configuration * Fix #2459: Allow configuring Buildpacks build via ImageConfiguration +* Fix #2860: Correctly pass Docker build-arg from the build configuration to the Openshift build strategy ### 1.16.2 (2024-03-27) * Fix #2461: `k8s:watch`/`k8sWatch` should throw error in `buildpacks` build strategy diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java index d524e9a9b8..e91aeec697 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java @@ -14,6 +14,7 @@ package org.eclipse.jkube.kit.config.service.openshift; import io.fabric8.kubernetes.api.model.EnvVar; +import io.fabric8.kubernetes.api.model.EnvVarBuilder; import io.fabric8.kubernetes.api.model.LocalObjectReferenceBuilder; import io.fabric8.openshift.api.model.BuildConfig; import io.fabric8.openshift.api.model.BuildConfigSpec; @@ -132,6 +133,11 @@ protected static BuildStrategy createBuildStrategy( .withNamespace(StringUtils.isEmpty(fromNamespace) ? null : fromNamespace) .endFrom() .withEnv(checkForEnv(imageConfig)) + .withBuildArgs(imageConfig.getBuildConfiguration().getArgs().entrySet().stream() + .map(bcArg -> new EnvVarBuilder() + .withName(bcArg.getKey()) + .withValue(bcArg.getValue()).build()) + .collect(Collectors.toList())) .withNoCache(checkForNocache(imageConfig)) .endDockerStrategy().build(); if (openshiftPullSecret != null) { diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java index e662b45faf..c242827b22 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java @@ -32,6 +32,7 @@ import org.eclipse.jkube.kit.config.service.JKubeServiceException; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; +import io.fabric8.kubernetes.api.model.EnvVarBuilder; import io.fabric8.openshift.api.model.BuildConfig; import io.fabric8.openshift.api.model.BuildConfigBuilder; import io.fabric8.openshift.api.model.BuildConfigSpec; @@ -196,6 +197,34 @@ void createBuildStrategy_withDockerBuildStrategyAndNoPullSecret_shouldReturnVali .hasFieldOrPropertyWithValue("from.name", "ubi8/s2i-base"); } + @Test + void createBuildStrategy_withDockerBuildArgs_shouldReturnValidBuildStrategyWithBuildArgs() { + // Given + when(jKubeServiceHub.getBuildServiceConfig().getJKubeBuildStrategy()) + .thenReturn(JKubeBuildStrategy.docker); + ImageConfiguration imageConfig = ImageConfiguration.builder() + .name("myapp") + .build(BuildConfiguration.builder() + .from("ubi8/s2i-base") + .args(Collections.singletonMap("BUILD_ARGS_KEY", "build-args-value")) + .build()) + .build(); + // When + final BuildStrategy result = createBuildStrategy(jKubeServiceHub, imageConfig, "my-secret-for-pull"); + // Then + assertThat(result) + .hasFieldOrPropertyWithValue("type", "Docker") + .extracting(BuildStrategy::getDockerStrategy) + .hasFieldOrPropertyWithValue("from.kind", "DockerImage") + .hasFieldOrPropertyWithValue("from.name", "ubi8/s2i-base") + .extracting("buildArgs").asList().hasSize(1).first().satisfies( + envVar -> { + assertThat(envVar) + .hasFieldOrPropertyWithValue("name", "BUILD_ARGS_KEY") + .hasFieldOrPropertyWithValue("value", "build-args-value"); + }); + } + @Test void createBuildStrategy_withDockerBuildStrategyAndPullSecret_shouldReturnValidBuildStrategy() { // Given From 9405749228412f9b45bd261e0242a49591718f02 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Apr 2024 23:43:30 +0000 Subject: [PATCH 020/289] chore(deps): Bump version.jacoco from 0.8.10 to 0.8.12 Bumps `version.jacoco` from 0.8.10 to 0.8.12. Updates `org.jacoco:org.jacoco.agent` from 0.8.10 to 0.8.12 - [Release notes](https://github.com/jacoco/jacoco/releases) - [Commits](https://github.com/jacoco/jacoco/compare/v0.8.10...v0.8.12) Updates `org.jacoco:jacoco-maven-plugin` from 0.8.10 to 0.8.12 - [Release notes](https://github.com/jacoco/jacoco/releases) - [Commits](https://github.com/jacoco/jacoco/compare/v0.8.10...v0.8.12) --- updated-dependencies: - dependency-name: org.jacoco:org.jacoco.agent dependency-type: direct:development update-type: version-update:semver-patch - dependency-name: org.jacoco:jacoco-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 9ef2280b10..99daf3c1e3 100644 --- a/pom.xml +++ b/pom.xml @@ -102,7 +102,7 @@ 31.1-jre 0.0.6 2.15.2 - 0.8.10 + 0.8.12 2.5.0 5.10.0 6.11.0 From 43cbe24b43425303665e4c71ad2e0c4309e67e58 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Apr 2024 23:43:21 +0000 Subject: [PATCH 021/289] chore(deps): Bump org.javassist:javassist from 3.29.2-GA to 3.30.2-GA Bumps [org.javassist:javassist](https://github.com/jboss-javassist/javassist) from 3.29.2-GA to 3.30.2-GA. - [Release notes](https://github.com/jboss-javassist/javassist/releases) - [Changelog](https://github.com/jboss-javassist/javassist/blob/master/Changes.md) - [Commits](https://github.com/jboss-javassist/javassist/commits) --- updated-dependencies: - dependency-name: org.javassist:javassist dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- jkube-kit/parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index a5e3ba5340..8c6594276c 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -43,7 +43,7 @@ 4.5.14 0.0.1 2.4.1 - 3.29.2-GA + 3.30.2-GA 5.12.0.202106070339-r 0.38.20 From 24c6bd180529bc3a4eaa44acdefbec5f9dcd8736 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 11 Apr 2024 19:40:12 +0000 Subject: [PATCH 022/289] chore(deps): Bump org.eclipse.jgit:org.eclipse.jgit in /jkube-kit/parent Bumps org.eclipse.jgit:org.eclipse.jgit from 5.12.0.202106070339-r to 5.13.3.202401111512-r. --- updated-dependencies: - dependency-name: org.eclipse.jgit:org.eclipse.jgit dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- jkube-kit/parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index 8c6594276c..fde9a7e869 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -45,7 +45,7 @@ 2.4.1 3.30.2-GA - 5.12.0.202106070339-r + 5.13.3.202401111512-r 0.38.20 3.0.2 3.6.1 From ca5545f11133dcda609257ba9d7f79a96492d476 Mon Sep 17 00:00:00 2001 From: tejachalla123 Date: Thu, 11 Apr 2024 23:56:30 -0400 Subject: [PATCH 023/289] Vertex version bump --- quickstarts/maven/vertx4/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quickstarts/maven/vertx4/pom.xml b/quickstarts/maven/vertx4/pom.xml index 16e5b93854..48576282cd 100644 --- a/quickstarts/maven/vertx4/pom.xml +++ b/quickstarts/maven/vertx4/pom.xml @@ -34,7 +34,7 @@ 1.8 3.2.4 ${project.version} - 4.0.2 + 4.5.7 / org.eclipse.jkube.quickstarts.maven.MainVerticle io.vertx.core.Launcher From 3e842ee4c6c1226599ce591ffa09077becff2173 Mon Sep 17 00:00:00 2001 From: Sun Seng David TAN Date: Fri, 12 Apr 2024 16:09:20 +0200 Subject: [PATCH 024/289] fix(oc-build): image build should not fail if no build args is provided Signed-off-by: Sun Seng David TAN --- .../config/service/openshift/OpenShiftBuildServiceUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java index e91aeec697..199993a0da 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java @@ -133,7 +133,7 @@ protected static BuildStrategy createBuildStrategy( .withNamespace(StringUtils.isEmpty(fromNamespace) ? null : fromNamespace) .endFrom() .withEnv(checkForEnv(imageConfig)) - .withBuildArgs(imageConfig.getBuildConfiguration().getArgs().entrySet().stream() + .withBuildArgs(Optional.ofNullable(buildConfig.getArgs()).orElse(Collections.emptyMap()).entrySet().stream() .map(bcArg -> new EnvVarBuilder() .withName(bcArg.getKey()) .withValue(bcArg.getValue()).build()) From 2b8e2ccdc1a76433834b1fee236d0d220061cda9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Apr 2024 23:41:28 +0000 Subject: [PATCH 025/289] chore(deps): Bump version.jackson from 2.15.2 to 2.17.0 Bumps `version.jackson` from 2.15.2 to 2.17.0. Updates `com.fasterxml.jackson.core:jackson-core` from 2.15.2 to 2.17.0 - [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.15.2...jackson-core-2.17.0) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.15.2 to 2.17.0 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.dataformat:jackson-dataformat-yaml` from 2.15.2 to 2.17.0 - [Commits](https://github.com/FasterXML/jackson-dataformats-text/compare/jackson-dataformats-text-2.15.2...jackson-dataformats-text-2.17.0) Updates `com.fasterxml.jackson.datatype:jackson-datatype-jsr310` from 2.15.2 to 2.17.0 Updates `com.fasterxml.jackson:jackson-bom` from 2.15.2 to 2.17.0 - [Commits](https://github.com/FasterXML/jackson-bom/compare/jackson-bom-2.15.2...jackson-bom-2.17.0) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-core dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.fasterxml.jackson.datatype:jackson-datatype-jsr310 dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: com.fasterxml.jackson:jackson-bom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 99daf3c1e3..0dbe2b80ad 100644 --- a/pom.xml +++ b/pom.xml @@ -101,7 +101,7 @@ 3.0.19 31.1-jre 0.0.6 - 2.15.2 + 2.17.0 0.8.12 2.5.0 5.10.0 From 493fa5adc6456d6f883e377c2f628a4a63cc0136 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Apr 2024 23:41:08 +0000 Subject: [PATCH 026/289] chore(deps): Bump version.junit5 from 5.10.0 to 5.10.2 Bumps `version.junit5` from 5.10.0 to 5.10.2. Updates `org.junit.jupiter:junit-jupiter-engine` from 5.10.0 to 5.10.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.0...r5.10.2) Updates `org.junit.jupiter:junit-jupiter-params` from 5.10.0 to 5.10.2 - [Release notes](https://github.com/junit-team/junit5/releases) - [Commits](https://github.com/junit-team/junit5/compare/r5.10.0...r5.10.2) --- updated-dependencies: - dependency-name: org.junit.jupiter:junit-jupiter-engine dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: org.junit.jupiter:junit-jupiter-params dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0dbe2b80ad..6a72b8ba14 100644 --- a/pom.xml +++ b/pom.xml @@ -104,7 +104,7 @@ 2.17.0 0.8.12 2.5.0 - 5.10.0 + 5.10.2 6.11.0 4.2 1.18.28 From 794e115ebf94b78d1f3753c8513d0b4d75264a61 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 23:27:12 +0000 Subject: [PATCH 027/289] chore(deps): Bump org.apache.maven.plugins:maven-source-plugin Bumps [org.apache.maven.plugins:maven-source-plugin](https://github.com/apache/maven-source-plugin) from 3.3.0 to 3.3.1. - [Commits](https://github.com/apache/maven-source-plugin/compare/maven-source-plugin-3.3.0...maven-source-plugin-3.3.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-source-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6a72b8ba14..71cfdae7ef 100644 --- a/pom.xml +++ b/pom.xml @@ -119,7 +119,7 @@ 3.12.0 3.0.1 3.3.1 - 3.3.0 + 3.3.1 3.1.2 4.6.1 1.6.13 From 2a48d0593b955fb0c203d78530bb8e5425f9bc35 Mon Sep 17 00:00:00 2001 From: Agustin Rojas <104212851+agusaar@users.noreply.github.com> Date: Tue, 16 Apr 2024 07:12:15 -0300 Subject: [PATCH 028/289] test: removed non-thrown declared Exception from method signature (#2910) --- .../java/org/eclipse/jkube/kit/profile/ProfileUtilTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/profile/src/test/java/org/eclipse/jkube/kit/profile/ProfileUtilTest.java b/jkube-kit/profile/src/test/java/org/eclipse/jkube/kit/profile/ProfileUtilTest.java index b4f6cd7ee8..4079bd421f 100644 --- a/jkube-kit/profile/src/test/java/org/eclipse/jkube/kit/profile/ProfileUtilTest.java +++ b/jkube-kit/profile/src/test/java/org/eclipse/jkube/kit/profile/ProfileUtilTest.java @@ -57,7 +57,7 @@ public File getProfileDir() throws URISyntaxException { } @Test - void findProfile_whenValidProfileArg_returnsValidProfile() throws URISyntaxException, IOException { + void findProfile_whenValidProfileArg_returnsValidProfile() throws URISyntaxException { assertThat(ProfileUtil.findProfile("simple", getProfileDir())) .isNotNull() .hasFieldOrPropertyWithValue("name", "simple") From ba6503bca7dd2d9db5983b05935de690f12e7df6 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 12:55:40 +0200 Subject: [PATCH 029/289] chore(deps): Bump com.google.cloud.tools:jib-core from 0.24.0 to 0.27.0 (#2912) Bumps [com.google.cloud.tools:jib-core](https://github.com/GoogleContainerTools/jib) from 0.24.0 to 0.27.0. - [Release notes](https://github.com/GoogleContainerTools/jib/releases) - [Commits](https://github.com/GoogleContainerTools/jib/commits) --- updated-dependencies: - dependency-name: com.google.cloud.tools:jib-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- jkube-kit/parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index fde9a7e869..98053b8fb7 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -125,7 +125,7 @@ quay.io/wildfly/wildfly-centos7:${version.image.wildfly.upstream.s2i} wildfly:${version.image.wildfly.upstream.s2i} - 0.24.0 + 0.27.0 0.32.1 exe From 8f7c02ae621a9b41e974d06f9cb56b40ea663832 Mon Sep 17 00:00:00 2001 From: Tanmay Mathpal Date: Tue, 16 Apr 2024 17:31:50 +0530 Subject: [PATCH 030/289] doc: update quickstarts/maven/quarkus to latest Quarkus version (#2864) --- quickstarts/maven/quarkus/pom.xml | 2 +- .../quarkus/rest/CoolApplicationResource.java | 12 ++++++------ .../quarkus/rest/CoolApplicationService.java | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/quickstarts/maven/quarkus/pom.xml b/quickstarts/maven/quarkus/pom.xml index 15b5dd4c27..eaada05ba0 100644 --- a/quickstarts/maven/quarkus/pom.xml +++ b/quickstarts/maven/quarkus/pom.xml @@ -32,7 +32,7 @@ 11 11 ${project.version} - 2.8.1.Final + 3.9.1 NodePort diff --git a/quickstarts/maven/quarkus/src/main/java/org/eclipse/jkube/quickstart/quarkus/rest/CoolApplicationResource.java b/quickstarts/maven/quarkus/src/main/java/org/eclipse/jkube/quickstart/quarkus/rest/CoolApplicationResource.java index 39cd8f46d5..5ecea09b12 100644 --- a/quickstarts/maven/quarkus/src/main/java/org/eclipse/jkube/quickstart/quarkus/rest/CoolApplicationResource.java +++ b/quickstarts/maven/quarkus/src/main/java/org/eclipse/jkube/quickstart/quarkus/rest/CoolApplicationResource.java @@ -13,12 +13,12 @@ */ package org.eclipse.jkube.quickstart.quarkus.rest; -import javax.inject.Inject; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; +import jakarta.inject.Inject; +import jakarta.ws.rs.GET; +import jakarta.ws.rs.Path; +import jakarta.ws.rs.Produces; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.Response; @Path("/") public class CoolApplicationResource { diff --git a/quickstarts/maven/quarkus/src/main/java/org/eclipse/jkube/quickstart/quarkus/rest/CoolApplicationService.java b/quickstarts/maven/quarkus/src/main/java/org/eclipse/jkube/quickstart/quarkus/rest/CoolApplicationService.java index e910716430..05e4a91117 100644 --- a/quickstarts/maven/quarkus/src/main/java/org/eclipse/jkube/quickstart/quarkus/rest/CoolApplicationService.java +++ b/quickstarts/maven/quarkus/src/main/java/org/eclipse/jkube/quickstart/quarkus/rest/CoolApplicationService.java @@ -13,7 +13,7 @@ */ package org.eclipse.jkube.quickstart.quarkus.rest; -import javax.inject.Singleton; +import jakarta.inject.Singleton; @Singleton public class CoolApplicationService { From 943dc16ab4781c1713428d6853b9d238e99aa24e Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Tue, 16 Apr 2024 17:36:46 +0530 Subject: [PATCH 031/289] doc (jkube-kit/doc): Add documentation for SimpleDockerfileGenerator (#2804) --- jkube-kit/doc/src/main/asciidoc/inc/_generator.adoc | 5 +++++ .../asciidoc/inc/generator/_simple_dockerfile.adoc | 11 +++++++++++ 2 files changed, 16 insertions(+) create mode 100644 jkube-kit/doc/src/main/asciidoc/inc/generator/_simple_dockerfile.adoc diff --git a/jkube-kit/doc/src/main/asciidoc/inc/_generator.adoc b/jkube-kit/doc/src/main/asciidoc/inc/_generator.adoc index 44a1d5a9ee..391081cc59 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/_generator.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/_generator.adoc @@ -14,6 +14,10 @@ All default generators examine the build information for certain aspects and gen |=== | Generator | Name | Description +| <> +| `dockerfile-simple` +| Generator for creating Image when user places `Dockerfile` in project base directory. + | <> | `java-exec` | Generic generator for flat classpath and fat-jar Java applications @@ -67,6 +71,7 @@ endif::[] include::generator/_options_common.adoc[] +include::generator/_simple_dockerfile.adoc[] include::generator/_java_exec.adoc[] include::generator/_spring_boot.adoc[] include::generator/_thorntail_v2.adoc[] diff --git a/jkube-kit/doc/src/main/asciidoc/inc/generator/_simple_dockerfile.adoc b/jkube-kit/doc/src/main/asciidoc/inc/generator/_simple_dockerfile.adoc new file mode 100644 index 0000000000..d642773ff5 --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/generator/_simple_dockerfile.adoc @@ -0,0 +1,11 @@ +[[generator-simple-dockerfile]] +=== Simple Dockerfile + +Simple Dockerfile generator is responsible for creating an opinionated image configuration when user places `Dockerfile` in project's base directory. + +This generator gets activated when these conditions are met: + +- `Dockerfile` is placed in project's base directory +- Either `image` configuration is not provided, or `image` configuration provided does not have `build` configured. + +Image built with this configuration would use the `Dockerfile` for https://docs.docker.com/reference/cli/docker/image/build/[docker build] and project base directory as https://docs.docker.com/build/building/context/#filesystem-contexts[docker context directory]. From 5fb82bfdf6cfb9104bee11c2f577f8e09927cb2c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 23:35:24 +0000 Subject: [PATCH 032/289] chore(deps): Bump org.projectlombok:lombok from 1.18.28 to 1.18.32 Bumps [org.projectlombok:lombok](https://github.com/projectlombok/lombok) from 1.18.28 to 1.18.32. - [Changelog](https://github.com/projectlombok/lombok/blob/master/doc/changelog.markdown) - [Commits](https://github.com/projectlombok/lombok/compare/v1.18.28...v1.18.32) --- updated-dependencies: - dependency-name: org.projectlombok:lombok dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 71cfdae7ef..efcacbfdde 100644 --- a/pom.xml +++ b/pom.xml @@ -107,7 +107,7 @@ 5.10.2 6.11.0 4.2 - 1.18.28 + 1.18.32 1.18.20.0 3.11.0 3.4.0 From 1044a3f0f95ebd84e6c169a16f512fe2027ecd07 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 23:35:20 +0000 Subject: [PATCH 033/289] chore(deps): Bump org.apache.maven.plugins:maven-enforcer-plugin Bumps [org.apache.maven.plugins:maven-enforcer-plugin](https://github.com/apache/maven-enforcer) from 3.4.0 to 3.4.1. - [Release notes](https://github.com/apache/maven-enforcer/releases) - [Commits](https://github.com/apache/maven-enforcer/compare/enforcer-3.4.0...enforcer-3.4.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-enforcer-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index efcacbfdde..72e0fbade9 100644 --- a/pom.xml +++ b/pom.xml @@ -110,7 +110,7 @@ 1.18.32 1.18.20.0 3.11.0 - 3.4.0 + 3.4.1 3.1.2 3.2.2 3.6.0 From a86a652a0ce670115e1bedaf5940c30ff45fff18 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 23:35:12 +0000 Subject: [PATCH 034/289] chore(deps): Bump org.apache.maven.plugins:maven-jar-plugin Bumps [org.apache.maven.plugins:maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.3.0 to 3.4.0. - [Release notes](https://github.com/apache/maven-jar-plugin/releases) - [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.3.0...maven-jar-plugin-3.4.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-jar-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 72e0fbade9..fd8cb4562d 100644 --- a/pom.xml +++ b/pom.xml @@ -114,7 +114,7 @@ 3.1.2 3.2.2 3.6.0 - 3.3.0 + 3.4.0 3.5.0 3.12.0 3.0.1 From d9b4a027e58fd07c2b0a656782a1cf68633868ed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 23:35:17 +0000 Subject: [PATCH 035/289] chore(deps): Bump org.apache.sshd:sshd-core from 2.9.2 to 2.12.1 Bumps [org.apache.sshd:sshd-core](https://github.com/apache/mina-sshd) from 2.9.2 to 2.12.1. - [Release notes](https://github.com/apache/mina-sshd/releases) - [Changelog](https://github.com/apache/mina-sshd/blob/master/CHANGES.md) - [Commits](https://github.com/apache/mina-sshd/compare/sshd-2.9.2...sshd-2.12.1) --- updated-dependencies: - dependency-name: org.apache.sshd:sshd-core dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fd8cb4562d..f62edf301c 100644 --- a/pom.xml +++ b/pom.xml @@ -126,7 +126,7 @@ 2.2.0 1.7.36 3.9.1.2184 - 2.9.2 + 2.12.1 2024-03-27T11:10:46Z ${project.build.directory}/generated-docs From 8a70d71a9e4295044996aa4334bd1c4794d335d6 Mon Sep 17 00:00:00 2001 From: Swagat Chand <163507813+swagatchand98@users.noreply.github.com> Date: Wed, 17 Apr 2024 15:36:09 +0530 Subject: [PATCH 036/289] test: removed non-thrown declared Exception from method signature (#2916) --- .../jkube/gradle/plugin/task/KubernetesHelmPushTaskTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmPushTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmPushTaskTest.java index 7af38e015a..f496454e82 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmPushTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmPushTaskTest.java @@ -40,7 +40,7 @@ class KubernetesHelmPushTaskTest { private MockedConstruction helmServiceMockedConstruction; @BeforeEach - void setUp() throws IOException { + void setUp() { TestKubernetesExtension extension = new TestKubernetesExtension(); extension.isUseColor = false; helmServiceMockedConstruction = mockConstruction(HelmService.class); From 6ca26cdce98a073654be777d283f55215e6a1fbf Mon Sep 17 00:00:00 2001 From: Akshay Agrawal <44442353+akshay11agrawal@users.noreply.github.com> Date: Wed, 17 Apr 2024 11:15:04 +0100 Subject: [PATCH 037/289] fix: provide parameterized type for the generic (#2870) (#2889) --- .../kit/build/service/docker/auth/AuthConfigFactory.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/auth/AuthConfigFactory.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/auth/AuthConfigFactory.java index 41d0a7095f..d67d23f422 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/auth/AuthConfigFactory.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/auth/AuthConfigFactory.java @@ -363,9 +363,9 @@ protected static AuthConfig getAuthConfigFromOpenShiftConfig(LookupMode lookupMo } // Check plugin config - Map mapToCheck = getAuthConfigMapToCheck(lookupMode,authConfigMap); + Map mapToCheck = getAuthConfigMapToCheck(lookupMode,authConfigMap); if (mapToCheck != null && mapToCheck.containsKey(AUTH_USE_OPENSHIFT_AUTH) && - Boolean.parseBoolean((String) mapToCheck.get(AUTH_USE_OPENSHIFT_AUTH))) { + Boolean.parseBoolean(mapToCheck.get(AUTH_USE_OPENSHIFT_AUTH))) { return validateMandatoryOpenShiftLogin(readKubeConfigAuth(), useOpenAuthModeKey); } else { return null; From e15bb9ac10794a2f90247230e46db53d859b9445 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Apr 2024 06:28:59 +0200 Subject: [PATCH 038/289] chore(deps): Bump com.github.jnr:jnr-unixsocket from 0.38.20 to 0.38.22 (#2936) Bumps [com.github.jnr:jnr-unixsocket](https://github.com/jnr/jnr-unixsocket) from 0.38.20 to 0.38.22. - [Commits](https://github.com/jnr/jnr-unixsocket/compare/jnr-unixsocket-0.38.20...0.38.22) --- updated-dependencies: - dependency-name: com.github.jnr:jnr-unixsocket dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- jkube-kit/parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index 98053b8fb7..c1c725c13f 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -46,7 +46,7 @@ 3.30.2-GA 5.13.3.202401111512-r - 0.38.20 + 0.38.22 3.0.2 3.6.1 3.8.1 From e725cf670c1a93c1f9607b8196ddd72f0edb752f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 18 Apr 2024 06:29:57 +0200 Subject: [PATCH 039/289] chore(deps): Bump com.google.guava:guava from 31.1-jre to 33.1.0-jre (#2933) Bumps [com.google.guava:guava](https://github.com/google/guava) from 31.1-jre to 33.1.0-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) --- updated-dependencies: - dependency-name: com.google.guava:guava dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f62edf301c..83b9c40d02 100644 --- a/pom.xml +++ b/pom.xml @@ -99,7 +99,7 @@ 7.6.2 0.0.3 3.0.19 - 31.1-jre + 33.1.0-jre 0.0.6 2.17.0 0.8.12 From a3e32aec35c2cf74f3c3f3c88299534bbcfec63e Mon Sep 17 00:00:00 2001 From: Eliza Sorber <53704365+elizasorber@users.noreply.github.com> Date: Thu, 18 Apr 2024 00:30:31 -0400 Subject: [PATCH 040/289] fix: removed an unused import statement in KubernetesWatchTaskTest (#2932) --- .../jkube/gradle/plugin/task/KubernetesWatchTaskTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java index 5a4d2af00e..c98045fcdc 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java @@ -30,7 +30,6 @@ import org.mockito.MockedConstruction; import org.mockito.MockedStatic; -import java.io.IOException; import java.net.URL; import static org.assertj.core.api.Assertions.assertThat; From c31cb67607c747d402ff9bd0ce3bb612997a545c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Apr 2024 06:49:28 +0200 Subject: [PATCH 041/289] chore(deps): Bump org.apache.maven.plugins:maven-surefire-plugin (#2938) Bumps [org.apache.maven.plugins:maven-surefire-plugin](https://github.com/apache/maven-surefire) from 3.1.2 to 3.2.5. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.1.2...surefire-3.2.5) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-surefire-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 83b9c40d02..366b8d1eb7 100644 --- a/pom.xml +++ b/pom.xml @@ -120,7 +120,7 @@ 3.0.1 3.3.1 3.3.1 - 3.1.2 + 3.2.5 4.6.1 1.6.13 2.2.0 From 4838b2678e72b8f6ad899c37a0bcb6f6462477f2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Apr 2024 08:54:28 +0200 Subject: [PATCH 042/289] chore(deps): Bump com.marcnuri.plugins:gradle-api-maven-plugin (#2939) Bumps [com.marcnuri.plugins:gradle-api-maven-plugin](https://github.com/manusa/gradle-api-maven-plugin) from 0.0.3 to 0.0.5. - [Release notes](https://github.com/manusa/gradle-api-maven-plugin/releases) - [Commits](https://github.com/manusa/gradle-api-maven-plugin/compare/v0.0.3...v0.0.5) --- updated-dependencies: - dependency-name: com.marcnuri.plugins:gradle-api-maven-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 366b8d1eb7..e19263a104 100644 --- a/pom.xml +++ b/pom.xml @@ -97,7 +97,7 @@ 1.26.1 2.15.1 7.6.2 - 0.0.3 + 0.0.5 3.0.19 33.1.0-jre 0.0.6 From e7800b9fc939273e6640363c46212198791bbe4c Mon Sep 17 00:00:00 2001 From: anglerfishlyy <163823908+anglerfishlyy@users.noreply.github.com> Date: Fri, 19 Apr 2024 14:29:44 +0530 Subject: [PATCH 043/289] refactor: replace Object.mapper.configure with JsonMapper.builder.configure (#2937) (#2528) --- .../org/eclipse/jkube/kit/common/JKubeConfigurationTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/JKubeConfigurationTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/JKubeConfigurationTest.java index d36bafc6e1..d5c2e06380 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/JKubeConfigurationTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/JKubeConfigurationTest.java @@ -15,6 +15,8 @@ import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; + import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -120,8 +122,7 @@ void builder() { @Test void rawDeserialization() throws IOException { // Given - final ObjectMapper mapper = new ObjectMapper(); - mapper.configure(MapperFeature.USE_ANNOTATIONS, false); + final ObjectMapper mapper = JsonMapper.builder().configure(MapperFeature.USE_ANNOTATIONS, false).build(); // When final JKubeConfiguration result = mapper.readValue( JKubeConfigurationTest.class.getResourceAsStream("/jkube-configuration.json"), From 833f55f9a925d3bf874f256f815d1c89ab122e81 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 20 Apr 2024 06:17:51 +0200 Subject: [PATCH 044/289] chore(deps): Bump org.apache.maven.plugins:maven-gpg-plugin (#2942) Bumps [org.apache.maven.plugins:maven-gpg-plugin](https://github.com/apache/maven-gpg-plugin) from 3.2.2 to 3.2.4. - [Release notes](https://github.com/apache/maven-gpg-plugin/releases) - [Commits](https://github.com/apache/maven-gpg-plugin/compare/maven-gpg-plugin-3.2.2...maven-gpg-plugin-3.2.4) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-gpg-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e19263a104..aa389003e1 100644 --- a/pom.xml +++ b/pom.xml @@ -112,7 +112,7 @@ 3.11.0 3.4.1 3.1.2 - 3.2.2 + 3.2.4 3.6.0 3.4.0 3.5.0 From a27c50800664652041651671fb5dea2e9ed33563 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Sun, 21 Apr 2024 08:10:24 +0200 Subject: [PATCH 045/289] ci: typo in release snapshot fixed message (#2946) Signed-off-by: Marc Nuri --- .jenkins/pipelines/release-snapshots.Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.jenkins/pipelines/release-snapshots.Jenkinsfile b/.jenkins/pipelines/release-snapshots.Jenkinsfile index 10212d5e0f..831385170e 100644 --- a/.jenkins/pipelines/release-snapshots.Jenkinsfile +++ b/.jenkins/pipelines/release-snapshots.Jenkinsfile @@ -34,7 +34,7 @@ pipeline { to: jKubeInfraEmail } fixed { - emailext subject: '[JKube] SNAPSHOT deployment: Bach to normal $BUILD_STATUS $PROJECT_NAME #$BUILD_NUMBER', + emailext subject: '[JKube] SNAPSHOT deployment: Back to normal $BUILD_STATUS $PROJECT_NAME #$BUILD_NUMBER', body: '''Check console output at $BUILD_URL to view the results.''', to: jKubeInfraEmail } From 07c7e1668c8f80147a26bdd1267e77d49d257af5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 06:29:36 +0200 Subject: [PATCH 046/289] chore(deps): Bump org.apache.maven:maven-archiver from 3.6.1 to 3.6.2 (#2943) Bumps [org.apache.maven:maven-archiver](https://github.com/apache/maven-archiver) from 3.6.1 to 3.6.2. - [Release notes](https://github.com/apache/maven-archiver/releases) - [Commits](https://github.com/apache/maven-archiver/compare/maven-archiver-3.6.1...maven-archiver-3.6.2) --- updated-dependencies: - dependency-name: org.apache.maven:maven-archiver dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- jkube-kit/parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index c1c725c13f..b914c15f76 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -48,7 +48,7 @@ 5.13.3.202401111512-r 0.38.22 3.0.2 - 3.6.1 + 3.6.2 3.8.1 3.3.1 3.9.0 From 932966e9a50e87b5588195770224b3dd30191b95 Mon Sep 17 00:00:00 2001 From: Sintivrousai <116221123+Sintivrousai@users.noreply.github.com> Date: Mon, 22 Apr 2024 07:30:04 +0300 Subject: [PATCH 047/289] fix: remove unused imports from KubernetesHelperTest #2926 (#2949) --- .../org/eclipse/jkube/kit/common/util/KubernetesHelperTest.java | 1 - 1 file changed, 1 deletion(-) 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 db64035c9b..0506d770d8 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 @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; From f9e53c1c86ce471eeddbeafcbccea2189bfae094 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 06:30:55 +0200 Subject: [PATCH 048/289] chore(deps): Bump actions/checkout from 4.1.2 to 4.1.3 (#2944) Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.2 to 4.1.3. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/9bb56186c3b09b4f86b1c65136769dd318469633...1d96c772d19495a3b5c517cd2bc0cb401ea0529f) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/license.yml | 2 +- .github/workflows/quickstarts.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/license.yml b/.github/workflows/license.yml index 0724a941a1..8ddb0a9697 100644 --- a/.github/workflows/license.yml +++ b/.github/workflows/license.yml @@ -40,7 +40,7 @@ jobs: repo.maven.apache.org:443 - name: Checkout - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 + uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f - name: Setup Java 11 uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 with: diff --git a/.github/workflows/quickstarts.yml b/.github/workflows/quickstarts.yml index a97b3d6d4b..77ea984f14 100644 --- a/.github/workflows/quickstarts.yml +++ b/.github/workflows/quickstarts.yml @@ -52,7 +52,7 @@ jobs: services.gradle.org:443 - name: Checkout - uses: actions/checkout@9bb56186c3b09b4f86b1c65136769dd318469633 + uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f - name: Setup Java 17 uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 with: From 503431cac9a6d8406737020cd80ca24058fa27f3 Mon Sep 17 00:00:00 2001 From: ngthhu <167511750+ngthhu@users.noreply.github.com> Date: Mon, 22 Apr 2024 13:49:32 +0700 Subject: [PATCH 049/289] refactor: remove unused import from KubernetesPluginRegisterTaskTest.java (#2927) (#2945) --- .../jkube/gradle/plugin/KubernetesPluginRegisterTaskTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/KubernetesPluginRegisterTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/KubernetesPluginRegisterTaskTest.java index 6b16e09c87..30a3e720b3 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/KubernetesPluginRegisterTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/KubernetesPluginRegisterTaskTest.java @@ -24,11 +24,10 @@ import org.eclipse.jkube.gradle.plugin.task.KubernetesLogTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesPushTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesRemoteDevTask; -import org.eclipse.jkube.gradle.plugin.task.KubernetesRemoteDevTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesResourceTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesUndeployTask; - import org.eclipse.jkube.gradle.plugin.task.KubernetesWatchTask; + import org.gradle.api.Project; import org.gradle.api.Task; import org.junit.jupiter.api.BeforeEach; From a6215610db7080f2f9394565240086f0da80275e Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Mon, 22 Apr 2024 17:06:38 +0200 Subject: [PATCH 050/289] chore: fix GitHub URLs for new org eclipse-jkube (#2950) Signed-off-by: Marc Nuri --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/ISSUE_TEMPLATE/enhancement.yml | 2 +- .github/ISSUE_TEMPLATE/task.yml | 2 +- .github/pull_request_template.md | 2 +- .jenkins/pipelines/sonar.Jenkinsfile | 2 +- BUILDING.md | 2 +- CHANGELOG.md | 4 ++-- CONTRIBUTING.md | 2 +- Jenkinsfile | 6 +++--- README.md | 8 ++++---- .../src/main/asciidoc/inc/examples/_fragments.adoc | 2 +- .../doc/src/main/asciidoc/inc/examples/_groovy.adoc | 2 +- .../docker/auth/ecr/AwsSdkAuthConfigFactory.java | 2 +- .../jkube/kit/common/util/JKubeProjectUtil.java | 4 ++-- .../org/eclipse/jkube/kit/common/ConfigsTest.java | 2 +- .../eclipse/jkube/kit/common/util/EnvUtilTest.java | 4 ++-- .../eclipse/jkube/kit/common/util/FileUtilTest.java | 2 +- .../jkube/kit/common/util/JKubeProjectUtilTest.java | 2 +- .../kit/config/image/ImageNameORASReferenceTest.java | 4 ++-- jkube-kit/doc/ci-docs.sh | 2 +- jkube-kit/doc/src/main/asciidoc/inc/_enricher.adoc | 6 +++--- jkube-kit/doc/src/main/asciidoc/inc/_faq.adoc | 10 +++++----- .../doc/src/main/asciidoc/inc/_integrations.adoc | 8 ++++---- .../src/main/asciidoc/inc/build/_jkube-build.adoc | 2 +- .../inc/enricher/_jkube_maven_scm_enricher.adoc | 12 ++++++------ .../doc/src/main/asciidoc/inc/generator/_api.adoc | 4 ++-- .../src/main/asciidoc/inc/generator/_overview.adoc | 2 +- .../asciidoc/inc/getting-started/_dockerfile.adoc | 2 +- .../inc/getting-started/_redhat_dev_sandbox.adoc | 2 +- .../asciidoc/inc/helm/_jkube_helm_multimodule.adoc | 2 +- .../main/asciidoc/inc/plugins/_jkube_plugins.adoc | 8 ++++---- .../enricher/generic/VolumePermissionEnricher.java | 4 ++-- .../enricher/generic/openshift/RouteEnricher.java | 2 +- .../kit/remotedev/RemoteDevelopmentServiceTest.java | 2 +- .../jkube/watcher/standard/DockerImageWatcher.java | 2 +- .../doc/src/main/asciidoc/inc/_introduction.adoc | 8 ++++---- .../src/it/simple-maven-scm/expected/kubernetes.yml | 6 +++--- .../it/src/it/simple-maven-scm/pom.xml | 6 +++--- .../src/it/simple-maven-scm/expected/openshift.yml | 4 ++-- .../it/src/it/simple-maven-scm/pom.xml | 6 +++--- pom.xml | 6 +++--- scripts/changelog.sh | 4 ++-- scripts/jrelease.java | 8 ++++---- 44 files changed, 88 insertions(+), 88 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index b37b028e71..019f9be3e9 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -21,7 +21,7 @@ body: attributes: value: | ### Creating a new Bug 🐞 - 🔍 Before opening a new issue please search existing issues at https://github.com/eclipse/jkube/issues + 🔍 Before opening a new issue please search existing issues at https://github.com/eclipse-jkube/jkube/issues 🤔 To make it easier for us to help you, please include as much useful information as possible. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 3a8753c79b..4bb7a103c8 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -21,7 +21,7 @@ contact_links: url: https://accounts.eclipse.org/mailing-list/jkube-dev about: Eclipse JKube Developer Discussions - name: Eclipse JKube GitHub Discussions - url: https://github.com/eclipse/jkube/discussions + url: https://github.com/eclipse-jkube/jkube/discussions about: Eclipse JKube GitHub Discussions - name: Stack Overflow url: https://stackoverflow.com/questions/tagged/jkube diff --git a/.github/ISSUE_TEMPLATE/enhancement.yml b/.github/ISSUE_TEMPLATE/enhancement.yml index f184919d7a..d6c3d1484a 100644 --- a/.github/ISSUE_TEMPLATE/enhancement.yml +++ b/.github/ISSUE_TEMPLATE/enhancement.yml @@ -21,7 +21,7 @@ body: attributes: value: | ### Suggesting a new enhancement💡 - 🔍 Before opening a new issue please search existing issues at https://github.com/eclipse/jkube/issues + 🔍 Before opening a new issue please search existing issues at https://github.com/eclipse-jkube/jkube/issues 🤔 To make it easier for us to help you, please include as much useful information as possible. diff --git a/.github/ISSUE_TEMPLATE/task.yml b/.github/ISSUE_TEMPLATE/task.yml index f1bb632852..727388816a 100644 --- a/.github/ISSUE_TEMPLATE/task.yml +++ b/.github/ISSUE_TEMPLATE/task.yml @@ -21,7 +21,7 @@ body: attributes: value: | ### Suggesting a new task 🔧 - 🔍 Before opening a new issue please search existing issues at https://github.com/eclipse/jkube/issues + 🔍 Before opening a new issue please search existing issues at https://github.com/eclipse-jkube/jkube/issues 🤔 To make it easier for us to help you, please include as much useful information as possible. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 76b23d759f..d99139378d 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -33,7 +33,7 @@ What types of changes does your code introduce? Put an `x` in all the boxes that - [ ] I tested my code in OpenShift https://jkube.example.com - https://github.com/eclipse/jkube + https://github.com/eclipse-jkube/jkube diff --git a/jkube-kit/doc/src/main/asciidoc/inc/plugins/_jkube_plugins.adoc b/jkube-kit/doc/src/main/asciidoc/inc/plugins/_jkube_plugins.adoc index 3f1f893268..6db18e7e10 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/plugins/_jkube_plugins.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/plugins/_jkube_plugins.adoc @@ -6,7 +6,7 @@ jkube-plugins are enabled by just declaring a dependency in the plugin declarati ifeval::["{plugin-type}" == "gradle"] -The following example is from https://github.com/eclipse/jkube/tree/master/quickstarts/gradle/plugin[quickstarts/gradle/plugin] +The following example is from https://github.com/eclipse-jkube/jkube/tree/master/quickstarts/gradle/plugin[quickstarts/gradle/plugin] JKube Plugin is defined under Gradle's `buildSrc` directory which is automatically added to build script classpath by Gradle. @@ -32,7 +32,7 @@ JKube Plugin is defined under Gradle's `buildSrc` directory which is automatical ---- endif::[] ifeval::["{plugin-type}" == "maven"] -The following example is from https://github.com/eclipse/jkube/tree/master/quickstarts/maven/plugin[quickstarts/maven/plugin] +The following example is from https://github.com/eclipse-jkube/jkube/tree/master/quickstarts/maven/plugin[quickstarts/maven/plugin] [source,xml,indent=0,subs="verbatim,quotes,attributes"] ---- @@ -87,8 +87,8 @@ JKube plugin would need to implement `org.eclipse.jkube.api.JKubePlugin` interfa ifeval::["{plugin-type}" == "gradle"] -Check out https://github.com/eclipse/jkube/tree/master/quickstarts/gradle/plugin[`quickstarts/gradle/plugin`] for a fully working example. +Check out https://github.com/eclipse-jkube/jkube/tree/master/quickstarts/gradle/plugin[`quickstarts/gradle/plugin`] for a fully working example. endif::[] ifeval::["{plugin-type}" == "maven"] -Check out https://github.com/eclipse/jkube/tree/master/quickstarts/maven/plugin[`quickstarts/maven/plugin`] for a fully working example. +Check out https://github.com/eclipse-jkube/jkube/tree/master/quickstarts/maven/plugin[`quickstarts/maven/plugin`] for a fully working example. endif::[] diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/VolumePermissionEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/VolumePermissionEnricher.java index 74592d842c..abeef50d08 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/VolumePermissionEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/VolumePermissionEnricher.java @@ -210,7 +210,7 @@ private Map createResourcesMap(Configs.Config cpu, Configs.Con /** * Get useAnnotation from enricher configuration * TODO: This method is kept only for backward compatibility. This should - * be removed in future. See GitHub Issue for more details + * be removed in future. See GitHub Issue for more details * * @return boolean value indicating whether StorageClass annotation should be used or not */ @@ -222,7 +222,7 @@ public boolean shouldUseAnnotation() { * Get Default StorageClass from enricher configuration * * TODO: This method is kept only for backward compatibility. This should - * be removed in future. See GitHub Issue for more details + * be removed in future. See GitHub Issue for more details * @return default storage class */ public String getDefaultStorageClass() { diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricher.java index 82a715ce16..7379d8abb8 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricher.java @@ -153,7 +153,7 @@ static Route mergeRoute(Route routeFromFragment, Route opinionatedRoute) { * Update ApiVersion to route.openshift.io/v1. Plugin always generates an opinionated * Route with apiVersion 'route.openshift.io/v1'. However, when resource fragments are used * we get a route with apiVersion 'v1'. For more info, see: - * https://github.com/eclipse/jkube/issues/383 + * https://github.com/eclipse-jkube/jkube/issues/383 */ if (routeFromFragment.getApiVersion().equals("v1")) { routeFromFragment.setApiVersion(opinionatedRoute.getApiVersion()); diff --git a/jkube-kit/remote-dev/src/test/java/org/eclipse/jkube/kit/remotedev/RemoteDevelopmentServiceTest.java b/jkube-kit/remote-dev/src/test/java/org/eclipse/jkube/kit/remotedev/RemoteDevelopmentServiceTest.java index b68a1525c2..8039435955 100644 --- a/jkube-kit/remote-dev/src/test/java/org/eclipse/jkube/kit/remotedev/RemoteDevelopmentServiceTest.java +++ b/jkube-kit/remote-dev/src/test/java/org/eclipse/jkube/kit/remotedev/RemoteDevelopmentServiceTest.java @@ -113,7 +113,7 @@ void startInitsIfLocalPortAvailable() { @Test @DisplayName("start fails if LocalPort for remote service is in use") - @DisabledOnJre(value = JRE.JAVA_8, disabledReason = "ServerSocket isn't throwing Bind exception for a port already in use on Eclipse CI with JDK8, see https://github.com/eclipse/jkube/issues/2576") + @DisabledOnJre(value = JRE.JAVA_8, disabledReason = "ServerSocket isn't throwing Bind exception for a port already in use on Eclipse CI with JDK8, see https://github.com/eclipse-jkube/jkube/issues/2576") void startFailsIfLocalPortInUse() { final int localPort = IoUtil.getFreeRandomPort(); RemoteService remoteService = RemoteService.builder() diff --git a/jkube-kit/watcher/standard/src/main/java/org/eclipse/jkube/watcher/standard/DockerImageWatcher.java b/jkube-kit/watcher/standard/src/main/java/org/eclipse/jkube/watcher/standard/DockerImageWatcher.java index c9ab8a87d1..ad6150104a 100644 --- a/jkube-kit/watcher/standard/src/main/java/org/eclipse/jkube/watcher/standard/DockerImageWatcher.java +++ b/jkube-kit/watcher/standard/src/main/java/org/eclipse/jkube/watcher/standard/DockerImageWatcher.java @@ -86,7 +86,7 @@ public DockerImageWatcher(WatcherContext watcherContext) { @Override public boolean isApplicable(List configs, Collection resources, PlatformMode mode) { // TODO: There's no reason for this watcher to work only on Kubernetes at least for some of the modes - // https://github.com/eclipse/jkube/issues/422 + // https://github.com/eclipse-jkube/jkube/issues/422 return mode == PlatformMode.kubernetes; } diff --git a/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/_introduction.adoc b/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/_introduction.adoc index b6c229335e..d1b2b0e578 100644 --- a/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/_introduction.adoc +++ b/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/_introduction.adoc @@ -99,7 +99,7 @@ Let's have a look at some code. The following examples will demonstrate all thre This minimal but full working example `pom.xml` shows how a simple spring boot application can be dockerized and prepared for Kubernetes. The full example can be found in directory -https://github.com/eclipse/jkube/tree/master/quickstarts/maven/zero-config[quickstarts/maven/zero-config]. +https://github.com/eclipse-jkube/jkube/tree/master/quickstarts/maven/zero-config[quickstarts/maven/zero-config]. .Example [source,xml,indent=0,subs="verbatim,quotes,attributes"] @@ -239,7 +239,7 @@ The plugin configuration can be roughly divided into the following sections: * `` configures various aspects of <> for creating or enhancing resource descriptors. A working example can be found in the -https://github.com/eclipse/jkube/tree/master/quickstarts/maven/xml-config[quickstarts/maven/xml-config] directory. +https://github.com/eclipse-jkube/jkube/tree/master/quickstarts/maven/xml-config[quickstarts/maven/xml-config] directory. An extract of the plugin configuration is shown below: .Example for an XML configuration @@ -351,7 +351,7 @@ An extract of the plugin configuration is shown below: <9> ServiceAccount(s) to create <10> Annotations which should be applied either to all or to specific resources <11> Annotations applied to Deployment resources only -<12> Annotations with a special character, a slash in this case +<12> Annotations with a special character, a slash in this case <13> ConfigMap to be created <14> ConfigMap data entry as a string key value pair <15> ConfigMap data entry with value as file path, file's contents are loaded into ConfigMap as key value @@ -367,7 +367,7 @@ The third configuration option is to use an external configuration in form of YA Note: In order to support simultaneously both OpenShift and Kubernetes, there is currently no way to specify OpenShift-only features this way, though this might change in future releases. Let's have a look at an example from -https://github.com/eclipse/jkube/tree/master/quickstarts/maven/external-resources[quickstarts/maven/external-resources]. +https://github.com/eclipse-jkube/jkube/tree/master/quickstarts/maven/external-resources[quickstarts/maven/external-resources]. This is a plain Spring Boot application, whose images are auto generated like in the <> case. The resource fragments are in `src/main/jkube`. diff --git a/kubernetes-maven-plugin/it/src/it/simple-maven-scm/expected/kubernetes.yml b/kubernetes-maven-plugin/it/src/it/simple-maven-scm/expected/kubernetes.yml index 01834bb7a6..18f35be2f7 100644 --- a/kubernetes-maven-plugin/it/src/it/simple-maven-scm/expected/kubernetes.yml +++ b/kubernetes-maven-plugin/it/src/it/simple-maven-scm/expected/kubernetes.yml @@ -25,7 +25,7 @@ items: jkube.eclipse.org/git-branch: "@ignore@" prometheus.io/port: "9779" jkube.eclipse.org/scm-tag: "HEAD" - jkube.eclipse.org/scm-url: "git://github.com/jkubeio/kubernetes-maven-plugin.git" + jkube.eclipse.org/scm-url: "git://github.com/eclipse-jkube/jkube.git" labels: provider: jkube app: jkube-maven-sample-zero-config @@ -49,7 +49,7 @@ items: jkube.eclipse.org/git-commit: "@ignore@" jkube.eclipse.org/git-branch: "@ignore@" jkube.eclipse.org/scm-tag: "HEAD" - jkube.eclipse.org/scm-url: "git://github.com/jkubeio/kubernetes-maven-plugin.git" + jkube.eclipse.org/scm-url: "git://github.com/eclipse-jkube/jkube.git" labels: provider: jkube app: jkube-maven-sample-zero-config @@ -69,7 +69,7 @@ items: jkube.eclipse.org/git-commit: "@ignore@" jkube.eclipse.org/git-branch: "@ignore@" jkube.eclipse.org/scm-tag: "HEAD" - jkube.eclipse.org/scm-url: "git://github.com/jkubeio/kubernetes-maven-plugin.git" + jkube.eclipse.org/scm-url: "git://github.com/eclipse-jkube/jkube.git" labels: provider: jkube app: jkube-maven-sample-zero-config diff --git a/kubernetes-maven-plugin/it/src/it/simple-maven-scm/pom.xml b/kubernetes-maven-plugin/it/src/it/simple-maven-scm/pom.xml index 4cbec4c546..6e0b5e024e 100644 --- a/kubernetes-maven-plugin/it/src/it/simple-maven-scm/pom.xml +++ b/kubernetes-maven-plugin/it/src/it/simple-maven-scm/pom.xml @@ -30,9 +30,9 @@ - scm:git:git://github.com/jkubeio/kubernetes-maven-plugin.git - scm:git:git://github.com/jkubeio/kubernetes-maven-plugin.git - git://github.com/jkubeio/kubernetes-maven-plugin.git + scm:git:git://github.com/eclipse-jkube/jkube.git + scm:git:git://github.com/eclipse-jkube/jkube.git + git://github.com/eclipse-jkube/jkube.git diff --git a/openshift-maven-plugin/it/src/it/simple-maven-scm/expected/openshift.yml b/openshift-maven-plugin/it/src/it/simple-maven-scm/expected/openshift.yml index 25d58fbc91..003cab39c2 100644 --- a/openshift-maven-plugin/it/src/it/simple-maven-scm/expected/openshift.yml +++ b/openshift-maven-plugin/it/src/it/simple-maven-scm/expected/openshift.yml @@ -25,7 +25,7 @@ items: jkube.eclipse.org/git-branch: "@ignore@" prometheus.io/port: "9779" jkube.eclipse.org/scm-tag: "HEAD" - jkube.eclipse.org/scm-url: "git://github.com/jkubeio/openshift-maven-plugin.git" + jkube.eclipse.org/scm-url: "git://github.com/eclipse-jkube/jkube.git" labels: provider: jkube app: jkube-maven-sample-zero-config @@ -49,7 +49,7 @@ items: jkube.eclipse.org/git-commit: "@ignore@" jkube.eclipse.org/git-branch: "@ignore@" jkube.eclipse.org/scm-tag: "HEAD" - jkube.eclipse.org/scm-url: "git://github.com/jkubeio/openshift-maven-plugin.git" + jkube.eclipse.org/scm-url: "git://github.com/eclipse-jkube/jkube.git" labels: provider: jkube app: jkube-maven-sample-zero-config diff --git a/openshift-maven-plugin/it/src/it/simple-maven-scm/pom.xml b/openshift-maven-plugin/it/src/it/simple-maven-scm/pom.xml index d3f1020fca..1745e2ed1c 100644 --- a/openshift-maven-plugin/it/src/it/simple-maven-scm/pom.xml +++ b/openshift-maven-plugin/it/src/it/simple-maven-scm/pom.xml @@ -30,9 +30,9 @@ - scm:git:git://github.com/jkubeio/openshift-maven-plugin.git - scm:git:git://github.com/jkubeio/openshift-maven-plugin.git - git://github.com/jkubeio/openshift-maven-plugin.git + scm:git:git://github.com/eclipse-jkube/jkube.git + scm:git:git://github.com/eclipse-jkube/jkube.git + git://github.com/eclipse-jkube/jkube.git diff --git a/pom.xml b/pom.xml index aa389003e1..7469fb369f 100644 --- a/pom.xml +++ b/pom.xml @@ -46,10 +46,10 @@ - scm:git:git://github.com/eclipse/jkube.git - scm:git:ssh://git@github.com/eclipse/jkube.git + scm:git:git://github.com/eclipse-jkube/jkube.git + scm:git:ssh://git@github.com/eclipse-jkube/jkube.git HEAD - git://github.com/eclipse/jkube.git + git://github.com/eclipse-jkube/jkube.git diff --git a/scripts/changelog.sh b/scripts/changelog.sh index 3cb6494076..c2a31dd9b6 100755 --- a/scripts/changelog.sh +++ b/scripts/changelog.sh @@ -70,7 +70,7 @@ function addLinks() { lines+="$line\n"; else lines+="$line [$currentLink]\n" - links+="[$currentLink] https://github.com/eclipse/jkube/issues/$issueNumber\n" + links+="[$currentLink] https://github.com/eclipse-jkube/jkube/issues/$issueNumber\n" currentLink=$((currentLink + 1)); fi done < <(echo "$1") @@ -118,7 +118,7 @@ function emailTemplate() { lines+="[1] https://repo1.maven.org/maven2/org/eclipse/jkube/kubernetes-maven-plugin/$1/\n" lines+="[2] https://www.eclipse.dev/jkube/docs/migration-guide/\n" lines+="$changelogLinks\n" - lines+="$githubLinkId https://github.com/eclipse/jkube\n" + lines+="$githubLinkId https://github.com/eclipse-jkube/jkube\n" lines+="$gitterLinkId https://gitter.im/eclipse/jkube\n" echo -e "$lines" } diff --git a/scripts/jrelease.java b/scripts/jrelease.java index 151cf5c7f9..0b388c7580 100644 --- a/scripts/jrelease.java +++ b/scripts/jrelease.java @@ -175,7 +175,7 @@ public static void main(String... args) throws Exception { System.in.read(); // 17. Tag new release in https://github.com/jkubeio/jkube-website - printStep(17, "Tag new release in https://github.com/jkubeio/jkube-website (keep empty title/description)"); + printStep(17, "Tag new release in https://github.com/eclipse-jkube/jkube-website (keep empty title/description)"); print("Press enter to continue"); System.in.read(); @@ -190,7 +190,7 @@ public static void main(String... args) throws Exception { print(""); print("📢 Please help us spread the word & share your experience @jkubeio"); print(""); - print("https://github.com/eclipse/jkube/releases/tag/v" + nextReleaseVersion); + print("https://github.com/eclipse-jkube/jkube/releases/tag/v" + nextReleaseVersion); print(""); print("Press enter to continue"); System.in.read(); @@ -206,7 +206,7 @@ public static void main(String... args) throws Exception { print(""); print("📢 Please help us spread the word & share your experience https://twitter.com/jkubeio"); print(""); - print("https://github.com/eclipse/jkube/releases/tag/v" + nextReleaseVersion); + print("https://github.com/eclipse-jkube/jkube/releases/tag/v" + nextReleaseVersion); print(""); print("Press enter to continue"); System.in.read(); @@ -218,7 +218,7 @@ public static void main(String... args) throws Exception { // 21. Run the Gradle verification test printStep(21, - "Run the Gradle verification test: https://github.com/jkubeio/jkube-integration-tests/actions/workflows/smoke-tests.yml"); + "Run the Gradle verification test: https://github.com/eclipse-jkube/jkube-integration-tests/actions/workflows/smoke-tests.yml"); print("Press enter to continue"); System.in.read(); From fb8e7da005b3a6685590c80fc10f1a8a5501271f Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Tue, 23 Apr 2024 09:28:27 +0530 Subject: [PATCH 051/289] fix (jkube-kit): Sanitize VCS remote URL used in `jkube.eclipse.org/git-url` annotation (#2831) * fix (jkube-kit) : Sanitize VCS remote URL used in `jkube.eclipse.org/git-url` annotation Sanitize Git Remote URL before adding it to Git annotations. * review: sanitize url * fix: remove misleading URL from Javadoc --- CHANGELOG.md | 1 + .../jkube/kit/common/util/GitUtil.java | 40 ++++- .../jkube/kit/common/util/GitUtilTest.java | 140 ++++++++++++++++++ .../jkube/enricher/generic/GitEnricher.java | 4 +- .../enricher/generic/GitEnricherTest.java | 20 +++ 5 files changed, 200 insertions(+), 5 deletions(-) create mode 100644 jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/GitUtilTest.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 56760de027..27bcb7d3bd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ Usage: ### 1.17-SNAPSHOT * Fix #2335: Add support for configuring nodeSelector spec for controller via xml/groovy DSL configuration * Fix #2459: Allow configuring Buildpacks build via ImageConfiguration +* Fix #2662: Sanitize VCS remote URL used in `jkube.eclipse.org/git-url` annotation * Fix #2860: Correctly pass Docker build-arg from the build configuration to the Openshift build strategy ### 1.16.2 (2024-03-27) diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/GitUtil.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/GitUtil.java index 8209adb982..98324612c1 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/GitUtil.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/GitUtil.java @@ -13,15 +13,18 @@ */ package org.eclipse.jkube.kit.common.util; -import java.io.File; -import java.io.IOException; -import java.util.stream.StreamSupport; - +import org.apache.commons.lang3.StringUtils; import org.eclipse.jgit.api.Git; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.lib.Repository; import org.eclipse.jgit.revwalk.RevCommit; import org.eclipse.jgit.storage.file.FileRepositoryBuilder; +import org.eclipse.jgit.transport.URIish; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.util.stream.StreamSupport; /** * @author roland @@ -69,4 +72,33 @@ public static String getGitCommitId(Repository repository) throws GitAPIExceptio } return null; } + + /** + * Sanitize Git Repository's remote URL, trims username and access token from URL. + * + * @param remoteUrlStr URL string of a particular git remote + * @return sanitized URL + */ + public static String sanitizeRemoteUrl(String remoteUrlStr) { + if (StringUtils.isBlank(remoteUrlStr)) { + return remoteUrlStr; + } + try { + URIish uri = new URIish(remoteUrlStr); + final StringBuilder userInfo = new StringBuilder(); + if (StringUtils.isNotBlank(uri.getUser())) { + userInfo.append(uri.getUser()); + } + if (StringUtils.isNotBlank(uri.getPass())) { + userInfo.append(":").append(uri.getPass()); + } + if (userInfo.length() > 0) { + remoteUrlStr = remoteUrlStr.replace(userInfo + "@", ""); + } + return remoteUrlStr; + } catch (URISyntaxException e) { + //NO OP - Not a valid URL + } + return remoteUrlStr; + } } diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/GitUtilTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/GitUtilTest.java new file mode 100644 index 0000000000..bf78b480ed --- /dev/null +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/GitUtilTest.java @@ -0,0 +1,140 @@ +/* + * 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.util; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Files; + +import org.eclipse.jgit.api.Git; +import org.eclipse.jgit.api.errors.GitAPIException; +import org.eclipse.jgit.lib.Repository; +import org.eclipse.jgit.transport.URIish; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +import static org.assertj.core.api.Assertions.assertThat; + +class GitUtilTest { + @TempDir + private File temporaryFolder; + + @Test + void getGitRepository_whenNoGitFolderFound_thenReturnNull() throws IOException { + assertThat(GitUtil.getGitRepository(temporaryFolder)).isNull(); + } + + @Test + void getGitRepository_whenValidGitRepositoryPresent_thenReturnGitRepository() throws IOException, URISyntaxException, GitAPIException { + try (Git ignore = createDummyGitRepository(temporaryFolder)) { + // Given + // When + Repository repository = GitUtil.getGitRepository(temporaryFolder); + + // Then + assertThat(repository) + .isNotNull() + .satisfies(r -> assertThat(r.getBranch()).isEqualTo("test-branch")) + .satisfies(r -> assertThat(r.getDirectory()).isEqualTo(temporaryFolder.toPath().resolve(".git").toFile())); + } + } + + @Test + void getGitCommitId_whenValidRepository_thenReturnValidCommit() throws IOException, GitAPIException, URISyntaxException { + try (Git ignore = createDummyGitRepository(temporaryFolder)) { + // Given + Repository repository = GitUtil.getGitRepository(temporaryFolder); + + // When + Then + assertThat(GitUtil.getGitCommitId(repository)).isNotBlank().hasSize(40); + } + } + + @Test + void getCommitId_whenNullRepository_thenReturnNull() throws GitAPIException { + assertThat(GitUtil.getGitCommitId(null)).isNull(); + } + + @Test + void findGitFolder_whenGitFolderAbsent_thenReturnNull() { + assertThat(GitUtil.findGitFolder(temporaryFolder)).isNull(); + } + + @Test + void findGitFolder_whenGitFolderInSameDirectory_thenReturnFolder() throws GitAPIException, URISyntaxException { + try (Git ignore = createDummyGitRepository(temporaryFolder)) { + assertThat(GitUtil.findGitFolder(temporaryFolder)).isEqualTo(new File(temporaryFolder, ".git")); + } + } + + @Test + void findGitFolder_whenGitFolderInParentDirectory_thenReturnFolder() throws GitAPIException, URISyntaxException, IOException { + File childFolder = temporaryFolder.toPath().resolve("subfolder").toFile(); + Files.createDirectory(childFolder.toPath()); + try (Git ignore = createDummyGitRepository(temporaryFolder)) { + assertThat(GitUtil.findGitFolder(childFolder)).isEqualTo(new File(temporaryFolder, ".git")); + } + } + + // These test cases are taken from https://stackoverflow.com/questions/31801271/what-are-the-supported-git-url-formats + @ParameterizedTest(name = "{0} should be sanitized to {1}") + @CsvSource({ + ",", + "https://user:password@example.com/repo.git?queryParam,https://example.com/repo.git?queryParam", + "git://user:password@example.com/repo.git?queryParam, git://example.com/repo.git?queryParam", + "user@example.com:repo.git, example.com:repo.git", + "user:password@example.com:repo.git, example.com:repo.git", + "git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git, git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git", + "https://@some.host/foo/bar, https://@some.host/foo/bar", + "https://secrettoken:x-oauth-basic@host.xz/path/to/repo.git, https://host.xz/path/to/repo.git", + "https://gitlab-ci-token:secrettoken@gitlab.onprem.com/project.git, https://gitlab.onprem.com/project.git", + "git@github.com:myorg/myproject.git, github.com:myorg/myproject.git", + "https://github.com/myorg/myproject.git, https://github.com/myorg/myproject.git", + "https://gitlab.com/foo/bar.git, https://gitlab.com/foo/bar.git", + "git@gitlab.com:foo/bar.git, gitlab.com:foo/bar.git", + "git+ssh://git@gitlab.com/foo/bar.git, git+ssh://gitlab.com/foo/bar.git", + "git+ssh://git@gitlab.com/foo/bar, git+ssh://gitlab.com/foo/bar", + "git://host.xz/~user/path/to/repo.git, git://host.xz/~user/path/to/repo.git", + "rsync://host.xz/path/to/repo.git,rsync://host.xz/path/to/repo.git", + "ssh://user@host.xz:8080/path/to/repo.git, ssh://host.xz:8080/path/to/repo.git", + "ssh://user@host.xz/path/to/repo.git, ssh://host.xz/path/to/repo.git", + "ssh://host.xz:8080/path/to/repo.git, ssh://host.xz:8080/path/to/repo.git", + "ssh://host.xz/path/to/repo.git, ssh://host.xz/path/to/repo.git", + "ssh://user@host.xz/~user/path/to/repo.git, ssh://host.xz/~user/path/to/repo.git", + "ssh://host.xz/~user/path/to/repo.git, ssh://host.xz/~user/path/to/repo.git", + "ssh://user@host.xz/~/path/to/repo.git, ssh://host.xz/~/path/to/repo.git", + "ssh://host.xz/~/path/to/repo.git, ssh://host.xz/~/path/to/repo.git", + "file:///path/to/repo.git, file:///path/to/repo.git", + "file://~/path/to/repo.git, file://~/path/to/repo.git", + "host.xz:path/to/repo.git, host.xz:path/to/repo.git", + "user@host.xz:path/to/repo.git, host.xz:path/to/repo.git", + "user@host.xz:~user/path/to/repo.git, host.xz:~user/path/to/repo.git", + "host.xz:~user/path/to/repo.git, host.xz:~user/path/to/repo.git", + "https://[::1]:456, https://[::1]:456" + }) + void sanitizeRemoteUrl_whenInvoked_shouldSanitize(String original, String expected) { + assertThat(GitUtil.sanitizeRemoteUrl(original)).isEqualTo(expected); + } + + private Git createDummyGitRepository(File gitFolder) throws GitAPIException, URISyntaxException { + Git git = Git.init().setDirectory(gitFolder).setInitialBranch("test-branch").call(); + git.add().addFilepattern(".").call(); + git.remoteAdd().setName("origin").setUri(new URIish("https://example.com/origin.git")).call(); + git.commit().setMessage("Initial commit").call(); + return git; + } +} diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/GitEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/GitEnricher.java index 4a4bf1f949..304a4f2832 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/GitEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/GitEnricher.java @@ -30,6 +30,8 @@ import java.util.HashMap; import java.util.Map; +import static org.eclipse.jkube.kit.common.util.GitUtil.sanitizeRemoteUrl; + /** * Enricher for adding build metadata: * @@ -54,7 +56,7 @@ private Map getAnnotations(PlatformMode platformMode) { try (Repository repository = GitUtil.getGitRepository(getContext().getProjectDirectory())) { // Git annotations (if git is used as SCM) if (repository != null) { - String gitRemoteUrl = getGitRemoteUrl(repository); + String gitRemoteUrl = sanitizeRemoteUrl(getGitRemoteUrl(repository)); if (gitRemoteUrl == null) { log.warn("Could not detect any git remote"); } diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/GitEnricherTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/GitEnricherTest.java index f2a65b84b8..7e75a3f7e9 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/GitEnricherTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/GitEnricherTest.java @@ -247,6 +247,26 @@ void whenGitRemotePropertySpecified_thenUseProvidedGitRemoteInAnnotations() thro .containsEntry("jkube.eclipse.org/git-url", "https://example.com/upstream.git"); } + @Test + @DisplayName("jkube.remoteName contains user crendentials, then sanitize git remote url") + void whenGitRemoteUrlContainsUserCredentials_thenSanitizeGitRemoteUrl() throws Exception { + // Given + git.remoteAdd().setName("upstream").setUri(new URIish("https://user:token@example.com/upstream.git")).call(); + properties.put("jkube.remoteName", "upstream"); + + // When + gitEnricher.enrich(PlatformMode.kubernetes, klb); + + // Then + HasMetadata result = klb.buildFirstItem(); + assertThat(result) + .extracting("metadata.annotations") + .asInstanceOf(InstanceOfAssertFactories.MAP) + .containsEntry("jkube.eclipse.org/git-branch", "test-branch") + .containsEntry("jkube.eclipse.org/git-commit", commit.getName()) + .containsEntry("jkube.eclipse.org/git-url", "https://example.com/upstream.git"); + } + @Test @DisplayName("git remote not found, then do not add git-url annotation") void whenRemoteNotFound_thenGitUrlAnnotationNotAdded() throws Exception { From 3cada4be11ba67539de8261aa5e9aca156f0a14b Mon Sep 17 00:00:00 2001 From: Mary Love Gurrieri <126700658+mgurrie@users.noreply.github.com> Date: Tue, 23 Apr 2024 01:05:00 -0400 Subject: [PATCH 052/289] fix: WildfyJarGenerator throws dedicated JKubeException --- .../jkube/wildfly/jar/generator/WildflyJARGenerator.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jkube-kit/jkube-kit-wildfly-jar/src/main/java/org/eclipse/jkube/wildfly/jar/generator/WildflyJARGenerator.java b/jkube-kit/jkube-kit-wildfly-jar/src/main/java/org/eclipse/jkube/wildfly/jar/generator/WildflyJARGenerator.java index 85ff74dbc2..79fbf13153 100644 --- a/jkube-kit/jkube-kit-wildfly-jar/src/main/java/org/eclipse/jkube/wildfly/jar/generator/WildflyJARGenerator.java +++ b/jkube-kit/jkube-kit-wildfly-jar/src/main/java/org/eclipse/jkube/wildfly/jar/generator/WildflyJARGenerator.java @@ -16,6 +16,7 @@ import org.eclipse.jkube.generator.api.GeneratorContext; import org.eclipse.jkube.generator.javaexec.JavaExecGenerator; import org.eclipse.jkube.kit.common.AssemblyFileSet; +import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.Plugin; import org.eclipse.jkube.kit.common.util.JKubeProjectUtil; @@ -89,9 +90,10 @@ protected List addAdditionalFiles() { parentDir = repoDir.getParent(); } if (Files.notExists(repoDir)) { - throw new RuntimeException("Error, WildFly bootable JAR generator can't retrieve " + throw new JKubeException("Error, WildFly bootable JAR generator can't retrieve " + "generated maven local cache, directory " + repoDir + " doesn't exist."); } + set.add(AssemblyFileSet.builder() .directory(parentDir.toFile()) .include(localRepoCache.getFileName().toString()) From c38d3e2d23ee50cdb272717523f3f52964dc4786 Mon Sep 17 00:00:00 2001 From: Clarence Dimitri CHARLES Date: Tue, 23 Apr 2024 09:40:41 +0200 Subject: [PATCH 053/289] fix: remove redundant null check for gitFolder in getGitRepository method (2947) * Raise an NPE if currentDir is Null * Remove the null-check --- .../main/java/org/eclipse/jkube/kit/common/util/GitUtil.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/GitUtil.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/GitUtil.java index 98324612c1..996f77e646 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/GitUtil.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/GitUtil.java @@ -36,10 +36,6 @@ private GitUtil() { } public static Repository getGitRepository(File currentDir) throws IOException { - if (currentDir == null) { - // TODO: Why is this check needed ? - currentDir = new File(System.getProperty("basedir", ".")); - } File gitFolder = findGitFolder(currentDir); if (gitFolder == null) { // No git repository found From f19031c028acbc64dd752794143886e93440412f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Apr 2024 16:04:11 +0200 Subject: [PATCH 054/289] chore(deps): Bump com.marcnuri.helm-java:helm-java from 0.0.6 to 0.0.7 Bumps [com.marcnuri.helm-java:helm-java](https://github.com/manusa/helm-java) from 0.0.6 to 0.0.7. - [Release notes](https://github.com/manusa/helm-java/releases) - [Commits](https://github.com/manusa/helm-java/compare/v0.0.6...v0.0.7) --- updated-dependencies: - dependency-name: com.marcnuri.helm-java:helm-java dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7469fb369f..6c556e58c2 100644 --- a/pom.xml +++ b/pom.xml @@ -100,7 +100,7 @@ 0.0.5 3.0.19 33.1.0-jre - 0.0.6 + 0.0.7 2.17.0 0.8.12 2.5.0 From f4fd1ce7b910a1ef4577bb26a64fe49d3973653f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Apr 2024 16:06:51 +0200 Subject: [PATCH 055/289] chore(deps): Bump version.kubernetes-client from 6.11.0 to 6.12.1 Bumps `version.kubernetes-client` from 6.11.0 to 6.12.1. Updates `io.fabric8:kubernetes-client` from 6.11.0 to 6.12.1 - [Release notes](https://github.com/fabric8io/kubernetes-client/releases) - [Changelog](https://github.com/fabric8io/kubernetes-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/fabric8io/kubernetes-client/compare/v6.11.0...v6.12.1) Updates `io.fabric8:kubernetes-client-api` from 6.11.0 to 6.12.1 - [Release notes](https://github.com/fabric8io/kubernetes-client/releases) - [Changelog](https://github.com/fabric8io/kubernetes-client/blob/main/CHANGELOG.md) - [Commits](https://github.com/fabric8io/kubernetes-client/compare/v6.11.0...v6.12.1) Updates `io.fabric8:mockwebserver` from 6.11.0 to 6.12.1 Updates `io.fabric8:openshift-server-mock` from 6.11.0 to 6.12.1 --- updated-dependencies: - dependency-name: io.fabric8:kubernetes-client dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: io.fabric8:kubernetes-client-api dependency-type: direct:production update-type: version-update:semver-minor - dependency-name: io.fabric8:mockwebserver dependency-type: direct:development update-type: version-update:semver-minor - dependency-name: io.fabric8:openshift-server-mock dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6c556e58c2..f6d6d7225c 100644 --- a/pom.xml +++ b/pom.xml @@ -105,7 +105,7 @@ 0.8.12 2.5.0 5.10.2 - 6.11.0 + 6.12.1 4.2 1.18.32 1.18.20.0 From bb2e8f77ecdd8b39d47f5f3272af7fe2d1fc1bdd Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 23 Apr 2024 16:08:37 +0200 Subject: [PATCH 056/289] chore(deps): Bump org.codehaus.groovy:groovy-all from 3.0.19 to 3.0.21 Bumps [org.codehaus.groovy:groovy-all](https://github.com/apache/groovy) from 3.0.19 to 3.0.21. - [Commits](https://github.com/apache/groovy/commits) --- updated-dependencies: - dependency-name: org.codehaus.groovy:groovy-all dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f6d6d7225c..2dad0c60db 100644 --- a/pom.xml +++ b/pom.xml @@ -98,7 +98,7 @@ 2.15.1 7.6.2 0.0.5 - 3.0.19 + 3.0.21 33.1.0-jre 0.0.7 2.17.0 From bd47e1e5e369c451d58d2d7423d906c44a4caa00 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Apr 2024 06:39:14 +0200 Subject: [PATCH 057/289] chore(deps): Bump com.mycila:license-maven-plugin from 4.2 to 4.3 Bumps com.mycila:license-maven-plugin from 4.2 to 4.3. --- updated-dependencies: - dependency-name: com.mycila:license-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2dad0c60db..b937eabb68 100644 --- a/pom.xml +++ b/pom.xml @@ -106,7 +106,7 @@ 2.5.0 5.10.2 6.12.1 - 4.2 + 4.3 1.18.32 1.18.20.0 3.11.0 From 5b9a1bb27a11b3bc82ae3549f08e7291ccdacef3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Apr 2024 06:39:21 +0200 Subject: [PATCH 058/289] chore(deps): Bump org.apache.maven.plugins:maven-javadoc-plugin Bumps [org.apache.maven.plugins:maven-javadoc-plugin](https://github.com/apache/maven-javadoc-plugin) from 3.5.0 to 3.6.3. - [Release notes](https://github.com/apache/maven-javadoc-plugin/releases) - [Commits](https://github.com/apache/maven-javadoc-plugin/compare/maven-javadoc-plugin-3.5.0...maven-javadoc-plugin-3.6.3) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-javadoc-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index b937eabb68..becfe48e08 100644 --- a/pom.xml +++ b/pom.xml @@ -115,7 +115,7 @@ 3.2.4 3.6.0 3.4.0 - 3.5.0 + 3.6.3 3.12.0 3.0.1 3.3.1 From a0cbf0d279ed370bda692d55e590c4b7fe8ba29a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 24 Apr 2024 06:39:28 +0200 Subject: [PATCH 059/289] chore(deps-dev): Bump org.assertj:assertj-core from 3.24.2 to 3.25.3 Bumps [org.assertj:assertj-core](https://github.com/assertj/assertj) from 3.24.2 to 3.25.3. - [Release notes](https://github.com/assertj/assertj/releases) - [Commits](https://github.com/assertj/assertj/compare/assertj-build-3.24.2...assertj-build-3.25.3) --- updated-dependencies: - dependency-name: org.assertj:assertj-core dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index becfe48e08..fc062fb083 100644 --- a/pom.xml +++ b/pom.xml @@ -92,7 +92,7 @@ false 2.2.4 2.3.0 - 3.24.2 + 3.25.3 3.4.0 1.26.1 2.15.1 From f5bfbe963d9d77fc89ddfddcb4a803351430ad35 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Wed, 24 Apr 2024 12:32:57 +0530 Subject: [PATCH 060/289] feat(jkube-kit/config/service): DebugService throws exception in `buildpacks` build strategy + Add DebugContext POJO for storing debug goal related attributes from Mojo/Tasks to DebugService + Add boolean field `supportsDebug` in JKubeBuildStrategy to indicate whether debug is supported in a particular build strategy. + Add conditional statement in DebugService's debug method to throw exception when `supportsDebug` evaluates to `false` --- CHANGELOG.md | 1 + .../plugin/task/KubernetesDebugTask.java | 13 ++++-- .../plugin/task/KubernetesDebugTaskTest.java | 11 ++++- .../plugin/task/OpenShiftDebugTaskTest.java | 10 +++- .../image/build/JKubeBuildStrategy.java | 12 +++-- .../kit/config/service/DebugContext.java | 36 +++++++++++++++ .../kit/config/service/DebugService.java | 17 ++++--- .../kit/config/service/DebugServiceTest.java | 46 +++++++++++++++++-- .../maven/plugin/mojo/develop/DebugMojo.java | 11 ++++- .../plugin/mojo/develop/DebugMojoTest.java | 16 ++++--- 10 files changed, 140 insertions(+), 33 deletions(-) create mode 100644 jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/DebugContext.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 27bcb7d3bd..23ba35cac3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ Usage: ### 1.17-SNAPSHOT * Fix #2335: Add support for configuring nodeSelector spec for controller via xml/groovy DSL configuration * Fix #2459: Allow configuring Buildpacks build via ImageConfiguration +* Fix #2462: `k8s:debug` throws error when using `buildpacks` build strategy * Fix #2662: Sanitize VCS remote URL used in `jkube.eclipse.org/git-url` annotation * Fix #2860: Correctly pass Docker build-arg from the build configuration to the Openshift build strategy diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesDebugTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesDebugTask.java index a5f02eae4a..0a70bb8c41 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesDebugTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesDebugTask.java @@ -24,6 +24,7 @@ import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.client.KubernetesClient; +import org.eclipse.jkube.kit.config.service.DebugContext; import org.gradle.api.GradleException; public class KubernetesDebugTask extends AbstractJKubeTask { @@ -40,10 +41,14 @@ public void run() { try (KubernetesClient kubernetes = jKubeServiceHub.getClient()) { final File manifest = getManifest(kubernetes); final List entities = KubernetesHelper.loadResources(manifest); - jKubeServiceHub.getDebugService().debug( - kubernetesExtension.getNamespaceOrNull(), manifest.getName(), entities, - "" + kubernetesExtension.getLocalDebugPortOrDefault(), kubernetesExtension.getDebugSuspendOrDefault(), - createLogger("[[Y]][W][[Y]] [[s]]")); + jKubeServiceHub.getDebugService().debug(DebugContext.builder() + .namespace(kubernetesExtension.getNamespaceOrNull()) + .fileName(manifest.getName()) + .localDebugPort("" + kubernetesExtension.getLocalDebugPortOrDefault()) + .debugSuspend(kubernetesExtension.getDebugSuspendOrDefault()) + .podWaitLog(createLogger("[[Y]][W][[Y]] [[s]]")) + .jKubeBuildStrategy(kubernetesExtension.getBuildStrategyOrDefault()) + .build(), entities); } catch (IOException ex) { throw new GradleException("Failure in debug task", ex); } diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesDebugTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesDebugTaskTest.java index d057830a6b..81b087d93f 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesDebugTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesDebugTaskTest.java @@ -18,17 +18,18 @@ import org.eclipse.jkube.gradle.plugin.GradleLogger; import org.eclipse.jkube.gradle.plugin.KubernetesExtension; import org.eclipse.jkube.gradle.plugin.TestKubernetesExtension; +import org.eclipse.jkube.kit.config.service.DebugContext; import org.eclipse.jkube.kit.config.service.DebugService; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.mockito.ArgumentCaptor; import org.mockito.MockedConstruction; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mockConstruction; import static org.mockito.Mockito.times; @@ -71,12 +72,18 @@ void runTask_withManifest_shouldStartDebug() throws Exception { // Given taskEnvironment.withKubernetesManifest(); final KubernetesDebugTask debugTask = new KubernetesDebugTask(KubernetesExtension.class); + ArgumentCaptor debugContextArgumentCaptor = ArgumentCaptor.forClass(DebugContext.class); // When debugTask.runTask(); // Then assertThat(debugServiceMockedConstruction.constructed()).hasSize(1); verify(debugServiceMockedConstruction.constructed().iterator().next(), times(1)) - .debug(any(), eq("kubernetes.yml"), eq(Collections.emptyList()), eq("5005"), eq(false), any(GradleLogger.class)); + .debug(debugContextArgumentCaptor.capture(), eq(Collections.emptyList())); + assertThat(debugContextArgumentCaptor.getValue()) + .hasFieldOrPropertyWithValue("fileName", "kubernetes.yml") + .hasFieldOrPropertyWithValue("localDebugPort", "5005") + .hasFieldOrPropertyWithValue("debugSuspend", false) + .satisfies(d -> assertThat(d.getPodWaitLog()).isInstanceOf(GradleLogger.class)); } } diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftDebugTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftDebugTaskTest.java index 28264f2ca5..3bafe3e485 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftDebugTaskTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftDebugTaskTest.java @@ -17,11 +17,13 @@ import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; import org.eclipse.jkube.gradle.plugin.TestOpenShiftExtension; import org.eclipse.jkube.kit.common.util.OpenshiftHelper; +import org.eclipse.jkube.kit.config.service.DebugContext; import org.eclipse.jkube.kit.config.service.DebugService; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; +import org.mockito.ArgumentCaptor; import org.mockito.MockedConstruction; import org.mockito.MockedStatic; import org.mockito.Mockito; @@ -77,12 +79,18 @@ void runTask_withManifest_shouldStartDebug() throws Exception { // Given taskEnvironment.withOpenShiftManifest(); final OpenShiftDebugTask debugTask = new OpenShiftDebugTask(OpenShiftExtension.class); + ArgumentCaptor debugContextArgumentCaptor = ArgumentCaptor.forClass(DebugContext.class); // When debugTask.runTask(); // Then assertThat(debugServiceMockedConstruction.constructed()).hasSize(1); verify(debugServiceMockedConstruction.constructed().iterator().next(), times(1)) - .debug(any(), eq("openshift.yml"), eq(Collections.emptyList()), eq("5005"), eq(false), any(GradleLogger.class)); + .debug(debugContextArgumentCaptor.capture(), eq(Collections.emptyList())); + assertThat(debugContextArgumentCaptor.getValue()) + .hasFieldOrPropertyWithValue("fileName", "openshift.yml") + .hasFieldOrPropertyWithValue("localDebugPort", "5005") + .hasFieldOrPropertyWithValue("debugSuspend", false) + .satisfies(d -> assertThat(d.getPodWaitLog()).isInstanceOf(GradleLogger.class)); } } diff --git a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/JKubeBuildStrategy.java b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/JKubeBuildStrategy.java index d2890a5b61..55eeba381a 100644 --- a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/JKubeBuildStrategy.java +++ b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/JKubeBuildStrategy.java @@ -28,22 +28,22 @@ public enum JKubeBuildStrategy { /** * S2i build with a binary source */ - s2i("S2I", true), + s2i("S2I", true, true), /** * JIB build */ - jib("Jib", true), + jib("Jib", true, true), /** * Docker build with a binary source */ - docker("Docker", true), + docker("Docker", true, true), /** * BuildPacks */ - buildpacks("Buildpacks", false); + buildpacks("Buildpacks", false, false); // Source strategy elements public enum SourceStrategy { @@ -60,10 +60,12 @@ public String key() { private final String label; private final boolean supportsWatch; + private final boolean supportsDebug; - JKubeBuildStrategy(String label, boolean supportsWatch) { + JKubeBuildStrategy(String label, boolean supportsWatch, boolean supportsDebug) { this.label = label; this.supportsWatch = supportsWatch; + this.supportsDebug = supportsDebug; } /** diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/DebugContext.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/DebugContext.java new file mode 100644 index 0000000000..4146297fb3 --- /dev/null +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/DebugContext.java @@ -0,0 +1,36 @@ +/* + * 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.config.service; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; + +@Builder(toBuilder = true) +@AllArgsConstructor +@NoArgsConstructor +@Getter +@EqualsAndHashCode +public class DebugContext { + private String namespace; + private String fileName; + private String localDebugPort; + private boolean debugSuspend; + private KitLogger podWaitLog; + private JKubeBuildStrategy jKubeBuildStrategy; +} diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/DebugService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/DebugService.java index c3498c2932..9fa118d127 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/DebugService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/DebugService.java @@ -26,8 +26,10 @@ import io.fabric8.kubernetes.client.NamespacedKubernetesClient; import io.fabric8.kubernetes.client.dsl.PodResource; import org.eclipse.jkube.kit.common.DebugConstants; +import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.KubernetesHelper; +import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; import org.eclipse.jkube.kit.config.service.portforward.PortForwardPodWatcher; import io.fabric8.kubernetes.api.model.Container; @@ -71,16 +73,17 @@ public DebugService(KitLogger log, KubernetesClient kubernetesClient, PortForwar this.applyService = applyService; } - public void debug( - String namespace, String fileName, Collection entities, String localDebugPort, boolean debugSuspend, KitLogger podWaitLog - ) { + public void debug(DebugContext debugContext, Collection entities) { if (!isDebugApplicable(entities)) { log.error("Unable to proceed with Debug. No application resource found running in the cluster"); return; } + if (debugContext.getJKubeBuildStrategy() != null && !debugContext.getJKubeBuildStrategy().isSupportsDebug()) { + throw new JKubeException("Debug is not supported in " + debugContext.getJKubeBuildStrategy().getLabel() + " build strategy"); + } final NamespacedKubernetesClient nsClient; - if (namespace != null) { - nsClient = kubernetesClient.adapt(NamespacedKubernetesClient.class).inNamespace(namespace); + if (debugContext.getNamespace() != null) { + nsClient = kubernetesClient.adapt(NamespacedKubernetesClient.class).inNamespace(debugContext.getNamespace()); } else { nsClient = kubernetesClient.adapt(NamespacedKubernetesClient.class); } @@ -89,13 +92,13 @@ public void debug( if (firstSelector == null) { firstSelector = extractPodLabelSelector(entity); } - enableDebugging(entity, fileName, debugSuspend); + enableDebugging(entity, debugContext.getFileName(), debugContext.isDebugSuspend()); } if (firstSelector == null) { log.error("Debug is not applicable for the currently generated resources"); return; } - startPortForward(nsClient, firstSelector, debugSuspend, localDebugPort, podWaitLog); + startPortForward(nsClient, firstSelector, debugContext.isDebugSuspend(), debugContext.getLocalDebugPort(), debugContext.getPodWaitLog()); } /** diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/DebugServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/DebugServiceTest.java index 2f6ef5f917..c53e26b6c8 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/DebugServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/DebugServiceTest.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.databind.JsonNode; import io.fabric8.kubernetes.api.model.APIGroupListBuilder; import io.fabric8.kubernetes.api.model.ConfigMap; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.api.model.LabelSelector; import io.fabric8.kubernetes.api.model.LabelSelectorBuilder; import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; @@ -45,10 +46,12 @@ import okhttp3.mockwebserver.RecordedRequest; import org.assertj.core.groups.Tuple; import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.Serialization; import org.eclipse.jkube.kit.config.access.ClusterAccess; import org.eclipse.jkube.kit.config.access.ClusterConfiguration; +import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -59,6 +62,7 @@ import java.net.Socket; import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; @@ -67,6 +71,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.startsWith; import static org.mockito.Mockito.spy; @@ -82,6 +87,7 @@ class DebugServiceTest { private KubernetesMockServer mockServer; private ExecutorService singleThreadExecutor; private DebugService debugService; + private DebugContext debugContext; @BeforeEach void setUp() { @@ -92,6 +98,12 @@ void setUp() { .platformMode(RuntimeMode.KUBERNETES) .clusterAccess(new ClusterAccess(ClusterConfiguration.from(kubernetesClient.getConfiguration()).build())) .build(); + debugContext = DebugContext.builder() + .namespace("namespace") + .fileName("file.name") + .debugSuspend(false) + .podWaitLog(logger) + .build(); singleThreadExecutor = Executors.newSingleThreadExecutor(); serviceHub.getApplyService().setNamespace(kubernetesClient.getNamespace()); debugService = new DebugService(logger, kubernetesClient, new PortForwardService(logger), serviceHub.getApplyService()); @@ -207,18 +219,38 @@ void enableDebuggingWithDeploymentConfig() { } @Test + @DisplayName("with buildpacks build strategy, should throw exception") + void debugWithBuildPacksBuildStrategyShouldThrowException() { + // Given + final Deployment deployment = withDeploymentRollout(initDeployment()); + debugContext = debugContext.toBuilder().jKubeBuildStrategy(JKubeBuildStrategy.buildpacks).build(); + List entities = Collections.singletonList(deployment); + + // When + Then + assertThatExceptionOfType(JKubeException.class) + .isThrownBy(() -> debugService.debug(debugContext, entities)) + .withMessage("Debug is not supported in Buildpacks build strategy"); + } + + @Test + @DisplayName("Empty Kubernetes resources list logs no application resource found error") void debugWithNotApplicableEntitiesLogsError() { // When - debugService.debug("namespace", "file.name", Collections.emptySet(), null, false, logger); + debugService.debug(debugContext, Collections.emptySet()); // Then verify(logger, times(1)) .error("Unable to proceed with Debug. No application resource found running in the cluster"); } @Test + @DisplayName("Valid Kubernetes resources list should initiate port forward in specified namespace") void debugWithApplicableEntities() throws Exception { // Given final Deployment deployment = withDeploymentRollout(initDeployment()); + debugContext = debugContext.toBuilder() + .namespace("test") + .localDebugPort("1337") + .build(); final CompletableFuture portForwardRequest = new CompletableFuture<>(); mockServer.expect().get().withPath("/api/v1/namespaces/test/pods/pod-in-debug-mode/portforward?ports=5005") .andReply(200, r -> { @@ -226,8 +258,7 @@ void debugWithApplicableEntities() throws Exception { return ""; }).always(); // When - singleThreadExecutor.submit(() -> debugService.debug( "test", "file.name", - Collections.singletonList(deployment), "1337", false, logger)); + singleThreadExecutor.submit(() -> debugService.debug(debugContext, Collections.singletonList(deployment))); verify(logger, timeout(10000L)) .info(startsWith("Now you can start a Remote debug session by using localhost"), anyInt()); try (final Socket ignored = new Socket(InetAddress.getLocalHost(), 1337)) { @@ -238,8 +269,14 @@ void debugWithApplicableEntities() throws Exception { } @Test + @DisplayName("valid Kubernetes resource list with debug suspend enabled, should initiate port forward") void debugWithApplicableEntitiesAndSuspend() throws Exception { // Given + debugContext = debugContext.toBuilder() + .namespace("test") + .localDebugPort("1337") + .debugSuspend(true) + .build(); final Deployment deployment = withDeploymentRollout(initDeployment()); final CompletableFuture portForwardRequest = new CompletableFuture<>(); mockServer.expect().get().withPath("/api/v1/namespaces/test/pods/pod-in-debug-mode/portforward?ports=5005") @@ -248,8 +285,7 @@ void debugWithApplicableEntitiesAndSuspend() throws Exception { return ""; }).always(); // When - singleThreadExecutor.submit(() -> debugService.debug( "test", "file.name", - Collections.singletonList(deployment), "1337", true, logger)); + singleThreadExecutor.submit(() -> debugService.debug(debugContext, Collections.singletonList(deployment))); verify(logger, timeout(10000L)) .info(startsWith("Now you can start a Remote debug session by using localhost"), anyInt()); try (final Socket ignored = new Socket(InetAddress.getLocalHost(), 1337)) { diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojo.java index fb10e61ec5..9cc545ca31 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojo.java @@ -15,6 +15,7 @@ import java.util.Collection; +import org.eclipse.jkube.kit.config.service.DebugContext; import org.eclipse.jkube.maven.plugin.mojo.build.ApplyMojo; import io.fabric8.kubernetes.api.model.HasMetadata; @@ -39,8 +40,14 @@ public class DebugMojo extends ApplyMojo { @Override protected void applyEntities(KubernetesClient kubernetes, String fileName, Collection entities) { - jkubeServiceHub.getDebugService().debug( - applyService.getNamespace(), fileName, entities, localDebugPort, debugSuspend, createLogger("[[Y]][W][[Y]] [[s]]")); + jkubeServiceHub.getDebugService().debug(DebugContext.builder() + .namespace(applyService.getNamespace()) + .fileName(fileName) + .localDebugPort(localDebugPort) + .debugSuspend(debugSuspend) + .podWaitLog(createLogger("[[Y]][W][[Y]] [[s]]")) + .jKubeBuildStrategy(buildStrategy) + .build(), entities); } } diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojoTest.java index 4cfdb209e2..ae69fa8fe0 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojoTest.java @@ -21,6 +21,7 @@ import org.eclipse.jkube.kit.common.util.AnsiLogger; import org.eclipse.jkube.kit.config.access.ClusterAccess; +import org.eclipse.jkube.kit.config.service.DebugContext; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; import io.fabric8.openshift.client.OpenShiftClient; @@ -30,6 +31,7 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import org.mockito.ArgumentCaptor; import org.mockito.MockedConstruction; import static org.assertj.core.api.Assertions.assertThat; @@ -87,16 +89,16 @@ void tearDown() { @Test void execute() throws Exception { + // Given + ArgumentCaptor debugContextArgumentCaptor = ArgumentCaptor.forClass(DebugContext.class); // When debugMojo.execute(); // Then assertThat(jKubeServiceHubMockedConstruction.constructed()).singleElement() - .satisfies(jks -> verify(jks.getDebugService(), times(1)).debug( - isNull(), - eq("kubernetes.yml"), - isNotNull(), - isNull(), - eq(false), - any(AnsiLogger.class))); + .satisfies(jks -> verify(jks.getDebugService(), times(1)).debug(debugContextArgumentCaptor.capture(), any())); + assertThat(debugContextArgumentCaptor.getValue()) + .hasFieldOrPropertyWithValue("fileName", "kubernetes.yml") + .hasFieldOrPropertyWithValue("debugSuspend", false) + .satisfies(d -> assertThat(d.getPodWaitLog()).isInstanceOf(AnsiLogger.class)); } } From f9b57bc79e184fd6d7070d7391012bec1a4c9728 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Wed, 24 Apr 2024 14:38:44 +0530 Subject: [PATCH 061/289] refactor (jkube-kit) : Move `ConfigHelper.initImageConfiguration` to `GeneratorManager.generateAndMerge` (2818) refactor (jkube-kit) : Move ConfigHelper.initImageConfiguration to GeneratorManager + This code modifying and filtering ImageConfiguration lists is better suited to be placed inside GeneratorManager rather than some static utility method. + Add new fields `buildTimestamp`, `sourceDirectory`, `filter` to GeneratorContext Signed-off-by: Rohan Kumar --- refactor(generators): restructure DefaultGeneratorManager Signed-off-by: Marc Nuri --- .../gradle/plugin/task/AbstractJKubeTask.java | 53 +++---- .../plugin/task/OpenShiftResourceTask.java | 6 +- .../kit/build/api/helper/ConfigHelper.java | 118 --------------- .../build/api/helper/ConfigHelperTest.java | 94 ------------ .../kit/config/image/GeneratorManager.java | 9 +- .../api/DefaultGeneratorManager.java | 73 ++++++++- .../jkube/generator/api/GeneratorContext.java | 4 + .../api/DefaultGeneratorManagerTest.java | 142 ++++++++++++++++-- .../plugin/mojo/build/AbstractDockerMojo.java | 9 +- .../maven/plugin/mojo/build/ResourceMojo.java | 14 +- .../maven/plugin/mojo/develop/WatchMojo.java | 5 + 11 files changed, 245 insertions(+), 282 deletions(-) diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java index 346b33002c..4d635761b2 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java @@ -27,7 +27,6 @@ import org.eclipse.jkube.gradle.plugin.GradleLogger; import org.eclipse.jkube.gradle.plugin.GradleUtil; import org.eclipse.jkube.gradle.plugin.KubernetesExtension; -import org.eclipse.jkube.kit.build.api.helper.ImageConfigResolver; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.RegistryConfig; @@ -49,7 +48,6 @@ import org.gradle.api.tasks.Internal; import org.gradle.api.tasks.TaskAction; -import static org.eclipse.jkube.kit.build.api.helper.ConfigHelper.initImageConfiguration; import static org.eclipse.jkube.kit.common.JKubeFileInterpolator.interpolate; import static org.eclipse.jkube.kit.common.util.BuildReferenceDateUtil.getBuildTimestamp; import static org.eclipse.jkube.kit.config.service.kubernetes.KubernetesClientUtil.updateResourceConfigNamespace; @@ -84,26 +82,21 @@ private void init() { clusterAccess = new ClusterAccess(initClusterConfiguration()); jKubeServiceHub = initJKubeServiceHubBuilder().build(); kubernetesExtension.resources = updateResourceConfigNamespace(kubernetesExtension.getNamespaceOrNull(), kubernetesExtension.resources); - ImageConfigResolver imageConfigResolver = new ImageConfigResolver(); - try { - resolvedImages = resolveImages(imageConfigResolver); - final JKubeEnricherContext context = JKubeEnricherContext.builder() - .project(kubernetesExtension.javaProject) - .processorConfig(ProfileUtil.blendProfileWithConfiguration(ProfileUtil.ENRICHER_CONFIG, - kubernetesExtension.getProfileOrNull(), - resolveResourceSourceDirectory(), - kubernetesExtension.enricher)) - .images(resolvedImages) - .resources(kubernetesExtension.resources) - .log(kitLogger) - .jKubeBuildStrategy(kubernetesExtension.getBuildStrategyOrDefault()) - .build(); - final List extraClasspathElements = kubernetesExtension.getUseProjectClassPathOrDefault() ? - kubernetesExtension.javaProject.getCompileClassPathElements() : Collections.emptyList(); - enricherManager = new DefaultEnricherManager(context, extraClasspathElements); - } catch (IOException exception) { - kitLogger.error("Error in fetching Build timestamps: " + exception.getMessage()); - } + resolvedImages = resolveImages(); + final JKubeEnricherContext context = JKubeEnricherContext.builder() + .project(kubernetesExtension.javaProject) + .processorConfig(ProfileUtil.blendProfileWithConfiguration(ProfileUtil.ENRICHER_CONFIG, + kubernetesExtension.getProfileOrNull(), + resolveResourceSourceDirectory(), + kubernetesExtension.enricher)) + .images(resolvedImages) + .resources(kubernetesExtension.resources) + .log(kitLogger) + .jKubeBuildStrategy(kubernetesExtension.getBuildStrategyOrDefault()) + .build(); + final List extraClasspathElements = kubernetesExtension.getUseProjectClassPathOrDefault() ? + kubernetesExtension.javaProject.getCompileClassPathElements() : Collections.emptyList(); + enricherManager = new DefaultEnricherManager(context, extraClasspathElements); } protected boolean shouldSkip() { @@ -172,7 +165,11 @@ protected GeneratorContext.GeneratorContextBuilder initGeneratorContextBuilder() .runtimeMode(kubernetesExtension.getRuntimeMode()) .strategy(kubernetesExtension.getBuildStrategyOrDefault()) .prePackagePhase(false) - .useProjectClasspath(kubernetesExtension.getUseProjectClassPathOrDefault()); + .useProjectClasspath(kubernetesExtension.getUseProjectClassPathOrDefault()) + .sourceDirectory(kubernetesExtension.getBuildSourceDirectoryOrDefault()) + .buildTimestamp(getBuildTimestamp(null, null, kubernetesExtension.javaProject.getBuildDirectory().getAbsolutePath(), + DOCKER_BUILD_TIMESTAMP)) + .filter(kubernetesExtension.getFilterOrNull()); } protected ClusterConfiguration initClusterConfiguration() { @@ -186,14 +183,8 @@ protected final List resolveResourceSourceDirectory() { } - protected List resolveImages(ImageConfigResolver imageConfigResolver) throws IOException { - return initImageConfiguration( - getBuildTimestamp(null, null, kubernetesExtension.javaProject.getBuildDirectory().getAbsolutePath(), - DOCKER_BUILD_TIMESTAMP), - kubernetesExtension.images, imageConfigResolver, kitLogger, - kubernetesExtension.getFilter().getOrNull(), - new DefaultGeneratorManager(initGeneratorContextBuilder().build()), - jKubeServiceHub.getConfiguration()); + protected List resolveImages() { + return new DefaultGeneratorManager(initGeneratorContextBuilder().build()).generateAndMerge(kubernetesExtension.images); } protected File getManifest(KubernetesClient kc) { diff --git a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTask.java b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTask.java index bb7d0e98ce..2628d443c0 100644 --- a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTask.java +++ b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTask.java @@ -13,7 +13,6 @@ */ package org.eclipse.jkube.gradle.plugin.task; -import java.io.IOException; import java.util.List; import java.util.Optional; import java.util.Properties; @@ -21,7 +20,6 @@ import javax.inject.Inject; import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; -import org.eclipse.jkube.kit.build.api.helper.ImageConfigResolver; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.resource.RuntimeMode; @@ -37,7 +35,7 @@ public OpenShiftResourceTask(Class extensionClass) } @Override - public List resolveImages(ImageConfigResolver imageConfigResolver) throws IOException { + public List resolveImages() { RuntimeMode runtimeMode = kubernetesExtension.getRuntimeMode(); final Properties properties = kubernetesExtension.javaProject.getProperties(); if (!properties.contains(DOCKER_IMAGE_USER)) { @@ -48,6 +46,6 @@ public List resolveImages(ImageConfigResolver imageConfigRes if (!properties.contains(RuntimeMode.JKUBE_EFFECTIVE_PLATFORM_MODE)) { properties.setProperty(RuntimeMode.JKUBE_EFFECTIVE_PLATFORM_MODE, runtimeMode.toString()); } - return super.resolveImages(imageConfigResolver); + return super.resolveImages(); } } diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelper.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelper.java index af052a6e18..fed66899db 100644 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelper.java +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelper.java @@ -15,22 +15,12 @@ import org.eclipse.jkube.kit.build.api.config.handler.property.PropertyConfigHandler; import org.eclipse.jkube.kit.build.api.config.handler.property.PropertyMode; -import org.eclipse.jkube.kit.common.JKubeConfiguration; -import org.eclipse.jkube.kit.config.image.GeneratorManager; import org.eclipse.jkube.kit.config.image.ImageConfiguration; -import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.common.JavaProject; -import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.JKubeProjectUtil; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.HashSet; import java.util.List; import java.util.Properties; -import java.util.Set; -import java.util.stream.Collectors; /** * Utility class which helps in resolving, customizing, initializing and validating @@ -45,32 +35,6 @@ public class ConfigHelper { private ConfigHelper() {} - /** - * Resolve image with an external image resolver - * - * @param logger Kit Logger - * @param images the original image config list (can be null) - * @param imageResolver the resolver used to extend on an image configuration - * @param imageNameFilter filter to select only certain image configurations with the given name - * @param generatorManager for applying generators on image configurations - * @return a list of resolved and customized image configuration. - */ - private static List resolveImages(KitLogger logger, - List images, - Resolver imageResolver, - String imageNameFilter, - GeneratorManager generatorManager) { - List ret = resolveConfiguration(imageResolver, images); - ret = generatorManager.generate(ret); - final List filtered = filterImages(imageNameFilter,ret); - if (!ret.isEmpty() && filtered.isEmpty() && imageNameFilter != null) { - final List imageNames = ret.stream().map(ImageConfiguration::getName).collect(Collectors.toList()); - logger.warn("None of the resolved images [%s] match the configured filter '%s'", - String.join(",", imageNames), imageNameFilter); - } - return filtered; - } - public static void validateExternalPropertyActivation(JavaProject project, List images) { String prop = getExternalConfigActivationProperty(project); if(prop == null) { @@ -111,92 +75,10 @@ public static String getExternalConfigActivationProperty(JavaProject project) { return value; } - // Check if the provided image configuration matches the given - public static boolean matchesConfiguredImages(String imageList, ImageConfiguration imageConfig) { - if (imageList == null) { - return true; - } - Set imagesAllowed = new HashSet<>(Arrays.asList(imageList.split("\\s*,\\s*"))); - return imagesAllowed.contains(imageConfig.getName()) || imagesAllowed.contains(imageConfig.getAlias()); - } - // =========================================================================================================== - // Filter image configuration on name. Given filter should be either null (no filter) or a comma separated - // list of image names which should be used - private static List filterImages(String nameFilter, List imagesToFilter) { - List ret = new ArrayList<>(); - for (ImageConfiguration imageConfig : imagesToFilter) { - if (matchesConfiguredImages(nameFilter, imageConfig)) { - ret.add(imageConfig); - } - } - return ret; - } - - // Resolve and initialize external configuration - private static List resolveConfiguration(Resolver imageResolver, - List unresolvedImages) { - List ret = new ArrayList<>(); - if (unresolvedImages != null) { - for (ImageConfiguration image : unresolvedImages) { - ret.addAll(imageResolver.resolve(image)); - } - verifyImageNames(ret); - } - return ret; - } - - - // Extract authentication information - private static void verifyImageNames(List ret) { - for (ImageConfiguration config : ret) { - if (config.getName() == null) { - throw new IllegalArgumentException("Configuration error: must have a non-null "); - } - } - } - - public static List initImageConfiguration(Date buildTimeStamp, List unresolvedImages, ImageConfigResolver imageConfigResolver, KitLogger log, String filter, GeneratorManager generatorManager, JKubeConfiguration jKubeConfiguration) { - final ImageNameFormatter imageNameFormatter = new ImageNameFormatter(jKubeConfiguration.getProject(), buildTimeStamp); - // Resolve images - final List resolvedImages = ConfigHelper.resolveImages( - log, - unresolvedImages, - (ImageConfiguration image) -> imageConfigResolver.resolve(image, jKubeConfiguration.getProject()), - filter, // A filter which image to process - generatorManager); // GeneratorManager which will invoke generator - - // Init and validate Image configurations. After this step, getResolvedImages() contains the valid configuration. - for (ImageConfiguration imageConfiguration : resolvedImages) { - imageConfiguration.setName(imageNameFormatter.format(imageConfiguration.getName())); - if (imageConfiguration.getBuild() != null) { - imageConfiguration.getBuild().initAndValidate(); - } - printDockerfileInfoIfDockerfileMode(imageConfiguration, log, jKubeConfiguration); - } - - return resolvedImages; - } - // ========================================================================= - private static void printDockerfileInfoIfDockerfileMode(ImageConfiguration imageConfiguration, KitLogger log, JKubeConfiguration jKubeConfiguration) { - BuildConfiguration buildConfiguration = imageConfiguration.getBuildConfiguration(); - if (buildConfiguration != null && buildConfiguration.isDockerFileMode()) { - log.info("Using Dockerfile: %s", buildConfiguration.getDockerFile().getAbsolutePath()); - log.info("Using Docker Context Directory: %s", buildConfiguration.getAbsoluteContextDirPath(jKubeConfiguration.getSourceDirectory(), jKubeConfiguration.getBasedir().getAbsolutePath())); - } - } - - /** - * A resolver can map one given image configuration to one or more image configurations - * This is e.g. used for resolving properties - */ - private interface Resolver { - List resolve(ImageConfiguration image); - } - /** * Format an image name by replacing certain placeholders */ diff --git a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelperTest.java b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelperTest.java index 33ee6b1529..e819f474f9 100644 --- a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelperTest.java +++ b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelperTest.java @@ -14,48 +14,25 @@ package org.eclipse.jkube.kit.build.api.helper; import java.io.File; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.Date; import java.util.List; import java.util.Properties; -import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.JavaProject; -import org.eclipse.jkube.kit.common.KitLogger; -import org.eclipse.jkube.kit.config.image.GeneratorManager; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; -import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.RETURNS_DEEP_STUBS; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; class ConfigHelperTest { - private KitLogger logger; - private ImageConfigResolver imageConfigResolver; private JavaProject javaProject; - private JKubeConfiguration jKubeConfiguration; - private GeneratorManager generatorManager; @BeforeEach void setUp() { - logger = spy(new KitLogger.SilentLogger()); - imageConfigResolver = mock(ImageConfigResolver.class, RETURNS_DEEP_STUBS); - generatorManager = mock(GeneratorManager.class); javaProject = JavaProject.builder() .groupId("org.eclipse.jkube") .artifactId("test-java-project") @@ -63,77 +40,6 @@ void setUp() { .properties(new Properties()) .baseDirectory(new File("dummy-dir")) .build(); - jKubeConfiguration = JKubeConfiguration.builder() - .project(javaProject) - .build(); - } - - @Test - void initImageConfiguration_withSimpleImageConfiguration_shouldReturnImageConfiguration() { - // Given - ImageConfiguration dummyImageConfiguration = createNewDummyImageConfiguration(); - List images = new ArrayList<>(); - images.add(dummyImageConfiguration); - when(imageConfigResolver.resolve(dummyImageConfiguration, javaProject)).thenReturn(images); - when(generatorManager.generate(images)).thenReturn(images); - - // When - List resolvedImages = ConfigHelper.initImageConfiguration(new Date(), images, imageConfigResolver, logger, null, generatorManager, jKubeConfiguration); - - // Then - assertThat(resolvedImages).isNotNull() - .singleElement() - .isEqualTo(dummyImageConfiguration); - } - - @Test - void initImageConfiguration_whenImageConfigurationNameBlank_thenThrowException() { - // Given - ImageConfiguration imageConfiguration = ImageConfiguration.builder().build(); - List images = Collections.singletonList(imageConfiguration); - when(imageConfigResolver.resolve(imageConfiguration, javaProject)).thenReturn(images); - - // When + Then - assertThatIllegalArgumentException() - .isThrownBy(() -> ConfigHelper.initImageConfiguration(new Date(), images, imageConfigResolver, logger, null, generatorManager, jKubeConfiguration)) - .withMessage("Configuration error: must have a non-null "); - } - - @Test - void initImageConfiguration_whenNoMatchForImageFilter_thenLogWarning() { - // Given - ImageConfiguration dummyImageConfiguration = createNewDummyImageConfiguration(); - List images = Collections.singletonList(createNewDummyImageConfiguration()); - when(imageConfigResolver.resolve(dummyImageConfiguration, javaProject)).thenReturn(images); - when(generatorManager.generate(images)).thenReturn(images); - - // When - ConfigHelper.initImageConfiguration(new Date(), images, imageConfigResolver, logger, "i-dont-exist", generatorManager, jKubeConfiguration); - - // Then - verify(logger).warn("None of the resolved images [%s] match the configured filter '%s'", "foo/bar:latest", "i-dont-exist"); - } - - @Test - void initImageConfiguration_whenDockerfileUsed_thenLogDockerfilePathAndContextDir(@TempDir File temporaryFolder) { - File dockerFile = temporaryFolder.toPath().resolve("Dockerfile").toFile(); - ImageConfiguration dummyImageConfiguration = ImageConfiguration.builder() - .name("imageconfiguration-no-build:latest") - .build(BuildConfiguration.builder() - .dockerFile(dockerFile.getAbsolutePath()) - .build()) - .build(); - List images = new ArrayList<>(); - images.add(dummyImageConfiguration); - when(imageConfigResolver.resolve(dummyImageConfiguration, jKubeConfiguration.getProject())).thenReturn(images); - when(generatorManager.generate(images)).thenReturn(images); - - // When - ConfigHelper.initImageConfiguration(new Date(), images, imageConfigResolver, logger, null, generatorManager, jKubeConfiguration); - - // Then - verify(logger).info(eq("Using Dockerfile: %s"), anyString()); - verify(logger).info(eq("Using Docker Context Directory: %s"), any(File.class)); } @Test diff --git a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/GeneratorManager.java b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/GeneratorManager.java index 83ec8b1ed7..440c2f4267 100644 --- a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/GeneratorManager.java +++ b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/GeneratorManager.java @@ -17,10 +17,11 @@ public interface GeneratorManager { /** - * Customize a given list of image configurations + * Process provided set of ImageConfigurations. This processing may include filtering, merging with + * opinionated defaults and validating finally generated ImageConfigurations. * - * @param imageConfigs list of image configurations - * @return Modified list of image configurations + * @param imageConfigs list of ImageConfigurations to process + * @return processed list of ImageConfigurations */ - List generate(List imageConfigs); + List generateAndMerge(List imageConfigs); } diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java index b52862bbd7..28302bdced 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java @@ -13,13 +13,22 @@ */ package org.eclipse.jkube.generator.api; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; +import org.eclipse.jkube.kit.build.api.helper.ImageConfigResolver; +import org.eclipse.jkube.kit.build.api.helper.ImageNameFormatter; +import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.ClassUtil; import org.eclipse.jkube.kit.common.util.PluginServiceFactory; import org.eclipse.jkube.kit.config.image.GeneratorManager; import org.eclipse.jkube.kit.config.image.ImageConfiguration; +import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; /** * Manager responsible for finding and calling generators @@ -33,16 +42,53 @@ public class DefaultGeneratorManager implements GeneratorManager { "META-INF/jkube-generator" }; private final GeneratorContext genCtx; + private final ImageConfigResolver imageConfigResolver; public DefaultGeneratorManager(GeneratorContext context) { this.genCtx = context; + imageConfigResolver = new ImageConfigResolver(); } @Override - public List generate(List imageConfigs) { + public List generateAndMerge(List unresolvedImages) { + final List resolvedImages = resolveImages(unresolvedImages); + final List generatedImages = generateImages(resolvedImages); + final List filteredImages = filterImages(generatedImages); + // Init and validate Image configurations. These images will contain the valid configurations. + final ImageNameFormatter imageNameFormatter = new ImageNameFormatter(genCtx.getProject(), genCtx.getBuildTimestamp()); + for (ImageConfiguration imageConfiguration : filteredImages) { + imageConfiguration.setName(imageNameFormatter.format(imageConfiguration.getName())); + if (imageConfiguration.getBuild() != null) { + imageConfiguration.getBuild().initAndValidate(); + } + final BuildConfiguration buildConfiguration = imageConfiguration.getBuildConfiguration(); + if (buildConfiguration != null && buildConfiguration.isDockerFileMode()) { + genCtx.getLogger().info("Using Dockerfile: %s", buildConfiguration.getDockerFile().getAbsolutePath()); + genCtx.getLogger().info("Using Docker Context Directory: %s", buildConfiguration.getAbsoluteContextDirPath(genCtx.getSourceDirectory(), genCtx.getProject().getBaseDirectory().getAbsolutePath())); + } + } + return filteredImages; + } + + private List resolveImages(List unresolvedImages) { + final List resolvedImages = new ArrayList<>(); + if (unresolvedImages != null) { + for (ImageConfiguration image : unresolvedImages) { + resolvedImages.addAll(imageConfigResolver.resolve(image, genCtx.getProject())); + } + for (ImageConfiguration config : resolvedImages) { + if (config.getName() == null) { + throw new JKubeException("Configuration error: must have a non-null "); + } + } + } + return resolvedImages; + } + + private List generateImages(List imageConfigs) { List ret = imageConfigs; final KitLogger log = genCtx.getLogger(); - List usableGenerators = createUsableGeneratorList(); + final List usableGenerators = createUsableGeneratorList(); log.verbose("Generators:"); for (Generator generator : usableGenerators) { log.verbose(" - %s", generator.getName()); @@ -54,6 +100,29 @@ public List generate(List imageConfigs) return ret; } + private List filterImages(List imagesToFilter) { + final List filteredImages = new ArrayList<>(); + for (ImageConfiguration imageConfig : imagesToFilter) { + if (matchesConfiguredImages(genCtx.getFilter(), imageConfig)) { + filteredImages.add(imageConfig); + } + } + if (!imagesToFilter.isEmpty() && filteredImages.isEmpty() && genCtx.getFilter() != null) { + final List imageNames = imagesToFilter.stream().map(ImageConfiguration::getName).collect(Collectors.toList()); + genCtx.getLogger().warn("None of the resolved images [%s] match the configured filter '%s'", + String.join(",", imageNames), genCtx.getFilter()); + } + return filteredImages; + } + + private boolean matchesConfiguredImages(String imageList, ImageConfiguration imageConfig) { + if (imageList == null) { + return true; + } + Set imagesAllowed = new HashSet<>(Arrays.asList(imageList.split(","))); + return imagesAllowed.contains(imageConfig.getName()) || imagesAllowed.contains(imageConfig.getAlias()); + } + private List createUsableGeneratorList() { final PluginServiceFactory pluginFactory = new PluginServiceFactory<>(genCtx); if (genCtx.isUseProjectClasspath()) { diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorContext.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorContext.java index 2489f39bab..b45c1530ce 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorContext.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorContext.java @@ -25,6 +25,7 @@ import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.eclipse.jkube.kit.config.resource.ProcessorConfig; +import java.util.Date; import java.util.Optional; /** @@ -46,6 +47,9 @@ public class GeneratorContext { private boolean prePackagePhase; private GeneratorMode generatorMode; + private Date buildTimestamp; + private String sourceDirectory; + private String filter; public GeneratorMode getGeneratorMode() { diff --git a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java index e151fdf8a5..4a9803566c 100644 --- a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java +++ b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java @@ -13,18 +13,32 @@ */ package org.eclipse.jkube.generator.api; +import java.io.File; +import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Properties; import java.util.stream.Collectors; +import org.assertj.core.api.AssertionsForInterfaceTypes; +import org.eclipse.jkube.kit.common.JKubeException; +import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.config.image.GeneratorManager; import org.eclipse.jkube.kit.config.image.ImageConfiguration; +import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.resource.ProcessorConfig; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -34,32 +48,128 @@ class DefaultGeneratorManagerTest { private KitLogger logger; private GeneratorManager generatorManager; + private ImageConfiguration imageConfig; + private GeneratorContext generatorContext; @BeforeEach void setUp() { logger = spy(new KitLogger.SilentLogger()); final ProcessorConfig processorConfig = new ProcessorConfig(); processorConfig.setIncludes(Collections.singletonList("fake-generator")); - GeneratorContext generatorContext = GeneratorContext.builder() + JavaProject javaProject = JavaProject.builder() + .groupId("org.eclipse.jkube") + .artifactId("test-java-project") + .version("0.0.1-SNAPSHOT") + .properties(new Properties()) + .baseDirectory(new File("dummy-dir")) + .build(); + generatorContext = GeneratorContext.builder() .config(processorConfig) .logger(logger) + .project(javaProject) + .build(); + imageConfig = ImageConfiguration.builder() + .name("foo/bar:latest") + .build(BuildConfiguration.builder() + .from("foobase:latest") + .build()) .build(); generatorManager = new DefaultGeneratorManager(generatorContext); } - @Test - void generate_withTestGenerator_shouldProcessImages() { - // Given - final List images = Collections.singletonList(new ImageConfiguration()); - // When - final List result = generatorManager.generate(images); - // Then - assertThat(result) - .isNotSameAs(images) - .hasSize(1) - .extracting(ImageConfiguration::getName) - .contains("processed-by-test"); - verify(logger, times(1)).info("Running generator %s", "fake-generator"); + + @Nested + @DisplayName("generateAndMerge") + class GenerateAndMerge { + @Test + void withEmptyImageConfiguration_shouldMergeWithImageConfigGeneratedViaGenerator() { + // Given + ImageConfiguration imageConfiguration = new ImageConfiguration(); + imageConfiguration.setName("foo/bar:latest"); + final List images = Collections.singletonList(imageConfiguration); + // When + final List result = generatorManager.generateAndMerge(images); + // Then + assertThat(result) + .isNotSameAs(images) + .hasSize(1) + .extracting(ImageConfiguration::getAlias) + .contains("processed-by-test"); + verify(logger, times(1)).info("Running generator %s", "fake-generator"); + } + + @Test + void withSimpleImageConfiguration_shouldReturnImageConfiguration() { + // Given + List images = new ArrayList<>(); + images.add(imageConfig); + + // When + List resolvedImages = generatorManager.generateAndMerge(images); + + // Then + AssertionsForInterfaceTypes.assertThat(resolvedImages).isNotNull() + .singleElement() + .isEqualTo(imageConfig); + } + + @Test + void whenImageConfigurationNameBlank_thenThrowException() { + // Given + ImageConfiguration imageConfiguration = ImageConfiguration.builder().build(); + List images = Collections.singletonList(imageConfiguration); + + // When + Then + assertThatThrownBy(() -> generatorManager.generateAndMerge(images)) + .isInstanceOf(JKubeException.class) + .hasMessage("Configuration error: must have a non-null "); + } + + @Test + void whenNoMatchForImageFilter_thenLogWarning() { + // Given + generatorContext = generatorContext.toBuilder().filter("i-dont-exist").build(); + List images = Collections.singletonList(imageConfig); + + // When + new DefaultGeneratorManager(generatorContext).generateAndMerge(images); + + // Then + verify(logger).warn("None of the resolved images [%s] match the configured filter '%s'", "foo/bar:latest", "i-dont-exist"); + } + + @Test + void whenNoMatchForMultipleImageNameFilters_thenLogWarning() { + // Given + generatorContext = generatorContext.toBuilder().filter("filter1,filter2").build(); + List images = Collections.singletonList(imageConfig); + + // When + new DefaultGeneratorManager(generatorContext).generateAndMerge(images); + + // Then + verify(logger).warn("None of the resolved images [%s] match the configured filter '%s'", "foo/bar:latest", "filter1,filter2"); + } + + @Test + void whenDockerfileUsed_thenLogDockerfilePathAndContextDir(@TempDir File temporaryFolder) { + File dockerFile = temporaryFolder.toPath().resolve("Dockerfile").toFile(); + ImageConfiguration dummyImageConfiguration = ImageConfiguration.builder() + .name("imageconfiguration-no-build:latest") + .build(BuildConfiguration.builder() + .dockerFile(dockerFile.getAbsolutePath()) + .build()) + .build(); + List images = new ArrayList<>(); + images.add(dummyImageConfiguration); + + // When + generatorManager.generateAndMerge(images); + + // Then + verify(logger).info(eq("Using Dockerfile: %s"), anyString()); + verify(logger).info(eq("Using Docker Context Directory: %s"), any(File.class)); + } } // Loaded from META-INF/jkube/generator-default @@ -81,8 +191,8 @@ public boolean isApplicable(List configs) { @Override public List customize(List existingConfigs, boolean prePackagePhase) { return existingConfigs.stream() - .peek(ic -> ic.setName("processed-by-test")) + .peek(ic -> ic.setAlias("processed-by-test")) .collect(Collectors.toList()); } } -} \ No newline at end of file +} diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java index 66178b44cd..897f493532 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java @@ -408,7 +408,7 @@ protected void doExecute() throws MojoExecutionException { .buildServiceConfig(buildServiceConfigBuilder().build()) .offline(offline) .build(); - resolvedImages = ConfigHelper.initImageConfiguration(getBuildTimestamp(getPluginContext(), CONTEXT_KEY_BUILD_TIMESTAMP, project.getBuild().getDirectory(), DOCKER_BUILD_TIMESTAMP), images, imageConfigResolver, log, filter, new DefaultGeneratorManager(generatorContextBuilder().build()), jkubeServiceHub.getConfiguration()); + resolvedImages = new DefaultGeneratorManager(generatorContextBuilder().build()).generateAndMerge(images); executeInternal(); } catch (IOException | DependencyResolutionRequiredException exp) { logException(exp); @@ -595,7 +595,12 @@ protected GeneratorContext.GeneratorContextBuilder generatorContextBuilder() { .project(javaProject) .logger(log) .runtimeMode(runtimeMode) - .useProjectClasspath(useProjectClasspath); + .prePackagePhase(false) + .sourceDirectory(sourceDirectory) + .useProjectClasspath(useProjectClasspath) + .buildTimestamp(getBuildTimestamp(getPluginContext(), CONTEXT_KEY_BUILD_TIMESTAMP, project.getBuild().getDirectory(), + DOCKER_BUILD_TIMESTAMP)) + .filter(filter); } /** diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java index 4f1cfd2e53..c1d4110b72 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java @@ -23,7 +23,6 @@ import org.eclipse.jkube.generator.api.GeneratorContext; import org.eclipse.jkube.kit.build.api.helper.ImageConfigResolver; -import org.eclipse.jkube.kit.build.api.helper.ConfigHelper; import org.eclipse.jkube.generator.api.DefaultGeneratorManager; import org.eclipse.jkube.kit.common.KitLogger; @@ -248,8 +247,7 @@ private ProcessorConfig extractEnricherConfig() { // ================================================================================== - private List getResolvedImages(List images, final KitLogger log) - throws IOException { + private List getResolvedImages(List images, final KitLogger log) { GeneratorManager generatorManager = new DefaultGeneratorManager(GeneratorContext.builder() .config(ProfileUtil.blendProfileWithConfiguration(ProfileUtil.GENERATOR_CONFIG, profile, ResourceUtil.getFinalResourceDirs(resourceDir, environment), generator)) .project(javaProject) @@ -258,15 +256,9 @@ private List getResolvedImages(List imag .useProjectClasspath(useProjectClasspath) .strategy(JKubeBuildStrategy.docker) .prePackagePhase(true) + .buildTimestamp(getBuildTimestamp(getPluginContext(), CONTEXT_KEY_BUILD_TIMESTAMP, project.getBuild().getDirectory(), DOCKER_BUILD_TIMESTAMP)) .build()); - return ConfigHelper.initImageConfiguration( - getBuildTimestamp(getPluginContext(), CONTEXT_KEY_BUILD_TIMESTAMP, project.getBuild().getDirectory(), - DOCKER_BUILD_TIMESTAMP), - images, imageConfigResolver, - log, - null, // no filter on image name yet (TODO: Maybe add this, too ?) - generatorManager, - jkubeServiceHub.getConfiguration()); + return generatorManager.generateAndMerge(images); } private boolean hasJKubeDir() { diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java index 81a5bfba7f..f93de5162a 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java @@ -138,6 +138,11 @@ protected GeneratorContext.GeneratorContextBuilder generatorContextBuilder() { .logger(log) .runtimeMode(getConfiguredRuntimeMode()) .useProjectClasspath(useProjectClasspath) + .prePackagePhase(false) + .sourceDirectory(sourceDirectory) + .useProjectClasspath(useProjectClasspath) + .buildTimestamp(getBuildTimestamp(getPluginContext(), CONTEXT_KEY_BUILD_TIMESTAMP, project.getBuild().getDirectory(), + DOCKER_BUILD_TIMESTAMP)) .generatorMode(GeneratorMode.WATCH); } From d9d630b453093efd827914ce71593117c0343569 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Wed, 24 Apr 2024 16:30:12 +0530 Subject: [PATCH 062/289] feat (jkube-kit): add configuration option for overriding buildpack builder image Add a field in ImageConfiguration's Build named `buildpacksBuilderImage` that can be used by the user for configuring buildpack builder image. This field would also be exposed via `jkube.generator.buildpacksBuilderImage` property and generators `buildpacksBuilderImage` config --- CHANGELOG.md | 1 + .../image/build/BuildConfiguration.java | 7 +++++ .../image/build/BuildConfigurationTest.java | 1 + .../test/resources/build-configuration.json | 1 + .../kubernetes/BuildPackBuildService.java | 23 +++++++++------ .../kubernetes/BuildPackBuildServiceTest.java | 3 +- .../asciidoc/inc/build/_configuration.adoc | 5 ++++ .../inc/generator/_options_common.adoc | 5 ++++ .../generator/api/support/BaseGenerator.java | 6 ++++ .../api/support/BaseGeneratorTest.java | 28 +++++++++++++++---- 10 files changed, 66 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 23ba35cac3..aaa9c0fbc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ Usage: * Fix #2335: Add support for configuring nodeSelector spec for controller via xml/groovy DSL configuration * Fix #2459: Allow configuring Buildpacks build via ImageConfiguration * Fix #2462: `k8s:debug` throws error when using `buildpacks` build strategy +* Fix #2470: Add configuration option for overriding buildpack builder image * Fix #2662: Sanitize VCS remote URL used in `jkube.eclipse.org/git-url` annotation * Fix #2860: Correctly pass Docker build-arg from the build configuration to the Openshift build strategy diff --git a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/BuildConfiguration.java b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/BuildConfiguration.java index d2ffca8ab8..330df4fc2e 100644 --- a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/BuildConfiguration.java +++ b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/BuildConfiguration.java @@ -328,6 +328,13 @@ public class BuildConfiguration implements Serializable { @Singular("addCacheFrom") private List cacheFrom; + /** + * Configure BuildPack builder OCI image for BuildPack Build. + *

+ * This field is applicable for only buildpacks build strategy. + */ + private String buildpacksBuilderImage; + public boolean isDockerFileMode() { return dockerFile != null || contextDir != null; } diff --git a/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/build/BuildConfigurationTest.java b/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/build/BuildConfigurationTest.java index e9829b7d7a..30b4b002cc 100644 --- a/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/build/BuildConfigurationTest.java +++ b/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/build/BuildConfigurationTest.java @@ -246,6 +246,7 @@ void rawDeserialization() throws IOException { .hasFieldOrPropertyWithValue("filter", "@") .hasFieldOrPropertyWithValue("from", "jkube-images/image:1337") .hasFieldOrPropertyWithValue("fromExt", Collections.singletonMap("name", "jkube-images/image:ext")) + .hasFieldOrPropertyWithValue("buildpacksBuilderImage", "paketobuildpacks/builder:tiny") .hasFieldOrPropertyWithValue("maintainer", "A-Team") .hasFieldOrPropertyWithValue("ports", Collections.singletonList("8080")) .hasFieldOrPropertyWithValue("shell.shell", "java -version") diff --git a/jkube-kit/config/image/src/test/resources/build-configuration.json b/jkube-kit/config/image/src/test/resources/build-configuration.json index 03e18437d5..d2773a4306 100644 --- a/jkube-kit/config/image/src/test/resources/build-configuration.json +++ b/jkube-kit/config/image/src/test/resources/build-configuration.json @@ -7,6 +7,7 @@ "fromExt": { "name": "jkube-images/image:ext" }, + "buildpacksBuilderImage": "paketobuildpacks/builder:tiny", "maintainer": "A-Team", "ports": ["8080"], "shell": { diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildService.java index 4ea44c7e86..5750037a42 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildService.java @@ -24,6 +24,7 @@ import org.eclipse.jkube.kit.common.KitLogger; 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.image.build.JKubeBuildStrategy; import org.eclipse.jkube.kit.config.service.AbstractImageBuildService; import org.eclipse.jkube.kit.config.service.BuildServiceConfig; @@ -69,14 +70,8 @@ protected void buildSingleImage(ImageConfiguration imageConfiguration) { kitLogger.info("Delegating container image building process to BuildPacks"); final File packCli = buildPackCliDownloader.getPackCLIIfPresentOrDownload(); kitLogger.info("Using pack %s", packCli.getAbsolutePath()); - final String builderImage; - final Properties localPackConfig = - readProperties(getUserHome().toPath().resolve(PACK_CONFIG_DIR).resolve(PACK_CONFIG_FILE)); - if (localPackConfig.get("default-builder-image") != null) { - builderImage = strip(localPackConfig.getProperty("default-builder-image"), "\""); - } else { - builderImage = DEFAULT_BUILDER_IMAGE; - } + final String builderImage = getApplicableBuildPackBuilderImage(imageConfiguration.getBuild()); + BuildPackBuildOptions.BuildPackBuildOptionsBuilder buildPackBuildOptionsBuilder = BuildPackBuildOptions.builder() .imageName(imageConfiguration.getName()) .builderImage(builderImage) @@ -114,4 +109,16 @@ public boolean isApplicable() { public void postProcess() { // NOOP } + + private String getApplicableBuildPackBuilderImage(BuildConfiguration buildConfiguration) { + final Properties localPackConfig = + readProperties(getUserHome().toPath().resolve(PACK_CONFIG_DIR).resolve(PACK_CONFIG_FILE)); + if (buildConfiguration != null && StringUtils.isNotBlank(buildConfiguration.getBuildpacksBuilderImage())) { + return buildConfiguration.getBuildpacksBuilderImage(); + } else if (localPackConfig.get("default-builder-image") != null) { + return strip(localPackConfig.getProperty("default-builder-image"), "\""); + } else { + return DEFAULT_BUILDER_IMAGE; + } + } } diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildServiceTest.java index 4ce9876071..15fd9db9e0 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildServiceTest.java @@ -205,6 +205,7 @@ void whenImageConfigurationContainsPackBuildArguments_thenArgumentsPassedToBuild // Given imageConfiguration = imageConfiguration.toBuilder() .build(imageConfiguration.getBuild().toBuilder() + .buildpacksBuilderImage("paketobuildpacks/builder:tiny") .imagePullPolicy("IfNotPresent") .volumes(Collections.singletonList("/tmp/volume:/platform/volume:ro")) .tags(Arrays.asList("t1", "t2", "t3")) @@ -216,7 +217,7 @@ void whenImageConfigurationContainsPackBuildArguments_thenArgumentsPassedToBuild buildPackBuildService.buildSingleImage(imageConfiguration); // Then - verify(kitLogger).info("[[s]]%s", "build foo/bar:latest --builder paketobuildpacks/builder:base --creation-time now --pull-policy if-not-present --volume /tmp/volume:/platform/volume:ro --tag foo/bar:t1 --tag foo/bar:t2 --tag foo/bar:t3 --env BP_SPRING_CLOUD_BINDINGS_DISABLED=true"); + verify(kitLogger).info("[[s]]%s", "build foo/bar:latest --builder paketobuildpacks/builder:tiny --creation-time now --pull-policy if-not-present --volume /tmp/volume:/platform/volume:ro --tag foo/bar:t1 --tag foo/bar:t2 --tag foo/bar:t3 --env BP_SPRING_CLOUD_BINDINGS_DISABLED=true"); } } } diff --git a/jkube-kit/doc/src/main/asciidoc/inc/build/_configuration.adoc b/jkube-kit/doc/src/main/asciidoc/inc/build/_configuration.adoc index fbe5ca81bf..385295d3d9 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/build/_configuration.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/build/_configuration.adoc @@ -70,6 +70,11 @@ ifeval::["{goal-prefix}" == "oc"] In case of an <> this parameter specifies the S2I Builder Image to use, which by default is `fabric8/s2i-java:latest`. See also <> how to add additional properties for the base image. endif::[] +| *buildpacksBuilderImage* +| Configure https://buildpacks.io/docs/for-platform-operators/concepts/builder/[BuildPack builder] OCI image for BuildPack Build. This field is applicable only in `buildpacks` build strategy. This overrides builder image specified in local `~/.pack/config.toml`. If not specified this defaults to `null`. + +This field is only applicable for `buildpacks` build strategy. + | [[build-config-from-ext]]**fromExt** a| Extended definition for a base image. This field holds a map of defined in `key = "value"` format. The known keys are: diff --git a/jkube-kit/doc/src/main/asciidoc/inc/generator/_options_common.adoc b/jkube-kit/doc/src/main/asciidoc/inc/generator/_options_common.adoc index 3a430d557b..6d58940670 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/generator/_options_common.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/generator/_options_common.adoc @@ -49,6 +49,11 @@ or already added by a generator which has been run previously. | *tags* | A comma separated list of additional tags you want to tag your image with | `jkube.generator.tags` + +| *buildpacksBuilderImage* +| Configure https://buildpacks.io/docs/for-platform-operators/concepts/builder/[BuildPack builder] OCI image for BuildPack Build. This field is applicable only in `buildpacks` build strategy. +Defaults to `paketobuildpacks/builder:base` +| `jkube.generator.buildpacksBuilderImage` |=== When used as properties they can be directly referenced with the property names above. diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java index 8658888a49..07c21b54d1 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java @@ -78,6 +78,7 @@ enum Config implements Configs.Config { // Base image mode (only relevant for OpenShift) FROM_MODE("fromMode", null), + BUILDPACKS_BUILDER_IMAGE("buildpacksBuilderImage", null), // Optional registry REGISTRY("registry", null), @@ -133,6 +134,10 @@ protected String getFromAsConfigured() { return getConfigWithFallback(Config.FROM, "jkube.generator.from", null); } + protected String getBuildpacksBuilderImageAsConfigured() { + return getConfigWithFallback(Config.BUILDPACKS_BUILDER_IMAGE, "jkube.generator.buildpacksBuilderImage", null); + } + /** * Add the base image either from configuration or from a given selector * @@ -141,6 +146,7 @@ protected String getFromAsConfigured() { protected void addFrom(BuildConfiguration.BuildConfigurationBuilder builder) { String fromMode = getConfigWithFallback(Config.FROM_MODE, "jkube.generator.fromMode", "docker"); String from = getFromAsConfigured(); + builder.buildpacksBuilderImage(getBuildpacksBuilderImageAsConfigured()); if ("docker".equalsIgnoreCase(fromMode)) { String fromImage = from; if (fromImage == null) { diff --git a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java index fa2a410e46..67cbf7b5d7 100644 --- a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java +++ b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java @@ -13,10 +13,6 @@ */ package org.eclipse.jkube.generator.api.support; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -35,7 +31,6 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; import static org.assertj.core.api.AssertionsForClassTypes.entry; @@ -96,6 +91,29 @@ void fromAsConfiguredWithPropertiesShouldReturnValueInProperties() { assertThat(result).isEqualTo("fromInProperties"); } + @Test + @DisplayName("get buildpacksBuilderImageAsConfigured as configured with properties and configuration, should return configured") + void buildpacksBuilderImageConfiguredWithPropertiesAndConfigurationShouldReturnConfig() { + // Given + properties.put("jkube.generator.buildpacksBuilderImage", "buildPackBuilderViaProperties"); + config.getConfig().put("test-generator", Collections.singletonMap("buildpacksBuilderImage", "buildPackBuilderViaConfig")); + // When + final String result = new TestBaseGenerator(ctx, "test-generator").getBuildpacksBuilderImageAsConfigured(); + // Then + assertThat(result).isEqualTo("buildPackBuilderViaConfig"); + } + + @Test + @DisplayName("get buildpacksBuilderImage as configured with properties, should return value in properties") + void buildpacksBuilderImageAsConfiguredAsConfiguredWithPropertiesShouldReturnValueInProperties() { + // Given + properties.put("jkube.generator.buildpacksBuilderImage", "buildPackBuilderViaProperties"); + // When + final String result = new TestBaseGenerator(ctx, "test-generator").getBuildpacksBuilderImageAsConfigured(); + // Then + assertThat(result).isEqualTo("buildPackBuilderViaProperties"); + } + @Test @DisplayName("get image name with properties and configuration, should return configured") void getImageNameWithPropertiesAndConfigurationShouldReturnConfigured() { From 0eedb5ae8673931b4997667a573d7044da3743c7 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 06:28:04 +0200 Subject: [PATCH 063/289] chore(deps): Bump actions/checkout from 4.1.3 to 4.1.4 Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.3 to 4.1.4. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/1d96c772d19495a3b5c517cd2bc0cb401ea0529f...0ad4b8fadaa221de15dcec353f45205ec38ea70b) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/license.yml | 2 +- .github/workflows/quickstarts.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/license.yml b/.github/workflows/license.yml index 8ddb0a9697..e6ddd92ab4 100644 --- a/.github/workflows/license.yml +++ b/.github/workflows/license.yml @@ -40,7 +40,7 @@ jobs: repo.maven.apache.org:443 - name: Checkout - uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b - name: Setup Java 11 uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 with: diff --git a/.github/workflows/quickstarts.yml b/.github/workflows/quickstarts.yml index 77ea984f14..86bfea621d 100644 --- a/.github/workflows/quickstarts.yml +++ b/.github/workflows/quickstarts.yml @@ -52,7 +52,7 @@ jobs: services.gradle.org:443 - name: Checkout - uses: actions/checkout@1d96c772d19495a3b5c517cd2bc0cb401ea0529f + uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b - name: Setup Java 17 uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 with: From 8308ed10d4c8cd1854ba272cee2e7309d7716411 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 06:29:04 +0200 Subject: [PATCH 064/289] chore(deps): Bump org.apache.maven.plugins:maven-compiler-plugin Bumps [org.apache.maven.plugins:maven-compiler-plugin](https://github.com/apache/maven-compiler-plugin) from 3.11.0 to 3.13.0. - [Release notes](https://github.com/apache/maven-compiler-plugin/releases) - [Commits](https://github.com/apache/maven-compiler-plugin/compare/maven-compiler-plugin-3.11.0...maven-compiler-plugin-3.13.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-compiler-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fc062fb083..311b142f3e 100644 --- a/pom.xml +++ b/pom.xml @@ -109,7 +109,7 @@ 4.3 1.18.32 1.18.20.0 - 3.11.0 + 3.13.0 3.4.1 3.1.2 3.2.4 From 67306a7668cc34a37d9c1f81cfdf356fc9600943 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 06:29:45 +0200 Subject: [PATCH 065/289] chore(deps): Bump org.ow2.asm:asm from 9.5 to 9.7 Bumps org.ow2.asm:asm from 9.5 to 9.7. --- updated-dependencies: - dependency-name: org.ow2.asm:asm dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- jkube-kit/parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index b914c15f76..87b8473782 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -60,7 +60,7 @@ 1.2.6 2.0.1.Final 2.3 - 9.5 + 9.7 0.0.23 From 665c064cfcb33b7bb3b7408910c537b981bd6516 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 06:29:52 +0200 Subject: [PATCH 066/289] chore(deps): Bump commons-io:commons-io from 2.15.1 to 2.16.1 Bumps commons-io:commons-io from 2.15.1 to 2.16.1. --- updated-dependencies: - dependency-name: commons-io:commons-io dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 311b142f3e..09d948c501 100644 --- a/pom.xml +++ b/pom.xml @@ -95,7 +95,7 @@ 3.25.3 3.4.0 1.26.1 - 2.15.1 + 2.16.1 7.6.2 0.0.5 3.0.21 From e1f1382b91895f4ee80727abe10fc6a482fdd271 Mon Sep 17 00:00:00 2001 From: Sintivrousai <116221123+Sintivrousai@users.noreply.github.com> Date: Thu, 25 Apr 2024 07:36:36 +0300 Subject: [PATCH 067/289] fix : replace call to toArray() with a pre-sized array with empty array in KubernetesHelper (#2837) Signed-off-by: Sintivrousai --- .../org/eclipse/jkube/kit/common/util/KubernetesHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 a5a344e81e..e5542adef2 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 @@ -440,7 +440,7 @@ public static FilterWatchListDeletable withSelector(N log.warn("Ignoring empty values in selector expression %s", expression); continue; } - String[] valuesArray = values.toArray(new String[values.size()]); + String[] valuesArray = values.toArray(new String[0]); String operator = expression.getOperator(); switch (operator) { case "In": From a54a40c66a42712545772d3b187fe4af3b5c08a2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 25 Apr 2024 09:15:55 +0200 Subject: [PATCH 068/289] chore(deps): Bump com.networknt:json-schema-validator from 1.0.86 to 1.4.0 (2934) chore(deps): Bump com.networknt:json-schema-validator Bumps [com.networknt:json-schema-validator](https://github.com/networknt/json-schema-validator) from 1.0.86 to 1.4.0. - [Release notes](https://github.com/networknt/json-schema-validator/releases) - [Changelog](https://github.com/networknt/json-schema-validator/blob/master/CHANGELOG.md) - [Commits](https://github.com/networknt/json-schema-validator/compare/1.0.86...1.4.0) --- updated-dependencies: - dependency-name: com.networknt:json-schema-validator dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- fix (jkube-kit/common) : Update methods renamed in json-schema-validator upgrade In `com.networknt:json-schema-validator:1.4.0`, these methods have been renamed: - `getUri` -> `getIri` - `defaultMetaSchemaURI` -> `defaultMetaSchemaIri` These methods have been marked as deprecated, I've replaced it with these equivalent methods: - `addKeywords` -> `keywords` - `addMetaSchema` -> `metaSchema` Signed-off-by: Rohan Kumar --- .../kit/common/util/validator/ResourceValidator.java | 8 ++++---- jkube-kit/parent/pom.xml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/validator/ResourceValidator.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/validator/ResourceValidator.java index 59114485fe..e7a89a1804 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/validator/ResourceValidator.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/validator/ResourceValidator.java @@ -155,15 +155,15 @@ private String getErrorMessage(File resource, Set viola private JsonSchema getJsonSchema(URL schemaUrl, String kind) throws IOException { final JsonMetaSchema v7 = JsonMetaSchema.getV7(); - final String defaultUri = v7.getUri(); + final String defaultUri = v7.getIri(); JsonObject jsonSchema = fixUrlIfUnversioned(getSchemaJson(schemaUrl), defaultUri); checkIfKindPropertyExists(kind); getResourceProperties(kind, jsonSchema); - final JsonMetaSchema metaSchema = JsonMetaSchema.builder(v7.getUri(), v7) - .addKeywords(createNonValidationKeywordList()) + final JsonMetaSchema metaSchema = JsonMetaSchema.builder(v7.getIri(), v7) + .keywords(createNonValidationKeywordList()) .build(); return new JsonSchemaFactory.Builder() - .defaultMetaSchemaURI(defaultUri).addMetaSchema(metaSchema).build() + .defaultMetaSchemaIri(defaultUri).metaSchema(metaSchema).build() .getSchema(jsonSchema.toString()); } diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index 87b8473782..93be4950b8 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -52,7 +52,7 @@ 3.8.1 3.3.1 3.9.0 - 1.0.86 + 1.4.0 ${version.kubernetes-client} 2.7.0 0.0.7 From 78a7989f6debcab7cc62bc179ddd3170242dd00c Mon Sep 17 00:00:00 2001 From: CHIRANTH RAJU C <122692170+CHIRANTH-24@users.noreply.github.com> Date: Thu, 25 Apr 2024 13:56:20 +0530 Subject: [PATCH 069/289] fix: made label final in RuntimeMode (2954) * Made RuntimeMode.label as final * Revert "Made RuntimeMode.label as final" This reverts commit ab8388402573950de961555867880f9d84e56863. * RuntimeMode.label is made final Signed-off-by: CHIRANTH RAJU C --------- Signed-off-by: CHIRANTH RAJU C --- .../java/org/eclipse/jkube/kit/config/resource/RuntimeMode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/RuntimeMode.java b/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/RuntimeMode.java index ec7cc045a5..1692992937 100644 --- a/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/RuntimeMode.java +++ b/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/RuntimeMode.java @@ -44,7 +44,7 @@ public enum RuntimeMode { public static final String JKUBE_EFFECTIVE_PLATFORM_MODE = "jkube.internal.effective.platform.mode"; - private String label; + private final String label; RuntimeMode(String label) { this.label = label; From ea0085facb147f5a0f458e96530dae0c81dad2ff Mon Sep 17 00:00:00 2001 From: Wayne Kirimi <37283450+waynemorphic@users.noreply.github.com> Date: Thu, 25 Apr 2024 15:51:21 +0300 Subject: [PATCH 070/289] doc(quickstarts): improved hello-world example Removed declared exception in ResourceMojo.extractEnricherConfig that is never thrown #2780 Signed-off-by: wayne kirimi --- chore(example): Added /hello endpoint that prints a message Signed-off-by: wayne kirimi --- chore(example): Removed declarations of thrown exceptions Signed-off-by: wayne kirimi --- chore(example): Updated image name Signed-off-by: wayne kirimi --- chore(example): Updated quickstart readme Signed-off-by: wayne kirimi --- chore(example): Updated quickstart with requested changes Signed-off-by: wayne kirimi --- chore(example): Updated project Readme Signed-off-by: wayne kirimi --- chore(example): Refactored a child class. Signed-off-by: wayne kirimi --- Merge branch 'master' into improve-example-2788 --- fix/quickstart-example: Fixed requested changes. Signed-off-by:wayne kirimi --- Update RootHandler.java --- Readme changes for Hello-World quickstart --- Readme change --- review: fix hello-world quickstart --- README.md | 29 ++-- quickstarts/maven/hello-world/README.md | 125 ++++++------------ quickstarts/maven/hello-world/pom.xml | 6 +- .../eclipse/jkube/sample/helloworld/App.java | 26 +++- .../jkube/sample/helloworld/RootHandler.java | 44 ++++++ 5 files changed, 129 insertions(+), 101 deletions(-) create mode 100644 quickstarts/maven/hello-world/src/main/java/org/eclipse/jkube/sample/helloworld/RootHandler.java diff --git a/README.md b/README.md index bc551eb956..c66246b211 100644 --- a/README.md +++ b/README.md @@ -138,7 +138,11 @@ $ git clone git@github.com:eclipse/jkube.git # 2. Move to Hello World Quickstart folder $ cd jkube/quickstarts/maven/hello-world -# 3. Build Project and run JKube goals +# 3. Configure your local environment to re-use the Docker daemon inside the Minikube instance. + +~ jkube/quickstarts/maven/hello-world : $ eval $(minikube -p minikube docker-env) + +# 4. Build Project and run JKube goals $ mvn clean install \ k8s:build `# Build Docker Image` \ k8s:resource `# Generate Kubernetes Manifests` \ @@ -150,26 +154,21 @@ $ mvn clean install \ ```shell script # Using Kubectl $ kubectl get pods -NAME READY STATUS RESTARTS AGE -helloworld-7c4665f464-xwskj 0/1 Completed 2 27s -$ kubectl logs jkube-sample-helloworld-7c4665f464-xwskj -Hello World! -# Using JKube -$ mvn k8s:log -[INFO] k8s: [NEW] helloworld-7c4665f464-xwskj status: Running -[INFO] k8s: [NEW] Tailing log of pod: helloworld-587dfff745-2kdpq -[INFO] k8s: [NEW] Press Ctrl-C to stop tailing the log -[INFO] k8s: [NEW] -[INFO] k8s: Hello World! -[INFO] k8s: [NEW] helloworld-7c4665f464-xwskj status: Running +NAME READY STATUS RESTARTS AGE +helloworld-664bf5fdff-2bmrt 1/1 Running 0 9s +$ kubectl get svc +helloworld NodePort 10.110.92.145 8080:32353/TCP 58m +kubernetes ClusterIP 10.96.0.1 443/TCP 7h +$ curl `minikube ip`:32353/hello +Hello World ``` #### Troubleshooting -If you experience problems using minikube that pod's status shows 'ImagePullBackOff' and not 'Completed' you must share the minikube's docker daemon environment with your shell with: +If you experience problems using minikube that pod's status shows 'ImagePullBackOff' and not 'Running' you must share the minikube's docker daemon environment with your shell with: ```shell script -$ eval $(minikube docker-env) +$ eval $(minikube -p minikube docker-env) ``` You can remove this from your shell again with: diff --git a/quickstarts/maven/hello-world/README.md b/quickstarts/maven/hello-world/README.md index 5663a088f3..0f0c3f59d7 100644 --- a/quickstarts/maven/hello-world/README.md +++ b/quickstarts/maven/hello-world/README.md @@ -2,94 +2,55 @@ name: "Maven :: Hello World" description: | Demo project for getting started with Eclipse JKube. - It just prints "Hello World" on command line and exits. + It starts a simple HTTP server on port 8080 that replies with "Hello World" to the /hello endpoint. --- # JKube Hello World Sample -This is a demo project for getting started with Eclipse JKube. It just prints "Hello World" on command -line and exits. We would be using Eclipse JKube for building a docker image and deploying to Kubernetes -in single command. +This is a demo project for getting started with Eclipse JKube. +It starts a simple HTTP server on port 8080. +Performing a request to `/hello` endpoint will reply with "Hello World". +We will be using Eclipse JKube for building a docker image and deploying to Kubernetes with a single command. -1. Make sure you've minikube up and running. -2. Run the following command to run helloworld sample: -``` -~/work/repos/jkube/quickstarts/maven/hello-world : $ mvn clean install k8s:build k8s:resource k8s:apply -[INFO] Scanning for projects... -[INFO] -[INFO] ---------< org.eclipse.jkube.samples:jkube-sample-helloworld >---------- -[INFO] Building jkube-sample-helloworld 0.1.1-SNAPSHOT -[INFO] --------------------------------[ jar ]--------------------------------- -[INFO] -[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ jkube-sample-helloworld --- -[INFO] -[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ jkube-sample-helloworld --- -[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! -[INFO] skip non existing resourceDirectory /home/rohaan/work/repos/jkube/quickstarts/maven/hello-world/src/main/resources -[INFO] -[INFO] --- maven-compiler-plugin:3.6.1:compile (default-compile) @ jkube-sample-helloworld --- -[INFO] Changes detected - recompiling the module! -[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent! -[INFO] Compiling 1 source file to /home/rohaan/work/repos/jkube/quickstarts/maven/hello-world/target/classes -[INFO] -[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ jkube-sample-helloworld --- -[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent! -[INFO] skip non existing resourceDirectory /home/rohaan/work/repos/jkube/quickstarts/maven/hello-world/src/test/resources -[INFO] -[INFO] --- maven-compiler-plugin:3.6.1:testCompile (default-testCompile) @ jkube-sample-helloworld --- -[INFO] Changes detected - recompiling the module! -[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent! -[INFO] Compiling 1 source file to /home/rohaan/work/repos/jkube/quickstarts/maven/hello-world/target/test-classes -[INFO] -[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ jkube-sample-helloworld --- -[INFO] Surefire report directory: /home/rohaan/work/repos/jkube/quickstarts/maven/hello-world/target/surefire-reports +## Prerequisites -------------------------------------------------------- - T E S T S -------------------------------------------------------- -Running org.eclipse.jkube.sample.helloworld.AppTest -Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.044 sec +- Java 8+ +- Maven +- Minikube +- JKube -Results : +## Deploying Demo app to Kubernetes with JKube -Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 +1. Make sure you've [Minikube](https://minikube.sigs.k8s.io/docs/start/) up and running. + ```shell + minikube start + ``` -[INFO] -[INFO] --- maven-jar-plugin:3.0.2:jar (default-jar) @ jkube-sample-helloworld --- -[INFO] Building jar: /home/rohaan/work/repos/jkube/quickstarts/maven/hello-world/target/jkube-sample-helloworld-0.1.1-SNAPSHOT.jar -[INFO] -[INFO] --- maven-install-plugin:2.4:install (default-install) @ jkube-sample-helloworld --- -[INFO] Installing /home/rohaan/work/repos/jkube/quickstarts/maven/hello-world/target/jkube-sample-helloworld-0.1.1-SNAPSHOT.jar to /home/rohaan/.m2/repository/org/eclipse/jkube/samples/jkube-sample-helloworld/0.1.1-SNAPSHOT/jkube-sample-helloworld-0.1.1-SNAPSHOT.jar -[INFO] Installing /home/rohaan/work/repos/jkube/quickstarts/maven/hello-world/pom.xml to /home/rohaan/.m2/repository/org/eclipse/jkube/samples/jkube-sample-helloworld/0.1.1-SNAPSHOT/jkube-sample-helloworld-0.1.1-SNAPSHOT.pom -[INFO] -[INFO] --- kubernetes-maven-plugin:0.1.1-SNAPSHOT:build (default-cli) @ jkube-sample-helloworld --- -[INFO] k8s: Building Docker image in Kubernetes mode -[INFO] k8s: [helloworld-java:0.1.1-SNAPSHOT] "hello-world": Created docker-build.tar in 34 milliseconds -[INFO] k8s: [helloworld-java:0.1.1-SNAPSHOT] "hello-world": Built image sha256:9baee -[INFO] -[INFO] --- kubernetes-maven-plugin:0.1.1-SNAPSHOT:resource (default-cli) @ jkube-sample-helloworld --- -[INFO] k8s: jkube-controller: Adding a default Deployment -[INFO] k8s: jkube-revision-history: Adding revision history limit to 2 -[INFO] k8s: validating /home/rohaan/work/repos/jkube/quickstarts/maven/hello-world/target/classes/META-INF/jkube/kubernetes/jkube-sample-helloworld-deployment.yml resource -[INFO] -[INFO] --- kubernetes-maven-plugin:0.1.1-SNAPSHOT:apply (default-cli) @ jkube-sample-helloworld --- -[INFO] k8s: Using Kubernetes at https://192.168.39.149:8443/ in namespace default with manifest /home/rohaan/work/repos/jkube/quickstarts/maven/hello-world/target/classes/META-INF/jkube/kubernetes.yml -[INFO] k8s: Using namespace: default -[INFO] k8s: Creating a Deployment from kubernetes.yml namespace default name jkube-sample-helloworld -[INFO] k8s: Created Deployment: target/jkube/applyJson/default/deployment-jkube-sample-helloworld.json -[INFO] k8s: HINT: Use the command `kubectl get pods -w` to watch your pods start up -[INFO] ------------------------------------------------------------------------ -[INFO] BUILD SUCCESS -[INFO] ------------------------------------------------------------------------ -[INFO] Total time: 7.407 s -[INFO] Finished at: 2020-02-10T21:44:54+05:30 -[INFO] ------------------------------------------------------------------------ -``` +2. Configure your local environment to re-use the Docker daemon inside the Minikube instance. + ```shell + $ eval $(minikube -p minikube docker-env) + ``` -3. Check logs of Created Pod: -``` -~/work/repos/jkube/quickstarts/maven/hello-world : $ kubectl get pods -NAME READY STATUS RESTARTS AGE -jkube-sample-helloworld-7c4665f464-xwskj 0/1 Completed 2 27s -~/work/repos/jkube/quickstarts/maven/hello-world : $ kubectl logs jkube-sample-helloworld-7c4665f464-xwskj -Hello World! -``` +3. Run the following command to run and deploy hello-world demo app to Kubernetes + ```shell + $ mvn clean install k8s:build k8s:resource k8s:apply + ``` + +4. Check logs of the created Pod + ``` + $ kubectl get pods + NAME READY STATUS RESTARTS AGE + helloworld-664bf5fdff-2bmrt 1/1 Running 0 9s + ``` + +5. Log the running Kubernetes services + ```shell + $ kubectl get svc + helloworld NodePort 10.110.92.145 8080:32353/TCP 58m + kubernetes ClusterIP 10.96.0.1 443/TCP 7h + ``` + +6. Call the `/hello` endpoint + ```shell + $ curl `minikube ip`:32353/hello + Hello World + ``` diff --git a/quickstarts/maven/hello-world/pom.xml b/quickstarts/maven/hello-world/pom.xml index 19fec4226c..90b2ca46ab 100644 --- a/quickstarts/maven/hello-world/pom.xml +++ b/quickstarts/maven/hello-world/pom.xml @@ -26,11 +26,12 @@ Demo project for getting started with Eclipse JKube. - It just prints "Hello World" on command line and exits. + It starts a simple HTTP server on port 8080 that replies with "Hello World" to the /hello endpoint. ${project.version} + NodePort @@ -77,6 +78,9 @@ openjdk:latest java -jar maven/${project.artifactId}-${project.version}.jar + + 8080 + diff --git a/quickstarts/maven/hello-world/src/main/java/org/eclipse/jkube/sample/helloworld/App.java b/quickstarts/maven/hello-world/src/main/java/org/eclipse/jkube/sample/helloworld/App.java index 74b4e61692..11e2d15faa 100644 --- a/quickstarts/maven/hello-world/src/main/java/org/eclipse/jkube/sample/helloworld/App.java +++ b/quickstarts/maven/hello-world/src/main/java/org/eclipse/jkube/sample/helloworld/App.java @@ -13,11 +13,31 @@ */ package org.eclipse.jkube.sample.helloworld; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.util.logging.Logger; +import java.util.logging.Level; + +import com.sun.net.httpserver.HttpServer; + /** - * Hello world! + * @author: Wayne Kirimi */ public class App { - public static void main(String[] args) { - System.out.println("Hello World!"); + + private static final Logger log = Logger.getLogger(App.class.getSimpleName()); + private static final int PORT = 8080; + + public static void main(String[] args) { + + try { + HttpServer server = HttpServer.create(new InetSocketAddress(PORT), 0); + server.createContext("/hello", new RootHandler()); + server.setExecutor(null); + server.start(); + log.info("Server started on port: " + PORT); + } catch (IOException e) { + log.severe("Error occured when starting server: " + e.getMessage()); } + } } diff --git a/quickstarts/maven/hello-world/src/main/java/org/eclipse/jkube/sample/helloworld/RootHandler.java b/quickstarts/maven/hello-world/src/main/java/org/eclipse/jkube/sample/helloworld/RootHandler.java new file mode 100644 index 0000000000..b64d5d0a07 --- /dev/null +++ b/quickstarts/maven/hello-world/src/main/java/org/eclipse/jkube/sample/helloworld/RootHandler.java @@ -0,0 +1,44 @@ +/* + * 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.sample.helloworld; + +import java.io.IOException; +import java.io.OutputStream; +import java.util.logging.Logger; +import java.util.logging.Level; + +import com.sun.net.httpserver.HttpExchange; +import com.sun.net.httpserver.HttpHandler; + +/** + * @author: Wayne Kirimi + */ +public class RootHandler implements HttpHandler { + + private static final Logger log = Logger.getLogger(App.class.getSimpleName()); + + @Override + public void handle(HttpExchange exchange) { + try (OutputStream outputStream = exchange.getResponseBody()) { + log.info("GET /hello"); + String response = "Hello World"; + exchange.sendResponseHeaders(200, response.length()); + exchange.getResponseHeaders().set("Content-Type", "text/plain"); + outputStream.write(response.getBytes()); + log.info("Response written successfully: " + response); + } catch (IOException e) { + log.severe("Server failed to respond: " + e.getMessage()); + } + } +} From e86c429ee70ef10b6ab08ae993861603f90a6789 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Thu, 25 Apr 2024 19:54:43 +0530 Subject: [PATCH 071/289] refactor(jkube-kit/config): move OpenShift S2I Build configuration fields from BuildServiceConfig to Image's BuildConfiguration (2378) refactor (jkube-kit/config) : Move primitive fields from BuildServiceConfig to Image's BuildConfiguration Signed-off-by: Rohan Kumar --- refactor : Move BuildRecreateMode enum to `jkube-kit/common` Signed-off-by: Rohan Kumar --- review: openshift build configuration fields Signed-off-by: Marc Nuri --- .../jkube/gradle/plugin/task/TaskUtil.java | 3 - .../gradle/plugin/task/TaskUtilTest.java | 6 - .../plugin/task/OpenShiftBuildTask.java | 19 ++- .../kit/build/api/helper/ConfigHelper.java | 2 - .../jkube/kit/common}/BuildRecreateMode.java | 2 +- .../image/build/BuildConfiguration.java | 74 ++++++++++ .../config/service/BuildServiceConfig.java | 9 -- .../openshift/OpenShiftBuildServiceUtils.java | 16 +-- .../openshift/OpenshiftBuildService.java | 21 +-- .../openshift/OpenShiftBuildServiceTest.java | 12 +- .../OpenShiftBuildServiceUtilsTest.java | 23 +-- .../OpenshiftBuildServiceIntegrationTest.java | 95 +++++++------ .../api/DefaultGeneratorManager.java | 30 ++++ .../jkube/generator/api/GeneratorContext.java | 8 ++ .../api/DefaultGeneratorManagerTest.java | 131 ++++++++++++++++++ .../plugin/mojo/build/AbstractDockerMojo.java | 3 - .../plugin/mojo/build/OpenshiftBuildMojo.java | 22 ++- 17 files changed, 358 insertions(+), 118 deletions(-) rename jkube-kit/{config/resource/src/main/java/org/eclipse/jkube/kit/config/resource => common/src/main/java/org/eclipse/jkube/kit/common}/BuildRecreateMode.java (97%) diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/TaskUtil.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/TaskUtil.java index d0cb5eb93e..506c9464c0 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/TaskUtil.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/TaskUtil.java @@ -18,7 +18,6 @@ import org.eclipse.jkube.kit.build.service.docker.ImagePullManager; import org.eclipse.jkube.kit.build.service.docker.access.DockerAccess; import org.eclipse.jkube.kit.common.KitLogger; -import org.eclipse.jkube.kit.config.resource.BuildRecreateMode; import org.eclipse.jkube.kit.config.service.BuildServiceConfig; import static org.eclipse.jkube.kit.build.service.docker.ImagePullManager.createImagePullManager; @@ -36,9 +35,7 @@ public static BuildServiceConfig.BuildServiceConfigBuilder buildServiceConfigBui kubernetesExtension.javaProject.getProperties()); return BuildServiceConfig.builder() .imagePullManager(imagePullManager) - .buildRecreateMode(BuildRecreateMode.fromParameter(kubernetesExtension.getBuildRecreateOrDefault())) .jKubeBuildStrategy(kubernetesExtension.getBuildStrategyOrDefault()) - .forcePull(kubernetesExtension.getForcePullOrDefault()) .buildDirectory(kubernetesExtension.javaProject.getBuildDirectory().getAbsolutePath()); } diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/TaskUtilTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/TaskUtilTest.java index a7d9e1349d..7b49e3022b 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/TaskUtilTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/TaskUtilTest.java @@ -17,7 +17,6 @@ import org.eclipse.jkube.kit.build.service.docker.DockerAccessFactory; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; -import org.eclipse.jkube.kit.config.resource.BuildRecreateMode; import org.eclipse.jkube.kit.config.service.BuildServiceConfig; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -49,16 +48,13 @@ void buildServiceConfigBuilder_shouldInitializeBuildServiceConfigWithDefaults() // Then assertThat(buildServiceConfig) - .hasFieldOrPropertyWithValue("buildRecreateMode", BuildRecreateMode.none) .hasFieldOrPropertyWithValue("jKubeBuildStrategy", JKubeBuildStrategy.docker) - .hasFieldOrPropertyWithValue("forcePull", false) .hasFieldOrPropertyWithValue("buildDirectory", null); } @Test void buildServiceConfigBuilder_shouldInitializeBuildServiceConfigWithConfiguredValues() { // Given - extension.buildRecreate = "true"; extension.isForcePull = true; extension.buildStrategy = JKubeBuildStrategy.jib; when(extension.javaProject.getBuildDirectory().getAbsolutePath()).thenReturn("/tmp/foo"); @@ -68,9 +64,7 @@ void buildServiceConfigBuilder_shouldInitializeBuildServiceConfigWithConfiguredV // Then assertThat(buildServiceConfig) - .hasFieldOrPropertyWithValue("buildRecreateMode", BuildRecreateMode.all) .hasFieldOrPropertyWithValue("jKubeBuildStrategy", JKubeBuildStrategy.jib) - .hasFieldOrPropertyWithValue("forcePull", true) .hasFieldOrPropertyWithValue("buildDirectory", "/tmp/foo"); } diff --git a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftBuildTask.java b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftBuildTask.java index 8dd0d967c3..f83d0d1baf 100644 --- a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftBuildTask.java +++ b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftBuildTask.java @@ -15,7 +15,9 @@ import javax.inject.Inject; +import org.eclipse.jkube.generator.api.GeneratorContext; import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; +import org.eclipse.jkube.kit.common.BuildRecreateMode; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.config.service.BuildServiceConfig; @@ -31,15 +33,22 @@ public OpenShiftBuildTask(Class extensionClass) { @Override protected BuildServiceConfig.BuildServiceConfigBuilder buildServiceConfigBuilder() { return super.buildServiceConfigBuilder() - .openshiftPullSecret(getOpenShiftExtension().getOpenshiftPullSecretOrDefault()) - .s2iBuildNameSuffix(getOpenShiftExtension().getS2iBuildNameSuffixOrDefault()) - .s2iImageStreamLookupPolicyLocal(getOpenShiftExtension().getS2iImageStreamLookupPolicyLocalOrDefault()) - .openshiftPushSecret(getOpenShiftExtension().getOpenshiftPushSecretOrDefault()) .resourceConfig(getOpenShiftExtension().resources) - .buildOutputKind(getOpenShiftExtension().getBuildOutputKindOrDefault()) .enricherTask(e -> { enricherManager.enrich(PlatformMode.kubernetes, e); enricherManager.enrich(PlatformMode.openshift, e); }); } + + @Override + protected GeneratorContext.GeneratorContextBuilder initGeneratorContextBuilder() { + return super.initGeneratorContextBuilder() + .openshiftForcePull(getOpenShiftExtension().getForcePullOrDefault()) + .openshiftS2iBuildNameSuffix(getOpenShiftExtension().getS2iBuildNameSuffixOrDefault()) + .openshiftS2iImageStreamLookupPolicyLocal(getOpenShiftExtension().getS2iImageStreamLookupPolicyLocalOrDefault()) + .openshiftPullSecret(getOpenShiftExtension().getOpenshiftPullSecretOrDefault()) + .openshiftPushSecret(getOpenShiftExtension().getOpenshiftPushSecretOrDefault()) + .openshiftBuildOutputKind(getOpenShiftExtension().getBuildOutputKindOrDefault()) + .openshiftBuildRecreate(BuildRecreateMode.fromParameter(kubernetesExtension.getBuildRecreateOrDefault())); + } } diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelper.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelper.java index fed66899db..63cea69f00 100644 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelper.java +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelper.java @@ -77,8 +77,6 @@ public static String getExternalConfigActivationProperty(JavaProject project) { // =========================================================================================================== - // ========================================================================= - /** * Format an image name by replacing certain placeholders */ diff --git a/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/BuildRecreateMode.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/BuildRecreateMode.java similarity index 97% rename from jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/BuildRecreateMode.java rename to jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/BuildRecreateMode.java index ea68812a93..c32f662f78 100644 --- a/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/BuildRecreateMode.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/BuildRecreateMode.java @@ -11,7 +11,7 @@ * Contributors: * Red Hat, Inc. - initial API and implementation */ -package org.eclipse.jkube.kit.config.resource; +package org.eclipse.jkube.kit.common; import org.apache.commons.lang3.StringUtils; diff --git a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/BuildConfiguration.java b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/BuildConfiguration.java index 330df4fc2e..42dd6a5909 100644 --- a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/BuildConfiguration.java +++ b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/BuildConfiguration.java @@ -32,6 +32,7 @@ import lombok.NoArgsConstructor; import lombok.Setter; import lombok.Singular; +import org.eclipse.jkube.kit.common.BuildRecreateMode; import org.eclipse.jkube.kit.common.Arguments; import org.eclipse.jkube.kit.common.AssemblyConfiguration; import org.eclipse.jkube.kit.common.archive.ArchiveCompression; @@ -56,7 +57,9 @@ public class BuildConfiguration implements Serializable { public static final String DEFAULT_FILTER = "${*}"; public static final String DEFAULT_CLEANUP = "try"; + /////////////////////////////////////////////////////////////////////////// // Generic fields applicable to all build strategies + /////////////////////////////////////////////////////////////////////////// /** * The base image which should be used for this image. * @@ -328,6 +331,9 @@ public class BuildConfiguration implements Serializable { @Singular("addCacheFrom") private List cacheFrom; + /////////////////////////////////////////////////////////////////////////// + // Fields applicable to buildpacks build strategy + /////////////////////////////////////////////////////////////////////////// /** * Configure BuildPack builder OCI image for BuildPack Build. *

@@ -335,6 +341,74 @@ public class BuildConfiguration implements Serializable { */ private String buildpacksBuilderImage; + /////////////////////////////////////////////////////////////////////////// + // Fields applicable to openshift build strategy + /////////////////////////////////////////////////////////////////////////// + /** + * While creating a BuildConfig, By default, if the builder image specified in the + * build configuration is available locally on the node, that image will be used. + *

+ * ForcePull to override the local image and refresh it from the registry to which the image stream points. + *

+ * This field is applicable in case of s2i build strategy + */ + private boolean openshiftForcePull; + + /** + * The S2I binary builder BuildConfig name suffix appended to the image name to avoid + * clashing with the underlying BuildConfig for the Jenkins pipeline + *

+ * This field is applicable in case of OpenShift s2i build strategy + */ + private String openshiftS2iBuildNameSuffix; + + /** + * Allow the ImageStream used in the S2I binary build to be used in standard + * Kubernetes resources such as Deployment or StatefulSet. + *

+ * This field is only applicable in case of OpenShift s2i build strategy + */ + private boolean openshiftS2iImageStreamLookupPolicyLocal; + + /** + * The name of pullSecret to be used to pull the base image in case pulling from a protected + * registry which requires authentication. + *

+ * This field is applicable in case of OpenShift s2i build strategy + */ + private String openshiftPullSecret; + + /** + * The name of pushSecret to be used to push the final image in case pushing from a protected + * registry which requires authentication. + *

+ * This field is applicable in case of OpenShift s2i build strategy + */ + private String openshiftPushSecret; + + /** + * Allow specifying in which registry to push the container image at the end of the build. + * If the output kind is ImageStreamTag, then the image will be pushed to the internal OpenShift registry. + * If the output is of type DockerImage, then the name of the output reference will be used as a Docker push specification. + *

+ * This field is applicable in case of OpenShift s2i build strategy + */ + private String openshiftBuildOutputKind; + + /** + * How the OpenShift resource objects associated with the build should be treated when they already exist + + * buildConfig or bc : Only the BuildConfig is recreated + * all or is : Only the ImageStream is recreated + * all : Both, BuildConfig and ImageStream are recreated + * none : Neither BuildConfig nor ImageStream is recreated + * The default is none. If you provide the property without value then all is assumed, so everything gets recreated. + * + *

+ * This field is applicable in case of OpenShift s2i build strategy + */ + private BuildRecreateMode openshiftBuildRecreateMode; + public boolean isDockerFileMode() { return dockerFile != null || contextDir != null; } diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/BuildServiceConfig.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/BuildServiceConfig.java index 4517a0777d..0c4b7bf80f 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/BuildServiceConfig.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/BuildServiceConfig.java @@ -22,7 +22,6 @@ import org.eclipse.jkube.kit.build.service.docker.ImagePullManager; import org.eclipse.jkube.kit.build.service.docker.helper.Task; import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; -import org.eclipse.jkube.kit.config.resource.BuildRecreateMode; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import java.io.File; @@ -36,21 +35,13 @@ @Getter @EqualsAndHashCode public class BuildServiceConfig { - - private BuildRecreateMode buildRecreateMode; private JKubeBuildStrategy jKubeBuildStrategy; - private boolean forcePull; - private String s2iBuildNameSuffix; - private String openshiftPullSecret; - private String openshiftPushSecret; private Task enricherTask; private String buildDirectory; private Attacher attacher; private ImagePullManager imagePullManager; - private boolean s2iImageStreamLookupPolicyLocal; private ResourceConfig resourceConfig; private File resourceDir; - private String buildOutputKind; public void attachArtifact(String classifier, File destFile) { if (attacher != null) { diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java index 199993a0da..e2144dcfb1 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java @@ -73,10 +73,10 @@ protected static File createBuildArchive(JKubeServiceHub jKubeServiceHub, ImageC * Returns the applicable name for the S2I Build resource considering the provided {@link ImageName} and * {@link BuildServiceConfig}. */ - static String computeS2IBuildName(BuildServiceConfig config, ImageName imageName) { + static String computeS2IBuildName(ImageConfiguration imageConfiguration, BuildServiceConfig config, ImageName imageName) { final StringBuilder s2IBuildName = new StringBuilder(resolveImageStreamName(imageName)); - if (!StringUtils.isEmpty(config.getS2iBuildNameSuffix())) { - s2IBuildName.append(config.getS2iBuildNameSuffix()); + if (!StringUtils.isEmpty(imageConfiguration.getBuild().getOpenshiftS2iBuildNameSuffix())) { + s2IBuildName.append(imageConfiguration.getBuild().getOpenshiftS2iBuildNameSuffix()); } else if (config.getJKubeBuildStrategy() == JKubeBuildStrategy.s2i) { s2IBuildName.append(DEFAULT_S2I_BUILD_SUFFIX); } @@ -155,7 +155,7 @@ protected static BuildStrategy createBuildStrategy( .withName(fromName) .withNamespace(StringUtils.isEmpty(fromNamespace) ? null : fromNamespace) .endFrom() - .withForcePull(config.isForcePull()) + .withForcePull(imageConfig.getBuild().isOpenshiftForcePull()) .endSourceStrategy() .build(); if (openshiftPullSecret != null) { @@ -169,16 +169,16 @@ protected static BuildStrategy createBuildStrategy( } } - protected static BuildOutput createBuildOutput(BuildServiceConfig config, ImageName imageName) { - final String buildOutputKind = Optional.ofNullable(config.getBuildOutputKind()).orElse(DEFAULT_BUILD_OUTPUT_KIND); + protected static BuildOutput createBuildOutput(ImageConfiguration imageConfiguration, ImageName imageName) { + final String buildOutputKind = Optional.ofNullable(imageConfiguration.getBuild().getOpenshiftBuildOutputKind()).orElse(DEFAULT_BUILD_OUTPUT_KIND); final String outputImageStreamTag = resolveImageStreamName(imageName) + ":" + (imageName.getTag() != null ? imageName.getTag() : "latest"); final BuildOutputBuilder buildOutputBuilder = new BuildOutputBuilder(); buildOutputBuilder.withNewTo().withKind(buildOutputKind).withName(outputImageStreamTag).endTo(); if (DOCKER_IMAGE.equals(buildOutputKind)) { buildOutputBuilder.editTo().withName(imageName.getFullName()).endTo(); } - if(StringUtils.isNotBlank(config.getOpenshiftPushSecret())) { - buildOutputBuilder.withNewPushSecret().withName(config.getOpenshiftPushSecret()).endPushSecret(); + if(StringUtils.isNotBlank(imageConfiguration.getBuild().getOpenshiftPushSecret())) { + buildOutputBuilder.withNewPushSecret().withName(imageConfiguration.getBuild().getOpenshiftPushSecret()).endPushSecret(); } return buildOutputBuilder.build(); } 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 b6842cb34d..dcc3282df6 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 @@ -39,6 +39,7 @@ import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; +import org.eclipse.jkube.kit.common.BuildRecreateMode; import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.eclipse.jkube.kit.config.service.AbstractImageBuildService; import org.eclipse.jkube.kit.config.service.BuildServiceConfig; @@ -138,7 +139,7 @@ public void buildSingleImage(ImageConfiguration imageConfig) throws JKubeService KubernetesListBuilder builder = new KubernetesListBuilder(); // Check for buildconfig / imagestream / pullSecret and create them if necessary - String openshiftPullSecret = buildServiceConfig.getOpenshiftPullSecret(); + String openshiftPullSecret = imageConfig.getBuild().getOpenshiftPullSecret(); final boolean usePullSecret = checkOrCreatePullSecret(client, builder, openshiftPullSecret, applicableImageConfig); if (usePullSecret) { buildName = updateOrCreateBuildConfig(buildServiceConfig, client, builder, applicableImageConfig, openshiftPullSecret); @@ -146,8 +147,8 @@ public void buildSingleImage(ImageConfiguration imageConfig) throws JKubeService buildName = updateOrCreateBuildConfig(buildServiceConfig, client, builder, applicableImageConfig, null); } - if (buildServiceConfig.getBuildOutputKind() == null || IMAGE_STREAM_TAG.equals(buildServiceConfig.getBuildOutputKind())) { - checkOrCreateImageStream(buildServiceConfig, client, builder, resolveImageStreamName(imageName)); + if (imageConfig.getBuild().getOpenshiftBuildOutputKind() == null || IMAGE_STREAM_TAG.equals(imageConfig.getBuild().getOpenshiftBuildOutputKind())) { + checkOrCreateImageStream(applicableImageConfig, client, builder, resolveImageStreamName(imageName)); applyBuild(buildName, dockerTar, builder); @@ -201,10 +202,10 @@ public void postProcess() { protected String updateOrCreateBuildConfig(BuildServiceConfig config, OpenShiftClient client, KubernetesListBuilder builder, ImageConfiguration imageConfig, String openshiftPullSecret) { ImageName imageName = new ImageName(imageConfig.getName()); - String buildName = computeS2IBuildName(config, imageName); + String buildName = computeS2IBuildName(imageConfig, config, imageName); BuildStrategy buildStrategyResource = createBuildStrategy(jKubeServiceHub, imageConfig, openshiftPullSecret); - BuildOutput buildOutput = createBuildOutput(config, imageName); + BuildOutput buildOutput = createBuildOutput(imageConfig, imageName); // Fetch existing build config BuildConfig buildConfig = client.buildConfigs().inNamespace(applicableOpenShiftNamespace).withName(buildName).get(); @@ -213,7 +214,7 @@ protected String updateOrCreateBuildConfig(BuildServiceConfig config, OpenShiftC BuildConfigSpec spec = OpenShiftBuildServiceUtils.getBuildConfigSpec(buildConfig); validateSourceType(buildName, spec); - if (config.getBuildRecreateMode().isBuildConfig()) { + if (imageConfig.getBuild().getOpenshiftBuildRecreateMode().isBuildConfig()) { // Delete and recreate afresh client.buildConfigs().inNamespace(applicableOpenShiftNamespace).withName(buildName).delete(); return createBuildConfig(builder, buildName, buildStrategyResource, buildOutput); @@ -235,7 +236,7 @@ ImageConfiguration getApplicableImageConfiguration(ImageConfiguration imageConfi imageConfig.getBuildConfiguration().getAssembly().getFlattenedClone(jKubeServiceHub.getConfiguration())) .build()); } - if (buildServiceConfig.getBuildOutputKind() != null && buildServiceConfig.getBuildOutputKind().equals(DOCKER_IMAGE)) { + if (imageConfig.getBuild().getOpenshiftBuildOutputKind() != null && imageConfig.getBuild().getOpenshiftBuildOutputKind().equals(DOCKER_IMAGE)) { String applicableRegistry = getApplicablePushRegistryFrom(imageConfig, registryConfig); applicableImageConfigBuilder.name(new ImageName(imageConfig.getName()).getFullName(applicableRegistry)); } @@ -402,9 +403,9 @@ private boolean updateSecret(OpenShiftClient client, String pullSecretName, Map< return true; } - private void checkOrCreateImageStream(BuildServiceConfig config, OpenShiftClient client, KubernetesListBuilder builder, String imageStreamName) { + private void checkOrCreateImageStream(ImageConfiguration applicableImageConfig, OpenShiftClient client, KubernetesListBuilder builder, String imageStreamName) { boolean hasImageStream = client.imageStreams().inNamespace(applicableOpenShiftNamespace).withName(imageStreamName).get() != null; - if (hasImageStream && config.getBuildRecreateMode().isImageStream()) { + if (hasImageStream && applicableImageConfig.getBuild().getOpenshiftBuildRecreateMode().isImageStream()) { client.imageStreams().inNamespace(applicableOpenShiftNamespace).withName(imageStreamName).delete(); hasImageStream = false; } @@ -416,7 +417,7 @@ private void checkOrCreateImageStream(BuildServiceConfig config, OpenShiftClient .endMetadata() .withNewSpec() .withNewLookupPolicy() - .withLocal(config.isS2iImageStreamLookupPolicyLocal()) + .withLocal(applicableImageConfig.getBuild().isOpenshiftS2iImageStreamLookupPolicyLocal()) .endLookupPolicy() .endSpec() .build() 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 550f2590f2..d7b82f204c 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 @@ -136,9 +136,9 @@ void build_withImageBuildConfigurationSkipEnabled_shouldNotBuildImage() throws J @Test void getApplicableImageConfiguration_withRegistryInImageConfigurationAndDockerImageBuildOutput_shouldAppendRegistryToImageName() { // Given - when(jKubeServiceHub.getBuildServiceConfig()).thenReturn(BuildServiceConfig.builder() - .buildOutputKind("DockerImage") - .build()); + imageConfiguration = imageConfiguration.toBuilder() + .build(imageConfiguration.getBuild().toBuilder().openshiftBuildOutputKind("DockerImage").build()) + .build(); OpenshiftBuildService openshiftBuildService = new OpenshiftBuildService(jKubeServiceHub); // When @@ -152,9 +152,9 @@ void getApplicableImageConfiguration_withRegistryInImageConfigurationAndDockerIm @Test void getApplicableImageConfiguration_withRegistryInImageConfiguration_shouldNotAppendRegistryToImageName() { // Given - when(jKubeServiceHub.getBuildServiceConfig()).thenReturn(BuildServiceConfig.builder() - .buildOutputKind("ImageStreamTag") - .build()); + imageConfiguration = imageConfiguration.toBuilder() + .build(imageConfiguration.getBuild().toBuilder().openshiftBuildOutputKind("ImageStreamTag").build()) + .build(); OpenshiftBuildService openshiftBuildService = new OpenshiftBuildService(jKubeServiceHub); // When diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java index c242827b22..02e2c6c980 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java @@ -109,7 +109,7 @@ void computeS2IBuildName_withImageNameAndEmptyBuildServiceConfig_shouldReturnNam // Given final ImageName imageName = new ImageName("registry/name:tag"); // When - final String result = computeS2IBuildName(new BuildServiceConfig(), imageName); + final String result = computeS2IBuildName(imageConfiguration, new BuildServiceConfig(), imageName); // Then assertThat(result).isEqualTo("name"); } @@ -123,7 +123,7 @@ void computeS2IBuildName_withImageNameAndBuildServiceWithS2I_shouldReturnNameWit .build(); final ImageName imageName = new ImageName("registry/name:tag"); // When - final String result = computeS2IBuildName(buildServiceConfig, imageName); + final String result = computeS2IBuildName(imageConfiguration, buildServiceConfig, imageName); // Then assertThat(result).isEqualTo("name-s2i"); } @@ -133,12 +133,14 @@ void computeS2IBuildName_withImageNameAndBuildServiceWithCustomSuffix_shouldRetu // Given final BuildServiceConfig buildServiceConfig = BuildServiceConfig.builder() .jKubeBuildStrategy(JKubeBuildStrategy.s2i) - .s2iBuildNameSuffix("-custom") .buildDirectory(temporaryFolder.getAbsolutePath()) .build(); + imageConfiguration = imageConfiguration.toBuilder() + .build(imageConfiguration.getBuild().toBuilder().openshiftS2iBuildNameSuffix("-custom").build()) + .build(); final ImageName imageName = new ImageName("registry/name:tag"); // When - final String result = computeS2IBuildName(buildServiceConfig, imageName); + final String result = computeS2IBuildName(imageConfiguration, buildServiceConfig, imageName); // Then assertThat(result).isEqualTo("name-custom"); } @@ -245,7 +247,7 @@ void createBuildStrategy_withDockerBuildStrategyAndPullSecret_shouldReturnValidB @Test void createBuildOutput_withDefaults_shouldReturnImageStreamTag() { // When - final BuildOutput result = createBuildOutput(new BuildServiceConfig(), new ImageName("my-app-image")); + final BuildOutput result = createBuildOutput(imageConfiguration, new ImageName("my-app-image")); // Then assertThat(result) .extracting(BuildOutput::getTo) @@ -256,13 +258,14 @@ void createBuildOutput_withDefaults_shouldReturnImageStreamTag() { @Test void createBuildOutput_withOutputKindDockerAndPushSecret_shouldReturnDocker() { // Given - final BuildServiceConfig buildServiceConfig = BuildServiceConfig.builder() - .buildOutputKind("DockerImage") - .openshiftPushSecret("my-push-secret") - .buildDirectory(temporaryFolder.getAbsolutePath()) + imageConfiguration = imageConfiguration.toBuilder() + .build(imageConfiguration.getBuild().toBuilder() + .openshiftBuildOutputKind("DockerImage") + .openshiftPushSecret("my-push-secret") + .build()) .build(); // When - final BuildOutput result = createBuildOutput(buildServiceConfig, new ImageName("my-app-image")); + final BuildOutput result = createBuildOutput(imageConfiguration, new ImageName("my-app-image")); // Then assertThat(result) .hasFieldOrPropertyWithValue("pushSecret.name", "my-push-secret") 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 b7e8fcd7c8..aad97335fa 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 @@ -32,6 +32,7 @@ import org.eclipse.jkube.kit.build.service.docker.ArchiveService; import org.eclipse.jkube.kit.common.Assembly; import org.eclipse.jkube.kit.common.AssemblyConfiguration; +import org.eclipse.jkube.kit.common.BuildRecreateMode; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; @@ -41,7 +42,6 @@ import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; -import org.eclipse.jkube.kit.config.resource.BuildRecreateMode; import org.eclipse.jkube.kit.config.resource.ContainerResourcesConfig; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.service.BuildServiceConfig; @@ -102,12 +102,6 @@ class OpenshiftBuildServiceIntegrationTest { private BuildServiceConfig.BuildServiceConfigBuilder defaultConfig; - private BuildServiceConfig.BuildServiceConfigBuilder defaultConfigSecret; - - private BuildServiceConfig.BuildServiceConfigBuilder dockerImageConfigSecret; - - private BuildServiceConfig.BuildServiceConfigBuilder dockerImageConfig; - private ResourceConfig resourceConfig; @BeforeEach @@ -148,24 +142,15 @@ void init(@TempDir Path temporaryFolder) throws Exception { .name(projectName) .build(BuildConfiguration.builder() .from(projectName) + .openshiftS2iBuildNameSuffix("-s2i-suffix2") + .openshiftBuildRecreateMode(BuildRecreateMode.none) .build() ).build(); defaultConfig = BuildServiceConfig.builder() .buildDirectory(baseDir) - .buildRecreateMode(BuildRecreateMode.none) - .s2iBuildNameSuffix("-s2i-suffix2") .resourceConfig(resourceConfig) .jKubeBuildStrategy(JKubeBuildStrategy.s2i); - - defaultConfigSecret = defaultConfig.build().toBuilder().openshiftPullSecret("pullsecret-fabric8"); - - dockerImageConfig = defaultConfig.build().toBuilder().buildOutputKind("DockerImage"); - - dockerImageConfigSecret = defaultConfig.build().toBuilder() - .openshiftPullSecret("pullsecret-fabric8") - .openshiftPushSecret("pushsecret-fabric8") - .buildOutputKind("DockerImage"); } @AfterEach @@ -205,7 +190,7 @@ void build_withAssembly_shouldSucceed() throws Exception { // Given final BuildServiceConfig config = withBuildServiceConfig(defaultConfig.build()); final WebServerEventCollector collector = prepareMockServer(config, true, false, false, false); - image.setBuild(BuildConfiguration.builder() + image.setBuild(image.getBuild().toBuilder() .from(projectName) .assembly(AssemblyConfiguration.builder() .layer(Assembly.builder().id("one").build()) @@ -258,9 +243,12 @@ void build_withDockerfileModeAndAssembly_shouldSucceed() throws Exception { @Test void successfulBuildNoS2iSuffix() throws Exception { - final BuildServiceConfig config = withBuildServiceConfig(defaultConfig.s2iBuildNameSuffix(null).build()); + image = image.toBuilder() + .build(image.getBuild().toBuilder().openshiftS2iBuildNameSuffix(null).build()) + .build(); + BuildServiceConfig buildServiceConfig = withBuildServiceConfig(defaultConfig.build()); final WebServerEventCollector collector = prepareMockServer( - config, true, false, false, false); + buildServiceConfig, true, false, false, false); new OpenshiftBuildService(jKubeServiceHub).build(image); @@ -274,10 +262,13 @@ void successfulBuildNoS2iSuffix() throws Exception { @Test void dockerBuild() throws Exception { + image = image.toBuilder() + .build(image.getBuild().toBuilder() + .openshiftS2iBuildNameSuffix("-docker") + .build()) + .build(); final BuildServiceConfig dockerConfig = withBuildServiceConfig(BuildServiceConfig.builder() .buildDirectory(baseDir) - .buildRecreateMode(BuildRecreateMode.none) - .s2iBuildNameSuffix("-docker") .jKubeBuildStrategy(JKubeBuildStrategy.docker) .resourceConfig(resourceConfig).build()); final WebServerEventCollector collector = prepareMockServer(dockerConfig, true, false, false, false); @@ -295,11 +286,12 @@ void dockerBuild() throws Exception { void dockerBuildWithMultiComponentImageName() throws Exception { final BuildServiceConfig dockerConfig = withBuildServiceConfig(BuildServiceConfig.builder() .buildDirectory(baseDir) - .buildRecreateMode(BuildRecreateMode.none) - .s2iBuildNameSuffix("-docker") .jKubeBuildStrategy(JKubeBuildStrategy.docker) .resourceConfig(resourceConfig).build()); - image.setName("docker.io/registry/component1/component2/name:tag"); + image = image.toBuilder() + .name("docker.io/registry/component1/component2/name:tag") + .build(image.getBuild().toBuilder().openshiftS2iBuildNameSuffix("-docker").build()) + .build(); final WebServerEventCollector collector = prepareMockServer("component1-component2-name", dockerConfig, true, false, false, false); @@ -316,10 +308,12 @@ void dockerBuildWithMultiComponentImageName() throws Exception { void dockerBuildNoS2iSuffix() throws Exception { final BuildServiceConfig dockerConfig = withBuildServiceConfig(BuildServiceConfig.builder() .buildDirectory(baseDir) - .buildRecreateMode(BuildRecreateMode.none) .jKubeBuildStrategy(JKubeBuildStrategy.docker) .resourceConfig(resourceConfig) .build()); + image = image.toBuilder() + .build(image.getBuild().toBuilder().openshiftS2iBuildNameSuffix(null).build()) + .build(); final WebServerEventCollector collector = prepareMockServer(dockerConfig, true, false, false, false); new OpenshiftBuildService(jKubeServiceHub).build(image); @@ -335,26 +329,25 @@ void dockerBuildNoS2iSuffix() throws Exception { void dockerBuildFromExt() throws Exception { final BuildServiceConfig dockerConfig = withBuildServiceConfig(BuildServiceConfig.builder() .buildDirectory(baseDir) - .buildRecreateMode(BuildRecreateMode.none) - .s2iBuildNameSuffix("-docker") .jKubeBuildStrategy(JKubeBuildStrategy.docker) .resourceConfig(resourceConfig) .build()); - final WebServerEventCollector collector = prepareMockServer(dockerConfig, true, false, false, false); - - OpenshiftBuildService service = new OpenshiftBuildService(jKubeServiceHub); Map fromExt = ImmutableMap.of("name", "app:1.2-1", "kind", "ImageStreamTag", "namespace", "my-project"); - ImageConfiguration fromExtImage = ImageConfiguration.builder() + image = ImageConfiguration.builder() .name(projectName) .build(BuildConfiguration.builder() .fromExt(fromExt) .nocache(Boolean.TRUE) + .openshiftS2iBuildNameSuffix("-docker") .build() ).build(); + final WebServerEventCollector collector = prepareMockServer(dockerConfig, true, false, false, false); - service.build(fromExtImage); + OpenshiftBuildService service = new OpenshiftBuildService(jKubeServiceHub); + + service.build(image); assertThat(mockServer.getRequestCount()).isGreaterThan(8); collector.assertEventsRecordedInOrder("build-config-check", "new-build-config", "pushed"); @@ -365,7 +358,12 @@ void dockerBuildFromExt() throws Exception { @Test void successfulBuildSecret() throws Exception { - final BuildServiceConfig config = withBuildServiceConfig(defaultConfigSecret.build()); + final BuildServiceConfig config = withBuildServiceConfig(defaultConfig.build()); + image = image.toBuilder() + .build(image.getBuild().toBuilder() + .openshiftPullSecret("pullsecret-fabric8") + .build()) + .build(); final WebServerEventCollector collector = prepareMockServer(config, true, false, false, false); new OpenshiftBuildService(jKubeServiceHub).build(image); @@ -429,7 +427,13 @@ void successfulBuildWithResourceConfig() throws Exception { @Test void successfulDockerImageOutputBuild() throws Exception { - final BuildServiceConfig config = withBuildServiceConfig(dockerImageConfig.build()); + final BuildServiceConfig config = withBuildServiceConfig(defaultConfig.build()); + image = image.toBuilder() + .build(image.getBuild() + .toBuilder() + .openshiftBuildOutputKind("DockerImage") + .build()) + .build(); final WebServerEventCollector collector = prepareMockServer(config, true, false, false, false); new OpenshiftBuildService(jKubeServiceHub).build(image); @@ -445,7 +449,14 @@ void successfulDockerImageOutputBuild() throws Exception { @Test void successfulDockerImageOutputBuildSecret() throws Exception { - final BuildServiceConfig config = withBuildServiceConfig(dockerImageConfigSecret.build()); + final BuildServiceConfig config = withBuildServiceConfig(defaultConfig.build()); + image = image.toBuilder() + .build(image.getBuild().toBuilder() + .openshiftPullSecret("pullsecret-fabric8") + .openshiftPushSecret("pushsecret-fabric8") + .openshiftBuildOutputKind("DockerImage") + .build()) + .build(); final WebServerEventCollector collector = prepareMockServer(config, true, false, false, false); new OpenshiftBuildService(jKubeServiceHub).build(image); @@ -484,11 +495,11 @@ private WebServerEventCollector prepareMockServer( final long buildDelay = 50L; final String s2iBuildNameSuffix = Optional - .ofNullable(config.getS2iBuildNameSuffix()) + .ofNullable(image.getBuild().getOpenshiftS2iBuildNameSuffix()) .orElseGet(() -> config.getJKubeBuildStrategy() == JKubeBuildStrategy.s2i ? "-s2i" : ""); - final String buildOutputKind = Optional.ofNullable(config.getBuildOutputKind()).orElse("ImageStreamTag"); + final String buildOutputKind = Optional.ofNullable(image.getBuild().getOpenshiftBuildOutputKind()).orElse("ImageStreamTag"); BuildConfig bc = new BuildConfigBuilder() .withNewMetadata() @@ -504,7 +515,7 @@ private WebServerEventCollector prepareMockServer( .build(); BuildConfig bcSecret = null; - if (config.getOpenshiftPullSecret() != null) { + if (image.getBuild().getOpenshiftPullSecret() != null) { bcSecret = new BuildConfigBuilder() .withNewMetadata() .withName(resourceName + s2iBuildNameSuffix + "pullSecret") @@ -512,10 +523,10 @@ private WebServerEventCollector prepareMockServer( .withNewSpec() .withStrategy(new BuildStrategyBuilder().withType("Docker") .withNewDockerStrategy() - .withNewPullSecret(config.getOpenshiftPullSecret()) + .withNewPullSecret(image.getBuild().getOpenshiftPullSecret()) .endDockerStrategy().build()) .withNewOutput() - .withNewPushSecret().withName(config.getOpenshiftPushSecret()).endPushSecret() + .withNewPushSecret().withName(image.getBuild().getOpenshiftPushSecret()).endPushSecret() .withNewTo().withKind(buildOutputKind).endTo() .endOutput() .endSpec() diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java index 28302bdced..66b5af8ebc 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java @@ -20,6 +20,7 @@ import java.util.Set; import java.util.stream.Collectors; +import org.apache.commons.lang3.StringUtils; import org.eclipse.jkube.kit.build.api.helper.ImageConfigResolver; import org.eclipse.jkube.kit.build.api.helper.ImageNameFormatter; import org.eclipse.jkube.kit.common.JKubeException; @@ -59,6 +60,8 @@ public List generateAndMerge(List unreso for (ImageConfiguration imageConfiguration : filteredImages) { imageConfiguration.setName(imageNameFormatter.format(imageConfiguration.getName())); if (imageConfiguration.getBuild() != null) { + BuildConfiguration updatedBuildConfig = mergeGlobalConfigParamsWithSingleImageBuildConfig(imageConfiguration.getBuild()); + imageConfiguration.setBuild(updatedBuildConfig); imageConfiguration.getBuild().initAndValidate(); } final BuildConfiguration buildConfiguration = imageConfiguration.getBuildConfiguration(); @@ -132,4 +135,31 @@ private List createUsableGeneratorList() { final List generators = pluginFactory.createServiceObjects(SERVICE_PATHS); return genCtx.getConfig().prepareProcessors(generators, "generator"); } + + private BuildConfiguration mergeGlobalConfigParamsWithSingleImageBuildConfig(BuildConfiguration build) { + BuildConfiguration.BuildConfigurationBuilder buildConfigBuilder = build.toBuilder(); + if (!build.isOpenshiftForcePull() && genCtx.isOpenshiftForcePull()) { + buildConfigBuilder.openshiftForcePull(true); + } + if (StringUtils.isBlank(build.getOpenshiftS2iBuildNameSuffix()) && + StringUtils.isNotBlank(genCtx.getOpenshiftS2iBuildNameSuffix())) { + buildConfigBuilder.openshiftS2iBuildNameSuffix(genCtx.getOpenshiftS2iBuildNameSuffix()); + } + if (!build.isOpenshiftS2iImageStreamLookupPolicyLocal() && genCtx.isOpenshiftS2iImageStreamLookupPolicyLocal()) { + buildConfigBuilder.openshiftS2iImageStreamLookupPolicyLocal(true); + } + if (StringUtils.isBlank(build.getOpenshiftPullSecret()) && StringUtils.isNotBlank(genCtx.getOpenshiftPullSecret())) { + buildConfigBuilder.openshiftPullSecret(genCtx.getOpenshiftPullSecret()); + } + if (StringUtils.isBlank(build.getOpenshiftPushSecret()) && StringUtils.isNotBlank(genCtx.getOpenshiftPushSecret())) { + buildConfigBuilder.openshiftPushSecret(genCtx.getOpenshiftPushSecret()); + } + if (StringUtils.isBlank(build.getOpenshiftBuildOutputKind()) && StringUtils.isNotBlank(genCtx.getOpenshiftBuildOutputKind())) { + buildConfigBuilder.openshiftBuildOutputKind(genCtx.getOpenshiftBuildOutputKind()); + } + if (build.getOpenshiftBuildRecreateMode() == null) { + buildConfigBuilder.openshiftBuildRecreateMode(genCtx.getOpenshiftBuildRecreate()); + } + return buildConfigBuilder.build(); + } } diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorContext.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorContext.java index b45c1530ce..f7890eabd0 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorContext.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorContext.java @@ -19,6 +19,7 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; +import org.eclipse.jkube.kit.common.BuildRecreateMode; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; @@ -50,6 +51,13 @@ public class GeneratorContext { private Date buildTimestamp; private String sourceDirectory; private String filter; + private boolean openshiftForcePull; + private String openshiftS2iBuildNameSuffix; + private boolean openshiftS2iImageStreamLookupPolicyLocal; + private String openshiftPullSecret; + private String openshiftPushSecret; + private String openshiftBuildOutputKind; + private BuildRecreateMode openshiftBuildRecreate; public GeneratorMode getGeneratorMode() { diff --git a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java index 4a9803566c..c426840e9d 100644 --- a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java +++ b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java @@ -21,6 +21,7 @@ import java.util.stream.Collectors; import org.assertj.core.api.AssertionsForInterfaceTypes; +import org.eclipse.jkube.kit.common.BuildRecreateMode; import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; @@ -170,6 +171,136 @@ void whenDockerfileUsed_thenLogDockerfilePathAndContextDir(@TempDir File tempora verify(logger).info(eq("Using Dockerfile: %s"), anyString()); verify(logger).info(eq("Using Docker Context Directory: %s"), any(File.class)); } + + + @Nested + @DisplayName("merge configuration parameters for OpenShift S2I build into Image Build configuration") + class MergeOpenShiftS2IImageConfigParams { + @Test + @DisplayName("zero configuration, do not set anything in image build configuration") + void whenNoConfigurationProvided_thenDoNotSetInBuildConfig() { + // When + List result = generatorManager.generateAndMerge(Collections.singletonList(imageConfig)); + + // Then + assertThat(result) + .singleElement() + .extracting(ImageConfiguration::getBuild) + .hasFieldOrPropertyWithValue("openshiftForcePull", false) + .hasFieldOrPropertyWithValue("openshiftS2iBuildNameSuffix", null) + .hasFieldOrPropertyWithValue("openshiftS2iImageStreamLookupPolicyLocal", false) + .hasFieldOrPropertyWithValue("openshiftPullSecret", null) + .hasFieldOrPropertyWithValue("openshiftPushSecret", null) + .hasFieldOrPropertyWithValue("openshiftBuildOutputKind", null) + .hasFieldOrPropertyWithValue("openshiftBuildRecreateMode", null); + } + + @Test + @DisplayName("image Configuration, then fields retained in Image Configuration") + void whenProvidedInImageConfiguration_thenDoNotUpdateBuildConfig() { + // Given + imageConfig = imageConfig.toBuilder() + .build(BuildConfiguration.builder() + .openshiftForcePull(true) + .openshiftS2iBuildNameSuffix("-custom") + .openshiftS2iImageStreamLookupPolicyLocal(true) + .openshiftPushSecret("push-secret") + .openshiftPullSecret("pull-secret") + .openshiftBuildOutputKind("ImageStreamTag") + .openshiftBuildRecreateMode(BuildRecreateMode.buildConfig) + .build()) + .build(); + List images = Collections.singletonList(imageConfig); + + // When + List result = generatorManager.generateAndMerge(images); + + // Then + assertThat(result) + .singleElement() + .extracting(ImageConfiguration::getBuild) + .hasFieldOrPropertyWithValue("openshiftForcePull", true) + .hasFieldOrPropertyWithValue("openshiftS2iBuildNameSuffix", "-custom") + .hasFieldOrPropertyWithValue("openshiftS2iImageStreamLookupPolicyLocal", true) + .hasFieldOrPropertyWithValue("openshiftPullSecret", "pull-secret") + .hasFieldOrPropertyWithValue("openshiftPushSecret", "push-secret") + .hasFieldOrPropertyWithValue("openshiftBuildOutputKind", "ImageStreamTag") + .hasFieldOrPropertyWithValue("openshiftBuildRecreateMode", BuildRecreateMode.buildConfig); + } + + @Test + @DisplayName("plugin configuration, then fields merged in final Image Configuration") + void whenProvidedViaPluginConfiguration_thenSetInBuildConfig() { + // Given + generatorContext = generatorContext.toBuilder() + .openshiftForcePull(true) + .openshiftS2iBuildNameSuffix("-custom") + .openshiftS2iImageStreamLookupPolicyLocal(true) + .openshiftPullSecret("pull-secret") + .openshiftPushSecret("push-secret") + .openshiftBuildOutputKind("ImageStreamTag") + .openshiftBuildRecreate(BuildRecreateMode.buildConfig) + .build(); + List images = Collections.singletonList(imageConfig); + + // When + List result = new DefaultGeneratorManager(generatorContext).generateAndMerge(images); + + // Then + assertThat(result) + .singleElement() + .extracting(ImageConfiguration::getBuild) + .hasFieldOrPropertyWithValue("openshiftForcePull", true) + .hasFieldOrPropertyWithValue("openshiftS2iBuildNameSuffix", "-custom") + .hasFieldOrPropertyWithValue("openshiftS2iImageStreamLookupPolicyLocal", true) + .hasFieldOrPropertyWithValue("openshiftPullSecret", "pull-secret") + .hasFieldOrPropertyWithValue("openshiftPushSecret", "push-secret") + .hasFieldOrPropertyWithValue("openshiftBuildOutputKind", "ImageStreamTag") + .hasFieldOrPropertyWithValue("openshiftBuildRecreateMode", BuildRecreateMode.buildConfig); + } + + @Test + @DisplayName("plugin configuration and image configuration, then fields retained in Image Configuration") + void whenProvidedViaBothPluginAndImageConfiguration_thenDoNotModifyConfigurationSetInBuildConfig() { + // Given + imageConfig = imageConfig.toBuilder() + .build(BuildConfiguration.builder() + .openshiftForcePull(true) + .openshiftS2iBuildNameSuffix("-custom-via-image-config") + .openshiftS2iImageStreamLookupPolicyLocal(true) + .openshiftPushSecret("push-secret-via-image-config") + .openshiftPullSecret("pull-secret-via-image-config") + .openshiftBuildOutputKind("ImageStreamTag-via-image-config") + .openshiftBuildRecreateMode(BuildRecreateMode.buildConfig) + .build()) + .build(); + generatorContext = generatorContext.toBuilder() + .openshiftForcePull(true) + .openshiftS2iBuildNameSuffix("-custom") + .openshiftS2iImageStreamLookupPolicyLocal(true) + .openshiftPullSecret("pull-secret") + .openshiftPushSecret("push-secret") + .openshiftBuildOutputKind("ImageStreamTag") + .openshiftBuildRecreate(BuildRecreateMode.buildConfig) + .build(); + List images = Collections.singletonList(imageConfig); + + // When + List result = new DefaultGeneratorManager(generatorContext).generateAndMerge(images); + + // Then + assertThat(result) + .singleElement() + .extracting(ImageConfiguration::getBuild) + .hasFieldOrPropertyWithValue("openshiftForcePull", true) + .hasFieldOrPropertyWithValue("openshiftS2iBuildNameSuffix", "-custom-via-image-config") + .hasFieldOrPropertyWithValue("openshiftS2iImageStreamLookupPolicyLocal", true) + .hasFieldOrPropertyWithValue("openshiftPullSecret", "pull-secret-via-image-config") + .hasFieldOrPropertyWithValue("openshiftPushSecret", "push-secret-via-image-config") + .hasFieldOrPropertyWithValue("openshiftBuildOutputKind", "ImageStreamTag-via-image-config") + .hasFieldOrPropertyWithValue("openshiftBuildRecreateMode", BuildRecreateMode.buildConfig); + } + } } // Loaded from META-INF/jkube/generator-default diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java index 897f493532..20c0143892 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java @@ -46,7 +46,6 @@ import org.eclipse.jkube.kit.config.access.ClusterAccess; import org.eclipse.jkube.kit.config.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.image.build.RegistryAuthConfiguration; -import org.eclipse.jkube.kit.config.resource.BuildRecreateMode; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.config.resource.ProcessorConfig; import org.eclipse.jkube.kit.config.resource.ResourceConfig; @@ -544,9 +543,7 @@ private void buildAndTag(List imageConfigs) protected BuildServiceConfig.BuildServiceConfigBuilder buildServiceConfigBuilder() { return BuildServiceConfig.builder() - .buildRecreateMode(BuildRecreateMode.fromParameter(buildRecreate)) .jKubeBuildStrategy(getJKubeBuildStrategy()) - .forcePull(forcePull) .imagePullManager(ImagePullManager.createImagePullManager(imagePullPolicy, autoPull, project.getProperties())) .buildDirectory(project.getBuild().getDirectory()) .resourceConfig(resources) diff --git a/openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftBuildMojo.java b/openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftBuildMojo.java index 93e802476e..0eb377bbea 100644 --- a/openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftBuildMojo.java +++ b/openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftBuildMojo.java @@ -19,9 +19,9 @@ import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; import org.eclipse.jkube.generator.api.GeneratorContext; +import org.eclipse.jkube.kit.common.BuildRecreateMode; import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; import org.eclipse.jkube.kit.config.resource.RuntimeMode; -import org.eclipse.jkube.kit.config.service.BuildServiceConfig; import org.eclipse.jkube.maven.plugin.mojo.OpenShift; import static org.eclipse.jkube.kit.config.resource.RuntimeMode.KUBERNETES; @@ -88,20 +88,17 @@ protected void doExecute() throws MojoExecutionException { super.doExecute(); } - @Override - protected BuildServiceConfig.BuildServiceConfigBuilder buildServiceConfigBuilder() { - return super.buildServiceConfigBuilder() - .openshiftPullSecret(openshiftPullSecret) - .s2iBuildNameSuffix(s2iBuildNameSuffix) - .s2iImageStreamLookupPolicyLocal(s2iImageStreamLookupPolicyLocal) - .openshiftPushSecret(openshiftPushSecret) - .buildOutputKind(buildOutputKind); - } - @Override protected GeneratorContext.GeneratorContextBuilder generatorContextBuilder() { return super.generatorContextBuilder() - .strategy(getJKubeBuildStrategy()); + .strategy(getJKubeBuildStrategy()) + .openshiftForcePull(forcePull) + .openshiftS2iBuildNameSuffix(s2iBuildNameSuffix) + .openshiftS2iImageStreamLookupPolicyLocal(s2iImageStreamLookupPolicyLocal) + .openshiftPullSecret(openshiftPullSecret) + .openshiftPushSecret(openshiftPushSecret) + .openshiftBuildOutputKind(buildOutputKind) + .openshiftBuildRecreate(BuildRecreateMode.fromParameter(buildRecreate)); } @Override @@ -116,5 +113,4 @@ protected JKubeBuildStrategy getJKubeBuildStrategy() { } return JKubeBuildStrategy.s2i; } - } From e167bf68b129413a24971dd9191aea5a3ea9df64 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Apr 2024 06:29:51 +0200 Subject: [PATCH 072/289] chore(deps): Bump org.apache.maven.shared:maven-filtering Bumps [org.apache.maven.shared:maven-filtering](https://github.com/apache/maven-filtering) from 3.3.1 to 3.3.2. - [Release notes](https://github.com/apache/maven-filtering/releases) - [Commits](https://github.com/apache/maven-filtering/compare/maven-filtering-3.3.1...maven-filtering-3.3.2) --- updated-dependencies: - dependency-name: org.apache.maven.shared:maven-filtering dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- jkube-kit/parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index 93be4950b8..42dfd94c8f 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -50,7 +50,7 @@ 3.0.2 3.6.2 3.8.1 - 3.3.1 + 3.3.2 3.9.0 1.4.0 ${version.kubernetes-client} From b3f17a8b2417ec00cb0ed22aab7709d6d9c1b3d5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Apr 2024 06:30:41 +0200 Subject: [PATCH 073/289] chore(deps): Bump commons-codec:commons-codec from 1.15 to 1.16.1 Bumps [commons-codec:commons-codec](https://github.com/apache/commons-codec) from 1.15 to 1.16.1. - [Changelog](https://github.com/apache/commons-codec/blob/master/RELEASE-NOTES.txt) - [Commits](https://github.com/apache/commons-codec/compare/rel/commons-codec-1.15...rel/commons-codec-1.16.1) --- updated-dependencies: - dependency-name: commons-codec:commons-codec dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- jkube-kit/parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index 42dfd94c8f..3aefc87a0c 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -35,7 +35,7 @@ UTF-8 1.76 - 1.15 + 1.16.1 3.13.0 1.10.0 2.10.1 From a8107e1a4e8b63e5557e4f28dd5f5d03b61517fd Mon Sep 17 00:00:00 2001 From: rohit-satya <151615370+rohit-satya@users.noreply.github.com> Date: Fri, 26 Apr 2024 10:02:41 +0530 Subject: [PATCH 074/289] fix: removed unused import from OpenShiftBuildServiceUtilsTest Signed-off-by: Rohit Satya --- .../config/service/openshift/OpenShiftBuildServiceUtilsTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java index 02e2c6c980..9b1fec0d2a 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java @@ -32,7 +32,6 @@ import org.eclipse.jkube.kit.config.service.JKubeServiceException; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; -import io.fabric8.kubernetes.api.model.EnvVarBuilder; import io.fabric8.openshift.api.model.BuildConfig; import io.fabric8.openshift.api.model.BuildConfigBuilder; import io.fabric8.openshift.api.model.BuildConfigSpec; From 84b2252ab00a08b778125c8b7340bd16773e36d7 Mon Sep 17 00:00:00 2001 From: Kushagra Sinha Date: Fri, 26 Apr 2024 10:22:13 +0530 Subject: [PATCH 075/289] fix: removed unused import from OpenShiftHelmLintTaskTest removed the unused imports. --- .../jkube/gradle/plugin/task/OpenShiftHelmLintTaskTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmLintTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmLintTaskTest.java index 787bf0333c..5d8358308a 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmLintTaskTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmLintTaskTest.java @@ -22,8 +22,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import java.io.IOException; - import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.startsWith; import static org.mockito.Mockito.verify; From ae8c28388819f206a2ff223eea5eef989672cb97 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Fri, 26 Apr 2024 11:20:42 +0200 Subject: [PATCH 076/289] config: remove wagon-ssh-external maven extension Doesn't seem necessary anymore: https://github.com/eclipse-jkube/jkube/pull/2980 --- After some analysis and digging, it seems that this was added to FMP and DMP for deployment purposes: - https://github.com/fabric8io/fabric8-maven-plugin/pull/54 - https://github.com/fabric8io/docker-maven-plugin/commit/639bc925d1153bae61540c5497d12adf00f170f9 This seems to be unnecessary now. So maybe better to remove the dependency altogether. Signed-off-by: Marc Nuri --- jkube-kit/parent/pom.xml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index 3aefc87a0c..67e09a0f80 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -59,7 +59,6 @@ 3.5.0 1.2.6 2.0.1.Final - 2.3 9.7 @@ -925,14 +924,6 @@ maven-failsafe-plugin - - - - org.apache.maven.wagon - wagon-ssh-external - ${version.wagon-ssh-external} - - From 41b05b47ced0bc804297d20b1c1b3aa4469a184b Mon Sep 17 00:00:00 2001 From: rohit-satya <151615370+rohit-satya@users.noreply.github.com> Date: Fri, 26 Apr 2024 15:16:03 +0530 Subject: [PATCH 077/289] refactor: use lombok annotations in ConfigMap Signed-off-by: Rohit Satya --- .../jkube/kit/config/resource/ConfigMap.java | 24 ++++--------------- 1 file changed, 5 insertions(+), 19 deletions(-) diff --git a/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/ConfigMap.java b/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/ConfigMap.java index 9702244a78..1cd987b888 100644 --- a/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/ConfigMap.java +++ b/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/ConfigMap.java @@ -13,9 +13,14 @@ */ package org.eclipse.jkube.kit.config.resource; +import lombok.Getter; +import lombok.Setter; + import java.util.ArrayList; import java.util.List; +@Getter +@Setter public class ConfigMap { private String name; @@ -25,25 +30,6 @@ public void addEntry(ConfigMapEntry configMapEntry) { this.entries.add(configMapEntry); } - public List getEntries() { - return entries; - } - - /** - * Set the name of ConfigMap. - * @param name the ConfigMap name - */ - public void setName(String name) { - this.name = name; - } - - /** - * Return the name of ConfigMap. - * @return - */ - public String getName() { - return name; - } } From 6746aa21d04b32f631fc97fd1df2cc218e4c2af1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 27 Apr 2024 16:37:26 +0200 Subject: [PATCH 078/289] chore(deps): Bump org.apache.maven.plugins:maven-jar-plugin Bumps [org.apache.maven.plugins:maven-jar-plugin](https://github.com/apache/maven-jar-plugin) from 3.4.0 to 3.4.1. - [Release notes](https://github.com/apache/maven-jar-plugin/releases) - [Commits](https://github.com/apache/maven-jar-plugin/compare/maven-jar-plugin-3.4.0...maven-jar-plugin-3.4.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-jar-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 09d948c501..3459b0c73b 100644 --- a/pom.xml +++ b/pom.xml @@ -114,7 +114,7 @@ 3.1.2 3.2.4 3.6.0 - 3.4.0 + 3.4.1 3.6.3 3.12.0 3.0.1 From 163ce1cc059d6539952dcde48b5844de35e59678 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 27 Apr 2024 16:37:32 +0200 Subject: [PATCH 079/289] chore(deps): Bump org.apache.commons:commons-text from 1.10.0 to 1.12.0 Bumps org.apache.commons:commons-text from 1.10.0 to 1.12.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-text dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- jkube-kit/parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index 67e09a0f80..22076f0382 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -37,7 +37,7 @@ 1.76 1.16.1 3.13.0 - 1.10.0 + 1.12.0 2.10.1 4.4.16 4.5.14 From 2ae7e58d0e193fe39253b00c6e3077e8c8b74507 Mon Sep 17 00:00:00 2001 From: JeevananthamMoorthy Date: Mon, 29 Apr 2024 10:22:28 +0530 Subject: [PATCH 080/289] fix: removed unused import from OCIRegistryEndpoint (2992) --- .../jkube/kit/resource/helm/oci/OCIRegistryEndpoint.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/oci/OCIRegistryEndpoint.java b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/oci/OCIRegistryEndpoint.java index 19c05bd0a3..0d99235bb7 100644 --- a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/oci/OCIRegistryEndpoint.java +++ b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/oci/OCIRegistryEndpoint.java @@ -22,8 +22,6 @@ import java.util.HashMap; import java.util.Map; -import static org.apache.commons.lang3.StringUtils.EMPTY; - public class OCIRegistryEndpoint { private static final Map PROTOCOL_MAPPER = new HashMap<>(); From e892b52ee121a36623b5b60fe8218774f37aed42 Mon Sep 17 00:00:00 2001 From: rohit-satya <151615370+rohit-satya@users.noreply.github.com> Date: Mon, 29 Apr 2024 10:28:03 +0530 Subject: [PATCH 081/289] fix: replace iteration with bulk Collection.addAll() call Signed-off-by: Rohit Satya --- .../org/eclipse/jkube/kit/config/service/ApplyService.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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 18e674758c..5d51f88a38 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 @@ -568,9 +568,7 @@ protected void copyAllImageStreamTags(ImageStream from, ImageStream to) { } // now lets add them all in case 2 tags have the same name - for (TagReference tag : fromTags) { - toTags.add(tag); - } + toTags.addAll(fromTags); } } } From 1c695c764806e217ee08f84dc2efc1ede2b99062 Mon Sep 17 00:00:00 2001 From: Mukarram Haq <44123470+MukarramHaq@users.noreply.github.com> Date: Mon, 29 Apr 2024 01:01:18 -0400 Subject: [PATCH 082/289] fix: removed unused import from OpenShiftWatchMojo (#2983) Signed-off-by: Mukarram Haq --- .../jkube/maven/plugin/mojo/develop/OpenshiftWatchMojo.java | 1 - 1 file changed, 1 deletion(-) diff --git a/openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/OpenshiftWatchMojo.java b/openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/OpenshiftWatchMojo.java index 23216b8530..a4363fcb6c 100644 --- a/openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/OpenshiftWatchMojo.java +++ b/openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/OpenshiftWatchMojo.java @@ -14,7 +14,6 @@ package org.eclipse.jkube.maven.plugin.mojo.develop; import io.fabric8.kubernetes.client.KubernetesClient; -import org.apache.maven.artifact.DependencyResolutionRequiredException; import org.apache.maven.plugins.annotations.Execute; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; From dbd106799fe62a5f29715ddd2ffde750c5e78592 Mon Sep 17 00:00:00 2001 From: "Sun S. D. Tan" Date: Mon, 29 Apr 2024 09:29:37 +0200 Subject: [PATCH 083/289] fix(docker-build): Ensure Docker build arguments from properties are used during images pre-pulling (2915) fix(docker-build): Ensure Docker build arguments from properties are used during images pre-pulling Signed-off-by: Sun Seng David TAN --- test(docker-build): add tests for merging build arguments in BuildService Signed-off-by: Sun Seng David TAN --- refactor: replace custom isEmpty with StringUtils.isNotBlank Signed-off-by: Sun Seng David TAN --- CHANGELOG.md | 1 + .../build/api/helper/DockerFileUtilTest.java | 16 ++ ...ockerfile_multi_stage_with_args_no_default | 7 + .../build/service/docker/BuildService.java | 45 ++--- .../service/docker/BuildServiceTest.java | 178 +++++++++++++++++- ...ockerfile_multi_stage_with_args_no_default | 7 + 6 files changed, 232 insertions(+), 22 deletions(-) create mode 100644 jkube-kit/build/api/src/test/resources/org/eclipse/jkube/kit/build/api/helper/Dockerfile_multi_stage_with_args_no_default create mode 100644 jkube-kit/build/service/docker/src/test/resources/org/eclipse/jkube/kit/build/service/docker/Dockerfile_multi_stage_with_args_no_default diff --git a/CHANGELOG.md b/CHANGELOG.md index aaa9c0fbc6..22727fe760 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ Usage: * Fix #2470: Add configuration option for overriding buildpack builder image * Fix #2662: Sanitize VCS remote URL used in `jkube.eclipse.org/git-url` annotation * Fix #2860: Correctly pass Docker build-arg from the build configuration to the Openshift build strategy +* Fix #2901: Ensure Docker build arguments from properties are used during images pre-pulling ### 1.16.2 (2024-03-27) * Fix #2461: `k8s:watch`/`k8sWatch` should throw error in `buildpacks` build strategy diff --git a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/DockerFileUtilTest.java b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/DockerFileUtilTest.java index ff641a8c58..1669996341 100644 --- a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/DockerFileUtilTest.java +++ b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/DockerFileUtilTest.java @@ -159,6 +159,22 @@ void extractBaseImages_withMultiStageWithArgs() throws Exception { .containsExactly("fabric8/s2i-java:latest", "busybox:latest", "docker.io/library/openjdk:latest"); } + @Test + void extractBaseImages_withMultiStageAndBuildArgs() throws Exception { + // Given + File toTest = copyToTempDir("Dockerfile_multi_stage_with_args_no_default"); + Map buildArgs = new HashMap<>(); + buildArgs.put("VERSION", "latest"); + buildArgs.put("FULL_IMAGE", "busybox:latest"); + buildArgs.put("REPO_1", "docker.io/library"); + buildArgs.put("IMAGE-1", "openjdk"); + // When + List images = DockerFileUtil.extractBaseImages(toTest, new Properties(), null, buildArgs); + // Then + assertThat(images) + .containsExactly("fabric8/s2i-java:latest", "busybox:latest", "docker.io/library/openjdk:latest"); + } + @Test void extractArgsFromDockerfile() { assertAll( diff --git a/jkube-kit/build/api/src/test/resources/org/eclipse/jkube/kit/build/api/helper/Dockerfile_multi_stage_with_args_no_default b/jkube-kit/build/api/src/test/resources/org/eclipse/jkube/kit/build/api/helper/Dockerfile_multi_stage_with_args_no_default new file mode 100644 index 0000000000..9bce36f575 --- /dev/null +++ b/jkube-kit/build/api/src/test/resources/org/eclipse/jkube/kit/build/api/helper/Dockerfile_multi_stage_with_args_no_default @@ -0,0 +1,7 @@ +ARG VERSION +FROM fabric8/s2i-java:$VERSION AS BUILD +ARG FULL_IMAGE +FROM $FULL_IMAGE AS DEPLOYABLE +ARG REPO_1 +ARG IMAGE-1 +FROM $REPO_1/${IMAGE-1}:$VERSION diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java index 37d82752b3..d4cc79d024 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java @@ -27,6 +27,7 @@ import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.build.api.helper.DockerFileUtil; +import org.apache.commons.lang3.StringUtils; import org.eclipse.jkube.kit.build.api.assembly.AssemblyManager; import org.eclipse.jkube.kit.common.util.EnvUtil; import org.eclipse.jkube.kit.build.service.docker.access.BuildOptions; @@ -69,11 +70,17 @@ public class BuildService { public void buildImage(ImageConfiguration imageConfig, ImagePullManager imagePullManager, JKubeConfiguration configuration) throws IOException { + Map mergedBuildArgs = mergeBuildArgs(imageConfig, configuration); + if (imagePullManager != null) { - autoPullBaseImage(imageConfig, imagePullManager, configuration); + autoPullBaseImage(imageConfig, imagePullManager, configuration, mergedBuildArgs); } - buildImage(imageConfig, configuration, checkForNocache(imageConfig), addBuildArgs(configuration)); + buildImage(imageConfig, configuration, checkForNocache(imageConfig), mergedBuildArgs); + } + + static Map mergeBuildArgs(ImageConfiguration imageConfig, JKubeConfiguration configuration) { + return prepareBuildArgs(addBuildArgs(configuration), imageConfig.getBuildConfiguration()); } public void tagImage(String imageName, ImageConfiguration imageConfig) throws DockerAccessException { @@ -129,8 +136,6 @@ protected void buildImage(ImageConfiguration imageConfig, JKubeConfiguration par File dockerArchive = archiveService.createArchive(imageName, buildConfig, params, log); log.info("%s: Created %s in %s", imageConfig.getDescription(), dockerArchive.getName(), EnvUtil.formatDurationTill(time)); - Map mergedBuildMap = prepareBuildArgs(buildArgs, buildConfig); - // auto is now supported by docker, consider switching? BuildOptions opts = new BuildOptions(buildConfig.getBuildOptions()) @@ -138,7 +143,7 @@ protected void buildImage(ImageConfiguration imageConfig, JKubeConfiguration par .forceRemove(cleanupMode.isRemove()) .noCache(noCache) .cacheFrom(buildConfig.getCacheFrom()) - .buildArgs(mergedBuildMap); + .buildArgs(buildArgs); String newImageId = doBuildImage(imageName, dockerArchive, opts); if (newImageId == null) { throw new IllegalStateException("Failure in building image, unable to find image built with name " + imageName); @@ -160,7 +165,7 @@ protected void buildImage(ImageConfiguration imageConfig, JKubeConfiguration par } } - private Map prepareBuildArgs(Map buildArgs, BuildConfiguration buildConfig) { + private static Map prepareBuildArgs(Map buildArgs, BuildConfiguration buildConfig) { ImmutableMap.Builder builder = ImmutableMap.builder().putAll(buildArgs); if (buildConfig.getArgs() != null) { builder.putAll(buildConfig.getArgs()); @@ -182,8 +187,9 @@ private String doBuildImage(String imageName, File dockerArchive, BuildOptions o return queryService.getImageId(imageName); } - private Map addBuildArgs(JKubeConfiguration configuration) { - Map buildArgsFromProject = addBuildArgsFromProperties(configuration.getProject().getProperties()); + private static Map addBuildArgs(JKubeConfiguration configuration) { + Properties props = configuration.getProject().getProperties(); + Map buildArgsFromProject = addBuildArgsFromProperties(props); Map buildArgsFromSystem = addBuildArgsFromProperties(System.getProperties()); Map buildArgsFromDockerConfig = addBuildArgsFromDockerConfig(); return ImmutableMap.builder() @@ -194,7 +200,7 @@ private Map addBuildArgs(JKubeConfiguration configuration) { .build(); } - private Map addBuildArgsFromProperties(Properties properties) { + private static Map addBuildArgsFromProperties(Properties properties) { Map buildArgs = new HashMap<>(); for (Object keyObj : properties.keySet()) { String key = (String) keyObj; @@ -202,16 +208,15 @@ private Map addBuildArgsFromProperties(Properties properties) { String argKey = key.replaceFirst(ARG_PREFIX, ""); String value = properties.getProperty(key); - if (!isEmpty(value)) { + if (StringUtils.isNotBlank(value)) { buildArgs.put(argKey, value); } } } - log.debug("Build args set %s", buildArgs); return buildArgs; } - private Map addBuildArgsFromDockerConfig() { + private static Map addBuildArgsFromDockerConfig() { final Map dockerConfig = DockerFileUtil.readDockerConfig(); if (dockerConfig == null) { return Collections.emptyMap(); @@ -237,11 +242,11 @@ private Map addBuildArgsFromDockerConfig() { } } } - log.debug("Build args set %s", buildArgs); return buildArgs; } - private void autoPullBaseImage(ImageConfiguration imageConfig, ImagePullManager imagePullManager, JKubeConfiguration configuration) + private void autoPullBaseImage(ImageConfiguration imageConfig, ImagePullManager imagePullManager, + JKubeConfiguration configuration, Map mergedBuildArgs) throws IOException { BuildConfiguration buildConfig = imageConfig.getBuildConfiguration(); @@ -252,7 +257,7 @@ private void autoPullBaseImage(ImageConfiguration imageConfig, ImagePullManager List fromImages; if (buildConfig.isDockerFileMode()) { - fromImages = extractBaseFromDockerfile(buildConfig, configuration); + fromImages = extractBaseFromDockerfile(buildConfig, configuration, mergedBuildArgs); } else { fromImages = new LinkedList<>(); String baseImage = extractBaseFromConfiguration(buildConfig); @@ -267,13 +272,15 @@ private void autoPullBaseImage(ImageConfiguration imageConfig, ImagePullManager } } - private List extractBaseFromDockerfile(BuildConfiguration buildConfig, JKubeConfiguration configuration) { + private List extractBaseFromDockerfile(BuildConfiguration buildConfig, JKubeConfiguration configuration, + Map mergedBuildArgs) { List fromImage; try { File fullDockerFilePath = buildConfig.getAbsoluteDockerFilePath(configuration.getSourceDirectory(), Optional.ofNullable(configuration.getProject().getBaseDirectory()).map(File::toString) .orElse(null)); - fromImage = DockerFileUtil.extractBaseImages(fullDockerFilePath, configuration.getProperties(), buildConfig.getFilter(), buildConfig.getArgs()); + fromImage = DockerFileUtil.extractBaseImages(fullDockerFilePath, configuration.getProperties(), + buildConfig.getFilter(), mergedBuildArgs); } catch (IOException e) { // Cant extract base image, so we wont try an auto pull. An error will occur later anyway when // building the image, so we are passive here. @@ -292,8 +299,4 @@ private boolean checkForNocache(ImageConfiguration imageConfig) { } } - private boolean isEmpty(String str) { - return str == null || str.isEmpty(); - } - } diff --git a/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/BuildServiceTest.java b/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/BuildServiceTest.java index 662cb1a8e1..fff6800585 100644 --- a/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/BuildServiceTest.java +++ b/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/BuildServiceTest.java @@ -13,18 +13,31 @@ */ package org.eclipse.jkube.kit.build.service.docker; +import org.apache.commons.io.FileUtils; import org.eclipse.jkube.kit.build.service.docker.access.DockerAccess; import org.eclipse.jkube.kit.build.service.docker.access.DockerAccessException; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; +import java.io.File; import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Files; import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -40,12 +53,13 @@ class BuildServiceTest { private ImageConfiguration imageConfiguration; private ImagePullManager mockedImagePullManager; private JKubeConfiguration mockedJKubeConfiguration; + private RegistryService mockedRegistryService; @BeforeEach void setUp() { mockedDockerAccess = mock(DockerAccess.class, RETURNS_DEEP_STUBS); ArchiveService mockedArchiveService = mock(ArchiveService.class, RETURNS_DEEP_STUBS); - RegistryService mockedRegistryService = mock(RegistryService.class, RETURNS_DEEP_STUBS); + mockedRegistryService = mock(RegistryService.class, RETURNS_DEEP_STUBS); KitLogger mockedLog = mock(KitLogger.SilentLogger.class, RETURNS_DEEP_STUBS); mockedImagePullManager = mock(ImagePullManager.class, RETURNS_DEEP_STUBS); mockedJKubeConfiguration = mock(JKubeConfiguration.class, RETURNS_DEEP_STUBS); @@ -93,4 +107,166 @@ void tagImage_whenValidImageConfigurationProvided_shouldTagImage() throws Docker .tag("image-name", "image-name:latest", true); } + @Test + void mergeBuildArgs_whenBuildArgsFromImageConfigAndFromProjectProperties_shouldMergeBuildArgs() { + // Given + Properties props = new Properties(); + props.setProperty("docker.buildArg.VERSION", "latest"); + props.setProperty("docker.buildArg.FULL_IMAGE", "busybox:latest"); + when(mockedJKubeConfiguration.getProject().getProperties()).thenReturn(props); + + Map imgConfigBuildArg = new HashMap<>(); + imgConfigBuildArg.put("REPO_1", "docker.io/library"); + imgConfigBuildArg.put("IMAGE-1", "openjdk"); + imageConfiguration = ImageConfiguration.builder() + .name("image-name") + .build(BuildConfiguration.builder() + .args(imgConfigBuildArg) + .build()) + .build(); + + // When + Map mergedBuildArgs = BuildService.mergeBuildArgs(imageConfiguration, mockedJKubeConfiguration); + + // Then + assertThat(mergedBuildArgs) + .containsEntry("VERSION", "latest") + .containsEntry("FULL_IMAGE", "busybox:latest") + .containsEntry("REPO_1", "docker.io/library") + .containsEntry("IMAGE-1", "openjdk"); + } + + @Nested + @DisplayName("mergeBuildArgs with BuildArgs") + class MergeBuildArgs { + @Test + void fromAllSourcesWithDifferentKeys_shouldMergeBuildArgs() { + // Given + givenBuildArgsFromImageConfiguration("VERSION", "latest"); + givenBuildArgsFromSystemProperties("docker.buildArg.IMAGE-1", "openjdk"); + givenBuildArgsFromProjectProperties("docker.buildArg.REPO_1", "docker.io/library"); + givenBuildArgsFromJKubeConfiguration("FULL_IMAGE", "busybox:latest"); + + // When + Map mergedBuildArgs = BuildService.mergeBuildArgs(imageConfiguration, mockedJKubeConfiguration); + + // Then + assertThat(mergedBuildArgs) + .containsEntry("VERSION", "latest") + .containsEntry("FULL_IMAGE", "busybox:latest") + .containsEntry("REPO_1", "docker.io/library") + .containsEntry("IMAGE-1", "openjdk"); + } + + @Test + void fromBuildConfigurationAndSystemPropertiesWithSameKey_shouldNotMergeBuildArgs() { + // Given + givenBuildArgsFromImageConfiguration("VERSION", "latest"); + givenBuildArgsFromSystemProperties("docker.buildArg.VERSION", "1.0.0"); + + // When & Then + assertThatIllegalArgumentException() + .isThrownBy(() -> BuildService.mergeBuildArgs(imageConfiguration, mockedJKubeConfiguration)) + .withMessage("Multiple entries with same key: VERSION=latest and VERSION=1.0.0"); + } + + @Test + void fromBuildConfigurationAndProjectPropertiesWithSameKey_shouldNotMergeBuildArgs() { + // Given + givenBuildArgsFromImageConfiguration("VERSION", "latest"); + givenBuildArgsFromProjectProperties("docker.buildArg.VERSION", "1.0.0"); + + // When & Then + assertThatIllegalArgumentException() + .isThrownBy(() -> BuildService.mergeBuildArgs(imageConfiguration, mockedJKubeConfiguration)) + .withMessage("Multiple entries with same key: VERSION=latest and VERSION=1.0.0"); + } + + @Test + void fromBuildConfigurationAndJKubeConfigurationWithSameKey_shouldNotMergeBuildArgs() { + // Given + givenBuildArgsFromImageConfiguration("VERSION", "latest"); + givenBuildArgsFromJKubeConfiguration("VERSION", "1.0.0"); + + // When & Then + assertThatIllegalArgumentException() + .isThrownBy(() -> BuildService.mergeBuildArgs(imageConfiguration, mockedJKubeConfiguration)) + .withMessage("Multiple entries with same key: VERSION=latest and VERSION=1.0.0"); + } + + private void givenBuildArgsFromImageConfiguration(String key, String value) { + imageConfiguration = ImageConfiguration.builder() + .name("image-name") + .build(BuildConfiguration.builder() + .args( + Collections.singletonMap(key, value)) + .build()) + .build(); + } + + private void givenBuildArgsFromSystemProperties(String key, String value) { + System.setProperty(key, value); + } + + private void givenBuildArgsFromProjectProperties(String key, String value) { + Properties props = new Properties(); + props.setProperty(key, value); + when(mockedJKubeConfiguration.getProject().getProperties()) + .thenReturn(props); + } + + private void givenBuildArgsFromJKubeConfiguration(String key, String value) { + when(mockedJKubeConfiguration.getBuildArgs()) + .thenReturn(Collections.singletonMap(key, value)); + } + + @AfterEach + void clearSystemPropertiesUsedInTests() { + System.clearProperty("docker.buildArg.IMAGE-1"); + System.clearProperty("docker.buildArg.VERSION"); + } + } + + @Test + void buildImage_whenMultiStageDockerfileWithBuildArgs_shouldPrepullImages() throws IOException { + // Given + when(mockedDockerAccess.getImageId("image-name")).thenReturn("c8003cb6f5db"); + when(mockedJKubeConfiguration.getSourceDirectory()).thenReturn(tempDir.getAbsolutePath()); + when(mockedJKubeConfiguration.getProject().getBaseDirectory()).thenReturn(tempDir); + File multistageDockerfile = copyToTempDir("Dockerfile_multi_stage_with_args_no_default"); + imageConfiguration = ImageConfiguration.builder() + .name("image-name") + .build(BuildConfiguration.builder() + .dockerFile(multistageDockerfile.getPath()) + .dockerFileFile(multistageDockerfile) + .build()) + .build(); + + Properties props = new Properties(); + props.setProperty("docker.buildArg.VERSION", "latest"); + props.setProperty("docker.buildArg.FULL_IMAGE", "busybox:latest"); + props.setProperty("docker.buildArg.REPO_1", "docker.io/library"); + props.setProperty("docker.buildArg.IMAGE-1", "openjdk"); + when(mockedJKubeConfiguration.getProject().getProperties()).thenReturn(props); + + // When + buildService.buildImage(imageConfiguration, mockedImagePullManager, mockedJKubeConfiguration); + + // Then + verify(mockedRegistryService, times(1)).pullImageWithPolicy(eq("fabric8/s2i-java:latest"), any(), any(), any()); + verify(mockedRegistryService, times(1)).pullImageWithPolicy(eq("busybox:latest"), any(), any(), any()); + verify(mockedRegistryService, times(1)).pullImageWithPolicy(eq("docker.io/library/openjdk:latest"), any(), any(), + any()); + } + + @TempDir + private File tempDir; + + private File copyToTempDir(String resource) throws IOException { + File ret = new File(tempDir, "Dockerfile"); + try (OutputStream os = Files.newOutputStream(ret.toPath())) { + FileUtils.copyFile(new File(getClass().getResource(resource).getPath()), os); + } + return ret; + } } diff --git a/jkube-kit/build/service/docker/src/test/resources/org/eclipse/jkube/kit/build/service/docker/Dockerfile_multi_stage_with_args_no_default b/jkube-kit/build/service/docker/src/test/resources/org/eclipse/jkube/kit/build/service/docker/Dockerfile_multi_stage_with_args_no_default new file mode 100644 index 0000000000..9bce36f575 --- /dev/null +++ b/jkube-kit/build/service/docker/src/test/resources/org/eclipse/jkube/kit/build/service/docker/Dockerfile_multi_stage_with_args_no_default @@ -0,0 +1,7 @@ +ARG VERSION +FROM fabric8/s2i-java:$VERSION AS BUILD +ARG FULL_IMAGE +FROM $FULL_IMAGE AS DEPLOYABLE +ARG REPO_1 +ARG IMAGE-1 +FROM $REPO_1/${IMAGE-1}:$VERSION From a652a8083e2be4c1ac4ee7de956284e03c4ca04f Mon Sep 17 00:00:00 2001 From: Davide Cavestro Date: Mon, 29 Apr 2024 12:11:49 +0200 Subject: [PATCH 084/289] feat: provide a way to set labels on images defined by Generators (#2885) (2956) feat: provide a way to set labels on images defined by Generators (#2885) --- doc: update CHANGELOG.md --- CHANGELOG.md | 1 + .../inc/generator/_options_common.adoc | 4 ++++ .../generator/api/support/BaseGenerator.java | 17 +++++++++++++++++ .../api/support/BaseGeneratorTest.java | 19 +++++++++++++++++++ 4 files changed, 41 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22727fe760..378616ddc1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -27,6 +27,7 @@ Usage: * Fix #2470: Add configuration option for overriding buildpack builder image * Fix #2662: Sanitize VCS remote URL used in `jkube.eclipse.org/git-url` annotation * Fix #2860: Correctly pass Docker build-arg from the build configuration to the Openshift build strategy +* Fix #2885: Provide a way to set labels on images defined by Generators * Fix #2901: Ensure Docker build arguments from properties are used during images pre-pulling ### 1.16.2 (2024-03-27) diff --git a/jkube-kit/doc/src/main/asciidoc/inc/generator/_options_common.adoc b/jkube-kit/doc/src/main/asciidoc/inc/generator/_options_common.adoc index 6d58940670..00c82f9776 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/generator/_options_common.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/generator/_options_common.adoc @@ -35,6 +35,10 @@ or already added by a generator which has been run previously. The mode takes only effect when running in OpenShift mode. | `jkube.generator.fromMode` +| *labels* +| A comma separated list of additional labels you want to set on your image with +| `jkube.generator.labels` + | *name* | The Docker image name used when doing Docker builds. For OpenShift S2I builds its the name of the image stream. This can be a pattern as described in <>. The default is `%g/%a:%l`. Note that this flag would only work diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java index 07c21b54d1..4be4af3815 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java @@ -80,6 +80,9 @@ enum Config implements Configs.Config { FROM_MODE("fromMode", null), BUILDPACKS_BUILDER_IMAGE("buildpacksBuilderImage", null), + // Labels + LABELS("labels", null), + // Optional registry REGISTRY("registry", null), @@ -254,6 +257,18 @@ private boolean containsBuildConfiguration(List configs) { return false; } + + protected void addLabelsFromConfig(Map labels) { + String commaSeparatedLabels = getConfigWithFallback(Config.LABELS, "jkube.generator.labels", null); + if (StringUtils.isNotBlank(commaSeparatedLabels)) { + Map configLabels = Arrays.stream(commaSeparatedLabels.split(",")) + .map(envNameValue -> envNameValue.split("=")) + .filter(e -> e.length == 2) + .collect(Collectors.toMap(e -> e[0].trim(), e -> e[1].trim())); + labels.putAll(configLabels); + } + } + protected void addSchemaLabels(BuildConfiguration.BuildConfigurationBuilder buildBuilder, PrefixedLogger log) { final JavaProject project = getProject(); String docURL = project.getDocumentationUrl(); @@ -274,6 +289,8 @@ protected void addSchemaLabels(BuildConfiguration.BuildConfigurationBuilder buil labels.put(BuildLabelAnnotations.VERSION.value(), project.getVersion()); labels.put(BuildLabelAnnotations.SCHEMA_VERSION.value(), LABEL_SCHEMA_VERSION); + addLabelsFromConfig(labels); + try { Repository repository = GitUtil.getGitRepository(project.getBaseDirectory()); if (repository != null) { diff --git a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java index 67cbf7b5d7..13dce83ed5 100644 --- a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java +++ b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java @@ -17,6 +17,8 @@ import java.util.Collections; import java.util.List; import java.util.Properties; +import java.util.Map; +import java.util.LinkedHashMap; import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.generator.api.FromSelector; @@ -420,6 +422,23 @@ void addTagsFromProperty() { .containsExactlyInAnyOrder("tag-1", "tag-2", "other-tag"); } + @Test + @DisplayName("add labels from property") + void addLabelsFromProperty() { + when(ctx.getProject()).thenReturn(project); + BuildConfiguration.BuildConfigurationBuilder builder = BuildConfiguration.builder(); + properties.put("jkube.generator.labels", " label-1=a, label-2=b , invalid-label"); + Map extractedLabels = new LinkedHashMap<>(); + BaseGenerator generator = createGenerator(null); + generator.addLabelsFromConfig(extractedLabels); + assertThat(extractedLabels) + .hasSize(2) + .contains( + entry("label-1", "a"), + entry("label-2", "b") + ); + } + private void inKubernetes() { when(ctx.getRuntimeMode()).thenReturn(RuntimeMode.KUBERNETES); } From 34e578d90ef54eef2dfef81667926eae7a631138 Mon Sep 17 00:00:00 2001 From: Arman Yekkehkhani <72594459+arman-yekkehkhani@users.noreply.github.com> Date: Mon, 29 Apr 2024 14:22:27 +0330 Subject: [PATCH 085/289] fix: removed unused import from OCIRegistryInterceptorTest Signed-off-by: arman-yekkehkhani --- .../jkube/kit/resource/helm/oci/OCIRegistryInterceptorTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/oci/OCIRegistryInterceptorTest.java b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/oci/OCIRegistryInterceptorTest.java index 60efd4f372..fa2f47ac8a 100644 --- a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/oci/OCIRegistryInterceptorTest.java +++ b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/oci/OCIRegistryInterceptorTest.java @@ -13,7 +13,6 @@ */ package org.eclipse.jkube.kit.resource.helm.oci; -import java.io.IOException; import java.util.Collections; import java.util.List; import java.util.Map; From fc8499651095127797cbc7a534c612dca7788233 Mon Sep 17 00:00:00 2001 From: "Sun S. D. Tan" Date: Tue, 30 Apr 2024 10:03:52 +0200 Subject: [PATCH 086/289] doc: update titles for plugins documentation pages Signed-off-by: Sun Seng David TAN --- gradle-plugin/doc/src/main/asciidoc/index.adoc | 2 +- kubernetes-maven-plugin/doc/src/main/asciidoc/index.adoc | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle-plugin/doc/src/main/asciidoc/index.adoc b/gradle-plugin/doc/src/main/asciidoc/index.adoc index 45ebc626bc..6da5277029 100644 --- a/gradle-plugin/doc/src/main/asciidoc/index.adoc +++ b/gradle-plugin/doc/src/main/asciidoc/index.adoc @@ -1,4 +1,4 @@ -= org.eclipse.jkube/{plugin} += Eclipse JKube documentation / {plugin} :plugin: kubernetes-gradle-plugin :task-prefix: k8s :cluster: Kubernetes diff --git a/kubernetes-maven-plugin/doc/src/main/asciidoc/index.adoc b/kubernetes-maven-plugin/doc/src/main/asciidoc/index.adoc index b4b5fc6e48..1f51b1ef62 100644 --- a/kubernetes-maven-plugin/doc/src/main/asciidoc/index.adoc +++ b/kubernetes-maven-plugin/doc/src/main/asciidoc/index.adoc @@ -1,4 +1,4 @@ -= org.eclipse.jkube/{plugin} += Eclipse JKube documentation / {plugin} Roland Huß, James Strachan; :plugin: kubernetes-maven-plugin :goal-prefix: k8s From f342a9c614e68661054ba62f705318e375af9300 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 11:16:52 +0200 Subject: [PATCH 087/289] chore(deps): Bump org.codehaus.plexus:plexus-classworlds Bumps [org.codehaus.plexus:plexus-classworlds](https://github.com/codehaus-plexus/plexus-classworlds) from 2.7.0 to 2.8.0. - [Release notes](https://github.com/codehaus-plexus/plexus-classworlds/releases) - [Commits](https://github.com/codehaus-plexus/plexus-classworlds/compare/plexus-classworlds-2.7.0...plexus-classworlds-2.8.0) --- updated-dependencies: - dependency-name: org.codehaus.plexus:plexus-classworlds dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- jkube-kit/parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index 22076f0382..c4399d50c3 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -54,7 +54,7 @@ 3.9.0 1.4.0 ${version.kubernetes-client} - 2.7.0 + 2.8.0 0.0.7 3.5.0 1.2.6 From cbb5d9c4b0624f12a07cb20c47d4e802b344b464 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 11:17:01 +0200 Subject: [PATCH 088/289] chore(deps): Bump commons-codec:commons-codec from 1.16.1 to 1.17.0 Bumps [commons-codec:commons-codec](https://github.com/apache/commons-codec) from 1.16.1 to 1.17.0. - [Changelog](https://github.com/apache/commons-codec/blob/master/RELEASE-NOTES.txt) - [Commits](https://github.com/apache/commons-codec/compare/rel/commons-codec-1.16.1...rel/commons-codec-1.17.0) --- updated-dependencies: - dependency-name: commons-codec:commons-codec dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- jkube-kit/parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index c4399d50c3..98e56d6245 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -35,7 +35,7 @@ UTF-8 1.76 - 1.16.1 + 1.17.0 3.13.0 1.12.0 2.10.1 From e35e6be815d187f451c309cd0ec85b42ec7d1623 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 30 Apr 2024 11:17:09 +0200 Subject: [PATCH 089/289] chore(deps): Bump step-security/harden-runner from 2.7.0 to 2.7.1 Bumps [step-security/harden-runner](https://github.com/step-security/harden-runner) from 2.7.0 to 2.7.1. - [Release notes](https://github.com/step-security/harden-runner/releases) - [Commits](https://github.com/step-security/harden-runner/compare/63c24ba6bd7ba022e95695ff85de572c04a18142...a4aa98b93cab29d9b1101a6143fb8bce00e2eac4) --- updated-dependencies: - dependency-name: step-security/harden-runner dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/license.yml | 2 +- .github/workflows/quickstarts.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/license.yml b/.github/workflows/license.yml index e6ddd92ab4..174afb7172 100644 --- a/.github/workflows/license.yml +++ b/.github/workflows/license.yml @@ -29,7 +29,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/quickstarts.yml b/.github/workflows/quickstarts.yml index 86bfea621d..8a42fe0e93 100644 --- a/.github/workflows/quickstarts.yml +++ b/.github/workflows/quickstarts.yml @@ -29,7 +29,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@63c24ba6bd7ba022e95695ff85de572c04a18142 + uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 with: disable-sudo: true egress-policy: block From 1fd72cdbb6f23b0783d36b6121cf9016a91dc128 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Tue, 30 Apr 2024 11:18:02 +0200 Subject: [PATCH 090/289] refactor: tests and code organization for generator labels config Signed-off-by: Marc Nuri --- .../generator/api/support/BaseGenerator.java | 30 +++---- .../api/support/BaseGeneratorTest.java | 79 ++++++------------- .../generator/javaexec/JavaExecGenerator.java | 1 + ...JavaExecGeneratorCustomPropertiesTest.java | 16 ++++ .../jkube/generator/karaf/KarafGenerator.java | 1 + .../generator/webapp/WebAppGenerator.java | 1 + .../generator/webapp/WebAppGeneratorTest.java | 2 + 7 files changed, 59 insertions(+), 71 deletions(-) diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java index 4be4af3815..8fdc431136 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java @@ -50,6 +50,8 @@ public abstract class BaseGenerator implements Generator { public static final String PROPERTY_JKUBE_IMAGE_NAME = "jkube.image.name"; public static final String PROPERTY_JKUBE_GENERATOR_NAME = "jkube.generator.name"; + private static final String PROPERTY_JKUBE_GENERATOR_LABELS = "jkube.generator.labels"; + private static final String LABEL_SCHEMA_VERSION = "1.0"; private static final String GIT_REMOTE = "origin"; @@ -257,22 +259,10 @@ private boolean containsBuildConfiguration(List configs) { return false; } - - protected void addLabelsFromConfig(Map labels) { - String commaSeparatedLabels = getConfigWithFallback(Config.LABELS, "jkube.generator.labels", null); - if (StringUtils.isNotBlank(commaSeparatedLabels)) { - Map configLabels = Arrays.stream(commaSeparatedLabels.split(",")) - .map(envNameValue -> envNameValue.split("=")) - .filter(e -> e.length == 2) - .collect(Collectors.toMap(e -> e[0].trim(), e -> e[1].trim())); - labels.putAll(configLabels); - } - } - protected void addSchemaLabels(BuildConfiguration.BuildConfigurationBuilder buildBuilder, PrefixedLogger log) { final JavaProject project = getProject(); String docURL = project.getDocumentationUrl(); - Map labels = new HashMap<>(); + final Map labels = new HashMap<>(buildBuilder.build().getLabels()); labels.put(BuildLabelAnnotations.BUILD_DATE.value(), getProject().getBuildDate().format(DateTimeFormatter.ISO_DATE)); labels.put(BuildLabelAnnotations.NAME.value(), project.getName()); @@ -289,8 +279,6 @@ protected void addSchemaLabels(BuildConfiguration.BuildConfigurationBuilder buil labels.put(BuildLabelAnnotations.VERSION.value(), project.getVersion()); labels.put(BuildLabelAnnotations.SCHEMA_VERSION.value(), LABEL_SCHEMA_VERSION); - addLabelsFromConfig(labels); - try { Repository repository = GitUtil.getGitRepository(project.getBaseDirectory()); if (repository != null) { @@ -310,4 +298,16 @@ protected void addSchemaLabels(BuildConfiguration.BuildConfigurationBuilder buil } } + protected void addLabelsFromConfig(BuildConfiguration.BuildConfigurationBuilder buildBuilder) { + final String commaSeparatedLabels = getConfigWithFallback(Config.LABELS, PROPERTY_JKUBE_GENERATOR_LABELS, null); + if (StringUtils.isNotBlank(commaSeparatedLabels)) { + final Map labels = new HashMap<>(buildBuilder.build().getLabels()); + Arrays.stream(commaSeparatedLabels.split(",")) + .map(envNameValue -> envNameValue.split("=")) + .filter(e -> e.length == 2) + .forEach(e -> labels.put(e[0].trim(), e[1].trim())); + buildBuilder.labels(labels); + } + } + } diff --git a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java index 13dce83ed5..49823cffb6 100644 --- a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java +++ b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java @@ -13,17 +13,15 @@ */ package org.eclipse.jkube.generator.api.support; -import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Properties; -import java.util.Map; -import java.util.LinkedHashMap; import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.generator.api.FromSelector; import org.eclipse.jkube.generator.api.GeneratorContext; import org.eclipse.jkube.kit.common.JavaProject; +import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.resource.ProcessorConfig; @@ -37,31 +35,24 @@ import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; import static org.assertj.core.api.AssertionsForClassTypes.entry; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; -import static org.mockito.Mockito.RETURNS_DEEP_STUBS; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * @author roland - */ class BaseGeneratorTest { - private GeneratorContext ctx; - private JavaProject project; private Properties properties; + private GeneratorContext ctx; private ProcessorConfig config; @BeforeEach void setUp() { - ctx = mock(GeneratorContext.class,RETURNS_DEEP_STUBS); - project = mock(JavaProject.class); properties = new Properties(); config = new ProcessorConfig(); - - when(project.getProperties()).thenReturn(properties); - when(ctx.getProject()).thenReturn(project); - when(ctx.getConfig()).thenReturn(config); + ctx = GeneratorContext.builder() + .logger(new KitLogger.SilentLogger()) + .project(JavaProject.builder() + .properties(properties) + .build()) + .config(config) + .build(); } @AfterEach @@ -198,11 +189,6 @@ void getRegistryInOpenshiftShouldReturnNull() { assertThat(result).isNull(); } - private TestBaseGenerator createGenerator(FromSelector fromSelector) { - return fromSelector != null ? new TestBaseGenerator(ctx, "test-generator", fromSelector) - : new TestBaseGenerator(ctx, "test-generator"); - } - @Nested @DisplayName("add from") class AddFrom { @@ -334,29 +320,20 @@ void addFromWithInvalidModeShouldThrowException() { @Test @DisplayName("should add default image") void shouldAddDefaultImage() { - ImageConfiguration ic1 = mock(ImageConfiguration.class); - ImageConfiguration ic2 = mock(ImageConfiguration.class); - BuildConfiguration bc = mock(BuildConfiguration.class); - when(ic1.getBuildConfiguration()).thenReturn(bc); - when(ic2.getBuildConfiguration()).thenReturn(null); - BaseGenerator generator = createGenerator(null); + BaseGenerator generator = new TestBaseGenerator(ctx, "test-generator"); assertThat(generator) - .returns(true, g -> g.shouldAddGeneratedImageConfiguration(Collections.emptyList())) - .returns(false, g -> g.shouldAddGeneratedImageConfiguration(Arrays.asList(ic1, ic2))) - .returns(true, g -> g.shouldAddGeneratedImageConfiguration(Collections.singletonList(ic2))) - .returns(false, g -> g.shouldAddGeneratedImageConfiguration(Collections.singletonList(ic1))); + .returns(true, g -> g.shouldAddGeneratedImageConfiguration(Collections.emptyList())); } @Test @DisplayName("should add generated image configuration when add enabled via config, should return true") void shouldAddGeneratedImageConfiguration_whenAddEnabledViaConfig_shouldReturnTrue() { // Given - when(ctx.getProject()).thenReturn(project); properties.put("jkube.generator.test-generator.add", "true"); - BaseGenerator generator = createGenerator(null); // When - boolean result = generator.shouldAddGeneratedImageConfiguration(createNewImageConfigurationList()); + boolean result = new TestBaseGenerator(ctx, "test-generator") + .shouldAddGeneratedImageConfiguration(createNewImageConfigurationList()); // Then assertThat(result).isTrue(); @@ -367,12 +344,11 @@ void shouldAddGeneratedImageConfiguration_whenAddEnabledViaConfig_shouldReturnTr @DisplayName("should add generated image configuration when enabled via property, should return true") void shouldAddGeneratedImageConfiguration_whenAddEnabledViaProperty_shouldReturnTrue() { // Given - when(ctx.getProject()).thenReturn(project); properties.put("jkube.generator.add", "true"); - BaseGenerator generator = createGenerator(null); // When - boolean result = generator.shouldAddGeneratedImageConfiguration(createNewImageConfigurationList()); + boolean result = new TestBaseGenerator(ctx, "test-generator") + .shouldAddGeneratedImageConfiguration(createNewImageConfigurationList()); // Then assertThat(result).isTrue(); @@ -381,11 +357,9 @@ void shouldAddGeneratedImageConfiguration_whenAddEnabledViaProperty_shouldReturn @Test @DisplayName("add latest tag if project's version is SNAPSHOT") void addLatestTagIfSnapshot() { - when(ctx.getProject()).thenReturn(project); - when(project.getVersion()).thenReturn("1.2-SNAPSHOT"); + ctx = ctx.toBuilder().project(ctx.getProject().toBuilder().version("1.2-SNAPSHOT").build()).build(); BuildConfiguration.BuildConfigurationBuilder builder = BuildConfiguration.builder(); - BaseGenerator generator = createGenerator(null); - generator.addLatestTagIfSnapshot(builder); + new TestBaseGenerator(ctx, "test-generator").addLatestTagIfSnapshot(builder); BuildConfiguration config = builder.build(); List tags = config.getTags(); assertThat(tags) @@ -397,11 +371,9 @@ void addLatestTagIfSnapshot() { @Test @DisplayName("add tags from config") void addTagsFromConfig() { - when(ctx.getProject()).thenReturn(project); BuildConfiguration.BuildConfigurationBuilder builder = BuildConfiguration.builder(); properties.put("jkube.generator.test-generator.tags", " tag-1, tag-2 , other-tag"); - BaseGenerator generator = createGenerator(null); - generator.addTagsFromConfig(builder); + new TestBaseGenerator(ctx, "test-generator").addTagsFromConfig(builder); BuildConfiguration config = builder.build(); assertThat(config.getTags()) .hasSize(3) @@ -411,11 +383,9 @@ void addTagsFromConfig() { @Test @DisplayName("add tags from property") void addTagsFromProperty() { - when(ctx.getProject()).thenReturn(project); BuildConfiguration.BuildConfigurationBuilder builder = BuildConfiguration.builder(); properties.put("jkube.generator.tags", " tag-1, tag-2 , other-tag"); - BaseGenerator generator = createGenerator(null); - generator.addTagsFromConfig(builder); + new TestBaseGenerator(ctx, "test-generator").addTagsFromConfig(builder); BuildConfiguration config = builder.build(); assertThat(config.getTags()) .hasSize(3) @@ -425,13 +395,10 @@ void addTagsFromProperty() { @Test @DisplayName("add labels from property") void addLabelsFromProperty() { - when(ctx.getProject()).thenReturn(project); BuildConfiguration.BuildConfigurationBuilder builder = BuildConfiguration.builder(); properties.put("jkube.generator.labels", " label-1=a, label-2=b , invalid-label"); - Map extractedLabels = new LinkedHashMap<>(); - BaseGenerator generator = createGenerator(null); - generator.addLabelsFromConfig(extractedLabels); - assertThat(extractedLabels) + new TestBaseGenerator(ctx, "test-generator").addLabelsFromConfig(builder); + assertThat(builder.build().getLabels()) .hasSize(2) .contains( entry("label-1", "a"), @@ -440,11 +407,11 @@ void addLabelsFromProperty() { } private void inKubernetes() { - when(ctx.getRuntimeMode()).thenReturn(RuntimeMode.KUBERNETES); + ctx = ctx.toBuilder().runtimeMode(RuntimeMode.KUBERNETES).build(); } private void inOpenShift() { - when(ctx.getRuntimeMode()).thenReturn(RuntimeMode.OPENSHIFT); + ctx = ctx.toBuilder().runtimeMode(RuntimeMode.OPENSHIFT).build(); } private static class TestBaseGenerator extends BaseGenerator { diff --git a/jkube-kit/generator/java-exec/src/main/java/org/eclipse/jkube/generator/javaexec/JavaExecGenerator.java b/jkube-kit/generator/java-exec/src/main/java/org/eclipse/jkube/generator/javaexec/JavaExecGenerator.java index 03b8a238ee..23c6d73929 100644 --- a/jkube-kit/generator/java-exec/src/main/java/org/eclipse/jkube/generator/javaexec/JavaExecGenerator.java +++ b/jkube-kit/generator/java-exec/src/main/java/org/eclipse/jkube/generator/javaexec/JavaExecGenerator.java @@ -141,6 +141,7 @@ public List customize(List configs, bool protected BuildConfiguration.BuildConfigurationBuilder initImageBuildConfiguration(boolean prePackagePhase) { final BuildConfiguration.BuildConfigurationBuilder buildBuilder = BuildConfiguration.builder(); addSchemaLabels(buildBuilder, log); + addLabelsFromConfig(buildBuilder); addFrom(buildBuilder); if (!prePackagePhase) { // Only add assembly if not in a pre-package phase where the referenced files diff --git a/jkube-kit/generator/java-exec/src/test/java/org/eclipse/jkube/generator/javaexec/JavaExecGeneratorCustomPropertiesTest.java b/jkube-kit/generator/java-exec/src/test/java/org/eclipse/jkube/generator/javaexec/JavaExecGeneratorCustomPropertiesTest.java index 6667792c8c..e7e4d9c85b 100644 --- a/jkube-kit/generator/java-exec/src/test/java/org/eclipse/jkube/generator/javaexec/JavaExecGeneratorCustomPropertiesTest.java +++ b/jkube-kit/generator/java-exec/src/test/java/org/eclipse/jkube/generator/javaexec/JavaExecGeneratorCustomPropertiesTest.java @@ -101,4 +101,20 @@ void customize_withDisabledPrometheus_shouldRemovePortAndAddEnv() { .extracting(BuildConfiguration::getEnv) .hasFieldOrPropertyWithValue("AB_PROMETHEUS_OFF", "true"); } + + @Test + void customize_withCustomLabels_shouldAddLabels() { + // Given + projectProperties.put("jkube.generator.java-exec.labels", "app=MyApp,version=1.0"); + projectProperties.put("jkube.generator.java-exec.mainClass", "com.example.Main"); + // When + final List result = new JavaExecGenerator(generatorContext) + .customize(new ArrayList<>(), false); + // Then + assertThat(result).singleElement() + .extracting(ImageConfiguration::getBuildConfiguration) + .extracting(BuildConfiguration::getLabels) + .hasFieldOrPropertyWithValue("app", "MyApp") + .hasFieldOrPropertyWithValue("version", "1.0"); + } } diff --git a/jkube-kit/generator/karaf/src/main/java/org/eclipse/jkube/generator/karaf/KarafGenerator.java b/jkube-kit/generator/karaf/src/main/java/org/eclipse/jkube/generator/karaf/KarafGenerator.java index 6a11d83bde..cfa0ede2e4 100644 --- a/jkube-kit/generator/karaf/src/main/java/org/eclipse/jkube/generator/karaf/KarafGenerator.java +++ b/jkube-kit/generator/karaf/src/main/java/org/eclipse/jkube/generator/karaf/KarafGenerator.java @@ -71,6 +71,7 @@ public List customize(List configs, bool .putEnv("KARAF_HOME", "/deployments/karaf"); addSchemaLabels(buildBuilder, log); + addLabelsFromConfig(buildBuilder); addFrom(buildBuilder); if (!prePackagePhase) { buildBuilder.assembly(createDefaultAssembly()); diff --git a/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/WebAppGenerator.java b/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/WebAppGenerator.java index d61b2059a6..b15a1e4f34 100644 --- a/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/WebAppGenerator.java +++ b/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/WebAppGenerator.java @@ -125,6 +125,7 @@ public List customize(List configs, bool handler.runCmds().forEach(buildBuilder::runCmd); addSchemaLabels(buildBuilder, log); + addLabelsFromConfig(buildBuilder); if (!prePackagePhase) { buildBuilder.assembly(createAssembly(handler)); } diff --git a/jkube-kit/generator/webapp/src/test/java/org/eclipse/jkube/generator/webapp/WebAppGeneratorTest.java b/jkube-kit/generator/webapp/src/test/java/org/eclipse/jkube/generator/webapp/WebAppGeneratorTest.java index 4ef18c1640..8180a839cc 100644 --- a/jkube-kit/generator/webapp/src/test/java/org/eclipse/jkube/generator/webapp/WebAppGeneratorTest.java +++ b/jkube-kit/generator/webapp/src/test/java/org/eclipse/jkube/generator/webapp/WebAppGeneratorTest.java @@ -144,6 +144,7 @@ void withOverriddenProperties_shouldAddImageConfiguration() throws IOException { projectProperties.put("jkube.generator.webapp.ports", "8082,80"); projectProperties.put("jkube.generator.webapp.supportsS2iBuild", "true"); projectProperties.put("jkube.generator.from", "image-to-trigger-custom-app-server-handler"); + projectProperties.put("jkube.generator.labels", "app=webapp"); generatorContext = generatorContext.toBuilder() .runtimeMode(RuntimeMode.OPENSHIFT) @@ -167,6 +168,7 @@ void withOverriddenProperties_shouldAddImageConfiguration() throws IOException { .hasFieldOrPropertyWithValue("ports", Arrays.asList("8082", "80")) .hasFieldOrPropertyWithValue("env", Collections.singletonMap("DEPLOY_DIR", "/other-dir")) .hasFieldOrPropertyWithValue("cmd.shell", "sleep 3600") + .hasFieldOrPropertyWithValue("labels.app", "webapp") .extracting(BuildConfiguration::getAssembly) .hasFieldOrPropertyWithValue("excludeFinalOutputArtifact", true) .hasFieldOrPropertyWithValue("user", "root") From 6a3e71c6684133922c95e713d5e374a50d09ea99 Mon Sep 17 00:00:00 2001 From: Kushagra Sinha Date: Tue, 30 Apr 2024 15:10:57 +0530 Subject: [PATCH 091/289] test: GoTimeUtilTest asserts optional with assertj Update GoTimeUtilTest.java GoTimeUtilTest is refactored to not directly call Optional.get(). --- Merge pull request #1 from kushagrasinha123ks/kushagra/issue#2970 Update GoTimeUtilTest.java --- Revert "Update GoTimeUtilTest.java" --- Merge pull request #2 from kushagrasinha123ks/revert-1-kushagra/issue#2970 Revert "Update GoTimeUtilTest.java" --- Update GoTimeUtilTest.java GoTimeUtilTest is refactored to not directly call Optional.get(). --- Update GoTimeUtilTest.java inlined the method calls in conversion function --- Update GoTimeUtilTest.java removed the unused imports. --- .../eclipse/jkube/kit/enricher/api/util/GoTimeUtilTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/GoTimeUtilTest.java b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/GoTimeUtilTest.java index eca8f17ecd..359256ebef 100644 --- a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/GoTimeUtilTest.java +++ b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/GoTimeUtilTest.java @@ -32,8 +32,7 @@ class GoTimeUtilTest { @ParameterizedTest(name = "duration ''{0}'' should be ''{1}'' seconds") @MethodSource("data") void conversion(String duration, int expectedDuration) { - int result = GoTimeUtil.durationSeconds(duration).get(); - assertThat(result).isEqualTo(expectedDuration); + assertThat(GoTimeUtil.durationSeconds(duration)).isPresent().contains(expectedDuration); } static Stream data() { From 315ad289a0bf8b2fa9e9aaab2a0fa4875d3f6548 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Mon, 29 Apr 2024 15:49:16 +0530 Subject: [PATCH 092/289] refactor (jkube-kit/build) : Move buildArgs related logic to a new class BuildArgResolverUtil Related to #2904 It's better to move code for resolving build args from different sources to a dedicated class. It doesn't look like BuildService is the right place for this. This way we can also use it from other BuildServices of other build strategies. Signed-off-by: Rohan Kumar --- .../api/helper/BuildArgResolverUtil.java | 102 ++++++++++ ...uildArgResolverUtilMergeBuildArgsTest.java | 188 ++++++++++++++++++ .../build/service/docker/BuildService.java | 78 +------- .../service/docker/BuildServiceTest.java | 120 ----------- .../jkube/kit/common/util/MapUtil.java | 26 +++ .../jkube/kit/common/util/MapUtilTest.java | 37 ++++ 6 files changed, 354 insertions(+), 197 deletions(-) create mode 100644 jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtil.java create mode 100644 jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtilMergeBuildArgsTest.java diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtil.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtil.java new file mode 100644 index 0000000000..89a93431ac --- /dev/null +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtil.java @@ -0,0 +1,102 @@ +/* + * 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.build.api.helper; + +import org.apache.commons.lang3.StringUtils; +import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.config.image.ImageConfiguration; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.Properties; + +import static org.eclipse.jkube.kit.common.util.MapUtil.mergeMapsImmutable; + +public class BuildArgResolverUtil { + private static final String ARG_PREFIX = "docker.buildArg."; + + private BuildArgResolverUtil() { } + + /** + * Merges Docker Build Args in the following order (in decreasing order of precedence): + *

    + *
  • Build Args specified directly in ImageConfiguration
  • + *
  • Build Args specified via System Properties
  • + *
  • Build Args specified via Project Properties
  • + *
  • Build Args specified via Plugin configuration
  • + *
  • Docker Proxy Build Args detected from ~/.docker/config.json
  • + *
+ * @param imageConfig ImageConfiguration for which Build Args would be resolved + * @param configuration {@link JKubeConfiguration} JKubeConfiguration + * @return a Map containing merged Build Args from all sources. + */ + public static Map mergeBuildArgs(ImageConfiguration imageConfig, JKubeConfiguration configuration) { + Map buildArgsFromProjectProperties = addBuildArgsFromProperties(configuration.getProject().getProperties()); + Map buildArgsFromSystemProperties = addBuildArgsFromProperties(System.getProperties()); + Map buildArgsFromDockerConfig = addBuildArgsFromDockerConfig(); + + return mergeMapsImmutable(imageConfig.getBuild().getArgs(), + buildArgsFromSystemProperties, + buildArgsFromProjectProperties, + Optional.ofNullable(configuration.getBuildArgs()).orElse(Collections.emptyMap()), + buildArgsFromDockerConfig); + } + + private static Map addBuildArgsFromProperties(Properties properties) { + Map buildArgs = new HashMap<>(); + for (Object keyObj : properties.keySet()) { + String key = (String) keyObj; + if (key.startsWith(ARG_PREFIX)) { + String argKey = key.replaceFirst(ARG_PREFIX, ""); + String value = properties.getProperty(key); + + if (StringUtils.isNotBlank(value)) { + buildArgs.put(argKey, value); + } + } + } + return buildArgs; + } + + private static Map addBuildArgsFromDockerConfig() { + final Map dockerConfig = DockerFileUtil.readDockerConfig(); + if (dockerConfig == null) { + return Collections.emptyMap(); + } + + // add proxies + Map buildArgs = new HashMap<>(); + if (dockerConfig.containsKey("proxies")) { + final Map proxies = (Map) dockerConfig.get("proxies"); + if (proxies.containsKey("default")) { + final Map defaultProxyObj = (Map) proxies.get("default"); + String[] proxyMapping = new String[] { + "httpProxy", "http_proxy", + "httpsProxy", "https_proxy", + "noProxy", "no_proxy", + "ftpProxy", "ftp_proxy" + }; + + for(int index = 0; index < proxyMapping.length; index += 2) { + if (defaultProxyObj.containsKey(proxyMapping[index])) { + buildArgs.put(ARG_PREFIX + proxyMapping[index+1], defaultProxyObj.get(proxyMapping[index])); + } + } + } + } + return buildArgs; + } +} diff --git a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtilMergeBuildArgsTest.java b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtilMergeBuildArgsTest.java new file mode 100644 index 0000000000..ec3f6ca91c --- /dev/null +++ b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtilMergeBuildArgsTest.java @@ -0,0 +1,188 @@ +/* + * 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.build.api.helper; + +import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JavaProject; +import org.eclipse.jkube.kit.common.util.EnvUtil; +import org.eclipse.jkube.kit.config.image.ImageConfiguration; +import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; + +class BuildArgResolverUtilMergeBuildArgsTest { + private ImageConfiguration imageConfiguration; + private JKubeConfiguration jKubeConfiguration; + private Properties projectProperties; + private Map buildArgFromPluginConfiguration; + + @BeforeEach + void setUp() { + projectProperties = new Properties(); + buildArgFromPluginConfiguration = new HashMap<>(); + jKubeConfiguration = JKubeConfiguration.builder() + .project(JavaProject.builder() + .properties(projectProperties) + .build()) + .buildArgs(buildArgFromPluginConfiguration) + .build(); + imageConfiguration = ImageConfiguration.builder() + .name("image-name") + .build(BuildConfiguration.builder() + .build()) + .build(); + } + + @Test + @DisplayName("build args in image config and project properties") + void whenBuildArgsFromImageConfigAndFromProjectProperties_shouldMergeBuildArgs() { + // Given + projectProperties.setProperty("docker.buildArg.VERSION", "latest"); + projectProperties.setProperty("docker.buildArg.FULL_IMAGE", "busybox:latest"); + Map buildArgImageConfiguration = new HashMap<>(); + buildArgImageConfiguration.put("REPO_1", "docker.io/library"); + buildArgImageConfiguration.put("IMAGE-1", "openjdk"); + imageConfiguration = imageConfiguration.toBuilder() + .build(imageConfiguration.getBuild().toBuilder().args(buildArgImageConfiguration).build()) + .build(); + + // When + Map mergedBuildArgs = BuildArgResolverUtil.mergeBuildArgs(imageConfiguration, jKubeConfiguration); + + // Then + assertThat(mergedBuildArgs) + .containsEntry("VERSION", "latest") + .containsEntry("FULL_IMAGE", "busybox:latest") + .containsEntry("REPO_1", "docker.io/library") + .containsEntry("IMAGE-1", "openjdk"); + } + + @Test + @DisplayName("build args in image config, project properties, system properties, plugin configuration") + void fromAllSourcesWithDifferentKeys_shouldMergeBuildArgs() { + // Given + givenBuildArgsFromImageConfiguration("VERSION", "latest"); + System.setProperty("docker.buildArg.IMAGE-1", "openjdk"); + projectProperties.setProperty("docker.buildArg.REPO_1", "docker.io/library"); + givenBuildArgsFromJKubeConfiguration("FULL_IMAGE", "busybox:latest"); + + // When + Map mergedBuildArgs = BuildArgResolverUtil.mergeBuildArgs(imageConfiguration, jKubeConfiguration); + + // Then + assertThat(mergedBuildArgs) + .containsEntry("VERSION", "latest") + .containsEntry("FULL_IMAGE", "busybox:latest") + .containsEntry("REPO_1", "docker.io/library") + .containsEntry("IMAGE-1", "openjdk"); + } + + @Test + @DisplayName("build args in image config and system properties with same key, should throw exception") + void fromBuildConfigurationAndSystemPropertiesWithSameKey_shouldNotMergeBuildArgs() { + // Given + givenBuildArgsFromImageConfiguration("VERSION", "latest"); + System.setProperty("docker.buildArg.VERSION", "1.0.0"); + + // When & Then + assertThatIllegalArgumentException() + .isThrownBy(() -> BuildArgResolverUtil.mergeBuildArgs(imageConfiguration, jKubeConfiguration)) + .withMessage("Multiple entries with same key: VERSION=latest and VERSION=1.0.0"); + } + + @Test + @DisplayName("build args in image config and project properties with same key, should throw exception") + void fromBuildConfigurationAndProjectPropertiesWithSameKey_shouldNotMergeBuildArgs() { + // Given + givenBuildArgsFromImageConfiguration("VERSION", "latest"); + projectProperties.setProperty("docker.buildArg.VERSION", "1.0.0"); + + // When & Then + assertThatIllegalArgumentException() + .isThrownBy(() -> BuildArgResolverUtil.mergeBuildArgs(imageConfiguration, jKubeConfiguration)) + .withMessage("Multiple entries with same key: VERSION=latest and VERSION=1.0.0"); + } + + @Test + @DisplayName("build args in image config and plugin config with same key, should throw exception") + void fromBuildConfigurationAndJKubeConfigurationWithSameKey_shouldNotMergeBuildArgs() { + // Given + givenBuildArgsFromImageConfiguration("VERSION", "latest"); + givenBuildArgsFromJKubeConfiguration("VERSION", "1.0.0"); + + // When & Then + assertThatIllegalArgumentException() + .isThrownBy(() -> BuildArgResolverUtil.mergeBuildArgs(imageConfiguration, jKubeConfiguration)) + .withMessage("Multiple entries with same key: VERSION=latest and VERSION=1.0.0"); + } + + @Test + @DisplayName("should add proxy build args from ~/.docker/config.json") + void shouldAddBuildArgsFromDockerConfig(@TempDir File temporaryFolder) throws IOException { + try { + // Given + Path dockerConfig = temporaryFolder.toPath(); + final Map env = Collections.singletonMap("DOCKER_CONFIG", dockerConfig.toFile().getAbsolutePath()); + EnvUtil.overrideEnvGetter(env::get); + Files.write(dockerConfig.resolve("config.json"), ("{\"proxies\": {\"default\": {\n" + + " \"httpProxy\": \"http://proxy.example.com:3128\",\n" + + " \"httpsProxy\": \"https://proxy.example.com:3129\",\n" + + " \"noProxy\": \"*.test.example.com,.example.org,127.0.0.0/8\"\n" + + " }}}").getBytes()); + // When + final Map mergedBuildArgs = BuildArgResolverUtil.mergeBuildArgs(imageConfiguration, jKubeConfiguration); + // Then + assertThat(mergedBuildArgs) + .containsEntry("docker.buildArg.http_proxy", "http://proxy.example.com:3128") + .containsEntry("docker.buildArg.https_proxy", "https://proxy.example.com:3129") + .containsEntry("docker.buildArg.no_proxy", "*.test.example.com,.example.org,127.0.0.0/8"); + } finally { + EnvUtil.overrideEnvGetter(System::getenv); + } + } + + private void givenBuildArgsFromImageConfiguration(String key, String value) { + imageConfiguration = imageConfiguration.toBuilder() + .build(BuildConfiguration.builder() + .args( + Collections.singletonMap(key, value)) + .build()) + .build(); + } + + private void givenBuildArgsFromJKubeConfiguration(String key, String value) { + buildArgFromPluginConfiguration.put(key, value); + } + + @AfterEach + void clearSystemPropertiesUsedInTests() { + System.clearProperty("docker.buildArg.IMAGE-1"); + System.clearProperty("docker.buildArg.VERSION"); + } +} diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java index d4cc79d024..afe53693a6 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java @@ -16,18 +16,13 @@ import java.io.File; import java.io.IOException; import java.util.Collections; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.Properties; import java.util.LinkedList; -import com.google.common.collect.ImmutableMap; - import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.build.api.helper.DockerFileUtil; -import org.apache.commons.lang3.StringUtils; import org.eclipse.jkube.kit.build.api.assembly.AssemblyManager; import org.eclipse.jkube.kit.common.util.EnvUtil; import org.eclipse.jkube.kit.build.service.docker.access.BuildOptions; @@ -39,12 +34,11 @@ import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.image.build.CleanupMode; +import static org.eclipse.jkube.kit.build.api.helper.BuildArgResolverUtil.mergeBuildArgs; import static org.eclipse.jkube.kit.build.api.helper.BuildUtil.extractBaseFromConfiguration; public class BuildService { - private static final String ARG_PREFIX = "docker.buildArg."; - private final DockerAccess docker; private final QueryService queryService; private final ArchiveService archiveService; @@ -79,10 +73,6 @@ public void buildImage(ImageConfiguration imageConfig, ImagePullManager imagePul buildImage(imageConfig, configuration, checkForNocache(imageConfig), mergedBuildArgs); } - static Map mergeBuildArgs(ImageConfiguration imageConfig, JKubeConfiguration configuration) { - return prepareBuildArgs(addBuildArgs(configuration), imageConfig.getBuildConfiguration()); - } - public void tagImage(String imageName, ImageConfiguration imageConfig) throws DockerAccessException { List tags = imageConfig.getBuildConfiguration().getTags(); @@ -165,14 +155,6 @@ protected void buildImage(ImageConfiguration imageConfig, JKubeConfiguration par } } - private static Map prepareBuildArgs(Map buildArgs, BuildConfiguration buildConfig) { - ImmutableMap.Builder builder = ImmutableMap.builder().putAll(buildArgs); - if (buildConfig.getArgs() != null) { - builder.putAll(buildConfig.getArgs()); - } - return builder.build(); - } - private String getDockerfileName(BuildConfiguration buildConfig) { if (buildConfig.isDockerFileMode()) { return buildConfig.getDockerFile().getName(); @@ -187,64 +169,6 @@ private String doBuildImage(String imageName, File dockerArchive, BuildOptions o return queryService.getImageId(imageName); } - private static Map addBuildArgs(JKubeConfiguration configuration) { - Properties props = configuration.getProject().getProperties(); - Map buildArgsFromProject = addBuildArgsFromProperties(props); - Map buildArgsFromSystem = addBuildArgsFromProperties(System.getProperties()); - Map buildArgsFromDockerConfig = addBuildArgsFromDockerConfig(); - return ImmutableMap.builder() - .putAll(buildArgsFromDockerConfig) - .putAll(Optional.ofNullable(configuration.getBuildArgs()).orElse(Collections.emptyMap())) - .putAll(buildArgsFromProject) - .putAll(buildArgsFromSystem) - .build(); - } - - private static Map addBuildArgsFromProperties(Properties properties) { - Map buildArgs = new HashMap<>(); - for (Object keyObj : properties.keySet()) { - String key = (String) keyObj; - if (key.startsWith(ARG_PREFIX)) { - String argKey = key.replaceFirst(ARG_PREFIX, ""); - String value = properties.getProperty(key); - - if (StringUtils.isNotBlank(value)) { - buildArgs.put(argKey, value); - } - } - } - return buildArgs; - } - - private static Map addBuildArgsFromDockerConfig() { - final Map dockerConfig = DockerFileUtil.readDockerConfig(); - if (dockerConfig == null) { - return Collections.emptyMap(); - } - - // add proxies - Map buildArgs = new HashMap<>(); - if (dockerConfig.containsKey("proxies")) { - final Map proxies = (Map) dockerConfig.get("proxies"); - if (proxies.containsKey("default")) { - final Map defaultProxyObj = (Map) proxies.get("default"); - String[] proxyMapping = new String[] { - "httpProxy", "http_proxy", - "httpsProxy", "https_proxy", - "noProxy", "no_proxy", - "ftpProxy", "ftp_proxy" - }; - - for(int index = 0; index < proxyMapping.length; index += 2) { - if (defaultProxyObj.containsKey(proxyMapping[index])) { - buildArgs.put(ARG_PREFIX + proxyMapping[index+1], defaultProxyObj.get(proxyMapping[index])); - } - } - } - } - return buildArgs; - } - private void autoPullBaseImage(ImageConfiguration imageConfig, ImagePullManager imagePullManager, JKubeConfiguration configuration, Map mergedBuildArgs) throws IOException { diff --git a/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/BuildServiceTest.java b/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/BuildServiceTest.java index fff6800585..1cf0f05bb3 100644 --- a/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/BuildServiceTest.java +++ b/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/BuildServiceTest.java @@ -107,126 +107,6 @@ void tagImage_whenValidImageConfigurationProvided_shouldTagImage() throws Docker .tag("image-name", "image-name:latest", true); } - @Test - void mergeBuildArgs_whenBuildArgsFromImageConfigAndFromProjectProperties_shouldMergeBuildArgs() { - // Given - Properties props = new Properties(); - props.setProperty("docker.buildArg.VERSION", "latest"); - props.setProperty("docker.buildArg.FULL_IMAGE", "busybox:latest"); - when(mockedJKubeConfiguration.getProject().getProperties()).thenReturn(props); - - Map imgConfigBuildArg = new HashMap<>(); - imgConfigBuildArg.put("REPO_1", "docker.io/library"); - imgConfigBuildArg.put("IMAGE-1", "openjdk"); - imageConfiguration = ImageConfiguration.builder() - .name("image-name") - .build(BuildConfiguration.builder() - .args(imgConfigBuildArg) - .build()) - .build(); - - // When - Map mergedBuildArgs = BuildService.mergeBuildArgs(imageConfiguration, mockedJKubeConfiguration); - - // Then - assertThat(mergedBuildArgs) - .containsEntry("VERSION", "latest") - .containsEntry("FULL_IMAGE", "busybox:latest") - .containsEntry("REPO_1", "docker.io/library") - .containsEntry("IMAGE-1", "openjdk"); - } - - @Nested - @DisplayName("mergeBuildArgs with BuildArgs") - class MergeBuildArgs { - @Test - void fromAllSourcesWithDifferentKeys_shouldMergeBuildArgs() { - // Given - givenBuildArgsFromImageConfiguration("VERSION", "latest"); - givenBuildArgsFromSystemProperties("docker.buildArg.IMAGE-1", "openjdk"); - givenBuildArgsFromProjectProperties("docker.buildArg.REPO_1", "docker.io/library"); - givenBuildArgsFromJKubeConfiguration("FULL_IMAGE", "busybox:latest"); - - // When - Map mergedBuildArgs = BuildService.mergeBuildArgs(imageConfiguration, mockedJKubeConfiguration); - - // Then - assertThat(mergedBuildArgs) - .containsEntry("VERSION", "latest") - .containsEntry("FULL_IMAGE", "busybox:latest") - .containsEntry("REPO_1", "docker.io/library") - .containsEntry("IMAGE-1", "openjdk"); - } - - @Test - void fromBuildConfigurationAndSystemPropertiesWithSameKey_shouldNotMergeBuildArgs() { - // Given - givenBuildArgsFromImageConfiguration("VERSION", "latest"); - givenBuildArgsFromSystemProperties("docker.buildArg.VERSION", "1.0.0"); - - // When & Then - assertThatIllegalArgumentException() - .isThrownBy(() -> BuildService.mergeBuildArgs(imageConfiguration, mockedJKubeConfiguration)) - .withMessage("Multiple entries with same key: VERSION=latest and VERSION=1.0.0"); - } - - @Test - void fromBuildConfigurationAndProjectPropertiesWithSameKey_shouldNotMergeBuildArgs() { - // Given - givenBuildArgsFromImageConfiguration("VERSION", "latest"); - givenBuildArgsFromProjectProperties("docker.buildArg.VERSION", "1.0.0"); - - // When & Then - assertThatIllegalArgumentException() - .isThrownBy(() -> BuildService.mergeBuildArgs(imageConfiguration, mockedJKubeConfiguration)) - .withMessage("Multiple entries with same key: VERSION=latest and VERSION=1.0.0"); - } - - @Test - void fromBuildConfigurationAndJKubeConfigurationWithSameKey_shouldNotMergeBuildArgs() { - // Given - givenBuildArgsFromImageConfiguration("VERSION", "latest"); - givenBuildArgsFromJKubeConfiguration("VERSION", "1.0.0"); - - // When & Then - assertThatIllegalArgumentException() - .isThrownBy(() -> BuildService.mergeBuildArgs(imageConfiguration, mockedJKubeConfiguration)) - .withMessage("Multiple entries with same key: VERSION=latest and VERSION=1.0.0"); - } - - private void givenBuildArgsFromImageConfiguration(String key, String value) { - imageConfiguration = ImageConfiguration.builder() - .name("image-name") - .build(BuildConfiguration.builder() - .args( - Collections.singletonMap(key, value)) - .build()) - .build(); - } - - private void givenBuildArgsFromSystemProperties(String key, String value) { - System.setProperty(key, value); - } - - private void givenBuildArgsFromProjectProperties(String key, String value) { - Properties props = new Properties(); - props.setProperty(key, value); - when(mockedJKubeConfiguration.getProject().getProperties()) - .thenReturn(props); - } - - private void givenBuildArgsFromJKubeConfiguration(String key, String value) { - when(mockedJKubeConfiguration.getBuildArgs()) - .thenReturn(Collections.singletonMap(key, value)); - } - - @AfterEach - void clearSystemPropertiesUsedInTests() { - System.clearProperty("docker.buildArg.IMAGE-1"); - System.clearProperty("docker.buildArg.VERSION"); - } - } - @Test void buildImage_whenMultiStageDockerfileWithBuildArgs_shouldPrepullImages() throws IOException { // Given diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/MapUtil.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/MapUtil.java index f2657f2cea..238e86c010 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/MapUtil.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/MapUtil.java @@ -42,6 +42,32 @@ public static void mergeIfAbsent(Map map, Map to } } + /** + * Returns a new map with all the entries of first map with rest map entries. It throws IllegalArgumentException + * when it encounters conflicting keys + * + * @param maps var arg parameter of maps to be merged + * @return merged map + * @param key type + * @param value type + * @throws IllegalArgumentException when multiple entries with same key are found + */ + @SafeVarargs + public static Map mergeMapsImmutable(Map... maps) { + Map answer = new HashMap<>(); + for (int i = maps.length-1; i >= 0; i--) { + if (maps[i] != null) { + for (Map.Entry e : maps[i].entrySet()) { + if (answer.containsKey(e.getKey())) { + throw new IllegalArgumentException(String.format("Multiple entries with same key: %s=%s and %s=%s", e.getKey(), e.getValue(), e.getKey(), answer.get(e.getKey()))); + } + answer.put(e.getKey(), e.getValue()); + } + } + } + return answer; + } + /** * Returns a new map with all the entries of first map with rest map entries which don't override map1. * diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/MapUtilTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/MapUtilTest.java index 999fc21306..1000e052f1 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/MapUtilTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/MapUtilTest.java @@ -19,12 +19,16 @@ import java.util.Map; import org.assertj.core.api.InstanceOfAssertFactories; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.entry; import static org.eclipse.jkube.kit.common.util.MapUtil.getFlattenedMap; import static org.eclipse.jkube.kit.common.util.MapUtil.getNestedMap; +import static org.eclipse.jkube.kit.common.util.MapUtil.mergeMapsImmutable; import static org.junit.jupiter.api.Assertions.assertThrows; /** @@ -136,6 +140,39 @@ void getNestedMap_withInvalidFlattenedMap_shouldThrowNodeOverlapsException() { assertThat(result).hasMessage("The provided input Map is invalid (node overlaps with key)"); } + @Nested + class MergeMapsImmutable { + @Test + @DisplayName("different keys present in maps, then merge maps") + void whenNoConflictingKeysProvided_thenMergeMaps() { + // Given + Map m1 = createMap("foo", "bar"); + Map m2 = createMap("BAR", "FOO"); + + // When + Map result = mergeMapsImmutable(m1, m2); + + // Then + assertThat(result) + .containsEntry("foo", "bar") + .containsEntry("BAR", "FOO"); + } + + @Test + @DisplayName("same keys present in maps, then throw exception") + void whenConflictingKeysProvided_thenThrowException() { + // Given + Map m1 = createMap("foo", "bar"); + Map m2 = createMap("foo", "FOO"); + + // When + Then + assertThatIllegalArgumentException() + .isThrownBy(() -> MapUtil.mergeMapsImmutable(m1, m2, null)) + .withMessage("Multiple entries with same key: foo=bar and foo=FOO"); + } + } + + private Map createMap(String ... args) { Map ret = new LinkedHashMap<>(); for (int i = 0; i < args.length; i+=2) { From 65db45e97d2e57aaf0eb810ca6098b95dbc33bed Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Tue, 30 Apr 2024 13:04:06 +0200 Subject: [PATCH 093/289] review: build args helper Simplify logic to allow for easier future developments and improvements. Signed-off-by: Marc Nuri --- .../api/helper/BuildArgResolverUtil.java | 44 +++++++++------ ...uildArgResolverUtilMergeBuildArgsTest.java | 15 +++--- .../service/docker/BuildServiceTest.java | 53 ++++++++++--------- .../jkube/kit/common/util/MapUtil.java | 26 --------- .../jkube/kit/common/util/MapUtilTest.java | 37 ------------- 5 files changed, 63 insertions(+), 112 deletions(-) diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtil.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtil.java index 89a93431ac..f4da8356e6 100644 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtil.java +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtil.java @@ -15,23 +15,24 @@ import org.apache.commons.lang3.StringUtils; import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import java.util.Optional; +import java.util.Objects; import java.util.Properties; - -import static org.eclipse.jkube.kit.common.util.MapUtil.mergeMapsImmutable; +import java.util.stream.Stream; public class BuildArgResolverUtil { + private static final String ARG_PREFIX = "docker.buildArg."; private BuildArgResolverUtil() { } /** - * Merges Docker Build Args in the following order (in decreasing order of precedence): + * Merges Docker Build Args from the following sources: *
    *
  • Build Args specified directly in ImageConfiguration
  • *
  • Build Args specified via System Properties
  • @@ -39,23 +40,32 @@ private BuildArgResolverUtil() { } *
  • Build Args specified via Plugin configuration
  • *
  • Docker Proxy Build Args detected from ~/.docker/config.json
  • *
- * @param imageConfig ImageConfiguration for which Build Args would be resolved - * @param configuration {@link JKubeConfiguration} JKubeConfiguration + * @param imageConfig ImageConfiguration where to get the Build Args from. + * @param configuration {@link JKubeConfiguration}. * @return a Map containing merged Build Args from all sources. */ public static Map mergeBuildArgs(ImageConfiguration imageConfig, JKubeConfiguration configuration) { - Map buildArgsFromProjectProperties = addBuildArgsFromProperties(configuration.getProject().getProperties()); - Map buildArgsFromSystemProperties = addBuildArgsFromProperties(System.getProperties()); - Map buildArgsFromDockerConfig = addBuildArgsFromDockerConfig(); - - return mergeMapsImmutable(imageConfig.getBuild().getArgs(), - buildArgsFromSystemProperties, - buildArgsFromProjectProperties, - Optional.ofNullable(configuration.getBuildArgs()).orElse(Collections.emptyMap()), - buildArgsFromDockerConfig); + final Map buildArgs = new HashMap<>(); + Stream.of( + imageConfig.getBuild().getArgs(), + buildArgsFromProperties(System.getProperties()), + buildArgsFromProperties(configuration.getProject().getProperties()), + configuration.getBuildArgs(), + buildArgsFromDockerConfig() + ) + .filter(Objects::nonNull) + .flatMap(map -> map.entrySet().stream()) + .forEach(entry -> { + if (buildArgs.containsKey(entry.getKey())) { + throw new JKubeException(String.format("Multiple Build Args with the same key: %s=%s and %s=%s", + entry.getKey(), buildArgs.get(entry.getKey()), entry.getKey(), entry.getValue())); + } + buildArgs.put(entry.getKey(), entry.getValue()); + }); + return buildArgs; } - private static Map addBuildArgsFromProperties(Properties properties) { + private static Map buildArgsFromProperties(Properties properties) { Map buildArgs = new HashMap<>(); for (Object keyObj : properties.keySet()) { String key = (String) keyObj; @@ -71,7 +81,7 @@ private static Map addBuildArgsFromProperties(Properties propert return buildArgs; } - private static Map addBuildArgsFromDockerConfig() { + private static Map buildArgsFromDockerConfig() { final Map dockerConfig = DockerFileUtil.readDockerConfig(); if (dockerConfig == null) { return Collections.emptyMap(); diff --git a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtilMergeBuildArgsTest.java b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtilMergeBuildArgsTest.java index ec3f6ca91c..41e0dbb631 100644 --- a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtilMergeBuildArgsTest.java +++ b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtilMergeBuildArgsTest.java @@ -14,6 +14,7 @@ package org.eclipse.jkube.kit.build.api.helper; import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.util.EnvUtil; import org.eclipse.jkube.kit.config.image.ImageConfiguration; @@ -34,7 +35,7 @@ import java.util.Properties; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; class BuildArgResolverUtilMergeBuildArgsTest { private ImageConfiguration imageConfiguration; @@ -111,9 +112,9 @@ void fromBuildConfigurationAndSystemPropertiesWithSameKey_shouldNotMergeBuildArg System.setProperty("docker.buildArg.VERSION", "1.0.0"); // When & Then - assertThatIllegalArgumentException() + assertThatExceptionOfType(JKubeException.class) .isThrownBy(() -> BuildArgResolverUtil.mergeBuildArgs(imageConfiguration, jKubeConfiguration)) - .withMessage("Multiple entries with same key: VERSION=latest and VERSION=1.0.0"); + .withMessage("Multiple Build Args with the same key: VERSION=latest and VERSION=1.0.0"); } @Test @@ -124,9 +125,9 @@ void fromBuildConfigurationAndProjectPropertiesWithSameKey_shouldNotMergeBuildAr projectProperties.setProperty("docker.buildArg.VERSION", "1.0.0"); // When & Then - assertThatIllegalArgumentException() + assertThatExceptionOfType(JKubeException.class) .isThrownBy(() -> BuildArgResolverUtil.mergeBuildArgs(imageConfiguration, jKubeConfiguration)) - .withMessage("Multiple entries with same key: VERSION=latest and VERSION=1.0.0"); + .withMessage("Multiple Build Args with the same key: VERSION=latest and VERSION=1.0.0"); } @Test @@ -137,9 +138,9 @@ void fromBuildConfigurationAndJKubeConfigurationWithSameKey_shouldNotMergeBuildA givenBuildArgsFromJKubeConfiguration("VERSION", "1.0.0"); // When & Then - assertThatIllegalArgumentException() + assertThatExceptionOfType(JKubeException.class) .isThrownBy(() -> BuildArgResolverUtil.mergeBuildArgs(imageConfiguration, jKubeConfiguration)) - .withMessage("Multiple entries with same key: VERSION=latest and VERSION=1.0.0"); + .withMessage("Multiple Build Args with the same key: VERSION=latest and VERSION=1.0.0"); } @Test diff --git a/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/BuildServiceTest.java b/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/BuildServiceTest.java index 1cf0f05bb3..3067a70694 100644 --- a/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/BuildServiceTest.java +++ b/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/BuildServiceTest.java @@ -17,13 +17,11 @@ import org.eclipse.jkube.kit.build.service.docker.access.DockerAccess; import org.eclipse.jkube.kit.build.service.docker.access.DockerAccessException; import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; -import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -32,12 +30,8 @@ import java.io.OutputStream; import java.nio.file.Files; import java.util.Collections; -import java.util.HashMap; -import java.util.Map; import java.util.Properties; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; @@ -48,11 +42,15 @@ import static org.mockito.Mockito.when; class BuildServiceTest { + + @TempDir + private File tempDir; private DockerAccess mockedDockerAccess; private BuildService buildService; private ImageConfiguration imageConfiguration; private ImagePullManager mockedImagePullManager; - private JKubeConfiguration mockedJKubeConfiguration; + private Properties projectProperties; + private JKubeConfiguration jKubeConfiguration; private RegistryService mockedRegistryService; @BeforeEach @@ -60,11 +58,23 @@ void setUp() { mockedDockerAccess = mock(DockerAccess.class, RETURNS_DEEP_STUBS); ArchiveService mockedArchiveService = mock(ArchiveService.class, RETURNS_DEEP_STUBS); mockedRegistryService = mock(RegistryService.class, RETURNS_DEEP_STUBS); - KitLogger mockedLog = mock(KitLogger.SilentLogger.class, RETURNS_DEEP_STUBS); mockedImagePullManager = mock(ImagePullManager.class, RETURNS_DEEP_STUBS); - mockedJKubeConfiguration = mock(JKubeConfiguration.class, RETURNS_DEEP_STUBS); + projectProperties = new Properties(); + jKubeConfiguration = JKubeConfiguration.builder() + .project(JavaProject.builder() + .properties(projectProperties) + .baseDirectory(tempDir) + .build()) + .sourceDirectory(tempDir.getAbsolutePath()) + .build(); QueryService mockedQueryService = new QueryService(mockedDockerAccess); - buildService = new BuildService(mockedDockerAccess, mockedQueryService, mockedRegistryService, mockedArchiveService, mockedLog); + buildService = new BuildService( + mockedDockerAccess, + mockedQueryService, + mockedRegistryService, + mockedArchiveService, + new KitLogger.SilentLogger() + ); imageConfiguration = ImageConfiguration.builder() .name("image-name") .build(BuildConfiguration.builder() @@ -80,7 +90,7 @@ void buildImage_whenValidImageConfigurationProvidedAndDockerDaemonReturnsValidId when(mockedDockerAccess.getImageId("image-name")).thenReturn("c8003cb6f5db"); // When - buildService.buildImage(imageConfiguration, mockedImagePullManager, mockedJKubeConfiguration); + buildService.buildImage(imageConfiguration, mockedImagePullManager, jKubeConfiguration); // Then verify(mockedDockerAccess, times(1)) @@ -93,7 +103,7 @@ void buildImage_whenValidImageConfigurationProvidedAndDockerDaemonReturnsNull_sh when(mockedDockerAccess.getImageId("image-name")).thenReturn(null); // When & Then assertThatIllegalStateException() - .isThrownBy(() -> buildService.buildImage(imageConfiguration, mockedImagePullManager, mockedJKubeConfiguration)) + .isThrownBy(() -> buildService.buildImage(imageConfiguration, mockedImagePullManager, jKubeConfiguration)) .withMessage("Failure in building image, unable to find image built with name image-name"); } @@ -111,8 +121,6 @@ void tagImage_whenValidImageConfigurationProvided_shouldTagImage() throws Docker void buildImage_whenMultiStageDockerfileWithBuildArgs_shouldPrepullImages() throws IOException { // Given when(mockedDockerAccess.getImageId("image-name")).thenReturn("c8003cb6f5db"); - when(mockedJKubeConfiguration.getSourceDirectory()).thenReturn(tempDir.getAbsolutePath()); - when(mockedJKubeConfiguration.getProject().getBaseDirectory()).thenReturn(tempDir); File multistageDockerfile = copyToTempDir("Dockerfile_multi_stage_with_args_no_default"); imageConfiguration = ImageConfiguration.builder() .name("image-name") @@ -122,15 +130,13 @@ void buildImage_whenMultiStageDockerfileWithBuildArgs_shouldPrepullImages() thro .build()) .build(); - Properties props = new Properties(); - props.setProperty("docker.buildArg.VERSION", "latest"); - props.setProperty("docker.buildArg.FULL_IMAGE", "busybox:latest"); - props.setProperty("docker.buildArg.REPO_1", "docker.io/library"); - props.setProperty("docker.buildArg.IMAGE-1", "openjdk"); - when(mockedJKubeConfiguration.getProject().getProperties()).thenReturn(props); + projectProperties.setProperty("docker.buildArg.VERSION", "latest"); + projectProperties.setProperty("docker.buildArg.FULL_IMAGE", "busybox:latest"); + projectProperties.setProperty("docker.buildArg.REPO_1", "docker.io/library"); + projectProperties.setProperty("docker.buildArg.IMAGE-1", "openjdk"); // When - buildService.buildImage(imageConfiguration, mockedImagePullManager, mockedJKubeConfiguration); + buildService.buildImage(imageConfiguration, mockedImagePullManager, jKubeConfiguration); // Then verify(mockedRegistryService, times(1)).pullImageWithPolicy(eq("fabric8/s2i-java:latest"), any(), any(), any()); @@ -139,9 +145,6 @@ void buildImage_whenMultiStageDockerfileWithBuildArgs_shouldPrepullImages() thro any()); } - @TempDir - private File tempDir; - private File copyToTempDir(String resource) throws IOException { File ret = new File(tempDir, "Dockerfile"); try (OutputStream os = Files.newOutputStream(ret.toPath())) { diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/MapUtil.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/MapUtil.java index 238e86c010..f2657f2cea 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/MapUtil.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/MapUtil.java @@ -42,32 +42,6 @@ public static void mergeIfAbsent(Map map, Map to } } - /** - * Returns a new map with all the entries of first map with rest map entries. It throws IllegalArgumentException - * when it encounters conflicting keys - * - * @param maps var arg parameter of maps to be merged - * @return merged map - * @param key type - * @param value type - * @throws IllegalArgumentException when multiple entries with same key are found - */ - @SafeVarargs - public static Map mergeMapsImmutable(Map... maps) { - Map answer = new HashMap<>(); - for (int i = maps.length-1; i >= 0; i--) { - if (maps[i] != null) { - for (Map.Entry e : maps[i].entrySet()) { - if (answer.containsKey(e.getKey())) { - throw new IllegalArgumentException(String.format("Multiple entries with same key: %s=%s and %s=%s", e.getKey(), e.getValue(), e.getKey(), answer.get(e.getKey()))); - } - answer.put(e.getKey(), e.getValue()); - } - } - } - return answer; - } - /** * Returns a new map with all the entries of first map with rest map entries which don't override map1. * diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/MapUtilTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/MapUtilTest.java index 1000e052f1..999fc21306 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/MapUtilTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/MapUtilTest.java @@ -19,16 +19,12 @@ import java.util.Map; import org.assertj.core.api.InstanceOfAssertFactories; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.entry; import static org.eclipse.jkube.kit.common.util.MapUtil.getFlattenedMap; import static org.eclipse.jkube.kit.common.util.MapUtil.getNestedMap; -import static org.eclipse.jkube.kit.common.util.MapUtil.mergeMapsImmutable; import static org.junit.jupiter.api.Assertions.assertThrows; /** @@ -140,39 +136,6 @@ void getNestedMap_withInvalidFlattenedMap_shouldThrowNodeOverlapsException() { assertThat(result).hasMessage("The provided input Map is invalid (node overlaps with key)"); } - @Nested - class MergeMapsImmutable { - @Test - @DisplayName("different keys present in maps, then merge maps") - void whenNoConflictingKeysProvided_thenMergeMaps() { - // Given - Map m1 = createMap("foo", "bar"); - Map m2 = createMap("BAR", "FOO"); - - // When - Map result = mergeMapsImmutable(m1, m2); - - // Then - assertThat(result) - .containsEntry("foo", "bar") - .containsEntry("BAR", "FOO"); - } - - @Test - @DisplayName("same keys present in maps, then throw exception") - void whenConflictingKeysProvided_thenThrowException() { - // Given - Map m1 = createMap("foo", "bar"); - Map m2 = createMap("foo", "FOO"); - - // When + Then - assertThatIllegalArgumentException() - .isThrownBy(() -> MapUtil.mergeMapsImmutable(m1, m2, null)) - .withMessage("Multiple entries with same key: foo=bar and foo=FOO"); - } - } - - private Map createMap(String ... args) { Map ret = new LinkedHashMap<>(); for (int i = 0; i < args.length; i+=2) { From 3b2cb0ed15a48e23f6ebefea20fe014085a0462d Mon Sep 17 00:00:00 2001 From: Pratik Gurjar <44113714+pratikgurjar@users.noreply.github.com> Date: Tue, 30 Apr 2024 19:34:12 +0530 Subject: [PATCH 094/289] fix: removed unused import from KubernetesConfigAuthUtilTest (#2925) (3003) removed unused import --- fixes/removed-unused-import --- .../jkube/kit/build/api/helper/KubernetesConfigAuthUtilTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/KubernetesConfigAuthUtilTest.java b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/KubernetesConfigAuthUtilTest.java index b78e147ad0..40a4a64669 100644 --- a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/KubernetesConfigAuthUtilTest.java +++ b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/KubernetesConfigAuthUtilTest.java @@ -14,7 +14,6 @@ package org.eclipse.jkube.kit.build.api.helper; import java.io.File; -import java.io.FileOutputStream; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; From fa1aac2c55e60dc02047b6374a91121ba3955aed Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 May 2024 10:18:28 +0200 Subject: [PATCH 095/289] chore(deps): Bump org.apache.maven.plugins:maven-invoker-plugin Bumps [org.apache.maven.plugins:maven-invoker-plugin](https://github.com/apache/maven-invoker-plugin) from 3.6.0 to 3.6.1. - [Release notes](https://github.com/apache/maven-invoker-plugin/releases) - [Commits](https://github.com/apache/maven-invoker-plugin/compare/maven-invoker-plugin-3.6.0...maven-invoker-plugin-3.6.1) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-invoker-plugin dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 3459b0c73b..bdcce72c1c 100644 --- a/pom.xml +++ b/pom.xml @@ -113,7 +113,7 @@ 3.4.1 3.1.2 3.2.4 - 3.6.0 + 3.6.1 3.4.1 3.6.3 3.12.0 From ed1f4e5b66c75bf73507befb1b831433bba1ec29 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 May 2024 10:18:34 +0200 Subject: [PATCH 096/289] chore(deps): Bump org.apache.commons:commons-lang3 from 3.13.0 to 3.14.0 Bumps org.apache.commons:commons-lang3 from 3.13.0 to 3.14.0. --- updated-dependencies: - dependency-name: org.apache.commons:commons-lang3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- jkube-kit/parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index 98e56d6245..21afb4cc64 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -36,7 +36,7 @@ 1.76 1.17.0 - 3.13.0 + 3.14.0 1.12.0 2.10.1 4.4.16 From e612ce5a47f33ef0512e9b518efc3695342ffd5f Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Thu, 2 May 2024 13:51:56 +0530 Subject: [PATCH 097/289] fix(jkube-kit/config): docker.buildArg.* properties not taken into account in OpenShift plugins Added call to resolve build args from all sources in OpenShiftBuildServiceUtils so that build args get resolved from all the available sources (compared to just ImageConfig) Signed-off-by: Rohan Kumar --- CHANGELOG.md | 1 + .../api/helper/BuildArgResolverUtil.java | 56 +++++-- ...uildArgResolverUtilMergeBuildArgsTest.java | 57 +++++-- .../build/service/docker/BuildService.java | 4 +- .../openshift/OpenShiftBuildServiceUtils.java | 5 +- .../OpenShiftBuildServiceUtilsTest.java | 156 +++++++++++------- 6 files changed, 185 insertions(+), 94 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 378616ddc1..22846a6a53 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -29,6 +29,7 @@ Usage: * Fix #2860: Correctly pass Docker build-arg from the build configuration to the Openshift build strategy * Fix #2885: Provide a way to set labels on images defined by Generators * Fix #2901: Ensure Docker build arguments from properties are used during images pre-pulling +* Fix #2904: `docker.buildArg.*` properties not taken into account in OpenShift plugins ### 1.16.2 (2024-03-27) * Fix #2461: `k8s:watch`/`k8sWatch` should throw error in `buildpacks` build strategy diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtil.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtil.java index f4da8356e6..42f4330121 100644 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtil.java +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtil.java @@ -44,24 +44,46 @@ private BuildArgResolverUtil() { } * @param configuration {@link JKubeConfiguration}. * @return a Map containing merged Build Args from all sources. */ - public static Map mergeBuildArgs(ImageConfiguration imageConfig, JKubeConfiguration configuration) { + public static Map mergeBuildArgsIncludingLocalDockerConfigProxySettings(ImageConfiguration imageConfig, JKubeConfiguration configuration) { + return mergeBuildArgsFrom(imageConfig.getBuild().getArgs(), + buildArgsFromProperties(System.getProperties()), + buildArgsFromProperties(configuration.getProject().getProperties()), + configuration.getBuildArgs(), + buildArgsFromDockerConfig()); + } + + /** + * Merges Docker Build Args from the following sources: + *
    + *
  • Build Args specified directly in ImageConfiguration
  • + *
  • Build Args specified via System Properties
  • + *
  • Build Args specified via Project Properties
  • + *
  • Build Args specified via Plugin configuration
  • + *
+ * @param imageConfig ImageConfiguration where to get the Build Args from. + * @param configuration {@link JKubeConfiguration}. + * @return a Map containing merged Build Args from all sources. + */ + public static Map mergeBuildArgsWithoutLocalDockerConfigProxySettings(ImageConfiguration imageConfig, JKubeConfiguration configuration) { + return mergeBuildArgsFrom(imageConfig.getBuild().getArgs(), + buildArgsFromProperties(System.getProperties()), + buildArgsFromProperties(configuration.getProject().getProperties()), + configuration.getBuildArgs()); + } + + @SafeVarargs + private static Map mergeBuildArgsFrom(Map... buildArgSources) { final Map buildArgs = new HashMap<>(); - Stream.of( - imageConfig.getBuild().getArgs(), - buildArgsFromProperties(System.getProperties()), - buildArgsFromProperties(configuration.getProject().getProperties()), - configuration.getBuildArgs(), - buildArgsFromDockerConfig() - ) - .filter(Objects::nonNull) - .flatMap(map -> map.entrySet().stream()) - .forEach(entry -> { - if (buildArgs.containsKey(entry.getKey())) { - throw new JKubeException(String.format("Multiple Build Args with the same key: %s=%s and %s=%s", - entry.getKey(), buildArgs.get(entry.getKey()), entry.getKey(), entry.getValue())); - } - buildArgs.put(entry.getKey(), entry.getValue()); - }); + Stream.of(buildArgSources) + .filter(Objects::nonNull) + .flatMap(map -> map.entrySet().stream()) + .forEach(entry -> { + if (buildArgs.containsKey(entry.getKey())) { + throw new JKubeException(String.format("Multiple Build Args with the same key: %s=%s and %s=%s", + entry.getKey(), buildArgs.get(entry.getKey()), entry.getKey(), entry.getValue())); + } + buildArgs.put(entry.getKey(), entry.getValue()); + }); return buildArgs; } diff --git a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtilMergeBuildArgsTest.java b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtilMergeBuildArgsTest.java index 41e0dbb631..ad5aa9775e 100644 --- a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtilMergeBuildArgsTest.java +++ b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/BuildArgResolverUtilMergeBuildArgsTest.java @@ -22,6 +22,7 @@ import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -74,7 +75,7 @@ void whenBuildArgsFromImageConfigAndFromProjectProperties_shouldMergeBuildArgs() .build(); // When - Map mergedBuildArgs = BuildArgResolverUtil.mergeBuildArgs(imageConfiguration, jKubeConfiguration); + Map mergedBuildArgs = BuildArgResolverUtil.mergeBuildArgsIncludingLocalDockerConfigProxySettings(imageConfiguration, jKubeConfiguration); // Then assertThat(mergedBuildArgs) @@ -94,7 +95,7 @@ void fromAllSourcesWithDifferentKeys_shouldMergeBuildArgs() { givenBuildArgsFromJKubeConfiguration("FULL_IMAGE", "busybox:latest"); // When - Map mergedBuildArgs = BuildArgResolverUtil.mergeBuildArgs(imageConfiguration, jKubeConfiguration); + Map mergedBuildArgs = BuildArgResolverUtil.mergeBuildArgsIncludingLocalDockerConfigProxySettings(imageConfiguration, jKubeConfiguration); // Then assertThat(mergedBuildArgs) @@ -113,7 +114,7 @@ void fromBuildConfigurationAndSystemPropertiesWithSameKey_shouldNotMergeBuildArg // When & Then assertThatExceptionOfType(JKubeException.class) - .isThrownBy(() -> BuildArgResolverUtil.mergeBuildArgs(imageConfiguration, jKubeConfiguration)) + .isThrownBy(() -> BuildArgResolverUtil.mergeBuildArgsIncludingLocalDockerConfigProxySettings(imageConfiguration, jKubeConfiguration)) .withMessage("Multiple Build Args with the same key: VERSION=latest and VERSION=1.0.0"); } @@ -126,7 +127,7 @@ void fromBuildConfigurationAndProjectPropertiesWithSameKey_shouldNotMergeBuildAr // When & Then assertThatExceptionOfType(JKubeException.class) - .isThrownBy(() -> BuildArgResolverUtil.mergeBuildArgs(imageConfiguration, jKubeConfiguration)) + .isThrownBy(() -> BuildArgResolverUtil.mergeBuildArgsIncludingLocalDockerConfigProxySettings(imageConfiguration, jKubeConfiguration)) .withMessage("Multiple Build Args with the same key: VERSION=latest and VERSION=1.0.0"); } @@ -139,31 +140,55 @@ void fromBuildConfigurationAndJKubeConfigurationWithSameKey_shouldNotMergeBuildA // When & Then assertThatExceptionOfType(JKubeException.class) - .isThrownBy(() -> BuildArgResolverUtil.mergeBuildArgs(imageConfiguration, jKubeConfiguration)) + .isThrownBy(() -> BuildArgResolverUtil.mergeBuildArgsIncludingLocalDockerConfigProxySettings(imageConfiguration, jKubeConfiguration)) .withMessage("Multiple Build Args with the same key: VERSION=latest and VERSION=1.0.0"); } - @Test - @DisplayName("should add proxy build args from ~/.docker/config.json") - void shouldAddBuildArgsFromDockerConfig(@TempDir File temporaryFolder) throws IOException { - try { - // Given + @Nested + @DisplayName("local ~/.docker/config.json contains proxy settings") + class LocalDockerConfigContainsProxySettings { + @TempDir + private File temporaryFolder; + + @BeforeEach + void setUp() throws IOException { Path dockerConfig = temporaryFolder.toPath(); final Map env = Collections.singletonMap("DOCKER_CONFIG", dockerConfig.toFile().getAbsolutePath()); EnvUtil.overrideEnvGetter(env::get); Files.write(dockerConfig.resolve("config.json"), ("{\"proxies\": {\"default\": {\n" + - " \"httpProxy\": \"http://proxy.example.com:3128\",\n" + - " \"httpsProxy\": \"https://proxy.example.com:3129\",\n" + - " \"noProxy\": \"*.test.example.com,.example.org,127.0.0.0/8\"\n" + - " }}}").getBytes()); + " \"httpProxy\": \"http://proxy.example.com:3128\",\n" + + " \"httpsProxy\": \"https://proxy.example.com:3129\",\n" + + " \"noProxy\": \"*.test.example.com,.example.org,127.0.0.0/8\"\n" + + " }}}").getBytes()); + + } + + @Test + @DisplayName("mergeBuildArgsIncludingLocalDockerConfigProxySettings, should add proxy build args for docker build strategy") + void shouldAddBuildArgsFromDockerConfigInDockerBuild() { // When - final Map mergedBuildArgs = BuildArgResolverUtil.mergeBuildArgs(imageConfiguration, jKubeConfiguration); + final Map mergedBuildArgs = BuildArgResolverUtil.mergeBuildArgsIncludingLocalDockerConfigProxySettings(imageConfiguration, jKubeConfiguration); // Then assertThat(mergedBuildArgs) .containsEntry("docker.buildArg.http_proxy", "http://proxy.example.com:3128") .containsEntry("docker.buildArg.https_proxy", "https://proxy.example.com:3129") .containsEntry("docker.buildArg.no_proxy", "*.test.example.com,.example.org,127.0.0.0/8"); - } finally { + } + + @Test + @DisplayName("mergeBuildArgsWithoutIncludingLocalDockerConfigProxySettings, should not add proxy build args for OpenShift build strategy") + void shouldNotAddBuildArgsFromDockerConfig() { + // When + final Map mergedBuildArgs = BuildArgResolverUtil.mergeBuildArgsWithoutLocalDockerConfigProxySettings(imageConfiguration, jKubeConfiguration); + // Then + assertThat(mergedBuildArgs) + .doesNotContainEntry("docker.buildArg.http_proxy", "http://proxy.example.com:3128") + .doesNotContainEntry("docker.buildArg.https_proxy", "https://proxy.example.com:3129") + .doesNotContainEntry("docker.buildArg.no_proxy", "*.test.example.com,.example.org,127.0.0.0/8"); + } + + @AfterEach + void tearDown() { EnvUtil.overrideEnvGetter(System::getenv); } } diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java index afe53693a6..ad0ed0c05f 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java @@ -34,7 +34,7 @@ import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.image.build.CleanupMode; -import static org.eclipse.jkube.kit.build.api.helper.BuildArgResolverUtil.mergeBuildArgs; +import static org.eclipse.jkube.kit.build.api.helper.BuildArgResolverUtil.mergeBuildArgsIncludingLocalDockerConfigProxySettings; import static org.eclipse.jkube.kit.build.api.helper.BuildUtil.extractBaseFromConfiguration; public class BuildService { @@ -64,7 +64,7 @@ public class BuildService { public void buildImage(ImageConfiguration imageConfig, ImagePullManager imagePullManager, JKubeConfiguration configuration) throws IOException { - Map mergedBuildArgs = mergeBuildArgs(imageConfig, configuration); + Map mergedBuildArgs = mergeBuildArgsIncludingLocalDockerConfigProxySettings(imageConfig, configuration); if (imagePullManager != null) { autoPullBaseImage(imageConfig, imagePullManager, configuration, mergedBuildArgs); diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java index e2144dcfb1..eb30e953c5 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java @@ -47,6 +47,7 @@ import java.util.Optional; import java.util.stream.Collectors; +import static org.eclipse.jkube.kit.build.api.helper.BuildArgResolverUtil.mergeBuildArgsWithoutLocalDockerConfigProxySettings; import static org.eclipse.jkube.kit.build.api.helper.BuildUtil.extractBaseFromDockerfile; import static org.eclipse.jkube.kit.config.service.openshift.ImageStreamService.resolveImageStreamName; import static org.eclipse.jkube.kit.config.service.openshift.OpenshiftBuildService.DEFAULT_BUILD_OUTPUT_KIND; @@ -133,7 +134,9 @@ protected static BuildStrategy createBuildStrategy( .withNamespace(StringUtils.isEmpty(fromNamespace) ? null : fromNamespace) .endFrom() .withEnv(checkForEnv(imageConfig)) - .withBuildArgs(Optional.ofNullable(buildConfig.getArgs()).orElse(Collections.emptyMap()).entrySet().stream() + .withBuildArgs(mergeBuildArgsWithoutLocalDockerConfigProxySettings(imageConfig, jKubeServiceHub.getConfiguration()) + .entrySet() + .stream() .map(bcArg -> new EnvVarBuilder() .withName(bcArg.getKey()) .withValue(bcArg.getValue()).build()) diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java index 9b1fec0d2a..c553b495a0 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtilsTest.java @@ -18,12 +18,15 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.Properties; import io.fabric8.openshift.api.model.ImageStreamTag; import io.fabric8.openshift.api.model.ImageStreamTagBuilder; +import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.kit.build.api.assembly.ArchiverCustomizer; import org.eclipse.jkube.kit.build.api.assembly.JKubeBuildTarArchiver; import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.ImageName; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; @@ -40,6 +43,8 @@ import io.fabric8.openshift.api.model.BuildStrategy; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import org.mockito.ArgumentCaptor; @@ -75,6 +80,10 @@ void setUp() { jKubeServiceHub = mock(JKubeServiceHub.class, RETURNS_DEEP_STUBS); when(jKubeServiceHub.getBuildServiceConfig().getBuildDirectory()) .thenReturn(temporaryFolder.getAbsolutePath()); + when(jKubeServiceHub.getConfiguration()).thenReturn(JKubeConfiguration.builder() + .project(JavaProject.builder().build()) + .buildArgs(Collections.emptyMap()) + .build()); imageConfiguration = ImageConfiguration.builder() .name("myapp") .build(BuildConfiguration.builder() @@ -183,64 +192,95 @@ void createBuildStrategy_withS2iBuildStrategyAndPullSecret_shouldReturnValidBuil .hasFieldOrPropertyWithValue("pullSecret.name", "my-secret-for-pull"); } - @Test - void createBuildStrategy_withDockerBuildStrategyAndNoPullSecret_shouldReturnValidBuildStrategy() { - // Given - when(jKubeServiceHub.getBuildServiceConfig().getJKubeBuildStrategy()) - .thenReturn(JKubeBuildStrategy.docker); - // When - final BuildStrategy result = createBuildStrategy(jKubeServiceHub, imageConfiguration, null); - // Then - assertThat(result) - .hasFieldOrPropertyWithValue("type", "Docker") - .extracting(BuildStrategy::getDockerStrategy) - .hasFieldOrPropertyWithValue("from.kind", "DockerImage") - .hasFieldOrPropertyWithValue("from.name", "ubi8/s2i-base"); - } - - @Test - void createBuildStrategy_withDockerBuildArgs_shouldReturnValidBuildStrategyWithBuildArgs() { - // Given - when(jKubeServiceHub.getBuildServiceConfig().getJKubeBuildStrategy()) - .thenReturn(JKubeBuildStrategy.docker); - ImageConfiguration imageConfig = ImageConfiguration.builder() - .name("myapp") - .build(BuildConfiguration.builder() - .from("ubi8/s2i-base") - .args(Collections.singletonMap("BUILD_ARGS_KEY", "build-args-value")) - .build()) - .build(); - // When - final BuildStrategy result = createBuildStrategy(jKubeServiceHub, imageConfig, "my-secret-for-pull"); - // Then - assertThat(result) - .hasFieldOrPropertyWithValue("type", "Docker") - .extracting(BuildStrategy::getDockerStrategy) - .hasFieldOrPropertyWithValue("from.kind", "DockerImage") - .hasFieldOrPropertyWithValue("from.name", "ubi8/s2i-base") - .extracting("buildArgs").asList().hasSize(1).first().satisfies( - envVar -> { - assertThat(envVar) - .hasFieldOrPropertyWithValue("name", "BUILD_ARGS_KEY") - .hasFieldOrPropertyWithValue("value", "build-args-value"); - }); - } - - @Test - void createBuildStrategy_withDockerBuildStrategyAndPullSecret_shouldReturnValidBuildStrategy() { - // Given - when(jKubeServiceHub.getBuildServiceConfig().getJKubeBuildStrategy()) - .thenReturn(JKubeBuildStrategy.docker); - // When - final BuildStrategy result = createBuildStrategy(jKubeServiceHub, imageConfiguration, "my-secret-for-pull"); - // Then - assertThat(result) - .hasFieldOrPropertyWithValue("type", "Docker") - .extracting(BuildStrategy::getDockerStrategy) - .hasFieldOrPropertyWithValue("from.kind", "DockerImage") - .hasFieldOrPropertyWithValue("from.name", "ubi8/s2i-base") - .hasFieldOrPropertyWithValue("noCache", false) - .hasFieldOrPropertyWithValue("pullSecret.name", "my-secret-for-pull"); + @Nested + @DisplayName("docker BuildStrategy") + class DockerBuildStrategy { + @BeforeEach + void setUp() { + when(jKubeServiceHub.getBuildServiceConfig().getJKubeBuildStrategy()) + .thenReturn(JKubeBuildStrategy.docker); + } + + @Test + @DisplayName("no pull secret specified") + void withDockerBuildStrategyAndNoPullSecret_shouldReturnValidBuildStrategy() { + // When + final BuildStrategy result = createBuildStrategy(jKubeServiceHub, imageConfiguration, null); + // Then + assertThat(result) + .hasFieldOrPropertyWithValue("type", "Docker") + .extracting(BuildStrategy::getDockerStrategy) + .hasFieldOrPropertyWithValue("from.kind", "DockerImage") + .hasFieldOrPropertyWithValue("from.name", "ubi8/s2i-base"); + } + + @Test + @DisplayName("pull secret specified, should reflect in Build Strategy") + void withPullSecret_shouldReturnValidBuildStrategy() { + // When + final BuildStrategy result = createBuildStrategy(jKubeServiceHub, imageConfiguration, "my-secret-for-pull"); + // Then + assertThat(result) + .hasFieldOrPropertyWithValue("type", "Docker") + .extracting(BuildStrategy::getDockerStrategy) + .hasFieldOrPropertyWithValue("from.kind", "DockerImage") + .hasFieldOrPropertyWithValue("from.name", "ubi8/s2i-base") + .hasFieldOrPropertyWithValue("noCache", false) + .hasFieldOrPropertyWithValue("pullSecret.name", "my-secret-for-pull"); + } + + @Nested + @DisplayName("with build args") + class WithDockerBuildArgs { + @Test + @DisplayName("when docker build args in ImageConfig, then add them to BuildStrategy") + void withDockerBuildArgsInImageConfiguration_shouldReturnValidBuildStrategyWithBuildArgs() { + // Given + imageConfiguration = imageConfiguration.toBuilder() + .build(imageConfiguration.getBuild().toBuilder() + .args(Collections.singletonMap("BUILD_ARGS_KEY", "build-args-value")) + .build()) + .build(); + // When + final BuildStrategy result = createBuildStrategy(jKubeServiceHub, imageConfiguration, "my-secret-for-pull"); + // Then + assertBuildArgPresentInBuildStrategy(result); + } + + @Test + @DisplayName("when docker build args in project properties, then add them to BuildStrategy") + void withDockerBuildArgsInProjectProperties_shouldReturnValidBuildStrategyWithBuildArgs() { + // Given + Properties properties = new Properties(); + properties.put("docker.buildArg.BUILD_ARGS_KEY", "build-args-value"); + when(jKubeServiceHub.getConfiguration()).thenReturn(JKubeConfiguration.builder() + .project(JavaProject.builder() + .properties(properties) + .build()) + .build()); + // When + final BuildStrategy result = createBuildStrategy(jKubeServiceHub, imageConfiguration, "my-secret-for-pull"); + // Then + assertBuildArgPresentInBuildStrategy(result); + } + + void assertBuildArgPresentInBuildStrategy(BuildStrategy result) { + assertThat(result) + .hasFieldOrPropertyWithValue("type", "Docker") + .extracting(BuildStrategy::getDockerStrategy) + .hasFieldOrPropertyWithValue("from.kind", "DockerImage") + .hasFieldOrPropertyWithValue("from.name", "ubi8/s2i-base") + .extracting("buildArgs") + .asInstanceOf(InstanceOfAssertFactories.LIST) + .singleElement() + .satisfies( + envVar -> { + assertThat(envVar) + .hasFieldOrPropertyWithValue("name", "BUILD_ARGS_KEY") + .hasFieldOrPropertyWithValue("value", "build-args-value"); + }); + } + } } @Test From 061c9191bcf820ff1c00b53f8479306ba7f69611 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Thu, 2 May 2024 16:26:47 +0530 Subject: [PATCH 098/289] fix (jkube-kit) : Configure YAML_MAPPER to use platform specific line endings Update Serialization's YAML_MAPPER to use line breaks specific to platform it's running on. Earlier we were always using Line Feeds whether on Windows or Unix. Signed-off-by: Rohan Kumar --- CHANGELOG.md | 1 + .../jkube/kit/common/util/Serialization.java | 1 + .../jkube/kit/common/util/SerializationTest.java | 14 +++++++------- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 22846a6a53..d9493cfecf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,7 @@ Usage: * Fix #2885: Provide a way to set labels on images defined by Generators * Fix #2901: Ensure Docker build arguments from properties are used during images pre-pulling * Fix #2904: `docker.buildArg.*` properties not taken into account in OpenShift plugins +* Fix #3007: Kubernetes Maven Plugin generating resource manifests with line feeds on Windows ### 1.16.2 (2024-03-27) * Fix #2461: `k8s:watch`/`k8sWatch` should throw error in `buildpacks` build strategy diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/Serialization.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/Serialization.java index 9394a8236f..876dfea8a9 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/Serialization.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/Serialization.java @@ -37,6 +37,7 @@ public class Serialization { private static final ObjectMapper JSON_MAPPER = new ObjectMapper(); private static final ObjectMapper YAML_MAPPER = new ObjectMapper(new YAMLFactory() .configure(YAMLGenerator.Feature.MINIMIZE_QUOTES, true) + .configure(YAMLGenerator.Feature.USE_PLATFORM_LINE_BREAKS, true) .configure(YAMLGenerator.Feature.ALWAYS_QUOTE_NUMBERS_AS_STRINGS, true)); private static final KubernetesSerialization KUBERNETES_SERIALIZATION = new KubernetesSerialization(JSON_MAPPER, true); static { diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SerializationTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SerializationTest.java index a46bcb117b..43bf1a4153 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SerializationTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SerializationTest.java @@ -207,12 +207,12 @@ void saveYaml_withConfigMap_savesFile(@TempDir Path targetDir) throws IOExceptio // Then assertThat(targetFile) .content() - .isEqualTo("---\n" + - "apiVersion: v1\n" + - "kind: ConfigMap\n" + - "metadata:\n" + - " name: test\n" + - "data:\n" + - " key: value\n"); + .isEqualTo(String.format("---%n" + + "apiVersion: v1%n" + + "kind: ConfigMap%n" + + "metadata:%n" + + " name: test%n" + + "data:%n" + + " key: value%n")); } } From 3350bd468a692edcda8ef680133e1aa3e69ca701 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 May 2024 06:51:39 +0200 Subject: [PATCH 099/289] chore(deps): Bump org.bouncycastle:bcpkix-jdk18on from 1.76 to 1.78.1 Bumps [org.bouncycastle:bcpkix-jdk18on](https://github.com/bcgit/bc-java) from 1.76 to 1.78.1. - [Changelog](https://github.com/bcgit/bc-java/blob/main/docs/releasenotes.html) - [Commits](https://github.com/bcgit/bc-java/commits) --- updated-dependencies: - dependency-name: org.bouncycastle:bcpkix-jdk18on dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- jkube-kit/parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index 21afb4cc64..8519aaac66 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -34,7 +34,7 @@ UTF-8 - 1.76 + 1.78.1 1.17.0 3.14.0 1.12.0 From dc0ce2913dda2d8d7773926e96297c5c137637a4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 May 2024 06:52:39 +0200 Subject: [PATCH 100/289] chore(deps): Bump org.apache.maven.plugin-tools:maven-plugin-annotations Bumps [org.apache.maven.plugin-tools:maven-plugin-annotations](https://github.com/apache/maven-plugin-tools) from 3.9.0 to 3.12.0. - [Release notes](https://github.com/apache/maven-plugin-tools/releases) - [Commits](https://github.com/apache/maven-plugin-tools/compare/maven-plugin-tools-3.9.0...maven-plugin-tools-3.12.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugin-tools:maven-plugin-annotations dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- jkube-kit/parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index 8519aaac66..9ac8a3e322 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -51,7 +51,7 @@ 3.6.2 3.8.1 3.3.2 - 3.9.0 + 3.12.0 1.4.0 ${version.kubernetes-client} 2.8.0 From 6cb25acce10659e2220f954a18845992c5a55fbd Mon Sep 17 00:00:00 2001 From: Arman Yekkehkhani <72594459+arman-yekkehkhani@users.noreply.github.com> Date: Fri, 3 May 2024 14:29:09 +0330 Subject: [PATCH 101/289] fix(file-assertions): fix method fileTree to compare realPath of parent with subdirectories, issue #3001 Signed-off-by: arman-yekkehkhani (cherry picked from commit 24427664c21d77fb9c921ac72097b193e621ed80) --- .../org/eclipse/jkube/kit/common/assertj/FileAssertions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/assertj/FileAssertions.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/assertj/FileAssertions.java index bf88d1b7c7..f172fead88 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/assertj/FileAssertions.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/assertj/FileAssertions.java @@ -42,7 +42,7 @@ public static FileAssertions assertThat(File file) { public AbstractListAssert, List, String, ObjectAssert> fileTree() throws IOException { - final Path actualPath = actual.toPath().normalize(); + final Path actualPath = actual.toPath().normalize().toRealPath(); final List paths = new ArrayList<>(); try (Stream pathStream = Files.walk(actualPath)) { for (Path temp : pathStream From a77a1d78c5dfbe3ab31c75d300ce56cb6fe03a66 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 6 May 2024 06:50:12 +0200 Subject: [PATCH 102/289] chore(deps): Bump org.apache.maven.plugins:maven-failsafe-plugin Bumps [org.apache.maven.plugins:maven-failsafe-plugin](https://github.com/apache/maven-surefire) from 3.1.2 to 3.2.5. - [Release notes](https://github.com/apache/maven-surefire/releases) - [Commits](https://github.com/apache/maven-surefire/compare/surefire-3.1.2...surefire-3.2.5) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-failsafe-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bdcce72c1c..99a5a6e3d1 100644 --- a/pom.xml +++ b/pom.xml @@ -111,7 +111,7 @@ 1.18.20.0 3.13.0 3.4.1 - 3.1.2 + 3.2.5 3.2.4 3.6.1 3.4.1 From b80664fcafd52c9152cb88db0a7699463f60179b Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Mon, 6 May 2024 16:13:16 +0530 Subject: [PATCH 103/289] fix (jkube-kit/enricher): YAML multiline annotations incorrectly serialized on windows Related to eclipse-jkube#2841 Currently for enforcing trailing newline in case of multi line strings in resource annotations, we were relying on presence of `System.lineSeparator()`. This was causing problems as YAML multiline scalar values are converted into strings with Line Feed (`\n`) endings when they're deserialized into objects. Modify logic in MetadataVisitor with respect to this behavior. Signed-off-by: Rohan Kumar --- .../kit/common/util/SerializationTest.java | 77 +++++++++++++++++++ .../enricher/api/visitor/MetadataVisitor.java | 11 ++- .../api/visitor/MetadataVisitorTest.java | 20 ++++- 3 files changed, 102 insertions(+), 6 deletions(-) diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SerializationTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SerializationTest.java index 43bf1a4153..9a6484878d 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SerializationTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SerializationTest.java @@ -20,6 +20,8 @@ import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.api.model.Pod; import io.fabric8.openshift.api.model.Template; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -215,4 +217,79 @@ void saveYaml_withConfigMap_savesFile(@TempDir Path targetDir) throws IOExceptio "data:%n" + " key: value%n")); } + + @Nested + @DisplayName("Multi-line strings are serialized to YAML using scalar blocks") + class MultiLineStringsSerializedToScalarYamlBlocks { + @Test + @DisplayName("string ends with newline, then add | to use block style in serialized object") + void whenStringEndingWithNewline_thenAddBlockIndicatorInSerializedObject(@TempDir Path targetDir) throws IOException { + // Given + final File targetFile = targetDir.resolve("cm.yaml").toFile(); + final ConfigMap source = new ConfigMapBuilder() + .withNewMetadata() + .addToAnnotations("proxy.istio.io/config", String.format("proxyMetadata:%n ISTIO_META_DNS_CAPTURE: \"false\"%nholdApplicationUntilProxyStarts: true\n")) + .endMetadata() + .build(); + // When + Serialization.saveYaml(targetFile, source); + // Then + assertThat(targetFile) + .content() + .isEqualTo(String.format("---%n" + + "apiVersion: v1%n" + + "kind: ConfigMap%n" + + "metadata:%n" + + " annotations:%n" + + " proxy.istio.io/config: |%n" + + " proxyMetadata:%n" + + " ISTIO_META_DNS_CAPTURE: \"false\"%n"+ + " holdApplicationUntilProxyStarts: true%n")); + } + + @Test + @DisplayName("when string contains windows line breaks, then convert then to unix line breaks during deserialization") + void unmarshal_withWindowsLineEndings_shouldDeserializeMultilineStringWithLineFeeds() { + // Given + String input = "apiVersion: v1\r\n" + + "kind: ConfigMap\r\n" + + "metadata:\r\n" + + " annotations:\r\n" + + " proxy.istio.io/config: |\r\n" + + " proxyMetadata:\r\n" + + " ISTIO_META_DNS_CAPTURE: \"false\"\r\n"+ + " holdApplicationUntilProxyStarts: true\r\n"; + + // When + ConfigMap configMap = Serialization.unmarshal(input, ConfigMap.class); + + // Then + assertThat(configMap.getMetadata().getAnnotations()) + .containsEntry("proxy.istio.io/config", "proxyMetadata:\n" + + " ISTIO_META_DNS_CAPTURE: \"false\"\n" + + "holdApplicationUntilProxyStarts: true\n"); + } + + @Test + @DisplayName("when string contains unix line breaks, then line breaks remain unchanged during deserialization") + void unmarshal_withUnixLineEndings_shouldDeserializeMultilineStringWithLineFeeds() { + // Given + String input = "apiVersion: v1\n" + + "kind: ConfigMap\n" + + "metadata:\n" + + " annotations:\n" + + " proxy.istio.io/config: |\n" + + " proxyMetadata:\n" + + " ISTIO_META_DNS_CAPTURE: \"false\"\n"+ + " holdApplicationUntilProxyStarts: true\n"; + // When + ConfigMap configMap = Serialization.unmarshal(input, ConfigMap.class); + + // Then + assertThat(configMap.getMetadata().getAnnotations()) + .containsEntry("proxy.istio.io/config", "proxyMetadata:\n" + + " ISTIO_META_DNS_CAPTURE: \"false\"\n" + + "holdApplicationUntilProxyStarts: true\n"); + } + } } diff --git a/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/visitor/MetadataVisitor.java b/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/visitor/MetadataVisitor.java index 80b428f530..b739b11ef8 100644 --- a/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/visitor/MetadataVisitor.java +++ b/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/visitor/MetadataVisitor.java @@ -20,6 +20,8 @@ import java.util.Properties; import java.util.function.Function; import java.util.function.Supplier; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.eclipse.jkube.kit.config.resource.MetaDataConfig; import org.eclipse.jkube.kit.config.resource.ResourceConfig; @@ -73,6 +75,7 @@ public class MetadataVisitor extends TypedVisitor private final Supplier labelSupplier; private final Function> objectMeta; private final Function, Runnable> endMetadata; + private static final Pattern CONTAINS_LINE_BREAK = Pattern.compile("\r?\n"); public MetadataVisitor( Class clazz, @@ -112,8 +115,12 @@ private static MetaDataConfig getLabels(ResourceConfig resourceConfig) { } private String appendTrailingNewLineIfMultiline(String value) { - if (value.contains(System.lineSeparator()) && !value.endsWith(System.lineSeparator())) { - return value + System.lineSeparator(); + Matcher m = CONTAINS_LINE_BREAK.matcher(value); + if (m.find()) { + String eol = m.group(); + if (!value.endsWith(eol)) { + return value + eol; + } } return value; } diff --git a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/visitor/MetadataVisitorTest.java b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/visitor/MetadataVisitorTest.java index 50db56be99..37baa53af1 100644 --- a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/visitor/MetadataVisitorTest.java +++ b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/visitor/MetadataVisitorTest.java @@ -14,6 +14,7 @@ package org.eclipse.jkube.kit.enricher.api.visitor; import java.util.Properties; +import java.util.stream.Stream; import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import org.eclipse.jkube.kit.config.resource.MetaDataConfig; @@ -38,6 +39,9 @@ import io.fabric8.openshift.api.model.RouteBuilder; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.data.MapEntry.entry; @@ -350,12 +354,13 @@ void route() { assertThat(route.build().getMetadata().getLabels()).containsOnly(entry("route", "Yay")); } - @Test - void metadataVisit_whenMultilineAnnotationProvided_shouldAddTrailingNewline() { + @ParameterizedTest + @MethodSource + void metadataVisit_whenMultilineAnnotationProvided_shouldAddTrailingNewline(String multiLineScalar, String eol) { // Given Properties allProps = new Properties(); final ObjectMetaBuilder db = new ObjectMetaBuilder(); - allProps.put("multiline/config", String.format("proxyMetadata:%n ISTIO_META_DNS_CAPTURE: \"false\"%nholdUntilProxyStarts: true")); + allProps.put("multiline/config", String.format(multiLineScalar)); ResourceConfig rc = ResourceConfig.builder() .annotations(MetaDataConfig.builder() .all(allProps) @@ -367,6 +372,13 @@ void metadataVisit_whenMultilineAnnotationProvided_shouldAddTrailingNewline() { // Then assertThat(db.build().getAnnotations()) - .containsOnly(entry("multiline/config", String.format("proxyMetadata:%n ISTIO_META_DNS_CAPTURE: \"false\"%nholdUntilProxyStarts: true%n"))); + .containsOnly(entry("multiline/config", String.format("proxyMetadata:%s ISTIO_META_DNS_CAPTURE: \"false\"%sholdUntilProxyStarts: true%s", eol, eol, eol))); + } + + private static Stream metadataVisit_whenMultilineAnnotationProvided_shouldAddTrailingNewline() { + return Stream.of( + Arguments.of("proxyMetadata:\n ISTIO_META_DNS_CAPTURE: \"false\"\nholdUntilProxyStarts: true", "\n"), + Arguments.of("proxyMetadata:\r\n ISTIO_META_DNS_CAPTURE: \"false\"\r\nholdUntilProxyStarts: true", "\r\n") + ); } } \ No newline at end of file From e9ad89ff777743ba1a0c020a5dafee2efd81132c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 May 2024 08:09:31 +0200 Subject: [PATCH 104/289] chore(deps): Bump actions/checkout from 4.1.4 to 4.1.5 Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.4 to 4.1.5. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/0ad4b8fadaa221de15dcec353f45205ec38ea70b...44c2b7a8a4ea60a981eaca3cf939b5f4305c123b) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/license.yml | 2 +- .github/workflows/quickstarts.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/license.yml b/.github/workflows/license.yml index 174afb7172..cb79b8a800 100644 --- a/.github/workflows/license.yml +++ b/.github/workflows/license.yml @@ -40,7 +40,7 @@ jobs: repo.maven.apache.org:443 - name: Checkout - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b + uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b - name: Setup Java 11 uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 with: diff --git a/.github/workflows/quickstarts.yml b/.github/workflows/quickstarts.yml index 8a42fe0e93..c68a88a419 100644 --- a/.github/workflows/quickstarts.yml +++ b/.github/workflows/quickstarts.yml @@ -52,7 +52,7 @@ jobs: services.gradle.org:443 - name: Checkout - uses: actions/checkout@0ad4b8fadaa221de15dcec353f45205ec38ea70b + uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b - name: Setup Java 17 uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 with: From 1985f8a7fec14901d878ea57f2752abf2af4f45d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 7 May 2024 08:09:40 +0200 Subject: [PATCH 105/289] chore(deps): Bump net.minidev:json-smart from 2.5.0 to 2.5.1 Bumps [net.minidev:json-smart](https://github.com/netplex/json-smart-v2) from 2.5.0 to 2.5.1. - [Release notes](https://github.com/netplex/json-smart-v2/releases) - [Commits](https://github.com/netplex/json-smart-v2/compare/2.5.0...2.5.1) --- updated-dependencies: - dependency-name: net.minidev:json-smart dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 99a5a6e3d1..1c1b84274c 100644 --- a/pom.xml +++ b/pom.xml @@ -103,7 +103,7 @@ 0.0.7 2.17.0 0.8.12 - 2.5.0 + 2.5.1 5.10.2 6.12.1 4.3 From 23771a0a6d0a4a4916be1cbba0276441e42fba80 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 05:36:46 +0200 Subject: [PATCH 106/289] chore(deps): Bump version.jackson from 2.17.0 to 2.17.1 Bumps `version.jackson` from 2.17.0 to 2.17.1. Updates `com.fasterxml.jackson.core:jackson-core` from 2.17.0 to 2.17.1 - [Commits](https://github.com/FasterXML/jackson-core/compare/jackson-core-2.17.0...jackson-core-2.17.1) Updates `com.fasterxml.jackson.core:jackson-databind` from 2.17.0 to 2.17.1 - [Commits](https://github.com/FasterXML/jackson/commits) Updates `com.fasterxml.jackson.dataformat:jackson-dataformat-yaml` from 2.17.0 to 2.17.1 - [Commits](https://github.com/FasterXML/jackson-dataformats-text/compare/jackson-dataformats-text-2.17.0...jackson-dataformats-text-2.17.1) Updates `com.fasterxml.jackson.datatype:jackson-datatype-jsr310` from 2.17.0 to 2.17.1 Updates `com.fasterxml.jackson:jackson-bom` from 2.17.0 to 2.17.1 - [Commits](https://github.com/FasterXML/jackson-bom/compare/jackson-bom-2.17.0...jackson-bom-2.17.1) --- updated-dependencies: - dependency-name: com.fasterxml.jackson.core:jackson-core dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: com.fasterxml.jackson.core:jackson-databind dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: com.fasterxml.jackson.dataformat:jackson-dataformat-yaml dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: com.fasterxml.jackson.datatype:jackson-datatype-jsr310 dependency-type: direct:production update-type: version-update:semver-patch - dependency-name: com.fasterxml.jackson:jackson-bom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1c1b84274c..bc0fdad589 100644 --- a/pom.xml +++ b/pom.xml @@ -101,7 +101,7 @@ 3.0.21 33.1.0-jre 0.0.7 - 2.17.0 + 2.17.1 0.8.12 2.5.1 5.10.2 From 91be299e4b103ddf8db2029830dfa44176b62df2 Mon Sep 17 00:00:00 2001 From: Arman Yekkehkhani <72594459+arman-yekkehkhani@users.noreply.github.com> Date: Wed, 8 May 2024 10:36:19 +0330 Subject: [PATCH 107/289] test:fix: use real path of jars in class path SpringBootWatcherIntegrationTest (#3001) Signed-off-by: arman-yekkehkhani --- .../watcher/SpringBootWatcherIntegrationTest.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java index ae5f377491..3bb8b28a46 100644 --- a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java +++ b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java @@ -120,6 +120,7 @@ void withNoRemoteSecretThrowsException() { @Test void withAllRequirementsShouldStartWatcherProcess() throws Exception { final Runtime runtime = mock(Runtime.class, RETURNS_DEEP_STUBS); + target.resolve("spring-boot-lib.jar").toFile().createNewFile(); target.resolve("spring-boot-devtools.jar").toFile().createNewFile(); FileUtils.write(target.resolve("application.properties").toFile(), "spring.devtools.remote.secret=this-is-a-test", StandardCharsets.UTF_8); new SpringBootWatcher(runtime, watcherContext) @@ -129,15 +130,19 @@ void withAllRequirementsShouldStartWatcherProcess() throws Exception { && new File(command[0]).exists() && command[1].equals("-cp") && command[2].contains( - absolutePath("spring-boot-lib.jar") + File.pathSeparator + absolutePath("spring-boot-devtools.jar")) + realPath("spring-boot-lib.jar") + File.pathSeparator + realPath("spring-boot-devtools.jar")) && command[3].equals("-Dspring.devtools.remote.secret=this-is-a-test") && command[4].equals("org.springframework.boot.devtools.RemoteSpringApplication") && command[5].matches("^http://localhost:\\d+$") )); } - private String absolutePath(String jar) { - return project.resolve("target").resolve(jar).toFile().getAbsolutePath(); + private String realPath(String jar) { + try { + return project.resolve("target").resolve(jar).toRealPath().toString(); + } catch (IOException e) { + throw new RuntimeException(e); + } } } From 7d08fb086e056e60a7b5ac4533d4bc3a2bdcf09f Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Wed, 8 May 2024 15:17:57 +0200 Subject: [PATCH 108/289] refactor: remove unused component Signed-off-by: Marc Nuri --- .../maven/plugin/mojo/build/AbstractDockerMojo.java | 8 -------- .../jkube/maven/plugin/mojo/build/ResourceMojo.java | 4 ---- .../src/main/resources/META-INF/plexus/components.xml | 10 ---------- .../jkube/maven/plugin/mojo/develop/WatchMojoTest.java | 2 -- .../src/main/resources/META-INF/plexus/components.xml | 10 ---------- .../plugin/mojo/build/OpenShiftResourceMojoTest.java | 8 -------- 6 files changed, 42 deletions(-) diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java index 20c0143892..542e9bd4bd 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java @@ -33,10 +33,8 @@ import org.eclipse.jkube.kit.build.service.docker.DockerServiceHub; import org.eclipse.jkube.kit.build.service.docker.access.DockerAccess; import org.eclipse.jkube.kit.build.service.docker.auth.AuthConfigFactory; -import org.eclipse.jkube.kit.build.api.helper.ConfigHelper; import org.eclipse.jkube.kit.build.service.docker.config.DockerMachineConfiguration; import org.eclipse.jkube.kit.config.image.WatchMode; -import org.eclipse.jkube.kit.build.api.helper.ImageConfigResolver; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.AnsiLogger; @@ -199,10 +197,6 @@ public abstract class AbstractDockerMojo extends AbstractMojo @Parameter(property = "jkube.profile") protected String profile; - // Handler for external configurations - @Component - protected ImageConfigResolver imageConfigResolver; - /** * Skip extended authentication */ @@ -377,7 +371,6 @@ public final void execute() throws MojoExecutionException, MojoFailureException protected void init() { log = new AnsiLogger(getLog(), useColorForLogging(), verbose, !settings.getInteractiveMode(), getLogPrefix()); authConfigFactory = new AuthConfigFactory(log); - imageConfigResolver.setLog(log); clusterAccess = new ClusterAccess(initClusterConfiguration()); runtimeMode = getConfiguredRuntimeMode(); } @@ -429,7 +422,6 @@ protected void doExecute() throws MojoExecutionException { protected abstract void executeInternal() throws IOException, MojoExecutionException; protected JKubeConfiguration initJKubeConfiguration() throws DependencyResolutionRequiredException { - ConfigHelper.validateExternalPropertyActivation(javaProject, images); return JKubeConfiguration.builder() .project(MavenUtil.convertMavenProjectToJKubeProject(project, session)) .sourceDirectory(sourceDirectory) diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java index c1d4110b72..116cb4656d 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java @@ -22,7 +22,6 @@ import javax.validation.ConstraintViolationException; import org.eclipse.jkube.generator.api.GeneratorContext; -import org.eclipse.jkube.kit.build.api.helper.ImageConfigResolver; import org.eclipse.jkube.generator.api.DefaultGeneratorManager; import org.eclipse.jkube.kit.common.KitLogger; @@ -69,9 +68,6 @@ public class ResourceMojo extends AbstractJKubeMojo { // Filename for holding the build timestamp public static final String DOCKER_BUILD_TIMESTAMP = "docker/build.timestamp"; - @Component - protected ImageConfigResolver imageConfigResolver; - /** * Should we use the project's compile-time classpath to scan for additional enrichers/generators? */ diff --git a/kubernetes-maven-plugin/plugin/src/main/resources/META-INF/plexus/components.xml b/kubernetes-maven-plugin/plugin/src/main/resources/META-INF/plexus/components.xml index 4f4fa91b2b..02903f8345 100644 --- a/kubernetes-maven-plugin/plugin/src/main/resources/META-INF/plexus/components.xml +++ b/kubernetes-maven-plugin/plugin/src/main/resources/META-INF/plexus/components.xml @@ -90,11 +90,6 @@ - - org.eclipse.jkube.kit.build.api.config.handler.property.PropertyConfigHandler - org.eclipse.jkube.kit.build.api.config.handler.property.PropertyConfigHandler - false - org.codehaus.plexus.archiver.Archiver track @@ -132,10 +127,5 @@ org.eclipse.jkube.kit.build.service.docker.DockerAccessFactory false - - org.eclipse.jkube.kit.build.api.helper.ImageConfigResolver - org.eclipse.jkube.kit.build.api.helper.ImageConfigResolver - false - diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java index 038b9d42c8..9e36a6ce0d 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java @@ -22,7 +22,6 @@ import java.util.Properties; import io.fabric8.kubernetes.client.KubernetesClient; -import org.eclipse.jkube.kit.build.api.helper.ImageConfigResolver; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.config.access.ClusterAccess; @@ -95,7 +94,6 @@ void setUp(@TempDir Path temporaryFolder) throws Exception { settings = mavenSettings; kubernetesManifest = kubernetesManifestFile; resourceDir = temporaryFolder.resolve("src").resolve("main").resolve("jkube").toFile().getAbsoluteFile(); - imageConfigResolver = new ImageConfigResolver(); buildStrategy = JKubeBuildStrategy.jib; setPluginContext(new HashMap<>()); }}; diff --git a/openshift-maven-plugin/plugin/src/main/resources/META-INF/plexus/components.xml b/openshift-maven-plugin/plugin/src/main/resources/META-INF/plexus/components.xml index 4f4fa91b2b..02903f8345 100644 --- a/openshift-maven-plugin/plugin/src/main/resources/META-INF/plexus/components.xml +++ b/openshift-maven-plugin/plugin/src/main/resources/META-INF/plexus/components.xml @@ -90,11 +90,6 @@ - - org.eclipse.jkube.kit.build.api.config.handler.property.PropertyConfigHandler - org.eclipse.jkube.kit.build.api.config.handler.property.PropertyConfigHandler - false - org.codehaus.plexus.archiver.Archiver track @@ -132,10 +127,5 @@ org.eclipse.jkube.kit.build.service.docker.DockerAccessFactory false - - org.eclipse.jkube.kit.build.api.helper.ImageConfigResolver - org.eclipse.jkube.kit.build.api.helper.ImageConfigResolver - false - diff --git a/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftResourceMojoTest.java b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftResourceMojoTest.java index da6cc3384a..0f27187b3c 100644 --- a/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftResourceMojoTest.java +++ b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftResourceMojoTest.java @@ -21,7 +21,6 @@ import org.apache.maven.project.MavenProject; import org.apache.maven.project.MavenProjectHelper; import org.apache.maven.settings.Settings; -import org.eclipse.jkube.kit.build.api.helper.ImageConfigResolver; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.config.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.image.ImageConfiguration; @@ -35,13 +34,10 @@ import java.util.Collections; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; class OpenShiftResourceMojoTest { @@ -105,8 +101,6 @@ void executeInternal_resolvesGroupInImageNameToClusterAccessNamespace_whenNamesp .build()) .build(); resourceMojo.images = Collections.singletonList(imageConfiguration); - resourceMojo.imageConfigResolver = mock(ImageConfigResolver.class); - when(resourceMojo.imageConfigResolver.resolve(eq(imageConfiguration), any())).thenReturn(Collections.singletonList(imageConfiguration)); resourceMojo.access = ClusterConfiguration.builder().namespace("namespace-from-cluster-access").build(); // When resourceMojo.execute(); @@ -126,8 +120,6 @@ void execute_resolvesGroupInImageNameToNamespaceSetViaConfiguration_whenNoNamesp .build()) .build(); resourceMojo.images = Collections.singletonList(imageConfiguration); - resourceMojo.imageConfigResolver = mock(ImageConfigResolver.class); - when(resourceMojo.imageConfigResolver.resolve(eq(imageConfiguration), any())).thenReturn(Collections.singletonList(imageConfiguration)); resourceMojo.namespace = "namespace-configured-via-plugin"; // When resourceMojo.execute(); From c47d39cf3ece7b264f7e1df2e5c085cdb657661b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 May 2024 06:52:08 +0200 Subject: [PATCH 109/289] chore(deps): Bump org.apache.maven.plugin-tools:maven-plugin-annotations Bumps [org.apache.maven.plugin-tools:maven-plugin-annotations](https://github.com/apache/maven-plugin-tools) from 3.12.0 to 3.13.0. - [Release notes](https://github.com/apache/maven-plugin-tools/releases) - [Commits](https://github.com/apache/maven-plugin-tools/compare/maven-plugin-tools-3.12.0...maven-plugin-tools-3.13.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugin-tools:maven-plugin-annotations dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- jkube-kit/parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index 9ac8a3e322..a36fdc5f85 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -51,7 +51,7 @@ 3.6.2 3.8.1 3.3.2 - 3.12.0 + 3.13.0 1.4.0 ${version.kubernetes-client} 2.8.0 From 790a2c4ef15d9677b8883976b435c1622020804f Mon Sep 17 00:00:00 2001 From: Jason Mok <106209849+jasonmokk@users.noreply.github.com> Date: Thu, 9 May 2024 04:59:32 -0500 Subject: [PATCH 110/289] fix: removed unused import from ProfileUtilTest Signed-off-by: Jason Mok --- .../test/java/org/eclipse/jkube/kit/profile/ProfileUtilTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/jkube-kit/profile/src/test/java/org/eclipse/jkube/kit/profile/ProfileUtilTest.java b/jkube-kit/profile/src/test/java/org/eclipse/jkube/kit/profile/ProfileUtilTest.java index 4079bd421f..9f9d36ff83 100644 --- a/jkube-kit/profile/src/test/java/org/eclipse/jkube/kit/profile/ProfileUtilTest.java +++ b/jkube-kit/profile/src/test/java/org/eclipse/jkube/kit/profile/ProfileUtilTest.java @@ -18,7 +18,6 @@ import java.io.File; import java.io.IOException; -import java.io.InputStream; import java.net.URISyntaxException; import java.util.Arrays; import java.util.Collections; From 66f27507b91548913db349bc3df3c2d4f88c48d1 Mon Sep 17 00:00:00 2001 From: sahanagana <70218712+sahanagana@users.noreply.github.com> Date: Thu, 9 May 2024 05:42:58 -0500 Subject: [PATCH 111/289] fix: removed unused import from RemoteDevMojo (3032) Removed unused imports in RemoteDevMojo --- Fixed format change --- .../eclipse/jkube/maven/plugin/mojo/develop/RemoteDevMojo.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/RemoteDevMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/RemoteDevMojo.java index 6921a08cc6..5ecf2abcff 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/RemoteDevMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/RemoteDevMojo.java @@ -13,8 +13,6 @@ */ package org.eclipse.jkube.maven.plugin.mojo.develop; -import org.apache.maven.plugin.MojoExecutionException; -import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; From c8e5218e1ac9cbf8463b980bbb9db8f8eaba00a7 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Thu, 9 May 2024 18:59:38 +0530 Subject: [PATCH 112/289] doc(jkube-kit/doc): restructure BuildPacks Builder Image section in BuildPack Integration + Move default buildpack builder image section to top + Add section for configuring buildpack builder image using `jkube.generator.buildpacksBuilderImage` property Signed-off-by: Rohan Kumar --- .../doc/src/main/asciidoc/inc/_integrations.adoc | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/jkube-kit/doc/src/main/asciidoc/inc/_integrations.adoc b/jkube-kit/doc/src/main/asciidoc/inc/_integrations.adoc index b381ad14b4..c819ca7cf3 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/_integrations.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/_integrations.adoc @@ -88,11 +88,15 @@ endif::[] `pack build` process. If the download for the https://buildpacks.io/docs/tools/pack/[Pack CLI] binary fails, {plugin} looks for any locally installed https://buildpacks.io/docs/tools/pack/[Pack CLI] version. === Buildpack Builder Image -By default {plugin} uses the https://buildpacks.io/docs/concepts/components/builder/[builder image] specified in the https://buildpacks.io/docs/tools/pack/cli/pack_config/[Pack Config] file for building the container image using https://buildpacks.io/docs/tools/pack/[Pack CLI]. - -For example, if the user has this image set in the `$HOME/.pack/config.toml` file: +- If no builder image is configured, then {plugin} uses `paketobuildpacks/builder:base` as the default builder image. +- If builder image is provided in local https://buildpacks.io/docs/tools/pack/cli/pack_config/[Pack Config], {plugin} uses the https://buildpacks.io/docs/concepts/components/builder/[builder image] specified in the file. + For example,if the user has this image set in the `$HOME/.pack/config.toml` file, {plugin} will use `testuser/buildpacks-quarkus-builder:latest` as Buildpacks builder image.: [source,toml,indent=2,subs="verbatim,quotes,attributes"] ---- default-builder-image = "testuser/buildpacks-quarkus-builder:latest" ---- -{plugin} uses `testuser/buildpacks-quarkus-builder:latest` as Buildpacks builder image. If no image is configured, then {plugin} uses `paketobuildpacks/builder:base` as the default builder image. +- It's also possible to configure BuildPack builder image using property or {plugin-configuration-type} configuration. You can use this property to configure buildpacks builder image: +[source,properties,indent=2,subs="verbatim,quotes,attributes"] +---- +jkube.generator.buildpacksBuilderImage = "testuser/buildpacks-quarkus-builder:latest" +---- From 7d23a7222c3f3fa9c8cff9a378207349bbc9281b Mon Sep 17 00:00:00 2001 From: Josefina Oller <64923768+JosefinaOller@users.noreply.github.com> Date: Fri, 10 May 2024 02:13:52 -0300 Subject: [PATCH 113/289] test: removed unused import from PortForwardPodWatcherTest (3022) --- .../config/service/portforward/PortForwardPodWatcherTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/portforward/PortForwardPodWatcherTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/portforward/PortForwardPodWatcherTest.java index fce2ef8bed..73ed02f3b2 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/portforward/PortForwardPodWatcherTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/portforward/PortForwardPodWatcherTest.java @@ -25,7 +25,6 @@ import org.eclipse.jkube.kit.common.KitLogger; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.Mock; import java.util.Collections; import java.util.List; @@ -109,4 +108,4 @@ private static List toEnvVar(Map envVars) { .map(e -> new EnvVarBuilder().withName(e.getKey()).withValue(e.getValue()).build()) .collect(Collectors.toList()); } -} \ No newline at end of file +} From 066c038b293d07c97048dba0f10c0e5eb4da5307 Mon Sep 17 00:00:00 2001 From: jarmac0811 Date: Mon, 13 May 2024 06:48:05 +0200 Subject: [PATCH 114/289] fix: removed unused import from PodLogServiceTest --- .../org/eclipse/jkube/kit/config/service/PodLogServiceTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/PodLogServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/PodLogServiceTest.java index 7768124a86..1ec12dbe35 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/PodLogServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/PodLogServiceTest.java @@ -27,7 +27,6 @@ import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; import org.eclipse.jkube.kit.common.KitLogger; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; From b3c74dc1a58618095ce6e1ad984e95d8b1a42056 Mon Sep 17 00:00:00 2001 From: Akash Date: Mon, 13 May 2024 10:19:23 +0530 Subject: [PATCH 115/289] fix: remove unused import from KubernetesClientUtilTest Signed-off-by: ryukaizen --- .../kit/config/service/kubernetes/KubernetesClientUtilTest.java | 1 - 1 file changed, 1 deletion(-) 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 68e1a030ed..14f7406778 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 @@ -28,7 +28,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.eclipse.jkube.kit.config.service.kubernetes.KubernetesClientUtil.doDeleteAndWait; -import static org.eclipse.jkube.kit.config.service.kubernetes.KubernetesClientUtil.getPodStatusMessagePostfix; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; From d15cd9cdc40c04b86f0caa049d30f615dd39d31d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 May 2024 06:50:13 +0200 Subject: [PATCH 116/289] chore(deps): Bump com.mycila:license-maven-plugin from 4.3 to 4.4 Bumps [com.mycila:license-maven-plugin](https://github.com/mathieucarbou/license-maven-plugin) from 4.3 to 4.4. - [Commits](https://github.com/mathieucarbou/license-maven-plugin/compare/license-maven-plugin-4.3...license-maven-plugin-4.4) --- updated-dependencies: - dependency-name: com.mycila:license-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bc0fdad589..4cb102ae41 100644 --- a/pom.xml +++ b/pom.xml @@ -106,7 +106,7 @@ 2.5.1 5.10.2 6.12.1 - 4.3 + 4.4 1.18.32 1.18.20.0 3.13.0 From 2baba127ea369dbb3b7966fcb9eb0afda6659918 Mon Sep 17 00:00:00 2001 From: Jason Mok <106209849+jasonmokk@users.noreply.github.com> Date: Mon, 13 May 2024 07:26:49 -0500 Subject: [PATCH 117/289] fix: replace AssertJ's deprecated asList() DSL method in SerializationTest (3039) Chore #3027: Replace AssertJ's deprecated asList() DSL method with asInstanceOf(InstanceOfAssertFactories.list(type.class)) Signed-off-by: Jason Mok --- Remove use of wildcard import Signed-off-by: Jason Mok --- Resolve dependency issues Signed-off-by: Jason Mok --- .../kit/common/util/SerializationTest.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SerializationTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SerializationTest.java index 9a6484878d..52cf38955f 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SerializationTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SerializationTest.java @@ -16,10 +16,13 @@ import com.fasterxml.jackson.core.type.TypeReference; import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.api.model.ConfigMapBuilder; +import io.fabric8.kubernetes.api.model.Container; +import io.fabric8.kubernetes.api.model.EnvVar; import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.api.model.Pod; import io.fabric8.openshift.api.model.Template; +import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -81,13 +84,12 @@ void unmarshal_withTemplateUrl_shouldLoadTemplate() throws Exception { assertThat(result) .isInstanceOf(Template.class) .hasFieldOrPropertyWithValue("metadata.name", "template-example") - .extracting("objects").asList().singleElement() - .isInstanceOf(Pod.class) + .extracting("objects").asInstanceOf(InstanceOfAssertFactories.list(Pod.class)).singleElement() .hasFieldOrPropertyWithValue("metadata.name", "pod-from-template") - .extracting("spec.containers").asList().singleElement() + .extracting("spec.containers").asInstanceOf(InstanceOfAssertFactories.list(Container.class)).singleElement() .hasFieldOrPropertyWithValue("image", "busybox") .hasFieldOrPropertyWithValue("securityContext.additionalProperties.privileged", "${POD_SECURITY_CONTEXT}") - .extracting("env").asList().singleElement() + .extracting("env").asInstanceOf(InstanceOfAssertFactories.list(EnvVar.class)).singleElement() .hasFieldOrPropertyWithValue("value", "${ENV_VAR_KEY}"); } @@ -100,13 +102,12 @@ void unmarshal_withTemplateFile_shouldLoadTemplate() throws Exception { assertThat(result) .isInstanceOf(Template.class) .hasFieldOrPropertyWithValue("metadata.name", "template-example") - .extracting("objects").asList().singleElement() - .isInstanceOf(Pod.class) + .extracting("objects").asInstanceOf(InstanceOfAssertFactories.list(Pod.class)).singleElement() .hasFieldOrPropertyWithValue("metadata.name", "pod-from-template") - .extracting("spec.containers").asList().singleElement() + .extracting("spec.containers").asInstanceOf(InstanceOfAssertFactories.list(Container.class)).singleElement() .hasFieldOrPropertyWithValue("image", "busybox") .hasFieldOrPropertyWithValue("securityContext.additionalProperties.privileged", "${POD_SECURITY_CONTEXT}") - .extracting("env").asList().singleElement() + .extracting("env").asInstanceOf(InstanceOfAssertFactories.list(EnvVar.class)).singleElement() .hasFieldOrPropertyWithValue("value", "${ENV_VAR_KEY}"); } From 23dc150b9cc1e6f0b685d68de2722d7bf4e0e93a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 May 2024 06:44:12 +0200 Subject: [PATCH 118/289] chore(deps): Bump org.sonarsource.scanner.maven:sonar-maven-plugin Bumps [org.sonarsource.scanner.maven:sonar-maven-plugin](https://github.com/SonarSource/sonar-scanner-maven) from 3.9.1.2184 to 3.11.0.3922. - [Release notes](https://github.com/SonarSource/sonar-scanner-maven/releases) - [Commits](https://github.com/SonarSource/sonar-scanner-maven/compare/3.9.1.2184...3.11.0.3922) --- updated-dependencies: - dependency-name: org.sonarsource.scanner.maven:sonar-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4cb102ae41..59d821357f 100644 --- a/pom.xml +++ b/pom.xml @@ -125,7 +125,7 @@ 1.6.13 2.2.0 1.7.36 - 3.9.1.2184 + 3.11.0.3922 2.12.1 2024-03-27T11:10:46Z ${project.build.directory}/generated-docs From 6c7f976af489fd86aa89138c94782b9d1e8b3ea5 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Tue, 14 May 2024 14:10:31 +0200 Subject: [PATCH 119/289] fix: images can be configured with properties Signed-off-by: Marc Nuri --- .../expected/expected-config.yml | 4 - .../src/it/image-from-properties/build.gradle | 33 + .../image-from-properties/gradle.properties | 22 + .../plugin/tests/ImageFromPropertiesIT.java | 49 ++ .../plugin/task/KubernetesPushTaskTest.java | 3 +- .../plugin/task/OpenShiftPushTaskTest.java | 3 +- .../property/PropertyConfigHandler.java | 291 --------- .../{handler => }/property/ConfigKey.java | 85 +-- .../property/PropertyConfigResolver.java | 162 +++++ .../{handler => }/property/PropertyMode.java | 16 +- .../property/ValueCombinePolicy.java | 10 +- .../{handler => }/property/ValueProvider.java | 63 +- .../kit/build/api/helper/ConfigHelper.java | 88 --- .../api/helper/ExternalConfigHandler.java | 47 -- .../build/api/helper/ImageConfigResolver.java | 110 ---- .../build/api/helper/ImageNameFormatter.java | 2 +- .../kit/build/api/helper/NameFormatter.java | 21 + .../property/PropertyConfigHandlerTest.java | 597 ------------------ .../property/PropertyConfigResolverTest.java | 301 +++++++++ .../property/ValueCombinePolicyTest.java | 52 ++ .../build/api/helper/ConfigHelperTest.java | 75 --- .../kit/config/image/ImageConfiguration.java | 28 +- .../image/build/HealthCheckConfiguration.java | 2 +- .../config/image/ImageConfigurationTest.java | 34 +- .../main/asciidoc/inc/build/_assembly.adoc | 14 +- .../asciidoc/inc/build/_configuration.adoc | 59 +- .../main/asciidoc/inc/build/_healthcheck.adoc | 13 +- .../asciidoc/inc/image/_configuration.adoc | 26 +- .../api/DefaultGeneratorManager.java | 15 +- .../api/DefaultGeneratorManagerTest.java | 407 ++++++------ 30 files changed, 1040 insertions(+), 1592 deletions(-) create mode 100644 gradle-plugin/it/src/it/image-from-properties/build.gradle create mode 100644 gradle-plugin/it/src/it/image-from-properties/gradle.properties create mode 100644 gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ImageFromPropertiesIT.java delete mode 100644 jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/handler/property/PropertyConfigHandler.java rename jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/{handler => }/property/ConfigKey.java (55%) create mode 100644 jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolver.java rename jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/{handler => }/property/PropertyMode.java (78%) rename jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/{handler => }/property/ValueCombinePolicy.java (87%) rename jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/{handler => }/property/ValueProvider.java (88%) delete mode 100644 jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelper.java delete mode 100644 jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ExternalConfigHandler.java delete mode 100644 jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ImageConfigResolver.java create mode 100644 jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/NameFormatter.java delete mode 100644 jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/handler/property/PropertyConfigHandlerTest.java create mode 100644 jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolverTest.java create mode 100644 jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/property/ValueCombinePolicyTest.java delete mode 100644 jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelperTest.java diff --git a/gradle-plugin/it/src/it/extension-configuration/expected/expected-config.yml b/gradle-plugin/it/src/it/extension-configuration/expected/expected-config.yml index d0d943c1ca..09e6ede5dc 100644 --- a/gradle-plugin/it/src/it/extension-configuration/expected/expected-config.yml +++ b/gradle-plugin/it/src/it/extension-configuration/expected/expected-config.yml @@ -65,20 +65,16 @@ images: - name: "registry/image:tag" build: contextDir: "@endsWith('extension-configuration/src/main/context-dir')@" - dockerFile: "@endsWith('extension-configuration/src/main/context-dir/Dockerfile')@" from: "busybox" skip: false compression: "none" - dockerFileFile: "@endsWith('extension-configuration/src/main/context-dir/Dockerfile')@" dockerFileMode: true contextDirRaw: "@endsWith('extension-configuration/src/main/context-dir')@" buildConfiguration: contextDir: "@endsWith('extension-configuration/src/main/context-dir')@" - dockerFile: "@endsWith('extension-configuration/src/main/context-dir/Dockerfile')@" from: "busybox" skip: false compression: "none" - dockerFileFile: "@endsWith('extension-configuration/src/main/context-dir/Dockerfile')@" dockerFileMode: true contextDirRaw: "@endsWith('extension-configuration/src/main/context-dir')@" description: "[registry/image:tag]" diff --git a/gradle-plugin/it/src/it/image-from-properties/build.gradle b/gradle-plugin/it/src/it/image-from-properties/build.gradle new file mode 100644 index 0000000000..f515fc091a --- /dev/null +++ b/gradle-plugin/it/src/it/image-from-properties/build.gradle @@ -0,0 +1,33 @@ +/* + * 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 + */ +plugins { + id 'org.eclipse.jkube.kubernetes' version "${jKubeVersion}" + id 'java' +} + +group = 'org.eclipse.jkube.integration.tests.gradle' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = '11' + +repositories { + mavenCentral() +} + +kubernetes { + offline = true + images { + image { + } + } +} diff --git a/gradle-plugin/it/src/it/image-from-properties/gradle.properties b/gradle-plugin/it/src/it/image-from-properties/gradle.properties new file mode 100644 index 0000000000..b4212fe0d8 --- /dev/null +++ b/gradle-plugin/it/src/it/image-from-properties/gradle.properties @@ -0,0 +1,22 @@ +# +# 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 +# + +jkube.build.strategy=jib +jkube.container-image.name=repository/image-from-properties:latest +jkube.container-image.from=quay.io/quay/busybox +jkube.container-image.env.JAVA_OPTIONS=-Xmx256m +jkube.container-image.labels.MAINTAINER=JKube testing team +jkube.container-image.assembly.targetDir=/deployments +jkube.container-image.ports.1=8080 +jkube.container-image.entrypoint=java -jar /app.jar diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ImageFromPropertiesIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ImageFromPropertiesIT.java new file mode 100644 index 0000000000..0fa1bb894c --- /dev/null +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ImageFromPropertiesIT.java @@ -0,0 +1,49 @@ +/* + * 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.gradle.plugin.tests; + +import org.gradle.testkit.runner.BuildResult; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class ImageFromPropertiesIT { + @RegisterExtension + private final ITGradleRunnerExtension gradleRunner = new ITGradleRunnerExtension(); + + @Test + void k8sBuild_generatesConfiguredImage() throws IOException { + // When + final BuildResult result = gradleRunner.withITProject("image-from-properties") + .withArguments("clean", "build", "k8sBuild", "--stacktrace") + .build(); + // Then + final File dockerFile = gradleRunner.resolveFile("build", "docker", "repository", "image-from-properties", "latest", "build", "Dockerfile"); + assertThat(new String(Files.readAllBytes(dockerFile.toPath()))) + .contains("FROM quay.io/quay/busybox") + .contains("ENV JAVA_OPTIONS=-Xmx256m") + .contains("LABEL MAINTAINER=\"JKube testing team\"") + .contains("EXPOSE 8080") + .contains("COPY /jkube-generated-layer-final-artifact/deployments /deployments/") + .contains("ENTRYPOINT java -jar /app.jar"); + assertThat(result).extracting(BuildResult::getOutput).asString() + .contains("Building container image in Kubernetes mode") + .contains("JIB image build started"); + } +} diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTaskTest.java index 020cc99bea..459ae483a1 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTaskTest.java @@ -35,6 +35,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.contains; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mock; @@ -86,7 +87,7 @@ void run_withImageConfiguration_shouldPushImage() throws JKubeServiceException { // Then assertThat(dockerBuildServiceMockedConstruction.constructed()).hasSize(1); verify(dockerBuildServiceMockedConstruction.constructed().iterator().next(), times(1)) - .push(eq(extension.images), eq(0), any(), eq(false)); + .push(argThat(images -> images.iterator().next().getName().equals("foo/bar:latest")), eq(0), any(), eq(false)); } diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftPushTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftPushTaskTest.java index 46d04f4a55..74184f813c 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftPushTaskTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftPushTaskTest.java @@ -30,6 +30,7 @@ import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mockConstruction; import static org.mockito.Mockito.verify; @@ -71,7 +72,7 @@ void run_withImageConfigurationAndS2IBuildStrategy_shouldPushImage() throws JKub // Then assertThat(openshiftBuildServiceMockedConstruction.constructed()).hasSize(1); verify(openshiftBuildServiceMockedConstruction.constructed().iterator().next()) - .push(eq(extension.images), eq(0), any(), eq(false)); + .push(argThat(images -> images.iterator().next().getName().equals("foo/bar:latest")), eq(0), any(), eq(false)); } @Test diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/handler/property/PropertyConfigHandler.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/handler/property/PropertyConfigHandler.java deleted file mode 100644 index 9fad0b1dca..0000000000 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/handler/property/PropertyConfigHandler.java +++ /dev/null @@ -1,291 +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.build.api.config.handler.property; - -import org.eclipse.jkube.kit.config.image.ImageConfiguration; -import org.eclipse.jkube.kit.config.image.WatchImageConfiguration; -import org.eclipse.jkube.kit.build.api.helper.ExternalConfigHandler; -import org.eclipse.jkube.kit.common.JavaProject; -import org.eclipse.jkube.kit.common.util.EnvUtil; -import org.eclipse.jkube.kit.common.util.JKubeProjectUtil; -import org.eclipse.jkube.kit.common.util.MapUtil; -import org.eclipse.jkube.kit.common.Arguments; -import org.eclipse.jkube.kit.common.AssemblyConfiguration; -import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; -import org.eclipse.jkube.kit.config.image.build.HealthCheckConfiguration; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Properties; -import java.util.function.Function; -import java.util.function.Supplier; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.ALIAS; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.ARGS; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.ASSEMBLY_BASEDIR; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.ASSEMBLY_EXPORT_TARGET_DIR; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.ASSEMBLY_MODE; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.ASSEMBLY_PERMISSIONS; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.ASSEMBLY_TARLONGFILEMODE; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.ASSEMBLY_USER; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.BUILD_OPTIONS; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.CACHEFROM; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.CLEANUP; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.CMD; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.CONTEXT_DIR; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.DOCKER_ARCHIVE; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.DOCKER_FILE; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.ENTRYPOINT; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.ENV; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.ENV_BUILD; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.FILTER; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.FROM; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.FROM_EXT; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.HEALTHCHECK; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.HEALTHCHECK_CMD; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.HEALTHCHECK_INTERVAL; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.HEALTHCHECK_MODE; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.HEALTHCHECK_RETRIES; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.HEALTHCHECK_START_PERIOD; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.HEALTHCHECK_TIMEOUT; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.IMAGE_PULL_POLICY_BUILD; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.LABELS; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.MAINTAINER; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.NAME; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.NOCACHE; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.OPTIMISE; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.PORTS; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.RUN; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.SHELL; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.SKIP_BUILD; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.TAGS; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.USER; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.VOLUMES; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.WATCH_INTERVAL; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.WATCH_POSTEXEC; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.WATCH_POSTGOAL; -import static org.eclipse.jkube.kit.build.api.config.handler.property.ConfigKey.WORKDIR; - -/** - * @author roland - */ -public class PropertyConfigHandler implements ExternalConfigHandler { - - public static final String TYPE_NAME = "properties"; - public static final String DEFAULT_PREFIX = "docker"; - - @Override - public String getType() { - return TYPE_NAME; - } - - @Override - public List resolve(ImageConfiguration fromConfig, JavaProject project) { - Map externalConfig = fromConfig.getExternalConfig(); - String prefix = getPrefix(externalConfig); - Properties properties = JKubeProjectUtil.getPropertiesWithSystemOverrides(project); - PropertyMode propertyMode = getMode(externalConfig); - ValueProvider valueProvider = new ValueProvider(prefix, properties, propertyMode); - - BuildConfiguration build = extractBuildConfiguration(fromConfig, valueProvider, project); - WatchImageConfiguration watch = extractWatchConfig(fromConfig, valueProvider); - String name = valueProvider.getString(NAME, fromConfig.getName()); - String alias = valueProvider.getString(ALIAS, fromConfig.getAlias()); - - if (name == null) { - throw new IllegalArgumentException(String.format("Mandatory property [%s] is not defined", NAME)); - } - - return Collections.singletonList(ImageConfiguration.builder() - .name(name) - .alias(alias) - .build(build) - .watch(watch) - .build()); - } - - private static boolean isStringValueNull(ValueProvider valueProvider, BuildConfiguration config, ConfigKey key, Supplier supplier) { - return valueProvider.getString(key, config == null ? null : supplier.get()) != null; - } - - // Enable build config only when a `.from.`, or `.dockerFile.` is configured - private boolean buildConfigured(BuildConfiguration config, ValueProvider valueProvider, JavaProject project) { - - if (isStringValueNull(valueProvider, config, FROM, config::getFrom)) { - return true; - } - - if (valueProvider.getMap(FROM_EXT, config == null ? null : config.getFromExt()) != null) { - return true; - } - if (isStringValueNull(valueProvider, config, DOCKER_FILE, config::getDockerFileRaw)) { - return true; - } - if (isStringValueNull(valueProvider, config, DOCKER_ARCHIVE, config::getDockerArchiveRaw)) { - return true; - } - - if (isStringValueNull(valueProvider, config, CONTEXT_DIR, config::getContextDirRaw)) { - return true; - } - - // Simple Dockerfile mode - return new File(project.getBaseDirectory(),"Dockerfile").exists(); - } - - private static R valueOrNull(T input, Function function) { - return Optional.ofNullable(input).map(function).orElse(null); - } - - private BuildConfiguration extractBuildConfiguration(ImageConfiguration fromConfig, ValueProvider valueProvider, JavaProject project) { - BuildConfiguration config = fromConfig.getBuildConfiguration(); - if (!buildConfigured(config, valueProvider, project)) { - return null; - } - return BuildConfiguration.builder() - .cmd(extractArguments(valueProvider, CMD, valueOrNull(config, BuildConfiguration::getCmd))) - .cleanup(valueProvider.getString(CLEANUP, valueOrNull(config, BuildConfiguration::getCleanup))) - .nocache(valueProvider.getBoolean(NOCACHE, valueOrNull(config, BuildConfiguration::getNocache))) - .cacheFrom(extractCacheFrom(valueProvider.getString(CACHEFROM, config == null ? null : (config.getCacheFrom() == null ? null : config.getCacheFrom().toString())))) - .optimise(valueProvider.getBoolean(OPTIMISE, valueOrNull(config, BuildConfiguration::getOptimise))) - .entryPoint(extractArguments(valueProvider, ENTRYPOINT, valueOrNull(config, BuildConfiguration::getEntryPoint))) - .assembly(extractAssembly(valueOrNull(config, BuildConfiguration::getAssembly), valueProvider)) - .env(MapUtil.mergeMaps( - valueProvider.getMap(ENV_BUILD, valueOrNull(config, BuildConfiguration::getEnv)), - valueProvider.getMap(ENV, Collections.emptyMap()) - )) - .args(valueProvider.getMap(ARGS, valueOrNull(config, BuildConfiguration::getArgs))) - .labels(valueProvider.getMap(LABELS, valueOrNull(config, BuildConfiguration::getLabels))) - .ports(extractPortValues(valueOrNull(config, BuildConfiguration::getPorts), valueProvider)) - .shell(extractArguments(valueProvider, SHELL, valueOrNull(config, BuildConfiguration::getShell))) - .runCmds(valueProvider.getList(RUN, valueOrNull(config, BuildConfiguration::getRunCmds))) - .from(valueProvider.getString(FROM, valueOrNull(config, BuildConfiguration::getFrom))) - .fromExt(valueProvider.getMap(FROM_EXT, valueOrNull(config, BuildConfiguration::getFromExt))) - .volumes(valueProvider.getList(VOLUMES, valueOrNull(config, BuildConfiguration::getVolumes))) - .tags(valueProvider.getList(TAGS, valueOrNull(config, BuildConfiguration::getTags))) - .maintainer(valueProvider.getString(MAINTAINER, valueOrNull(config, BuildConfiguration::getMaintainer))) - .workdir(valueProvider.getString(WORKDIR, valueOrNull(config, BuildConfiguration::getWorkdir))) - .skip(valueProvider.getBoolean(SKIP_BUILD, valueOrNull(config, BuildConfiguration::getSkip))) - .imagePullPolicy(valueProvider.getString(IMAGE_PULL_POLICY_BUILD, valueOrNull(config, BuildConfiguration::getImagePullPolicy))) - .contextDir(valueProvider.getString(CONTEXT_DIR, valueOrNull(config, BuildConfiguration::getContextDirRaw))) - .dockerArchive(valueProvider.getString(DOCKER_ARCHIVE, valueOrNull(config, BuildConfiguration::getDockerArchiveRaw))) - .dockerFile(valueProvider.getString(DOCKER_FILE, valueOrNull(config, BuildConfiguration::getDockerFileRaw))) - .buildOptions(valueProvider.getMap(BUILD_OPTIONS, valueOrNull(config, BuildConfiguration::getBuildOptions))) - .filter(valueProvider.getString(FILTER, valueOrNull(config, BuildConfiguration::getFilter))) - .user(valueProvider.getString(USER, valueOrNull(config, BuildConfiguration::getUser))) - .healthCheck(extractHealthCheck(valueOrNull(config, BuildConfiguration::getHealthCheck), valueProvider)) - .build(); - } - - List extractCacheFrom(String cacheFrom, String ...more) { - if (more == null || more.length == 0) { - return Collections.singletonList(cacheFrom); - } - - return Stream.concat(Stream.of(cacheFrom), Arrays.stream(more)).collect(Collectors.toList()); - } - - private AssemblyConfiguration extractAssembly(AssemblyConfiguration config, ValueProvider valueProvider) { - return AssemblyConfiguration.builder() - .targetDir(valueProvider.getString(ASSEMBLY_BASEDIR, valueOrNull(config, AssemblyConfiguration::getTargetDir))) - .exportTargetDir(valueProvider.getBoolean(ASSEMBLY_EXPORT_TARGET_DIR, valueOrNull(config, AssemblyConfiguration::getExportTargetDir))) - .permissionsString(valueProvider.getString(ASSEMBLY_PERMISSIONS, valueOrNull(config, AssemblyConfiguration::getPermissionsRaw))) - .user(valueProvider.getString(ASSEMBLY_USER, valueOrNull(config, AssemblyConfiguration::getUser))) - .modeString(valueProvider.getString(ASSEMBLY_MODE, valueOrNull(config, AssemblyConfiguration::getModeRaw))) - .tarLongFileMode(valueProvider.getString(ASSEMBLY_TARLONGFILEMODE, valueOrNull(config, AssemblyConfiguration::getTarLongFileMode))) - .build(); - } - - private HealthCheckConfiguration extractHealthCheck(HealthCheckConfiguration config, ValueProvider valueProvider) { - Map healthCheckProperties = valueProvider.getMap(HEALTHCHECK, Collections.emptyMap()); - if (healthCheckProperties != null && healthCheckProperties.size() > 0) { - return HealthCheckConfiguration.builder() - .interval(valueProvider.getString(HEALTHCHECK_INTERVAL, valueOrNull(config, HealthCheckConfiguration::getInterval))) - .timeout(valueProvider.getString(HEALTHCHECK_TIMEOUT, valueOrNull(config, HealthCheckConfiguration::getTimeout))) - .startPeriod(valueProvider.getString(HEALTHCHECK_START_PERIOD, valueOrNull(config, HealthCheckConfiguration::getStartPeriod))) - .retries(valueProvider.getInteger(HEALTHCHECK_RETRIES, valueOrNull(config, HealthCheckConfiguration::getRetries))) - .modeString(valueProvider.getString(HEALTHCHECK_MODE, config == null || config.getMode() == null ? null : config.getMode().name())) - .cmd(extractArguments(valueProvider, HEALTHCHECK_CMD, valueOrNull(config, HealthCheckConfiguration::getCmd))) - .build(); - } else { - return config; - } - } - - // Extract only the values of the port mapping - - private List extractPortValues(List config, ValueProvider valueProvider) { - List ret = new ArrayList<>(); - List ports = valueProvider.getList(PORTS, config); - if (ports == null) { - return null; - } - List parsedPorts = EnvUtil.splitOnLastColon(ports); - for (String[] port : parsedPorts) { - ret.add(port[1]); - } - return ret; - } - - private Arguments extractArguments(ValueProvider valueProvider, ConfigKey configKey, Arguments alternative) { - return valueProvider.getObject(configKey, alternative, raw -> raw != null ? Arguments.builder().shell(raw).build() : null); - } - - private WatchImageConfiguration extractWatchConfig(ImageConfiguration fromConfig, ValueProvider valueProvider) { - WatchImageConfiguration config = fromConfig.getWatchConfiguration(); - - return WatchImageConfiguration.builder() - .interval(valueProvider.getInteger(WATCH_INTERVAL, config == null ? null : config.getIntervalRaw())) - .postGoal(valueProvider.getString(WATCH_POSTGOAL, config == null ? null : config.getPostGoal())) - .postExec(valueProvider.getString(WATCH_POSTEXEC, config == null ? null : config.getPostExec())) - .modeString(valueProvider.getString(WATCH_POSTGOAL, config == null || config.getMode() == null ? null : config.getMode().name())) - .build(); - } - - - private static String getPrefix(Map externalConfig) { - String prefix = externalConfig.get("prefix"); - if (prefix == null) { - prefix = DEFAULT_PREFIX; - } - return prefix; - } - - private static PropertyMode getMode(Map externalConfig) { - return PropertyMode.parse(externalConfig.get("mode")); - } - - public static boolean canCoexistWithOtherPropertyConfiguredImages(Map externalConfig) { - if(externalConfig == null || externalConfig.isEmpty()) { - return false; - } - - if(!TYPE_NAME.equals(externalConfig.get("type"))) - { - // This images loads config from something totally different - return true; - } - - // This image has a specified prefix. If multiple images have explicitly set docker. as prefix we - // assume user know what they are doing and allow it. - return externalConfig.get("prefix") != null; - } -} diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/handler/property/ConfigKey.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/ConfigKey.java similarity index 55% rename from jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/handler/property/ConfigKey.java rename to jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/ConfigKey.java index e32f65725e..ad0d3853e6 100644 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/handler/property/ConfigKey.java +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/ConfigKey.java @@ -11,7 +11,7 @@ * Contributors: * Red Hat, Inc. - initial API and implementation */ -package org.eclipse.jkube.kit.build.api.config.handler.property; +package org.eclipse.jkube.kit.build.api.config.property; /** @@ -22,41 +22,26 @@ public enum ConfigKey { ALIAS, - ARGS(ValueCombinePolicy.Merge), - ASSEMBLY_BASEDIR("assembly.baseDir"), + ARGS(ValueCombinePolicy.MERGE), + ASSEMBLY_TARGET_DIR("assembly.targetDir"), ASSEMBLY_EXPORT_TARGET_DIR("assembly.exportTargetDir"), ASSEMBLY_PERMISSIONS("assembly.permissions"), ASSEMBLY_USER("assembly.user"), ASSEMBLY_MODE("assembly.mode"), ASSEMBLY_TARLONGFILEMODE("assembly.tarLongFileMode"), - AUTO_REMOVE, - BIND, BUILD_OPTIONS, - CAP_ADD, - CAP_DROP, CLEANUP, - CONTAINER_NAME_PATTERN, - CPUSHARES, - CPUS, - CPUSET, NOCACHE, CACHEFROM, OPTIMISE, CMD, CONTEXT_DIR, - DEPENDS_ON, - DOMAINNAME, - DNS, - DNS_SEARCH, DOCKER_ARCHIVE, DOCKER_FILE, ENTRYPOINT, ENV, - ENV_PROPERTY_FILE, - ENV_BUILD("envBuild", ValueCombinePolicy.Merge), - ENV_RUN("envRun", ValueCombinePolicy.Merge), - EXPOSED_PROPERTY_KEY, - EXTRA_HOSTS, + ENV_BUILD("envBuild", ValueCombinePolicy.MERGE), + ENV_RUN("envRun", ValueCombinePolicy.MERGE), FILTER, FROM, FROM_EXT, @@ -67,74 +52,30 @@ public enum ConfigKey { HEALTHCHECK_START_PERIOD("healthcheck.startPeriod"), HEALTHCHECK_RETRIES("healthcheck.retries"), HEALTHCHECK_CMD("healthcheck.cmd"), - HOSTNAME, - IMAGE_PULL_POLICY_BUILD("imagePullPolicy.build"), - IMAGE_PULL_POLICY_RUN("imagePullPolicy.run"), - LABELS(ValueCombinePolicy.Merge), - LINKS, - LOG_ENABLED("log.enabled"), - LOG_PREFIX("log.prefix"), - LOG_DATE("log.date"), - LOG_FILE("log.file"), - LOG_COLOR("log.color"), - LOG_DRIVER_NAME("log.driver.name"), - LOG_DRIVER_OPTS("log.driver.opts"), + IMAGE_PULL_POLICY, + LABELS(ValueCombinePolicy.MERGE), MAINTAINER, - MEMORY, - MEMORY_SWAP, NAME, - NET, - NETWORK_MODE("network.mode"), - NETWORK_NAME("network.name"), - NETWORK_ALIAS("network.alias"), - PORT_PROPERTY_FILE, - PORTS(ValueCombinePolicy.Merge), - PRIVILEGED, - READ_ONLY, + PORTS(ValueCombinePolicy.MERGE), REGISTRY, - RESTART_POLICY_NAME("restartPolicy.name"), - RESTART_POLICY_RETRY("restartPolicy.retry"), SHELL, RUN, - SECURITY_OPTS, - SHMSIZE, - SKIP_BUILD("skip.build"), - SKIP_RUN("skip.run"), - TAGS(ValueCombinePolicy.Merge), - TMPFS, - ULIMITS, + SKIP, + TAGS(ValueCombinePolicy.MERGE), USER, VOLUMES, - VOLUMES_FROM, - WAIT_LOG("wait.log"), - WAIT_TIME("wait.time"), - WAIT_HEALTHY("wait.healthy"), - WAIT_URL("wait.url"), - WAIT_HTTP_URL("wait.http.url"), - WAIT_HTTP_METHOD("wait.http.method"), - WAIT_HTTP_STATUS("wait.http.status"), - WAIT_KILL("wait.kill"), - WAIT_EXEC_POST_START("wait.exec.postStart"), - WAIT_EXEC_PRE_STOP("wait.exec.preStop"), - WAIT_EXEC_BREAK_ON_ERROR("wait.exec.breakOnError"), - WAIT_EXIT("wait.exit"), - WAIT_SHUTDOWN("wait.shutdown"), - WAIT_TCP_MODE("wait.tcp.mode"), - WAIT_TCP_HOST("wait.tcp.host"), - WAIT_TCP_PORT("wait.tcp.port"), WATCH_INTERVAL("watch.interval"), WATCH_MODE("watch.mode"), WATCH_POSTGOAL("watch.postGoal"), WATCH_POSTEXEC("watch.postExec"), - WORKDIR, - WORKING_DIR; + WORKDIR; ConfigKey() { - this(ValueCombinePolicy.Replace); + this(ValueCombinePolicy.REPLACE); } ConfigKey(String key) { - this(key, ValueCombinePolicy.Replace); + this(key, ValueCombinePolicy.REPLACE); } ConfigKey(ValueCombinePolicy valueCombinePolicy) { diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolver.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolver.java new file mode 100644 index 0000000000..5176a91618 --- /dev/null +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolver.java @@ -0,0 +1,162 @@ +/* + * 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.build.api.config.property; + +import org.apache.commons.lang3.StringUtils; +import org.eclipse.jkube.kit.config.image.ImageConfiguration; +import org.eclipse.jkube.kit.config.image.WatchImageConfiguration; +import org.eclipse.jkube.kit.common.JavaProject; +import org.eclipse.jkube.kit.common.util.EnvUtil; +import org.eclipse.jkube.kit.common.util.JKubeProjectUtil; +import org.eclipse.jkube.kit.common.util.MapUtil; +import org.eclipse.jkube.kit.common.Arguments; +import org.eclipse.jkube.kit.common.AssemblyConfiguration; +import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; +import org.eclipse.jkube.kit.config.image.build.HealthCheckConfiguration; + +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Properties; +import java.util.Set; +import java.util.function.Function; + +public class PropertyConfigResolver { + + private static final String DEFAULT_PREFIX = "jkube.container-image"; + // The ValueProvider class has more functionality than the one used by the PropertyConfigResolver class. + // Let's add some default values so that we can conserve the ValueProvider as is and still leverage its functionality. + private static final PropertyMode DEFAULT_MODE = PropertyMode.OVERRIDE; + + public final ImageConfiguration resolve(ImageConfiguration fromConfig, JavaProject project) { + final Properties properties = JKubeProjectUtil.getPropertiesWithSystemOverrides(project); + final String prefix = StringUtils.isBlank(fromConfig.getPropertyResolverPrefix()) ? + DEFAULT_PREFIX : fromConfig.getPropertyResolverPrefix(); + final ValueProvider valueProvider = new ValueProvider(prefix, properties, DEFAULT_MODE); + return ImageConfiguration.builder() + .name(valueProvider.getString(ConfigKey.NAME, fromConfig.getName())) + .alias(valueProvider.getString(ConfigKey.ALIAS, fromConfig.getAlias())) + .build(extractBuildConfiguration(fromConfig, valueProvider)) + .watch(extractWatchConfig(fromConfig, valueProvider)) + .build(); + } + + private static R valueOr(T input, Function function, R defaultValue) { + return Optional.ofNullable(input).map(function).orElse(defaultValue); + } + + private static R valueOrNull(T input, Function function) { + return valueOr(input, function, null); + } + + private BuildConfiguration extractBuildConfiguration(ImageConfiguration fromConfig, ValueProvider valueProvider) { + final BuildConfiguration config = fromConfig.getBuild() != null ? + fromConfig.getBuild() : new BuildConfiguration(); + return config.toBuilder() + .cmd(extractArguments(valueProvider, ConfigKey.CMD, valueOrNull(config, BuildConfiguration::getCmd))) + .cleanup(valueProvider.getString(ConfigKey.CLEANUP, valueOrNull(config, BuildConfiguration::getCleanup))) + .nocache(valueProvider.getBoolean(ConfigKey.NOCACHE, valueOrNull(config, BuildConfiguration::getNocache))) + .clearCacheFrom().cacheFrom(valueProvider.getList(ConfigKey.CACHEFROM, valueOr(config, BuildConfiguration::getCacheFrom, Collections.emptyList()))) + .optimise(valueProvider.getBoolean(ConfigKey.OPTIMISE, valueOrNull(config, BuildConfiguration::getOptimise))) + .entryPoint(extractArguments(valueProvider, ConfigKey.ENTRYPOINT, valueOrNull(config, BuildConfiguration::getEntryPoint))) + .assembly(extractAssembly(valueOrNull(config, BuildConfiguration::getAssembly), valueProvider)) + .env(MapUtil.mergeMaps( + valueProvider.getMap(ConfigKey.ENV_BUILD, Collections.emptyMap()), + valueProvider.getMap(ConfigKey.ENV, valueOrNull(config, BuildConfiguration::getEnv)) + )) + .args(valueProvider.getMap(ConfigKey.ARGS, valueOr(config, BuildConfiguration::getArgs, Collections.emptyMap()))) + .labels(valueProvider.getMap(ConfigKey.LABELS, valueOr(config, BuildConfiguration::getLabels, Collections.emptyMap()))) + .clearPorts().ports(extractPortValues(valueOr(config, BuildConfiguration::getPorts, Collections.emptyList()), valueProvider)) + .shell(extractArguments(valueProvider, ConfigKey.SHELL, valueOrNull(config, BuildConfiguration::getShell))) + .clearRunCmds().runCmds(valueProvider.getList(ConfigKey.RUN, valueOr(config, BuildConfiguration::getRunCmds, Collections.emptyList()))) + .from(valueProvider.getString(ConfigKey.FROM, valueOrNull(config, BuildConfiguration::getFrom))) + .fromExt(valueProvider.getMap(ConfigKey.FROM_EXT, valueOrNull(config, BuildConfiguration::getFromExt))) + .clearVolumes().volumes(valueProvider.getList(ConfigKey.VOLUMES, valueOr(config, BuildConfiguration::getVolumes, Collections.emptyList()))) + .clearTags().tags(valueProvider.getList(ConfigKey.TAGS, valueOr(config, BuildConfiguration::getTags, Collections.emptyList()))) + .maintainer(valueProvider.getString(ConfigKey.MAINTAINER, valueOrNull(config, BuildConfiguration::getMaintainer))) + .workdir(valueProvider.getString(ConfigKey.WORKDIR, valueOrNull(config, BuildConfiguration::getWorkdir))) + .skip(valueProvider.getBoolean(ConfigKey.SKIP, valueOrNull(config, BuildConfiguration::getSkip))) + .imagePullPolicy(valueProvider.getString(ConfigKey.IMAGE_PULL_POLICY, valueOrNull(config, BuildConfiguration::getImagePullPolicy))) + .contextDir(valueProvider.getString(ConfigKey.CONTEXT_DIR, valueOrNull(config, BuildConfiguration::getContextDirRaw))) + .dockerArchive(valueProvider.getString(ConfigKey.DOCKER_ARCHIVE, valueOrNull(config, BuildConfiguration::getDockerArchiveRaw))) + .dockerFile(valueProvider.getString(ConfigKey.DOCKER_FILE, valueOrNull(config, BuildConfiguration::getDockerFileRaw))) + .buildOptions(valueProvider.getMap(ConfigKey.BUILD_OPTIONS, valueOrNull(config, BuildConfiguration::getBuildOptions))) + .filter(valueProvider.getString(ConfigKey.FILTER, valueOrNull(config, BuildConfiguration::getFilter))) + .user(valueProvider.getString(ConfigKey.USER, valueOrNull(config, BuildConfiguration::getUser))) + .healthCheck(extractHealthCheck(valueOrNull(config, BuildConfiguration::getHealthCheck), valueProvider)) + .build(); + } + + private AssemblyConfiguration extractAssembly(AssemblyConfiguration originalConfig, ValueProvider valueProvider) { + final AssemblyConfiguration config = originalConfig != null ? originalConfig : new AssemblyConfiguration(); + return config.toBuilder() + .targetDir(valueProvider.getString(ConfigKey.ASSEMBLY_TARGET_DIR, valueOrNull(originalConfig, AssemblyConfiguration::getTargetDir))) + .exportTargetDir(valueProvider.getBoolean(ConfigKey.ASSEMBLY_EXPORT_TARGET_DIR, valueOrNull(originalConfig, AssemblyConfiguration::getExportTargetDir))) + .permissionsString(valueProvider.getString(ConfigKey.ASSEMBLY_PERMISSIONS, valueOrNull(originalConfig, AssemblyConfiguration::getPermissionsRaw))) + .user(valueProvider.getString(ConfigKey.ASSEMBLY_USER, valueOrNull(originalConfig, AssemblyConfiguration::getUser))) + .modeString(valueProvider.getString(ConfigKey.ASSEMBLY_MODE, valueOrNull(originalConfig, AssemblyConfiguration::getModeRaw))) + .tarLongFileMode(valueProvider.getString(ConfigKey.ASSEMBLY_TARLONGFILEMODE, valueOrNull(originalConfig, AssemblyConfiguration::getTarLongFileMode))) + .build(); + } + + private HealthCheckConfiguration extractHealthCheck(HealthCheckConfiguration originalConfig, ValueProvider valueProvider) { + final Map healthCheckProperties = valueProvider.getMap(ConfigKey.HEALTHCHECK, Collections.emptyMap()); + if (healthCheckProperties != null && !healthCheckProperties.isEmpty()) { + final HealthCheckConfiguration config = originalConfig != null ? originalConfig : new HealthCheckConfiguration(); + return config.toBuilder() + .interval(valueProvider.getString(ConfigKey.HEALTHCHECK_INTERVAL, valueOrNull(originalConfig, HealthCheckConfiguration::getInterval))) + .timeout(valueProvider.getString(ConfigKey.HEALTHCHECK_TIMEOUT, valueOrNull(originalConfig, HealthCheckConfiguration::getTimeout))) + .startPeriod(valueProvider.getString(ConfigKey.HEALTHCHECK_START_PERIOD, valueOrNull(originalConfig, HealthCheckConfiguration::getStartPeriod))) + .retries(valueProvider.getInteger(ConfigKey.HEALTHCHECK_RETRIES, valueOrNull(originalConfig, HealthCheckConfiguration::getRetries))) + .modeString(valueProvider.getString(ConfigKey.HEALTHCHECK_MODE, originalConfig == null || originalConfig.getMode() == null ? null : originalConfig.getMode().name())) + .cmd(extractArguments(valueProvider, ConfigKey.HEALTHCHECK_CMD, valueOrNull(originalConfig, HealthCheckConfiguration::getCmd))) + .build(); + } else { + return originalConfig; + } + } + + // Extract only the values of the port mapping + + private Set extractPortValues(List config, ValueProvider valueProvider) { + final Set ret = new LinkedHashSet<>(); + final List ports = valueProvider.getList(ConfigKey.PORTS, config); + if (ports == null) { + return null; + } + final List parsedPorts = EnvUtil.splitOnLastColon(ports); + for (String[] port : parsedPorts) { + ret.add(port[1]); + } + return ret; + } + + private Arguments extractArguments(ValueProvider valueProvider, ConfigKey configKey, Arguments alternative) { + return valueProvider.getObject(configKey, alternative, raw -> raw != null ? Arguments.builder().shell(raw).build() : null); + } + + private WatchImageConfiguration extractWatchConfig(ImageConfiguration fromConfig, ValueProvider valueProvider) { + final WatchImageConfiguration config = fromConfig.getWatchConfiguration() != null ? + fromConfig.getWatchConfiguration() : new WatchImageConfiguration(); + return config.toBuilder() + .interval(valueProvider.getInteger(ConfigKey.WATCH_INTERVAL, config.getIntervalRaw())) + .postGoal(valueProvider.getString(ConfigKey.WATCH_POSTGOAL, config.getPostGoal())) + .postExec(valueProvider.getString(ConfigKey.WATCH_POSTEXEC, config.getPostExec())) + .modeString(valueProvider.getString(ConfigKey.WATCH_MODE, config.getMode() == null ? null : config.getMode().name())) + .build(); + } + +} diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/handler/property/PropertyMode.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/PropertyMode.java similarity index 78% rename from jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/handler/property/PropertyMode.java rename to jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/PropertyMode.java index cabaa7be6a..4cfb8f5ec8 100644 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/handler/property/PropertyMode.java +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/PropertyMode.java @@ -11,20 +11,20 @@ * Contributors: * Red Hat, Inc. - initial API and implementation */ -package org.eclipse.jkube.kit.build.api.config.handler.property; +package org.eclipse.jkube.kit.build.api.config.property; /** - * Identifies how the {@link PropertyConfigHandler} should treat properties vs configuration + * Identifies how the {@link PropertyConfigResolver} should treat properties vs configuration * from POM file in the {@link ValueProvider}. * * @author Johan Ström */ -public enum PropertyMode { - Only, - Override, - Fallback, - Skip; +enum PropertyMode { + ONLY, + OVERRIDE, + FALLBACK, + SKIP; /** * Given String, parse to a valid property mode. @@ -36,7 +36,7 @@ public enum PropertyMode { */ static PropertyMode parse(String name) { if(name == null) { - return PropertyMode.Only; + return PropertyMode.ONLY; } name = name.toLowerCase(); diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/handler/property/ValueCombinePolicy.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/ValueCombinePolicy.java similarity index 87% rename from jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/handler/property/ValueCombinePolicy.java rename to jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/ValueCombinePolicy.java index f1586fa898..47e4621df0 100644 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/handler/property/ValueCombinePolicy.java +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/ValueCombinePolicy.java @@ -11,23 +11,23 @@ * Contributors: * Red Hat, Inc. - initial API and implementation */ -package org.eclipse.jkube.kit.build.api.config.handler.property; +package org.eclipse.jkube.kit.build.api.config.property; import org.apache.commons.lang3.StringUtils; /** - * Dictates how to combine values from different sources. See {@link PropertyConfigHandler} for details. + * Dictates how to combine values from different sources. See {@link PropertyConfigResolver} for details. */ -public enum ValueCombinePolicy { +enum ValueCombinePolicy { /** * The prioritized value fully replaces any other values. */ - Replace, + REPLACE, /** * All provided values are merged. This only makes sense for complex types such as lists and maps. */ - Merge; + MERGE; public static ValueCombinePolicy fromString(String valueCombinePolicy) { for (ValueCombinePolicy policy : values()) { diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/handler/property/ValueProvider.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/ValueProvider.java similarity index 88% rename from jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/handler/property/ValueProvider.java rename to jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/ValueProvider.java index 3a88e85c1b..8b5823cdef 100644 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/handler/property/ValueProvider.java +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/ValueProvider.java @@ -11,12 +11,13 @@ * Contributors: * Red Hat, Inc. - initial API and implementation */ -package org.eclipse.jkube.kit.build.api.config.handler.property; +package org.eclipse.jkube.kit.build.api.config.property; import org.eclipse.jkube.kit.common.util.EnvUtil; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Properties; @@ -32,36 +33,36 @@ * Obtaining a value is done via data-type specific methods (such as {@link #getString}). The ConfigKey parameter * tells us which property to look for, and how to handle combination of multiple values. * - * For {@link PropertyMode#Only} we only look at the properties, ignoring any config value. - * For {@link PropertyMode#Skip} we only look at the config, ignoring any properties value. - * For {@link PropertyMode#Override} we use the property value if it is non-null, else the config value. - * For {@link PropertyMode#Fallback} we use the config value if it is non-null, else the property value. + * For {@link PropertyMode#ONLY} we only look at the properties, ignoring any config value. + * For {@link PropertyMode#SKIP} we only look at the config, ignoring any properties value. + * For {@link PropertyMode#OVERRIDE} we use the property value if it is non-null, else the config value. + * For {@link PropertyMode#FALLBACK} we use the config value if it is non-null, else the property value. * * For Override and Fallback mode, merging may take place as dictated by the {@link ValueCombinePolicy} * defined in the {@link ConfigKey}, or as overriden by the property <prefix.someproperty>._combine * ({@link EnvUtil#PROPERTY_COMBINE_POLICY_SUFFIX}). * - * If {@link ValueCombinePolicy#Replace} is used, only the prioritized value (first non-null) is used. - * If {@link ValueCombinePolicy#Merge} is used, the merge method depends on the data type. + * If {@link ValueCombinePolicy#REPLACE} is used, only the prioritized value (first non-null) is used. + * If {@link ValueCombinePolicy#MERGE} is used, the merge method depends on the data type. * For simple types (string, int, long, boolean) this is not supported and will throw exception. * For Lists, the non-null values will be appended to each other (with values from first source added first) * For Maps, all maps are merged into one map, with data from the first map taking precedence. * * * @author Johan Ström */ -public class ValueProvider { - private String prefix; - private Properties properties; - private PropertyMode propertyMode; - - private StringListValueExtractor stringListValueExtractor; - private IntListValueExtractor intListValueExtractor; - private MapValueExtractor mapValueExtractor; - private StringValueExtractor stringValueExtractor; - private IntValueExtractor intValueExtractor; - private LongValueExtractor longValueExtractor; - private BooleanValueExtractor booleanValueExtractor; - private DoubleValueExtractor doubleValueExtractor; +class ValueProvider { + private final String prefix; + private final Properties properties; + private final PropertyMode propertyMode; + + private final StringListValueExtractor stringListValueExtractor; + private final IntListValueExtractor intListValueExtractor; + private final MapValueExtractor mapValueExtractor; + private final StringValueExtractor stringValueExtractor; + private final IntValueExtractor intValueExtractor; + private final LongValueExtractor longValueExtractor; + private final BooleanValueExtractor booleanValueExtractor; + private final DoubleValueExtractor doubleValueExtractor; /** * Initiates ValueProvider which is to work with data from the given properties. @@ -139,14 +140,14 @@ protected T withPrefix(String prefix, ConfigKey key, Properties properties) { } /** - * Helper base class for picking values out of the the Properties class and/or config value. + * Helper base class for picking values out of the Properties class and/or config value. * * If there is only one source defined, we only use that. If multiple source are defined, the first one get's priority. * If more than one value is specified, a merge policy as specified for the ConfigKey */ private abstract class ValueExtractor { T getFromPreferredSource(String prefix, ConfigKey key, T fromConfig) { - if(propertyMode == PropertyMode.Skip) { + if(propertyMode == PropertyMode.SKIP) { return fromConfig; } @@ -161,9 +162,9 @@ T getFromPreferredSource(String prefix, ConfigKey key, T fromConfig) { } switch (propertyMode) { - case Only: + case ONLY: return fromProperty; - case Override: + case OVERRIDE: if(fromProperty != null) { values.add(fromProperty); } @@ -171,7 +172,7 @@ T getFromPreferredSource(String prefix, ConfigKey key, T fromConfig) { values.add(fromConfig); } break; - case Fallback: + case FALLBACK: if(fromConfig != null) { values.add(fromConfig); } @@ -196,9 +197,9 @@ T getFromPreferredSource(String prefix, ConfigKey key, T fromConfig) { } switch(combinePolicy) { - case Replace: + case REPLACE: return values.get(0); - case Merge: + case MERGE: return merge(key, values); } return null; @@ -312,16 +313,12 @@ protected Map withPrefix(String prefix, ConfigKey key, Propertie @Override protected Map merge(ConfigKey key, List> values) { - Map merged = null; + final Map merged = new LinkedHashMap<>(); // Iterate in reverse, the first entry in values has highest priority for(int i = values.size() - 1; i >= 0; i--) { Map value = values.get(i); - if(merged == null) { - merged = value; - } else { - merged.putAll(value); - } + merged.putAll(value); } return merged; } diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelper.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelper.java deleted file mode 100644 index 63cea69f00..0000000000 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelper.java +++ /dev/null @@ -1,88 +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.build.api.helper; - -import org.eclipse.jkube.kit.build.api.config.handler.property.PropertyConfigHandler; -import org.eclipse.jkube.kit.build.api.config.handler.property.PropertyMode; -import org.eclipse.jkube.kit.config.image.ImageConfiguration; -import org.eclipse.jkube.kit.common.JavaProject; -import org.eclipse.jkube.kit.common.util.JKubeProjectUtil; - -import java.util.List; -import java.util.Properties; - -/** - * Utility class which helps in resolving, customizing, initializing and validating - * image configuration. - * - * @author roland - */ -public class ConfigHelper { - // Property which can be set to activate externalConfiguration through properties. - // Only works for single image project. - public static final String EXTERNALCONFIG_ACTIVATION_PROPERTY = "docker.imagePropertyConfiguration"; - - private ConfigHelper() {} - - public static void validateExternalPropertyActivation(JavaProject project, List images) { - String prop = getExternalConfigActivationProperty(project); - if(prop == null) { - return; - } - - if(images.size() == 1) { - return; - } - - // With more than one image, externally activating propertyConfig get's tricky. We can only allow it to affect - // one single image. Go through each image and check if they will be controlled by default properties. - // If more than one image matches, fail. - int imagesWithoutExternalConfig = 0; - for (ImageConfiguration image : images) { - if(PropertyConfigHandler.canCoexistWithOtherPropertyConfiguredImages(image.getExternalConfig())) { - continue; - } - - // else, it will be affected by the external property. - imagesWithoutExternalConfig++; - } - - if(imagesWithoutExternalConfig > 1) { - throw new IllegalStateException("Configuration error: Cannot use property "+EXTERNALCONFIG_ACTIVATION_PROPERTY+" on projects with multiple images without explicit image external configuration."); - } - } - - public static String getExternalConfigActivationProperty(JavaProject project) { - Properties properties = JKubeProjectUtil.getPropertiesWithSystemOverrides(project); - String value = properties.getProperty(EXTERNALCONFIG_ACTIVATION_PROPERTY); - - // This can be used to disable in a more "local" context, if set globally - if(PropertyMode.Skip.name().equalsIgnoreCase(value)) { - return null; - } - - return value; - } - - // =========================================================================================================== - - /** - * Format an image name by replacing certain placeholders - */ - public interface NameFormatter { - String format(String name); - } - - -} diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ExternalConfigHandler.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ExternalConfigHandler.java deleted file mode 100644 index 23f7ba0329..0000000000 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ExternalConfigHandler.java +++ /dev/null @@ -1,47 +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.build.api.helper; - -import java.util.List; - -import org.eclipse.jkube.kit.config.image.ImageConfiguration; -import org.eclipse.jkube.kit.common.JavaProject; - -/** - * Interface which needs to be implemented to create - * image configurations from external sources - * - * @author roland - * @since 18/11/14 - */ -public interface ExternalConfigHandler { - - /** - * Get the unique type of this plugin as referenced with the <type> tag within a - * <reference> configuration section - * - * @return plugin type - */ - String getType(); - - /** - * For the given plugin configuration (which also contains the type) extract one or more - * {@link ImageConfiguration} objects describing the image to manage - * - * @param unresolvedConfig the original, unresolved config - * @param project project - * @return list of image configuration. Must not be null but can be empty. - */ - List resolve(ImageConfiguration unresolvedConfig, JavaProject project); -} diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ImageConfigResolver.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ImageConfigResolver.java deleted file mode 100644 index 21906be1a8..0000000000 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ImageConfigResolver.java +++ /dev/null @@ -1,110 +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.build.api.helper; - -import java.util.*; - -import org.eclipse.jkube.kit.config.image.ImageConfiguration; -import org.eclipse.jkube.kit.common.JavaProject; -import org.eclipse.jkube.kit.common.KitLogger; - -/** - * Manager holding all config handlers for external configuration - * - * @author roland - * @since 18/11/14 - */ - -public class ImageConfigResolver { - // Map type to handler - private Map registry; - - // No List injection possible currently with Plexus. - // Strangely, only the first element is injected in the list. - // So the elements are injected via scalar field injection and collected later. - // Very ugly, but I dont see any other solution until Plexus is fixed. - - private ExternalConfigHandler propertyConfigHandler; - - private ExternalConfigHandler dockerComposeConfigHandler; - - private KitLogger log; - - public void initialize() { - this.registry = new HashMap<>(); - for (ExternalConfigHandler handler : new ExternalConfigHandler[] { propertyConfigHandler, dockerComposeConfigHandler }) { - if (handler != null) { - registry.put(handler.getType(), handler); - } - } - } - - public void setLog(KitLogger log) { - this.log = log; - } - - /** - * Resolve an image configuration. If it contains a reference to an external configuration - * the corresponding resolver is called and the resolved image configurations are returned (can - * be multiple). - * - * If no reference to an external configuration is found, the original configuration - * is returned directly. - * - * @param unresolvedConfig the configuration to resolve - * @param project project used for resolving - * @return list of resolved image configurations - * or when the type is not known (i.e. no handler is registered for this type). - */ - public List resolve(ImageConfiguration unresolvedConfig, JavaProject project) { - injectExternalConfigActivation(unresolvedConfig, project); - Map externalConfig = unresolvedConfig.getExternalConfig(); - if (externalConfig != null) { - String type = externalConfig.get("type"); - if (type == null) { - throw new IllegalArgumentException(unresolvedConfig.getDescription() + ": No config type given"); - } - ExternalConfigHandler handler = registry.get(type); - if (handler == null) { - throw new IllegalArgumentException(unresolvedConfig.getDescription() + ": No handler for type " + type + " given"); - } - return handler.resolve(unresolvedConfig, project); - } else { - return Collections.singletonList(unresolvedConfig); - } - } - - private void injectExternalConfigActivation(ImageConfiguration unresolvedConfig, JavaProject project) { - // Allow external activation of property configuration - String mode = ConfigHelper.getExternalConfigActivationProperty(project); - - if(mode == null) { - return; - } - - Map externalConfig = unresolvedConfig.getExternalConfig(); - if(externalConfig == null) { - externalConfig = new HashMap<>(); - externalConfig.put("type", propertyConfigHandler.getType()); - externalConfig.put("mode", mode); - unresolvedConfig.setExternalConfiguration(externalConfig); - - log.verbose("Global %s=%s property activates property configuration for image", ConfigHelper.EXTERNALCONFIG_ACTIVATION_PROPERTY, mode); - } - else - { - log.verbose("Ignoring %s=%s property, image has in POM which takes precedence", ConfigHelper.EXTERNALCONFIG_ACTIVATION_PROPERTY, mode); - } - } -} diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ImageNameFormatter.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ImageNameFormatter.java index 0ee2134d9a..d050cce163 100644 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ImageNameFormatter.java +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/ImageNameFormatter.java @@ -31,7 +31,7 @@ * @author roland * @since 07/06/16 */ -public class ImageNameFormatter implements ConfigHelper.NameFormatter { +public class ImageNameFormatter implements NameFormatter { /** * Property to lookup for image user which overwrites the calculated default (group). diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/NameFormatter.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/NameFormatter.java new file mode 100644 index 0000000000..f6d21a1319 --- /dev/null +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/helper/NameFormatter.java @@ -0,0 +1,21 @@ +/* + * 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.build.api.helper; + +/** + * Format an image name by replacing certain placeholders + */ +public interface NameFormatter { + String format(String name); +} diff --git a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/handler/property/PropertyConfigHandlerTest.java b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/handler/property/PropertyConfigHandlerTest.java deleted file mode 100644 index 8046a29352..0000000000 --- a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/handler/property/PropertyConfigHandlerTest.java +++ /dev/null @@ -1,597 +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.build.api.config.handler.property; - -import java.io.File; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import org.assertj.core.api.InstanceOfAssertFactories; -import org.eclipse.jkube.kit.common.JavaProject; -import org.eclipse.jkube.kit.config.image.ImageConfiguration; -import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; -import org.eclipse.jkube.kit.config.image.build.CleanupMode; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; -import static org.assertj.core.api.Assertions.entry; -import static org.eclipse.jkube.kit.config.image.build.BuildConfiguration.DEFAULT_CLEANUP; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; - -/** - * @author roland - * @since 05/12/14 - */ - -class PropertyConfigHandlerTest { - private JavaProject javaProject; - - private PropertyConfigHandler configHandler; - - private ImageConfiguration imageConfiguration; - - @BeforeEach - void setUp() { - javaProject = mock(JavaProject.class); - configHandler = new PropertyConfigHandler(); - imageConfiguration = buildAnUnresolvedImage(); - } - - @Test - void testSkipBuild() { - assertThat(resolveExternalImageConfig(getSkipTestData(ConfigKey.SKIP_BUILD, false)).getBuildConfiguration().getSkip()).isFalse(); - assertThat(resolveExternalImageConfig(getSkipTestData(ConfigKey.SKIP_BUILD, true)).getBuildConfiguration().getSkip()).isTrue(); - - assertThat(resolveExternalImageConfig(mergeArrays(getBaseTestData(), new String[] {k(ConfigKey.NAME), "image", k(ConfigKey.FROM), "busybox"})).getBuildConfiguration().getSkip()).isFalse(); - } - - @Test - void testType() { - assertThat(configHandler.getType()).isNotNull(); - } - - @Test - void testPortsFromConfigAndProperties() { - imageConfiguration = ImageConfiguration.builder() - .external(new HashMap<>()) - .build(BuildConfiguration.builder() - .ports(Collections.singletonList("1234")) - .addCacheFrom("foo/bar:latest") - .build() - ) - .build(); - - makeExternalConfigUse(); - - List configs = resolveImage( - imageConfiguration,props( - "docker.name","demo", - "docker.ports.1", "9090", - "docker.ports.2", "0.0.0.0:80:80", - "docker.from", "busybox" - )); - assertThat(configs).singleElement() - .satisfies(config -> assertThat(config) - .extracting(ImageConfiguration::getBuildConfiguration) - .extracting(BuildConfiguration::getPorts) - .asList() - .containsExactly("9090", "80", "1234")); - } - - @Test - void testInvalidPropertyMode() { - makeExternalConfigUse(); - imageConfiguration.getExternalConfig().put("mode", "invalid"); - assertThatIllegalArgumentException() - .isThrownBy(() -> resolveImage(imageConfiguration, props())); - } - - @Test - void testRunCommands() { - List configs = resolveImage( - imageConfiguration,props(mergeArrays(getBaseTestData(), new String[] { - "docker.from", "base", - "docker.name","demo", - "docker.run.1", "foo", - "docker.run.2", "bar", - "docker.run.3", "wibble"}) - )); - - assertThat(configs).singleElement() - .extracting(ImageConfiguration::getBuildConfiguration) - .extracting(BuildConfiguration::getRunCmds) - .asList() - .containsExactly("xyz", "foo", "bar", "wibble"); - } - - @Test - void testShell() { - List configs = resolveImage( - imageConfiguration,props(mergeArrays(getBaseTestData(), new String[] { - "docker.from", "base", - "docker.name","demo", - "docker.shell", "/bin/sh -c"})) - ); - - assertThat(configs).singleElement() - .extracting(ImageConfiguration::getBuildConfiguration) - .returns(new String[]{"/bin/sh", "-c"}, c -> c.getShell().asStrings().toArray()); - } - - @Test - void testRunCommandsFromPropertiesAndConfig() { - imageConfiguration = ImageConfiguration.builder() - .external(new HashMap<>()) - .build(BuildConfiguration.builder() - .runCmds(Arrays.asList("some","ignored","value")) - .addCacheFrom("foo/bar:latest") - .build() - ) - .build(); - - makeExternalConfigUse(); - - List configs = resolveImage( - imageConfiguration,props( - "docker.from", "base", - "docker.name","demo", - "docker.run.1", "propconf", - "docker.run.2", "withrun", - "docker.run.3", "used") - ); - - assertThat(configs).singleElement() - .extracting(ImageConfiguration::getBuildConfiguration) - .extracting(BuildConfiguration::getRunCmds) - .asList() - .containsExactly("propconf", "withrun", "used"); - } - - @Test - void testRunCommandsFromConfigAndProperties() { - imageConfiguration = ImageConfiguration.builder() - .external(externalMode(PropertyMode.Fallback)) - .build(BuildConfiguration.builder() - .runCmds(Arrays.asList("some","configured","value")) - .addCacheFrom("foo/bar:latest") - .build() - ) - .build(); - - List configs = resolveImage( - imageConfiguration,props( - "docker.from", "base", - "docker.name","demo", - "docker.run.1", "this", - "docker.run.2", "is", - "docker.run.3", "ignored") - ); - - assertThat(configs).singleElement() - .extracting(ImageConfiguration::getBuildConfiguration) - .extracting(BuildConfiguration::getRunCmds) - .asList() - .containsExactly("some", "configured", "value"); - } - - @Test - void testEntrypoint() { - List configs = resolveImage( - imageConfiguration,props(mergeArrays(getBaseTestData(), new String[] { - "docker.from", "base", - "docker.name","demo", - "docker.entrypoint", "/entrypoint.sh --from-property"})) - ); - - assertThat(configs).singleElement() - .extracting(ImageConfiguration::getBuildConfiguration) - .returns(new String[]{"/entrypoint.sh", "--from-property"}, c -> c.getEntryPoint().asStrings().toArray()); - } - - @Test - void testBuildFromDockerFileMerged() { - - imageConfiguration = ImageConfiguration.builder() - .name("myimage") - .external(externalMode(PropertyMode.Override)) - .build(BuildConfiguration.builder() - .dockerFile("/some/path") - .addCacheFrom("foo/bar:latest") - .build() - ) - .build(); - - List configs = resolveImage( - imageConfiguration, props() - ); - - assertThat(configs).hasSize(1); - - BuildConfiguration buildConfiguration = configs.get(0).getBuildConfiguration(); - assertThat(buildConfiguration).isNotNull(); - buildConfiguration.initAndValidate(); - - Path absolutePath = Paths.get(".").toAbsolutePath(); - String expectedPath = absolutePath.getRoot() + "some" + File.separator + "path"; - assertThat(buildConfiguration.getDockerFile().getAbsolutePath()).isEqualTo(expectedPath); - } - - @Test - void testEnvAndLabels() { - List configs = resolveImage( - imageConfiguration,props(mergeArrays(getBaseTestData(), new String[]{ - "docker.from", "baase", - "docker.name", "demo", - "docker.env.HOME", "/tmp", - "docker.env.root.dir", "/bla", - "docker.labels.version", "1.0.0", - "docker.labels.blub.bla.foobar", "yep" - }))); - - assertThat(configs).hasSize(1); - ImageConfiguration calcConfig = configs.get(0); - assertThat(calcConfig.getBuildConfiguration().getEnv()).hasSize(2) - .contains( - entry("HOME", "/tmp"), - entry("root.dir", "/bla")); - assertThat(calcConfig.getBuildConfiguration().getLabels()).hasSize(3) - .contains( - entry("version", "1.0.0"), - entry("blub.bla.foobar", "yep")); - } - - - @Test - void testSpecificEnv() { - List configs = resolveImage( - imageConfiguration,props(mergeArrays(getBaseTestData(), new String[] { - "docker.from", "baase", - "docker.name","demo", - "docker.envBuild.HOME", "/tmp", - "docker.envRun.root.dir", "/bla" - }))); - - assertThat(configs).singleElement() - .extracting(ImageConfiguration::getBuildConfiguration) - .extracting(BuildConfiguration::getEnv) - .asInstanceOf(InstanceOfAssertFactories.MAP) - .hasSize(1) - .containsEntry("HOME", "/tmp"); - } - - @Test - void testNoCleanup() { - String[] testData = new String[] {k(ConfigKey.NAME), "image", k(ConfigKey.CLEANUP), "none", k(ConfigKey.FROM), "base" }; - - ImageConfiguration config = resolveExternalImageConfig(mergeArrays(getBaseTestData(), testData)); - assertThat(config.getBuildConfiguration().cleanupMode()).isEqualTo(CleanupMode.NONE); - } - - @Test - void testNoBuildConfig() { - String[] testData = new String[] {k(ConfigKey.NAME), "image" }; - - ImageConfiguration config = resolveExternalImageConfig(testData); - assertThat(config.getBuildConfiguration()).isNull(); - } - - @Test - void testNoCacheDisabled() { - String[] testData = new String[] {k(ConfigKey.NAME), "image", k(ConfigKey.NOCACHE), "false", k(ConfigKey.FROM), "base" }; - - ImageConfiguration config = resolveExternalImageConfig(mergeArrays(getBaseTestData(), testData)); - assertThat(config.getBuildConfiguration().getNocache()).isFalse(); - } - - @Test - void testNoCacheEnabled() { - String[] testData = new String[] {k(ConfigKey.NAME), "image", k(ConfigKey.NOCACHE), "true", k(ConfigKey.FROM), "base" }; - - ImageConfiguration config = resolveExternalImageConfig(mergeArrays(getBaseTestData(), testData)); - assertThat(config.getBuildConfiguration().getNocache()).isTrue(); - } - - @Test - void testCacheFrom() { - String[] testData = new String[] {k(ConfigKey.NAME), "image", k(ConfigKey.CACHEFROM), "foo/bar:latest", k(ConfigKey.FROM), "base"}; - - ImageConfiguration config = resolveExternalImageConfig(mergeArrays(getBaseTestData(), testData)); - assertThat(config.getBuildConfiguration().getCacheFrom()).isEqualTo(Collections.singletonList("foo/bar:latest")); - } - - @Test - void testExtractCacheFrom() { - // Given - String cacheFrom1 = "foo/bar:latest"; - String cacheFrom2 = "foo/bar1:0.1.0"; - PropertyConfigHandler propertyConfigHandler = new PropertyConfigHandler(); - - // When - List result = propertyConfigHandler.extractCacheFrom(cacheFrom1, cacheFrom2); - - // Then - assertThat(result).hasSize(2) - .containsExactly(cacheFrom1, cacheFrom2); - } - - @Test - void testNoOptimise() { - String[] testData = new String[] {k(ConfigKey.NAME), "image", k(ConfigKey.OPTIMISE), "false", k(ConfigKey.FROM), "base" }; - - ImageConfiguration config = resolveExternalImageConfig(mergeArrays(getBaseTestData(), testData)); - assertThat(config.getBuildConfiguration().optimise()).isFalse(); - } - - @Test - void testDockerFile() { - String[] testData = new String[] {k(ConfigKey.NAME), "image", k(ConfigKey.DOCKER_FILE), "file", "docker.args.foo", "bar" }; - - ImageConfiguration config = resolveExternalImageConfig(mergeArrays(getBaseTestData(), testData)); - assertThat(config.getBuildConfiguration()).isNotNull(); - } - - @Test - void testContextDir() { - String[] testData = new String[] {k(ConfigKey.NAME), "image", k(ConfigKey.CONTEXT_DIR), "dir" }; - - ImageConfiguration config = resolveExternalImageConfig(mergeArrays(getBaseTestData(), testData)); - assertThat(config.getBuildConfiguration()).isNotNull(); - } - - @Test - void testFilter() { - String filter = "@"; - String[] testData = new String[] {k(ConfigKey.NAME), "image", k(ConfigKey.FROM), "base", k(ConfigKey.FILTER), filter }; - - ImageConfiguration config = resolveExternalImageConfig(mergeArrays(getBaseTestData(), testData)); - assertThat(config.getBuildConfiguration().getFilter()).isEqualTo(filter); - } - - @Test - void testCleanupDefault() { - String[] testData = new String[] {k(ConfigKey.NAME), "image", k(ConfigKey.FROM), "base" }; - - ImageConfiguration config = resolveExternalImageConfig(mergeArrays(getBaseTestData(), testData)); - assertThat(config.getBuildConfiguration().cleanupMode().toParameter()).isEqualTo(DEFAULT_CLEANUP); - } - - @Test - void testCleanup() { - CleanupMode mode = CleanupMode.REMOVE; - String[] testData = new String[] {k(ConfigKey.NAME), "image", k(ConfigKey.FROM), "base", k(ConfigKey.CLEANUP), mode.toParameter() }; - - ImageConfiguration config = resolveExternalImageConfig(mergeArrays(getBaseTestData(), testData)); - assertThat(config.getBuildConfiguration().cleanupMode()).isEqualTo(mode); - } - - @Test - void testResolve() { - ImageConfiguration resolved = resolveExternalImageConfig(mergeArrays(getBaseTestData(), getTestData())); - - validateBuildConfiguration(resolved.getBuildConfiguration()); - //validateWaitConfiguraion(resolved.getRunConfiguration().getWaitConfiguration()); - } - - protected void validateEnv(Map env) { - assertThat(env).containsEntry("HOME", "/Users/roland"); - } - - private ImageConfiguration buildAnUnresolvedImage() { - return ImageConfiguration.builder() - .build(BuildConfiguration.builder().build()) - .external(new HashMap<>()) - .build(); - } - - private Map externalMode(PropertyMode mode) { - Map external = new HashMap<>(); - if(mode != null) { - external.put("type", "properties"); - external.put("mode", mode.name()); - } - return external; - } - - private void makeExternalConfigUse() { - Map external = imageConfiguration.getExternalConfig(); - external.put("type", "properties"); - external.put("mode", PropertyMode.Override.name()); - } - - private List resolveImage(ImageConfiguration image, final Properties properties) { - when(javaProject.getProperties()).thenReturn(properties); - when(javaProject.getBaseDirectory()).thenReturn(new File("./")); - return configHandler.resolve(image, javaProject); - } - - private ImageConfiguration resolveExternalImageConfig(String[] testData) { - Map external = new HashMap<>(); - external.put("type", "props"); - - ImageConfiguration config = ImageConfiguration.builder().name("image") - .alias("alias") - .external(external) - .build(BuildConfiguration.builder().build()) - .build(); - - List resolvedImageConfigs = resolveImage(config, props(testData)); - assertThat(resolvedImageConfigs).hasSize(1); - - return resolvedImageConfigs.get(0); - } - - private void validateBuildConfiguration(BuildConfiguration buildConfig) { - assertThat(buildConfig) - .returns(CleanupMode.TRY_TO_REMOVE, BuildConfiguration::cleanupMode) - .returns("command.sh", c -> c.getCmd().getShell()) - .returns("image", BuildConfiguration::getFrom) - .returns("image-ext", c -> c.getFromExt().get("name")) - .returns(a("8080", "8080"), BuildConfiguration::getPorts) - .returns(a("/vol1", "/foo"), BuildConfiguration::getVolumes) - .returns("fabric8io@redhat.com", BuildConfiguration::getMaintainer) - .returns(null, BuildConfiguration::getNocache) - .returns("Always", BuildConfiguration::getImagePullPolicy) - .returns(null, c -> c.getAssembly().getUser()) - .returns(null, c -> c.getAssembly().getExportTargetDir()); - /* - * validate only the descriptor is required and defaults are all used, 'testAssembly' validates - * all options can be set - */ - validateEnv(buildConfig.getEnv()); - validateLabels(buildConfig.getLabels()); - validateArgs(buildConfig.getArgs()); - validateBuildOptions(buildConfig.getBuildOptions()); - } - - private void validateArgs(Map args) { - assertThat(args).containsEntry("PROXY", "http://proxy"); - } - - private void validateLabels(Map labels) { - assertThat(labels).containsEntry("com.acme.label", "Hello\"World"); - } - - private void validateBuildOptions(Map buildOptions) { - assertThat(buildOptions).containsEntry("shmsize", "2147483648"); - } - - private Properties props(String ... args) { - Properties ret = new Properties(); - for (int i = 0; i < args.length; i += 2) { - ret.setProperty(args[i], args[i + 1]); - } - return ret; - } - - private String[] getTestData() { - return new String[] { - k(ConfigKey.ALIAS), "alias", - k(ConfigKey.BIND) + ".1", "/foo", - k(ConfigKey.BIND) + ".2", "/tmp:/tmp", - k(ConfigKey.CAP_ADD) + ".1", "CAP", - k(ConfigKey.CAP_DROP) + ".1", "CAP", - k(ConfigKey.SECURITY_OPTS) + ".1", "seccomp=unconfined", - k(ConfigKey.CPUS), "1000000000", - k(ConfigKey.CPUSET), "0,1", - k(ConfigKey.CPUSHARES), "1", - k(ConfigKey.CMD), "command.sh", - k(ConfigKey.DNS) + ".1", "8.8.8.8", - k(ConfigKey.NET), "host", - k(ConfigKey.DNS_SEARCH) + ".1", "example.com", - k(ConfigKey.DOMAINNAME), "domain.com", - k(ConfigKey.ENTRYPOINT), "entrypoint.sh", - k(ConfigKey.ENV) + ".HOME", "/Users/roland", - k(ConfigKey.ARGS) + ".PROXY", "http://proxy", - k(ConfigKey.LABELS) + ".com.acme.label", "Hello\"World", - k(ConfigKey.BUILD_OPTIONS) + ".shmsize", "2147483648", - k(ConfigKey.ENV_PROPERTY_FILE), "/tmp/envProps.txt", - k(ConfigKey.EXTRA_HOSTS) + ".1", "localhost:127.0.0.1", - k(ConfigKey.FROM), "image", - k(ConfigKey.FROM_EXT) + ".name", "image-ext", - k(ConfigKey.FROM_EXT) + ".kind", "kind", - k(ConfigKey.HOSTNAME), "subdomain", - k(ConfigKey.LINKS) + ".1", "redis", - k(ConfigKey.MAINTAINER), "fabric8io@redhat.com", - k(ConfigKey.MEMORY), "1", - k(ConfigKey.MEMORY_SWAP), "1", - k(ConfigKey.NAME), "image", - k(ConfigKey.PORT_PROPERTY_FILE), "/tmp/props.txt", - k(ConfigKey.PORTS) + ".1", "8081:8080", - k(ConfigKey.PRIVILEGED), "true", - k(ConfigKey.REGISTRY), "registry", - k(ConfigKey.RESTART_POLICY_NAME), "on-failure", - k(ConfigKey.RESTART_POLICY_RETRY), "1", - k(ConfigKey.USER), "tomcat", - k(ConfigKey.ULIMITS)+".1", "memlock=10:10", - k(ConfigKey.ULIMITS)+".2", "memlock=:-1", - k(ConfigKey.ULIMITS)+".3", "memlock=1024:", - k(ConfigKey.ULIMITS)+".4", "memlock=2048", - k(ConfigKey.VOLUMES) + ".1", "/foo", - k(ConfigKey.VOLUMES_FROM) + ".1", "from", - k(ConfigKey.WAIT_EXEC_PRE_STOP), "pre_stop_command", - k(ConfigKey.WAIT_EXEC_POST_START), "post_start_command", - k(ConfigKey.WAIT_EXEC_BREAK_ON_ERROR), "true", - k(ConfigKey.WAIT_LOG), "pattern", - k(ConfigKey.WAIT_HEALTHY), "true", - k(ConfigKey.WAIT_TIME), "5", - k(ConfigKey.WAIT_EXIT), "0", - k(ConfigKey.WAIT_URL), "http://foo.com", - k(ConfigKey.LOG_PREFIX), "SRV", - k(ConfigKey.LOG_COLOR), "green", - k(ConfigKey.LOG_ENABLED), "true", - k(ConfigKey.LOG_DATE), "iso8601", - k(ConfigKey.LOG_DRIVER_NAME), "json", - k(ConfigKey.LOG_DRIVER_OPTS) + ".max-size", "1024", - k(ConfigKey.LOG_DRIVER_OPTS) + ".max-file", "10", - k(ConfigKey.WORKING_DIR), "foo", - k(ConfigKey.TMPFS) + ".1", "/var/lib/mysql:10m", - k(ConfigKey.IMAGE_PULL_POLICY_BUILD), "Always", - k(ConfigKey.IMAGE_PULL_POLICY_RUN), "Never", - k(ConfigKey.READ_ONLY), "true", - k(ConfigKey.AUTO_REMOVE), "true", - }; - } - - private String[] getSkipTestData(ConfigKey key, boolean value) { - String[] baseData = getBaseTestData(); - String[] data = new String[baseData.length + 6]; - System.arraycopy(baseData, 0, data, 0, baseData.length); - - data[baseData.length] = k(ConfigKey.NAME); - data[baseData.length + 1] = "image"; - data[baseData.length + 2] = k(key); - data[baseData.length + 3] = String.valueOf(value); - data[baseData.length + 4] = k(ConfigKey.FROM); - data[baseData.length + 5] = "busybox"; - return data; - } - - private String k(ConfigKey from) { - return from.asPropertyKey(); - } - - private List a(String ... args) { - return Arrays.asList(args); - } - - private String[] getBaseTestData() { - return new String[] { - "docker.name", "docker-project", - "docker.from", "docker-from:ladocker", - "docker.cachefrom", "docker-image:ladocker", - "docker.args.foo", "bar", - "docker.labels.foo", "l1", - "docker.ports.p1", "8080", - "docker.run.0", "xyz", - "docker.volumes.0", "/vol1", - "docker.tags.0", "0.1.0" - }; - } - - private String[] mergeArrays(String[] a, String[] b) { - String[] mergedArr = new String[a.length + b.length]; - int mergedIndex = 0; - for (String s : a) mergedArr[mergedIndex++] = s; - for (String s : b) mergedArr[mergedIndex++] = s; - return mergedArr; - } -} diff --git a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolverTest.java b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolverTest.java new file mode 100644 index 0000000000..ba26be8c9c --- /dev/null +++ b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolverTest.java @@ -0,0 +1,301 @@ +/* + * 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.build.api.config.property; + +import org.eclipse.jkube.kit.common.Arguments; +import org.eclipse.jkube.kit.common.JavaProject; +import org.eclipse.jkube.kit.config.image.ImageConfiguration; +import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; +import org.eclipse.jkube.kit.config.image.build.HealthCheckConfiguration; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.util.Properties; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.entry; + +class PropertyConfigResolverTest { + + private PropertyConfigResolver propertyConfigResolver; + private ImageConfiguration initialImageConfiguration; + private JavaProject javaProject; + + @BeforeEach + void setUp() { + propertyConfigResolver = new PropertyConfigResolver(); + initialImageConfiguration = ImageConfiguration.builder() + .name("initial-name") + .alias("initial-alias") + .build(BuildConfiguration.builder() + .cmd(Arguments.builder().shell("./initial-cmd").build()) + .cleanup("none") + .imagePullPolicy("Never") + .from("initial-from") + .addCacheFrom("initial-cache-from-image:0.0.0") + .putEnv("VAR_1", "INITIAL_VALUE_1") + .label("label-1", "value-1") + .port("8082") + .port("9082") + .tag("initial-tag-1") + .tag("initial-tag-2") + .healthCheck(HealthCheckConfiguration.builder() + .interval("30s") + .build()) + .build()) + .build(); + javaProject = JavaProject.builder() + .properties(new Properties()) + .build(); + javaProject.getProperties().put("jkube.container-image.name", "image-name"); + javaProject.getProperties().put("jkube.container-image.alias", "image-alias"); + javaProject.getProperties().put("jkube.container-image.cmd", "./cmd"); + javaProject.getProperties().put("jkube.container-image.cleanup", "try"); + javaProject.getProperties().put("jkube.container-image.imagePullPolicy", "Always"); + javaProject.getProperties().put("jkube.container-image.from", "busybox"); + javaProject.getProperties().put("jkube.container-image.cachefrom.1", "cache-from-image:0.0.1"); + javaProject.getProperties().put("jkube.container-image.env.VAR_2", "VALUE_2"); + javaProject.getProperties().put("jkube.container-image.envBuild.VAR_3", "VALUE_3"); + javaProject.getProperties().put("jkube.container-image.labels.label-from-property", "value-2"); + javaProject.getProperties().put("jkube.container-image.ports.1", "8080"); + javaProject.getProperties().put("jkube.container-image.ports.2", "9080"); + javaProject.getProperties().put("jkube.container-image.tags.1", "tag-1"); + javaProject.getProperties().put("jkube.container-image.tags.2", "tag-2"); + javaProject.getProperties().put("jkube.container-image.healthcheck.interval", "10s"); + } + + @Test + void usesPrefixForPropertyResolution() { + javaProject.getProperties().put("app.images.image-1.name", "prefixed-image-name"); + initialImageConfiguration = initialImageConfiguration.toBuilder().propertyResolverPrefix("app.images.image-1").build(); + final ImageConfiguration resolved = propertyConfigResolver.resolve(initialImageConfiguration, javaProject); + assertThat(resolved.getName()).isEqualTo("prefixed-image-name"); + } + + @Nested + class SetsIfNotInConfig { + + private ImageConfiguration resolved; + + @BeforeEach + void setUp() { + final ImageConfiguration empty = new ImageConfiguration(); + resolved = propertyConfigResolver.resolve(empty, javaProject); + } + + @Test + void setsName() { + assertThat(resolved.getName()).isEqualTo("image-name"); + } + + @Test + void setsAlias() { + assertThat(resolved.getAlias()).isEqualTo("image-alias"); + } + + @Test + void setsCmd() { + assertThat(resolved.getBuild().getCmd().asStrings()).singleElement().isEqualTo("./cmd"); + } + + @Test + void setsCleanup() { + assertThat(resolved.getBuild().getCleanup()).isEqualTo("try"); + } + + @Test + void setsImagePullPolicy() { + assertThat(resolved.getBuild().getImagePullPolicy()).isEqualTo("Always"); + } + + @Test + void setsFrom() { + assertThat(resolved.getBuild().getFrom()).isEqualTo("busybox"); + } + + @Test + void setsCacheFrom() { + assertThat(resolved.getBuild().getCacheFrom()).containsExactly("cache-from-image:0.0.1"); + } + + @Test + void setsEnv() { + assertThat(resolved.getBuild().getEnv()) + .containsOnly( + entry("VAR_2", "VALUE_2"), + entry("VAR_3", "VALUE_3") + ); + } + + @Test + void setsLabels() { + assertThat(resolved.getBuild().getLabels()).containsOnly(entry("label-from-property", "value-2")); + } + + @Test + void setsPorts() { + assertThat(resolved.getBuild().getPorts()).containsExactlyInAnyOrder("8080", "9080"); + } + + @Test + void setsTags() { + assertThat(resolved.getBuild().getTags()).containsExactlyInAnyOrder("tag-1", "tag-2"); + } + + @Test + void setsHealthCheckInterval() { + assertThat(resolved.getBuild().getHealthCheck().getInterval()).isEqualTo("10s"); + } + } + + @Nested + class OverridesIfInConfig { + + private ImageConfiguration resolved; + + @BeforeEach + void setUp() { + resolved = propertyConfigResolver.resolve(initialImageConfiguration, javaProject); + } + + @Test + void overridesName() { + assertThat(resolved.getName()).isEqualTo("image-name"); + } + + @Test + void overridesAlias() { + assertThat(resolved.getAlias()).isEqualTo("image-alias"); + } + + @Test + void overridesCmd() { + assertThat(resolved.getBuild().getCmd().asStrings()).singleElement().isEqualTo("./cmd"); + } + + @Test + void overridesCleanup() { + assertThat(resolved.getBuild().getCleanup()).isEqualTo("try"); + } + + @Test + void overridesImagePullPolicy() { + assertThat(resolved.getBuild().getImagePullPolicy()).isEqualTo("Always"); + } + + @Test + void overridesFrom() { + assertThat(resolved.getBuild().getFrom()).isEqualTo("busybox"); + } + + @Test // Replace combine policy + void overridesCacheFrom() { + assertThat(resolved.getBuild().getCacheFrom()).containsExactlyInAnyOrder("cache-from-image:0.0.1"); + } + + @Test + void mergesEnv() { + assertThat(resolved.getBuild().getEnv()) + .containsOnly( + entry("VAR_1", "INITIAL_VALUE_1"), + entry("VAR_2", "VALUE_2"), + entry("VAR_3", "VALUE_3") + ); + } + + @Test // Merge combine policy + void appendsPorts() { + assertThat(resolved.getBuild().getPorts()).containsExactlyInAnyOrder("8080", "9080", "8082", "9082"); + } + + @Test + void appendsTags() { + assertThat(resolved.getBuild().getTags()).containsExactlyInAnyOrder("tag-1", "tag-2", "initial-tag-1", "initial-tag-2"); + } + + @Test + void overridesHealthCheckInterval() { + assertThat(resolved.getBuild().getHealthCheck().getInterval()).isEqualTo("10s"); + } + } + + @Nested + class PreservesInConfig { + + private ImageConfiguration resolved; + + @BeforeEach + void setUp() { + javaProject.getProperties().clear(); + resolved = propertyConfigResolver.resolve(initialImageConfiguration, javaProject); + } + + @Test + void preservesName() { + assertThat(resolved.getName()).isEqualTo("initial-name"); + } + + @Test + void preservesAlias() { + assertThat(resolved.getAlias()).isEqualTo("initial-alias"); + } + + @Test + void preservesCmd() { + assertThat(resolved.getBuild().getCmd().asStrings()).singleElement().isEqualTo("./initial-cmd"); + } + + @Test + void preservesCleanup() { + assertThat(resolved.getBuild().getCleanup()).isEqualTo("none"); + } + + @Test + void preservesImagePullPolicy() { + assertThat(resolved.getBuild().getImagePullPolicy()).isEqualTo("Never"); + } + + @Test + void preservesFrom() { + assertThat(resolved.getBuild().getFrom()).isEqualTo("initial-from"); + } + + @Test + void preservesCacheFrom() { + assertThat(resolved.getBuild().getCacheFrom()).containsExactly("initial-cache-from-image:0.0.0"); + } + + @Test + void preservesEnv() { + assertThat(resolved.getBuild().getEnv()).containsOnly(entry("VAR_1", "INITIAL_VALUE_1")); + } + + @Test + void preservesPorts() { + assertThat(resolved.getBuild().getPorts()).containsExactlyInAnyOrder("8082", "9082"); + } + + @Test + void preservesTags() { + assertThat(resolved.getBuild().getTags()).containsExactlyInAnyOrder("initial-tag-1", "initial-tag-2"); + } + + @Test + void preservesHealthCheckInterval() { + assertThat(resolved.getBuild().getHealthCheck().getInterval()).isEqualTo("30s"); + } + } + +} diff --git a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/property/ValueCombinePolicyTest.java b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/property/ValueCombinePolicyTest.java new file mode 100644 index 0000000000..fb176b1bf3 --- /dev/null +++ b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/property/ValueCombinePolicyTest.java @@ -0,0 +1,52 @@ +/* + * 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.build.api.config.property; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.util.stream.Stream; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class ValueCombinePolicyTest { + + @ParameterizedTest(name = "{index}: fromString({0}) = {1}") + @MethodSource("fromStringEntries") + void fromString(String valueCombinePolicy, ValueCombinePolicy expected) { + // When + final ValueCombinePolicy result = ValueCombinePolicy.fromString(valueCombinePolicy); + // Then + assertThat(result).isEqualTo(expected); + } + + static Stream fromStringEntries() { + return Stream.of( + Arguments.of("REPLACE", ValueCombinePolicy.REPLACE), + Arguments.of("replace", ValueCombinePolicy.REPLACE), + Arguments.of("MERGE", ValueCombinePolicy.MERGE), + Arguments.of("merge", ValueCombinePolicy.MERGE) + ); + } + + @Test + void fromString_unknown() { + assertThatThrownBy(() -> ValueCombinePolicy.fromString("unknown")) + .isInstanceOf(IllegalArgumentException.class) + .hasMessage("No value combine policy unknown known. Valid values are: REPLACE, MERGE"); + } +} diff --git a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelperTest.java b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelperTest.java deleted file mode 100644 index e819f474f9..0000000000 --- a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/ConfigHelperTest.java +++ /dev/null @@ -1,75 +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.build.api.helper; - -import java.io.File; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import java.util.Properties; - -import org.eclipse.jkube.kit.common.JavaProject; -import org.eclipse.jkube.kit.config.image.ImageConfiguration; -import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThatIllegalStateException; - -class ConfigHelperTest { - private JavaProject javaProject; - - @BeforeEach - void setUp() { - javaProject = JavaProject.builder() - .groupId("org.eclipse.jkube") - .artifactId("test-java-project") - .version("0.0.1-SNAPSHOT") - .properties(new Properties()) - .baseDirectory(new File("dummy-dir")) - .build(); - } - - @Test - void validateExternalPropertyActivation_withMultipleImagesWithoutExplicitExternalConfig_shouldThrowException() { - // Given - javaProject.getProperties().put("docker.imagePropertyConfiguration", "Override"); - ImageConfiguration i1 = createNewDummyImageConfiguration(); - ImageConfiguration i2 = createNewDummyImageConfiguration().toBuilder() - .name("imageconfig2") - .external(Collections.singletonMap("type", "compose")) - .build(); - ImageConfiguration i3 = createNewDummyImageConfiguration() - .toBuilder() - .name("external") - .external(Collections.singletonMap("type", "properties")) - .build(); - List images = Arrays.asList(i1, i2, i3); - - // When + Then - assertThatIllegalStateException() - .isThrownBy(() -> ConfigHelper.validateExternalPropertyActivation(javaProject, images)) - .withMessage("Configuration error: Cannot use property docker.imagePropertyConfiguration on projects with multiple images without explicit image external configuration."); - } - - private ImageConfiguration createNewDummyImageConfiguration() { - return ImageConfiguration.builder() - .name("foo/bar:latest") - .build(BuildConfiguration.builder() - .from("foobase:latest") - .build()) - .build(); - } -} diff --git a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/ImageConfiguration.java b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/ImageConfiguration.java index b87e00928d..efcb771241 100644 --- a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/ImageConfiguration.java +++ b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/ImageConfiguration.java @@ -14,7 +14,6 @@ package org.eclipse.jkube.kit.config.image; import java.io.Serializable; -import java.util.Map; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; @@ -34,7 +33,7 @@ @EqualsAndHashCode public class ImageConfiguration implements Serializable { /** - * Change the name which can be useful in long running runs e.g. for updating + * Change the name which can be useful in long-running runs e.g. for updating * images when doing updates. Use with caution and only for those circumstances. * * @param name image name to set. @@ -43,22 +42,18 @@ public class ImageConfiguration implements Serializable { private String alias; private BuildConfiguration build; private WatchImageConfiguration watch; - /** - * Override externalConfiguration when defined via special property. - * - * @param external Map with alternative config - */ - private Map external; private String registry; - /** - * Override externalConfiguration when defined via special property. + * Prefix to use for property resolution. + * + *

If not set, properties are resolved from jkube.container-image.xxx. + * The image name property would be resolved from jkube.container-image.name. * - * @param externalConfiguration Map with alternative config + *

Use this to narrow down the properties to use for image configuration resolution. + * For example, if set with app.images.image-1, properties are resolved from app.images.image-1.xxx. + * The image name property is then resolved from app.images.image-1.name. */ - public void setExternalConfiguration(Map externalConfiguration) { - this.external = externalConfiguration; - } + private String propertyResolverPrefix; public BuildConfiguration getBuildConfiguration() { return build; @@ -68,13 +63,8 @@ public WatchImageConfiguration getWatchConfiguration() { return watch; } - public Map getExternalConfig() { - return external; - } - public String getDescription() { return String.format("[%s] %s", new ImageName(name).getFullName(), (alias != null ? "\"" + alias + "\"" : "")).trim(); } - } diff --git a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/HealthCheckConfiguration.java b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/HealthCheckConfiguration.java index 7407e2c78c..7aeda4fdbf 100644 --- a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/HealthCheckConfiguration.java +++ b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/HealthCheckConfiguration.java @@ -26,7 +26,7 @@ /** * Build configuration for health checks. */ -@Builder +@Builder(toBuilder = true) @AllArgsConstructor @NoArgsConstructor @Getter diff --git a/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageConfigurationTest.java b/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageConfigurationTest.java index 385be4521e..1396ae333c 100644 --- a/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageConfigurationTest.java +++ b/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageConfigurationTest.java @@ -21,19 +21,23 @@ class ImageConfigurationTest { - @Test - void testBuilder() { - // Given - BuildConfiguration jkubeBuildConfiguration = BuildConfiguration.builder() - .user("super-user") - .build(); - // When - final ImageConfiguration result = ImageConfiguration.builder() - .name("1337") - .build(jkubeBuildConfiguration) - .build(); - // Then - assertThat(result.getName()).isEqualTo("1337"); - assertThat(result.getBuildConfiguration().getUser()).isEqualTo("super-user"); - } + @Test + void testBuilder() { + // Given + BuildConfiguration jkubeBuildConfiguration = BuildConfiguration.builder() + .user("super-user") + .build(); + // When + final ImageConfiguration result = ImageConfiguration.builder() + .name("1337") + .propertyResolverPrefix("app.images.image-1") + .build(jkubeBuildConfiguration) + .build(); + // Then + assertThat(result) + .hasFieldOrPropertyWithValue("name", "1337") + .hasFieldOrPropertyWithValue("propertyResolverPrefix", "app.images.image-1") + .extracting(ImageConfiguration::getBuildConfiguration) + .hasFieldOrPropertyWithValue("user", "super-user"); + } } diff --git a/jkube-kit/doc/src/main/asciidoc/inc/build/_assembly.adoc b/jkube-kit/doc/src/main/asciidoc/inc/build/_assembly.adoc index 75277315e6..80554d2e60 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/build/_assembly.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/build/_assembly.adoc @@ -6,35 +6,41 @@ logic (see <> for more details). [[config-image-build-assembly]] .Assembly Configuration (<> : <>) -[cols="1,5"] +[cols="1,5,1"] |=== -| Element | Description +| Element | Description | Property | *name* | Assembly name, which is `maven` by default. This name is used for the archives and directories created during the build. This directory holds the files specified by the assembly. If an <> is used then this name is also the relative directory which contains the assembly files. +| | *targetDir* | Directory under which the files and artifacts contained in the assembly will be copied within the container. The default value for this is `${assembly.name}`, so `/maven` if *name* is not set to a different value. +| `jkube.container-image.assembly.targetDir` | <> | _Deprecated: Use layers instead_ Inlined assembly descriptor as described in <> below. +| | <> | Each of the layers that the assembly will contain as described in <> below. +| | *exportTargetDir* | Specification whether the `targetDir` should be exported as a volume. This value is `true` by default except in the case the `targetDir` is set to the container root (`/`). It is also `false` by default when a base image is used with `from` since exporting makes no sense in this case and will waste disk space unnecessarily. +| `jkube.container-image.assembly.exportTargetDir` | *excludeFinalOutputArtifact* | By default, the project's final artifact will be included in the assembly, set this flag to true in case the artifact should be excluded from the assembly. +| | *mode* a| Mode how the assembled files should be collected: @@ -45,6 +51,7 @@ a| Mode how the assembled files should be collected: * `zip` : Transfer via ZIP archive The archive formats have the advantage that file permission can be preserved better (since the copying is independent from the underlying files systems) +| `jkube.container-image.assembly.mode` | *permissions* a| Permission of the files to add: @@ -56,9 +63,11 @@ assembly configuration * `auto` to let the plugin select `exec` on Windows and `keep` on others. `keep` is the default value. +| `jkube.container-image.assembly.permissions` | *tarLongFileMode* | Sets the TarArchiver behaviour on file paths with more than 100 characters length. Valid values are: "warn"(default), "fail", "truncate", "gnu", "posix", "posix_warn" or "omit" +| `jkube.container-image.assembly.tarLongFileMode` | *user* a| User and/or group under which the files should be added. The user must already exist in the base image. @@ -69,6 +78,7 @@ If a third part is given, then the build changes to user `root` before changing For example, the image `jboss/wildfly` use a "jboss" user under which all commands are executed. Adding files in Docker always happens under the UID root. These files can only be changed to "jboss" is the `chown` command is executed as root. For the following commands to be run again as "jboss" (like the final `standalone.sh`), the plugin switches back to user `jboss` (this is this "run-user") after changing the file ownership. For this example a specification of `jboss:jboss:jboss` would be required. +| `jkube.container-image.assembly.user` |=== In the event you do not need to include any artifacts with the image, you may safely omit this element from the configuration. diff --git a/jkube-kit/doc/src/main/asciidoc/inc/build/_configuration.adoc b/jkube-kit/doc/src/main/asciidoc/inc/build/_configuration.adoc index 385295d3d9..4918e6bb63 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/build/_configuration.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/build/_configuration.adoc @@ -3,23 +3,26 @@ of an image configuration. The following configuration options are supported: [[config-image-build]] .Build configuration (<>) -[cols="1,5"] +[cols="1,5,1"] |=== -| Element | Description +| Element | Description | Property | <> | Specifies the assembly configuration as described in <> +| `jkube.container-image.assembly.xxx` | <> | Map specifying the value of https://docs.docker.com/engine/reference/commandline/build/#set-build-time-variables-build-arg[Docker build args] which should be used when building the image with an external Dockerfile which uses build arguments. The key-value syntax is the same as when defining {plugin-type} properties (or `labels` or `env`). This argument is ignored when no external Dockerfile is used. Build args can also be specified as properties as described in <> +| `jkube.container-image.args` | *buildOptions* | Map specifying the build options to provide to the docker daemon when building the image. These options map to the ones listed as query parameters in the https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#build-image-from-a-dockerfile[Docker Remote API] and are restricted to simple options (e.g.: memory, shmsize). If you use the respective configuration options for build options natively supported by the build configuration (i.e. `noCache`, `cleanup=remove` for buildoption `forcerm=1` and `args` for build args) then these will override any corresponding options given here. The key-value syntax is the same as when defining environment variables or labels as described in <>. +| `jkube.container-image.buildOptions` | *createImageOptions* | Map specifying the create image options to provide to the docker daemon when pulling or @@ -27,15 +30,19 @@ https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#build-imag These options map to the ones listed as query parameters in the https://docs.docker.com/engine/api/v1.41/#operation/ImageCreate[Docker Remote API] and are restricted to simple options (e.g.: fromImage, fromSrc, platform). +| | *cleanup* | Cleanup dangling (untagged) images after each build (including any containers created from them). Default is `try` which tries to remove the old image, but doesn't fail the build if this is not possible because e.g. the image is still used by a running container. Use `remove` if you want to fail the build and `none` if no cleanup is requested. +| `jkube.container-image.cleanup` | [[context-dir]]*contextDir* | Path to a directory used for the build's context. You can specify the `Dockerfile` to use with *dockerFile*, which by default is the Dockerfile found in the `contextDir`. The Dockerfile can be also located outside of the `contextDir`, if provided with an absolute file path. See <> for details. +| `jkube.container-image.contextDir` | <> | A command to execute by default (i.e. if no command is provided when a container for this image is started). See <> for details. +| `jkube.container-image.cmd` | *compression* | @@ -45,21 +52,29 @@ endif::[] ifeval::["{plugin-type}" == "maven"] The compression mode how the build archive is transmitted to the docker daemon (`{goal-prefix}:build`) and how docker build archives are attached to this build as sources. The value can be `none` (default), `gzip` or `bzip2`. endif::[] +| | *dockerFile* | Path to a `Dockerfile` which also triggers _Dockerfile mode_. See <> for details. +| `jkube.container-image.dockerFile` | *dockerArchive* | Path to a saved image archive which is then imported. See <> for details. +| `jkube.container-image.dockerArchive` | <> | An entrypoint allows you to configure a container that will run as an executable. See <> for details. +| `jkube.container-image.entrypoint` | <> | The environments as described in <>. +| `jkube.container-image.env` + + e.g. `jkube.container-image.env.FOO=bar` | *filter* | Enable and set the delimiters for property replacements. By default, properties in the format `${..}` are replaced with {plugin-type} properties. You can switch off property replacement by setting this property to `false`. When using a single char like `@` then this is used as a delimiter (e.g `@...@`). See <> for more details. +| `jkube.container-image.filter` | [[build-config-from]]*from* | The base image which should be used for this image. If not given this default to `busybox:latest` and is suitable for a pure data image. @@ -69,11 +84,13 @@ endif::[] ifeval::["{goal-prefix}" == "oc"] In case of an <> this parameter specifies the S2I Builder Image to use, which by default is `fabric8/s2i-java:latest`. See also <> how to add additional properties for the base image. endif::[] +| `jkube.container-image.from` | *buildpacksBuilderImage* | Configure https://buildpacks.io/docs/for-platform-operators/concepts/builder/[BuildPack builder] OCI image for BuildPack Build. This field is applicable only in `buildpacks` build strategy. This overrides builder image specified in local `~/.pack/config.toml`. If not specified this defaults to `null`. -This field is only applicable for `buildpacks` build strategy. + This field is only applicable for `buildpacks` build strategy. +| | [[build-config-from-ext]]**fromExt** a| Extended definition for a base image. This field holds a map of defined in `key = "value"` format. The known keys are: @@ -88,53 +105,81 @@ ifeval::["{goal-prefix}" == "oc"] * `namespace` : Namespace where this builder image lives. endif::[] -A provided `from` takes precedence over the name given here. This tag is useful for extensions of this plugin. + A provided `from` takes precedence over the name given here. This tag is useful for extensions of this plugin. +| `jkube.container-image.fromExt` + +| <> +| Specifies the health check configuration as described in <> +| `jkube.container-image.healthcheck.xxx` | *imagePullPolicy* | Specific pull policy for the base image. This overwrites any global pull policy. See the global configuration option <> for the possible values and the default. +| `jkube.container-image.imagePullPolicy` | <> | Labels as described in <>. +| `jkube.container-image.labels` + + e.g. `jkube.container-image.label.foo=bar` | *maintainer* | The author (`MAINTAINER`) field for the generated image +| `jkube.container-image.maintainer` | *noCache* | Don't use Docker's build cache. This can be overwritten by setting a system property `docker.noCache` when running {plugin-type}. +| `jkube.container-image.nocache` | *cacheFrom* | A list of `image` elements specifying image names to use as cache sources. +| `jkube.container-image.cachefrom` + + e.g. `jkube.container-image.cachefrom.1=my-cache-image:0.0.1` | *optimise* | if set to true then it will compress all the `runCmds` into a single `RUN` directive so that only one image layer is created. +| `jkube.container-image.optimise` | *ports* | The exposed ports which is a list of `port` elements, one for each port to expose. Whitespace is trimmed from each element and empty elements are ignored. The format can be either pure numerical ("8080") or with the protocol attached ("8080/tcp"). +| `jkube.container-image.ports` + + e.g. `jkube.container-image.ports.1=8080` | *shell* | Shell to be used for the *runCmds*. It contains *arg* elements which are defining the executable and its params. +| `jkube.container-image.shell` | *runCmds* | Commands to be run during the build process. It contains *run* elements which are passed to the shell. Whitespace is trimmed from each element and empty elements are ignored. The run commands are inserted right after the assembly and after *workdir* into the Dockerfile. +| `jkube.container-image.runCmds` + + e.g. `jkube.container-image.runCmds.1=groupadd -r appUser` | *skip* | if set to true disables building of the image. This config option is best used together with a {plugin-type} property - -| *skipTag* -| If set to `true` this plugin won't add any tags to images. +| `jkube.container-image.skip` | *tags* | List of additional `tag` elements with which an image is to be tagged after the build. Whitespace is trimmed from each element and empty elements are ignored. +| `jkube.container-image.tags` + + e.g. `jkube.container-image.tags.1=latest` | *user* | User to which the Dockerfile should switch to the end (corresponds to the `USER` Dockerfile directive). +| `jkube.container-image.user` | *volumes* | List of `volume` elements to create a container volume. Whitespace is trimmed from each element and empty elements are ignored. +| `jkube.container-image.volumes` + + e.g. `jkube.container-image.volumes.1=/path/to/expose` | *workdir* | Directory to change to when starting the container. +| `jkube.container-image.workdir` |=== diff --git a/jkube-kit/doc/src/main/asciidoc/inc/build/_healthcheck.adoc b/jkube-kit/doc/src/main/asciidoc/inc/build/_healthcheck.adoc index b58a5105c3..842812df38 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/build/_healthcheck.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/build/_healthcheck.adoc @@ -3,29 +3,36 @@ Healthchecks has been introduced since Docker 1.12 and are a way to tell Docker The healtcheck configuration can have the following options -.Healthcheck Configuration -[cols="1,5"] +[[config-image-build-healthcheck]] +.Healthcheck Configuration (<> : <>) +[cols="1,5,1"] |=== -| Element | Description +| Element | Description | Property | *cmd* | Command to execute, which can be given in an shell or exec format as described in <>. +| `jkube.container-image.healthcheck.cmd` | *interval* | Interval for how often to run the healthcheck. The time is specified in seconds, but a time unit can be appended to change this. +| `jkube.container-image.healthcheck.interval` | *mode* | Mode of the healthcheck. This can be `cmd` which is the default and specifies that the health check should be executed. Or `none` to disable a health check from the base image. Only use this option with `none` for disabling some healthcheck from the base image. +| `jkube.container-image.healthcheck.mode` | *retries* | How many retries should be performed before the container is to be considered unhealthy. +| `jkube.container-image.healthcheck.retries` | *startPeriod* | Initialization time for containers that need time to bootstrap. Probe failure during that period will not be counted towards the maximum number of retries. However, if a health check succeeds during the start period, the container is considered started and all consecutive failures will be counted towards the maximum number of retries. Given in seconds, but another time unit can be appended. +| `jkube.container-image.healthcheck.startPeriod` | *timeout* | Timeout after which healthckeck should be stopped and considered to have failed. Given in seconds, but another time unit can be appended. +| `jkube.container-image.healthcheck.timeout` |=== The following example queries an URL every 10s as an healthcheck: diff --git a/jkube-kit/doc/src/main/asciidoc/inc/image/_configuration.adoc b/jkube-kit/doc/src/main/asciidoc/inc/image/_configuration.adoc index c45b767849..d4eb24e6af 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/image/_configuration.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/image/_configuration.adoc @@ -1,20 +1,23 @@ [[config-image]] .Image Configuration -[cols="1,5"] +[cols="1,5,1"] |=== -| Element | Description +| Element | Description | Property | <> -| Each `image` configuration has a mandatory, unique docker -repository _name_. This can include registry and tag parts, but also placeholder parameters. See below for a detailed explanation. +| Each `image` configuration has a mandatory, unique docker repository _name_. + This can include registry and tag parts, but also placeholder parameters. + See below for a detailed explanation. +| `jkube.container-image.name` | *alias* -| Shortcut name for an image which can be used for -identifying the image within this configuration. This is used when -linking images together or for specifying it with the global *image* configuration element. +| Shortcut name for an image which can be used for identifying the image within this configuration. + This is used when linking images together or for specifying it with the global *image* configuration element. +| `jkube.container-image.alias` | <> | Registry to use for this image. If the `name` already contains a registry this takes precedence. See <> for more details. +| | <> | @@ -25,6 +28,13 @@ ifeval::["{plugin-type}" == "gradle"] Element which contains all the configuration aspects when doing a <>. endif::[] -This element can be omitted if the image is only pulled from a registry e.g. as support for integration tests like database images. + This element can be omitted if the image is only pulled from a registry. + e.g. as support for integration tests like database images. +| + +| *propertyResolverPrefix* +| Prefix for property resolution. This is used to resolve properties in the configuration. + If not set, the default prefix is `jkube.container-image`. +| |=== diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java index 66b5af8ebc..8da9fe6d60 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java @@ -21,7 +21,7 @@ import java.util.stream.Collectors; import org.apache.commons.lang3.StringUtils; -import org.eclipse.jkube.kit.build.api.helper.ImageConfigResolver; +import org.eclipse.jkube.kit.build.api.config.property.PropertyConfigResolver; import org.eclipse.jkube.kit.build.api.helper.ImageNameFormatter; import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.KitLogger; @@ -43,11 +43,11 @@ public class DefaultGeneratorManager implements GeneratorManager { "META-INF/jkube-generator" }; private final GeneratorContext genCtx; - private final ImageConfigResolver imageConfigResolver; + private final PropertyConfigResolver propertyConfigResolver; public DefaultGeneratorManager(GeneratorContext context) { this.genCtx = context; - imageConfigResolver = new ImageConfigResolver(); + propertyConfigResolver = new PropertyConfigResolver(); } @Override @@ -76,13 +76,12 @@ public List generateAndMerge(List unreso private List resolveImages(List unresolvedImages) { final List resolvedImages = new ArrayList<>(); if (unresolvedImages != null) { - for (ImageConfiguration image : unresolvedImages) { - resolvedImages.addAll(imageConfigResolver.resolve(image, genCtx.getProject())); - } - for (ImageConfiguration config : resolvedImages) { - if (config.getName() == null) { + for (ImageConfiguration unresolvedImage : unresolvedImages) { + final ImageConfiguration resolvedImage = propertyConfigResolver.resolve(unresolvedImage, genCtx.getProject()); + if (resolvedImage.getName() == null) { throw new JKubeException("Configuration error: must have a non-null "); } + resolvedImages.add(resolvedImage); } } return resolvedImages; diff --git a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java index c426840e9d..a939048fca 100644 --- a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java +++ b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java @@ -15,12 +15,12 @@ import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Properties; import java.util.stream.Collectors; -import org.assertj.core.api.AssertionsForInterfaceTypes; import org.eclipse.jkube.kit.common.BuildRecreateMode; import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.JavaProject; @@ -48,8 +48,8 @@ class DefaultGeneratorManagerTest { private KitLogger logger; + private ImageConfiguration baseImageConfig; private GeneratorManager generatorManager; - private ImageConfiguration imageConfig; private GeneratorContext generatorContext; @BeforeEach @@ -64,242 +64,252 @@ void setUp() { .properties(new Properties()) .baseDirectory(new File("dummy-dir")) .build(); + baseImageConfig = ImageConfiguration.builder() + .name("foo/bar:latest") + .build(BuildConfiguration.builder() + .from("foobase:latest") + .build()) + .build(); generatorContext = GeneratorContext.builder() .config(processorConfig) .logger(logger) .project(javaProject) .build(); - imageConfig = ImageConfiguration.builder() - .name("foo/bar:latest") - .build(BuildConfiguration.builder() - .from("foobase:latest") - .build()) - .build(); generatorManager = new DefaultGeneratorManager(generatorContext); } + @Test + void withEmptyImageConfigurations_shouldCreteImageConfigViaGenerator() { + // Given + final List images = Collections.emptyList(); + // When + final List result = generatorManager.generateAndMerge(images); + // Then + assertThat(result) + .isNotSameAs(images) + .singleElement() + .hasFieldOrPropertyWithValue("alias", "processed-by-test") + .hasFieldOrPropertyWithValue("name", "generated-by-test"); + verify(logger, times(1)).info("Running generator %s", "fake-generator"); + } + + @Test + void withImageConfigurationNameBlank_throwsException() { + // Given + final List images = Collections.singletonList(ImageConfiguration.builder().build()); + // When + Then + assertThatThrownBy(() -> generatorManager.generateAndMerge(images)) + .isInstanceOf(JKubeException.class) + .hasMessage("Configuration error: must have a non-null "); + } + + @Test + void withSimpleImageConfiguration_shouldMergeWithImageConfigGeneratedViaGenerator() { + // Given + final List images = Collections.singletonList(baseImageConfig); + // When + final List result = generatorManager.generateAndMerge(images); + // Then + assertThat(result) + .isNotSameAs(images) + .hasSize(1) + .extracting(ImageConfiguration::getAlias) + .contains("processed-by-test"); + verify(logger, times(1)).info("Running generator %s", "fake-generator"); + } + + @Test + void whenNoMatchForImageFilter_thenLogWarning() { + // Given + generatorContext = generatorContext.toBuilder().filter("i-dont-exist").build(); + // When + new DefaultGeneratorManager(generatorContext).generateAndMerge(Collections.singletonList(baseImageConfig)); + // Then + verify(logger).warn("None of the resolved images [%s] match the configured filter '%s'", "foo/bar:latest", "i-dont-exist"); + } + + @Test + void whenNoMatchForMultipleImageNameFilters_thenLogWarning() { + // Given + generatorContext = generatorContext.toBuilder().filter("filter1,filter2").build(); + // When + new DefaultGeneratorManager(generatorContext).generateAndMerge(Collections.singletonList(baseImageConfig)); + // Then + verify(logger).warn("None of the resolved images [%s] match the configured filter '%s'", "foo/bar:latest", "filter1,filter2"); + } + + @Test + void whenDockerfileUsed_thenLogDockerfilePathAndContextDir(@TempDir File temporaryFolder) { + File dockerFile = temporaryFolder.toPath().resolve("Dockerfile").toFile(); + ImageConfiguration dummyImageConfiguration = ImageConfiguration.builder() + .name("imageconfiguration-no-build:latest") + .build(BuildConfiguration.builder() + .dockerFile(dockerFile.getAbsolutePath()) + .build()) + .build(); + List images = new ArrayList<>(); + images.add(dummyImageConfiguration); + // When + generatorManager.generateAndMerge(images); + // Then + verify(logger).info(eq("Using Dockerfile: %s"), anyString()); + verify(logger).info(eq("Using Docker Context Directory: %s"), any(File.class)); + } @Nested - @DisplayName("generateAndMerge") - class GenerateAndMerge { + @DisplayName("merge configuration parameters for OpenShift S2I build into Image Build configuration") + class MergeOpenShiftS2IImageConfigParams { @Test - void withEmptyImageConfiguration_shouldMergeWithImageConfigGeneratedViaGenerator() { - // Given - ImageConfiguration imageConfiguration = new ImageConfiguration(); - imageConfiguration.setName("foo/bar:latest"); - final List images = Collections.singletonList(imageConfiguration); + @DisplayName("zero configuration, do not set anything in image build configuration") + void whenNoConfigurationProvided_thenDoNotSetInBuildConfig() { // When - final List result = generatorManager.generateAndMerge(images); + final List result = generatorManager.generateAndMerge(Collections.singletonList(baseImageConfig)); // Then assertThat(result) - .isNotSameAs(images) - .hasSize(1) - .extracting(ImageConfiguration::getAlias) - .contains("processed-by-test"); - verify(logger, times(1)).info("Running generator %s", "fake-generator"); + .singleElement() + .extracting(ImageConfiguration::getBuild) + .hasFieldOrPropertyWithValue("openshiftForcePull", false) + .hasFieldOrPropertyWithValue("openshiftS2iBuildNameSuffix", null) + .hasFieldOrPropertyWithValue("openshiftS2iImageStreamLookupPolicyLocal", false) + .hasFieldOrPropertyWithValue("openshiftPullSecret", null) + .hasFieldOrPropertyWithValue("openshiftPushSecret", null) + .hasFieldOrPropertyWithValue("openshiftBuildOutputKind", null) + .hasFieldOrPropertyWithValue("openshiftBuildRecreateMode", null); } @Test - void withSimpleImageConfiguration_shouldReturnImageConfiguration() { + @DisplayName("image Configuration, then fields retained in Image Configuration") + void whenProvidedInImageConfiguration_thenDoNotUpdateBuildConfig() { // Given - List images = new ArrayList<>(); - images.add(imageConfig); - + baseImageConfig = baseImageConfig.toBuilder() + .build(BuildConfiguration.builder() + .openshiftForcePull(true) + .openshiftS2iBuildNameSuffix("-custom") + .openshiftS2iImageStreamLookupPolicyLocal(true) + .openshiftPushSecret("push-secret") + .openshiftPullSecret("pull-secret") + .openshiftBuildOutputKind("ImageStreamTag") + .openshiftBuildRecreateMode(BuildRecreateMode.buildConfig) + .build()) + .build(); // When - List resolvedImages = generatorManager.generateAndMerge(images); + List result = generatorManager.generateAndMerge(Collections.singletonList(baseImageConfig)); // Then - AssertionsForInterfaceTypes.assertThat(resolvedImages).isNotNull() - .singleElement() - .isEqualTo(imageConfig); + assertThat(result) + .singleElement() + .extracting(ImageConfiguration::getBuild) + .hasFieldOrPropertyWithValue("openshiftForcePull", true) + .hasFieldOrPropertyWithValue("openshiftS2iBuildNameSuffix", "-custom") + .hasFieldOrPropertyWithValue("openshiftS2iImageStreamLookupPolicyLocal", true) + .hasFieldOrPropertyWithValue("openshiftPullSecret", "pull-secret") + .hasFieldOrPropertyWithValue("openshiftPushSecret", "push-secret") + .hasFieldOrPropertyWithValue("openshiftBuildOutputKind", "ImageStreamTag") + .hasFieldOrPropertyWithValue("openshiftBuildRecreateMode", BuildRecreateMode.buildConfig); } @Test - void whenImageConfigurationNameBlank_thenThrowException() { + @DisplayName("plugin configuration, then fields merged in final Image Configuration") + void whenProvidedViaPluginConfiguration_thenSetInBuildConfig() { // Given - ImageConfiguration imageConfiguration = ImageConfiguration.builder().build(); - List images = Collections.singletonList(imageConfiguration); - - // When + Then - assertThatThrownBy(() -> generatorManager.generateAndMerge(images)) - .isInstanceOf(JKubeException.class) - .hasMessage("Configuration error: must have a non-null "); + generatorContext = generatorContext.toBuilder() + .openshiftForcePull(true) + .openshiftS2iBuildNameSuffix("-custom") + .openshiftS2iImageStreamLookupPolicyLocal(true) + .openshiftPullSecret("pull-secret") + .openshiftPushSecret("push-secret") + .openshiftBuildOutputKind("ImageStreamTag") + .openshiftBuildRecreate(BuildRecreateMode.buildConfig) + .build(); + // When + final List result = new DefaultGeneratorManager(generatorContext) + .generateAndMerge(Collections.singletonList(baseImageConfig)); + // Then + assertThat(result) + .singleElement() + .extracting(ImageConfiguration::getBuild) + .hasFieldOrPropertyWithValue("openshiftForcePull", true) + .hasFieldOrPropertyWithValue("openshiftS2iBuildNameSuffix", "-custom") + .hasFieldOrPropertyWithValue("openshiftS2iImageStreamLookupPolicyLocal", true) + .hasFieldOrPropertyWithValue("openshiftPullSecret", "pull-secret") + .hasFieldOrPropertyWithValue("openshiftPushSecret", "push-secret") + .hasFieldOrPropertyWithValue("openshiftBuildOutputKind", "ImageStreamTag") + .hasFieldOrPropertyWithValue("openshiftBuildRecreateMode", BuildRecreateMode.buildConfig); } @Test - void whenNoMatchForImageFilter_thenLogWarning() { + @DisplayName("plugin configuration and image configuration, then fields retained in Image Configuration") + void whenProvidedViaBothPluginAndImageConfiguration_thenDoNotModifyConfigurationSetInBuildConfig() { // Given - generatorContext = generatorContext.toBuilder().filter("i-dont-exist").build(); - List images = Collections.singletonList(imageConfig); - + baseImageConfig = baseImageConfig.toBuilder() + .build(BuildConfiguration.builder() + .openshiftForcePull(true) + .openshiftS2iBuildNameSuffix("-custom-via-image-config") + .openshiftS2iImageStreamLookupPolicyLocal(true) + .openshiftPushSecret("push-secret-via-image-config") + .openshiftPullSecret("pull-secret-via-image-config") + .openshiftBuildOutputKind("ImageStreamTag-via-image-config") + .openshiftBuildRecreateMode(BuildRecreateMode.buildConfig) + .build()) + .build(); + generatorContext = generatorContext.toBuilder() + .openshiftForcePull(true) + .openshiftS2iBuildNameSuffix("-custom") + .openshiftS2iImageStreamLookupPolicyLocal(true) + .openshiftPullSecret("pull-secret") + .openshiftPushSecret("push-secret") + .openshiftBuildOutputKind("ImageStreamTag") + .openshiftBuildRecreate(BuildRecreateMode.buildConfig) + .build(); // When - new DefaultGeneratorManager(generatorContext).generateAndMerge(images); - + final List result = new DefaultGeneratorManager(generatorContext) + .generateAndMerge(Collections.singletonList(baseImageConfig)); // Then - verify(logger).warn("None of the resolved images [%s] match the configured filter '%s'", "foo/bar:latest", "i-dont-exist"); + assertThat(result) + .singleElement() + .extracting(ImageConfiguration::getBuild) + .hasFieldOrPropertyWithValue("openshiftForcePull", true) + .hasFieldOrPropertyWithValue("openshiftS2iBuildNameSuffix", "-custom-via-image-config") + .hasFieldOrPropertyWithValue("openshiftS2iImageStreamLookupPolicyLocal", true) + .hasFieldOrPropertyWithValue("openshiftPullSecret", "pull-secret-via-image-config") + .hasFieldOrPropertyWithValue("openshiftPushSecret", "push-secret-via-image-config") + .hasFieldOrPropertyWithValue("openshiftBuildOutputKind", "ImageStreamTag-via-image-config") + .hasFieldOrPropertyWithValue("openshiftBuildRecreateMode", BuildRecreateMode.buildConfig); } + } + + @Nested + @DisplayName("Resolve ImageConfiguration from properties") + class ImageConfigurationFromProperties { @Test - void whenNoMatchForMultipleImageNameFilters_thenLogWarning() { + void withGlobalPrefix() { // Given - generatorContext = generatorContext.toBuilder().filter("filter1,filter2").build(); - List images = Collections.singletonList(imageConfig); - + generatorContext.getProject().getProperties().put("jkube.container-image.name", "image-name"); + generatorContext.getProject().getProperties().put("jkube.container-image.alias", "image-alias"); + generatorContext.getProject().getProperties().put("jkube.container-image.from", "scratch"); // When - new DefaultGeneratorManager(generatorContext).generateAndMerge(images); - + final List result = generatorManager.generateAndMerge(Collections.singletonList(new ImageConfiguration())); // Then - verify(logger).warn("None of the resolved images [%s] match the configured filter '%s'", "foo/bar:latest", "filter1,filter2"); + assertThat(result).singleElement() + .hasFieldOrPropertyWithValue("name", "image-name") + .extracting(ImageConfiguration::getBuild) + .hasFieldOrPropertyWithValue("from", "scratch"); } @Test - void whenDockerfileUsed_thenLogDockerfilePathAndContextDir(@TempDir File temporaryFolder) { - File dockerFile = temporaryFolder.toPath().resolve("Dockerfile").toFile(); - ImageConfiguration dummyImageConfiguration = ImageConfiguration.builder() - .name("imageconfiguration-no-build:latest") - .build(BuildConfiguration.builder() - .dockerFile(dockerFile.getAbsolutePath()) - .build()) - .build(); - List images = new ArrayList<>(); - images.add(dummyImageConfiguration); - + void withPrefix() { + // Given + final ImageConfiguration prefixed = ImageConfiguration.builder() + .propertyResolverPrefix("app.images.image-1") + .build(); + final ImageConfiguration standard = ImageConfiguration.builder().build(); + generatorContext.getProject().getProperties().put("app.images.image-1.name", "prefixed-image-name"); + generatorContext.getProject().getProperties().put("jkube.container-image.name", "image-name"); // When - generatorManager.generateAndMerge(images); - + final List result = generatorManager.generateAndMerge(Arrays.asList(prefixed, standard)); // Then - verify(logger).info(eq("Using Dockerfile: %s"), anyString()); - verify(logger).info(eq("Using Docker Context Directory: %s"), any(File.class)); - } - - - @Nested - @DisplayName("merge configuration parameters for OpenShift S2I build into Image Build configuration") - class MergeOpenShiftS2IImageConfigParams { - @Test - @DisplayName("zero configuration, do not set anything in image build configuration") - void whenNoConfigurationProvided_thenDoNotSetInBuildConfig() { - // When - List result = generatorManager.generateAndMerge(Collections.singletonList(imageConfig)); - - // Then - assertThat(result) - .singleElement() - .extracting(ImageConfiguration::getBuild) - .hasFieldOrPropertyWithValue("openshiftForcePull", false) - .hasFieldOrPropertyWithValue("openshiftS2iBuildNameSuffix", null) - .hasFieldOrPropertyWithValue("openshiftS2iImageStreamLookupPolicyLocal", false) - .hasFieldOrPropertyWithValue("openshiftPullSecret", null) - .hasFieldOrPropertyWithValue("openshiftPushSecret", null) - .hasFieldOrPropertyWithValue("openshiftBuildOutputKind", null) - .hasFieldOrPropertyWithValue("openshiftBuildRecreateMode", null); - } - - @Test - @DisplayName("image Configuration, then fields retained in Image Configuration") - void whenProvidedInImageConfiguration_thenDoNotUpdateBuildConfig() { - // Given - imageConfig = imageConfig.toBuilder() - .build(BuildConfiguration.builder() - .openshiftForcePull(true) - .openshiftS2iBuildNameSuffix("-custom") - .openshiftS2iImageStreamLookupPolicyLocal(true) - .openshiftPushSecret("push-secret") - .openshiftPullSecret("pull-secret") - .openshiftBuildOutputKind("ImageStreamTag") - .openshiftBuildRecreateMode(BuildRecreateMode.buildConfig) - .build()) - .build(); - List images = Collections.singletonList(imageConfig); - - // When - List result = generatorManager.generateAndMerge(images); - - // Then - assertThat(result) - .singleElement() - .extracting(ImageConfiguration::getBuild) - .hasFieldOrPropertyWithValue("openshiftForcePull", true) - .hasFieldOrPropertyWithValue("openshiftS2iBuildNameSuffix", "-custom") - .hasFieldOrPropertyWithValue("openshiftS2iImageStreamLookupPolicyLocal", true) - .hasFieldOrPropertyWithValue("openshiftPullSecret", "pull-secret") - .hasFieldOrPropertyWithValue("openshiftPushSecret", "push-secret") - .hasFieldOrPropertyWithValue("openshiftBuildOutputKind", "ImageStreamTag") - .hasFieldOrPropertyWithValue("openshiftBuildRecreateMode", BuildRecreateMode.buildConfig); - } - - @Test - @DisplayName("plugin configuration, then fields merged in final Image Configuration") - void whenProvidedViaPluginConfiguration_thenSetInBuildConfig() { - // Given - generatorContext = generatorContext.toBuilder() - .openshiftForcePull(true) - .openshiftS2iBuildNameSuffix("-custom") - .openshiftS2iImageStreamLookupPolicyLocal(true) - .openshiftPullSecret("pull-secret") - .openshiftPushSecret("push-secret") - .openshiftBuildOutputKind("ImageStreamTag") - .openshiftBuildRecreate(BuildRecreateMode.buildConfig) - .build(); - List images = Collections.singletonList(imageConfig); - - // When - List result = new DefaultGeneratorManager(generatorContext).generateAndMerge(images); - - // Then - assertThat(result) - .singleElement() - .extracting(ImageConfiguration::getBuild) - .hasFieldOrPropertyWithValue("openshiftForcePull", true) - .hasFieldOrPropertyWithValue("openshiftS2iBuildNameSuffix", "-custom") - .hasFieldOrPropertyWithValue("openshiftS2iImageStreamLookupPolicyLocal", true) - .hasFieldOrPropertyWithValue("openshiftPullSecret", "pull-secret") - .hasFieldOrPropertyWithValue("openshiftPushSecret", "push-secret") - .hasFieldOrPropertyWithValue("openshiftBuildOutputKind", "ImageStreamTag") - .hasFieldOrPropertyWithValue("openshiftBuildRecreateMode", BuildRecreateMode.buildConfig); - } - - @Test - @DisplayName("plugin configuration and image configuration, then fields retained in Image Configuration") - void whenProvidedViaBothPluginAndImageConfiguration_thenDoNotModifyConfigurationSetInBuildConfig() { - // Given - imageConfig = imageConfig.toBuilder() - .build(BuildConfiguration.builder() - .openshiftForcePull(true) - .openshiftS2iBuildNameSuffix("-custom-via-image-config") - .openshiftS2iImageStreamLookupPolicyLocal(true) - .openshiftPushSecret("push-secret-via-image-config") - .openshiftPullSecret("pull-secret-via-image-config") - .openshiftBuildOutputKind("ImageStreamTag-via-image-config") - .openshiftBuildRecreateMode(BuildRecreateMode.buildConfig) - .build()) - .build(); - generatorContext = generatorContext.toBuilder() - .openshiftForcePull(true) - .openshiftS2iBuildNameSuffix("-custom") - .openshiftS2iImageStreamLookupPolicyLocal(true) - .openshiftPullSecret("pull-secret") - .openshiftPushSecret("push-secret") - .openshiftBuildOutputKind("ImageStreamTag") - .openshiftBuildRecreate(BuildRecreateMode.buildConfig) - .build(); - List images = Collections.singletonList(imageConfig); - - // When - List result = new DefaultGeneratorManager(generatorContext).generateAndMerge(images); - - // Then - assertThat(result) - .singleElement() - .extracting(ImageConfiguration::getBuild) - .hasFieldOrPropertyWithValue("openshiftForcePull", true) - .hasFieldOrPropertyWithValue("openshiftS2iBuildNameSuffix", "-custom-via-image-config") - .hasFieldOrPropertyWithValue("openshiftS2iImageStreamLookupPolicyLocal", true) - .hasFieldOrPropertyWithValue("openshiftPullSecret", "pull-secret-via-image-config") - .hasFieldOrPropertyWithValue("openshiftPushSecret", "push-secret-via-image-config") - .hasFieldOrPropertyWithValue("openshiftBuildOutputKind", "ImageStreamTag-via-image-config") - .hasFieldOrPropertyWithValue("openshiftBuildRecreateMode", BuildRecreateMode.buildConfig); - } + assertThat(result).extracting("name").containsExactly("prefixed-image-name", "image-name"); } } @@ -321,6 +331,11 @@ public boolean isApplicable(List configs) { @Override public List customize(List existingConfigs, boolean prePackagePhase) { + if (existingConfigs == null || existingConfigs.isEmpty()) { + existingConfigs = Collections.singletonList(ImageConfiguration.builder() + .name("generated-by-test") + .build()); + } return existingConfigs.stream() .peek(ic -> ic.setAlias("processed-by-test")) .collect(Collectors.toList()); From 6be0c39fdd24b0c59da4d5936baaa5a95e7fb9e6 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Tue, 14 May 2024 21:00:11 +0530 Subject: [PATCH 120/289] refactor(jkube-kit): Move logic for adding OpenShift Build specific properties to DefaultGeneratorManager (3037) refactor (jkube-kit) : Move logic for adding OpenShift Build specific properties to DefaultGeneratorManager In Resource mojo and tasks, we've duplicated code that adds the following properties to JavaProject in case of OpenShift mode: - `jkube.image.user` : Sets image user property to currently logged in OpenShift namespace so that image user portion points to namespace - `jkube.internal.effective.platform.mode` : Used by some enrichers to determine whether current platform is OpenShift. This looks like a remnant of Fabric8 Maven Plugin refactor. We should get rid of this in follow up PR. This PR only moves code from Mojos/Tasks -> DefaultGeneratorManager.generateAndMerge() Signed-off-by: Rohan Kumar --- review: openshift-specific properties refactor Signed-off-by: Marc Nuri --- .../gradle/plugin/task/AbstractJKubeTask.java | 2 + .../plugin/task/OpenShiftResourceTask.java | 23 ----------- .../task/OpenShiftResourceTaskTest.java | 38 +------------------ .../api/DefaultGeneratorManager.java | 20 ++++++++++ .../jkube/generator/api/GeneratorContext.java | 1 + .../api/DefaultGeneratorManagerTest.java | 18 +++++++++ .../maven/plugin/mojo/build/ResourceMojo.java | 23 +---------- 7 files changed, 44 insertions(+), 81 deletions(-) diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java index 4d635761b2..7656ba377a 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java @@ -22,6 +22,7 @@ import java.util.Optional; import io.fabric8.kubernetes.client.KubernetesClient; +import org.apache.commons.lang3.StringUtils; import org.eclipse.jkube.generator.api.DefaultGeneratorManager; import org.eclipse.jkube.generator.api.GeneratorContext; import org.eclipse.jkube.gradle.plugin.GradleLogger; @@ -167,6 +168,7 @@ protected GeneratorContext.GeneratorContextBuilder initGeneratorContextBuilder() .prePackagePhase(false) .useProjectClasspath(kubernetesExtension.getUseProjectClassPathOrDefault()) .sourceDirectory(kubernetesExtension.getBuildSourceDirectoryOrDefault()) + .openshiftNamespace(StringUtils.isNotBlank(kubernetesExtension.getNamespaceOrNull()) ? kubernetesExtension.getNamespaceOrNull() : clusterAccess.getNamespace()) .buildTimestamp(getBuildTimestamp(null, null, kubernetesExtension.javaProject.getBuildDirectory().getAbsolutePath(), DOCKER_BUILD_TIMESTAMP)) .filter(kubernetesExtension.getFilterOrNull()); diff --git a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTask.java b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTask.java index 2628d443c0..5b13d173df 100644 --- a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTask.java +++ b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTask.java @@ -13,17 +13,9 @@ */ package org.eclipse.jkube.gradle.plugin.task; -import java.util.List; -import java.util.Optional; -import java.util.Properties; - import javax.inject.Inject; import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; -import org.eclipse.jkube.kit.config.image.ImageConfiguration; -import org.eclipse.jkube.kit.config.resource.RuntimeMode; - -import static org.eclipse.jkube.kit.build.api.helper.ImageNameFormatter.DOCKER_IMAGE_USER; public class OpenShiftResourceTask extends KubernetesResourceTask implements OpenShiftJKubeTask { @@ -33,19 +25,4 @@ public OpenShiftResourceTask(Class extensionClass) setDescription( "Generates or copies the OpenShift JSON file and attaches it to the build so its installed and released to maven repositories like other build artifacts."); } - - @Override - public List resolveImages() { - RuntimeMode runtimeMode = kubernetesExtension.getRuntimeMode(); - final Properties properties = kubernetesExtension.javaProject.getProperties(); - if (!properties.contains(DOCKER_IMAGE_USER)) { - String namespaceToBeUsed = Optional.ofNullable(kubernetesExtension.getNamespaceOrNull()).orElse(clusterAccess.getNamespace()); - kitLogger.info("Using container image name of namespace: " + namespaceToBeUsed); - properties.setProperty(DOCKER_IMAGE_USER, namespaceToBeUsed); - } - if (!properties.contains(RuntimeMode.JKUBE_EFFECTIVE_PLATFORM_MODE)) { - properties.setProperty(RuntimeMode.JKUBE_EFFECTIVE_PLATFORM_MODE, runtimeMode.toString()); - } - return super.resolveImages(); - } } diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTaskTest.java index 891dcedefb..822a0e96f1 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTaskTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTaskTest.java @@ -14,23 +14,15 @@ package org.eclipse.jkube.gradle.plugin.task; import java.nio.file.Paths; -import java.util.Collections; import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; import org.eclipse.jkube.gradle.plugin.TestOpenShiftExtension; -import org.eclipse.jkube.kit.common.util.KubernetesHelper; -import org.eclipse.jkube.kit.config.image.ImageConfiguration; -import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; -import io.fabric8.kubernetes.api.model.HasMetadata; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import org.mockito.MockedStatic; -import org.mockito.Mockito; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; class OpenShiftResourceTaskTest { @@ -38,11 +30,9 @@ class OpenShiftResourceTaskTest { @RegisterExtension private final TaskEnvironmentExtension taskEnvironment = new TaskEnvironmentExtension(); - private OpenShiftExtension extension; - @BeforeEach void setUp() { - extension = new TestOpenShiftExtension(); + OpenShiftExtension extension = new TestOpenShiftExtension(); when(taskEnvironment.project.getExtensions().getByType(OpenShiftExtension.class)).thenReturn(extension); when(taskEnvironment.project.getGroup()).thenReturn("org.eclipse.jkube.testing"); when(taskEnvironment.project.getName()).thenReturn("test-project"); @@ -62,30 +52,4 @@ void runTask_withImageConfiguration_shouldGenerateResources() { "apiVersion: v1\n" + "kind: List\n"); } - - @Test - void runTask_resolvesGroupInImageNameToNamespaceSetViaConfiguration_whenNoNamespaceDetected() { - try (MockedStatic kubernetesHelper = Mockito.mockStatic(KubernetesHelper.class)) { - // Given - kubernetesHelper.when(KubernetesHelper::getDefaultNamespace).thenReturn("test-custom-namespace"); - kubernetesHelper.when(() -> KubernetesHelper.getKind(any())).thenReturn("DeploymentConfig"); - kubernetesHelper.when(() -> KubernetesHelper.getName((HasMetadata) any())).thenReturn("test-project"); - ImageConfiguration imageConfiguration = ImageConfiguration.builder() - .name("%g/%a") - .build(BuildConfiguration.builder() - .from("test-base-image:latest") - .build()) - .build(); - extension.images = Collections.singletonList(imageConfiguration); - OpenShiftResourceTask resourceTask = new OpenShiftResourceTask(OpenShiftExtension.class); - - // When - resourceTask.runTask(); - - // Then - assertThat(resourceTask.resolvedImages) - .singleElement() - .hasFieldOrPropertyWithValue("name", "test-custom-namespace/test-project"); - } - } } diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java index 8da9fe6d60..7937a95483 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java @@ -17,6 +17,7 @@ import java.util.Arrays; import java.util.HashSet; import java.util.List; +import java.util.Properties; import java.util.Set; import java.util.stream.Collectors; @@ -30,6 +31,9 @@ import org.eclipse.jkube.kit.config.image.GeneratorManager; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; +import org.eclipse.jkube.kit.config.resource.RuntimeMode; + +import static org.eclipse.jkube.kit.build.api.helper.ImageNameFormatter.DOCKER_IMAGE_USER; /** * Manager responsible for finding and calling generators @@ -48,6 +52,7 @@ public class DefaultGeneratorManager implements GeneratorManager { public DefaultGeneratorManager(GeneratorContext context) { this.genCtx = context; propertyConfigResolver = new PropertyConfigResolver(); + addOpenShiftBuildRelatedProperties(); } @Override @@ -117,6 +122,21 @@ private List filterImages(List imagesToF return filteredImages; } + // TODO: Should be moved to a more suitable place (Probably within the JavaProject class) + private void addOpenShiftBuildRelatedProperties() { + if (genCtx.getRuntimeMode() == RuntimeMode.OPENSHIFT) { + final Properties properties = genCtx.getProject().getProperties(); + final String namespaceToBeUsed = genCtx.getOpenshiftNamespace(); + if (!properties.contains(DOCKER_IMAGE_USER) && StringUtils.isNotBlank(namespaceToBeUsed)) { + genCtx.getLogger().info("Using container image name of namespace: " + namespaceToBeUsed); + properties.setProperty(DOCKER_IMAGE_USER, namespaceToBeUsed); + } + if (!properties.contains(RuntimeMode.JKUBE_EFFECTIVE_PLATFORM_MODE)) { + properties.setProperty(RuntimeMode.JKUBE_EFFECTIVE_PLATFORM_MODE, genCtx.getRuntimeMode().toString()); + } + } + } + private boolean matchesConfiguredImages(String imageList, ImageConfiguration imageConfig) { if (imageList == null) { return true; diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorContext.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorContext.java index f7890eabd0..ff368dbab3 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorContext.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorContext.java @@ -57,6 +57,7 @@ public class GeneratorContext { private String openshiftPullSecret; private String openshiftPushSecret; private String openshiftBuildOutputKind; + private String openshiftNamespace; private BuildRecreateMode openshiftBuildRecreate; diff --git a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java index a939048fca..7559158da1 100644 --- a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java +++ b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java @@ -29,6 +29,7 @@ import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.resource.ProcessorConfig; +import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -276,6 +277,23 @@ void whenProvidedViaBothPluginAndImageConfiguration_thenDoNotModifyConfiguration .hasFieldOrPropertyWithValue("openshiftBuildOutputKind", "ImageStreamTag-via-image-config") .hasFieldOrPropertyWithValue("openshiftBuildRecreateMode", BuildRecreateMode.buildConfig); } + + @Test + void whenOpenShiftRuntimeMode_thenShouldResolveGroupToNamespace() { + // Given + baseImageConfig = baseImageConfig.toBuilder().name("%g/%a").build(); + generatorContext = generatorContext.toBuilder() + .openshiftNamespace("test-custom-namespace") + .runtimeMode(RuntimeMode.OPENSHIFT) + .build(); + // When + final List result = new DefaultGeneratorManager(generatorContext) + .generateAndMerge(Collections.singletonList(baseImageConfig)); + // Then + assertThat(result) + .singleElement() + .hasFieldOrPropertyWithValue("name", "test-custom-namespace/test-java-project"); + } } @Nested diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java index 116cb4656d..9b174e97cd 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java @@ -17,10 +17,10 @@ import java.io.IOException; import java.util.Collections; import java.util.List; -import java.util.Properties; import javax.validation.ConstraintViolationException; +import org.apache.commons.lang3.StringUtils; import org.eclipse.jkube.generator.api.GeneratorContext; import org.eclipse.jkube.generator.api.DefaultGeneratorManager; @@ -35,7 +35,6 @@ import org.eclipse.jkube.kit.config.resource.MappingConfig; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.config.resource.ProcessorConfig; -import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.eclipse.jkube.kit.enricher.api.DefaultEnricherManager; import org.eclipse.jkube.kit.enricher.api.JKubeEnricherContext; import org.eclipse.jkube.kit.profile.ProfileUtil; @@ -50,7 +49,6 @@ import org.apache.maven.plugins.annotations.ResolutionScope; import org.apache.maven.project.MavenProjectHelper; -import static org.eclipse.jkube.kit.build.api.helper.ImageNameFormatter.DOCKER_IMAGE_USER; import static org.eclipse.jkube.kit.common.util.BuildReferenceDateUtil.getBuildTimestamp; import static org.eclipse.jkube.kit.common.util.DekorateUtil.DEFAULT_RESOURCE_LOCATION; import static org.eclipse.jkube.kit.common.util.DekorateUtil.useDekorate; @@ -150,7 +148,6 @@ public void executeInternal() throws MojoExecutionException, MojoFailureExceptio updateKindFilenameMappings(mappings); try { - lateInit(); // Resolve the Docker image build configuration resolvedImages = getResolvedImages(images, log); if (!skip && (!isPomProject() || hasJKubeDir())) { @@ -202,23 +199,6 @@ private void validateIfRequired(File resourceDir, ResourceClassifier classifier) } } - private void lateInit() { - RuntimeMode runtimeMode = getRuntimeMode(); - jkubeServiceHub.setPlatformMode(runtimeMode); - if (runtimeMode.equals(RuntimeMode.OPENSHIFT)) { - Properties properties = javaProject.getProperties(); - if (!properties.contains(DOCKER_IMAGE_USER)) { - String namespaceToBeUsed = this.namespace != null && !this.namespace.isEmpty() ? - this.namespace: clusterAccess.getNamespace(); - log.info("Using docker image name of namespace: " + namespaceToBeUsed); - properties.setProperty(DOCKER_IMAGE_USER, namespaceToBeUsed); - } - if (!properties.contains(RuntimeMode.JKUBE_EFFECTIVE_PLATFORM_MODE)) { - properties.setProperty(RuntimeMode.JKUBE_EFFECTIVE_PLATFORM_MODE, runtimeMode.toString()); - } - } - } - private KubernetesList generateResources() throws IOException { log.verbose("Generating resources"); JKubeEnricherContext.JKubeEnricherContextBuilder ctxBuilder = JKubeEnricherContext.builder() @@ -252,6 +232,7 @@ private List getResolvedImages(List imag .useProjectClasspath(useProjectClasspath) .strategy(JKubeBuildStrategy.docker) .prePackagePhase(true) + .openshiftNamespace(StringUtils.isNotBlank(this.namespace) ? this.namespace: clusterAccess.getNamespace()) .buildTimestamp(getBuildTimestamp(getPluginContext(), CONTEXT_KEY_BUILD_TIMESTAMP, project.getBuild().getDirectory(), DOCKER_BUILD_TIMESTAMP)) .build()); return generatorManager.generateAndMerge(images); From 28db3c058367fa0bbddcf18f0804483efb441a75 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 15 May 2024 06:40:37 +0200 Subject: [PATCH 121/289] chore(deps): Bump com.google.guava:guava from 33.1.0-jre to 33.2.0-jre Bumps [com.google.guava:guava](https://github.com/google/guava) from 33.1.0-jre to 33.2.0-jre. - [Release notes](https://github.com/google/guava/releases) - [Commits](https://github.com/google/guava/commits) --- updated-dependencies: - dependency-name: com.google.guava:guava dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 59d821357f..ffd44d2a68 100644 --- a/pom.xml +++ b/pom.xml @@ -99,7 +99,7 @@ 7.6.2 0.0.5 3.0.21 - 33.1.0-jre + 33.2.0-jre 0.0.7 2.17.1 0.8.12 From bfbf08d3e506b94f4e724e96e9ddcb230504b0ee Mon Sep 17 00:00:00 2001 From: rohit-satya <151615370+rohit-satya@users.noreply.github.com> Date: Wed, 15 May 2024 18:28:57 +0530 Subject: [PATCH 122/289] fix: replace AssertJ's deprecated asList() DSL method in QuarkusGeneratorTest (3049) Signed-off-by: Rohit Satya --- .../generator/QuarkusGeneratorTest.java | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/jkube-kit/jkube-kit-quarkus/src/test/java/org/eclipse/jkube/quarkus/generator/QuarkusGeneratorTest.java b/jkube-kit/jkube-kit-quarkus/src/test/java/org/eclipse/jkube/quarkus/generator/QuarkusGeneratorTest.java index ed3298e912..aad82f905e 100644 --- a/jkube-kit/jkube-kit-quarkus/src/test/java/org/eclipse/jkube/quarkus/generator/QuarkusGeneratorTest.java +++ b/jkube-kit/jkube-kit-quarkus/src/test/java/org/eclipse/jkube/quarkus/generator/QuarkusGeneratorTest.java @@ -307,21 +307,21 @@ void withFastJarInTarget_shouldReturnFastJarAssemblyInImage() throws IOException .hasFieldOrPropertyWithValue("targetDir", "/deployments") .hasFieldOrPropertyWithValue("excludeFinalOutputArtifact", true) .extracting(AssemblyConfiguration::getLayers) - .asList().hasSize(2) + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)).hasSize(2) .satisfies(layers -> assertThat(layers).first().asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) .hasFieldOrPropertyWithValue("id", "lib") .extracting(Assembly::getFileSets) - .asList().singleElement() + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)).singleElement() .hasFieldOrPropertyWithValue("outputDirectory", new File(".")) - .extracting("includes").asList() + .extracting("includes").asInstanceOf(InstanceOfAssertFactories.list(String.class)) .containsExactly("lib")) .satisfies(layers -> assertThat(layers).element(1).asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) .hasFieldOrPropertyWithValue("id", "fast-jar") .extracting(Assembly::getFileSets) - .asList().singleElement() + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)).singleElement() .hasFieldOrPropertyWithValue("outputDirectory", new File(".")) .hasFieldOrPropertyWithValue("excludes", Arrays.asList("lib/**/*", "lib/*")) - .extracting("includes").asList() + .extracting("includes").asInstanceOf(InstanceOfAssertFactories.list(String.class)) .containsExactly("quarkus-run.jar", "*", "**/*")); } @@ -345,9 +345,9 @@ void manualNativeSettings_shouldReturnNativeAssemblyInImage() throws IOException .extracting(BuildConfiguration::getAssembly) .hasFieldOrPropertyWithValue("targetDir", "/") .extracting(AssemblyConfiguration::getLayers) - .asList().singleElement().asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)).singleElement().asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) .extracting(Assembly::getFileSets) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)) .hasSize(1) .flatExtracting("includes") .containsExactly("sample-runner"); @@ -368,9 +368,9 @@ void withNativeBinaryInTarget_shouldReturnNativeAssemblyInImage() throws IOExcep .extracting(BuildConfiguration::getAssembly) .hasFieldOrPropertyWithValue("targetDir", "/") .extracting(AssemblyConfiguration::getLayers) - .asList().singleElement().asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)).singleElement().asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) .extracting(Assembly::getFileSets) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)) .hasSize(1) .flatExtracting("includes") .containsExactly("sample-runner"); @@ -393,18 +393,18 @@ void withLegacyJarInTarget_shouldReturnDefaultAssemblyInImage() throws IOExcepti .hasFieldOrPropertyWithValue("targetDir", "/deployments") .hasFieldOrPropertyWithValue("excludeFinalOutputArtifact", true) .extracting(AssemblyConfiguration::getLayers) - .asList().hasSize(2) + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)).hasSize(2) .satisfies(layers -> assertThat(layers).first().asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) .hasFieldOrPropertyWithValue("id", "lib") .extracting(Assembly::getFileSets) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)) .hasSize(1) .flatExtracting("includes") .containsExactly("lib")) .satisfies(layers -> assertThat(layers).element(1).asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) .hasFieldOrPropertyWithValue("id", "artifact") .extracting(Assembly::getFileSets) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)) .hasSize(1) .flatExtracting("includes") .containsExactly("sample-legacy-runner.jar")); @@ -439,9 +439,9 @@ void withUberJarInTarget_shouldReturnAssemblyWithSingleJar() throws IOException .extracting(BuildConfiguration::getAssembly) .hasFieldOrPropertyWithValue("targetDir", "/deployments") .extracting(AssemblyConfiguration::getLayers) - .asList().singleElement().asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)).singleElement().asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) .extracting(Assembly::getFileSets) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)) .hasSize(1) .flatExtracting("includes") .containsExactly("sample-runner.jar"); @@ -465,21 +465,21 @@ void withManualConfigAndFastJarAndLegacyInTarget_shouldReturnAssemblyForQuarkusA .hasFieldOrPropertyWithValue("targetDir", "/deployments") .hasFieldOrPropertyWithValue("excludeFinalOutputArtifact", true) .extracting(AssemblyConfiguration::getLayers) - .asList().hasSize(2) + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)).hasSize(2) .satisfies(layers -> assertThat(layers).first().asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) .hasFieldOrPropertyWithValue("id", "lib") .extracting(Assembly::getFileSets) - .asList().singleElement() + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)).singleElement() .hasFieldOrPropertyWithValue("outputDirectory", new File(".")) - .extracting("includes").asList() + .extracting("includes").asInstanceOf(InstanceOfAssertFactories.list(String.class)) .containsExactly("lib")) .satisfies(layers -> assertThat(layers).element(1).asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) .hasFieldOrPropertyWithValue("id", "fast-jar") .extracting(Assembly::getFileSets) - .asList().singleElement() + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)).singleElement() .hasFieldOrPropertyWithValue("outputDirectory", new File(".")) .hasFieldOrPropertyWithValue("excludes", Arrays.asList("lib/**/*", "lib/*")) - .extracting("includes").asList() + .extracting("includes").asInstanceOf(InstanceOfAssertFactories.list(String.class)) .containsExactly("quarkus-run.jar", "*", "**/*")); } From c1a4ffd7eb6195a7d239823a839d45f9806b9ae1 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Thu, 16 May 2024 10:19:52 +0200 Subject: [PATCH 123/289] refactor: initial changes to support multiplatform build Signed-off-by: Marc Nuri --- .../jkube/kit/service/jib/JibServiceUtil.java | 339 ++++++++---------- .../kit/service/jib/JibServiceUtilTest.java | 27 +- .../service/kubernetes/JibBuildService.java | 2 - 3 files changed, 165 insertions(+), 203 deletions(-) diff --git a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java index 09add5e5ef..b13697f334 100644 --- a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java +++ b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Optional; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; @@ -32,6 +31,7 @@ import org.eclipse.jkube.kit.build.api.assembly.BuildDirs; import org.eclipse.jkube.kit.common.Assembly; import org.eclipse.jkube.kit.common.AssemblyFileEntry; +import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.ImageName; import org.eclipse.jkube.kit.common.Arguments; @@ -56,197 +56,172 @@ import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; -import javax.annotation.Nonnull; - import static com.google.cloud.tools.jib.api.buildplan.FileEntriesLayer.DEFAULT_FILE_PERMISSIONS_PROVIDER; public class JibServiceUtil { - private JibServiceUtil() { - } - - private static final long JIB_EXECUTOR_SHUTDOWN_TIMEOUT_SECONDS = 10L; - private static final String BUSYBOX = "busybox:latest"; - - /** - * Build container image using JIB - * - * @param jibContainerBuilder jib container builder object - * @param image tarball for image - * @param logger kit logger - * @throws InterruptedException in case thread is interrupted - */ - public static void buildContainer(JibContainerBuilder jibContainerBuilder, TarImage image, JibLogger logger) - throws InterruptedException { - - final ExecutorService jibBuildExecutor = Executors.newCachedThreadPool(); - try { - jibContainerBuilder.setCreationTime(Instant.now()); - jibContainerBuilder.containerize(Containerizer.to(image) - .setAllowInsecureRegistries(true) - .setExecutorService(jibBuildExecutor) - .addEventHandler(LogEvent.class, logger) - .addEventHandler(ProgressEvent.class, logger.progressEventHandler())); - logger.updateFinished(); - } catch (CacheDirectoryCreationException | IOException | ExecutionException | RegistryException ex) { - throw new IllegalStateException("Unable to build the image tarball: " + ex.getMessage(), ex); - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - throw ex; - } finally { - jibBuildExecutor.shutdown(); - jibBuildExecutor.awaitTermination(JIB_EXECUTOR_SHUTDOWN_TIMEOUT_SECONDS, TimeUnit.SECONDS); - } - } - - public static JibContainerBuilder containerFromImageConfiguration( - ImageConfiguration imageConfiguration, String pullRegistry, Credential pullRegistryCredential) throws InvalidImageReferenceException { - final JibContainerBuilder containerBuilder = Jib - .from(toRegistryImage(getBaseImage(imageConfiguration, pullRegistry), pullRegistryCredential)) - .setFormat(ImageFormat.Docker); - return populateContainerBuilderFromImageConfiguration(containerBuilder, imageConfiguration); - } - - public static String getFullImageName(ImageConfiguration imageConfiguration, String tag) { - ImageName imageName; - if (tag != null) { - imageName = new ImageName(imageConfiguration.getName(), tag); - } else { - imageName = new ImageName(imageConfiguration.getName()); - } - return imageName.getFullName(); - } - - /** - * Push Image to registry using JIB - * - * @param imageConfiguration ImageConfiguration - * @param pushCredentials push credentials - * @param tarArchive tar archive built during build goal - * @param log Logger - */ - public static void jibPush(ImageConfiguration imageConfiguration, Credential pushCredentials, File tarArchive, JibLogger log) { - String imageName = getFullImageName(imageConfiguration, null); - List additionalTags = imageConfiguration.getBuildConfiguration().getTags(); - try { - pushImage(TarImage.at(tarArchive.toPath()), additionalTags, imageName, pushCredentials, log); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - throw new IllegalStateException("Thread Interrupted", e); - } + private JibServiceUtil() { + } + + private static final long JIB_EXECUTOR_SHUTDOWN_TIMEOUT_SECONDS = 10L; + private static final String BUSYBOX = "busybox:latest"; + + /** + * Build container image using JIB + * + * @param jibContainerBuilder jib container builder object + * @param image tarball for image + * @param logger kit logger + */ + public static void buildContainer(JibContainerBuilder jibContainerBuilder, TarImage image, JibLogger logger) { + final ExecutorService jibBuildExecutor = Executors.newCachedThreadPool(); + try { + jibContainerBuilder.setCreationTime(Instant.now()); + jibContainerBuilder.containerize(Containerizer.to(image) + .setAllowInsecureRegistries(true) + .setExecutorService(jibBuildExecutor) + .addEventHandler(LogEvent.class, logger) + .addEventHandler(ProgressEvent.class, logger.progressEventHandler())); + logger.updateFinished(); + } catch (CacheDirectoryCreationException | IOException | ExecutionException | RegistryException ex) { + throw new JKubeException("Unable to build the image tarball: " + ex.getMessage(), ex); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + throw new JKubeException("Thread Interrupted", ex); + } finally { + shutdownAndWait(jibBuildExecutor); } - - private static void pushImage(TarImage baseImage, List additionalTags, String targetImageName, Credential credential, JibLogger logger) - throws InterruptedException { - - final ExecutorService jibBuildExecutor = Executors.newCachedThreadPool(); - try { - submitPushToJib(baseImage, toRegistryImage(targetImageName, credential), additionalTags, jibBuildExecutor, logger); - } catch (RegistryException | CacheDirectoryCreationException | InvalidImageReferenceException | IOException | ExecutionException e) { - throw new IllegalStateException("Exception occurred while pushing the image: " + targetImageName + ", " + e.getMessage(), e); - } finally { - jibBuildExecutor.shutdown(); - jibBuildExecutor.awaitTermination(JIB_EXECUTOR_SHUTDOWN_TIMEOUT_SECONDS, TimeUnit.SECONDS); - } - } - - private static JibContainerBuilder populateContainerBuilderFromImageConfiguration(JibContainerBuilder containerBuilder, ImageConfiguration imageConfiguration) { - final Optional bic = - Optional.ofNullable(Objects.requireNonNull(imageConfiguration).getBuildConfiguration()); - bic.map(BuildConfiguration::getEntryPoint) - .map(Arguments::asStrings) - .ifPresent(containerBuilder::setEntrypoint); - bic.map(BuildConfiguration::getEnv) - .ifPresent(containerBuilder::setEnvironment); - bic.map(BuildConfiguration::getPorts).map(List::stream) - .map(s -> s.map(Integer::parseInt).map(Port::tcp)) - .map(s -> s.collect(Collectors.toSet())) - .ifPresent(containerBuilder::setExposedPorts); - bic.map(BuildConfiguration::getLabels) - .map(Map::entrySet) - .ifPresent(labels -> labels.forEach(l -> { - if (l.getKey() != null && l.getValue() != null) { - containerBuilder.addLabel(l.getKey(), l.getValue()); - } - })); - bic.map(BuildConfiguration::getCmd) - .map(Arguments::asStrings) - .ifPresent(containerBuilder::setProgramArguments); - bic.map(BuildConfiguration::getUser) - .ifPresent(containerBuilder::setUser); - bic.map(BuildConfiguration::getVolumes).map(List::stream) - .map(s -> s.map(AbsoluteUnixPath::get)) - .map(s -> s.collect(Collectors.toSet())) - .ifPresent(containerBuilder::setVolumes); - bic.map(BuildConfiguration::getWorkdir) - .filter(((Predicate) String::isEmpty).negate()) - .map(AbsoluteUnixPath::get) - .ifPresent(containerBuilder::setWorkingDirectory); - return containerBuilder; + } + + public static JibContainerBuilder containerFromImageConfiguration( + ImageConfiguration imageConfiguration, String pullRegistry, Credential pullRegistryCredential) throws InvalidImageReferenceException { + final JibContainerBuilder containerBuilder = Jib + .from(toRegistryImage(getBaseImage(imageConfiguration, pullRegistry), pullRegistryCredential)) + .setFormat(ImageFormat.Docker); + if (imageConfiguration.getBuildConfiguration() != null) { + final BuildConfiguration bic = imageConfiguration.getBuildConfiguration(); + Optional.ofNullable(bic.getEntryPoint()) + .map(Arguments::asStrings) + .ifPresent(containerBuilder::setEntrypoint); + Optional.ofNullable(bic.getEnv()) + .ifPresent(containerBuilder::setEnvironment); + Optional.ofNullable(bic.getPorts()).map(List::stream) + .map(s -> s.map(Integer::parseInt).map(Port::tcp)) + .map(s -> s.collect(Collectors.toSet())) + .ifPresent(containerBuilder::setExposedPorts); + Optional.ofNullable(bic.getLabels()) + .map(Map::entrySet) + .ifPresent(labels -> labels.forEach(l -> { + if (l.getKey() != null && l.getValue() != null) { + containerBuilder.addLabel(l.getKey(), l.getValue()); + } + })); + Optional.ofNullable(bic.getCmd()) + .map(Arguments::asStrings) + .ifPresent(containerBuilder::setProgramArguments); + Optional.ofNullable(bic.getUser()) + .ifPresent(containerBuilder::setUser); + Optional.ofNullable(bic.getVolumes()) + .map(List::stream) + .map(s -> s.map(AbsoluteUnixPath::get)) + .map(s -> s.collect(Collectors.toSet())) + .ifPresent(containerBuilder::setVolumes); + Optional.ofNullable(bic.getWorkdir()) + .filter(((Predicate) String::isEmpty).negate()) + .map(AbsoluteUnixPath::get) + .ifPresent(containerBuilder::setWorkingDirectory); } - - private static void submitPushToJib(TarImage baseImage, RegistryImage targetImage, List additionalTags, ExecutorService jibBuildExecutor, JibLogger logger) throws InterruptedException, ExecutionException, RegistryException, CacheDirectoryCreationException, IOException { - Jib - .from(baseImage) - .setCreationTime(Instant.now()) - .containerize(createJibContainerizer(targetImage, additionalTags, jibBuildExecutor, logger)); - logger.updateFinished(); + return containerBuilder; + } + + /** + * Push Image to registry using JIB. + * + * @param imageConfiguration ImageConfiguration. + * @param pushCredentials push credentials. + * @param tarArchive tar archive built during build goal. + * @param logger the JibLogger. + */ + public static void jibPush(ImageConfiguration imageConfiguration, Credential pushCredentials, File tarArchive, JibLogger logger) { + final String imageName = new ImageName(imageConfiguration.getName()).getFullName(); + final TarImage image = TarImage.at(tarArchive.toPath()); + final ExecutorService jibBuildExecutor = Executors.newCachedThreadPool(); + try { + final RegistryImage registryImage = toRegistryImage(imageName, pushCredentials); + final Containerizer containerizer = customizeContainerizer(Containerizer.to(registryImage), imageConfiguration, logger) + .setExecutorService(jibBuildExecutor); + Jib + .from(image) + .setCreationTime(Instant.now()) + .containerize(containerizer); + logger.updateFinished(); + } catch (Exception e) { + throw new JKubeException("Exception occurred while pushing the image: " + imageName + ", " + e.getMessage(), e); + } finally { + shutdownAndWait(jibBuildExecutor); } - - private static Containerizer createJibContainerizer(RegistryImage targetImage, List additionalTags, ExecutorService jibBuildExecutor, JibLogger logger) { - Containerizer containerizer = Containerizer.to(targetImage) - .setAllowInsecureRegistries(true) - .setExecutorService(jibBuildExecutor) - .addEventHandler(LogEvent.class, logger) - .addEventHandler(ProgressEvent.class, logger.progressEventHandler()); - if (additionalTags != null) { - additionalTags.forEach(containerizer::withAdditionalTag); - } - return containerizer; + } + + private static Containerizer customizeContainerizer(Containerizer c, ImageConfiguration imageConfiguration, JibLogger logger) { + c.setAllowInsecureRegistries(true); + c.addEventHandler(LogEvent.class, logger); + c.addEventHandler(ProgressEvent.class, logger.progressEventHandler()); + if (imageConfiguration.getBuildConfiguration().getTags() != null) { + imageConfiguration.getBuildConfiguration().getTags().forEach(c::withAdditionalTag); } + return c; + } - private static RegistryImage toRegistryImage(String imageReference, Credential credential) throws InvalidImageReferenceException { - RegistryImage registryImage = RegistryImage.named(imageReference); - if (credential != null && !credential.getUsername().isEmpty() && !credential.getPassword().isEmpty()) { - registryImage.addCredential(credential.getUsername(), credential.getPassword()); - } - return registryImage; + private static RegistryImage toRegistryImage(String imageReference, Credential credential) throws InvalidImageReferenceException { + RegistryImage registryImage = RegistryImage.named(imageReference); + if (credential != null && !credential.getUsername().isEmpty() && !credential.getPassword().isEmpty()) { + registryImage.addCredential(credential.getUsername(), credential.getPassword()); } - - public static String getBaseImage(ImageConfiguration imageConfiguration, String optionalRegistry) { - String baseImage = Optional.ofNullable(imageConfiguration) - .map(ImageConfiguration::getBuildConfiguration) - .map(BuildConfiguration::getFrom) - .filter(((Predicate) String::isEmpty).negate()) - .orElse(BUSYBOX); - return new ImageName(baseImage).getFullName(optionalRegistry); + return registryImage; + } + + public static String getBaseImage(ImageConfiguration imageConfiguration, String optionalRegistry) { + String baseImage = Optional.ofNullable(imageConfiguration) + .map(ImageConfiguration::getBuildConfiguration) + .map(BuildConfiguration::getFrom) + .filter(((Predicate) String::isEmpty).negate()) + .orElse(BUSYBOX); + return new ImageName(baseImage).getFullName(optionalRegistry); + } + + public static List layers(BuildDirs buildDirs, Map> layers) { + final List fileEntriesLayers = new ArrayList<>(); + for (Map.Entry> layer : layers.entrySet()) { + final FileEntriesLayer.Builder fel = FileEntriesLayer.builder(); + final String layerId = layer.getKey().getId(); + final Path outputPath; + if (StringUtils.isBlank(layerId)) { + outputPath = buildDirs.getOutputDirectory().toPath(); + } else { + fel.setName(layerId); + outputPath = new File(buildDirs.getOutputDirectory(), layerId).toPath(); + } + for (AssemblyFileEntry afe : layer.getValue()) { + final Path source = afe.getSource().toPath(); + final AbsoluteUnixPath target = AbsoluteUnixPath.get(StringUtils.prependIfMissing( + FilenameUtils.separatorsToUnix(outputPath.relativize(afe.getDest().toPath()).normalize().toString()), "/")); + final FilePermissions permissions = StringUtils.isNotBlank(afe.getFileMode()) ? + FilePermissions.fromOctalString(StringUtils.right(afe.getFileMode(), 3)) : + DEFAULT_FILE_PERMISSIONS_PROVIDER.get(source, target); + fel.addEntry(source, target, permissions); + } + fileEntriesLayers.add(fel.build()); } - - @Nonnull - public static List layers(BuildDirs buildDirs, Map> layers) { - final List fileEntriesLayers = new ArrayList<>(); - for (Map.Entry> layer : layers.entrySet()) { - final FileEntriesLayer.Builder fel = FileEntriesLayer.builder(); - final String layerId = layer.getKey().getId(); - final Path outputPath; - if (StringUtils.isBlank(layerId)) { - outputPath = buildDirs.getOutputDirectory().toPath(); - } else { - fel.setName(layerId); - outputPath = new File(buildDirs.getOutputDirectory(), layerId).toPath(); - } - for (AssemblyFileEntry afe : layer.getValue()) { - final Path source = afe.getSource().toPath(); - final AbsoluteUnixPath target = AbsoluteUnixPath.get(StringUtils.prependIfMissing( - FilenameUtils.separatorsToUnix(outputPath.relativize(afe.getDest().toPath()).normalize().toString()), "/")); - final FilePermissions permissions = StringUtils.isNotBlank(afe.getFileMode()) ? - FilePermissions.fromOctalString(StringUtils.right(afe.getFileMode(), 3)) : - DEFAULT_FILE_PERMISSIONS_PROVIDER.get(source, target); - fel.addEntry(source, target, permissions); - } - fileEntriesLayers.add(fel.build()); - } - return fileEntriesLayers; + return fileEntriesLayers; + } + + private static void shutdownAndWait(ExecutorService executorService) { + try { + executorService.shutdown(); + executorService.awaitTermination(JIB_EXECUTOR_SHUTDOWN_TIMEOUT_SECONDS, TimeUnit.SECONDS); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new JKubeException("Thread Interrupted", e); } - + } } diff --git a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java index 63c696ad9c..74d43c39ac 100644 --- a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java +++ b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java @@ -39,6 +39,7 @@ import org.eclipse.jkube.kit.common.AssemblyFile; import org.eclipse.jkube.kit.common.AssemblyFileEntry; import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.config.image.ImageConfiguration; @@ -58,6 +59,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; import static org.eclipse.jkube.kit.service.jib.JibServiceUtil.containerFromImageConfiguration; import static org.mockito.Answers.RETURNS_SELF; import static org.mockito.ArgumentMatchers.any; @@ -115,18 +117,6 @@ void testContainerFromImageConfiguration() throws Exception { } - @Test - void testGetFullImageNameWithDefaultTag() { - assertThat(JibServiceUtil.getFullImageName(getSampleImageConfiguration(), null)) - .isEqualTo("test/test-project:latest"); - } - - @Test - void testGetFullImageNameWithProvidedTag() { - assertThat(JibServiceUtil.getFullImageName(getSampleImageConfiguration(), "0.0.1")) - .isEqualTo("test/test-project:0.0.1"); - } - @Test void layers_withEmptyLayers_shouldReturnEmpty() { // When @@ -215,9 +205,9 @@ void buildContainer_whenBuildFailure_thenThrowException() throws InterruptedExce when(jibContainerBuilder.containerize(containerizer)).thenThrow(new RegistryException("Unable to pull base image")); // When - assertThatIllegalStateException() - .isThrownBy(() -> JibServiceUtil.buildContainer(jibContainerBuilder, tarImage, jibLogger)) - .withMessageContaining("Unable to pull base image"); + assertThatThrownBy(() -> JibServiceUtil.buildContainer(jibContainerBuilder, tarImage, jibLogger)) + .isInstanceOf(JKubeException.class) + .hasMessage("Unable to build the image tarball: Unable to pull base image"); // Then verify(containerizer).setAllowInsecureRegistries(true); @@ -240,11 +230,10 @@ void jibPush_whenPushFailed_thenThrowException() throws CacheDirectoryCreationEx ImageConfiguration imageConfiguration = getSampleImageConfiguration(); Credential credential = Credential.from("testuser", "secret"); File tarArchive = new File("docker-build.tar"); - // When + Then - assertThatIllegalStateException() - .isThrownBy(() -> JibServiceUtil.jibPush(imageConfiguration, credential, tarArchive, jibLogger)) - .withMessage("Exception occurred while pushing the image: test/test-project:latest, Unauthorized"); + assertThatThrownBy(() -> JibServiceUtil.jibPush(imageConfiguration, credential, tarArchive, jibLogger)) + .isInstanceOf(JKubeException.class) + .hasMessage("Exception occurred while pushing the image: test/test-project:latest, Unauthorized"); } } diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildService.java index c7ee9a4652..e80bd83285 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildService.java @@ -105,8 +105,6 @@ public void buildSingleImage(ImageConfiguration imageConfig) throws JKubeService JibServiceUtil.buildContainer(containerBuilder, TarImage.at(dockerTarArchive.toPath()).named(imageConfig.getName()), jibLogger); kitLogger.info(" %s successfully built", dockerTarArchive.getAbsolutePath()); - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); } catch (Exception ex) { throw new JKubeServiceException("Error when building JIB image", ex); } From f93b33ba5bb4be31e70e3911eaeb908be895740f Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Thu, 16 May 2024 11:54:24 +0200 Subject: [PATCH 124/289] refactor: further changes in JibBuildService to support multiplatform build (#3061) Signed-off-by: Marc Nuri --- .../service/kubernetes/JibBuildService.java | 45 ++++++++++--------- .../kubernetes/JibBuildServiceTest.java | 30 ++++++++----- 2 files changed, 43 insertions(+), 32 deletions(-) diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildService.java index e80bd83285..1efe34d86e 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildService.java @@ -78,22 +78,22 @@ public boolean isApplicable() { } @Override - public void buildSingleImage(ImageConfiguration imageConfig) throws JKubeServiceException { + public void buildSingleImage(ImageConfiguration imageConfiguration) throws JKubeServiceException { try { kitLogger.info("[[B]]JIB[[B]] image build started"); - if (imageConfig.getBuildConfiguration().isDockerFileMode()) { + if (imageConfiguration.getBuildConfiguration().isDockerFileMode()) { throw new JKubeServiceException("Dockerfile mode is not supported with JIB build strategy"); } - prependRegistry(imageConfig, getPushRegistry(imageConfig, configuration.getRegistryConfig())); - BuildDirs buildDirs = new BuildDirs(imageConfig.getName(), configuration); - String pullRegistry = getPullRegistry(imageConfig, configuration.getRegistryConfig()); + final ImageConfiguration imageConfigToBuild = prependPushRegistry(imageConfiguration, configuration.getRegistryConfig()); + final BuildDirs buildDirs = new BuildDirs(imageConfigToBuild.getName(), configuration); + final String pullRegistry = getPullRegistry(imageConfigToBuild, configuration.getRegistryConfig()); final Credential pullRegistryCredential = getRegistryCredentials( configuration.getRegistryConfig(), false, pullRegistry); - final JibContainerBuilder containerBuilder = containerFromImageConfiguration(imageConfig, pullRegistry, pullRegistryCredential); + final JibContainerBuilder containerBuilder = containerFromImageConfiguration(imageConfigToBuild, pullRegistry, pullRegistryCredential); final Map> layers = AssemblyManager.getInstance() .copyFilesToFinalTarballDirectory(configuration, buildDirs, - AssemblyManager.getAssemblyConfiguration(imageConfig.getBuildConfiguration(), configuration)); + AssemblyManager.getAssemblyConfiguration(imageConfigToBuild.getBuildConfiguration(), configuration)); JibServiceUtil.layers(buildDirs, layers).forEach(containerBuilder::addFileEntriesLayer); // TODO: Improve Assembly Manager so that the effective assemblyFileEntries computed can be properly shared @@ -101,9 +101,9 @@ public void buildSingleImage(ImageConfiguration imageConfig) throws JKubeService // files should be added using the AssemblyFileEntry list. AssemblyManager, should provide // a common way to achieve this so that both the tar builder and any other builder could get a hold of // archive customizers, file entries, etc. - File dockerTarArchive = getAssemblyTarArchive(imageConfig, configuration, kitLogger); + File dockerTarArchive = getAssemblyTarArchive(imageConfigToBuild, configuration, kitLogger); JibServiceUtil.buildContainer(containerBuilder, - TarImage.at(dockerTarArchive.toPath()).named(imageConfig.getName()), jibLogger); + TarImage.at(dockerTarArchive.toPath()).named(imageConfigToBuild.getName()), jibLogger); kitLogger.info(" %s successfully built", dockerTarArchive.getAbsolutePath()); } catch (Exception ex) { throw new JKubeServiceException("Error when building JIB image", ex); @@ -113,14 +113,13 @@ public void buildSingleImage(ImageConfiguration imageConfig) throws JKubeService @Override protected void pushSingleImage(ImageConfiguration imageConfiguration, int retries, RegistryConfig registryConfig, boolean skipTag) throws JKubeServiceException { try { - final String pushRegistry = getPushRegistry(imageConfiguration, registryConfig); - prependRegistry(imageConfiguration, pushRegistry); - kitLogger.info("This push refers to: %s", imageConfiguration.getName()); - kitLogger.info("Pushing image: %s", new ImageName(imageConfiguration.getName()).getFullName()); + final ImageConfiguration imageConfigToPush = prependPushRegistry(imageConfiguration, registryConfig); + kitLogger.info("This push refers to: %s", imageConfigToPush.getName()); + kitLogger.info("Pushing image: %s", new ImageName(imageConfigToPush.getName()).getFullName()); JibServiceUtil.jibPush( - imageConfiguration, - getRegistryCredentials(registryConfig, true, pushRegistry), - getBuildTarArchive(imageConfiguration, configuration), + imageConfigToPush, + getRegistryCredentials(registryConfig, true, getPushRegistry(imageConfigToPush, registryConfig)), + getBuildTarArchive(imageConfigToPush, configuration), jibLogger ); } catch (Exception ex) { @@ -133,13 +132,15 @@ public void postProcess() { // No post processing required } - static ImageConfiguration prependRegistry(ImageConfiguration imageConfiguration, String registry) { - ImageName imageName = new ImageName(imageConfiguration.getName()); - if (!imageName.hasRegistry() && registry != null) { - imageConfiguration.setName(imageName.getFullName(registry)); - imageConfiguration.setRegistry(registry); + static ImageConfiguration prependPushRegistry(ImageConfiguration imageConfiguration, RegistryConfig registryConfig) { + final ImageConfiguration.ImageConfigurationBuilder icBuilder = imageConfiguration.toBuilder(); + final ImageName imageName = new ImageName(imageConfiguration.getName()); + final String pushRegistry = getPushRegistry(imageConfiguration, registryConfig); + if (!imageName.hasRegistry() && pushRegistry != null) { + icBuilder.name(imageName.getFullName(pushRegistry)); + icBuilder.registry(pushRegistry); } - return imageConfiguration; + return icBuilder.build(); } static File getAssemblyTarArchive(ImageConfiguration imageConfig, JKubeConfiguration configuration, KitLogger log) throws IOException { diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildServiceTest.java index eac5fcf939..fa3b633336 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildServiceTest.java @@ -19,6 +19,7 @@ import java.nio.file.Path; import java.util.Collections; +import com.google.cloud.tools.jib.api.JibContainerBuilder; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; @@ -40,6 +41,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; @@ -51,6 +53,7 @@ import static org.mockito.Mockito.when; class JibBuildServiceTest { + @TempDir Path temporaryFolder; @@ -80,8 +83,10 @@ void setUp() { .authConfig(Collections.emptyMap()) .settings(Collections.emptyList()) .build(); - jibServiceUtilMockedStatic.when(() -> JibServiceUtil.getBaseImage(eq(imageConfiguration), isNull())) + jibServiceUtilMockedStatic.when(() -> JibServiceUtil.getBaseImage(argThat(ic -> ic.getBuild().getFrom().equals("busybox")), isNull())) .thenReturn("busybox"); + jibServiceUtilMockedStatic.when(() -> JibServiceUtil.containerFromImageConfiguration(any(), any(), any())) + .thenReturn(mock(JibContainerBuilder.class, RETURNS_DEEP_STUBS)); } @AfterEach @@ -166,15 +171,6 @@ void getAssemblyTarArchive() throws IOException { .resolve("tmp").resolve("docker-build.tar").toFile()); } - @Test - void prependRegistry_prependsRegistryToTargetImageName() { - // When - JibBuildService.prependRegistry(imageConfiguration, "quay.io"); - // Then - assertThat(imageConfiguration).isNotNull() - .hasFieldOrPropertyWithValue("name", "quay.io/test/testimage:0.0.1"); - } - @Test void pushWithNoConfigurations() throws Exception { // When @@ -252,6 +248,20 @@ void build_shouldCallPluginServiceAddFiles() throws JKubeServiceException { verify(mockedServiceHub.getPluginManager().resolvePluginService(), times(1)).addExtraFiles(); } + @Test + void build_withRegistryConfig_shouldPrependRegistryToImageName() throws JKubeServiceException { + // Given + when(mockedServiceHub.getConfiguration().getRegistryConfig()) + .thenReturn(RegistryConfig.builder().registry("quay.io").settings(Collections.emptyList()).build()); + when(mockedServiceHub.getConfiguration().getProject()) + .thenReturn(JavaProject.builder().baseDirectory(temporaryFolder.toFile()).build()); + // When + new JibBuildService(mockedServiceHub).build(imageConfiguration); + // Then + jibServiceUtilMockedStatic.verify(() -> JibServiceUtil + .containerFromImageConfiguration(argThat(ic -> ic.getName().equals("quay.io/test/testimage:0.0.1")), any(), any()), times(1)); + } + private static JKubeConfiguration createJKubeConfiguration(File projectBaseDir) { return JKubeConfiguration.builder() .outputDirectory("target") From 91cef562389e0a29f1c6c4ed3c700179c0e26640 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Thu, 16 May 2024 18:30:04 +0200 Subject: [PATCH 125/289] refactor: rename JibBuildService to JibImageBuildService Allows for a new JibService generic service class that wraps JibServiceUtil Signed-off-by: Marc Nuri --- ...Service.java => JibImageBuildService.java} | 11 ++++++-- .../resources/META-INF/jkube/build-service | 4 +-- .../JKubeServiceHubBuildServiceTest.java | 6 ++-- .../config/service/JKubeServiceHubTest.java | 4 +-- ...uildServiceGetApplicableRegistryTest.java} | 18 ++++++------ ... JibImageBuildServiceIntegrationTest.java} | 8 +++--- ...est.java => JibImageBuildServiceTest.java} | 28 +++++++++---------- 7 files changed, 42 insertions(+), 37 deletions(-) rename jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/{JibBuildService.java => JibImageBuildService.java} (96%) rename jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/{JibBuildServiceGetApplicableRegistryTest.java => JibImageBuildServiceGetApplicableRegistryTest.java} (89%) rename jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/{JibBuildServiceBuildIntegrationTest.java => JibImageBuildServiceIntegrationTest.java} (97%) rename jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/{JibBuildServiceTest.java => JibImageBuildServiceTest.java} (88%) diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java similarity index 96% rename from jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildService.java rename to jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java index 1efe34d86e..36d36e305f 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java @@ -48,7 +48,12 @@ import static org.eclipse.jkube.kit.service.jib.JibServiceUtil.containerFromImageConfiguration; import static org.eclipse.jkube.kit.service.jib.JibServiceUtil.getBaseImage; -public class JibBuildService extends AbstractImageBuildService { +/** + * AbstractImageBuildService implementation for JIB build strategy. + *

+ * Relies on Jib to perform the build and push operations. + */ +public class JibImageBuildService extends AbstractImageBuildService { private final KitLogger kitLogger; private final JibLogger jibLogger; @@ -56,12 +61,12 @@ public class JibBuildService extends AbstractImageBuildService { private final BuildServiceConfig buildServiceConfig; private final JKubeConfiguration configuration; - public JibBuildService(JKubeServiceHub jKubeServiceHub) { + public JibImageBuildService(JKubeServiceHub jKubeServiceHub) { this(jKubeServiceHub, new JibLogger(Objects.requireNonNull(jKubeServiceHub.getLog(), "Log is required"))); } - public JibBuildService(JKubeServiceHub jKubeServiceHub, JibLogger jibLogger) { + public JibImageBuildService(JKubeServiceHub jKubeServiceHub, JibLogger jibLogger) { super(jKubeServiceHub); this.jibLogger = jibLogger; kitLogger = jKubeServiceHub.getLog(); diff --git a/jkube-kit/config/service/src/main/resources/META-INF/jkube/build-service b/jkube-kit/config/service/src/main/resources/META-INF/jkube/build-service index cb5f809098..61f01de473 100644 --- a/jkube-kit/config/service/src/main/resources/META-INF/jkube/build-service +++ b/jkube-kit/config/service/src/main/resources/META-INF/jkube/build-service @@ -1,4 +1,4 @@ -org.eclipse.jkube.kit.config.service.kubernetes.JibBuildService,100 +org.eclipse.jkube.kit.config.service.kubernetes.JibImageBuildService,100 org.eclipse.jkube.kit.config.service.kubernetes.BuildPackBuildService,110 org.eclipse.jkube.kit.config.service.openshift.OpenshiftBuildService,200 -org.eclipse.jkube.kit.config.service.kubernetes.DockerBuildService,9999 \ No newline at end of file +org.eclipse.jkube.kit.config.service.kubernetes.DockerBuildService,9999 diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubBuildServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubBuildServiceTest.java index 9df6805012..d98f2d47ae 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubBuildServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubBuildServiceTest.java @@ -23,7 +23,7 @@ import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.eclipse.jkube.kit.config.service.kubernetes.BuildPackBuildService; import org.eclipse.jkube.kit.config.service.kubernetes.DockerBuildService; -import org.eclipse.jkube.kit.config.service.kubernetes.JibBuildService; +import org.eclipse.jkube.kit.config.service.kubernetes.JibImageBuildService; import org.eclipse.jkube.kit.config.service.openshift.OpenshiftBuildService; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.params.ParameterizedTest; @@ -42,12 +42,12 @@ static Stream data() { arguments(RuntimeMode.KUBERNETES, null, DockerBuildService.class), arguments(RuntimeMode.KUBERNETES, JKubeBuildStrategy.docker, DockerBuildService.class), arguments(RuntimeMode.KUBERNETES, JKubeBuildStrategy.s2i, DockerBuildService.class), - arguments(RuntimeMode.KUBERNETES, JKubeBuildStrategy.jib, JibBuildService.class), + arguments(RuntimeMode.KUBERNETES, JKubeBuildStrategy.jib, JibImageBuildService.class), arguments(RuntimeMode.KUBERNETES, JKubeBuildStrategy.buildpacks, BuildPackBuildService.class), arguments(RuntimeMode.OPENSHIFT, null, OpenshiftBuildService.class), arguments(RuntimeMode.OPENSHIFT, JKubeBuildStrategy.docker, OpenshiftBuildService.class), arguments(RuntimeMode.OPENSHIFT, JKubeBuildStrategy.s2i, OpenshiftBuildService.class), - arguments(RuntimeMode.OPENSHIFT, JKubeBuildStrategy.jib, JibBuildService.class)); + arguments(RuntimeMode.OPENSHIFT, JKubeBuildStrategy.jib, JibImageBuildService.class)); } @DisplayName("get build service") diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubTest.java index c061727b71..b1f065524c 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubTest.java @@ -23,7 +23,7 @@ import org.eclipse.jkube.kit.config.resource.ResourceService; import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.eclipse.jkube.kit.config.service.kubernetes.DockerBuildService; -import org.eclipse.jkube.kit.config.service.kubernetes.JibBuildService; +import org.eclipse.jkube.kit.config.service.kubernetes.JibImageBuildService; import org.eclipse.jkube.kit.config.service.kubernetes.KubernetesUndeployService; import org.eclipse.jkube.kit.config.service.openshift.OpenshiftBuildService; import org.eclipse.jkube.kit.config.service.openshift.OpenshiftUndeployService; @@ -148,7 +148,7 @@ void getJibBuildServiceInKubernetes() { // Then assertThat(buildService) .isNotNull() - .isInstanceOf(JibBuildService.class); + .isInstanceOf(JibImageBuildService.class); } } diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildServiceGetApplicableRegistryTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceGetApplicableRegistryTest.java similarity index 89% rename from jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildServiceGetApplicableRegistryTest.java rename to jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceGetApplicableRegistryTest.java index a9c33d75b0..25adf988b1 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildServiceGetApplicableRegistryTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceGetApplicableRegistryTest.java @@ -20,7 +20,7 @@ import org.junit.jupiter.params.provider.CsvSource; import static org.assertj.core.api.Assertions.assertThat; -class JibBuildServiceGetApplicableRegistryTest { +class JibImageBuildServiceGetApplicableRegistryTest { @ParameterizedTest(name = "pull {0}, when no registry from any source, then pull registry {1}") @CsvSource({ "word:word,", @@ -39,7 +39,7 @@ void pull_whenRegistryNotPresentFromAnySource_thenReturnRegistryFromImageName(St RegistryConfig registryConfig = RegistryConfig.builder().build(); // When - String pullRegistry = JibBuildService.getPullRegistry(imageConfiguration, registryConfig); + String pullRegistry = JibImageBuildService.getPullRegistry(imageConfiguration, registryConfig); // Then assertThat(pullRegistry).isEqualTo(expectedPullRegistry); @@ -59,7 +59,7 @@ void pull_whenRegistryPresentInBothImageNameAndRegistryConfig_thenReturnRegistry RegistryConfig registryConfig = RegistryConfig.builder().registry("quay.io").build(); // When - String pullRegistry = JibBuildService.getPullRegistry(imageConfiguration, registryConfig); + String pullRegistry = JibImageBuildService.getPullRegistry(imageConfiguration, registryConfig); // Then assertThat(pullRegistry).isEqualTo(expectedPullRegistry); @@ -77,7 +77,7 @@ void pull_whenRegistryFromRegistryConfig_thenReturnRegistryFromRegistryConfig(St RegistryConfig registryConfig = RegistryConfig.builder().registry("quay.io").build(); // When - String pullRegistry = JibBuildService.getPullRegistry(imageConfiguration, registryConfig); + String pullRegistry = JibImageBuildService.getPullRegistry(imageConfiguration, registryConfig); // Then assertThat(pullRegistry).isEqualTo(expectedPullRegistry); @@ -101,7 +101,7 @@ void push_whenRegistryNotPresentFromAnySource_thenReturnRegistryFromImageName(St RegistryConfig registryConfig = RegistryConfig.builder().build(); // When - String pullRegistry = JibBuildService.getPushRegistry(imageConfiguration, registryConfig); + String pullRegistry = JibImageBuildService.getPushRegistry(imageConfiguration, registryConfig); // Then assertThat(pullRegistry).isEqualTo(expectedPushRegistry); @@ -121,7 +121,7 @@ void push_whenRegistryInBothImageNameAndRegistryConfig_thenUseRegistryFromImageN RegistryConfig registryConfig = RegistryConfig.builder().registry("quay.io").build(); // When - String pullRegistry = JibBuildService.getPushRegistry(imageConfiguration, registryConfig); + String pullRegistry = JibImageBuildService.getPushRegistry(imageConfiguration, registryConfig); // Then assertThat(pullRegistry).isEqualTo(expectedPushRegistry); @@ -141,7 +141,7 @@ void push_whenRegistryPresentInBothImageNameAndImageConfig_thenUseRegistryFromIm RegistryConfig registryConfig = RegistryConfig.builder().build(); // When - String pullRegistry = JibBuildService.getPushRegistry(imageConfiguration, registryConfig); + String pullRegistry = JibImageBuildService.getPushRegistry(imageConfiguration, registryConfig); // Then assertThat(pullRegistry).isEqualTo(expectedPushRegistry); @@ -159,7 +159,7 @@ void push_whenRegistryFromImageConfig_thenReturnRegistryFromImageConfig(String i RegistryConfig registryConfig = RegistryConfig.builder().build(); // When - String pullRegistry = JibBuildService.getPushRegistry(imageConfiguration, registryConfig); + String pullRegistry = JibImageBuildService.getPushRegistry(imageConfiguration, registryConfig); // Then assertThat(pullRegistry).isEqualTo(expectedPushRegistry); @@ -177,7 +177,7 @@ void push_whenRegistryFromRegistryConfig_thenReturnRegistryFromRegistryConfig(St RegistryConfig registryConfig = RegistryConfig.builder().registry("quay.io").build(); // When - String pullRegistry = JibBuildService.getPushRegistry(imageConfiguration, registryConfig); + String pullRegistry = JibImageBuildService.getPushRegistry(imageConfiguration, registryConfig); // Then assertThat(pullRegistry).isEqualTo(expectedPushRegistry); diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildServiceBuildIntegrationTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceIntegrationTest.java similarity index 97% rename from jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildServiceBuildIntegrationTest.java rename to jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceIntegrationTest.java index 77bcff78b1..8f3db63bf9 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildServiceBuildIntegrationTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceIntegrationTest.java @@ -59,13 +59,13 @@ import static org.mockito.Mockito.verify; @SuppressWarnings({"unused"}) -class JibBuildServiceBuildIntegrationTest { +class JibImageBuildServiceIntegrationTest { private File projectRoot; private Path targetDirectory; private Path dockerOutput; private JKubeServiceHub hub; - private JibBuildService jibBuildService; + private JibImageBuildService jibBuildService; @BeforeEach void setUp(@TempDir Path projectRoot) throws IOException { @@ -88,7 +88,7 @@ void setUp(@TempDir Path projectRoot) throws IOException { .registryConfig(RegistryConfig.builder().settings(Collections.emptyList()).build()) .build()) .build(); - jibBuildService = new JibBuildService(hub); + jibBuildService = new JibImageBuildService(hub); } @Test @@ -196,7 +196,7 @@ void setUp() { .build()) .build(); out = spy(System.out); - jibBuildService = new JibBuildService(hub, new JibLogger(hub.getLog(), out)); + jibBuildService = new JibImageBuildService(hub, new JibLogger(hub.getLog(), out)); } @Test diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java similarity index 88% rename from jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildServiceTest.java rename to jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java index fa3b633336..10e84072f3 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibBuildServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java @@ -52,7 +52,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -class JibBuildServiceTest { +class JibImageBuildServiceTest { @TempDir Path temporaryFolder; @@ -97,7 +97,7 @@ void close() { @Test void isApplicable_withNoBuildStrategy_shouldReturnFalse() { // When - final boolean result = new JibBuildService(mockedServiceHub).isApplicable(); + final boolean result = new JibImageBuildService(mockedServiceHub).isApplicable(); // Then assertThat(result).isFalse(); } @@ -107,7 +107,7 @@ void isApplicable_withJibBuildStrategy_shouldReturnTrue() { // Given when(mockedServiceHub.getBuildServiceConfig().getJKubeBuildStrategy()).thenReturn(JKubeBuildStrategy.jib); // When - final boolean result = new JibBuildService(mockedServiceHub).isApplicable(); + final boolean result = new JibImageBuildService(mockedServiceHub).isApplicable(); // Then assertThat(result).isTrue(); } @@ -121,7 +121,7 @@ void getRegistryCredentialsForPush() throws IOException { .passwordDecryptionMethod(s -> s) .build(); // When - Credential credential = new JibBuildService(mockedServiceHub) + Credential credential = new JibImageBuildService(mockedServiceHub) .getRegistryCredentials(registryConfig, true, "test.example.org"); // Then assertThat(credential).isNotNull() @@ -138,7 +138,7 @@ void getRegistryCredentialsForPull() throws IOException { .passwordDecryptionMethod(s -> s) .build(); // When - Credential credential = new JibBuildService(mockedServiceHub) + Credential credential = new JibImageBuildService(mockedServiceHub) .getRegistryCredentials(registryConfig, false, "test.example.org"); // Then assertThat(credential).isNotNull() @@ -151,7 +151,7 @@ void getBuildTarArchive() throws IOException { // Given File projectBaseDir = Files.createDirectory(temporaryFolder.resolve("test")).toFile(); // When - File tarArchive = JibBuildService.getBuildTarArchive(imageConfiguration, createJKubeConfiguration(projectBaseDir)); + File tarArchive = JibImageBuildService.getBuildTarArchive(imageConfiguration, createJKubeConfiguration(projectBaseDir)); // Then assertThat(tarArchive).isNotNull() .isEqualTo(projectBaseDir.toPath().resolve("target").resolve("test").resolve("testimage").resolve("0.0.1") @@ -164,7 +164,7 @@ void getAssemblyTarArchive() throws IOException { // Given File projectBaseDir = Files.createDirectory(temporaryFolder.resolve("test")).toFile(); // When - File tarArchive = JibBuildService.getAssemblyTarArchive(imageConfiguration, createJKubeConfiguration(projectBaseDir), logger); + File tarArchive = JibImageBuildService.getAssemblyTarArchive(imageConfiguration, createJKubeConfiguration(projectBaseDir), logger); // Then assertThat(tarArchive).isNotNull() .isEqualTo(projectBaseDir.toPath().resolve("target").resolve("test").resolve("testimage").resolve("0.0.1") @@ -174,7 +174,7 @@ void getAssemblyTarArchive() throws IOException { @Test void pushWithNoConfigurations() throws Exception { // When - new JibBuildService(mockedServiceHub).push(Collections.emptyList(), 1, null, false); + new JibImageBuildService(mockedServiceHub).push(Collections.emptyList(), 1, null, false); // Then jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.jibPush(any(), any(), any(), any()), times(0)); } @@ -187,7 +187,7 @@ void pushWithConfiguration() throws Exception { .passwordDecryptionMethod(s -> s) .build(); // When - new JibBuildService(mockedServiceHub).push(Collections.singletonList(imageConfiguration), 1, registryConfig, false); + new JibImageBuildService(mockedServiceHub).push(Collections.singletonList(imageConfiguration), 1, registryConfig, false); // Then jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.jibPush(eq(imageConfiguration), eq(Credential.from("testuserpush", "testpass")), any(), any()), times(1)); } @@ -203,7 +203,7 @@ void push_withImageBuildConfigurationSkipTrue_shouldNotPushImage() throws JKubeS .build()) .build(); // When - new JibBuildService(mockedServiceHub).push(Collections.singletonList(imageConfiguration), 1, registryConfig, false); + new JibImageBuildService(mockedServiceHub).push(Collections.singletonList(imageConfiguration), 1, registryConfig, false); // Then jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.jibPush(any(), any(), any(), any()), times(0)); } @@ -215,7 +215,7 @@ void build_withImageMissingBuildConfiguration_shouldNotBuildImage() throws JKube .name("test/foo:latest") .build(); // When - new JibBuildService(mockedServiceHub).build(imageConfiguration); + new JibImageBuildService(mockedServiceHub).build(imageConfiguration); // Then jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.buildContainer(any(), any(), any()), times(0)); } @@ -231,7 +231,7 @@ void build_withImageBuildConfigurationSkipTrue_shouldNotBuildImage() throws JKub .build()) .build(); // When - new JibBuildService(mockedServiceHub).build(imageConfiguration); + new JibImageBuildService(mockedServiceHub).build(imageConfiguration); // Then jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.buildContainer(any(), any(), any()), times(0)); } @@ -243,7 +243,7 @@ void build_shouldCallPluginServiceAddFiles() throws JKubeServiceException { .name("test/foo:latest") .build(); // When - new JibBuildService(mockedServiceHub).build(imageConfiguration); + new JibImageBuildService(mockedServiceHub).build(imageConfiguration); // Then verify(mockedServiceHub.getPluginManager().resolvePluginService(), times(1)).addExtraFiles(); } @@ -256,7 +256,7 @@ void build_withRegistryConfig_shouldPrependRegistryToImageName() throws JKubeSer when(mockedServiceHub.getConfiguration().getProject()) .thenReturn(JavaProject.builder().baseDirectory(temporaryFolder.toFile()).build()); // When - new JibBuildService(mockedServiceHub).build(imageConfiguration); + new JibImageBuildService(mockedServiceHub).build(imageConfiguration); // Then jibServiceUtilMockedStatic.verify(() -> JibServiceUtil .containerFromImageConfiguration(argThat(ic -> ic.getName().equals("quay.io/test/testimage:0.0.1")), any(), any()), times(1)); From 47c39d850dd6f614a4ad66625d82fec01247fa24 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Fri, 17 May 2024 06:46:56 +0200 Subject: [PATCH 126/289] refactor: introduce JKubeConfiguration#pushRegistryConfig settings Signed-off-by: Marc Nuri --- .../jkube/gradle/plugin/task/AbstractJKubeTask.java | 9 ++++++++- .../jkube/kit/build/service/docker/BuildService.java | 2 +- .../eclipse/jkube/kit/common/JKubeConfiguration.java | 3 ++- .../jkube/kit/common/JKubeConfigurationTest.java | 11 ++++++----- .../src/test/resources/jkube-configuration.json | 9 ++++++--- .../service/kubernetes/JibImageBuildService.java | 6 +++--- .../service/openshift/OpenshiftBuildService.java | 7 +++---- .../JibImageBuildServiceIntegrationTest.java | 5 +++-- .../service/kubernetes/JibImageBuildServiceTest.java | 2 +- .../OpenshiftBuildServiceIntegrationTest.java | 2 +- .../eclipse/jkube/kit/resource/helm/HelmService.java | 5 ++--- .../jkube/kit/resource/helm/HelmServiceTest.java | 2 +- .../jkube/kit/resource/helm/HelmServiceUploadIT.java | 2 +- .../maven/plugin/mojo/build/AbstractDockerMojo.java | 7 ++++++- .../maven/plugin/mojo/build/AbstractJKubeMojo.java | 8 +++++++- .../jkube/maven/plugin/mojo/build/PushMojo.java | 4 ---- .../maven/plugin/mojo/build/HelmPushMojoTest.java | 2 +- 17 files changed, 52 insertions(+), 34 deletions(-) diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java index 7656ba377a..e9e5d57c4c 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java @@ -127,13 +127,20 @@ protected JKubeServiceHub.JKubeServiceHubBuilder initJKubeServiceHubBuilder() { .reactorProjects(Collections.singletonList(kubernetesExtension.javaProject)) .sourceDirectory(kubernetesExtension.getBuildSourceDirectoryOrDefault()) .outputDirectory(kubernetesExtension.getBuildOutputDirectoryOrDefault()) - .registryConfig(RegistryConfig.builder() + .pullRegistryConfig(RegistryConfig.builder() .settings(Collections.emptyList()) .authConfig(kubernetesExtension.authConfig != null ? kubernetesExtension.authConfig.toMap() : null) .skipExtendedAuth(kubernetesExtension.getSkipExtendedAuth().getOrElse(false)) .passwordDecryptionMethod(s -> s) .registry(kubernetesExtension.getPullRegistryOrDefault()) .build()) + .pushRegistryConfig(RegistryConfig.builder() + .settings(Collections.emptyList()) + .authConfig(kubernetesExtension.authConfig != null ? kubernetesExtension.authConfig.toMap() : null) + .skipExtendedAuth(kubernetesExtension.getSkipExtendedAuth().getOrElse(false)) + .passwordDecryptionMethod(s -> s) + .registry(kubernetesExtension.getPushRegistryOrNull()) + .build()) .build()) .clusterAccess(clusterAccess) .offline(kubernetesExtension.getOfflineOrDefault()) diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java index ad0ed0c05f..8897cbe217 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java @@ -191,7 +191,7 @@ private void autoPullBaseImage(ImageConfiguration imageConfig, ImagePullManager } for (String fromImage : fromImages) { if (fromImage != null && !AssemblyManager.SCRATCH_IMAGE.equals(fromImage)) { - registryService.pullImageWithPolicy(fromImage, imagePullManager, configuration.getRegistryConfig(), buildConfig); + registryService.pullImageWithPolicy(fromImage, imagePullManager, configuration.getPullRegistryConfig(), buildConfig); } } } diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/JKubeConfiguration.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/JKubeConfiguration.java index 6674cce26b..975d3ae50d 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/JKubeConfiguration.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/JKubeConfiguration.java @@ -41,7 +41,8 @@ public class JKubeConfiguration implements Serializable { private String sourceDirectory; private String outputDirectory; private Map buildArgs; - private RegistryConfig registryConfig; + private RegistryConfig pullRegistryConfig; + private RegistryConfig pushRegistryConfig; private List reactorProjects; public File getBasedir() { diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/JKubeConfigurationTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/JKubeConfigurationTest.java index d5c2e06380..f2ccd6fb35 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/JKubeConfigurationTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/JKubeConfigurationTest.java @@ -100,9 +100,8 @@ void builder() { .sourceDirectory("src/main/jkube") .outputDirectory("target") .buildArgs(Collections.singletonMap("foo", "bar")) - .registryConfig(RegistryConfig.builder() - .registry("r.example.com") - .build()); + .pullRegistryConfig(RegistryConfig.builder().registry("pull.example.com").build()) + .pushRegistryConfig(RegistryConfig.builder().registry("push.example.com").build()); // When JKubeConfiguration jKubeConfiguration = builder.build(); @@ -113,7 +112,8 @@ void builder() { .hasFieldOrPropertyWithValue("sourceDirectory", "src/main/jkube") .hasFieldOrPropertyWithValue("outputDirectory", "target") .hasFieldOrPropertyWithValue("buildArgs", Collections.singletonMap("foo", "bar")) - .hasFieldOrPropertyWithValue("registryConfig.registry", "r.example.com"); + .hasFieldOrPropertyWithValue("pullRegistryConfig.registry", "pull.example.com") + .hasFieldOrPropertyWithValue("pushRegistryConfig.registry", "push.example.com"); } /** @@ -134,7 +134,8 @@ void rawDeserialization() throws IOException { .hasFieldOrPropertyWithValue("sourceDirectory", "src") .hasFieldOrPropertyWithValue("outputDirectory", "target") .hasFieldOrPropertyWithValue("buildArgs.http_proxy", "127.0.0.1:8001") - .hasFieldOrPropertyWithValue("registryConfig.registry", "the-registry") + .hasFieldOrPropertyWithValue("pullRegistryConfig.registry", "the-pull-registry") + .hasFieldOrPropertyWithValue("pushRegistryConfig.registry", "the-push-registry") .extracting(JKubeConfiguration::getReactorProjects).asList().isEmpty(); } } diff --git a/jkube-kit/common/src/test/resources/jkube-configuration.json b/jkube-kit/common/src/test/resources/jkube-configuration.json index 32f71ce914..2d9b9ec3a5 100644 --- a/jkube-kit/common/src/test/resources/jkube-configuration.json +++ b/jkube-kit/common/src/test/resources/jkube-configuration.json @@ -4,8 +4,11 @@ "buildArgs": { "http_proxy": "127.0.0.1:8001" }, - "registryConfig": { - "registry": "the-registry" + "pullRegistryConfig": { + "registry": "the-pull-registry" + }, + "pushRegistryConfig": { + "registry": "the-push-registry" }, "reactorProjects": [] -} \ No newline at end of file +} diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java index 36d36e305f..9e2dc77c3e 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java @@ -89,11 +89,11 @@ public void buildSingleImage(ImageConfiguration imageConfiguration) throws JKube if (imageConfiguration.getBuildConfiguration().isDockerFileMode()) { throw new JKubeServiceException("Dockerfile mode is not supported with JIB build strategy"); } - final ImageConfiguration imageConfigToBuild = prependPushRegistry(imageConfiguration, configuration.getRegistryConfig()); + final ImageConfiguration imageConfigToBuild = prependPushRegistry(imageConfiguration, configuration.getPullRegistryConfig()); final BuildDirs buildDirs = new BuildDirs(imageConfigToBuild.getName(), configuration); - final String pullRegistry = getPullRegistry(imageConfigToBuild, configuration.getRegistryConfig()); + final String pullRegistry = getPullRegistry(imageConfigToBuild, configuration.getPullRegistryConfig()); final Credential pullRegistryCredential = getRegistryCredentials( - configuration.getRegistryConfig(), false, pullRegistry); + configuration.getPullRegistryConfig(), false, pullRegistry); final JibContainerBuilder containerBuilder = containerFromImageConfiguration(imageConfigToBuild, pullRegistry, pullRegistryCredential); final Map> layers = AssemblyManager.getInstance() 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 dcc3282df6..dfea83f7d6 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 @@ -39,7 +39,6 @@ import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; -import org.eclipse.jkube.kit.common.BuildRecreateMode; import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.eclipse.jkube.kit.config.service.AbstractImageBuildService; import org.eclipse.jkube.kit.config.service.BuildServiceConfig; @@ -131,7 +130,7 @@ public void buildSingleImage(ImageConfiguration imageConfig) throws JKubeService initClient(); String buildName = null; try { - final ImageConfiguration applicableImageConfig = getApplicableImageConfiguration(imageConfig, jKubeConfiguration.getRegistryConfig()); + final ImageConfiguration applicableImageConfig = getApplicableImageConfiguration(imageConfig, jKubeConfiguration.getPullRegistryConfig()); ImageName imageName = new ImageName(applicableImageConfig.getName()); File dockerTar = createBuildArchive(jKubeServiceHub, applicableImageConfig); @@ -343,10 +342,10 @@ private boolean checkOrCreatePullSecret(OpenShiftClient client, KubernetesListBu fromImage = extractBaseFromConfiguration(buildConfig); } - String pullRegistry = getApplicablePullRegistryFrom(fromImage, jKubeConfiguration.getRegistryConfig()); + String pullRegistry = getApplicablePullRegistryFrom(fromImage, jKubeConfiguration.getPullRegistryConfig()); if (pullRegistry != null) { - RegistryConfig registryConfig = jKubeConfiguration.getRegistryConfig(); + RegistryConfig registryConfig = jKubeConfiguration.getPullRegistryConfig(); final AuthConfig authConfig = new AuthConfigFactory(log).createAuthConfig(false, registryConfig.isSkipExtendedAuth(), registryConfig.getAuthConfig(), registryConfig.getSettings(), null, pullRegistry, registryConfig.getPasswordDecryptionMethod()); diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceIntegrationTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceIntegrationTest.java index 8f3db63bf9..538e2bbb2e 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceIntegrationTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceIntegrationTest.java @@ -85,7 +85,8 @@ void setUp(@TempDir Path projectRoot) throws IOException { .outputDirectory(targetDirectory.toFile()) .properties(new Properties()) .build()) - .registryConfig(RegistryConfig.builder().settings(Collections.emptyList()).build()) + .pullRegistryConfig(RegistryConfig.builder().settings(Collections.emptyList()).build()) + .pushRegistryConfig(RegistryConfig.builder().settings(Collections.emptyList()).build()) .build()) .build(); jibBuildService = new JibImageBuildService(hub); @@ -188,7 +189,7 @@ void setUp() { .registry("gcr.io") .build(); hub = hub.toBuilder().configuration(hub.getConfiguration().toBuilder() - .registryConfig(RegistryConfig.builder() + .pullRegistryConfig(RegistryConfig.builder() .registry("gcr.io") .authConfig(Collections.emptyMap()) .settings(Collections.emptyList()) diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java index 10e84072f3..356e060c44 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java @@ -251,7 +251,7 @@ void build_shouldCallPluginServiceAddFiles() throws JKubeServiceException { @Test void build_withRegistryConfig_shouldPrependRegistryToImageName() throws JKubeServiceException { // Given - when(mockedServiceHub.getConfiguration().getRegistryConfig()) + when(mockedServiceHub.getConfiguration().getPullRegistryConfig()) .thenReturn(RegistryConfig.builder().registry("quay.io").settings(Collections.emptyList()).build()); when(mockedServiceHub.getConfiguration().getProject()) .thenReturn(JavaProject.builder().baseDirectory(temporaryFolder.toFile()).build()); 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 aad97335fa..def6bfb197 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 @@ -135,7 +135,7 @@ void init(@TempDir Path temporaryFolder) throws Exception { .baseDirectory(baseDirectory) .buildDirectory(target) .build()) - .registryConfig(RegistryConfig.builder().build()) + .pullRegistryConfig(RegistryConfig.builder().build()) .build()); image = ImageConfiguration.builder() diff --git a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java index 634d4ab1c6..3be77bdc40 100644 --- a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java +++ b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java @@ -16,7 +16,6 @@ import java.io.File; import java.io.IOException; import java.nio.charset.Charset; -import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; @@ -154,10 +153,10 @@ public void uploadHelmChart(HelmConfig helm) throws BadUploadException, IOExcept final HelmRepository helmRepository = selectHelmRepository(helm); if (isRepositoryValid(helmRepository)) { final List registryServerConfigurations = Optional - .ofNullable(jKubeConfiguration).map(JKubeConfiguration::getRegistryConfig).map(RegistryConfig::getSettings) + .ofNullable(jKubeConfiguration).map(JKubeConfiguration::getPullRegistryConfig).map(RegistryConfig::getSettings) .orElse(Collections.emptyList()); final UnaryOperator passwordDecryptor = Optional.ofNullable(jKubeConfiguration) - .map(JKubeConfiguration::getRegistryConfig).map(RegistryConfig::getPasswordDecryptionMethod) + .map(JKubeConfiguration::getPullRegistryConfig).map(RegistryConfig::getPasswordDecryptionMethod) .orElse(s -> s); setAuthentication(helmRepository, logger, registryServerConfigurations, passwordDecryptor); uploadHelmChart(helm, helmRepository); diff --git a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTest.java b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTest.java index 7a200c75c4..8f815601b5 100644 --- a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTest.java +++ b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTest.java @@ -67,7 +67,7 @@ void setUp(@TempDir Path tempDir) throws IOException { .tarballOutputDir(helmOutputDirectory.toFile().getAbsolutePath()); jKubeConfiguration = JKubeConfiguration.builder() .project(JavaProject.builder().properties(new Properties()).build()) - .registryConfig(RegistryConfig.builder().settings(new ArrayList<>()).build()).build(); + .pullRegistryConfig(RegistryConfig.builder().settings(new ArrayList<>()).build()).build(); resourceServiceConfig = new ResourceServiceConfig(); helmService = new HelmService(jKubeConfiguration, resourceServiceConfig, new KitLogger.SilentLogger()); } diff --git a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUploadIT.java b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUploadIT.java index 44b4f1aeee..4038c0c14c 100644 --- a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUploadIT.java +++ b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUploadIT.java @@ -99,7 +99,7 @@ void setUp(@TempDir Path temporaryFolder) throws IOException { helmService = new HelmService( JKubeConfiguration.builder() .project(JavaProject.builder().properties(new Properties()).build()) - .registryConfig(RegistryConfig.builder() + .pullRegistryConfig(RegistryConfig.builder() .settings(Collections.singletonList(registryServerConfiguration)).build()) .build(), new ResourceServiceConfig(), diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java index 542e9bd4bd..6ac0898f91 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java @@ -177,6 +177,10 @@ public abstract class AbstractDockerMojo extends AbstractMojo @Parameter(property = "jkube.docker.pull.registry") protected String pullRegistry; + // Registry to use for push operations if no registry is specified + @Parameter(property = "jkube.docker.push.registry") + protected String pushRegistry; + /** * Build mode when build is performed. * Can be either "s2i" for an s2i binary build mode (in case of OpenShift) or @@ -428,7 +432,8 @@ protected JKubeConfiguration initJKubeConfiguration() throws DependencyResolutio .outputDirectory(outputDirectory) .reactorProjects(Collections.singletonList(javaProject)) .buildArgs(buildArgs) - .registryConfig(getRegistryConfig(pullRegistry)) + .pullRegistryConfig(getRegistryConfig(pullRegistry)) + .pushRegistryConfig(getRegistryConfig(pushRegistry)) .build(); } diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java index b4fb6c83f1..9bc37db986 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java @@ -233,7 +233,13 @@ protected JKubeServiceHub.JKubeServiceHubBuilder initJKubeServiceHubBuilder(Java .configuration(JKubeConfiguration.builder() .project(javaProject) .reactorProjects(Collections.singletonList(javaProject)) - .registryConfig(RegistryConfig.builder() + // TODO: Should provide same values as AbstractDockerMojo#getRegistryConfig + // AbstractDockerMojo should be eventually removed in favor of AbstractJKubeMojo + .pullRegistryConfig(RegistryConfig.builder() + .settings(MavenUtil.getRegistryServerFromMavenSettings(settings)) + .passwordDecryptionMethod(this::decrypt) + .build()) + .pushRegistryConfig(RegistryConfig.builder() .settings(MavenUtil.getRegistryServerFromMavenSettings(settings)) .passwordDecryptionMethod(this::decrypt) .build()) diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/PushMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/PushMojo.java index 393be8ca53..5f6f9d9388 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/PushMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/PushMojo.java @@ -31,10 +31,6 @@ public class PushMojo extends AbstractDockerMojo { @Parameter(property = "jkube.skip.push", defaultValue = "false") protected boolean skipPush; - // Registry to use for push operations if no registry is specified - @Parameter(property = "jkube.docker.push.registry") - private String pushRegistry; - /** * Skip building tags */ diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojoTest.java index 8268795cc1..5a3037f62d 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojoTest.java @@ -166,7 +166,7 @@ void execute_withValidMavenSettings_shouldUpload() throws Exception { // When helmPushMojo.execute(); // Then - assertThat(helmPushMojo.jkubeServiceHub.getConfiguration().getRegistryConfig().getSettings()).singleElement() + assertThat(helmPushMojo.jkubeServiceHub.getConfiguration().getPullRegistryConfig().getSettings()).singleElement() .isEqualTo(RegistryServerConfiguration.builder() .id("SNAP-REPO").username("mavenUser").password("mavenPassword").configuration(new HashMap<>()).build()); assertThat(helmServiceMockedConstruction.constructed()).hasSize(1); From 8f2a7b2cdfcd3a6c1b95c1d02743511063bc8e81 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 May 2024 06:48:08 +0200 Subject: [PATCH 127/289] chore(deps): Bump org.apache.maven.plugins:maven-plugin-plugin Bumps [org.apache.maven.plugins:maven-plugin-plugin](https://github.com/apache/maven-plugin-tools) from 3.12.0 to 3.13.0. - [Release notes](https://github.com/apache/maven-plugin-tools/releases) - [Commits](https://github.com/apache/maven-plugin-tools/compare/maven-plugin-tools-3.12.0...maven-plugin-tools-3.13.0) --- updated-dependencies: - dependency-name: org.apache.maven.plugins:maven-plugin-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ffd44d2a68..fa66724fc4 100644 --- a/pom.xml +++ b/pom.xml @@ -116,7 +116,7 @@ 3.6.1 3.4.1 3.6.3 - 3.12.0 + 3.13.0 3.0.1 3.3.1 3.3.1 From 3e3b37a75917727d4c5833ab04ecbaacd51e41f6 Mon Sep 17 00:00:00 2001 From: rohit-satya <151615370+rohit-satya@users.noreply.github.com> Date: Fri, 17 May 2024 10:24:17 +0530 Subject: [PATCH 128/289] fix: remove redundant method identical to super method in HelmMojo Signed-off-by: Rohit Satya --- .../org/eclipse/jkube/maven/plugin/mojo/build/HelmMojo.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmMojo.java index 040f4a2a69..a4b1b09ffa 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmMojo.java @@ -24,7 +24,6 @@ import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProjectHelper; import org.eclipse.jkube.kit.resource.helm.GeneratedChartListener; -import org.eclipse.jkube.kit.resource.helm.HelmConfig; /** * Generates a Helm chart for the Kubernetes resources @@ -71,8 +70,4 @@ protected File getKubernetesManifest() { return kubernetesManifest; } - @Override - protected HelmConfig.HelmType getDefaultHelmType() { - return HelmConfig.HelmType.KUBERNETES; - } } From 9833251e182ca8c0ef9d4c9f457caf81e805c009 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 17 May 2024 06:58:02 +0200 Subject: [PATCH 129/289] chore(deps): Bump actions/checkout from 4.1.5 to 4.1.6 Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.5 to 4.1.6. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/44c2b7a8a4ea60a981eaca3cf939b5f4305c123b...a5ac7e51b41094c92402da3b24376905380afc29) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/license.yml | 2 +- .github/workflows/quickstarts.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/license.yml b/.github/workflows/license.yml index cb79b8a800..a4f41f546b 100644 --- a/.github/workflows/license.yml +++ b/.github/workflows/license.yml @@ -40,7 +40,7 @@ jobs: repo.maven.apache.org:443 - name: Checkout - uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 - name: Setup Java 11 uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 with: diff --git a/.github/workflows/quickstarts.yml b/.github/workflows/quickstarts.yml index c68a88a419..781185d250 100644 --- a/.github/workflows/quickstarts.yml +++ b/.github/workflows/quickstarts.yml @@ -52,7 +52,7 @@ jobs: services.gradle.org:443 - name: Checkout - uses: actions/checkout@44c2b7a8a4ea60a981eaca3cf939b5f4305c123b + uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 - name: Setup Java 17 uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 with: From 05516a6a0360b3e5c4cdb9bb62d7983a55651528 Mon Sep 17 00:00:00 2001 From: rohit-satya <151615370+rohit-satya@users.noreply.github.com> Date: Fri, 17 May 2024 10:30:57 +0530 Subject: [PATCH 130/289] fix: replace AssertJ's deprecated asList() DSL method in HelidonGeneratorExposedPortsTest (3063) Signed-off-by: Rohit Satya --- .../generator/HelidonGeneratorExposedPortsTest.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/jkube-kit/jkube-kit-helidon/src/test/java/org/eclipse/jkube/helidon/generator/HelidonGeneratorExposedPortsTest.java b/jkube-kit/jkube-kit-helidon/src/test/java/org/eclipse/jkube/helidon/generator/HelidonGeneratorExposedPortsTest.java index cc826fa697..20f129269e 100644 --- a/jkube-kit/jkube-kit-helidon/src/test/java/org/eclipse/jkube/helidon/generator/HelidonGeneratorExposedPortsTest.java +++ b/jkube-kit/jkube-kit-helidon/src/test/java/org/eclipse/jkube/helidon/generator/HelidonGeneratorExposedPortsTest.java @@ -13,6 +13,7 @@ */ package org.eclipse.jkube.helidon.generator; +import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.generator.api.GeneratorContext; import org.eclipse.jkube.kit.common.Dependency; import org.eclipse.jkube.kit.common.JavaProject; @@ -67,7 +68,7 @@ void withDefaults_shouldAddDefaults() throws IOException { assertThat(result).singleElement() .extracting(ImageConfiguration::getBuildConfiguration) .extracting(BuildConfiguration::getPorts) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .containsExactly("8080", "8778", "9779"); } @@ -82,7 +83,7 @@ void withDefaultsInNative_shouldAddDefaultsForNative() throws IOException { assertThat(result).singleElement() .extracting(ImageConfiguration::getBuildConfiguration) .extracting(BuildConfiguration::getPorts) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .containsExactly("8080"); } @@ -100,7 +101,7 @@ void withApplicationYaml_shouldAddConfigured() throws IOException { assertThat(result).singleElement() .extracting(ImageConfiguration::getBuildConfiguration) .extracting(BuildConfiguration::getPorts) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .containsExactly("1337", "8778", "9779"); } From 0aec4459cfa8a61f3f1fc0a91ebd2bea4b41b273 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Fri, 17 May 2024 08:51:01 +0200 Subject: [PATCH 131/289] fix: helm push uses configured docker global and push registries instead of pull The Docker/OCI registries used by the Helm Upload service were based on the configured global and pull registries. This was probably due to the fact that these registries were the only ones available from the JKubeConfiguration. Also because the name of the JKubeConfiguration field was misleading (see #3064). These changes replace the usage of the global and pull registries with the usage of the global and push registries. Signed-off-by: Marc Nuri --- CHANGELOG.md | 1 + .../java/org/eclipse/jkube/kit/resource/helm/HelmService.java | 4 ++-- .../org/eclipse/jkube/kit/resource/helm/HelmServiceTest.java | 2 +- .../eclipse/jkube/kit/resource/helm/HelmServiceUploadIT.java | 2 +- .../jkube/maven/plugin/mojo/build/HelmPushMojoTest.java | 3 +++ 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d9493cfecf..2732f84f41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ Usage: * Fix #2901: Ensure Docker build arguments from properties are used during images pre-pulling * Fix #2904: `docker.buildArg.*` properties not taken into account in OpenShift plugins * Fix #3007: Kubernetes Maven Plugin generating resource manifests with line feeds on Windows +* Fix #3067: Helm Push uses configured docker global and push registries instead of pull ### 1.16.2 (2024-03-27) * Fix #2461: `k8s:watch`/`k8sWatch` should throw error in `buildpacks` build strategy diff --git a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java index 3be77bdc40..dccc9d8c39 100644 --- a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java +++ b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java @@ -153,10 +153,10 @@ public void uploadHelmChart(HelmConfig helm) throws BadUploadException, IOExcept final HelmRepository helmRepository = selectHelmRepository(helm); if (isRepositoryValid(helmRepository)) { final List registryServerConfigurations = Optional - .ofNullable(jKubeConfiguration).map(JKubeConfiguration::getPullRegistryConfig).map(RegistryConfig::getSettings) + .ofNullable(jKubeConfiguration).map(JKubeConfiguration::getPushRegistryConfig).map(RegistryConfig::getSettings) .orElse(Collections.emptyList()); final UnaryOperator passwordDecryptor = Optional.ofNullable(jKubeConfiguration) - .map(JKubeConfiguration::getPullRegistryConfig).map(RegistryConfig::getPasswordDecryptionMethod) + .map(JKubeConfiguration::getPushRegistryConfig).map(RegistryConfig::getPasswordDecryptionMethod) .orElse(s -> s); setAuthentication(helmRepository, logger, registryServerConfigurations, passwordDecryptor); uploadHelmChart(helm, helmRepository); diff --git a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTest.java b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTest.java index 8f815601b5..5d4bf4a850 100644 --- a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTest.java +++ b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTest.java @@ -67,7 +67,7 @@ void setUp(@TempDir Path tempDir) throws IOException { .tarballOutputDir(helmOutputDirectory.toFile().getAbsolutePath()); jKubeConfiguration = JKubeConfiguration.builder() .project(JavaProject.builder().properties(new Properties()).build()) - .pullRegistryConfig(RegistryConfig.builder().settings(new ArrayList<>()).build()).build(); + .pushRegistryConfig(RegistryConfig.builder().settings(new ArrayList<>()).build()).build(); resourceServiceConfig = new ResourceServiceConfig(); helmService = new HelmService(jKubeConfiguration, resourceServiceConfig, new KitLogger.SilentLogger()); } diff --git a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUploadIT.java b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUploadIT.java index 4038c0c14c..a4305ea3bc 100644 --- a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUploadIT.java +++ b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUploadIT.java @@ -99,7 +99,7 @@ void setUp(@TempDir Path temporaryFolder) throws IOException { helmService = new HelmService( JKubeConfiguration.builder() .project(JavaProject.builder().properties(new Properties()).build()) - .pullRegistryConfig(RegistryConfig.builder() + .pushRegistryConfig(RegistryConfig.builder() .settings(Collections.singletonList(registryServerConfiguration)).build()) .build(), new ResourceServiceConfig(), diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojoTest.java index 5a3037f62d..10c8ec20fe 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojoTest.java @@ -169,6 +169,9 @@ void execute_withValidMavenSettings_shouldUpload() throws Exception { assertThat(helmPushMojo.jkubeServiceHub.getConfiguration().getPullRegistryConfig().getSettings()).singleElement() .isEqualTo(RegistryServerConfiguration.builder() .id("SNAP-REPO").username("mavenUser").password("mavenPassword").configuration(new HashMap<>()).build()); + assertThat(helmPushMojo.jkubeServiceHub.getConfiguration().getPushRegistryConfig().getSettings()).singleElement() + .isEqualTo(RegistryServerConfiguration.builder() + .id("SNAP-REPO").username("mavenUser").password("mavenPassword").configuration(new HashMap<>()).build()); assertThat(helmServiceMockedConstruction.constructed()).hasSize(1); verify(helmServiceMockedConstruction.constructed().get(0), times(1)).uploadHelmChart(helmPushMojo.helm); } From 9cc5d89af4f0f084b37c15e0d2c288554daa3e3d Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Fri, 17 May 2024 13:54:21 +0530 Subject: [PATCH 132/289] doc(buildpacks): add note in BuildPacks Integration regarding delegation to pack CLI Related to #2460 Add note in BuildPacks Integration so that it's clear that it's user's responsibility to provide a valid buildpacks configuration Signed-off-by: Rohan Kumar --- jkube-kit/doc/src/main/asciidoc/inc/_integrations.adoc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/jkube-kit/doc/src/main/asciidoc/inc/_integrations.adoc b/jkube-kit/doc/src/main/asciidoc/inc/_integrations.adoc index c819ca7cf3..d09585a12b 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/_integrations.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/_integrations.adoc @@ -100,3 +100,9 @@ default-builder-image = "testuser/buildpacks-quarkus-builder:latest" ---- jkube.generator.buildpacksBuilderImage = "testuser/buildpacks-quarkus-builder:latest" ---- + +[NOTE] +==== +BuildPacks integration simply involves delegation of the build process to `pack` CLI. {plugin} has no control over how image gets built. This is controlled by BuildPack builder image. User is +responsible for making sure that valid configuration is provided for BuildPacks. +==== From 17fb956100c7f7c1c7c939361c5689a999088d64 Mon Sep 17 00:00:00 2001 From: Arman Yekkehkhani <72594459+arman-yekkehkhani@users.noreply.github.com> Date: Fri, 17 May 2024 16:36:58 +0330 Subject: [PATCH 133/289] test: fix assertion to check of non-zero status code in ExternalCommandTest, issue #3006 Signed-off-by: arman-yekkehkhani --- .../java/org/eclipse/jkube/kit/common/ExternalCommandTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/ExternalCommandTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/ExternalCommandTest.java index d8eddae98e..b8bb6b0a46 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/ExternalCommandTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/ExternalCommandTest.java @@ -56,7 +56,7 @@ void execute_whenCommandFailed_thenThrowException() { // When + Then assertThatIOException() .isThrownBy(testCommand::execute) - .withMessage("Process 'ls idontexist' exited with status 2"); + .withMessageMatching("Process 'ls idontexist' exited with status [^0]"); } @Test From ed3d2043c361074ffd5b99eaf94109ad9a3ccb33 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 19 May 2024 17:29:28 +0200 Subject: [PATCH 134/289] chore(deps): Bump com.mycila:license-maven-plugin from 4.4 to 4.5 Bumps [com.mycila:license-maven-plugin](https://github.com/mathieucarbou/license-maven-plugin) from 4.4 to 4.5. - [Commits](https://github.com/mathieucarbou/license-maven-plugin/compare/license-maven-plugin-4.4...license-maven-plugin-4.5) --- updated-dependencies: - dependency-name: com.mycila:license-maven-plugin dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fa66724fc4..403f8140e4 100644 --- a/pom.xml +++ b/pom.xml @@ -106,7 +106,7 @@ 2.5.1 5.10.2 6.12.1 - 4.4 + 4.5 1.18.32 1.18.20.0 3.13.0 From f340d005693cfceb0c86e70767bcd6c20309c64f Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Mon, 20 May 2024 13:00:28 +0200 Subject: [PATCH 135/289] refactor: push registry information read from global JKubeConfiguration Signed-off-by: Marc Nuri --- .../gradle/plugin/task/AbstractJKubeTask.java | 3 +- .../plugin/task/KubernetesPushTask.java | 14 +-- .../plugin/task/KubernetesPushTaskTest.java | 4 +- .../plugin/task/OpenShiftPushTaskTest.java | 3 +- .../build/service/docker/RegistryService.java | 7 +- .../service/AbstractImageBuildService.java | 7 +- .../kit/config/service/BuildService.java | 3 +- .../kubernetes/BuildPackBuildService.java | 17 ++- .../kubernetes/DockerBuildService.java | 6 +- .../kubernetes/JibImageBuildService.java | 3 +- .../openshift/OpenshiftBuildService.java | 2 +- .../kubernetes/BuildPackBuildServiceTest.java | 17 +-- .../kubernetes/DockerBuildServiceTest.java | 2 +- .../kubernetes/JibImageBuildServiceTest.java | 115 +++++++++++------- .../openshift/OpenShiftBuildServiceTest.java | 4 +- .../maven/plugin/mojo/build/PushMojo.java | 3 +- 16 files changed, 112 insertions(+), 98 deletions(-) diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java index e9e5d57c4c..c8c168800c 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java @@ -139,7 +139,8 @@ protected JKubeServiceHub.JKubeServiceHubBuilder initJKubeServiceHubBuilder() { .authConfig(kubernetesExtension.authConfig != null ? kubernetesExtension.authConfig.toMap() : null) .skipExtendedAuth(kubernetesExtension.getSkipExtendedAuth().getOrElse(false)) .passwordDecryptionMethod(s -> s) - .registry(kubernetesExtension.getPushRegistryOrNull()) + .registry(kubernetesExtension.getPushRegistryOrNull() != null ? + kubernetesExtension.getPushRegistryOrNull() : kubernetesExtension.getRegistryOrDefault()) .build()) .build()) .clusterAccess(clusterAccess) diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTask.java index bac44b573c..ca67fa9f73 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTask.java @@ -15,13 +15,11 @@ import org.eclipse.jkube.gradle.plugin.KubernetesExtension; import org.eclipse.jkube.kit.build.service.docker.DockerServiceHub; -import org.eclipse.jkube.kit.common.RegistryConfig; import org.eclipse.jkube.kit.config.service.BuildServiceConfig; import org.eclipse.jkube.kit.config.service.JKubeServiceException; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; import javax.inject.Inject; -import java.util.Collections; public class KubernetesPushTask extends AbstractJKubeTask { @Inject @@ -41,7 +39,7 @@ protected JKubeServiceHub.JKubeServiceHubBuilder initJKubeServiceHubBuilder() { public void run() { try { jKubeServiceHub.getBuildService() - .push(resolvedImages, kubernetesExtension.getPushRetriesOrDefault(), initRegistryConfig(), kubernetesExtension.getSkipTagOrDefault()); + .push(resolvedImages, kubernetesExtension.getPushRetriesOrDefault(), kubernetesExtension.getSkipTagOrDefault()); } catch (JKubeServiceException e) { throw new IllegalStateException("Error in pushing image: " + e.getMessage(), e); } @@ -52,16 +50,6 @@ protected boolean shouldSkip() { return super.shouldSkip() || kubernetesExtension.getSkipPushOrDefault(); } - private RegistryConfig initRegistryConfig() { - final String specificRegistry = kubernetesExtension.getPushRegistryOrNull(); - return RegistryConfig.builder() - .settings(Collections.emptyList()) - .authConfig(kubernetesExtension.authConfig != null ? kubernetesExtension.authConfig.toMap() : null) - .skipExtendedAuth(kubernetesExtension.getSkipExtendedAuthOrDefault()) - .registry(specificRegistry != null ? specificRegistry : kubernetesExtension.getRegistryOrDefault()) - .passwordDecryptionMethod(password -> password).build(); - } - protected BuildServiceConfig.BuildServiceConfigBuilder buildServiceConfigBuilder() { return TaskUtil.buildServiceConfigBuilder(kubernetesExtension); } diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTaskTest.java index 459ae483a1..fcc90dc07f 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesPushTaskTest.java @@ -87,7 +87,7 @@ void run_withImageConfiguration_shouldPushImage() throws JKubeServiceException { // Then assertThat(dockerBuildServiceMockedConstruction.constructed()).hasSize(1); verify(dockerBuildServiceMockedConstruction.constructed().iterator().next(), times(1)) - .push(argThat(images -> images.iterator().next().getName().equals("foo/bar:latest")), eq(0), any(), eq(false)); + .push(argThat(images -> images.iterator().next().getName().equals("foo/bar:latest")), eq(0), eq(false)); } @@ -109,7 +109,7 @@ public Property getSkipPush() { // Then assertThat(dockerBuildServiceMockedConstruction.constructed()).isEmpty(); - verify(pushTask.jKubeServiceHub.getBuildService(), times(0)).push(any(), anyInt(), any(), anyBoolean()); + verify(pushTask.jKubeServiceHub.getBuildService(), times(0)).push(any(), anyInt(), anyBoolean()); verify(taskEnvironment.logger, times(1)).lifecycle(contains("k8s: `k8sPush` task is skipped.")); } diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftPushTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftPushTaskTest.java index 74184f813c..153fd8cf6a 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftPushTaskTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftPushTaskTest.java @@ -29,7 +29,6 @@ import org.mockito.MockedConstruction; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mockConstruction; @@ -72,7 +71,7 @@ void run_withImageConfigurationAndS2IBuildStrategy_shouldPushImage() throws JKub // Then assertThat(openshiftBuildServiceMockedConstruction.constructed()).hasSize(1); verify(openshiftBuildServiceMockedConstruction.constructed().iterator().next()) - .push(argThat(images -> images.iterator().next().getName().equals("foo/bar:latest")), eq(0), any(), eq(false)); + .push(argThat(images -> images.iterator().next().getName().equals("foo/bar:latest")), eq(0), eq(false)); } @Test diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/RegistryService.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/RegistryService.java index fbaca5a2df..458a39de74 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/RegistryService.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/RegistryService.java @@ -31,7 +31,7 @@ import static org.eclipse.jkube.kit.build.api.helper.RegistryUtil.getApplicablePushRegistryFrom; /** - * Allows to interact with registries, eg. to push/pull images. + * Allows to interact with registries, e.g. to push/pull images. */ public class RegistryService { @@ -54,8 +54,9 @@ public class RegistryService { * @param skipTag flag to skip pushing tagged images * @throws IOException exception */ - public void pushImage(ImageConfiguration imageConfig, - int retries, RegistryConfig registryConfig, boolean skipTag) throws IOException { + public void pushImage( + ImageConfiguration imageConfig, int retries, RegistryConfig registryConfig, boolean skipTag + ) throws IOException { BuildConfiguration buildConfig = imageConfig.getBuildConfiguration(); String name = imageConfig.getName(); if (buildConfig != null) { diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/AbstractImageBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/AbstractImageBuildService.java index 6f5ec26dff..df321d1cae 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/AbstractImageBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/AbstractImageBuildService.java @@ -13,7 +13,6 @@ */ package org.eclipse.jkube.kit.config.service; -import org.eclipse.jkube.kit.common.RegistryConfig; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import java.util.Collection; @@ -27,7 +26,7 @@ protected AbstractImageBuildService(JKubeServiceHub jKubeServiceHub) { protected abstract void buildSingleImage(ImageConfiguration imageConfiguration) throws JKubeServiceException; - protected abstract void pushSingleImage(ImageConfiguration imageConfiguration, int retries, RegistryConfig registryConfig, boolean skipTag) throws JKubeServiceException; + protected abstract void pushSingleImage(ImageConfiguration imageConfiguration, int retries, boolean skipTag) throws JKubeServiceException; /** {@inheritDoc} */ @Override @@ -37,8 +36,8 @@ public final void build(ImageConfiguration... imageConfigurations) throws JKubeS } @Override - public final void push(Collection imageConfigs, int retries, RegistryConfig registryConfig, boolean skipTag) throws JKubeServiceException { - processImage(imageConfiguration -> pushSingleImage(imageConfiguration, retries, registryConfig, skipTag), "Skipped push", imageConfigs.toArray(new ImageConfiguration[0])); + public final void push(Collection imageConfigs, int retries, boolean skipTag) throws JKubeServiceException { + processImage(imageConfiguration -> pushSingleImage(imageConfiguration, retries, skipTag), "Skipped push", imageConfigs.toArray(new ImageConfiguration[0])); } @FunctionalInterface diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/BuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/BuildService.java index 7ebc8a0f5d..2eb8ef537b 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/BuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/BuildService.java @@ -43,11 +43,10 @@ public interface BuildService { * * @param imageConfigs image configurations to process * @param retries number of retries - * @param registryConfig registry configuration * @param skipTag boolean value whether skip tagging or not * @throws JKubeServiceException in case of any error while building image */ - void push(Collection imageConfigs, int retries, RegistryConfig registryConfig, boolean skipTag) throws JKubeServiceException; + void push(Collection imageConfigs, int retries, boolean skipTag) throws JKubeServiceException; /** * Post processing step called after all images has been build diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildService.java index 5750037a42..2f89ea056d 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildService.java @@ -21,8 +21,8 @@ import org.apache.commons.lang3.StringUtils; import org.eclipse.jkube.kit.build.service.docker.DockerServiceHub; +import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.KitLogger; -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.image.build.JKubeBuildStrategy; @@ -43,9 +43,10 @@ public class BuildPackBuildService extends AbstractImageBuildService { private static final String PACK_CONFIG_DIR = ".pack"; private static final String PACK_CONFIG_FILE = "config.toml"; - private final BuildServiceConfig buildServiceConfig; private final KitLogger kitLogger; + private final BuildServiceConfig buildServiceConfig; private final BuildPackCliDownloader buildPackCliDownloader; + private final JKubeConfiguration jKubeConfiguration; private final DockerServiceHub dockerServiceHub; public BuildPackBuildService(JKubeServiceHub jKubeServiceHub) { @@ -54,15 +55,18 @@ public BuildPackBuildService(JKubeServiceHub jKubeServiceHub) { BuildPackBuildService(JKubeServiceHub jKubeServiceHub, Properties packProperties) { super(jKubeServiceHub); + this.kitLogger = Objects.requireNonNull(jKubeServiceHub.getLog()); this.buildServiceConfig = Objects.requireNonNull(jKubeServiceHub.getBuildServiceConfig(), "BuildServiceConfig is required"); - this.kitLogger = Objects.requireNonNull(jKubeServiceHub.getLog()); + this.jKubeConfiguration = Objects.requireNonNull(jKubeServiceHub.getConfiguration(), + "JKubeConfiguration is required"); + this.dockerServiceHub = Objects.requireNonNull(jKubeServiceHub.getDockerServiceHub(), + "Docker Service Hub is required"); if (packProperties == null) { this.buildPackCliDownloader = new BuildPackCliDownloader(kitLogger); } else { this.buildPackCliDownloader = new BuildPackCliDownloader(kitLogger, packProperties); } - this.dockerServiceHub = jKubeServiceHub.getDockerServiceHub(); } @Override @@ -91,9 +95,10 @@ protected void buildSingleImage(ImageConfiguration imageConfiguration) { } @Override - protected void pushSingleImage(ImageConfiguration imageConfiguration, int retries, RegistryConfig registryConfig, boolean skipTag) throws JKubeServiceException { + protected void pushSingleImage(ImageConfiguration imageConfiguration, int retries, boolean skipTag) throws JKubeServiceException { try { - dockerServiceHub.getRegistryService().pushImage(imageConfiguration, retries, registryConfig, skipTag); + dockerServiceHub.getRegistryService() + .pushImage(imageConfiguration, retries, jKubeConfiguration.getPushRegistryConfig(), skipTag); } catch (IOException ex) { throw new JKubeServiceException("Error while trying to push the image: " + ex.getMessage(), ex); } diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/DockerBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/DockerBuildService.java index ba1cd99af3..380ff8ecda 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/DockerBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/DockerBuildService.java @@ -19,7 +19,6 @@ import org.eclipse.jkube.kit.build.service.docker.DockerServiceHub; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.config.image.ImageConfiguration; -import org.eclipse.jkube.kit.common.RegistryConfig; import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.eclipse.jkube.kit.config.service.AbstractImageBuildService; import org.eclipse.jkube.kit.config.service.BuildServiceConfig; @@ -66,9 +65,10 @@ public void buildSingleImage(ImageConfiguration imageConfig) throws JKubeService } @Override - protected void pushSingleImage(ImageConfiguration imageConfiguration, int retries, RegistryConfig registryConfig, boolean skipTag) throws JKubeServiceException { + protected void pushSingleImage(ImageConfiguration imageConfiguration, int retries, boolean skipTag) throws JKubeServiceException { try { - dockerServices.getRegistryService().pushImage(imageConfiguration, retries, registryConfig, skipTag); + dockerServices.getRegistryService() + .pushImage(imageConfiguration, retries, jKubeConfiguration.getPushRegistryConfig(), skipTag); } catch (IOException ex) { throw new JKubeServiceException("Error while trying to push the image: " + ex.getMessage(), ex); } diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java index 9e2dc77c3e..dda3788f9a 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java @@ -116,8 +116,9 @@ public void buildSingleImage(ImageConfiguration imageConfiguration) throws JKube } @Override - protected void pushSingleImage(ImageConfiguration imageConfiguration, int retries, RegistryConfig registryConfig, boolean skipTag) throws JKubeServiceException { + protected void pushSingleImage(ImageConfiguration imageConfiguration, int retries, boolean skipTag) throws JKubeServiceException { try { + final RegistryConfig registryConfig = configuration.getPushRegistryConfig(); final ImageConfiguration imageConfigToPush = prependPushRegistry(imageConfiguration, registryConfig); kitLogger.info("This push refers to: %s", imageConfigToPush.getName()); kitLogger.info("Pushing image: %s", new ImageName(imageConfigToPush.getName()).getFullName()); 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 dfea83f7d6..10d6139ad6 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 @@ -173,7 +173,7 @@ public void buildSingleImage(ImageConfiguration imageConfig) throws JKubeService } @Override - protected void pushSingleImage(ImageConfiguration imageConfiguration, int retries, RegistryConfig registryConfig, boolean skipTag) { + protected void pushSingleImage(ImageConfiguration imageConfiguration, int retries, boolean skipTag) { // Do nothing. Image is pushed as part of build phase log.warn("Image is pushed to OpenShift's internal registry during oc:build goal. Skipping..."); } diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildServiceTest.java index 15fd9db9e0..9f6d806309 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildServiceTest.java @@ -77,6 +77,7 @@ void setUp() { jKubeServiceHub = JKubeServiceHub.builder() .log(kitLogger) .platformMode(RuntimeMode.KUBERNETES) + .dockerServiceHub(mock(DockerServiceHub.class)) .buildServiceConfig(buildServiceConfig) .configuration(JKubeConfiguration.builder().build()) .build(); @@ -228,17 +229,17 @@ class PushSingleImage { private BuildPackBuildService buildPackBuildService; private DockerAccess dockerAccess; - private RegistryConfig registryConfig; - @BeforeEach void setUp() { dockerAccess = mock(DockerAccess.class); jKubeServiceHub = jKubeServiceHub.toBuilder() .dockerServiceHub(DockerServiceHub.newInstance(kitLogger, dockerAccess)) - .build(); - registryConfig = RegistryConfig.builder() - .registry("example.com") - .settings(Collections.emptyList()) + .configuration(JKubeConfiguration.builder() + .pushRegistryConfig(RegistryConfig.builder() + .registry("example.com") + .settings(Collections.emptyList()) + .build()) + .build()) .build(); buildPackBuildService = new BuildPackBuildService(jKubeServiceHub, new Properties()); } @@ -247,7 +248,7 @@ void setUp() { @DisplayName("push successfully done via docker daemon") void whenPushSuccessful_thenImagePushedViaDockerAccess() throws JKubeServiceException, DockerAccessException { // When - buildPackBuildService.pushSingleImage(imageConfiguration, 0, registryConfig, true); + buildPackBuildService.pushSingleImage(imageConfiguration, 0, true); // Then verify(dockerAccess).pushImage("foo/bar:latest", null, "example.com", 0); @@ -262,7 +263,7 @@ void whenPushFailed_thenThrowException() throws DockerAccessException { // When + Then assertThatExceptionOfType(JKubeServiceException.class) - .isThrownBy(() -> buildPackBuildService.pushSingleImage(imageConfiguration, 0, registryConfig, false)) + .isThrownBy(() -> buildPackBuildService.pushSingleImage(imageConfiguration, 0, false)) .withMessage("Error while trying to push the image: Push failure"); } } diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/DockerBuildServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/DockerBuildServiceTest.java index 8b29ccd737..890eb3f162 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/DockerBuildServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/DockerBuildServiceTest.java @@ -122,7 +122,7 @@ void build_withFailure_shouldThrowException() throws Exception { @Test void push_withDefaults_shouldPush() throws Exception { // When - new DockerBuildService(mockedJKubeServiceHub).push(Collections.emptyList(), 0, null, false); + new DockerBuildService(mockedJKubeServiceHub).push(Collections.emptyList(), 0, false); // Then verify(mockedJKubeServiceHub.getDockerServiceHub().getRegistryService(), times(0)) .pushImage(any(), eq(0), isNull(), eq(false)); diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java index 356e060c44..9b3a3f201d 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java @@ -28,6 +28,8 @@ import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; +import org.eclipse.jkube.kit.config.resource.RuntimeMode; +import org.eclipse.jkube.kit.config.service.BuildServiceConfig; import org.eclipse.jkube.kit.config.service.JKubeServiceException; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; import org.eclipse.jkube.kit.service.jib.JibServiceUtil; @@ -41,16 +43,17 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; +import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; class JibImageBuildServiceTest { @@ -59,19 +62,25 @@ class JibImageBuildServiceTest { private KitLogger logger; - private JKubeServiceHub mockedServiceHub; + private JKubeServiceHub jKubeServiceHub; private ImageConfiguration imageConfiguration; - private RegistryConfig registryConfig; - private MockedStatic jibServiceUtilMockedStatic; @BeforeEach void setUp() { logger = spy(new KitLogger.SilentLogger()); - mockedServiceHub = mock(JKubeServiceHub.class, RETURNS_DEEP_STUBS); - when(mockedServiceHub.getLog()).thenReturn(logger); + jKubeServiceHub = JKubeServiceHub.builder() + .log(logger) + .platformMode(RuntimeMode.KUBERNETES) + .buildServiceConfig(BuildServiceConfig.builder().build()) + .configuration(JKubeConfiguration.builder() + .pullRegistryConfig(RegistryConfig.builder().build()) + .pushRegistryConfig(RegistryConfig.builder().build()) + .project(JavaProject.builder().baseDirectory(temporaryFolder.toFile()).build()) + .build()) + .build(); jibServiceUtilMockedStatic = mockStatic(JibServiceUtil.class); imageConfiguration = ImageConfiguration.builder() .name("test/testimage:0.0.1") @@ -79,10 +88,6 @@ void setUp() { .from("busybox") .build()) .build(); - registryConfig = RegistryConfig.builder() - .authConfig(Collections.emptyMap()) - .settings(Collections.emptyList()) - .build(); jibServiceUtilMockedStatic.when(() -> JibServiceUtil.getBaseImage(argThat(ic -> ic.getBuild().getFrom().equals("busybox")), isNull())) .thenReturn("busybox"); jibServiceUtilMockedStatic.when(() -> JibServiceUtil.containerFromImageConfiguration(any(), any(), any())) @@ -97,7 +102,7 @@ void close() { @Test void isApplicable_withNoBuildStrategy_shouldReturnFalse() { // When - final boolean result = new JibImageBuildService(mockedServiceHub).isApplicable(); + final boolean result = new JibImageBuildService(jKubeServiceHub).isApplicable(); // Then assertThat(result).isFalse(); } @@ -105,9 +110,13 @@ void isApplicable_withNoBuildStrategy_shouldReturnFalse() { @Test void isApplicable_withJibBuildStrategy_shouldReturnTrue() { // Given - when(mockedServiceHub.getBuildServiceConfig().getJKubeBuildStrategy()).thenReturn(JKubeBuildStrategy.jib); + jKubeServiceHub = jKubeServiceHub.toBuilder() + .buildServiceConfig(BuildServiceConfig.builder() + .jKubeBuildStrategy(JKubeBuildStrategy.jib) + .build()) + .build(); // When - final boolean result = new JibImageBuildService(mockedServiceHub).isApplicable(); + final boolean result = new JibImageBuildService(jKubeServiceHub).isApplicable(); // Then assertThat(result).isTrue(); } @@ -116,12 +125,17 @@ void isApplicable_withJibBuildStrategy_shouldReturnTrue() { @java.lang.SuppressWarnings("squid:S00112") void getRegistryCredentialsForPush() throws IOException { // Given - registryConfig = RegistryConfig.builder() - .settings(Collections.singletonList(createNewRegistryServerConfiguration("test.example.org", "testuserpush", "testpass"))) - .passwordDecryptionMethod(s -> s) - .build(); + final RegistryConfig registryConfig = RegistryConfig.builder() + .settings(Collections.singletonList( + RegistryServerConfiguration.builder() + .id("test.example.org") + .username("testuserpush") + .password("testpass") + .build())) + .passwordDecryptionMethod(s -> s) + .build(); // When - Credential credential = new JibImageBuildService(mockedServiceHub) + Credential credential = new JibImageBuildService(jKubeServiceHub) .getRegistryCredentials(registryConfig, true, "test.example.org"); // Then assertThat(credential).isNotNull() @@ -133,12 +147,17 @@ void getRegistryCredentialsForPush() throws IOException { @java.lang.SuppressWarnings("squid:S00112") void getRegistryCredentialsForPull() throws IOException { // Given - registryConfig = RegistryConfig.builder() - .settings(Collections.singletonList(createNewRegistryServerConfiguration("test.example.org", "testuserpull", "testpass"))) - .passwordDecryptionMethod(s -> s) - .build(); + final RegistryConfig registryConfig = RegistryConfig.builder() + .settings(Collections.singletonList( + RegistryServerConfiguration.builder() + .id("test.example.org") + .username("testuserpull") + .password("testpass") + .build())) + .passwordDecryptionMethod(s -> s) + .build(); // When - Credential credential = new JibImageBuildService(mockedServiceHub) + Credential credential = new JibImageBuildService(jKubeServiceHub) .getRegistryCredentials(registryConfig, false, "test.example.org"); // Then assertThat(credential).isNotNull() @@ -174,7 +193,7 @@ void getAssemblyTarArchive() throws IOException { @Test void pushWithNoConfigurations() throws Exception { // When - new JibImageBuildService(mockedServiceHub).push(Collections.emptyList(), 1, null, false); + new JibImageBuildService(jKubeServiceHub).push(Collections.emptyList(), 1, false); // Then jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.jibPush(any(), any(), any(), any()), times(0)); } @@ -182,12 +201,21 @@ void pushWithNoConfigurations() throws Exception { @Test void pushWithConfiguration() throws Exception { // Given - registryConfig = RegistryConfig.builder() - .settings(Collections.singletonList(createNewRegistryServerConfiguration("docker.io", "testuserpush", "testpass"))) - .passwordDecryptionMethod(s -> s) - .build(); + jKubeServiceHub = jKubeServiceHub.toBuilder() + .configuration(jKubeServiceHub.getConfiguration().toBuilder() + .pushRegistryConfig(RegistryConfig.builder() + .settings(Collections.singletonList( + RegistryServerConfiguration.builder() + .id("docker.io") + .username("testuserpush") + .password("testpass") + .build())) + .passwordDecryptionMethod(s -> s) + .build()) + .build()) + .build(); // When - new JibImageBuildService(mockedServiceHub).push(Collections.singletonList(imageConfiguration), 1, registryConfig, false); + new JibImageBuildService(jKubeServiceHub).push(Collections.singletonList(imageConfiguration), 1, false); // Then jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.jibPush(eq(imageConfiguration), eq(Credential.from("testuserpush", "testpass")), any(), any()), times(1)); } @@ -203,7 +231,7 @@ void push_withImageBuildConfigurationSkipTrue_shouldNotPushImage() throws JKubeS .build()) .build(); // When - new JibImageBuildService(mockedServiceHub).push(Collections.singletonList(imageConfiguration), 1, registryConfig, false); + new JibImageBuildService(jKubeServiceHub).push(Collections.singletonList(imageConfiguration), 1, false); // Then jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.jibPush(any(), any(), any(), any()), times(0)); } @@ -215,7 +243,7 @@ void build_withImageMissingBuildConfiguration_shouldNotBuildImage() throws JKube .name("test/foo:latest") .build(); // When - new JibImageBuildService(mockedServiceHub).build(imageConfiguration); + new JibImageBuildService(jKubeServiceHub).build(imageConfiguration); // Then jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.buildContainer(any(), any(), any()), times(0)); } @@ -231,7 +259,7 @@ void build_withImageBuildConfigurationSkipTrue_shouldNotBuildImage() throws JKub .build()) .build(); // When - new JibImageBuildService(mockedServiceHub).build(imageConfiguration); + new JibImageBuildService(jKubeServiceHub).build(imageConfiguration); // Then jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.buildContainer(any(), any(), any()), times(0)); } @@ -243,20 +271,21 @@ void build_shouldCallPluginServiceAddFiles() throws JKubeServiceException { .name("test/foo:latest") .build(); // When - new JibImageBuildService(mockedServiceHub).build(imageConfiguration); + new JibImageBuildService(jKubeServiceHub).build(imageConfiguration); // Then - verify(mockedServiceHub.getPluginManager().resolvePluginService(), times(1)).addExtraFiles(); + verify(logger, atLeastOnce()).debug(eq("Adding extra files for plugin %s"), anyString()); } @Test void build_withRegistryConfig_shouldPrependRegistryToImageName() throws JKubeServiceException { // Given - when(mockedServiceHub.getConfiguration().getPullRegistryConfig()) - .thenReturn(RegistryConfig.builder().registry("quay.io").settings(Collections.emptyList()).build()); - when(mockedServiceHub.getConfiguration().getProject()) - .thenReturn(JavaProject.builder().baseDirectory(temporaryFolder.toFile()).build()); + jKubeServiceHub = jKubeServiceHub.toBuilder() + .configuration(jKubeServiceHub.getConfiguration().toBuilder() + .pullRegistryConfig(RegistryConfig.builder().registry("quay.io").settings(Collections.emptyList()).build()) + .build()) + .build(); // When - new JibImageBuildService(mockedServiceHub).build(imageConfiguration); + new JibImageBuildService(jKubeServiceHub).build(imageConfiguration); // Then jibServiceUtilMockedStatic.verify(() -> JibServiceUtil .containerFromImageConfiguration(argThat(ic -> ic.getName().equals("quay.io/test/testimage:0.0.1")), any(), any()), times(1)); @@ -270,12 +299,4 @@ private static JKubeConfiguration createJKubeConfiguration(File projectBaseDir) .build()) .build(); } - - private RegistryServerConfiguration createNewRegistryServerConfiguration(String id, String username, String password) { - return RegistryServerConfiguration.builder() - .id(id) - .username(username) - .password(password) - .build(); - } } 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 d7b82f204c..349fc663e4 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 @@ -91,7 +91,7 @@ void push_withEmptyList_shouldNotLogWarning() throws JKubeServiceException { when(jKubeServiceHub.getLog()).thenReturn(kitLogger); // When - new OpenshiftBuildService(jKubeServiceHub).push(Collections.emptyList(), 0, new RegistryConfig(), false); + new OpenshiftBuildService(jKubeServiceHub).push(Collections.emptyList(), 0, false); // Then verify(kitLogger, times(0)).warn("Image is pushed to OpenShift's internal registry during oc:build goal. Skipping..."); } @@ -102,7 +102,7 @@ void push_withValidImage_shouldLogWarning() throws JKubeServiceException { when(jKubeServiceHub.getLog()).thenReturn(kitLogger); // When - new OpenshiftBuildService(jKubeServiceHub).push(Collections.singletonList(imageConfiguration), 0, new RegistryConfig(), false); + new OpenshiftBuildService(jKubeServiceHub).push(Collections.singletonList(imageConfiguration), 0, false); // Then verify(kitLogger, times(1)).warn("Image is pushed to OpenShift's internal registry during oc:build goal. Skipping..."); } diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/PushMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/PushMojo.java index 5f6f9d9388..20e3b9b2c9 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/PushMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/PushMojo.java @@ -23,7 +23,6 @@ * Uploads the built Docker images to a Docker registry * * @author roland - * @since 16/03/16 */ @Mojo(name = "push", defaultPhase = LifecyclePhase.INSTALL, requiresDependencyResolution = ResolutionScope.COMPILE) public class PushMojo extends AbstractDockerMojo { @@ -52,7 +51,7 @@ public void executeInternal() throws MojoExecutionException { } try { - jkubeServiceHub.getBuildService().push(getResolvedImages(), retries, getRegistryConfig(pushRegistry), skipTag); + jkubeServiceHub.getBuildService().push(getResolvedImages(), retries, skipTag); } catch (Exception ex) { throw new MojoExecutionException(ex.getMessage(), ex); } From 09bd9fb376ae7af1b1ac61c9cf1335e8e571fc8c Mon Sep 17 00:00:00 2001 From: Arman Yekkehkhani <72594459+arman-yekkehkhani@users.noreply.github.com> Date: Mon, 20 May 2024 14:31:52 +0330 Subject: [PATCH 136/289] fix: replace AssertJ's deprecated asList() DSL method in SpringBootGeneratorIntegrationTest (3058) Signed-off-by: arman-yekkehkhani --- .../SpringBootGeneratorIntegrationTest.java | 32 ++++++++++++------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/generator/SpringBootGeneratorIntegrationTest.java b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/generator/SpringBootGeneratorIntegrationTest.java index a9c9d62c7c..1ea1e54761 100644 --- a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/generator/SpringBootGeneratorIntegrationTest.java +++ b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/generator/SpringBootGeneratorIntegrationTest.java @@ -159,7 +159,8 @@ void imageHasDefaultWebPort() { // Then assertThat(images) .singleElement() - .extracting("buildConfiguration.ports").asList() + .extracting("buildConfiguration.ports") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .contains("8080"); } @Test @@ -170,7 +171,8 @@ void hasJolokiaPort() { .customize(new ArrayList<>(), false); // Then assertThat(images).singleElement() - .extracting("buildConfiguration.ports").asList() + .extracting("buildConfiguration.ports") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .contains("8778"); } @@ -182,7 +184,8 @@ void hasPrometheusPort() { .customize(new ArrayList<>(), false); // Then assertThat(images).singleElement() - .extracting("buildConfiguration.ports").asList() + .extracting("buildConfiguration.ports") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .contains("9779"); } @@ -216,12 +219,15 @@ void createAssembly() { .hasFieldOrPropertyWithValue("targetDir", "/deployments") .hasFieldOrPropertyWithValue("excludeFinalOutputArtifact", true) .extracting(AssemblyConfiguration::getLayers) - .asList().hasSize(1) + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)) + .hasSize(1) .satisfies(layers -> assertThat(layers).element(0).asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) .extracting(Assembly::getFileSets) - .asList().element(2) + .asInstanceOf(InstanceOfAssertFactories.list(AssemblyFileSet.class)) + .element(2) .hasFieldOrPropertyWithValue("outputDirectory", new File(".")) - .extracting("includes").asList() + .extracting("includes") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .containsExactly("fat.jar")); } @@ -258,7 +264,8 @@ void withApplicationPortOverridden_shouldUseOverriddenWebPort() { // Then assertThat(images) .singleElement() - .extracting("buildConfiguration.ports").asList() + .extracting("buildConfiguration.ports") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .contains("8081"); } @@ -340,7 +347,7 @@ void shouldCreateAssemblyLayers() { .hasFieldOrPropertyWithValue("targetDir", "/deployments") .hasFieldOrPropertyWithValue("excludeFinalOutputArtifact", true) .extracting(AssemblyConfiguration::getLayers) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)) .hasSize(5) .contains( Assembly.builder() @@ -440,13 +447,16 @@ void createAssembly() { .hasFieldOrPropertyWithValue("targetDir", "/") .hasFieldOrPropertyWithValue("excludeFinalOutputArtifact", true) .extracting(AssemblyConfiguration::getLayers) - .asList().hasSize(1) + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)) + .hasSize(1) .satisfies(layers -> assertThat(layers).element(0).asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) .extracting(Assembly::getFileSets) - .asList().element(2) + .asInstanceOf(InstanceOfAssertFactories.list(AssemblyFileSet.class)) + .element(2) .hasFieldOrPropertyWithValue("outputDirectory", new File(".")) .hasFieldOrPropertyWithValue("fileMode", "0755") - .extracting("includes").asList() + .extracting("includes") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .containsExactly("native-binary-artifact")); } From 6e9bd34934691a951e46be1d14047e36b48f19be Mon Sep 17 00:00:00 2001 From: rohit-satya <151615370+rohit-satya@users.noreply.github.com> Date: Mon, 20 May 2024 17:51:55 +0530 Subject: [PATCH 137/289] fix: remove getter methods and use lombok @Getter in HelmConfig.HelmType Signed-off-by: Rohit Satya --- .../jkube/kit/resource/helm/HelmConfig.java | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmConfig.java b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmConfig.java index 76cb73034c..6d8f020689 100644 --- a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmConfig.java +++ b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmConfig.java @@ -90,6 +90,7 @@ public void setType(String types) { setTypes(HelmType.parseString(types)); } + @Getter public enum HelmType { KUBERNETES("helm", "kubernetes", "kubernetes", "Kubernetes"), OPENSHIFT("helmshift", "openshift","openshift", "OpenShift"); @@ -106,22 +107,6 @@ public enum HelmType { this.description = description; } - public String getClassifier() { - return classifier; - } - - public String getSourceDir() { - return sourceDir; - } - - public String getOutputDir() { - return outputDir; - } - - public String getDescription() { - return description; - } - public static List parseString(String types) { return Optional.ofNullable(types) .map(t -> t.split(",")) From 0f02f0b495011a325b6a176b7b8bad67d2bd85da Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Tue, 21 May 2024 10:14:17 +0200 Subject: [PATCH 138/289] refactor: introduce JibService abstraction layer for push - Created the initial JibService abstraction layer - Added integration tests for push operations - Removed redundant JibServiceUtil helper methods Signed-off-by: Marc Nuri --- .../jkube/kit/build/api/auth/AuthConfig.java | 1 - jkube-kit/build/service/jib/pom.xml | 10 +- .../jkube/kit/service/jib/JibService.java | 109 ++++++ .../jkube/kit/service/jib/JibServiceUtil.java | 52 +-- .../jkube/kit/service/jib/JibServiceTest.java | 167 +++++++++ .../kit/service/jib/JibServiceUtilTest.java | 76 ----- .../kubernetes/JibImageBuildService.java | 28 +- .../JibImageBuildServiceIntegrationTest.java | 2 - .../kubernetes/JibImageBuildServiceTest.java | 322 ++++++++++++------ 9 files changed, 526 insertions(+), 241 deletions(-) create mode 100644 jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java create mode 100644 jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/auth/AuthConfig.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/auth/AuthConfig.java index bedb4ceb0e..3c4ee047f4 100644 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/auth/AuthConfig.java +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/auth/AuthConfig.java @@ -33,7 +33,6 @@ * pushing to Docker * * @author roland - * @since 22.07.14 */ @Getter @EqualsAndHashCode diff --git a/jkube-kit/build/service/jib/pom.xml b/jkube-kit/build/service/jib/pom.xml index a22434c7b8..c5562113cf 100644 --- a/jkube-kit/build/service/jib/pom.xml +++ b/jkube-kit/build/service/jib/pom.xml @@ -38,6 +38,10 @@ com.google.cloud.tools jib-core + + org.apache.httpcomponents + httpclient + org.apache.commons @@ -56,6 +60,10 @@ org.assertj assertj-core - + + com.marcnuri.helm-java + helm-java + test + diff --git a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java new file mode 100644 index 0000000000..2c472bf1e9 --- /dev/null +++ b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java @@ -0,0 +1,109 @@ +/* + * 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.service.jib; + +import com.google.cloud.tools.jib.api.CacheDirectoryCreationException; +import com.google.cloud.tools.jib.api.Containerizer; +import com.google.cloud.tools.jib.api.Credential; +import com.google.cloud.tools.jib.api.Jib; +import com.google.cloud.tools.jib.api.JibContainerBuilder; +import com.google.cloud.tools.jib.api.LogEvent; +import com.google.cloud.tools.jib.api.RegistryException; +import com.google.cloud.tools.jib.api.RegistryImage; +import com.google.cloud.tools.jib.api.TarImage; +import com.google.cloud.tools.jib.event.events.ProgressEvent; +import org.eclipse.jkube.kit.build.api.assembly.BuildDirs; +import org.eclipse.jkube.kit.build.api.assembly.JKubeBuildTarArchiver; +import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JKubeException; +import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.archive.ArchiveCompression; +import org.eclipse.jkube.kit.config.image.ImageConfiguration; +import org.eclipse.jkube.kit.config.image.ImageName; + +import java.io.File; +import java.io.IOException; +import java.time.Instant; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; + +import static org.eclipse.jkube.kit.service.jib.JibServiceUtil.toRegistryImage; + +public class JibService implements AutoCloseable { + + private static final long JIB_EXECUTOR_SHUTDOWN_TIMEOUT_SECONDS = 10L; + + private final JKubeConfiguration configuration; + private final ImageConfiguration imageConfiguration; + private final JibLogger jibLogger; + private final ExecutorService executorService; + + public JibService(KitLogger kitLogger, JKubeConfiguration configuration, ImageConfiguration imageConfiguration) { + this.configuration = configuration; + this.imageConfiguration = imageConfiguration; + jibLogger = new JibLogger(kitLogger); + executorService = Executors.newCachedThreadPool(); + } + + @Override + public void close() throws Exception { + try { + executorService.shutdown(); + if (!executorService.awaitTermination(JIB_EXECUTOR_SHUTDOWN_TIMEOUT_SECONDS, TimeUnit.SECONDS)) { + executorService.shutdownNow(); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new JKubeException("Thread Interrupted", e); + } + } + + public final void push(Credential pushCredentials /* TODO: remove*/) { + final String imageName = new ImageName(imageConfiguration.getName()).getFullName(); + final TarImage image = TarImage.at(getBuildTarArchive().toPath()); + final RegistryImage registryImage = toRegistryImage(imageName, pushCredentials); + final Containerizer to = Containerizer.to(registryImage); + final JibContainerBuilder from = Jib.from(image); + containerize(from, to); + } + + private void containerize(JibContainerBuilder from, Containerizer to) { + to.setAllowInsecureRegistries(true); + to.setExecutorService(executorService); + to.addEventHandler(LogEvent.class, jibLogger); + to.addEventHandler(ProgressEvent.class, jibLogger.progressEventHandler()); + if (imageConfiguration.getBuildConfiguration().getTags() != null) { + imageConfiguration.getBuildConfiguration().getTags().forEach(to::withAdditionalTag); + } + from.setCreationTime(Instant.now()); + try { + from.containerize(to); + jibLogger.updateFinished(); + } catch (CacheDirectoryCreationException | IOException | ExecutionException | RegistryException ex) { + throw new JKubeException("Unable to containerize image using Jib: " + ex.getMessage(), ex); + } catch (InterruptedException ex) { + Thread.currentThread().interrupt(); + throw new JKubeException("Thread Interrupted", ex); + } + } + + private File getBuildTarArchive() { + final BuildDirs buildDirs = new BuildDirs(imageConfiguration.getName(), configuration); + return new File(buildDirs.getTemporaryRootDirectory(), JKubeBuildTarArchiver.ARCHIVE_FILE_NAME + ArchiveCompression.none.getFileSuffix()); + } + + +} diff --git a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java index b13697f334..3de9210440 100644 --- a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java +++ b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java @@ -94,7 +94,7 @@ public static void buildContainer(JibContainerBuilder jibContainerBuilder, TarIm } public static JibContainerBuilder containerFromImageConfiguration( - ImageConfiguration imageConfiguration, String pullRegistry, Credential pullRegistryCredential) throws InvalidImageReferenceException { + ImageConfiguration imageConfiguration, String pullRegistry, Credential pullRegistryCredential) { final JibContainerBuilder containerBuilder = Jib .from(toRegistryImage(getBaseImage(imageConfiguration, pullRegistry), pullRegistryCredential)) .setFormat(ImageFormat.Docker); @@ -134,50 +134,16 @@ public static JibContainerBuilder containerFromImageConfiguration( return containerBuilder; } - /** - * Push Image to registry using JIB. - * - * @param imageConfiguration ImageConfiguration. - * @param pushCredentials push credentials. - * @param tarArchive tar archive built during build goal. - * @param logger the JibLogger. - */ - public static void jibPush(ImageConfiguration imageConfiguration, Credential pushCredentials, File tarArchive, JibLogger logger) { - final String imageName = new ImageName(imageConfiguration.getName()).getFullName(); - final TarImage image = TarImage.at(tarArchive.toPath()); - final ExecutorService jibBuildExecutor = Executors.newCachedThreadPool(); + static RegistryImage toRegistryImage(String imageReference, Credential credential) { try { - final RegistryImage registryImage = toRegistryImage(imageName, pushCredentials); - final Containerizer containerizer = customizeContainerizer(Containerizer.to(registryImage), imageConfiguration, logger) - .setExecutorService(jibBuildExecutor); - Jib - .from(image) - .setCreationTime(Instant.now()) - .containerize(containerizer); - logger.updateFinished(); - } catch (Exception e) { - throw new JKubeException("Exception occurred while pushing the image: " + imageName + ", " + e.getMessage(), e); - } finally { - shutdownAndWait(jibBuildExecutor); - } - } - - private static Containerizer customizeContainerizer(Containerizer c, ImageConfiguration imageConfiguration, JibLogger logger) { - c.setAllowInsecureRegistries(true); - c.addEventHandler(LogEvent.class, logger); - c.addEventHandler(ProgressEvent.class, logger.progressEventHandler()); - if (imageConfiguration.getBuildConfiguration().getTags() != null) { - imageConfiguration.getBuildConfiguration().getTags().forEach(c::withAdditionalTag); - } - return c; - } - - private static RegistryImage toRegistryImage(String imageReference, Credential credential) throws InvalidImageReferenceException { - RegistryImage registryImage = RegistryImage.named(imageReference); - if (credential != null && !credential.getUsername().isEmpty() && !credential.getPassword().isEmpty()) { - registryImage.addCredential(credential.getUsername(), credential.getPassword()); + final RegistryImage registryImage = RegistryImage.named(imageReference); + if (credential != null && !credential.getUsername().isEmpty() && !credential.getPassword().isEmpty()) { + registryImage.addCredential(credential.getUsername(), credential.getPassword()); + } + return registryImage; + } catch (InvalidImageReferenceException e) { + throw new JKubeException("Invalid image reference: " + imageReference, e); } - return registryImage; } public static String getBaseImage(ImageConfiguration imageConfiguration, String optionalRegistry) { diff --git a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java new file mode 100644 index 0000000000..02ade5cf2c --- /dev/null +++ b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java @@ -0,0 +1,167 @@ +/* + * 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.service.jib; + +import com.google.cloud.tools.jib.api.Containerizer; +import com.google.cloud.tools.jib.api.Credential; +import com.google.cloud.tools.jib.api.Jib; +import com.google.cloud.tools.jib.api.RegistryUnauthorizedException; +import com.google.cloud.tools.jib.api.TarImage; +import com.google.cloud.tools.jib.api.buildplan.ImageFormat; +import com.google.cloud.tools.jib.global.JibSystemProperties; +import com.marcnuri.helm.jni.HelmLib; +import com.marcnuri.helm.jni.NativeLibrary; +import com.marcnuri.helm.jni.RepoServerOptions; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.io.IOUtils; +import org.eclipse.jkube.kit.build.api.assembly.BuildDirs; +import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JKubeException; +import org.eclipse.jkube.kit.common.JavaProject; +import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.config.image.ImageConfiguration; +import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class JibServiceTest { + + private static HelmLib helmLib; + @TempDir + private Path tempDir; + private String remoteOciServer; + private KitLogger kitLogger; + private JKubeConfiguration configuration; + private ImageConfiguration imageConfiguration; + + @BeforeAll + static void setUpAll() { + helmLib = NativeLibrary.getInstance().load(); + } + + @BeforeEach + void setUp() { + remoteOciServer = helmLib.RepoOciServerStart( + new RepoServerOptions(null, "oci-user", "oci-password") + ).out; + kitLogger = new KitLogger.SilentLogger(); + configuration = JKubeConfiguration.builder() + .project(JavaProject.builder() + .baseDirectory(tempDir.toFile()) + .build()) + .build(); + imageConfiguration = ImageConfiguration.builder() + .name(remoteOciServer + "/" + "the-image-name") + .build(BuildConfiguration.builder() + .from("scratch") + .build()) + .build(); + } + + @Nested + @DisplayName("push") + class Push { + + private boolean sendCredentialsOverHttp; + + @BeforeEach + void buildContainer() throws Exception { + sendCredentialsOverHttp = JibSystemProperties.sendCredentialsOverHttp(); + System.setProperty(JibSystemProperties.SEND_CREDENTIALS_OVER_HTTP, "true"); + final BuildDirs buildDirs = new BuildDirs(imageConfiguration.getName(), configuration); + Jib.fromScratch() + .setFormat(ImageFormat.Docker) + .containerize(Containerizer.to(TarImage + .at(buildDirs.getTemporaryRootDirectory().toPath().resolve("docker-build.tar")) + .named(imageConfiguration.getName())) + ); + } + + @AfterEach + void tearDown() { + if (!sendCredentialsOverHttp) { + System.clearProperty(JibSystemProperties.SEND_CREDENTIALS_OVER_HTTP); + } + } + + @Test + void emptyImageNameThrowsException() throws Exception { + try (JibService jibService = new JibService(kitLogger, configuration, ImageConfiguration.builder().build())) { + assertThatThrownBy(() -> jibService.push(null)) + .isInstanceOf(NullPointerException.class) + .hasMessage("Image name must not be null"); + } + } + + @Test + void pushInvalidCredentials() throws Exception { + final Credential invalidCredential = Credential.from("oci-user", "oci-password-invalid"); + try (JibService jibService = new JibService(kitLogger, configuration, imageConfiguration)) { + assertThatThrownBy(() -> jibService.push(invalidCredential)) + .isInstanceOf(JKubeException.class) + .hasMessageContaining("Unable to containerize image using Jib: Unauthorized for") + .cause() + .isInstanceOf(RegistryUnauthorizedException.class); + } + } + + @Test + void push() throws Exception { + try (JibService jibService = new JibService(kitLogger, configuration, imageConfiguration)) { + jibService.push(Credential.from("oci-user", "oci-password")); + } + final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer + "/v2/the-image-name/tags/list") + .openConnection(); + connection.setRequestProperty("Authorization", "Basic " + Base64.encodeBase64String("oci-user:oci-password".getBytes())); + connection.connect(); + assertThat(connection.getResponseCode()).isEqualTo(200); + assertThat(IOUtils.toString(connection.getInputStream(), StandardCharsets.UTF_8)) + .contains("{\"name\":\"the-image-name\",\"tags\":[\"latest\"]}"); + } + + @Test + void pushAdditionalTags() throws Exception { + imageConfiguration = imageConfiguration.toBuilder() + .build(imageConfiguration.getBuild().toBuilder() + .tag("1.0") + .tag("1.0.0") + .build()) + .build(); + try (JibService jibService = new JibService(kitLogger, configuration, imageConfiguration)) { + jibService.push(Credential.from("oci-user", "oci-password")); + } + final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer + "/v2/the-image-name/tags/list") + .openConnection(); + connection.setRequestProperty("Authorization", "Basic " + Base64.encodeBase64String("oci-user:oci-password".getBytes())); + connection.connect(); + assertThat(connection.getResponseCode()).isEqualTo(200); + assertThat(IOUtils.toString(connection.getInputStream(), StandardCharsets.UTF_8)) + .contains("{\"name\":\"the-image-name\",\"tags\":[\"1.0\",\"1.0.0\",\"latest\"]}"); + } + } + +} diff --git a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java index 74d43c39ac..a1de472748 100644 --- a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java +++ b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java @@ -28,10 +28,7 @@ import com.google.cloud.tools.jib.api.CacheDirectoryCreationException; import com.google.cloud.tools.jib.api.Containerizer; -import com.google.cloud.tools.jib.api.Credential; -import com.google.cloud.tools.jib.api.Jib; import com.google.cloud.tools.jib.api.RegistryException; -import com.google.cloud.tools.jib.api.RegistryImage; import com.google.cloud.tools.jib.api.TarImage; import org.eclipse.jkube.kit.build.api.assembly.BuildDirs; import org.eclipse.jkube.kit.common.Assembly; @@ -58,12 +55,10 @@ import org.mockito.MockedStatic; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; import static org.eclipse.jkube.kit.service.jib.JibServiceUtil.containerFromImageConfiguration; import static org.mockito.Answers.RETURNS_SELF; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockConstructionWithAnswer; import static org.mockito.Mockito.mockStatic; @@ -217,77 +212,6 @@ void buildContainer_whenBuildFailure_thenThrowException() throws InterruptedExce } } - @Test - void jibPush_whenPushFailed_thenThrowException() throws CacheDirectoryCreationException, IOException, ExecutionException, InterruptedException, RegistryException { - try (MockedStatic containerizerMockedStatic = mockStatic(Containerizer.class); - MockedStatic jibMockedStatic = mockStatic(Jib.class)) { - // Given - JibContainerBuilder jibContainerBuilder = mock(JibContainerBuilder.class, RETURNS_SELF); - Containerizer containerizer = mock(Containerizer.class, RETURNS_SELF); - jibMockedStatic.when(() -> Jib.from(any(TarImage.class))).thenReturn(jibContainerBuilder); - containerizerMockedStatic.when(() -> Containerizer.to(any(RegistryImage.class))).thenReturn(containerizer); - when(jibContainerBuilder.containerize(containerizer)).thenThrow(new RegistryException("Unauthorized")); - ImageConfiguration imageConfiguration = getSampleImageConfiguration(); - Credential credential = Credential.from("testuser", "secret"); - File tarArchive = new File("docker-build.tar"); - // When + Then - assertThatThrownBy(() -> JibServiceUtil.jibPush(imageConfiguration, credential, tarArchive, jibLogger)) - .isInstanceOf(JKubeException.class) - .hasMessage("Exception occurred while pushing the image: test/test-project:latest, Unauthorized"); - } - } - - @Test - void jibPush_whenNoTagsInBuildConfig_thenNoAdditionalTagsAddedToContainerizer() throws CacheDirectoryCreationException, IOException, ExecutionException, InterruptedException, RegistryException { - try (MockedStatic containerizerMockedStatic = mockStatic(Containerizer.class); - MockedStatic jibMockedStatic = mockStatic(Jib.class)) { - // Given - JibContainerBuilder jibContainerBuilder = mock(JibContainerBuilder.class, RETURNS_SELF); - Containerizer containerizer = mock(Containerizer.class, RETURNS_SELF); - jibMockedStatic.when(() -> Jib.from(any(TarImage.class))).thenReturn(jibContainerBuilder); - containerizerMockedStatic.when(() -> Containerizer.to(any(RegistryImage.class))).thenReturn(containerizer); - ImageConfiguration imageConfiguration = getSampleImageConfiguration(); - Credential credential = Credential.from("testuser", "secret"); - File tarArchive = new File("docker-build.tar"); - - // When - JibServiceUtil.jibPush(imageConfiguration, credential, tarArchive, jibLogger); - - // Then - verify(containerizer, times(0)).withAdditionalTag(anyString()); - verify(jibContainerBuilder).containerize(containerizer); - } - } - - @Test - void jibPush_whenAdditionalTagsInBuildConfig_thenAdditionalTagsAddedToContainerizer() throws CacheDirectoryCreationException, IOException, ExecutionException, InterruptedException, RegistryException { - try (MockedStatic containerizerMockedStatic = mockStatic(Containerizer.class); - MockedStatic jibMockedStatic = mockStatic(Jib.class)) { - // Given - JibContainerBuilder jibContainerBuilder = mock(JibContainerBuilder.class, RETURNS_SELF); - Containerizer containerizer = mock(Containerizer.class, RETURNS_SELF); - jibMockedStatic.when(() -> Jib.from(any(TarImage.class))).thenReturn(jibContainerBuilder); - containerizerMockedStatic.when(() -> Containerizer.to(any(RegistryImage.class))).thenReturn(containerizer); - ImageConfiguration imageConfiguration = getSampleImageConfiguration(); - imageConfiguration = imageConfiguration.toBuilder() - .build(imageConfiguration.getBuild().toBuilder() - .tags(Arrays.asList("t1", "t2", "t3")) - .build()) - .build(); - Credential credential = Credential.from("testuser", "secret"); - File tarArchive = new File("docker-build.tar"); - - // When - JibServiceUtil.jibPush(imageConfiguration, credential, tarArchive, jibLogger); - - // Then - verify(containerizer).withAdditionalTag("t1"); - verify(containerizer).withAdditionalTag("t2"); - verify(containerizer).withAdditionalTag("t3"); - verify(jibContainerBuilder).containerize(containerizer); - } - } - private ImageConfiguration getSampleImageConfiguration() { return ImageConfiguration.builder() .name("test/test-project") diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java index dda3788f9a..c26a730d93 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java @@ -35,6 +35,7 @@ import org.eclipse.jkube.kit.config.service.JKubeServiceException; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; import org.eclipse.jkube.kit.service.jib.JibLogger; +import org.eclipse.jkube.kit.service.jib.JibService; import org.eclipse.jkube.kit.service.jib.JibServiceUtil; import java.io.File; @@ -84,12 +85,12 @@ public boolean isApplicable() { @Override public void buildSingleImage(ImageConfiguration imageConfiguration) throws JKubeServiceException { + kitLogger.info("[[B]]JIB[[B]] image build started"); + if (imageConfiguration.getBuildConfiguration().isDockerFileMode()) { + throw new JKubeServiceException("Dockerfile mode is not supported with JIB build strategy"); + } + final ImageConfiguration imageConfigToBuild = prependPushRegistry(imageConfiguration, configuration.getPullRegistryConfig()); try { - kitLogger.info("[[B]]JIB[[B]] image build started"); - if (imageConfiguration.getBuildConfiguration().isDockerFileMode()) { - throw new JKubeServiceException("Dockerfile mode is not supported with JIB build strategy"); - } - final ImageConfiguration imageConfigToBuild = prependPushRegistry(imageConfiguration, configuration.getPullRegistryConfig()); final BuildDirs buildDirs = new BuildDirs(imageConfigToBuild.getName(), configuration); final String pullRegistry = getPullRegistry(imageConfigToBuild, configuration.getPullRegistryConfig()); final Credential pullRegistryCredential = getRegistryCredentials( @@ -117,17 +118,11 @@ public void buildSingleImage(ImageConfiguration imageConfiguration) throws JKube @Override protected void pushSingleImage(ImageConfiguration imageConfiguration, int retries, boolean skipTag) throws JKubeServiceException { - try { - final RegistryConfig registryConfig = configuration.getPushRegistryConfig(); - final ImageConfiguration imageConfigToPush = prependPushRegistry(imageConfiguration, registryConfig); - kitLogger.info("This push refers to: %s", imageConfigToPush.getName()); - kitLogger.info("Pushing image: %s", new ImageName(imageConfigToPush.getName()).getFullName()); - JibServiceUtil.jibPush( - imageConfigToPush, - getRegistryCredentials(registryConfig, true, getPushRegistry(imageConfigToPush, registryConfig)), - getBuildTarArchive(imageConfigToPush, configuration), - jibLogger - ); + final RegistryConfig registryConfig = configuration.getPushRegistryConfig(); + final ImageConfiguration imageConfigToPush = prependPushRegistry(imageConfiguration, registryConfig); + kitLogger.info("Pushing image: %s", new ImageName(imageConfigToPush.getName()).getFullName()); + try (JibService jibService = new JibService(kitLogger, configuration, imageConfigToPush)) { + jibService.push(getRegistryCredentials(registryConfig, true, getPushRegistry(imageConfigToPush, registryConfig))); } catch (Exception ex) { throw new JKubeServiceException("Error when push JIB image", ex); } @@ -167,6 +162,7 @@ Credential getRegistryCredentials(RegistryConfig registryConfig, boolean isPush, return credentials; } + // TODO: remove in favor of JibService implementation static File getBuildTarArchive(ImageConfiguration imageConfiguration, JKubeConfiguration configuration) { BuildDirs buildDirs = new BuildDirs(imageConfiguration.getName(), configuration); return new File(buildDirs.getTemporaryRootDirectory(), JKubeBuildTarArchiver.ARCHIVE_FILE_NAME + ArchiveCompression.none.getFileSuffix()); diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceIntegrationTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceIntegrationTest.java index 538e2bbb2e..c7cbb66cae 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceIntegrationTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceIntegrationTest.java @@ -102,8 +102,6 @@ void build_dockerFileMode_shouldThrowException() { // When + Then assertThatExceptionOfType(JKubeServiceException.class) .isThrownBy(() -> jibBuildService.build(ic)) - .withMessage("Error when building JIB image") - .havingCause() .withMessage("Dockerfile mode is not supported with JIB build strategy"); } diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java index 9b3a3f201d..a2d154f964 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java @@ -15,12 +15,26 @@ import java.io.File; import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.util.Collections; +import com.google.cloud.tools.jib.api.Containerizer; +import com.google.cloud.tools.jib.api.Jib; import com.google.cloud.tools.jib.api.JibContainerBuilder; +import com.google.cloud.tools.jib.api.TarImage; +import com.google.cloud.tools.jib.api.buildplan.ImageFormat; +import com.google.cloud.tools.jib.global.JibSystemProperties; +import com.marcnuri.helm.jni.HelmLib; +import com.marcnuri.helm.jni.NativeLibrary; +import com.marcnuri.helm.jni.RepoServerOptions; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.io.IOUtils; import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.RegistryConfig; @@ -36,12 +50,16 @@ import com.google.cloud.tools.jib.api.Credential; import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import org.mockito.MockedStatic; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.ArgumentMatchers.argThat; @@ -51,14 +69,16 @@ import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockStatic; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; class JibImageBuildServiceTest { + private static HelmLib helmLib; @TempDir - Path temporaryFolder; + private Path temporaryFolder; private KitLogger logger; @@ -66,7 +86,10 @@ class JibImageBuildServiceTest { private ImageConfiguration imageConfiguration; - private MockedStatic jibServiceUtilMockedStatic; + @BeforeAll + static void setUpAll() { + helmLib = NativeLibrary.getInstance().load(); + } @BeforeEach void setUp() { @@ -81,22 +104,12 @@ void setUp() { .project(JavaProject.builder().baseDirectory(temporaryFolder.toFile()).build()) .build()) .build(); - jibServiceUtilMockedStatic = mockStatic(JibServiceUtil.class); imageConfiguration = ImageConfiguration.builder() - .name("test/testimage:0.0.1") + .name("test/test-image:0.0.1") .build(BuildConfiguration.builder() .from("busybox") .build()) .build(); - jibServiceUtilMockedStatic.when(() -> JibServiceUtil.getBaseImage(argThat(ic -> ic.getBuild().getFrom().equals("busybox")), isNull())) - .thenReturn("busybox"); - jibServiceUtilMockedStatic.when(() -> JibServiceUtil.containerFromImageConfiguration(any(), any(), any())) - .thenReturn(mock(JibContainerBuilder.class, RETURNS_DEEP_STUBS)); - } - - @AfterEach - void close() { - jibServiceUtilMockedStatic.close(); } @Test @@ -173,7 +186,7 @@ void getBuildTarArchive() throws IOException { File tarArchive = JibImageBuildService.getBuildTarArchive(imageConfiguration, createJKubeConfiguration(projectBaseDir)); // Then assertThat(tarArchive).isNotNull() - .isEqualTo(projectBaseDir.toPath().resolve("target").resolve("test").resolve("testimage").resolve("0.0.1") + .isEqualTo(projectBaseDir.toPath().resolve("target").resolve("test").resolve("test-image").resolve("0.0.1") .resolve("tmp").resolve("docker-build.tar").toFile()); } @@ -186,109 +199,214 @@ void getAssemblyTarArchive() throws IOException { File tarArchive = JibImageBuildService.getAssemblyTarArchive(imageConfiguration, createJKubeConfiguration(projectBaseDir), logger); // Then assertThat(tarArchive).isNotNull() - .isEqualTo(projectBaseDir.toPath().resolve("target").resolve("test").resolve("testimage").resolve("0.0.1") + .isEqualTo(projectBaseDir.toPath().resolve("target").resolve("test").resolve("test-image").resolve("0.0.1") .resolve("tmp").resolve("docker-build.tar").toFile()); } - @Test - void pushWithNoConfigurations() throws Exception { - // When - new JibImageBuildService(jKubeServiceHub).push(Collections.emptyList(), 1, false); - // Then - jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.jibPush(any(), any(), any(), any()), times(0)); - } + @Nested + @DisplayName("push") + class Push { - @Test - void pushWithConfiguration() throws Exception { - // Given - jKubeServiceHub = jKubeServiceHub.toBuilder() - .configuration(jKubeServiceHub.getConfiguration().toBuilder() - .pushRegistryConfig(RegistryConfig.builder() - .settings(Collections.singletonList( - RegistryServerConfiguration.builder() - .id("docker.io") - .username("testuserpush") - .password("testpass") - .build())) - .passwordDecryptionMethod(s -> s) - .build()) - .build()) - .build(); - // When - new JibImageBuildService(jKubeServiceHub).push(Collections.singletonList(imageConfiguration), 1, false); - // Then - jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.jibPush(eq(imageConfiguration), eq(Credential.from("testuserpush", "testpass")), any(), any()), times(1)); - } + private boolean sendCredentialsOverHttp; + private String remoteOciServer; - @Test - void push_withImageBuildConfigurationSkipTrue_shouldNotPushImage() throws JKubeServiceException { - // Given - imageConfiguration = ImageConfiguration.builder() - .name("test/foo:latest") - .build(BuildConfiguration.builder() - .from("test/base:latest") + @BeforeEach + void setUp() throws Exception { + sendCredentialsOverHttp = JibSystemProperties.sendCredentialsOverHttp(); + System.setProperty(JibSystemProperties.SEND_CREDENTIALS_OVER_HTTP, "true"); + + // Setup OCI server + remoteOciServer = helmLib.RepoOciServerStart( + new RepoServerOptions(null, "oci-user", "oci-password") + ).out; + + // Configure OCI server in image and JKube + imageConfiguration = imageConfiguration.toBuilder() + .registry(remoteOciServer) + .build(); + jKubeServiceHub = jKubeServiceHub.toBuilder() + .configuration(jKubeServiceHub.getConfiguration().toBuilder() + .pushRegistryConfig(RegistryConfig.builder() + .registry(remoteOciServer) + .settings(Collections.singletonList( + RegistryServerConfiguration.builder() + .id(remoteOciServer) + .username("oci-user") + .password("oci-password") + .build())) + .passwordDecryptionMethod(s -> s) + .build()) + .build()) + .build(); + + // Build fake container image + final Path tarPath = temporaryFolder + .resolve("localhost") + .resolve(remoteOciServer.split(":")[1]) + .resolve("test") + .resolve("test-image") + .resolve("0.0.1") + .resolve("tmp") + .resolve("docker-build.tar"); + Jib.fromScratch() + .setFormat(ImageFormat.Docker) + .containerize(Containerizer.to(TarImage + .at(tarPath) + .named(imageConfiguration.getName())) + ); + } + + @AfterEach + void tearDown() { + if (!sendCredentialsOverHttp) { + System.clearProperty(JibSystemProperties.SEND_CREDENTIALS_OVER_HTTP); + } + } + + @Test + void pushWithNoConfigurations_doesNothing() throws Exception { + // When + new JibImageBuildService(jKubeServiceHub).push(Collections.emptyList(), 1, false); + // Then + verify(logger, never()).info(anyString(), anyString()); + } + + @Test + void push_withImageBuildConfigurationSkipTrue_doesNothing() throws JKubeServiceException { + // Given + imageConfiguration = imageConfiguration.toBuilder() + .build(imageConfiguration.getBuild().toBuilder() .skip(true) .build()) - .build(); - // When - new JibImageBuildService(jKubeServiceHub).push(Collections.singletonList(imageConfiguration), 1, false); - // Then - jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.jibPush(any(), any(), any(), any()), times(0)); - } + .build(); + // When + new JibImageBuildService(jKubeServiceHub).push(Collections.singletonList(imageConfiguration), 1, false); + // Then + verify(logger, never()).info(anyString(), anyString()); + } + + @Test + void invalidCredentials_throwsException() { + jKubeServiceHub = jKubeServiceHub.toBuilder() + .configuration(jKubeServiceHub.getConfiguration().toBuilder() + .pushRegistryConfig(RegistryConfig.builder() + .settings(Collections.emptyList()).build()) + .build()) + .build(); + final JibImageBuildService jibImageBuildService = new JibImageBuildService(jKubeServiceHub); + assertThatThrownBy(() -> jibImageBuildService.push(Collections.singletonList(imageConfiguration), 1, false)) + .isInstanceOf(JKubeServiceException.class) + .hasMessageContaining("Error when push JIB image") + .cause() + .isInstanceOf(JKubeException.class) + .hasMessageStartingWith("Unable to containerize image using Jib: Unauthorized for localhost:"); + } + + @Nested + @DisplayName("withValidConfiguration") + class ValidConfiguration { + + @BeforeEach + void pushValidImage() throws Exception { + new JibImageBuildService(jKubeServiceHub) + .push(Collections.singletonList(imageConfiguration), 1, false); + } + + @Test + void logsImagePush() { + verify(logger, times(1)) + .info("Pushing image: %s", remoteOciServer + "/test/test-image:0.0.1"); + } + + @Test + void pushesImage() throws Exception { + final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer + "/v2/test/test-image/tags/list") + .openConnection(); + connection.setRequestProperty("Authorization", "Basic " + Base64.encodeBase64String("oci-user:oci-password".getBytes())); + connection.connect(); + assertThat(connection.getResponseCode()).isEqualTo(200); + assertThat(IOUtils.toString(connection.getInputStream(), StandardCharsets.UTF_8)) + .contains("{\"name\":\"test/test-image\",\"tags\":[\"0.0.1\"]}"); + } + } - @Test - void build_withImageMissingBuildConfiguration_shouldNotBuildImage() throws JKubeServiceException { - // Given - imageConfiguration = ImageConfiguration.builder() - .name("test/foo:latest") - .build(); - // When - new JibImageBuildService(jKubeServiceHub).build(imageConfiguration); - // Then - jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.buildContainer(any(), any(), any()), times(0)); } - @Test - void build_withImageBuildConfigurationSkipTrue_shouldNotBuildImage() throws JKubeServiceException { - // Given - imageConfiguration = ImageConfiguration.builder() - .name("test/foo:latest") - .build(BuildConfiguration.builder() + @Nested + @DisplayName("build") + class Build { + + private MockedStatic jibServiceUtilMockedStatic; + + @BeforeEach + void setUp() { + jibServiceUtilMockedStatic = mockStatic(JibServiceUtil.class); + jibServiceUtilMockedStatic.when(() -> JibServiceUtil.getBaseImage(argThat(ic -> ic.getBuild().getFrom().equals("busybox")), isNull())) + .thenReturn("busybox"); + jibServiceUtilMockedStatic.when(() -> JibServiceUtil.containerFromImageConfiguration(any(), any(), any())) + .thenReturn(mock(JibContainerBuilder.class, RETURNS_DEEP_STUBS)); + } + + @AfterEach + void close() { + jibServiceUtilMockedStatic.close(); + } + + @Test + void build_withImageMissingBuildConfiguration_shouldNotBuildImage() throws JKubeServiceException { + // Given + imageConfiguration = ImageConfiguration.builder() + .name("test/foo:latest") + .build(); + // When + new JibImageBuildService(jKubeServiceHub).build(imageConfiguration); + // Then + jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.buildContainer(any(), any(), any()), times(0)); + } + + @Test + void build_withImageBuildConfigurationSkipTrue_shouldNotBuildImage() throws JKubeServiceException { + // Given + imageConfiguration = ImageConfiguration.builder() + .name("test/foo:latest") + .build(BuildConfiguration.builder() .from("test/base:latest") .skip(true) .build()) - .build(); - // When - new JibImageBuildService(jKubeServiceHub).build(imageConfiguration); - // Then - jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.buildContainer(any(), any(), any()), times(0)); - } + .build(); + // When + new JibImageBuildService(jKubeServiceHub).build(imageConfiguration); + // Then + jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.buildContainer(any(), any(), any()), times(0)); + } - @Test - void build_shouldCallPluginServiceAddFiles() throws JKubeServiceException { - // Given - imageConfiguration = ImageConfiguration.builder() - .name("test/foo:latest") - .build(); - // When - new JibImageBuildService(jKubeServiceHub).build(imageConfiguration); - // Then - verify(logger, atLeastOnce()).debug(eq("Adding extra files for plugin %s"), anyString()); - } + @Test + void build_shouldCallPluginServiceAddFiles() throws JKubeServiceException { + // Given + imageConfiguration = ImageConfiguration.builder() + .name("test/foo:latest") + .build(); + // When + new JibImageBuildService(jKubeServiceHub).build(imageConfiguration); + // Then + verify(logger, atLeastOnce()).debug(eq("Adding extra files for plugin %s"), anyString()); + } + + @Test + void build_withRegistryConfig_shouldPrependRegistryToImageName() throws JKubeServiceException { + // Given + jKubeServiceHub = jKubeServiceHub.toBuilder() + .configuration(jKubeServiceHub.getConfiguration().toBuilder() + .pullRegistryConfig(RegistryConfig.builder().registry("quay.io").settings(Collections.emptyList()).build()) + .build()) + .build(); + // When + new JibImageBuildService(jKubeServiceHub).build(imageConfiguration); + // Then + jibServiceUtilMockedStatic.verify(() -> JibServiceUtil + .containerFromImageConfiguration(argThat(ic -> ic.getName().equals("quay.io/test/test-image:0.0.1")), any(), any()), times(1)); + } - @Test - void build_withRegistryConfig_shouldPrependRegistryToImageName() throws JKubeServiceException { - // Given - jKubeServiceHub = jKubeServiceHub.toBuilder() - .configuration(jKubeServiceHub.getConfiguration().toBuilder() - .pullRegistryConfig(RegistryConfig.builder().registry("quay.io").settings(Collections.emptyList()).build()) - .build()) - .build(); - // When - new JibImageBuildService(jKubeServiceHub).build(imageConfiguration); - // Then - jibServiceUtilMockedStatic.verify(() -> JibServiceUtil - .containerFromImageConfiguration(argThat(ic -> ic.getName().equals("quay.io/test/testimage:0.0.1")), any(), any()), times(1)); } private static JKubeConfiguration createJKubeConfiguration(File projectBaseDir) { From db6f177070dca2685f20999d90823348e9d6fa3a Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Tue, 21 May 2024 11:31:01 +0200 Subject: [PATCH 139/289] refactor: introduce AuthConfigFactory interface Signed-off-by: Marc Nuri --- .../kit/build/api/auth/AuthConfigFactory.java | 33 +++++++++++++++++++ .../build/service/docker/RegistryService.java | 4 +-- ...tory.java => DockerAuthConfigFactory.java} | 8 +++-- ....java => DockerAuthConfigFactoryTest.java} | 22 ++++++------- ...=> AwsSdkDockerAuthConfigFactoryTest.java} | 2 +- .../kubernetes/JibImageBuildService.java | 6 ++-- .../openshift/OpenshiftBuildService.java | 4 +-- .../plugin/mojo/build/AbstractDockerMojo.java | 6 ++-- 8 files changed, 60 insertions(+), 25 deletions(-) create mode 100644 jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/auth/AuthConfigFactory.java rename jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/auth/{AuthConfigFactory.java => DockerAuthConfigFactory.java} (99%) rename jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/auth/{AuthConfigFactoryTest.java => DockerAuthConfigFactoryTest.java} (92%) rename jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/auth/ecr/{AwsSdkAuthConfigFactoryTest.java => AwsSdkDockerAuthConfigFactoryTest.java} (98%) diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/auth/AuthConfigFactory.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/auth/AuthConfigFactory.java new file mode 100644 index 0000000000..f4737caef1 --- /dev/null +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/auth/AuthConfigFactory.java @@ -0,0 +1,33 @@ +/* + * 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.build.api.auth; + +import org.eclipse.jkube.kit.common.RegistryServerConfiguration; + +import java.io.IOException; +import java.util.List; +import java.util.Map; +import java.util.function.UnaryOperator; + +public interface AuthConfigFactory { + AuthConfig createAuthConfig( + boolean isPush, + boolean skipExtendedAuth, + Map authConfig, + List settings, + String user, + String registry, + UnaryOperator passwordDecryptionMethod + ) throws IOException; +} diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/RegistryService.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/RegistryService.java index 458a39de74..8e7b0ee64f 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/RegistryService.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/RegistryService.java @@ -18,7 +18,7 @@ import org.eclipse.jkube.kit.build.api.auth.AuthConfig; import org.eclipse.jkube.kit.build.service.docker.access.CreateImageOptions; import org.eclipse.jkube.kit.build.service.docker.access.DockerAccess; -import org.eclipse.jkube.kit.build.service.docker.auth.AuthConfigFactory; +import org.eclipse.jkube.kit.build.service.docker.auth.DockerAuthConfigFactory; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.EnvUtil; import org.eclipse.jkube.kit.config.image.ImageConfiguration; @@ -152,7 +152,7 @@ private boolean imageRequiresPull(boolean hasImage, ImagePullPolicy pullPolicy, private AuthConfig createAuthConfig(boolean isPush, String user, String registry, RegistryConfig config) throws IOException { - return new AuthConfigFactory(log).createAuthConfig( + return new DockerAuthConfigFactory(log).createAuthConfig( isPush, config.isSkipExtendedAuth(), config.getAuthConfig(), config.getSettings(), user, registry, config.getPasswordDecryptionMethod()); } diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/auth/AuthConfigFactory.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/auth/DockerAuthConfigFactory.java similarity index 99% rename from jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/auth/AuthConfigFactory.java rename to jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/auth/DockerAuthConfigFactory.java index d67d23f422..8d119ffb4d 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/auth/AuthConfigFactory.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/auth/DockerAuthConfigFactory.java @@ -16,6 +16,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.google.common.net.UrlEscapers; import org.apache.commons.lang3.StringUtils; +import org.eclipse.jkube.kit.build.api.auth.AuthConfigFactory; import org.eclipse.jkube.kit.build.service.docker.auth.ecr.AwsSdkAuthConfigFactory; import org.eclipse.jkube.kit.build.service.docker.auth.ecr.AwsSdkHelper; import org.eclipse.jkube.kit.common.RegistryServerConfiguration; @@ -52,7 +53,7 @@ * * @author roland */ -public class AuthConfigFactory { +public class DockerAuthConfigFactory implements AuthConfigFactory { // Properties for specifying username, password (can be encrypted), email and authtoken (not used yet) // + whether to check for OpenShift authentication @@ -70,11 +71,11 @@ public class AuthConfigFactory { "docker.io", "index.docker.io", "registry.hub.docker.com" }; - public AuthConfigFactory(KitLogger log) { + public DockerAuthConfigFactory(KitLogger log) { this(log, new AwsSdkHelper()); } - AuthConfigFactory(KitLogger log, AwsSdkHelper awsSdkHelper) { + DockerAuthConfigFactory(KitLogger log, AwsSdkHelper awsSdkHelper) { this.log = log; this.awsSdkHelper = awsSdkHelper; } @@ -116,6 +117,7 @@ public AuthConfigFactory(KitLogger log) { * * @throws IOException mojo failure exception */ + @Override public AuthConfig createAuthConfig(boolean isPush, boolean skipExtendedAuth, Map authConfig, List settings, String user, String registry, UnaryOperator passwordDecryptionMethod) throws IOException { diff --git a/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/auth/AuthConfigFactoryTest.java b/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/auth/DockerAuthConfigFactoryTest.java similarity index 92% rename from jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/auth/AuthConfigFactoryTest.java rename to jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/auth/DockerAuthConfigFactoryTest.java index b09f2055bf..068173b603 100644 --- a/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/auth/AuthConfigFactoryTest.java +++ b/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/auth/DockerAuthConfigFactoryTest.java @@ -54,9 +54,9 @@ import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.when; -class AuthConfigFactoryTest { +class DockerAuthConfigFactoryTest { static final String ECR_NAME = "123456789012.dkr.ecr.bla.amazonaws.com"; - private AuthConfigFactory factory; + private DockerAuthConfigFactory factory; private GsonBuilder gsonBuilder; private KitLogger log; private AwsSdkHelper awsSdkHelper; @@ -66,7 +66,7 @@ class AuthConfigFactoryTest { void containerSetup() { log = new KitLogger.SilentLogger(); awsSdkHelper = mock(AwsSdkHelper.class); - factory = new AuthConfigFactory(log, awsSdkHelper); + factory = new DockerAuthConfigFactory(log, awsSdkHelper); gsonBuilder = new GsonBuilder(); } @@ -85,7 +85,7 @@ void getAuthConfigFromSystemProperties() throws IOException { System.setProperty("jkube.docker.password", "testpass"); try { // When - AuthConfig authConfig = AuthConfigFactory.getAuthConfigFromSystemProperties(AuthConfigFactory.LookupMode.DEFAULT, s -> s); + AuthConfig authConfig = DockerAuthConfigFactory.getAuthConfigFromSystemProperties(DockerAuthConfigFactory.LookupMode.DEFAULT, s -> s); // Then assertAuthConfig(authConfig, "testuser", "testpass"); } finally { @@ -105,7 +105,7 @@ void getAuthConfigFromOpenShiftConfig() { .password("sometoken") .build()); // When - AuthConfig authConfig = AuthConfigFactory.getAuthConfigFromOpenShiftConfig(AuthConfigFactory.LookupMode.DEFAULT, authConfigMap); + AuthConfig authConfig = DockerAuthConfigFactory.getAuthConfigFromOpenShiftConfig(DockerAuthConfigFactory.LookupMode.DEFAULT, authConfigMap); // Then assertAuthConfig(authConfig, "test", "sometoken"); } finally { @@ -124,7 +124,7 @@ void getAuthConfigFromOpenShiftConfigWithAuthConfigMap() { .password("sometoken") .build()); // When - AuthConfig authConfig = AuthConfigFactory.getAuthConfigFromOpenShiftConfig(AuthConfigFactory.LookupMode.DEFAULT, authConfigMap); + AuthConfig authConfig = DockerAuthConfigFactory.getAuthConfigFromOpenShiftConfig(DockerAuthConfigFactory.LookupMode.DEFAULT, authConfigMap); // Then assertAuthConfig(authConfig, "test", "sometoken"); @@ -140,7 +140,7 @@ void getAuthConfigFromPluginConfiguration() { authConfigMap.put("email", "test@example.com"); // When - AuthConfig authConfig = AuthConfigFactory.getAuthConfigFromPluginConfiguration(AuthConfigFactory.LookupMode.DEFAULT, authConfigMap, s -> s); + AuthConfig authConfig = DockerAuthConfigFactory.getAuthConfigFromPluginConfiguration(DockerAuthConfigFactory.LookupMode.DEFAULT, authConfigMap, s -> s); // Then assertAuthConfig(authConfig, "testuser", "testpass"); @@ -157,7 +157,7 @@ void getAuthConfigFromSettings() { .password("testpass") .build()); // When - AuthConfig authConfig = AuthConfigFactory.getAuthConfigFromSettings(settings, "testuser", "testregistry.io", s -> s); + AuthConfig authConfig = DockerAuthConfigFactory.getAuthConfigFromSettings(settings, "testuser", "testregistry.io", s -> s); // Then assertAuthConfig(authConfig, "testuser", "testpass"); @@ -172,7 +172,7 @@ void getAuthConfigFromDockerConfig(@TempDir Path dockerConfig) throws IOExceptio try { EnvUtil.overrideEnvGetter(env::get); // When - AuthConfig authConfig = AuthConfigFactory.getAuthConfigFromDockerConfig("https://index.docker.io/v1/", log); + AuthConfig authConfig = DockerAuthConfigFactory.getAuthConfigFromDockerConfig("https://index.docker.io/v1/", log); // Then assertAuthConfig(authConfig, "testuser", "testpass"); } finally { @@ -187,7 +187,7 @@ void getStandardAuthConfigFromProperties() throws IOException { System.setProperty("jkube.docker.password", "testpass"); try { // When - AuthConfigFactory authConfigFactory = new AuthConfigFactory(log); + DockerAuthConfigFactory authConfigFactory = new DockerAuthConfigFactory(log); AuthConfig authConfig = authConfigFactory.createAuthConfig(true, true, Collections.emptyMap(), Collections.emptyList(), "testuser", "testregistry.io", s -> s); // Then assertAuthConfig(authConfig, "testuser", "testpass"); @@ -208,7 +208,7 @@ void getStandardAuthConfigFromMavenSettings() throws IOException { .build()); // When - AuthConfigFactory authConfigFactory = new AuthConfigFactory(log); + DockerAuthConfigFactory authConfigFactory = new DockerAuthConfigFactory(log); AuthConfig authConfig = authConfigFactory.createAuthConfig(true, true, Collections.emptyMap(), settings, "testuser", "testregistry.io", s -> s); // Then diff --git a/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/auth/ecr/AwsSdkAuthConfigFactoryTest.java b/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/auth/ecr/AwsSdkDockerAuthConfigFactoryTest.java similarity index 98% rename from jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/auth/ecr/AwsSdkAuthConfigFactoryTest.java rename to jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/auth/ecr/AwsSdkDockerAuthConfigFactoryTest.java index a51e2e9bd9..7967bca560 100644 --- a/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/auth/ecr/AwsSdkAuthConfigFactoryTest.java +++ b/jkube-kit/build/service/docker/src/test/java/org/eclipse/jkube/kit/build/service/docker/auth/ecr/AwsSdkDockerAuthConfigFactoryTest.java @@ -23,7 +23,7 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -class AwsSdkAuthConfigFactoryTest { +class AwsSdkDockerAuthConfigFactoryTest { private AwsSdkHelper awsSdkHelper; private AwsSdkAuthConfigFactory objectUnderTest; diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java index c26a730d93..752e6ded81 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java @@ -20,7 +20,7 @@ import org.eclipse.jkube.kit.build.api.assembly.BuildDirs; import org.eclipse.jkube.kit.build.api.assembly.JKubeBuildTarArchiver; import org.eclipse.jkube.kit.build.api.auth.AuthConfig; -import org.eclipse.jkube.kit.build.service.docker.auth.AuthConfigFactory; +import org.eclipse.jkube.kit.build.service.docker.auth.DockerAuthConfigFactory; import org.eclipse.jkube.kit.common.Assembly; import org.eclipse.jkube.kit.common.AssemblyFileEntry; import org.eclipse.jkube.kit.common.KitLogger; @@ -58,7 +58,7 @@ public class JibImageBuildService extends AbstractImageBuildService { private final KitLogger kitLogger; private final JibLogger jibLogger; - private final AuthConfigFactory authConfigFactory; + private final DockerAuthConfigFactory authConfigFactory; private final BuildServiceConfig buildServiceConfig; private final JKubeConfiguration configuration; @@ -71,7 +71,7 @@ public JibImageBuildService(JKubeServiceHub jKubeServiceHub, JibLogger jibLogger super(jKubeServiceHub); this.jibLogger = jibLogger; kitLogger = jKubeServiceHub.getLog(); - authConfigFactory = new AuthConfigFactory(kitLogger); + authConfigFactory = new DockerAuthConfigFactory(kitLogger); buildServiceConfig = Objects.requireNonNull(jKubeServiceHub.getBuildServiceConfig(), "BuildServiceConfig is required"); configuration = Objects.requireNonNull(jKubeServiceHub.getConfiguration(), 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 10d6139ad6..249a5a2681 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 @@ -28,7 +28,7 @@ import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.openshift.api.model.ImageStreamTag; import org.eclipse.jkube.kit.build.api.auth.AuthConfig; -import org.eclipse.jkube.kit.build.service.docker.auth.AuthConfigFactory; +import org.eclipse.jkube.kit.build.service.docker.auth.DockerAuthConfigFactory; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.ResourceFileType; import org.eclipse.jkube.kit.common.util.KubernetesHelper; @@ -346,7 +346,7 @@ private boolean checkOrCreatePullSecret(OpenShiftClient client, KubernetesListBu if (pullRegistry != null) { RegistryConfig registryConfig = jKubeConfiguration.getPullRegistryConfig(); - final AuthConfig authConfig = new AuthConfigFactory(log).createAuthConfig(false, registryConfig.isSkipExtendedAuth(), registryConfig.getAuthConfig(), + final AuthConfig authConfig = new DockerAuthConfigFactory(log).createAuthConfig(false, registryConfig.isSkipExtendedAuth(), registryConfig.getAuthConfig(), registryConfig.getSettings(), null, pullRegistry, registryConfig.getPasswordDecryptionMethod()); final Secret secret = Optional.ofNullable(pullSecretName) diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java index 6ac0898f91..85f5d0d05a 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java @@ -32,7 +32,7 @@ import org.eclipse.jkube.kit.common.RegistryConfig; import org.eclipse.jkube.kit.build.service.docker.DockerServiceHub; import org.eclipse.jkube.kit.build.service.docker.access.DockerAccess; -import org.eclipse.jkube.kit.build.service.docker.auth.AuthConfigFactory; +import org.eclipse.jkube.kit.build.service.docker.auth.DockerAuthConfigFactory; import org.eclipse.jkube.kit.build.service.docker.config.DockerMachineConfiguration; import org.eclipse.jkube.kit.config.image.WatchMode; import org.eclipse.jkube.kit.common.JavaProject; @@ -307,7 +307,7 @@ public abstract class AbstractDockerMojo extends AbstractMojo protected String environment; // Handler dealing with authentication credentials - protected AuthConfigFactory authConfigFactory; + protected DockerAuthConfigFactory authConfigFactory; protected KitLogger log; @@ -374,7 +374,7 @@ public final void execute() throws MojoExecutionException, MojoFailureException protected void init() { log = new AnsiLogger(getLog(), useColorForLogging(), verbose, !settings.getInteractiveMode(), getLogPrefix()); - authConfigFactory = new AuthConfigFactory(log); + authConfigFactory = new DockerAuthConfigFactory(log); clusterAccess = new ClusterAccess(initClusterConfiguration()); runtimeMode = getConfiguredRuntimeMode(); } From bfade4937bba7b67208ab0aea686b3f282bee3be Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Tue, 21 May 2024 12:46:31 +0200 Subject: [PATCH 140/289] refactor: JibService uses AuthConfigFactory interface Signed-off-by: Marc Nuri --- .../jkube/kit/service/jib/JibService.java | 46 +++++++++++++-- .../jkube/kit/service/jib/JibServiceTest.java | 57 ++++++++++++++----- .../service/jib/TestAuthConfigFactory.java | 41 +++++++++++++ .../kubernetes/JibImageBuildService.java | 10 ++-- 4 files changed, 129 insertions(+), 25 deletions(-) create mode 100644 jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/TestAuthConfigFactory.java diff --git a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java index 2c472bf1e9..9cc70ffdd9 100644 --- a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java +++ b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java @@ -25,9 +25,12 @@ import com.google.cloud.tools.jib.event.events.ProgressEvent; import org.eclipse.jkube.kit.build.api.assembly.BuildDirs; import org.eclipse.jkube.kit.build.api.assembly.JKubeBuildTarArchiver; +import org.eclipse.jkube.kit.build.api.auth.AuthConfig; +import org.eclipse.jkube.kit.build.api.auth.AuthConfigFactory; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.RegistryConfig; import org.eclipse.jkube.kit.common.archive.ArchiveCompression; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.ImageName; @@ -40,20 +43,23 @@ import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import static org.eclipse.jkube.kit.build.api.helper.RegistryUtil.getApplicablePushRegistryFrom; import static org.eclipse.jkube.kit.service.jib.JibServiceUtil.toRegistryImage; public class JibService implements AutoCloseable { private static final long JIB_EXECUTOR_SHUTDOWN_TIMEOUT_SECONDS = 10L; + private final AuthConfigFactory authConfigFactory; private final JKubeConfiguration configuration; private final ImageConfiguration imageConfiguration; private final JibLogger jibLogger; private final ExecutorService executorService; - public JibService(KitLogger kitLogger, JKubeConfiguration configuration, ImageConfiguration imageConfiguration) { + public JibService(KitLogger kitLogger, AuthConfigFactory authConfigFactory, JKubeConfiguration configuration, ImageConfiguration imageConfiguration) { + this.authConfigFactory = authConfigFactory; this.configuration = configuration; - this.imageConfiguration = imageConfiguration; + this.imageConfiguration = prependPushRegistry(imageConfiguration, configuration); jibLogger = new JibLogger(kitLogger); executorService = Executors.newCachedThreadPool(); } @@ -71,15 +77,19 @@ public void close() throws Exception { } } - public final void push(Credential pushCredentials /* TODO: remove*/) { - final String imageName = new ImageName(imageConfiguration.getName()).getFullName(); + public final void push() { + final String imageName = getImageName().getFullName(); final TarImage image = TarImage.at(getBuildTarArchive().toPath()); - final RegistryImage registryImage = toRegistryImage(imageName, pushCredentials); + final RegistryImage registryImage = toRegistryImage(imageName, getPushRegistryCredentials()); final Containerizer to = Containerizer.to(registryImage); final JibContainerBuilder from = Jib.from(image); containerize(from, to); } + public final ImageName getImageName() { + return new ImageName(imageConfiguration.getName()); + } + private void containerize(JibContainerBuilder from, Containerizer to) { to.setAllowInsecureRegistries(true); to.setExecutorService(executorService); @@ -105,5 +115,31 @@ private File getBuildTarArchive() { return new File(buildDirs.getTemporaryRootDirectory(), JKubeBuildTarArchiver.ARCHIVE_FILE_NAME + ArchiveCompression.none.getFileSuffix()); } + private Credential getPushRegistryCredentials() { + final RegistryConfig registryConfig = configuration.getPushRegistryConfig(); + final String pushRegistry = getApplicablePushRegistryFrom(imageConfiguration, registryConfig); + try { + final AuthConfig standardAuthConfig = authConfigFactory. + createAuthConfig(true, registryConfig.isSkipExtendedAuth(), registryConfig.getAuthConfig(), registryConfig.getSettings(), null, pushRegistry, registryConfig.getPasswordDecryptionMethod()); + Credential credentials = null; + if (standardAuthConfig != null) { + credentials = Credential.from(standardAuthConfig.getUsername(), standardAuthConfig.getPassword()); + } + return credentials; + } catch (IOException exception) { + throw new JKubeException("Error when getting push registry credentials", exception); + } + } + + private static ImageConfiguration prependPushRegistry(ImageConfiguration imageConfiguration, JKubeConfiguration configuration) { + final ImageConfiguration.ImageConfigurationBuilder icBuilder = imageConfiguration.toBuilder(); + final ImageName imageName = new ImageName(imageConfiguration.getName()); + final String pushRegistry = getApplicablePushRegistryFrom(imageConfiguration, configuration.getPushRegistryConfig()); + if (!imageName.hasRegistry() && pushRegistry != null) { + icBuilder.name(imageName.getFullName(pushRegistry)); + icBuilder.registry(pushRegistry); + } + return icBuilder.build(); + } } diff --git a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java index 02ade5cf2c..3deeb4bdf1 100644 --- a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java +++ b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java @@ -14,7 +14,6 @@ package org.eclipse.jkube.kit.service.jib; import com.google.cloud.tools.jib.api.Containerizer; -import com.google.cloud.tools.jib.api.Credential; import com.google.cloud.tools.jib.api.Jib; import com.google.cloud.tools.jib.api.RegistryUnauthorizedException; import com.google.cloud.tools.jib.api.TarImage; @@ -30,6 +29,8 @@ import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.RegistryConfig; +import org.eclipse.jkube.kit.common.RegistryServerConfiguration; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.junit.jupiter.api.AfterEach; @@ -44,6 +45,7 @@ import java.net.URL; import java.nio.charset.StandardCharsets; import java.nio.file.Path; +import java.util.Collections; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -55,6 +57,7 @@ class JibServiceTest { private Path tempDir; private String remoteOciServer; private KitLogger kitLogger; + private TestAuthConfigFactory testAuthConfigFactory; private JKubeConfiguration configuration; private ImageConfiguration imageConfiguration; @@ -69,7 +72,16 @@ void setUp() { new RepoServerOptions(null, "oci-user", "oci-password") ).out; kitLogger = new KitLogger.SilentLogger(); + testAuthConfigFactory = new TestAuthConfigFactory(); configuration = JKubeConfiguration.builder() + .pushRegistryConfig(RegistryConfig.builder() + .registry(remoteOciServer) + .settings(Collections.singletonList(RegistryServerConfiguration.builder() + .id(remoteOciServer) + .username("oci-user") + .password("oci-password") + .build())) + .build()) .project(JavaProject.builder() .baseDirectory(tempDir.toFile()) .build()) @@ -82,6 +94,19 @@ void setUp() { .build(); } + @Test + void prependsRegistryWhenNotConfiguredInName() throws Exception { + configuration = configuration.toBuilder() + .pushRegistryConfig(RegistryConfig.builder() + .registry("prepend.example.com") + .build()) + .build(); + imageConfiguration = ImageConfiguration.builder().name("the-image-name").build(); + try (JibService jibService = new JibService(kitLogger, testAuthConfigFactory, configuration, imageConfiguration)) { + assertThat(jibService.getImageName().getFullName()).isEqualTo("prepend.example.com/the-image-name:latest"); + } + } + @Nested @DisplayName("push") class Push { @@ -89,9 +114,10 @@ class Push { private boolean sendCredentialsOverHttp; @BeforeEach - void buildContainer() throws Exception { + void setUp() throws Exception { sendCredentialsOverHttp = JibSystemProperties.sendCredentialsOverHttp(); System.setProperty(JibSystemProperties.SEND_CREDENTIALS_OVER_HTTP, "true"); + final BuildDirs buildDirs = new BuildDirs(imageConfiguration.getName(), configuration); Jib.fromScratch() .setFormat(ImageFormat.Docker) @@ -109,19 +135,20 @@ void tearDown() { } @Test - void emptyImageNameThrowsException() throws Exception { - try (JibService jibService = new JibService(kitLogger, configuration, ImageConfiguration.builder().build())) { - assertThatThrownBy(() -> jibService.push(null)) - .isInstanceOf(NullPointerException.class) - .hasMessage("Image name must not be null"); - } + void emptyImageNameThrowsException() { + final ImageConfiguration emptyImageConfiguration = ImageConfiguration.builder().build(); + assertThatThrownBy(() -> new JibService(kitLogger, testAuthConfigFactory, configuration, emptyImageConfiguration)) + .isInstanceOf(NullPointerException.class) + .hasMessage("Image name must not be null"); } @Test void pushInvalidCredentials() throws Exception { - final Credential invalidCredential = Credential.from("oci-user", "oci-password-invalid"); - try (JibService jibService = new JibService(kitLogger, configuration, imageConfiguration)) { - assertThatThrownBy(() -> jibService.push(invalidCredential)) + configuration = configuration.toBuilder() + .pushRegistryConfig(RegistryConfig.builder().build()) + .build(); + try (JibService jibService = new JibService(kitLogger, testAuthConfigFactory, configuration, imageConfiguration)) { + assertThatThrownBy(jibService::push) .isInstanceOf(JKubeException.class) .hasMessageContaining("Unable to containerize image using Jib: Unauthorized for") .cause() @@ -131,8 +158,8 @@ void pushInvalidCredentials() throws Exception { @Test void push() throws Exception { - try (JibService jibService = new JibService(kitLogger, configuration, imageConfiguration)) { - jibService.push(Credential.from("oci-user", "oci-password")); + try (JibService jibService = new JibService(kitLogger, testAuthConfigFactory, configuration, imageConfiguration)) { + jibService.push(); } final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer + "/v2/the-image-name/tags/list") .openConnection(); @@ -151,8 +178,8 @@ void pushAdditionalTags() throws Exception { .tag("1.0.0") .build()) .build(); - try (JibService jibService = new JibService(kitLogger, configuration, imageConfiguration)) { - jibService.push(Credential.from("oci-user", "oci-password")); + try (JibService jibService = new JibService(kitLogger, testAuthConfigFactory, configuration, imageConfiguration)) { + jibService.push(); } final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer + "/v2/the-image-name/tags/list") .openConnection(); diff --git a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/TestAuthConfigFactory.java b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/TestAuthConfigFactory.java new file mode 100644 index 0000000000..f82dcf3ef3 --- /dev/null +++ b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/TestAuthConfigFactory.java @@ -0,0 +1,41 @@ +/* + * 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.service.jib; + +import org.eclipse.jkube.kit.build.api.auth.AuthConfig; +import org.eclipse.jkube.kit.build.api.auth.AuthConfigFactory; +import org.eclipse.jkube.kit.common.RegistryServerConfiguration; + +import java.util.List; +import java.util.Map; +import java.util.function.UnaryOperator; + +public class TestAuthConfigFactory implements AuthConfigFactory { + + @Override + public AuthConfig createAuthConfig(boolean isPush, boolean skipExtendedAuth, Map authConfig, List settings, String user, String registry, UnaryOperator passwordDecryptionMethod) { + if (settings == null) { + return null; + } + for (RegistryServerConfiguration setting : settings) { + if (setting.getId().equals(registry)) { + return AuthConfig.builder() + .username(setting.getUsername()) + .password(setting.getPassword()) + .build(); + } + } + return null; + } +} diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java index 752e6ded81..45876641e3 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java @@ -118,11 +118,9 @@ public void buildSingleImage(ImageConfiguration imageConfiguration) throws JKube @Override protected void pushSingleImage(ImageConfiguration imageConfiguration, int retries, boolean skipTag) throws JKubeServiceException { - final RegistryConfig registryConfig = configuration.getPushRegistryConfig(); - final ImageConfiguration imageConfigToPush = prependPushRegistry(imageConfiguration, registryConfig); - kitLogger.info("Pushing image: %s", new ImageName(imageConfigToPush.getName()).getFullName()); - try (JibService jibService = new JibService(kitLogger, configuration, imageConfigToPush)) { - jibService.push(getRegistryCredentials(registryConfig, true, getPushRegistry(imageConfigToPush, registryConfig))); + try (JibService jibService = new JibService(kitLogger, authConfigFactory, configuration, imageConfiguration)) { + kitLogger.info("Pushing image: %s", jibService.getImageName().getFullName()); + jibService.push(); } catch (Exception ex) { throw new JKubeServiceException("Error when push JIB image", ex); } @@ -133,6 +131,7 @@ public void postProcess() { // No post processing required } + // TODO: remove in favor of JibService implementation static ImageConfiguration prependPushRegistry(ImageConfiguration imageConfiguration, RegistryConfig registryConfig) { final ImageConfiguration.ImageConfigurationBuilder icBuilder = imageConfiguration.toBuilder(); final ImageName imageName = new ImageName(imageConfiguration.getName()); @@ -151,6 +150,7 @@ static File getAssemblyTarArchive(ImageConfiguration imageConfig, JKubeConfigura .createDockerTarArchive(targetImage, configuration, imageConfig.getBuildConfiguration(), log, null); } + // TODO: remove in favor of JibService implementation Credential getRegistryCredentials(RegistryConfig registryConfig, boolean isPush, String registry) throws IOException { From 225d80bffc50cea9357943fbc1da4c13f37b4ee1 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Wed, 22 May 2024 06:50:48 +0200 Subject: [PATCH 141/289] refactor: introduce JibService abstraction layer for build Signed-off-by: Marc Nuri --- .../build/api/helper/RegistryUtilTest.java | 215 +++++++-- .../jkube/kit/service/jib/JibLogger.java | 3 +- .../jkube/kit/service/jib/JibService.java | 65 ++- .../jkube/kit/service/jib/JibServiceUtil.java | 50 --- .../jkube/kit/service/jib/JibServiceTest.java | 14 +- .../kit/service/jib/JibServiceUtilTest.java | 64 --- .../common/util/AnsiLoggerFallbackTest.java | 7 +- .../eclipse/jkube/kit/common/KitLogger.java | 26 +- .../service/AbstractImageBuildService.java | 1 + .../kubernetes/JibImageBuildService.java | 97 +--- ...ava => JibImageBuildServiceBuildTest.java} | 67 ++- ...BuildServiceGetApplicableRegistryTest.java | 193 -------- .../JibImageBuildServicePushTest.java | 210 +++++++++ .../kubernetes/JibImageBuildServiceTest.java | 424 ++---------------- 14 files changed, 578 insertions(+), 858 deletions(-) rename jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/{JibImageBuildServiceIntegrationTest.java => JibImageBuildServiceBuildTest.java} (82%) delete mode 100644 jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceGetApplicableRegistryTest.java create mode 100644 jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServicePushTest.java diff --git a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/RegistryUtilTest.java b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/RegistryUtilTest.java index 8f9789b228..19750d19dc 100644 --- a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/RegistryUtilTest.java +++ b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/helper/RegistryUtilTest.java @@ -13,19 +13,25 @@ */ package org.eclipse.jkube.kit.build.api.helper; -import org.apache.commons.lang3.StringUtils; 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.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + import static org.assertj.core.api.Assertions.assertThat; +import static org.eclipse.jkube.kit.build.api.helper.RegistryUtil.getApplicablePullRegistryFrom; +import static org.eclipse.jkube.kit.build.api.helper.RegistryUtil.getApplicablePushRegistryFrom; class RegistryUtilTest { @Test void getApplicablePushRegistryFrom_whenImageNameContainsRegistry_thenUseRegistryFromImageName() { // Given - ImageConfiguration imageConfiguration = createNewImageConfiguration("word.word/word/word:tag", null); - RegistryConfig registryConfig = createNewRegistryConfig(); - + final ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .name("word.word/word/word:tag") + .build(); + final RegistryConfig registryConfig = RegistryConfig.builder().registry("registry-config.io").build(); // When + Then assertThat(RegistryUtil.getApplicablePushRegistryFrom(imageConfiguration, registryConfig)) .isEqualTo("word.word"); @@ -34,9 +40,11 @@ void getApplicablePushRegistryFrom_whenImageNameContainsRegistry_thenUseRegistry @Test void getApplicablePushRegistryFrom_whenImageNameHasNoRegistryAndImageConfigHasRegistry_thenUseImageConfigRegistry() { // Given - ImageConfiguration imageConfiguration = createNewImageConfiguration("word/word:tag", "word.word"); - RegistryConfig registryConfig = createNewRegistryConfig(); - + final ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .name("word/word:tag") + .registry("word.word") + .build(); + final RegistryConfig registryConfig = RegistryConfig.builder().registry("registry-config.io").build(); // When + Then assertThat(RegistryUtil.getApplicablePushRegistryFrom(imageConfiguration, registryConfig)) .isEqualTo("word.word"); @@ -45,9 +53,10 @@ void getApplicablePushRegistryFrom_whenImageNameHasNoRegistryAndImageConfigHasRe @Test void getApplicablePushRegistryFrom_whenImageNameNotFullyQualified_thenGivePriorityToOtherSources() { // Given - ImageConfiguration imageConfiguration = createNewImageConfiguration("word.word/word:tag", null); - RegistryConfig registryConfig = createNewRegistryConfig(); - + final ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .name("word.word/word:tag") + .build(); + final RegistryConfig registryConfig = RegistryConfig.builder().registry("registry-config.io").build(); // When + Then assertThat(RegistryUtil.getApplicablePushRegistryFrom(imageConfiguration, registryConfig)) .isEqualTo("registry-config.io"); @@ -56,9 +65,10 @@ void getApplicablePushRegistryFrom_whenImageNameNotFullyQualified_thenGivePriori @Test void getApplicablePushRegistryFrom_whenNoRegistryInImageConfig_thenUseImageConfigRegistry() { // Given - ImageConfiguration imageConfiguration = createNewImageConfiguration("word/word:tag", null); - RegistryConfig registryConfig = createNewRegistryConfig(); - + final ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .name("word/word:tag") + .build(); + final RegistryConfig registryConfig = RegistryConfig.builder().registry("registry-config.io").build(); // When + Then assertThat(RegistryUtil.getApplicablePushRegistryFrom(imageConfiguration, registryConfig)) .isEqualTo("registry-config.io"); @@ -67,8 +77,7 @@ void getApplicablePushRegistryFrom_whenNoRegistryInImageConfig_thenUseImageConfi @Test void getApplicablePullRegistryFrom_whenRegistryInImageName_thenUseRegistryFromImageName() { // Given - RegistryConfig registryConfig = createNewRegistryConfig(); - + final RegistryConfig registryConfig = RegistryConfig.builder().registry("registry-config.io").build(); // When + Then assertThat(RegistryUtil.getApplicablePullRegistryFrom("word.word/word/word:tag", registryConfig)) .isEqualTo("word.word"); @@ -77,8 +86,7 @@ void getApplicablePullRegistryFrom_whenRegistryInImageName_thenUseRegistryFromIm @Test void getApplicablePullRegistryFrom_whenRegistryInRegistryConfig_thenUseRegistryFromRegistryConfig() { // Given - RegistryConfig registryConfig = createNewRegistryConfig(); - + final RegistryConfig registryConfig = RegistryConfig.builder().registry("registry-config.io").build(); // When + Then assertThat(RegistryUtil.getApplicablePullRegistryFrom("word:tag", registryConfig)) .isEqualTo("registry-config.io"); @@ -87,25 +95,170 @@ void getApplicablePullRegistryFrom_whenRegistryInRegistryConfig_thenUseRegistryF @Test void getApplicablePullRegistryFrom_whenRegistryInRegistryConfigAndImageNameNotFullyQualified_thenUseRegistryFromRegistryConfig() { // Given - RegistryConfig registryConfig = createNewRegistryConfig(); - + final RegistryConfig registryConfig = RegistryConfig.builder().registry("registry-config.io").build(); // When + Then assertThat(RegistryUtil.getApplicablePullRegistryFrom("word.word/word:tag", registryConfig)) .isEqualTo("registry-config.io"); } - private ImageConfiguration createNewImageConfiguration(String name, String registry) { - ImageConfiguration.ImageConfigurationBuilder imageConfigurationBuilder = ImageConfiguration.builder(); - imageConfigurationBuilder.name(name); - if (StringUtils.isNotBlank(registry)) { - imageConfigurationBuilder.registry(registry); - } - return imageConfigurationBuilder.build(); + @ParameterizedTest(name = "pull {0}, when no registry from any source, then pull registry {1}") + @CsvSource({ + "word:word,", + "word/word:tag,", + "word.word/word/word:tag,word.word", + "word:5000/word:tag,word:5000", + "word.word:5000/word:tag,word.word:5000", + "word.word/word:tag,word.word", + "word.word/word.word/word:tag,word.word", + "word.word.word/word:tag,word.word.word", + "word.word.word/word/word:tag,word.word.word" + }) + void pull_whenRegistryNotPresentFromAnySource_thenReturnRegistryFromImageName(String from, String expectedPullRegistry) { + // Given + final RegistryConfig registryConfig = RegistryConfig.builder().build(); + // When + final String pullRegistry = getApplicablePullRegistryFrom(from, registryConfig); + // Then + assertThat(pullRegistry).isEqualTo(expectedPullRegistry); } - private RegistryConfig createNewRegistryConfig() { - return RegistryConfig.builder() - .registry("registry-config.io") - .build(); + @ParameterizedTest(name = "pull {0} when registry present both in image name and registry config, then registry taken from image name {1}") + @CsvSource({ + "word.word/word/word:tag,word.word", + "word:5000/word:tag,word:5000", + "word.word:5000/word:tag,word.word:5000", + "word.word/word.word/word:tag,word.word", + "word.word.word/word/word:tag,word.word.word" + }) + void pull_whenRegistryPresentInBothImageNameAndRegistryConfig_thenReturnRegistryFromImageName(String from, String expectedPullRegistry) { + // Given + final RegistryConfig registryConfig = RegistryConfig.builder().registry("quay.io").build(); + // When + final String pullRegistry = getApplicablePullRegistryFrom(from, registryConfig); + // Then + assertThat(pullRegistry).isEqualTo(expectedPullRegistry); } -} \ No newline at end of file + + @ParameterizedTest(name = "pull {0} and registry from registry config, then registry from registry config {1}") + @CsvSource({ + "word:word,quay.io", + "word/word:tag,quay.io", + "word.word/word:tag,quay.io" + }) + void pull_whenRegistryFromRegistryConfig_thenReturnRegistryFromRegistryConfig(String from, String expectedPullRegistry) { + // Given + final RegistryConfig registryConfig = RegistryConfig.builder().registry("quay.io").build(); + // When + final String pullRegistry = getApplicablePullRegistryFrom(from, registryConfig); + // Then + assertThat(pullRegistry).isEqualTo(expectedPullRegistry); + } + + @ParameterizedTest(name = "push {0} when no registry from any source, then push registry from image name {1}") + @CsvSource({ + "word:word,", + "word/word:tag,", + "word.word/word:tag,word.word", + "word.word/word/word:tag,word.word", + "word.word/word.word/word:tag,word.word", + "word:5000/word:tag,word:5000", + "word.word:5000/word:tag,word.word:5000", + "word.word.word/word:tag,word.word.word", + "word.word.word/word/word:tag,word.word.word" + }) + void push_whenRegistryNotPresentFromAnySource_thenReturnRegistryFromImageName(String imageName, String expectedPushRegistry) { + // Given + final ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .name(imageName) + .build(BuildConfiguration.builder().from("test-image:latest").build()) + .build(); + final RegistryConfig registryConfig = RegistryConfig.builder().build(); + // When + final String pushRegistry = getApplicablePushRegistryFrom(imageConfiguration, registryConfig); + // Then + assertThat(pushRegistry).isEqualTo(expectedPushRegistry); + } + + @ParameterizedTest(name = "push {0} when registry present both in image name and registry config, then registry taken from image name {1}") + @CsvSource({ + "word.word/word/word:tag,word.word", + "word.word/word.word/word:tag,word.word", + "word:5000/word:tag,word:5000", + "word.word:5000/word:tag,word.word:5000", + "word.word.word/word/word:tag,word.word.word" + }) + void push_whenRegistryInBothImageNameAndRegistryConfig_thenUseRegistryFromImageName(String imageName, String expectedPushRegistry) { + // Given + final ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .name(imageName) + .build(BuildConfiguration.builder().from("test-image:latest").build()) + .build(); + final RegistryConfig registryConfig = RegistryConfig.builder().registry("quay.io").build(); + // When + final String pushRegistry = getApplicablePushRegistryFrom(imageConfiguration, registryConfig); + // Then + assertThat(pushRegistry).isEqualTo(expectedPushRegistry); + } + + @ParameterizedTest(name = "push {0} when registry present both in image name and image config, then registry taken from image name {1}") + @CsvSource({ + "word.word/word/word:tag,word.word", + "word.word/word.word/word:tag,word.word", + "word:5000/word:tag,word:5000", + "word.word:5000/word:tag,word.word:5000", + "word.word.word/word/word:tag,word.word.word" + }) + void push_whenRegistryPresentInBothImageNameAndImageConfig_thenUseRegistryFromImageName(String imageName, String expectedPushRegistry) { + // Given + final ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .name(imageName) + .build(BuildConfiguration.builder().from("test-image:latest").build()) + .registry("quay.io") + .build(); + final RegistryConfig registryConfig = RegistryConfig.builder().build(); + // When + final String pushRegistry = getApplicablePushRegistryFrom(imageConfiguration, registryConfig); + // Then + assertThat(pushRegistry).isEqualTo(expectedPushRegistry); + } + + @ParameterizedTest(name = "push {0} when registry from image config, then registry used from image config {1}") + @CsvSource({ + "word:word,quay.io", + "word/word:tag,quay.io", + "word.word/word:tag,quay.io" + }) + void push_whenRegistryFromImageConfig_thenReturnRegistryFromImageConfig(String imageName, String expectedPushRegistry) { + // Given + final ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .name(imageName) + .build(BuildConfiguration.builder().from("test-image:latest").build()) + .registry("quay.io") + .build(); + final RegistryConfig registryConfig = RegistryConfig.builder().build(); + // When + final String pushRegistry = getApplicablePushRegistryFrom(imageConfiguration, registryConfig); + // Then + assertThat(pushRegistry).isEqualTo(expectedPushRegistry); + } + + @ParameterizedTest(name = "push {0} when registry from registry config, then registry used from registry config {1}") + @CsvSource({ + "word:word,quay.io", + "word/word:tag,quay.io", + "word.word/word:tag,quay.io" + }) + void push_whenRegistryFromRegistryConfig_thenReturnRegistryFromRegistryConfig(String imageName, String expectedPushRegistry) { + // Given + final ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .name(imageName) + .build(BuildConfiguration.builder().from("test-image:latest").build()) + .build(); + final RegistryConfig registryConfig = RegistryConfig.builder().registry("quay.io").build(); + // When + final String pushRegistry = getApplicablePushRegistryFrom(imageConfiguration, registryConfig); + // Then + assertThat(pushRegistry).isEqualTo(expectedPushRegistry); + } + +} diff --git a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibLogger.java b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibLogger.java index ec45a9d526..1190569acd 100644 --- a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibLogger.java +++ b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibLogger.java @@ -39,7 +39,8 @@ public class JibLogger implements Consumer { private static final int PROGRESS_BAR_COUNT = 30; public static final String JIB_LOG_PREFIX = "JIB> "; - private final KitLogger logger; + // Shouldn't be exposed, however, it's needed by AssemblyManager + final KitLogger logger; private final PrintStream out; public JibLogger(KitLogger logger) { diff --git a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java index 9cc70ffdd9..9b1bdf1c9c 100644 --- a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java +++ b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java @@ -16,6 +16,7 @@ import com.google.cloud.tools.jib.api.CacheDirectoryCreationException; import com.google.cloud.tools.jib.api.Containerizer; import com.google.cloud.tools.jib.api.Credential; +import com.google.cloud.tools.jib.api.InvalidImageReferenceException; import com.google.cloud.tools.jib.api.Jib; import com.google.cloud.tools.jib.api.JibContainerBuilder; import com.google.cloud.tools.jib.api.LogEvent; @@ -23,13 +24,15 @@ import com.google.cloud.tools.jib.api.RegistryImage; import com.google.cloud.tools.jib.api.TarImage; import com.google.cloud.tools.jib.event.events.ProgressEvent; +import org.eclipse.jkube.kit.build.api.assembly.AssemblyManager; import org.eclipse.jkube.kit.build.api.assembly.BuildDirs; import org.eclipse.jkube.kit.build.api.assembly.JKubeBuildTarArchiver; import org.eclipse.jkube.kit.build.api.auth.AuthConfig; import org.eclipse.jkube.kit.build.api.auth.AuthConfigFactory; +import org.eclipse.jkube.kit.common.Assembly; +import org.eclipse.jkube.kit.common.AssemblyFileEntry; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.JKubeException; -import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.RegistryConfig; import org.eclipse.jkube.kit.common.archive.ArchiveCompression; import org.eclipse.jkube.kit.config.image.ImageConfiguration; @@ -38,29 +41,33 @@ import java.io.File; import java.io.IOException; import java.time.Instant; +import java.util.List; +import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; +import static org.eclipse.jkube.kit.build.api.helper.RegistryUtil.getApplicablePullRegistryFrom; import static org.eclipse.jkube.kit.build.api.helper.RegistryUtil.getApplicablePushRegistryFrom; +import static org.eclipse.jkube.kit.service.jib.JibServiceUtil.containerFromImageConfiguration; import static org.eclipse.jkube.kit.service.jib.JibServiceUtil.toRegistryImage; public class JibService implements AutoCloseable { private static final long JIB_EXECUTOR_SHUTDOWN_TIMEOUT_SECONDS = 10L; + private final JibLogger jibLogger; private final AuthConfigFactory authConfigFactory; private final JKubeConfiguration configuration; private final ImageConfiguration imageConfiguration; - private final JibLogger jibLogger; private final ExecutorService executorService; - public JibService(KitLogger kitLogger, AuthConfigFactory authConfigFactory, JKubeConfiguration configuration, ImageConfiguration imageConfiguration) { + public JibService(JibLogger jibLogger, AuthConfigFactory authConfigFactory, JKubeConfiguration configuration, ImageConfiguration imageConfiguration) { + this.jibLogger = jibLogger; this.authConfigFactory = authConfigFactory; this.configuration = configuration; this.imageConfiguration = prependPushRegistry(imageConfiguration, configuration); - jibLogger = new JibLogger(kitLogger); executorService = Executors.newCachedThreadPool(); } @@ -77,12 +84,42 @@ public void close() throws Exception { } } + public final File build() { + final BuildDirs buildDirs = new BuildDirs(imageConfiguration.getName(), configuration); + final String pullRegistry = getApplicablePullRegistryFrom(imageConfiguration.getBuildConfiguration().getFrom(), configuration.getPullRegistryConfig()); + final Credential pullRegistryCredential = getPullRegistryCredentials(); + final JibContainerBuilder from = containerFromImageConfiguration(imageConfiguration, pullRegistry, pullRegistryCredential); + + try { + // Prepare Assembly files + final AssemblyManager assemblyManager = AssemblyManager.getInstance(); + final Map> layers = assemblyManager.copyFilesToFinalTarballDirectory( + configuration, + buildDirs, + AssemblyManager.getAssemblyConfiguration(imageConfiguration.getBuildConfiguration(), configuration) + ); + JibServiceUtil.layers(buildDirs, layers).forEach(from::addFileEntriesLayer); + // TODO: Improve Assembly Manager so that the effective assemblyFileEntries computed can be properly shared + // the call to AssemblyManager.getInstance().createDockerTarArchive should not be necessary, + // files should be added using the AssemblyFileEntry list. AssemblyManager, should provide + // a common way to achieve this so that both the tar builder and any other builder could get a hold of + // archive customizers, file entries, etc. + final File dockerTarArchive = assemblyManager.createDockerTarArchive( + imageConfiguration.getName(), configuration, imageConfiguration.getBuildConfiguration(), jibLogger.logger, null); + + final Containerizer to = Containerizer.to(TarImage.at(dockerTarArchive.toPath()).named(imageConfiguration.getName())); + containerize(from, to); + return dockerTarArchive; + } catch (IOException | InvalidImageReferenceException ex) { + throw new JKubeException("Unable to build the image tarball: " + ex.getMessage(), ex); + } + } + public final void push() { - final String imageName = getImageName().getFullName(); final TarImage image = TarImage.at(getBuildTarArchive().toPath()); - final RegistryImage registryImage = toRegistryImage(imageName, getPushRegistryCredentials()); - final Containerizer to = Containerizer.to(registryImage); final JibContainerBuilder from = Jib.from(image); + final RegistryImage registryImage = toRegistryImage(getImageName().getFullName(), getPushRegistryCredentials()); + final Containerizer to = Containerizer.to(registryImage); containerize(from, to); } @@ -115,19 +152,29 @@ private File getBuildTarArchive() { return new File(buildDirs.getTemporaryRootDirectory(), JKubeBuildTarArchiver.ARCHIVE_FILE_NAME + ArchiveCompression.none.getFileSuffix()); } + private Credential getPullRegistryCredentials() { + final RegistryConfig registryConfig = configuration.getPullRegistryConfig(); + final String pullRegistry = getApplicablePullRegistryFrom(imageConfiguration.getBuildConfiguration().getFrom(), registryConfig); + return getCredentials(false, registryConfig, pullRegistry); + } + private Credential getPushRegistryCredentials() { final RegistryConfig registryConfig = configuration.getPushRegistryConfig(); final String pushRegistry = getApplicablePushRegistryFrom(imageConfiguration, registryConfig); + return getCredentials(true, registryConfig, pushRegistry); + } + + private Credential getCredentials(boolean isPush, RegistryConfig registryConfig, String registry) { try { final AuthConfig standardAuthConfig = authConfigFactory. - createAuthConfig(true, registryConfig.isSkipExtendedAuth(), registryConfig.getAuthConfig(), registryConfig.getSettings(), null, pushRegistry, registryConfig.getPasswordDecryptionMethod()); + createAuthConfig(isPush, registryConfig.isSkipExtendedAuth(), registryConfig.getAuthConfig(), registryConfig.getSettings(), null, registry, registryConfig.getPasswordDecryptionMethod()); Credential credentials = null; if (standardAuthConfig != null) { credentials = Credential.from(standardAuthConfig.getUsername(), standardAuthConfig.getPassword()); } return credentials; } catch (IOException exception) { - throw new JKubeException("Error when getting push registry credentials", exception); + throw new JKubeException("Error when getting registry credentials", exception); } } diff --git a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java index 3de9210440..b7f49445ca 100644 --- a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java +++ b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java @@ -14,17 +14,11 @@ package org.eclipse.jkube.kit.service.jib; import java.io.File; -import java.io.IOException; import java.nio.file.Path; -import java.time.Instant; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; import java.util.function.Predicate; import java.util.stream.Collectors; @@ -37,22 +31,16 @@ import org.eclipse.jkube.kit.common.Arguments; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; -import com.google.cloud.tools.jib.api.CacheDirectoryCreationException; -import com.google.cloud.tools.jib.api.Containerizer; import com.google.cloud.tools.jib.api.Credential; import com.google.cloud.tools.jib.api.InvalidImageReferenceException; import com.google.cloud.tools.jib.api.Jib; import com.google.cloud.tools.jib.api.JibContainerBuilder; -import com.google.cloud.tools.jib.api.LogEvent; -import com.google.cloud.tools.jib.api.RegistryException; import com.google.cloud.tools.jib.api.RegistryImage; -import com.google.cloud.tools.jib.api.TarImage; import com.google.cloud.tools.jib.api.buildplan.AbsoluteUnixPath; import com.google.cloud.tools.jib.api.buildplan.FileEntriesLayer; import com.google.cloud.tools.jib.api.buildplan.FilePermissions; import com.google.cloud.tools.jib.api.buildplan.ImageFormat; import com.google.cloud.tools.jib.api.buildplan.Port; -import com.google.cloud.tools.jib.event.events.ProgressEvent; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; @@ -63,36 +51,8 @@ public class JibServiceUtil { private JibServiceUtil() { } - private static final long JIB_EXECUTOR_SHUTDOWN_TIMEOUT_SECONDS = 10L; private static final String BUSYBOX = "busybox:latest"; - /** - * Build container image using JIB - * - * @param jibContainerBuilder jib container builder object - * @param image tarball for image - * @param logger kit logger - */ - public static void buildContainer(JibContainerBuilder jibContainerBuilder, TarImage image, JibLogger logger) { - final ExecutorService jibBuildExecutor = Executors.newCachedThreadPool(); - try { - jibContainerBuilder.setCreationTime(Instant.now()); - jibContainerBuilder.containerize(Containerizer.to(image) - .setAllowInsecureRegistries(true) - .setExecutorService(jibBuildExecutor) - .addEventHandler(LogEvent.class, logger) - .addEventHandler(ProgressEvent.class, logger.progressEventHandler())); - logger.updateFinished(); - } catch (CacheDirectoryCreationException | IOException | ExecutionException | RegistryException ex) { - throw new JKubeException("Unable to build the image tarball: " + ex.getMessage(), ex); - } catch (InterruptedException ex) { - Thread.currentThread().interrupt(); - throw new JKubeException("Thread Interrupted", ex); - } finally { - shutdownAndWait(jibBuildExecutor); - } - } - public static JibContainerBuilder containerFromImageConfiguration( ImageConfiguration imageConfiguration, String pullRegistry, Credential pullRegistryCredential) { final JibContainerBuilder containerBuilder = Jib @@ -180,14 +140,4 @@ public static List layers(BuildDirs buildDirs, Map new JibService(kitLogger, testAuthConfigFactory, configuration, emptyImageConfiguration)) + assertThatThrownBy(() -> new JibService(jibLogger, testAuthConfigFactory, configuration, emptyImageConfiguration)) .isInstanceOf(NullPointerException.class) .hasMessage("Image name must not be null"); } @@ -147,7 +147,7 @@ void pushInvalidCredentials() throws Exception { configuration = configuration.toBuilder() .pushRegistryConfig(RegistryConfig.builder().build()) .build(); - try (JibService jibService = new JibService(kitLogger, testAuthConfigFactory, configuration, imageConfiguration)) { + try (JibService jibService = new JibService(jibLogger, testAuthConfigFactory, configuration, imageConfiguration)) { assertThatThrownBy(jibService::push) .isInstanceOf(JKubeException.class) .hasMessageContaining("Unable to containerize image using Jib: Unauthorized for") @@ -158,7 +158,7 @@ void pushInvalidCredentials() throws Exception { @Test void push() throws Exception { - try (JibService jibService = new JibService(kitLogger, testAuthConfigFactory, configuration, imageConfiguration)) { + try (JibService jibService = new JibService(jibLogger, testAuthConfigFactory, configuration, imageConfiguration)) { jibService.push(); } final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer + "/v2/the-image-name/tags/list") @@ -178,7 +178,7 @@ void pushAdditionalTags() throws Exception { .tag("1.0.0") .build()) .build(); - try (JibService jibService = new JibService(kitLogger, testAuthConfigFactory, configuration, imageConfiguration)) { + try (JibService jibService = new JibService(jibLogger, testAuthConfigFactory, configuration, imageConfiguration)) { jibService.push(); } final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer + "/v2/the-image-name/tags/list") diff --git a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java index a1de472748..ebb0947450 100644 --- a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java +++ b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java @@ -23,22 +23,14 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import com.google.cloud.tools.jib.api.CacheDirectoryCreationException; -import com.google.cloud.tools.jib.api.Containerizer; -import com.google.cloud.tools.jib.api.RegistryException; -import com.google.cloud.tools.jib.api.TarImage; import org.eclipse.jkube.kit.build.api.assembly.BuildDirs; import org.eclipse.jkube.kit.common.Assembly; import org.eclipse.jkube.kit.common.AssemblyConfiguration; import org.eclipse.jkube.kit.common.AssemblyFile; import org.eclipse.jkube.kit.common.AssemblyFileEntry; import org.eclipse.jkube.kit.common.JKubeConfiguration; -import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.JavaProject; -import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.common.Arguments; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; @@ -48,31 +40,18 @@ import com.google.cloud.tools.jib.api.buildplan.FileEntriesLayer; import com.google.cloud.tools.jib.api.buildplan.ImageFormat; import com.google.cloud.tools.jib.api.buildplan.Port; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import org.mockito.MockedConstruction; -import org.mockito.MockedStatic; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; import static org.eclipse.jkube.kit.service.jib.JibServiceUtil.containerFromImageConfiguration; import static org.mockito.Answers.RETURNS_SELF; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockConstructionWithAnswer; -import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; class JibServiceUtilTest { - private JibLogger jibLogger; - - @BeforeEach - void setUp() { - jibLogger = new JibLogger(new KitLogger.SilentLogger()); - } @Test void testGetBaseImageWithNullBuildConfig() { @@ -169,49 +148,6 @@ void layers_withMultipleLayers_shouldReturnTransformedLayers(@TempDir Path tempo .containsExactly("layer-1", "", "jkube-generated-layer-final-artifact"); } - @Test - void buildContainer_whenBuildSuccessful_thenDelegateToJibContainerize() throws InterruptedException, CacheDirectoryCreationException, IOException, ExecutionException, RegistryException { - try (MockedStatic containerizerMockedStatic = mockStatic(Containerizer.class)) { - // Given - JibContainerBuilder jibContainerBuilder = mock(JibContainerBuilder.class, RETURNS_SELF); - Containerizer containerizer = mock(Containerizer.class, RETURNS_SELF); - TarImage tarImage = TarImage.at(new File("docker-build.tar").toPath()); - containerizerMockedStatic.when(() -> Containerizer.to(tarImage)).thenReturn(containerizer); - - // When - JibServiceUtil.buildContainer(jibContainerBuilder, tarImage, jibLogger); - - // Then - verify(containerizer).setAllowInsecureRegistries(true); - verify(containerizer).setExecutorService(any(ExecutorService.class)); - verify(containerizer, times(2)).addEventHandler(any(), any()); - verify(jibContainerBuilder).containerize(containerizer); - } - } - - @Test - void buildContainer_whenBuildFailure_thenThrowException() throws InterruptedException, CacheDirectoryCreationException, IOException, ExecutionException, RegistryException { - try (MockedStatic containerizerMockedStatic = mockStatic(Containerizer.class)) { - // Given - JibContainerBuilder jibContainerBuilder = mock(JibContainerBuilder.class, RETURNS_SELF); - Containerizer containerizer = mock(Containerizer.class, RETURNS_SELF); - TarImage tarImage = TarImage.at(new File("docker-build.tar").toPath()); - containerizerMockedStatic.when(() -> Containerizer.to(tarImage)).thenReturn(containerizer); - when(jibContainerBuilder.containerize(containerizer)).thenThrow(new RegistryException("Unable to pull base image")); - - // When - assertThatThrownBy(() -> JibServiceUtil.buildContainer(jibContainerBuilder, tarImage, jibLogger)) - .isInstanceOf(JKubeException.class) - .hasMessage("Unable to build the image tarball: Unable to pull base image"); - - // Then - verify(containerizer).setAllowInsecureRegistries(true); - verify(containerizer).setExecutorService(any(ExecutorService.class)); - verify(containerizer, times(2)).addEventHandler(any(), any()); - verify(jibContainerBuilder).containerize(containerizer); - } - } - private ImageConfiguration getSampleImageConfiguration() { return ImageConfiguration.builder() .name("test/test-project") diff --git a/jkube-kit/common-maven/src/test/java/org/eclipse/jkube/kit/common/util/AnsiLoggerFallbackTest.java b/jkube-kit/common-maven/src/test/java/org/eclipse/jkube/kit/common/util/AnsiLoggerFallbackTest.java index cfa05a17ed..4854fb5a20 100644 --- a/jkube-kit/common-maven/src/test/java/org/eclipse/jkube/kit/common/util/AnsiLoggerFallbackTest.java +++ b/jkube-kit/common-maven/src/test/java/org/eclipse/jkube/kit/common/util/AnsiLoggerFallbackTest.java @@ -21,10 +21,10 @@ import org.mockito.MockedConstruction; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.CALLS_REAL_METHODS; -import static org.mockito.Mockito.mockConstructionWithAnswer; +import static org.mockito.Mockito.mockConstruction; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.withSettings; class AnsiLoggerFallbackTest { @@ -32,7 +32,8 @@ class AnsiLoggerFallbackTest { @BeforeEach void setUp() { - mockedLogger = mockConstructionWithAnswer(KitLogger.StdoutLogger.class, CALLS_REAL_METHODS); + final KitLogger.StdoutLogger spied = new KitLogger.StdoutLogger(); + mockedLogger = mockConstruction(KitLogger.StdoutLogger.class, withSettings().spiedInstance(spied)); if (!AnsiConsole.isInstalled()) { AnsiConsole.systemInstall(); } diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/KitLogger.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/KitLogger.java index 01bafcfa78..7992b43584 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/KitLogger.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/KitLogger.java @@ -13,6 +13,8 @@ */ package org.eclipse.jkube.kit.common; +import java.io.PrintStream; + /** * @author roland */ @@ -102,33 +104,45 @@ default void progressUpdate(String layerId, String status, String progressMessag */ default void progressFinished() {} - @SuppressWarnings("java:S106") - class StdoutLogger implements KitLogger { + class PrintStreamLogger implements KitLogger { + + private final PrintStream out; + + public PrintStreamLogger(PrintStream out) { + this.out = out; + } + @Override public void debug(String format, Object... params) { - System.out.println(String.format(format,params)); + out.println(String.format(format, params)); } @Override public void info(String format, Object... params) { - System.out.println(String.format(format,params)); + out.println(String.format(format, params)); } @Override public void warn(String format, Object... params) { - System.out.println(String.format(format,params)); + out.println(String.format(format, params)); } @Override public void error(String format, Object... params) { - System.out.println(String.format(format,params)); + out.println(String.format(format, params)); } @Override public boolean isDebugEnabled() { return true; } + } + @SuppressWarnings("java:S106") + class StdoutLogger extends PrintStreamLogger { + public StdoutLogger() { + super(System.out); + } } class SilentLogger implements KitLogger { diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/AbstractImageBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/AbstractImageBuildService.java index df321d1cae..5479db58d3 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/AbstractImageBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/AbstractImageBuildService.java @@ -35,6 +35,7 @@ public final void build(ImageConfiguration... imageConfigurations) throws JKubeS processImage(this::buildSingleImage, "Skipped building", imageConfigurations); } + /** {@inheritDoc} */ @Override public final void push(Collection imageConfigs, int retries, boolean skipTag) throws JKubeServiceException { processImage(imageConfiguration -> pushSingleImage(imageConfiguration, retries, skipTag), "Skipped push", imageConfigs.toArray(new ImageConfiguration[0])); diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java index 45876641e3..3369a5ccb8 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java @@ -13,21 +13,9 @@ */ package org.eclipse.jkube.kit.config.service.kubernetes; -import com.google.cloud.tools.jib.api.Credential; -import com.google.cloud.tools.jib.api.JibContainerBuilder; -import com.google.cloud.tools.jib.api.TarImage; -import org.eclipse.jkube.kit.build.api.assembly.AssemblyManager; -import org.eclipse.jkube.kit.build.api.assembly.BuildDirs; -import org.eclipse.jkube.kit.build.api.assembly.JKubeBuildTarArchiver; -import org.eclipse.jkube.kit.build.api.auth.AuthConfig; import org.eclipse.jkube.kit.build.service.docker.auth.DockerAuthConfigFactory; -import org.eclipse.jkube.kit.common.Assembly; -import org.eclipse.jkube.kit.common.AssemblyFileEntry; import org.eclipse.jkube.kit.common.KitLogger; -import org.eclipse.jkube.kit.common.archive.ArchiveCompression; import org.eclipse.jkube.kit.config.image.ImageConfiguration; -import org.eclipse.jkube.kit.config.image.ImageName; -import org.eclipse.jkube.kit.common.RegistryConfig; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; import org.eclipse.jkube.kit.config.service.AbstractImageBuildService; @@ -36,19 +24,10 @@ import org.eclipse.jkube.kit.config.service.JKubeServiceHub; import org.eclipse.jkube.kit.service.jib.JibLogger; import org.eclipse.jkube.kit.service.jib.JibService; -import org.eclipse.jkube.kit.service.jib.JibServiceUtil; import java.io.File; -import java.io.IOException; -import java.util.List; -import java.util.Map; import java.util.Objects; -import static org.eclipse.jkube.kit.build.api.helper.RegistryUtil.getApplicablePullRegistryFrom; -import static org.eclipse.jkube.kit.build.api.helper.RegistryUtil.getApplicablePushRegistryFrom; -import static org.eclipse.jkube.kit.service.jib.JibServiceUtil.containerFromImageConfiguration; -import static org.eclipse.jkube.kit.service.jib.JibServiceUtil.getBaseImage; - /** * AbstractImageBuildService implementation for JIB build strategy. *

@@ -70,7 +49,7 @@ public JibImageBuildService(JKubeServiceHub jKubeServiceHub) { public JibImageBuildService(JKubeServiceHub jKubeServiceHub, JibLogger jibLogger) { super(jKubeServiceHub); this.jibLogger = jibLogger; - kitLogger = jKubeServiceHub.getLog(); + this.kitLogger = jKubeServiceHub.getLog(); authConfigFactory = new DockerAuthConfigFactory(kitLogger); buildServiceConfig = Objects.requireNonNull(jKubeServiceHub.getBuildServiceConfig(), "BuildServiceConfig is required"); @@ -85,31 +64,12 @@ public boolean isApplicable() { @Override public void buildSingleImage(ImageConfiguration imageConfiguration) throws JKubeServiceException { - kitLogger.info("[[B]]JIB[[B]] image build started"); if (imageConfiguration.getBuildConfiguration().isDockerFileMode()) { throw new JKubeServiceException("Dockerfile mode is not supported with JIB build strategy"); } - final ImageConfiguration imageConfigToBuild = prependPushRegistry(imageConfiguration, configuration.getPullRegistryConfig()); - try { - final BuildDirs buildDirs = new BuildDirs(imageConfigToBuild.getName(), configuration); - final String pullRegistry = getPullRegistry(imageConfigToBuild, configuration.getPullRegistryConfig()); - final Credential pullRegistryCredential = getRegistryCredentials( - configuration.getPullRegistryConfig(), false, pullRegistry); - final JibContainerBuilder containerBuilder = containerFromImageConfiguration(imageConfigToBuild, pullRegistry, pullRegistryCredential); - - final Map> layers = AssemblyManager.getInstance() - .copyFilesToFinalTarballDirectory(configuration, buildDirs, - AssemblyManager.getAssemblyConfiguration(imageConfigToBuild.getBuildConfiguration(), configuration)); - JibServiceUtil.layers(buildDirs, layers).forEach(containerBuilder::addFileEntriesLayer); - - // TODO: Improve Assembly Manager so that the effective assemblyFileEntries computed can be properly shared - // the call to AssemblyManager.getInstance().createDockerTarArchive should not be necessary, - // files should be added using the AssemblyFileEntry list. AssemblyManager, should provide - // a common way to achieve this so that both the tar builder and any other builder could get a hold of - // archive customizers, file entries, etc. - File dockerTarArchive = getAssemblyTarArchive(imageConfigToBuild, configuration, kitLogger); - JibServiceUtil.buildContainer(containerBuilder, - TarImage.at(dockerTarArchive.toPath()).named(imageConfigToBuild.getName()), jibLogger); + kitLogger.info("[[B]]JIB[[B]] image build started"); + try (JibService jibService = new JibService(jibLogger, authConfigFactory, configuration, imageConfiguration)) { + final File dockerTarArchive = jibService.build(); kitLogger.info(" %s successfully built", dockerTarArchive.getAbsolutePath()); } catch (Exception ex) { throw new JKubeServiceException("Error when building JIB image", ex); @@ -118,11 +78,11 @@ public void buildSingleImage(ImageConfiguration imageConfiguration) throws JKube @Override protected void pushSingleImage(ImageConfiguration imageConfiguration, int retries, boolean skipTag) throws JKubeServiceException { - try (JibService jibService = new JibService(kitLogger, authConfigFactory, configuration, imageConfiguration)) { + try (JibService jibService = new JibService(jibLogger, authConfigFactory, configuration, imageConfiguration)) { kitLogger.info("Pushing image: %s", jibService.getImageName().getFullName()); jibService.push(); } catch (Exception ex) { - throw new JKubeServiceException("Error when push JIB image", ex); + throw new JKubeServiceException("Error when pushing JIB image", ex); } } @@ -130,49 +90,4 @@ protected void pushSingleImage(ImageConfiguration imageConfiguration, int retrie public void postProcess() { // No post processing required } - - // TODO: remove in favor of JibService implementation - static ImageConfiguration prependPushRegistry(ImageConfiguration imageConfiguration, RegistryConfig registryConfig) { - final ImageConfiguration.ImageConfigurationBuilder icBuilder = imageConfiguration.toBuilder(); - final ImageName imageName = new ImageName(imageConfiguration.getName()); - final String pushRegistry = getPushRegistry(imageConfiguration, registryConfig); - if (!imageName.hasRegistry() && pushRegistry != null) { - icBuilder.name(imageName.getFullName(pushRegistry)); - icBuilder.registry(pushRegistry); - } - return icBuilder.build(); - } - - static File getAssemblyTarArchive(ImageConfiguration imageConfig, JKubeConfiguration configuration, KitLogger log) throws IOException { - log.info("Preparing assembly files"); - final String targetImage = imageConfig.getName(); - return AssemblyManager.getInstance() - .createDockerTarArchive(targetImage, configuration, imageConfig.getBuildConfiguration(), log, null); - } - - // TODO: remove in favor of JibService implementation - Credential getRegistryCredentials(RegistryConfig registryConfig, boolean isPush, String registry) - throws IOException { - - AuthConfig standardAuthConfig = authConfigFactory.createAuthConfig(isPush, registryConfig.isSkipExtendedAuth(), registryConfig.getAuthConfig(), registryConfig.getSettings(), null, registry, registryConfig.getPasswordDecryptionMethod()); - Credential credentials = null; - if (standardAuthConfig != null) { - credentials = Credential.from(standardAuthConfig.getUsername(), standardAuthConfig.getPassword()); - } - return credentials; - } - - // TODO: remove in favor of JibService implementation - static File getBuildTarArchive(ImageConfiguration imageConfiguration, JKubeConfiguration configuration) { - BuildDirs buildDirs = new BuildDirs(imageConfiguration.getName(), configuration); - return new File(buildDirs.getTemporaryRootDirectory(), JKubeBuildTarArchiver.ARCHIVE_FILE_NAME + ArchiveCompression.none.getFileSuffix()); - } - - static String getPullRegistry(ImageConfiguration imageConfiguration, RegistryConfig registryConfig) { - return getApplicablePullRegistryFrom(getBaseImage(imageConfiguration, null), registryConfig); - } - - static String getPushRegistry(ImageConfiguration imageConfiguration, RegistryConfig registryConfig) { - return getApplicablePushRegistryFrom(imageConfiguration, registryConfig); - } } diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceIntegrationTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceBuildTest.java similarity index 82% rename from jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceIntegrationTest.java rename to jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceBuildTest.java index c7cbb66cae..01d6aef3eb 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceIntegrationTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceBuildTest.java @@ -34,13 +34,13 @@ import org.eclipse.jkube.kit.config.service.JKubeServiceException; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; import org.eclipse.jkube.kit.service.jib.JibLogger; -import org.fusesource.jansi.Ansi; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.PrintStream; @@ -54,16 +54,14 @@ import static org.apache.commons.io.FilenameUtils.separatorsToSystem; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.verify; @SuppressWarnings({"unused"}) -class JibImageBuildServiceIntegrationTest { +class JibImageBuildServiceBuildTest { private File projectRoot; private Path targetDirectory; private Path dockerOutput; + private ByteArrayOutputStream out; private JKubeServiceHub hub; private JibImageBuildService jibBuildService; @@ -71,8 +69,9 @@ class JibImageBuildServiceIntegrationTest { void setUp(@TempDir Path projectRoot) throws IOException { targetDirectory = Files.createDirectory(projectRoot.resolve("target")); dockerOutput = targetDirectory.resolve("docker"); + out = new ByteArrayOutputStream(); hub = JKubeServiceHub.builder() - .log(new KitLogger.SilentLogger()) + .log(new KitLogger.PrintStreamLogger(new PrintStream(out))) .platformMode(RuntimeMode.KUBERNETES) .buildServiceConfig(BuildServiceConfig.builder().build()) .configuration(JKubeConfiguration.builder() @@ -105,6 +104,49 @@ void build_dockerFileMode_shouldThrowException() { .withMessage("Dockerfile mode is not supported with JIB build strategy"); } + @Test + void build_withImageMissingBuildConfiguration_shouldNotBuildImage() throws JKubeServiceException { + // Given + final ImageConfiguration ic = ImageConfiguration.builder() + .name("test/foo:latest") + .build(); + // When + jibBuildService.build(ic); + // Then + assertThat(out.toString()) + .contains("[test/foo:latest] : Skipped building (Image configuration has no build settings)"); + } + + @Test + void build_withImageBuildConfigurationSkipTrue_shouldNotBuildImage() throws JKubeServiceException { + // Given + final ImageConfiguration ic = ImageConfiguration.builder() + .name("test/foo:latest") + .build(BuildConfiguration.builder() + .from("test/base:latest") + .skip(true) + .build()) + .build(); + // When + jibBuildService.build(ic); + // Then + assertThat(out.toString()) + .contains("[test/foo:latest] : Skipped building" + System.lineSeparator()); + } + + @Test + void build_shouldCallPluginServiceAddFiles() throws JKubeServiceException { + // Given + final ImageConfiguration ic = ImageConfiguration.builder() + .name("test/foo:latest") + .build(); + // When + jibBuildService.build(ic); + // Then + assertThat(out.toString()) + .contains("Adding extra files for plugin org.eclipse.jkube"); + } + @Test void build_withLayersAndArtifact_shouldPerformJibBuild() throws Exception { // Given @@ -173,7 +215,7 @@ void build_withLayersAndArtifact_shouldPerformJibBuild() throws Exception { class GlobalRegistry { private ImageConfiguration imageConfiguration; - private PrintStream out; + private ByteArrayOutputStream out; @BeforeEach void setUp() { @@ -186,7 +228,9 @@ void setUp() { .build()) .registry("gcr.io") .build(); - hub = hub.toBuilder().configuration(hub.getConfiguration().toBuilder() + out = new ByteArrayOutputStream(); + hub = hub.toBuilder() + .configuration(hub.getConfiguration().toBuilder() .pullRegistryConfig(RegistryConfig.builder() .registry("gcr.io") .authConfig(Collections.emptyMap()) @@ -194,8 +238,7 @@ void setUp() { .build()) .build()) .build(); - out = spy(System.out); - jibBuildService = new JibImageBuildService(hub, new JibLogger(hub.getLog(), out)); + jibBuildService = new JibImageBuildService(hub, new JibLogger(new KitLogger.SilentLogger(), new PrintStream(out))); } @Test @@ -222,8 +265,8 @@ void shouldConsiderRegistryForFromImage() throws Exception { // When jibBuildService.build(imageConfiguration); // Then - verify(out) - .println(argThat((Ansi ansi) -> ansi.toString().contains("Getting manifest for base image gcr.io/distroless/base"))); + assertThat(out.toString()) + .contains("Getting manifest for base image gcr.io/distroless/base"); } } diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceGetApplicableRegistryTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceGetApplicableRegistryTest.java deleted file mode 100644 index 25adf988b1..0000000000 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceGetApplicableRegistryTest.java +++ /dev/null @@ -1,193 +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.config.service.kubernetes; - -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.junit.jupiter.params.ParameterizedTest; -import org.junit.jupiter.params.provider.CsvSource; -import static org.assertj.core.api.Assertions.assertThat; - -class JibImageBuildServiceGetApplicableRegistryTest { - @ParameterizedTest(name = "pull {0}, when no registry from any source, then pull registry {1}") - @CsvSource({ - "word:word,", - "word/word:tag,", - "word.word/word/word:tag,word.word", - "word:5000/word:tag,word:5000", - "word.word:5000/word:tag,word.word:5000", - "word.word/word:tag,word.word", - "word.word/word.word/word:tag,word.word", - "word.word.word/word:tag,word.word.word", - "word.word.word/word/word:tag,word.word.word" - }) - void pull_whenRegistryNotPresentFromAnySource_thenReturnRegistryFromImageName(String from, String expectedPullRegistry) { - // Given - ImageConfiguration imageConfiguration = createImageConfiguration("test-image:latest", from, null); - RegistryConfig registryConfig = RegistryConfig.builder().build(); - - // When - String pullRegistry = JibImageBuildService.getPullRegistry(imageConfiguration, registryConfig); - - // Then - assertThat(pullRegistry).isEqualTo(expectedPullRegistry); - } - - @ParameterizedTest(name = "pull {0} when registry present both in image name and registry config, then registry taken from image name {1}") - @CsvSource({ - "word.word/word/word:tag,word.word", - "word:5000/word:tag,word:5000", - "word.word:5000/word:tag,word.word:5000", - "word.word/word.word/word:tag,word.word", - "word.word.word/word/word:tag,word.word.word" - }) - void pull_whenRegistryPresentInBothImageNameAndRegistryConfig_thenReturnRegistryFromImageName(String from, String expectedPullRegistry) { - // Given - ImageConfiguration imageConfiguration = createImageConfiguration("test-image:latest", from, null); - RegistryConfig registryConfig = RegistryConfig.builder().registry("quay.io").build(); - - // When - String pullRegistry = JibImageBuildService.getPullRegistry(imageConfiguration, registryConfig); - - // Then - assertThat(pullRegistry).isEqualTo(expectedPullRegistry); - } - - @ParameterizedTest(name = "pull {0} and registry from registry config, then registry from registry config {1}") - @CsvSource({ - "word:word,quay.io", - "word/word:tag,quay.io", - "word.word/word:tag,quay.io" - }) - void pull_whenRegistryFromRegistryConfig_thenReturnRegistryFromRegistryConfig(String from, String expectedPullRegistry) { - // Given - ImageConfiguration imageConfiguration = createImageConfiguration("test-image:latest", from, null); - RegistryConfig registryConfig = RegistryConfig.builder().registry("quay.io").build(); - - // When - String pullRegistry = JibImageBuildService.getPullRegistry(imageConfiguration, registryConfig); - - // Then - assertThat(pullRegistry).isEqualTo(expectedPullRegistry); - } - - @ParameterizedTest(name = "push {0} when no registry from any source, then push registry from image name {1}") - @CsvSource({ - "word:word,", - "word/word:tag,", - "word.word/word:tag,word.word", - "word.word/word/word:tag,word.word", - "word.word/word.word/word:tag,word.word", - "word:5000/word:tag,word:5000", - "word.word:5000/word:tag,word.word:5000", - "word.word.word/word:tag,word.word.word", - "word.word.word/word/word:tag,word.word.word" - }) - void push_whenRegistryNotPresentFromAnySource_thenReturnRegistryFromImageName(String imageName, String expectedPushRegistry) { - // Given - ImageConfiguration imageConfiguration = createImageConfiguration(imageName, "test-image:latest", null); - RegistryConfig registryConfig = RegistryConfig.builder().build(); - - // When - String pullRegistry = JibImageBuildService.getPushRegistry(imageConfiguration, registryConfig); - - // Then - assertThat(pullRegistry).isEqualTo(expectedPushRegistry); - } - - @ParameterizedTest(name = "push {0} when registry present both in image name and registry config, then registry taken from image name {1}") - @CsvSource({ - "word.word/word/word:tag,word.word", - "word.word/word.word/word:tag,word.word", - "word:5000/word:tag,word:5000", - "word.word:5000/word:tag,word.word:5000", - "word.word.word/word/word:tag,word.word.word" - }) - void push_whenRegistryInBothImageNameAndRegistryConfig_thenUseRegistryFromImageName(String imageName, String expectedPushRegistry) { - // Given - ImageConfiguration imageConfiguration = createImageConfiguration(imageName, "test-image:latest", null); - RegistryConfig registryConfig = RegistryConfig.builder().registry("quay.io").build(); - - // When - String pullRegistry = JibImageBuildService.getPushRegistry(imageConfiguration, registryConfig); - - // Then - assertThat(pullRegistry).isEqualTo(expectedPushRegistry); - } - - @ParameterizedTest(name = "push {0} when registry present both in image name and image config, then registry taken from image name {1}") - @CsvSource({ - "word.word/word/word:tag,word.word", - "word.word/word.word/word:tag,word.word", - "word:5000/word:tag,word:5000", - "word.word:5000/word:tag,word.word:5000", - "word.word.word/word/word:tag,word.word.word" - }) - void push_whenRegistryPresentInBothImageNameAndImageConfig_thenUseRegistryFromImageName(String imageName, String expectedPushRegistry) { - // Given - ImageConfiguration imageConfiguration = createImageConfiguration(imageName, "test-image:latest", "quay.io"); - RegistryConfig registryConfig = RegistryConfig.builder().build(); - - // When - String pullRegistry = JibImageBuildService.getPushRegistry(imageConfiguration, registryConfig); - - // Then - assertThat(pullRegistry).isEqualTo(expectedPushRegistry); - } - - @ParameterizedTest(name = "push {0} when registry from image config, then registry used from image config {1}") - @CsvSource({ - "word:word,quay.io", - "word/word:tag,quay.io", - "word.word/word:tag,quay.io" - }) - void push_whenRegistryFromImageConfig_thenReturnRegistryFromImageConfig(String imageName, String expectedPushRegistry) { - // Given - ImageConfiguration imageConfiguration = createImageConfiguration(imageName, "test-image:latest", "quay.io"); - RegistryConfig registryConfig = RegistryConfig.builder().build(); - - // When - String pullRegistry = JibImageBuildService.getPushRegistry(imageConfiguration, registryConfig); - - // Then - assertThat(pullRegistry).isEqualTo(expectedPushRegistry); - } - - @ParameterizedTest(name = "push {0} when registry from registry config, then registry used from registry config {1}") - @CsvSource({ - "word:word,quay.io", - "word/word:tag,quay.io", - "word.word/word:tag,quay.io" - }) - void push_whenRegistryFromRegistryConfig_thenReturnRegistryFromRegistryConfig(String imageName, String expectedPushRegistry) { - // Given - ImageConfiguration imageConfiguration = createImageConfiguration(imageName, "test-image:latest", null); - RegistryConfig registryConfig = RegistryConfig.builder().registry("quay.io").build(); - - // When - String pullRegistry = JibImageBuildService.getPushRegistry(imageConfiguration, registryConfig); - - // Then - assertThat(pullRegistry).isEqualTo(expectedPushRegistry); - } - - private ImageConfiguration createImageConfiguration(String name, String fromImage, String registry) { - return ImageConfiguration.builder() - .name(name) - .build(BuildConfiguration.builder().from(fromImage).build()) - .registry(registry) - .build(); - } -} diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServicePushTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServicePushTest.java new file mode 100644 index 0000000000..c4f497cb3a --- /dev/null +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServicePushTest.java @@ -0,0 +1,210 @@ +/* + * 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.config.service.kubernetes; + +import com.google.cloud.tools.jib.api.Containerizer; +import com.google.cloud.tools.jib.api.Jib; +import com.google.cloud.tools.jib.api.TarImage; +import com.google.cloud.tools.jib.api.buildplan.ImageFormat; +import com.google.cloud.tools.jib.global.JibSystemProperties; +import com.marcnuri.helm.jni.HelmLib; +import com.marcnuri.helm.jni.NativeLibrary; +import com.marcnuri.helm.jni.RepoServerOptions; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.io.IOUtils; +import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JKubeException; +import org.eclipse.jkube.kit.common.JavaProject; +import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.RegistryConfig; +import org.eclipse.jkube.kit.common.RegistryServerConfiguration; +import org.eclipse.jkube.kit.config.image.ImageConfiguration; +import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; +import org.eclipse.jkube.kit.config.resource.RuntimeMode; +import org.eclipse.jkube.kit.config.service.BuildServiceConfig; +import org.eclipse.jkube.kit.config.service.JKubeServiceException; +import org.eclipse.jkube.kit.config.service.JKubeServiceHub; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.nio.file.Path; +import java.util.Collections; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +class JibImageBuildServicePushTest { + + private static HelmLib helmLib; + + @TempDir + private Path temporaryFolder; + + private boolean sendCredentialsOverHttp; + private String remoteOciServer; + + + private KitLogger logger; + private JKubeServiceHub jKubeServiceHub; + private ImageConfiguration imageConfiguration; + + @BeforeAll + static void setUpAll() { + helmLib = NativeLibrary.getInstance().load(); + } + + @BeforeEach + void setUp() throws Exception { + sendCredentialsOverHttp = JibSystemProperties.sendCredentialsOverHttp(); + System.setProperty(JibSystemProperties.SEND_CREDENTIALS_OVER_HTTP, "true"); + + logger = spy(new KitLogger.SilentLogger()); + + // Setup OCI server + remoteOciServer = helmLib.RepoOciServerStart( + new RepoServerOptions(null, "oci-user", "oci-password") + ).out; + + // Configure OCI server in image and JKube + imageConfiguration = ImageConfiguration.builder() + .name("test/test-image:0.0.1") + .build(BuildConfiguration.builder() + .from("busybox") + .build()) + .registry(remoteOciServer) + .build(); + jKubeServiceHub = JKubeServiceHub.builder() + .log(logger) + .platformMode(RuntimeMode.KUBERNETES) + .buildServiceConfig(BuildServiceConfig.builder().build()) + .configuration(JKubeConfiguration.builder() + .project(JavaProject.builder().baseDirectory(temporaryFolder.toFile()).build()) + .pushRegistryConfig(RegistryConfig.builder() + .registry(remoteOciServer) + .settings(Collections.singletonList( + RegistryServerConfiguration.builder() + .id(remoteOciServer) + .username("oci-user") + .password("oci-password") + .build())) + .passwordDecryptionMethod(s -> s) + .build()) + .build()) + .build(); + + // Build fake container image + final Path tarPath = temporaryFolder + .resolve("localhost") + .resolve(remoteOciServer.split(":")[1]) + .resolve("test") + .resolve("test-image") + .resolve("0.0.1") + .resolve("tmp") + .resolve("docker-build.tar"); + Jib.fromScratch() + .setFormat(ImageFormat.Docker) + .containerize(Containerizer.to(TarImage + .at(tarPath) + .named(imageConfiguration.getName())) + ); + } + + @AfterEach + void tearDown() { + if (!sendCredentialsOverHttp) { + System.clearProperty(JibSystemProperties.SEND_CREDENTIALS_OVER_HTTP); + } + } + + @Test + void pushWithNoConfigurations_doesNothing() throws Exception { + // When + new JibImageBuildService(jKubeServiceHub).push(Collections.emptyList(), 1, false); + // Then + verify(logger, never()).info(anyString(), anyString()); + } + + @Test + void push_withImageBuildConfigurationSkipTrue_doesNothing() throws JKubeServiceException { + // Given + imageConfiguration = imageConfiguration.toBuilder() + .build(imageConfiguration.getBuild().toBuilder() + .skip(true) + .build()) + .build(); + // When + new JibImageBuildService(jKubeServiceHub).push(Collections.singletonList(imageConfiguration), 1, false); + // Then + verify(logger, never()).info(anyString(), anyString()); + } + + @Test + void invalidCredentials_throwsException() { + jKubeServiceHub = jKubeServiceHub.toBuilder() + .configuration(jKubeServiceHub.getConfiguration().toBuilder() + .pushRegistryConfig(RegistryConfig.builder() + .settings(Collections.emptyList()).build()) + .build()) + .build(); + final JibImageBuildService jibImageBuildService = new JibImageBuildService(jKubeServiceHub); + assertThatThrownBy(() -> jibImageBuildService.push(Collections.singletonList(imageConfiguration), 1, false)) + .isInstanceOf(JKubeServiceException.class) + .hasMessageContaining("Error when pushing JIB image") + .cause() + .isInstanceOf(JKubeException.class) + .hasMessageStartingWith("Unable to containerize image using Jib: Unauthorized for localhost:"); + } + + @Nested + @DisplayName("withValidConfiguration") + class ValidConfiguration { + + @BeforeEach + void pushValidImage() throws Exception { + new JibImageBuildService(jKubeServiceHub) + .push(Collections.singletonList(imageConfiguration), 1, false); + } + + @Test + void logsImagePush() { + verify(logger, times(1)) + .info("Pushing image: %s", remoteOciServer + "/test/test-image:0.0.1"); + } + + @Test + void pushesImage() throws Exception { + final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer + "/v2/test/test-image/tags/list") + .openConnection(); + connection.setRequestProperty("Authorization", "Basic " + Base64.encodeBase64String("oci-user:oci-password".getBytes())); + connection.connect(); + assertThat(connection.getResponseCode()).isEqualTo(200); + assertThat(IOUtils.toString(connection.getInputStream(), StandardCharsets.UTF_8)) + .contains("{\"name\":\"test/test-image\",\"tags\":[\"0.0.1\"]}"); + } + } + +} diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java index a2d154f964..d6e298d9d2 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceTest.java @@ -13,408 +13,50 @@ */ package org.eclipse.jkube.kit.config.service.kubernetes; -import java.io.File; -import java.io.IOException; -import java.net.HttpURLConnection; -import java.net.URL; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Collections; - -import com.google.cloud.tools.jib.api.Containerizer; -import com.google.cloud.tools.jib.api.Jib; -import com.google.cloud.tools.jib.api.JibContainerBuilder; -import com.google.cloud.tools.jib.api.TarImage; -import com.google.cloud.tools.jib.api.buildplan.ImageFormat; -import com.google.cloud.tools.jib.global.JibSystemProperties; -import com.marcnuri.helm.jni.HelmLib; -import com.marcnuri.helm.jni.NativeLibrary; -import com.marcnuri.helm.jni.RepoServerOptions; -import org.apache.commons.codec.binary.Base64; -import org.apache.commons.io.IOUtils; import org.eclipse.jkube.kit.common.JKubeConfiguration; -import org.eclipse.jkube.kit.common.JKubeException; -import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; -import org.eclipse.jkube.kit.common.RegistryConfig; -import org.eclipse.jkube.kit.common.RegistryServerConfiguration; -import org.eclipse.jkube.kit.config.image.ImageConfiguration; -import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.eclipse.jkube.kit.config.service.BuildServiceConfig; -import org.eclipse.jkube.kit.config.service.JKubeServiceException; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; -import org.eclipse.jkube.kit.service.jib.JibServiceUtil; - -import com.google.cloud.tools.jib.api.Credential; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.io.TempDir; -import org.mockito.MockedStatic; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.isNull; -import static org.mockito.Mockito.RETURNS_DEEP_STUBS; -import static org.mockito.Mockito.atLeastOnce; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.mockStatic; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.spy; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; class JibImageBuildServiceTest { - private static HelmLib helmLib; - @TempDir - private Path temporaryFolder; - - private KitLogger logger; - - private JKubeServiceHub jKubeServiceHub; - - private ImageConfiguration imageConfiguration; - - @BeforeAll - static void setUpAll() { - helmLib = NativeLibrary.getInstance().load(); - } - - @BeforeEach - void setUp() { - logger = spy(new KitLogger.SilentLogger()); - jKubeServiceHub = JKubeServiceHub.builder() - .log(logger) - .platformMode(RuntimeMode.KUBERNETES) - .buildServiceConfig(BuildServiceConfig.builder().build()) - .configuration(JKubeConfiguration.builder() - .pullRegistryConfig(RegistryConfig.builder().build()) - .pushRegistryConfig(RegistryConfig.builder().build()) - .project(JavaProject.builder().baseDirectory(temporaryFolder.toFile()).build()) - .build()) - .build(); - imageConfiguration = ImageConfiguration.builder() - .name("test/test-image:0.0.1") - .build(BuildConfiguration.builder() - .from("busybox") - .build()) - .build(); - } - - @Test - void isApplicable_withNoBuildStrategy_shouldReturnFalse() { - // When - final boolean result = new JibImageBuildService(jKubeServiceHub).isApplicable(); - // Then - assertThat(result).isFalse(); - } - - @Test - void isApplicable_withJibBuildStrategy_shouldReturnTrue() { - // Given - jKubeServiceHub = jKubeServiceHub.toBuilder() - .buildServiceConfig(BuildServiceConfig.builder() - .jKubeBuildStrategy(JKubeBuildStrategy.jib) - .build()) - .build(); - // When - final boolean result = new JibImageBuildService(jKubeServiceHub).isApplicable(); - // Then - assertThat(result).isTrue(); - } - - @Test - @java.lang.SuppressWarnings("squid:S00112") - void getRegistryCredentialsForPush() throws IOException { - // Given - final RegistryConfig registryConfig = RegistryConfig.builder() - .settings(Collections.singletonList( - RegistryServerConfiguration.builder() - .id("test.example.org") - .username("testuserpush") - .password("testpass") - .build())) - .passwordDecryptionMethod(s -> s) - .build(); - // When - Credential credential = new JibImageBuildService(jKubeServiceHub) - .getRegistryCredentials(registryConfig, true, "test.example.org"); - // Then - assertThat(credential).isNotNull() - .hasFieldOrPropertyWithValue("username", "testuserpush") - .hasFieldOrPropertyWithValue("password", "testpass"); - } - - @Test - @java.lang.SuppressWarnings("squid:S00112") - void getRegistryCredentialsForPull() throws IOException { - // Given - final RegistryConfig registryConfig = RegistryConfig.builder() - .settings(Collections.singletonList( - RegistryServerConfiguration.builder() - .id("test.example.org") - .username("testuserpull") - .password("testpass") - .build())) - .passwordDecryptionMethod(s -> s) - .build(); - // When - Credential credential = new JibImageBuildService(jKubeServiceHub) - .getRegistryCredentials(registryConfig, false, "test.example.org"); - // Then - assertThat(credential).isNotNull() - .hasFieldOrPropertyWithValue("username", "testuserpull") - .hasFieldOrPropertyWithValue("password", "testpass"); - } - - @Test - void getBuildTarArchive() throws IOException { - // Given - File projectBaseDir = Files.createDirectory(temporaryFolder.resolve("test")).toFile(); - // When - File tarArchive = JibImageBuildService.getBuildTarArchive(imageConfiguration, createJKubeConfiguration(projectBaseDir)); - // Then - assertThat(tarArchive).isNotNull() - .isEqualTo(projectBaseDir.toPath().resolve("target").resolve("test").resolve("test-image").resolve("0.0.1") - .resolve("tmp").resolve("docker-build.tar").toFile()); - } - - - @Test - void getAssemblyTarArchive() throws IOException { - // Given - File projectBaseDir = Files.createDirectory(temporaryFolder.resolve("test")).toFile(); - // When - File tarArchive = JibImageBuildService.getAssemblyTarArchive(imageConfiguration, createJKubeConfiguration(projectBaseDir), logger); - // Then - assertThat(tarArchive).isNotNull() - .isEqualTo(projectBaseDir.toPath().resolve("target").resolve("test").resolve("test-image").resolve("0.0.1") - .resolve("tmp").resolve("docker-build.tar").toFile()); - } - - @Nested - @DisplayName("push") - class Push { - - private boolean sendCredentialsOverHttp; - private String remoteOciServer; - - @BeforeEach - void setUp() throws Exception { - sendCredentialsOverHttp = JibSystemProperties.sendCredentialsOverHttp(); - System.setProperty(JibSystemProperties.SEND_CREDENTIALS_OVER_HTTP, "true"); - - // Setup OCI server - remoteOciServer = helmLib.RepoOciServerStart( - new RepoServerOptions(null, "oci-user", "oci-password") - ).out; - - // Configure OCI server in image and JKube - imageConfiguration = imageConfiguration.toBuilder() - .registry(remoteOciServer) - .build(); - jKubeServiceHub = jKubeServiceHub.toBuilder() - .configuration(jKubeServiceHub.getConfiguration().toBuilder() - .pushRegistryConfig(RegistryConfig.builder() - .registry(remoteOciServer) - .settings(Collections.singletonList( - RegistryServerConfiguration.builder() - .id(remoteOciServer) - .username("oci-user") - .password("oci-password") - .build())) - .passwordDecryptionMethod(s -> s) - .build()) - .build()) - .build(); - - // Build fake container image - final Path tarPath = temporaryFolder - .resolve("localhost") - .resolve(remoteOciServer.split(":")[1]) - .resolve("test") - .resolve("test-image") - .resolve("0.0.1") - .resolve("tmp") - .resolve("docker-build.tar"); - Jib.fromScratch() - .setFormat(ImageFormat.Docker) - .containerize(Containerizer.to(TarImage - .at(tarPath) - .named(imageConfiguration.getName())) - ); - } - - @AfterEach - void tearDown() { - if (!sendCredentialsOverHttp) { - System.clearProperty(JibSystemProperties.SEND_CREDENTIALS_OVER_HTTP); - } - } - - @Test - void pushWithNoConfigurations_doesNothing() throws Exception { - // When - new JibImageBuildService(jKubeServiceHub).push(Collections.emptyList(), 1, false); - // Then - verify(logger, never()).info(anyString(), anyString()); - } - - @Test - void push_withImageBuildConfigurationSkipTrue_doesNothing() throws JKubeServiceException { - // Given - imageConfiguration = imageConfiguration.toBuilder() - .build(imageConfiguration.getBuild().toBuilder() - .skip(true) - .build()) - .build(); - // When - new JibImageBuildService(jKubeServiceHub).push(Collections.singletonList(imageConfiguration), 1, false); - // Then - verify(logger, never()).info(anyString(), anyString()); - } - - @Test - void invalidCredentials_throwsException() { - jKubeServiceHub = jKubeServiceHub.toBuilder() - .configuration(jKubeServiceHub.getConfiguration().toBuilder() - .pushRegistryConfig(RegistryConfig.builder() - .settings(Collections.emptyList()).build()) - .build()) - .build(); - final JibImageBuildService jibImageBuildService = new JibImageBuildService(jKubeServiceHub); - assertThatThrownBy(() -> jibImageBuildService.push(Collections.singletonList(imageConfiguration), 1, false)) - .isInstanceOf(JKubeServiceException.class) - .hasMessageContaining("Error when push JIB image") - .cause() - .isInstanceOf(JKubeException.class) - .hasMessageStartingWith("Unable to containerize image using Jib: Unauthorized for localhost:"); - } - - @Nested - @DisplayName("withValidConfiguration") - class ValidConfiguration { - - @BeforeEach - void pushValidImage() throws Exception { - new JibImageBuildService(jKubeServiceHub) - .push(Collections.singletonList(imageConfiguration), 1, false); - } - - @Test - void logsImagePush() { - verify(logger, times(1)) - .info("Pushing image: %s", remoteOciServer + "/test/test-image:0.0.1"); - } - - @Test - void pushesImage() throws Exception { - final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer + "/v2/test/test-image/tags/list") - .openConnection(); - connection.setRequestProperty("Authorization", "Basic " + Base64.encodeBase64String("oci-user:oci-password".getBytes())); - connection.connect(); - assertThat(connection.getResponseCode()).isEqualTo(200); - assertThat(IOUtils.toString(connection.getInputStream(), StandardCharsets.UTF_8)) - .contains("{\"name\":\"test/test-image\",\"tags\":[\"0.0.1\"]}"); - } - } - - } - - @Nested - @DisplayName("build") - class Build { - - private MockedStatic jibServiceUtilMockedStatic; - - @BeforeEach - void setUp() { - jibServiceUtilMockedStatic = mockStatic(JibServiceUtil.class); - jibServiceUtilMockedStatic.when(() -> JibServiceUtil.getBaseImage(argThat(ic -> ic.getBuild().getFrom().equals("busybox")), isNull())) - .thenReturn("busybox"); - jibServiceUtilMockedStatic.when(() -> JibServiceUtil.containerFromImageConfiguration(any(), any(), any())) - .thenReturn(mock(JibContainerBuilder.class, RETURNS_DEEP_STUBS)); - } - - @AfterEach - void close() { - jibServiceUtilMockedStatic.close(); - } - - @Test - void build_withImageMissingBuildConfiguration_shouldNotBuildImage() throws JKubeServiceException { - // Given - imageConfiguration = ImageConfiguration.builder() - .name("test/foo:latest") - .build(); - // When - new JibImageBuildService(jKubeServiceHub).build(imageConfiguration); - // Then - jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.buildContainer(any(), any(), any()), times(0)); - } - - @Test - void build_withImageBuildConfigurationSkipTrue_shouldNotBuildImage() throws JKubeServiceException { - // Given - imageConfiguration = ImageConfiguration.builder() - .name("test/foo:latest") - .build(BuildConfiguration.builder() - .from("test/base:latest") - .skip(true) - .build()) - .build(); - // When - new JibImageBuildService(jKubeServiceHub).build(imageConfiguration); - // Then - jibServiceUtilMockedStatic.verify(() -> JibServiceUtil.buildContainer(any(), any(), any()), times(0)); - } - - @Test - void build_shouldCallPluginServiceAddFiles() throws JKubeServiceException { - // Given - imageConfiguration = ImageConfiguration.builder() - .name("test/foo:latest") - .build(); - // When - new JibImageBuildService(jKubeServiceHub).build(imageConfiguration); - // Then - verify(logger, atLeastOnce()).debug(eq("Adding extra files for plugin %s"), anyString()); - } - - @Test - void build_withRegistryConfig_shouldPrependRegistryToImageName() throws JKubeServiceException { - // Given - jKubeServiceHub = jKubeServiceHub.toBuilder() - .configuration(jKubeServiceHub.getConfiguration().toBuilder() - .pullRegistryConfig(RegistryConfig.builder().registry("quay.io").settings(Collections.emptyList()).build()) - .build()) - .build(); - // When - new JibImageBuildService(jKubeServiceHub).build(imageConfiguration); - // Then - jibServiceUtilMockedStatic.verify(() -> JibServiceUtil - .containerFromImageConfiguration(argThat(ic -> ic.getName().equals("quay.io/test/test-image:0.0.1")), any(), any()), times(1)); - } - - } - - private static JKubeConfiguration createJKubeConfiguration(File projectBaseDir) { - return JKubeConfiguration.builder() - .outputDirectory("target") - .project(JavaProject.builder() - .baseDirectory(projectBaseDir) - .build()) - .build(); - } + private JKubeServiceHub jKubeServiceHub; + + @BeforeEach + void setUp() { + jKubeServiceHub = JKubeServiceHub.builder() + .log(new KitLogger.SilentLogger()) + .platformMode(RuntimeMode.KUBERNETES) + .buildServiceConfig(BuildServiceConfig.builder().build()) + .configuration(JKubeConfiguration.builder().build()) + .build(); + } + + @Test + void isApplicable_withNoBuildStrategy_shouldReturnFalse() { + // When + final boolean result = new JibImageBuildService(jKubeServiceHub).isApplicable(); + // Then + assertThat(result).isFalse(); + } + + @Test + void isApplicable_withJibBuildStrategy_shouldReturnTrue() { + // Given + jKubeServiceHub = jKubeServiceHub.toBuilder() + .buildServiceConfig(BuildServiceConfig.builder() + .jKubeBuildStrategy(JKubeBuildStrategy.jib) + .build()) + .build(); + // When + final boolean result = new JibImageBuildService(jKubeServiceHub).isApplicable(); + // Then + assertThat(result).isTrue(); + } } From 4cccc93af16fc7dbceee99c385fece3691bc7f56 Mon Sep 17 00:00:00 2001 From: Joseph Victor Date: Wed, 22 May 2024 14:36:29 +0530 Subject: [PATCH 142/289] fix: removed Exception never thrown by WatchMojo.getWatchContext() method and the corresponding catch block associated with the exception. Signed-off-by: Joseph Victor --- .../eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java index f93de5162a..1b918d66d9 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java @@ -125,8 +125,6 @@ private WatcherContext getWatcherContext() throws MojoExecutionException { .build(); } catch (DependencyResolutionRequiredException dependencyException) { throw new MojoExecutionException("Instructed to use project classpath, but cannot. Continuing build if we can: " + dependencyException.getMessage()); - } catch (IOException ioException) { - throw new MojoExecutionException(ioException.getMessage()); } } @@ -150,7 +148,7 @@ protected KitLogger createLogger(String prefix) { return new AnsiLogger(getLog(), useColor, verbose, !settings.getInteractiveMode(), getLogPrefix() + prefix); } - protected WatchContext getWatchContext() throws DependencyResolutionRequiredException, IOException { + protected WatchContext getWatchContext() throws DependencyResolutionRequiredException { final DockerServiceHub hub = jkubeServiceHub.getDockerServiceHub(); return WatchContext.builder() .watchInterval(watchInterval) From 61984a95398da632d1cef6889f8a5581cb126643 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Wed, 22 May 2024 14:26:44 +0200 Subject: [PATCH 143/289] refactor: reorganize JibService#build to support multiple target tar image files Signed-off-by: Marc Nuri --- jkube-kit/build/service/jib/pom.xml | 6 ++ .../jkube/kit/service/jib/JibService.java | 57 +++++++++++-------- .../jkube/kit/service/jib/JibServiceTest.java | 30 +++++++++- .../JibImageBuildServiceBuildTest.java | 19 ++++++- .../JibImageBuildServicePushTest.java | 2 +- 5 files changed, 87 insertions(+), 27 deletions(-) diff --git a/jkube-kit/build/service/jib/pom.xml b/jkube-kit/build/service/jib/pom.xml index c5562113cf..15f19b2cba 100644 --- a/jkube-kit/build/service/jib/pom.xml +++ b/jkube-kit/build/service/jib/pom.xml @@ -60,6 +60,12 @@ org.assertj assertj-core + + org.eclipse.jkube + jkube-kit-common + test + test-jar + com.marcnuri.helm-java helm-java diff --git a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java index 9b1bdf1c9c..6acd879654 100644 --- a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java +++ b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java @@ -21,12 +21,10 @@ import com.google.cloud.tools.jib.api.JibContainerBuilder; import com.google.cloud.tools.jib.api.LogEvent; import com.google.cloud.tools.jib.api.RegistryException; -import com.google.cloud.tools.jib.api.RegistryImage; import com.google.cloud.tools.jib.api.TarImage; import com.google.cloud.tools.jib.event.events.ProgressEvent; import org.eclipse.jkube.kit.build.api.assembly.AssemblyManager; import org.eclipse.jkube.kit.build.api.assembly.BuildDirs; -import org.eclipse.jkube.kit.build.api.assembly.JKubeBuildTarArchiver; import org.eclipse.jkube.kit.build.api.auth.AuthConfig; import org.eclipse.jkube.kit.build.api.auth.AuthConfigFactory; import org.eclipse.jkube.kit.common.Assembly; @@ -84,12 +82,40 @@ public void close() throws Exception { } } + public final ImageName getImageName() { + return new ImageName(imageConfiguration.getName()); + } + + /** + * Builds a container Jib container image tarball. + * + * @return the location of the generated tarball file. + */ public final File build() { + final JibContainerBuilder from = assembleFrom(); + try { + final File jibImageTarArchive = getJibImageTarArchive(); + final Containerizer to = Containerizer + .to(TarImage.at(jibImageTarArchive.toPath()).named(imageConfiguration.getName())); + containerize(from, to); + return jibImageTarArchive; + } catch (InvalidImageReferenceException ex) { + throw new JKubeException("Unable to build the image tarball: " + ex.getMessage(), ex); + } + } + + public final void push() { + final JibContainerBuilder from = Jib.from(TarImage.at(getJibImageTarArchive().toPath())); + final Containerizer to = Containerizer + .to(toRegistryImage(getImageName().getFullName(), getPushRegistryCredentials())); + containerize(from, to); + } + + private JibContainerBuilder assembleFrom() { final BuildDirs buildDirs = new BuildDirs(imageConfiguration.getName(), configuration); final String pullRegistry = getApplicablePullRegistryFrom(imageConfiguration.getBuildConfiguration().getFrom(), configuration.getPullRegistryConfig()); final Credential pullRegistryCredential = getPullRegistryCredentials(); final JibContainerBuilder from = containerFromImageConfiguration(imageConfiguration, pullRegistry, pullRegistryCredential); - try { // Prepare Assembly files final AssemblyManager assemblyManager = AssemblyManager.getInstance(); @@ -104,29 +130,14 @@ public final File build() { // files should be added using the AssemblyFileEntry list. AssemblyManager, should provide // a common way to achieve this so that both the tar builder and any other builder could get a hold of // archive customizers, file entries, etc. - final File dockerTarArchive = assemblyManager.createDockerTarArchive( + assemblyManager.createDockerTarArchive( imageConfiguration.getName(), configuration, imageConfiguration.getBuildConfiguration(), jibLogger.logger, null); - - final Containerizer to = Containerizer.to(TarImage.at(dockerTarArchive.toPath()).named(imageConfiguration.getName())); - containerize(from, to); - return dockerTarArchive; - } catch (IOException | InvalidImageReferenceException ex) { + return from; + } catch (IOException ex) { throw new JKubeException("Unable to build the image tarball: " + ex.getMessage(), ex); } } - public final void push() { - final TarImage image = TarImage.at(getBuildTarArchive().toPath()); - final JibContainerBuilder from = Jib.from(image); - final RegistryImage registryImage = toRegistryImage(getImageName().getFullName(), getPushRegistryCredentials()); - final Containerizer to = Containerizer.to(registryImage); - containerize(from, to); - } - - public final ImageName getImageName() { - return new ImageName(imageConfiguration.getName()); - } - private void containerize(JibContainerBuilder from, Containerizer to) { to.setAllowInsecureRegistries(true); to.setExecutorService(executorService); @@ -147,9 +158,9 @@ private void containerize(JibContainerBuilder from, Containerizer to) { } } - private File getBuildTarArchive() { + private File getJibImageTarArchive() { final BuildDirs buildDirs = new BuildDirs(imageConfiguration.getName(), configuration); - return new File(buildDirs.getTemporaryRootDirectory(), JKubeBuildTarArchiver.ARCHIVE_FILE_NAME + ArchiveCompression.none.getFileSuffix()); + return new File(buildDirs.getTemporaryRootDirectory(), "jib-image." + ArchiveCompression.none.getFileSuffix()); } private Credential getPullRegistryCredentials() { diff --git a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java index 2511231faa..736660128a 100644 --- a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java +++ b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java @@ -31,6 +31,7 @@ import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.RegistryConfig; import org.eclipse.jkube.kit.common.RegistryServerConfiguration; +import org.eclipse.jkube.kit.common.assertj.ArchiveAssertions; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.junit.jupiter.api.AfterEach; @@ -41,6 +42,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import java.io.File; import java.net.HttpURLConnection; import java.net.URL; import java.nio.charset.StandardCharsets; @@ -74,6 +76,7 @@ void setUp() { jibLogger = new JibLogger(new KitLogger.SilentLogger()); testAuthConfigFactory = new TestAuthConfigFactory(); configuration = JKubeConfiguration.builder() + .pullRegistryConfig(RegistryConfig.builder().build()) .pushRegistryConfig(RegistryConfig.builder() .registry(remoteOciServer) .settings(Collections.singletonList(RegistryServerConfiguration.builder() @@ -107,6 +110,31 @@ void prependsRegistryWhenNotConfiguredInName() throws Exception { } } + @Nested + @DisplayName("build") + class Build { + + @BeforeEach + void setUp() { + imageConfiguration = imageConfiguration.toBuilder() + .build(imageConfiguration.getBuild().toBuilder() + .from("gcr.io/distroless/base@sha256:8267a5d9fa15a538227a8850e81cf6c548a78de73458e99a67e8799bbffb1ba0") + .build()) + .build(); + } + + @Test + void build() throws Exception { + try (JibService jibService = new JibService(jibLogger, testAuthConfigFactory, configuration, imageConfiguration)) { + final File jibContainerImageTar = jibService.build(); + ArchiveAssertions.assertThat(jibContainerImageTar) + .fileTree() + .contains("manifest.json", "config.json"); + } + } + + } + @Nested @DisplayName("push") class Push { @@ -122,7 +150,7 @@ void setUp() throws Exception { Jib.fromScratch() .setFormat(ImageFormat.Docker) .containerize(Containerizer.to(TarImage - .at(buildDirs.getTemporaryRootDirectory().toPath().resolve("docker-build.tar")) + .at(buildDirs.getTemporaryRootDirectory().toPath().resolve("jib-image.tar")) .named(imageConfiguration.getName())) ); } diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceBuildTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceBuildTest.java index 01d6aef3eb..90b61238b2 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceBuildTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceBuildTest.java @@ -147,6 +147,21 @@ void build_shouldCallPluginServiceAddFiles() throws JKubeServiceException { .contains("Adding extra files for plugin org.eclipse.jkube"); } + @Test + void build_shouldLogBuiltTarImage() throws JKubeServiceException { + final ImageConfiguration ic = ImageConfiguration.builder() + .name("test/foo:latest") + .build(BuildConfiguration.builder() + .from("gcr.io/distroless/base@sha256:8267a5d9fa15a538227a8850e81cf6c548a78de73458e99a67e8799bbffb1ba0") + .build()) + .build(); + // When + jibBuildService.build(ic); + // Then + assertThat(out.toString()) + .contains("/latest/tmp/jib-image.tar successfully built"); + } + @Test void build_withLayersAndArtifact_shouldPerformJibBuild() throws Exception { // Given @@ -203,7 +218,7 @@ void build_withLayersAndArtifact_shouldPerformJibBuild() throws Exception { separatorsToSystem("jkube-generated-layer-final-artifact/deployments/final-artifact.jar"), "deployments" ); - ArchiveAssertions.assertThat(dockerDir.resolve("tmp").resolve("docker-build.tar").toFile()) + ArchiveAssertions.assertThat(dockerDir.resolve("tmp").resolve("jib-image.tar").toFile()) .fileTree() .hasSize(17) .contains("config.json", "manifest.json") @@ -250,7 +265,7 @@ void shouldConsiderRegistryForTargetImage() throws Exception { .resolve("gcr.io").resolve("namespace").resolve("image-name").resolve("tag"); // Note that the registry is part of the directory tree assertThat(dockerDir).exists().isDirectory(); - ArchiveAssertions.assertThat(dockerDir.resolve("tmp").resolve("docker-build.tar").toFile()) + ArchiveAssertions.assertThat(dockerDir.resolve("tmp").resolve("jib-image.tar").toFile()) .entry("manifest.json") .asString() .satisfies(manifest -> assertThat(Serialization.unmarshal(manifest, new TypeReference>>(){})) diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServicePushTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServicePushTest.java index c4f497cb3a..cc9669bb40 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServicePushTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServicePushTest.java @@ -124,7 +124,7 @@ void setUp() throws Exception { .resolve("test-image") .resolve("0.0.1") .resolve("tmp") - .resolve("docker-build.tar"); + .resolve("jib-image.tar"); Jib.fromScratch() .setFormat(ImageFormat.Docker) .containerize(Containerizer.to(TarImage From 1f32ccd744e1eaa1da1eed4ed2db7d032b19f9ec Mon Sep 17 00:00:00 2001 From: Arman Yekkehkhani <72594459+arman-yekkehkhani@users.noreply.github.com> Date: Wed, 22 May 2024 18:37:05 +0330 Subject: [PATCH 144/289] fix: replace AssertJ's deprecated asList() DSL method in ResourceUtilTest (3073) fix(ResourceUtilTest): replace AssertJ's deprecated method asList(), issue #3057 Signed-off-by: arman-yekkehkhani --- fix(ResourceUtilTest): avoid wildcard imports, issue #3057 Signed-off-by: arman-yekkehkhani --- .../kit/common/util/ResourceUtilTest.java | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) 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 82915df50e..3021f4404c 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 @@ -19,6 +19,8 @@ import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.api.model.ConfigMapBuilder; +import io.fabric8.kubernetes.api.model.Container; +import io.fabric8.kubernetes.api.model.EnvVar; import io.fabric8.kubernetes.api.model.EnvVarBuilder; import io.fabric8.kubernetes.api.model.GenericKubernetesResource; import io.fabric8.kubernetes.api.model.HasMetadata; @@ -26,6 +28,7 @@ import io.fabric8.kubernetes.api.model.Pod; import io.fabric8.kubernetes.api.model.Service; import io.fabric8.kubernetes.api.model.ServiceAccount; +import io.fabric8.kubernetes.api.model.ServicePort; import io.fabric8.kubernetes.api.model.ServicePortBuilder; import io.fabric8.kubernetes.api.model.apiextensions.v1beta1.CustomResourceDefinition; import io.fabric8.kubernetes.api.model.apps.Deployment; @@ -109,8 +112,11 @@ void deserializeKubernetesListOrTemplate_withTemplateFile_returnsValidList() thr .isInstanceOf(Pod.class) .asInstanceOf(InstanceOfAssertFactories.type(Pod.class)) .hasFieldOrPropertyWithValue("metadata.name", "pod-from-template") - .extracting("spec.containers").asList().first() - .extracting("env").asList() + .extracting("spec.containers") + .asInstanceOf(InstanceOfAssertFactories.list(Container.class)) + .first() + .extracting("env") + .asInstanceOf(InstanceOfAssertFactories.list(EnvVar.class)) .containsExactly(new EnvVarBuilder() .withName("ENV_VAR_FROM_PARAMETER") .withValue("replaced_value") @@ -132,7 +138,8 @@ void deserializeKubernetesListOrTemplate_withMultipleYamlAndSeparator_returnsVal .isInstanceOf(Service.class) .asInstanceOf(InstanceOfAssertFactories.type(Service.class)) .hasFieldOrPropertyWithValue("metadata.name", "test-project") - .extracting("spec.ports").asList() + .extracting("spec.ports") + .asInstanceOf(InstanceOfAssertFactories.list(ServicePort.class)) .containsExactly(new ServicePortBuilder() .withName("http") .withPort(8080) @@ -143,8 +150,11 @@ void deserializeKubernetesListOrTemplate_withMultipleYamlAndSeparator_returnsVal .isInstanceOf(Deployment.class) .asInstanceOf(InstanceOfAssertFactories.type(Deployment.class)) .hasFieldOrPropertyWithValue("metadata.name", "test-project") - .extracting("spec.template.spec.containers").asList().first() - .extracting("env").asList() + .extracting("spec.template.spec.containers") + .asInstanceOf(InstanceOfAssertFactories.list(Container.class)) + .first() + .extracting("env") + .asInstanceOf(InstanceOfAssertFactories.list(EnvVar.class)) .containsExactly(new EnvVarBuilder() .withName("KUBERNETES_NAMESPACE") .withNewValueFrom() @@ -168,7 +178,9 @@ void deserializeKubernetesListOrTemplate_withStandardResourcesAndPlaceholders_re .isInstanceOf(Service.class) .hasFieldOrPropertyWithValue("metadata.name", "the-service") .hasFieldOrPropertyWithValue("metadata.additionalProperties.annotations", "${annotations_placeholder}") - .extracting("spec.ports").asList().singleElement() + .extracting("spec.ports") + .asInstanceOf(InstanceOfAssertFactories.list(ServicePort.class)) + .singleElement() .hasFieldOrPropertyWithValue("protocol", "TCP") .hasFieldOrPropertyWithValue("additionalProperties.port", "{{ .Values.service.port }}") ) From 718a9273cdf8fd0cad403b1a14e85f7b49607808 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 23 May 2024 06:25:48 +0200 Subject: [PATCH 145/289] chore(deps): Bump step-security/harden-runner from 2.7.1 to 2.8.0 Bumps [step-security/harden-runner](https://github.com/step-security/harden-runner) from 2.7.1 to 2.8.0. - [Release notes](https://github.com/step-security/harden-runner/releases) - [Commits](https://github.com/step-security/harden-runner/compare/a4aa98b93cab29d9b1101a6143fb8bce00e2eac4...f086349bfa2bd1361f7909c78558e816508cdc10) --- updated-dependencies: - dependency-name: step-security/harden-runner dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/license.yml | 2 +- .github/workflows/quickstarts.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/license.yml b/.github/workflows/license.yml index a4f41f546b..e99ff38910 100644 --- a/.github/workflows/license.yml +++ b/.github/workflows/license.yml @@ -29,7 +29,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 + uses: step-security/harden-runner@f086349bfa2bd1361f7909c78558e816508cdc10 with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/quickstarts.yml b/.github/workflows/quickstarts.yml index 781185d250..05ecc37523 100644 --- a/.github/workflows/quickstarts.yml +++ b/.github/workflows/quickstarts.yml @@ -29,7 +29,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@a4aa98b93cab29d9b1101a6143fb8bce00e2eac4 + uses: step-security/harden-runner@f086349bfa2bd1361f7909c78558e816508cdc10 with: disable-sudo: true egress-policy: block From 6b74bc8b0484e6ea0fec7ae239d32b0a96b824d2 Mon Sep 17 00:00:00 2001 From: Kirat Kumar Date: Thu, 23 May 2024 14:22:41 +0500 Subject: [PATCH 146/289] fix: removed Exception never thrown by KubernetesWatchTask.getWatchContext --- .../jkube/gradle/plugin/task/KubernetesWatchTask.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java index d25d482509..ca1eb42be7 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java @@ -29,7 +29,6 @@ import org.eclipse.jkube.watcher.api.WatcherManager; import javax.inject.Inject; -import java.io.IOException; import java.net.URL; import java.util.List; @@ -72,7 +71,7 @@ public void run() { } } - private WatcherContext createWatcherContext() throws IOException { + private WatcherContext createWatcherContext() { WatchContext watchContext = jKubeServiceHub.getDockerServiceHub() != null ? getWatchContext() : null; return WatcherContext.builder() .buildContext(jKubeServiceHub.getConfiguration()) @@ -87,7 +86,7 @@ private WatcherContext createWatcherContext() throws IOException { .build(); } - private WatchContext getWatchContext() throws IOException { + private WatchContext getWatchContext() { final DockerServiceHub hub = jKubeServiceHub.getDockerServiceHub(); return WatchContext.builder() .watchInterval(kubernetesExtension.getWatchIntervalOrDefault()) From f4d036ac9223249b3147183eadf88880d4cab11a Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Thu, 23 May 2024 11:55:54 +0200 Subject: [PATCH 147/289] feat(jib): support building images from scratch Signed-off-by: Marc Nuri --- .../jkube/kit/service/jib/JibServiceUtil.java | 15 +++++++++++---- .../jkube/kit/service/jib/JibServiceTest.java | 9 --------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java index b7f49445ca..6d63b2803f 100644 --- a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java +++ b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java @@ -22,6 +22,7 @@ import java.util.function.Predicate; import java.util.stream.Collectors; +import com.google.cloud.tools.jib.api.ImageReference; import org.eclipse.jkube.kit.build.api.assembly.BuildDirs; import org.eclipse.jkube.kit.common.Assembly; import org.eclipse.jkube.kit.common.AssemblyFileEntry; @@ -54,10 +55,16 @@ private JibServiceUtil() { private static final String BUSYBOX = "busybox:latest"; public static JibContainerBuilder containerFromImageConfiguration( - ImageConfiguration imageConfiguration, String pullRegistry, Credential pullRegistryCredential) { - final JibContainerBuilder containerBuilder = Jib - .from(toRegistryImage(getBaseImage(imageConfiguration, pullRegistry), pullRegistryCredential)) - .setFormat(ImageFormat.Docker); + ImageConfiguration imageConfiguration, String pullRegistry, Credential pullRegistryCredential + ) { + final String baseImage = getBaseImage(imageConfiguration, pullRegistry); + final JibContainerBuilder containerBuilder; + if (baseImage.equals(ImageReference.scratch().toString() + ":latest")) { + containerBuilder = Jib.fromScratch(); + } else { + containerBuilder = Jib.from(toRegistryImage(baseImage, pullRegistryCredential)); + } + containerBuilder.setFormat(ImageFormat.Docker); if (imageConfiguration.getBuildConfiguration() != null) { final BuildConfiguration bic = imageConfiguration.getBuildConfiguration(); Optional.ofNullable(bic.getEntryPoint()) diff --git a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java index 736660128a..eaf1a708e8 100644 --- a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java +++ b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java @@ -114,15 +114,6 @@ void prependsRegistryWhenNotConfiguredInName() throws Exception { @DisplayName("build") class Build { - @BeforeEach - void setUp() { - imageConfiguration = imageConfiguration.toBuilder() - .build(imageConfiguration.getBuild().toBuilder() - .from("gcr.io/distroless/base@sha256:8267a5d9fa15a538227a8850e81cf6c548a78de73458e99a67e8799bbffb1ba0") - .build()) - .build(); - } - @Test void build() throws Exception { try (JibService jibService = new JibService(jibLogger, testAuthConfigFactory, configuration, imageConfiguration)) { From cd64fe79159d5070663c52a0541796e8b240dd43 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Tue, 28 May 2024 07:21:29 +0200 Subject: [PATCH 148/289] feat(jib): multi-platform build support Signed-off-by: Marc Nuri --- CHANGELOG.md | 1 + .../build/api/config/property/ConfigKey.java | 1 + .../property/PropertyConfigResolver.java | 1 + .../property/PropertyConfigResolverTest.java | 19 + jkube-kit/build/service/jib/pom.xml | 8 +- .../jkube/kit/service/jib/JibService.java | 44 +- .../jkube/kit/service/jib/JibServiceUtil.java | 39 +- .../jkube/kit/service/jib/JibServiceTest.java | 72 ++- .../kit/service/jib/JibServiceUtilTest.java | 409 ++++++++++++------ .../image/build/BuildConfiguration.java | 7 +- .../kubernetes/JibImageBuildService.java | 7 +- .../JibImageBuildServiceBuildTest.java | 31 +- .../JibImageBuildServicePushTest.java | 59 ++- .../src/main/asciidoc/inc/_integrations.adoc | 1 + .../asciidoc/inc/build/_configuration.adoc | 12 + 15 files changed, 549 insertions(+), 162 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2732f84f41..a881a1b075 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Usage: ./scripts/extract-changelog-for-version.sh 1.3.37 5 ``` ### 1.17-SNAPSHOT +* Fix #2098: Add support for multi-platform container image builds in jib build strategy * Fix #2335: Add support for configuring nodeSelector spec for controller via xml/groovy DSL configuration * Fix #2459: Allow configuring Buildpacks build via ImageConfiguration * Fix #2462: `k8s:debug` throws error when using `buildpacks` build strategy diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/ConfigKey.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/ConfigKey.java index ad0d3853e6..053c7911a7 100644 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/ConfigKey.java +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/ConfigKey.java @@ -56,6 +56,7 @@ public enum ConfigKey { LABELS(ValueCombinePolicy.MERGE), MAINTAINER, NAME, + PLATFORMS(ValueCombinePolicy.MERGE), PORTS(ValueCombinePolicy.MERGE), REGISTRY, SHELL, diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolver.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolver.java index 5176a91618..7c7b885d9a 100644 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolver.java +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolver.java @@ -86,6 +86,7 @@ private BuildConfiguration extractBuildConfiguration(ImageConfiguration fromConf .fromExt(valueProvider.getMap(ConfigKey.FROM_EXT, valueOrNull(config, BuildConfiguration::getFromExt))) .clearVolumes().volumes(valueProvider.getList(ConfigKey.VOLUMES, valueOr(config, BuildConfiguration::getVolumes, Collections.emptyList()))) .clearTags().tags(valueProvider.getList(ConfigKey.TAGS, valueOr(config, BuildConfiguration::getTags, Collections.emptyList()))) + .clearPlatforms().platforms(valueProvider.getList(ConfigKey.PLATFORMS, valueOr(config, BuildConfiguration::getPlatforms, Collections.emptyList()))) .maintainer(valueProvider.getString(ConfigKey.MAINTAINER, valueOrNull(config, BuildConfiguration::getMaintainer))) .workdir(valueProvider.getString(ConfigKey.WORKDIR, valueOrNull(config, BuildConfiguration::getWorkdir))) .skip(valueProvider.getBoolean(ConfigKey.SKIP, valueOrNull(config, BuildConfiguration::getSkip))) diff --git a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolverTest.java b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolverTest.java index ba26be8c9c..b3e3545ea0 100644 --- a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolverTest.java +++ b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolverTest.java @@ -51,6 +51,7 @@ void setUp() { .port("9082") .tag("initial-tag-1") .tag("initial-tag-2") + .platform("darwin/amd64") .healthCheck(HealthCheckConfiguration.builder() .interval("30s") .build()) @@ -73,6 +74,8 @@ void setUp() { javaProject.getProperties().put("jkube.container-image.ports.2", "9080"); javaProject.getProperties().put("jkube.container-image.tags.1", "tag-1"); javaProject.getProperties().put("jkube.container-image.tags.2", "tag-2"); + javaProject.getProperties().put("jkube.container-image.platforms.1", "linux/amd64"); + javaProject.getProperties().put("jkube.container-image.platforms.2", "linux/arm64"); javaProject.getProperties().put("jkube.container-image.healthcheck.interval", "10s"); } @@ -149,11 +152,17 @@ void setsPorts() { assertThat(resolved.getBuild().getPorts()).containsExactlyInAnyOrder("8080", "9080"); } + @Test void setsTags() { assertThat(resolved.getBuild().getTags()).containsExactlyInAnyOrder("tag-1", "tag-2"); } + @Test + void setsPlatforms() { + assertThat(resolved.getBuild().getPlatforms()).containsExactlyInAnyOrder("linux/amd64", "linux/arm64"); + } + @Test void setsHealthCheckInterval() { assertThat(resolved.getBuild().getHealthCheck().getInterval()).isEqualTo("10s"); @@ -225,6 +234,11 @@ void appendsTags() { assertThat(resolved.getBuild().getTags()).containsExactlyInAnyOrder("tag-1", "tag-2", "initial-tag-1", "initial-tag-2"); } + @Test + void appendsPlatforms() { + assertThat(resolved.getBuild().getPlatforms()).containsExactlyInAnyOrder("linux/amd64", "linux/arm64", "darwin/amd64"); + } + @Test void overridesHealthCheckInterval() { assertThat(resolved.getBuild().getHealthCheck().getInterval()).isEqualTo("10s"); @@ -292,6 +306,11 @@ void preservesTags() { assertThat(resolved.getBuild().getTags()).containsExactlyInAnyOrder("initial-tag-1", "initial-tag-2"); } + @Test + void preservesPlatforms() { + assertThat(resolved.getBuild().getPlatforms()).containsExactlyInAnyOrder("darwin/amd64"); + } + @Test void preservesHealthCheckInterval() { assertThat(resolved.getBuild().getHealthCheck().getInterval()).isEqualTo("30s"); diff --git a/jkube-kit/build/service/jib/pom.xml b/jkube-kit/build/service/jib/pom.xml index 15f19b2cba..1a051b9033 100644 --- a/jkube-kit/build/service/jib/pom.xml +++ b/jkube-kit/build/service/jib/pom.xml @@ -47,14 +47,14 @@ org.apache.commons commons-text + - org.mockito - mockito-core + org.junit.jupiter + junit-jupiter-engine org.junit.jupiter - junit-jupiter-engine - test + junit-jupiter-params org.assertj diff --git a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java index 6acd879654..e31feac2e8 100644 --- a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java +++ b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibService.java @@ -16,12 +16,12 @@ import com.google.cloud.tools.jib.api.CacheDirectoryCreationException; import com.google.cloud.tools.jib.api.Containerizer; import com.google.cloud.tools.jib.api.Credential; -import com.google.cloud.tools.jib.api.InvalidImageReferenceException; import com.google.cloud.tools.jib.api.Jib; import com.google.cloud.tools.jib.api.JibContainerBuilder; import com.google.cloud.tools.jib.api.LogEvent; import com.google.cloud.tools.jib.api.RegistryException; import com.google.cloud.tools.jib.api.TarImage; +import com.google.cloud.tools.jib.api.buildplan.Platform; import com.google.cloud.tools.jib.event.events.ProgressEvent; import org.eclipse.jkube.kit.build.api.assembly.AssemblyManager; import org.eclipse.jkube.kit.build.api.assembly.BuildDirs; @@ -39,8 +39,11 @@ import java.io.File; import java.io.IOException; import java.time.Instant; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -49,6 +52,8 @@ import static org.eclipse.jkube.kit.build.api.helper.RegistryUtil.getApplicablePullRegistryFrom; import static org.eclipse.jkube.kit.build.api.helper.RegistryUtil.getApplicablePushRegistryFrom; import static org.eclipse.jkube.kit.service.jib.JibServiceUtil.containerFromImageConfiguration; +import static org.eclipse.jkube.kit.service.jib.JibServiceUtil.platforms; +import static org.eclipse.jkube.kit.service.jib.JibServiceUtil.toImageReference; import static org.eclipse.jkube.kit.service.jib.JibServiceUtil.toRegistryImage; public class JibService implements AutoCloseable { @@ -89,23 +94,33 @@ public final ImageName getImageName() { /** * Builds a container Jib container image tarball. * - * @return the location of the generated tarball file. + * @return the location of the generated tarball files. */ - public final File build() { - final JibContainerBuilder from = assembleFrom(); - try { - final File jibImageTarArchive = getJibImageTarArchive(); - final Containerizer to = Containerizer - .to(TarImage.at(jibImageTarArchive.toPath()).named(imageConfiguration.getName())); + public final List build() { + final List generatedTarballs = new ArrayList<>(); + for (Platform platform : platforms(imageConfiguration)) { + final JibContainerBuilder from = assembleFrom(); + from.setPlatforms(Collections.singleton(platform)); + final File jibImageTarArchive = getJibImageTarArchive(platform); + final Containerizer to = Containerizer.to( + TarImage.at(jibImageTarArchive.toPath()) + .named(toImageReference(imageConfiguration)) + ); containerize(from, to); - return jibImageTarArchive; - } catch (InvalidImageReferenceException ex) { - throw new JKubeException("Unable to build the image tarball: " + ex.getMessage(), ex); + generatedTarballs.add(jibImageTarArchive); } + return generatedTarballs; } public final void push() { - final JibContainerBuilder from = Jib.from(TarImage.at(getJibImageTarArchive().toPath())); + final Set platforms = platforms(imageConfiguration); + final JibContainerBuilder from; + if (platforms.size() > 1) { + from = assembleFrom(); + from.setPlatforms(platforms); + } else { + from = Jib.from(TarImage.at(getJibImageTarArchive(platforms.iterator().next()).toPath())); + } final Containerizer to = Containerizer .to(toRegistryImage(getImageName().getFullName(), getPushRegistryCredentials())); containerize(from, to); @@ -158,9 +173,10 @@ private void containerize(JibContainerBuilder from, Containerizer to) { } } - private File getJibImageTarArchive() { + private File getJibImageTarArchive(Platform platform) { final BuildDirs buildDirs = new BuildDirs(imageConfiguration.getName(), configuration); - return new File(buildDirs.getTemporaryRootDirectory(), "jib-image." + ArchiveCompression.none.getFileSuffix()); + return new File(buildDirs.getTemporaryRootDirectory(), String.format("jib-image.%s-%s.%s", + platform.getOs(), platform.getArchitecture(), ArchiveCompression.none.getFileSuffix())); } private Credential getPullRegistryCredentials() { diff --git a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java index 6d63b2803f..e4353bd3fa 100644 --- a/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java +++ b/jkube-kit/build/service/jib/src/main/java/org/eclipse/jkube/kit/service/jib/JibServiceUtil.java @@ -16,13 +16,17 @@ import java.io.File; import java.nio.file.Path; import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.function.Predicate; import java.util.stream.Collectors; import com.google.cloud.tools.jib.api.ImageReference; +import com.google.cloud.tools.jib.api.buildplan.Platform; import org.eclipse.jkube.kit.build.api.assembly.BuildDirs; import org.eclipse.jkube.kit.common.Assembly; import org.eclipse.jkube.kit.common.AssemblyFileEntry; @@ -49,17 +53,18 @@ public class JibServiceUtil { + private static final String BUSYBOX = "busybox:latest"; + private static final Platform DEFAULT_PLATFORM = new Platform("amd64", "linux"); + private JibServiceUtil() { } - private static final String BUSYBOX = "busybox:latest"; - public static JibContainerBuilder containerFromImageConfiguration( ImageConfiguration imageConfiguration, String pullRegistry, Credential pullRegistryCredential ) { final String baseImage = getBaseImage(imageConfiguration, pullRegistry); final JibContainerBuilder containerBuilder; - if (baseImage.equals(ImageReference.scratch().toString() + ":latest")) { + if (baseImage.equals(ImageReference.scratch() + ":latest")) { containerBuilder = Jib.fromScratch(); } else { containerBuilder = Jib.from(toRegistryImage(baseImage, pullRegistryCredential)); @@ -113,6 +118,34 @@ static RegistryImage toRegistryImage(String imageReference, Credential credentia } } + static ImageReference toImageReference(ImageConfiguration imageConfiguration) { + try { + return ImageReference.parse(imageConfiguration.getName()); + } catch (InvalidImageReferenceException e) { + throw new JKubeException("Invalid image reference: " + imageConfiguration.getName(), e); + } + } + + static Set platforms(ImageConfiguration imageConfiguration) { + final List targetPlatforms = Optional.ofNullable(imageConfiguration) + .map(ImageConfiguration::getBuildConfiguration) + .map(BuildConfiguration::getPlatforms) + .orElse(Collections.emptyList()); + final Set ret = new LinkedHashSet<>(); + for (String targetPlatform : targetPlatforms) { + final int slashIndex = targetPlatform.indexOf('/'); + if (slashIndex >= 0) { + final String os = targetPlatform.substring(0, slashIndex); + final String arch = targetPlatform.substring(slashIndex + 1); + ret.add(new Platform(arch, os)); + } + } + if (ret.isEmpty()) { + ret.add(DEFAULT_PLATFORM); + } + return ret; + } + public static String getBaseImage(ImageConfiguration imageConfiguration, String optionalRegistry) { String baseImage = Optional.ofNullable(imageConfiguration) .map(ImageConfiguration::getBuildConfiguration) diff --git a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java index eaf1a708e8..e2df323176 100644 --- a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java +++ b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java @@ -48,6 +48,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Path; import java.util.Collections; +import java.util.List; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -80,9 +81,9 @@ void setUp() { .pushRegistryConfig(RegistryConfig.builder() .registry(remoteOciServer) .settings(Collections.singletonList(RegistryServerConfiguration.builder() - .id(remoteOciServer) - .username("oci-user") - .password("oci-password") + .id(remoteOciServer) + .username("oci-user") + .password("oci-password") .build())) .build()) .project(JavaProject.builder() @@ -117,13 +118,43 @@ class Build { @Test void build() throws Exception { try (JibService jibService = new JibService(jibLogger, testAuthConfigFactory, configuration, imageConfiguration)) { - final File jibContainerImageTar = jibService.build(); - ArchiveAssertions.assertThat(jibContainerImageTar) - .fileTree() - .contains("manifest.json", "config.json"); + final List containerImageTarFiles = jibService.build(); + assertThat(containerImageTarFiles) + .singleElement() + .returns("jib-image.linux-amd64.tar", File::getName) + .satisfies(jibContainerImageTar -> { + ArchiveAssertions.assertThat(jibContainerImageTar) + .fileTree() + .contains("manifest.json", "config.json"); + }); } } + @Test + void buildMultiplePlatforms() throws Exception { + imageConfiguration = imageConfiguration.toBuilder() + .build(imageConfiguration.getBuild().toBuilder() + .platform("linux/amd64") + .platform("linux/arm64") + .platform("linux/arm") + .build()) + .build(); + try (JibService jibService = new JibService(jibLogger, testAuthConfigFactory, configuration, imageConfiguration)) { + final List containerImageTarFiles = jibService.build(); + assertThat(containerImageTarFiles) + .hasSize(3) + .allSatisfy(jibContainerImageTar -> { + ArchiveAssertions.assertThat(jibContainerImageTar) + .fileTree() + .contains("manifest.json", "config.json"); + }) + .extracting(File::getName) + .contains("jib-image.linux-amd64.tar", "jib-image.linux-arm64.tar", "jib-image.linux-arm.tar"); + ; + } + + } + } @Nested @@ -141,7 +172,7 @@ void setUp() throws Exception { Jib.fromScratch() .setFormat(ImageFormat.Docker) .containerize(Containerizer.to(TarImage - .at(buildDirs.getTemporaryRootDirectory().toPath().resolve("jib-image.tar")) + .at(buildDirs.getTemporaryRootDirectory().toPath().resolve("jib-image.linux-amd64.tar")) .named(imageConfiguration.getName())) ); } @@ -153,6 +184,7 @@ void tearDown() { } } + @SuppressWarnings("resource") @Test void emptyImageNameThrowsException() { final ImageConfiguration emptyImageConfiguration = ImageConfiguration.builder().build(); @@ -208,6 +240,30 @@ void pushAdditionalTags() throws Exception { assertThat(IOUtils.toString(connection.getInputStream(), StandardCharsets.UTF_8)) .contains("{\"name\":\"the-image-name\",\"tags\":[\"1.0\",\"1.0.0\",\"latest\"]}"); } + + @Test + void pushMultiplatform() throws Exception { + imageConfiguration = imageConfiguration.toBuilder() + .build(imageConfiguration.getBuild().toBuilder() + .platform("linux/amd64") + .platform("linux/arm64") + .platform("linux/arm") + .build()) + .build(); + try (JibService jibService = new JibService(jibLogger, testAuthConfigFactory, configuration, imageConfiguration)) { + jibService.push(); + } + final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer + "/v2/the-image-name/manifests/latest") + .openConnection(); + connection.setRequestProperty("Authorization", "Basic " + Base64.encodeBase64String("oci-user:oci-password".getBytes())); + connection.setRequestProperty("Accept", "application/vnd.docker.distribution.manifest.list.v2+json"); + connection.connect(); + assertThat(connection.getResponseCode()).isEqualTo(200); + assertThat(IOUtils.toString(connection.getInputStream(), StandardCharsets.UTF_8)) + .contains(":{\"architecture\":\"amd64\",\"os\":\"linux\"}}") + .contains(":{\"architecture\":\"arm64\",\"os\":\"linux\"}}") + .contains(":{\"architecture\":\"arm\",\"os\":\"linux\"}}"); + } } } diff --git a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java index ebb0947450..791f2b6680 100644 --- a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java +++ b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java @@ -13,161 +13,326 @@ */ package org.eclipse.jkube.kit.service.jib; -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - +import com.google.cloud.tools.jib.api.ImageReference; +import com.google.cloud.tools.jib.api.JibContainerBuilder; +import com.google.cloud.tools.jib.api.buildplan.AbsoluteUnixPath; +import com.google.cloud.tools.jib.api.buildplan.FileEntriesLayer; +import com.google.cloud.tools.jib.api.buildplan.ImageFormat; +import com.google.cloud.tools.jib.api.buildplan.Platform; +import com.google.cloud.tools.jib.api.buildplan.Port; import org.eclipse.jkube.kit.build.api.assembly.BuildDirs; import org.eclipse.jkube.kit.common.Assembly; import org.eclipse.jkube.kit.common.AssemblyConfiguration; import org.eclipse.jkube.kit.common.AssemblyFile; import org.eclipse.jkube.kit.common.AssemblyFileEntry; import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.common.Arguments; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; - -import com.google.cloud.tools.jib.api.JibContainerBuilder; -import com.google.cloud.tools.jib.api.buildplan.AbsoluteUnixPath; -import com.google.cloud.tools.jib.api.buildplan.FileEntriesLayer; -import com.google.cloud.tools.jib.api.buildplan.ImageFormat; -import com.google.cloud.tools.jib.api.buildplan.Port; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.io.TempDir; -import org.mockito.MockedConstruction; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.ValueSource; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.eclipse.jkube.kit.service.jib.JibServiceUtil.containerFromImageConfiguration; -import static org.mockito.Answers.RETURNS_SELF; -import static org.mockito.Mockito.mockConstructionWithAnswer; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; +import static org.junit.jupiter.params.provider.Arguments.arguments; class JibServiceUtilTest { + @Nested + @DisplayName("containerFromImageConfiguration") + class ContainerFromImageConfiguration { + + private ImageConfiguration imageConfiguration; + + @BeforeEach + void basicImageConfiguration() { + imageConfiguration = ImageConfiguration.builder() + .name("test/test-project") + .build(BuildConfiguration.builder() + .assembly(AssemblyConfiguration.builder() + .layer(Assembly.builder() + .files(Collections.singletonList(AssemblyFile.builder() + .source(new File("${project.basedir}/foo")) + .outputDirectory(new File("targetDir")) + .build())) + .build()) + .build()) + .entryPoint(Arguments.builder().exec(Arrays.asList("java", "-jar", "foo.jar")).build()) + .labels(Collections.singletonMap("foo", "bar")) + .user("root") + .workdir("/home/foo") + .ports(Collections.singletonList("8080")) + .volume("/mnt/volume1") + .build()) + .build(); + } + + @ParameterizedTest(name = "{index}: from {0} returnsValidJibContainerBuilder") + @ValueSource(strings = {"quay.io/test/test-image:test-tag", "scratch"}) + void returnsJibContainerBuilder(String from) { + // Given + imageConfiguration = imageConfiguration.toBuilder() + .build(imageConfiguration.getBuild().toBuilder() + .from(from) + .build()) + .build(); + // When + final JibContainerBuilder jibContainerBuilder = containerFromImageConfiguration(imageConfiguration, null, null); + // Then + assertThat(jibContainerBuilder.toContainerBuildPlan()) + .hasFieldOrPropertyWithValue("baseImage", from) + .hasFieldOrPropertyWithValue("labels", Collections.singletonMap("foo", "bar")) + .hasFieldOrPropertyWithValue("entrypoint", Arrays.asList("java", "-jar", "foo.jar")) + .hasFieldOrPropertyWithValue("exposedPorts", new HashSet<>(Collections.singletonList(Port.tcp(8080)))) + .hasFieldOrPropertyWithValue("user", "root") + .hasFieldOrPropertyWithValue("workingDirectory", AbsoluteUnixPath.get("/home/foo")) + .hasFieldOrPropertyWithValue("volumes", new HashSet<>(Collections.singletonList(AbsoluteUnixPath.get("/mnt/volume1")))) + .hasFieldOrPropertyWithValue("format", ImageFormat.Docker); + } + + } + + @Nested + @DisplayName("toImageReference") + class ToImageReference { + + @Test + void withImageName() { + // Given + final ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .name("test/test-project") + .build(); + // When + final ImageReference result = JibServiceUtil.toImageReference(imageConfiguration); + // Then + assertThat(result) + .hasFieldOrPropertyWithValue("tag", Optional.of("latest")) + .returns("test/test-project", ImageReference::toString); + } + @Test - void testGetBaseImageWithNullBuildConfig() { - assertThat(JibServiceUtil.getBaseImage(ImageConfiguration.builder().build(), null)).isEqualTo("busybox:latest"); + void withImageNameAndTag() { + // Given + final ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .name("test/test-project:1.0.0") + .build(); + // When + final ImageReference result = JibServiceUtil.toImageReference(imageConfiguration); + // Then + assertThat(result) + .hasFieldOrPropertyWithValue("tag", Optional.of("1.0.0")) + .hasFieldOrPropertyWithValue("registry", "registry-1.docker.io") + .returns("test/test-project:1.0.0", ImageReference::toString); } @Test - void testGetBaseImageWithNotNullBuildConfig() { - // Given - final ImageConfiguration imageConfiguration = ImageConfiguration.builder() - .build(BuildConfiguration.builder() - .from("quay.io/jkubeio/jkube-test-image:0.0.1") - .build()) - .build(); - // When - final String result = JibServiceUtil.getBaseImage(imageConfiguration, null); - // Then - assertThat(result).isEqualTo("quay.io/jkubeio/jkube-test-image:0.0.1"); + void withImageNameAndRegistry() { + // Given + final ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .name("registry.example.com/test/test-project") + .build(); + // When + final ImageReference result = JibServiceUtil.toImageReference(imageConfiguration); + // Then + assertThat(result) + .hasFieldOrPropertyWithValue("tag", Optional.of("latest")) + .hasFieldOrPropertyWithValue("registry", "registry.example.com") + .returns("registry.example.com/test/test-project", ImageReference::toString); } @Test - void testContainerFromImageConfiguration() throws Exception { - try (MockedConstruction ignore = mockConstructionWithAnswer(JibContainerBuilder.class, RETURNS_SELF)) { - // Given - ImageConfiguration imageConfiguration = getSampleImageConfiguration(); - // When - JibContainerBuilder jibContainerBuilder = containerFromImageConfiguration(imageConfiguration, null, null); - // Then - verify(jibContainerBuilder, times(1)).addLabel("foo", "bar"); - verify(jibContainerBuilder, times(1)).setEntrypoint(Arrays.asList("java", "-jar", "foo.jar")); - verify(jibContainerBuilder, times(1)).setExposedPorts(new HashSet<>(Collections.singletonList(Port.tcp(8080)))); - verify(jibContainerBuilder, times(1)).setUser("root"); - verify(jibContainerBuilder, times(1)).setWorkingDirectory(AbsoluteUnixPath.get("/home/foo")); - verify(jibContainerBuilder, times(1)).setVolumes(new HashSet<>(Collections.singletonList(AbsoluteUnixPath.get("/mnt/volume1")))); - verify(jibContainerBuilder, times(1)).setFormat(ImageFormat.Docker); - } + void withInvalidName() { + final ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .name("test/test-project:1.0.0:latest") + .build(); + assertThatThrownBy(() -> JibServiceUtil.toImageReference(imageConfiguration)) + .isInstanceOf(JKubeException.class) + .hasMessage("Invalid image reference: test/test-project:1.0.0:latest"); + } + } + + @Nested + @DisplayName("platforms") + @TestInstance(TestInstance.Lifecycle.PER_CLASS) + class Platforms { + @Test + void withNullPlatforms_returnsLinuxAmd64() { + // Given + final ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .build(BuildConfiguration.builder().build()) + .build(); + // When + final Set result = JibServiceUtil.platforms(imageConfiguration); + // Then + assertThat(result).containsExactly(new Platform("amd64", "linux")); } @Test - void layers_withEmptyLayers_shouldReturnEmpty() { - // When - final List result = JibServiceUtil.layers(null, Collections.emptyMap()); - // Then - assertThat(result).isNotNull().isEmpty(); + void withEmptyPlatforms_returnsLinuxAmd64() { + // Given + final ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .build(BuildConfiguration.builder() + .platforms(Collections.emptyList()) + .build()) + .build(); + // When + final Set result = JibServiceUtil.platforms(imageConfiguration); + // Then + assertThat(result).containsExactly(new Platform("amd64", "linux")); } @Test - void layers_withMultipleLayers_shouldReturnTransformedLayers(@TempDir Path temporaryFolder) throws IOException { - // Given - final BuildDirs buildDirs = new BuildDirs("layers-test", JKubeConfiguration.builder() - .outputDirectory("target/docker") - .project(JavaProject.builder().baseDirectory(temporaryFolder.toFile()).build()) - .build()); - final Map> originalLayers = new LinkedHashMap<>(); - originalLayers.put(Assembly.builder().id("layer-1").build(), Arrays.asList( - AssemblyFileEntry.builder().source(Files.createTempFile(temporaryFolder, "junit", "ext").toFile()) - .dest(buildDirs.getOutputDirectory().toPath().resolve("layer-1").resolve("l1.1.txt").toFile()).build(), - AssemblyFileEntry.builder().source(Files.createTempFile(temporaryFolder, "junit", "ext").toFile()) - .dest(buildDirs.getOutputDirectory().toPath().resolve("layer-1").resolve("l1.2.txt").toFile()).build() - )); - originalLayers.put(Assembly.builder().build(), Arrays.asList( - AssemblyFileEntry.builder().source(Files.createTempFile(temporaryFolder, "junit", "ext").toFile()) - .dest(new File(buildDirs.getOutputDirectory(),"l2.1.txt")).build(), - AssemblyFileEntry.builder().source(Files.createTempFile(temporaryFolder, "junit", "ext").toFile()) - .dest(new File(buildDirs.getOutputDirectory(),"l2.2.txt")).build() - )); - // Creates a denormalized path in JDK 8 - originalLayers.put(Assembly.builder().id("jkube-generated-layer-final-artifact").build(), Collections.singletonList( - AssemblyFileEntry.builder().source(Files.createTempFile(temporaryFolder, "junit", "ext").toFile()) - .dest(buildDirs.getOutputDirectory().toPath().resolve("jkube-generated-layer-final-artifact") - .resolve("deployments").resolve(".").resolve("edge.case").toFile()).build() - )); - // When - final List result = JibServiceUtil.layers(buildDirs, originalLayers); - // Then - assertThat(result).hasSize(3) - .anySatisfy(fel -> assertThat(fel) - .hasFieldOrPropertyWithValue("name", "layer-1") - .extracting(FileEntriesLayer::getEntries).asList().extracting("extractionPath.unixPath") - .containsExactly("/l1.1.txt", "/l1.2.txt") - ) - .anySatisfy(fel -> assertThat(fel) - .hasFieldOrPropertyWithValue("name", "") - .extracting(FileEntriesLayer::getEntries).asList().extracting("extractionPath.unixPath") - .containsExactly("/l2.1.txt", "/l2.2.txt") - ) - .anySatisfy(fel -> assertThat(fel) - .hasFieldOrPropertyWithValue("name", "jkube-generated-layer-final-artifact") - .extracting(FileEntriesLayer::getEntries).asList().extracting("extractionPath.unixPath") - .containsExactly("/deployments/edge.case") - ) - .extracting(FileEntriesLayer::getName) - .containsExactly("layer-1", "", "jkube-generated-layer-final-artifact"); + void withInvalidPlatform_returnsLinuxAmd64() { + // Given + final ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .build(BuildConfiguration.builder() + .platform("not-a-platform") + .build()) + .build(); + // When + final Set result = JibServiceUtil.platforms(imageConfiguration); + // Then + assertThat(result).containsExactly(new Platform("amd64", "linux")); } - private ImageConfiguration getSampleImageConfiguration() { - return ImageConfiguration.builder() - .name("test/test-project") - .build(BuildConfiguration.builder() - .from("quay.io/test/testimage:testtag") - .assembly(AssemblyConfiguration.builder() - .layer(Assembly.builder() - .files(Collections.singletonList(AssemblyFile.builder() - .source(new File("${project.basedir}/foo")) - .outputDirectory(new File("targetDir")) - .build())) - .build()) - .build()) - .entryPoint(Arguments.builder().exec(Arrays.asList("java", "-jar", "foo.jar")).build()) - .labels(Collections.singletonMap("foo", "bar")) - .user("root") - .workdir("/home/foo") - .ports(Collections.singletonList("8080")) - .volume("/mnt/volume1") - .build()) - .build(); + @ParameterizedTest(name = "{index}: with platform {0} returns os {1} and arch {2}") + @MethodSource("platforms") + void withPlatforms(String platform, String expectedOs, String expectedArch) { + // Given + final ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .build(BuildConfiguration.builder() + .platforms(Collections.singletonList(platform)) + .build()) + .build(); + // When + final Set result = JibServiceUtil.platforms(imageConfiguration); + // Then + assertThat(result) + .singleElement() + .hasFieldOrPropertyWithValue("os", expectedOs) + .hasFieldOrPropertyWithValue("architecture", expectedArch); } + + public Stream platforms() { + return Stream.of( + arguments("linux/amd64", "linux", "amd64"), + arguments("linux/arm64", "linux", "arm64"), + arguments("linux/arm", "linux", "arm"), + arguments("linux/arm/v5", "linux", "arm/v5"), + arguments("linux/arm/v7", "linux", "arm/v7"), + arguments("darwin/arm64", "darwin", "arm64") + ); + } + } + + @Nested + @DisplayName("getBaseImage") + class GetBaseImage { + + @Test + void withNullBuildConfig() { + assertThat(JibServiceUtil.getBaseImage(ImageConfiguration.builder().build(), null)).isEqualTo("busybox:latest"); + } + + @Test + void withBuildConfig() { + // Given + final ImageConfiguration imageConfiguration = ImageConfiguration.builder() + .build(BuildConfiguration.builder() + .from("quay.io/jkubeio/jkube-test-image:0.0.1") + .build()) + .build(); + // When + final String result = JibServiceUtil.getBaseImage(imageConfiguration, null); + // Then + assertThat(result).isEqualTo("quay.io/jkubeio/jkube-test-image:0.0.1"); + } + } + + @Nested + @DisplayName("layers") + class Layers { + @Test + void withEmptyLayers_shouldReturnEmpty() { + // When + final List result = JibServiceUtil.layers(null, Collections.emptyMap()); + // Then + assertThat(result).isNotNull().isEmpty(); + } + + @Test + void withMultipleLayers_shouldReturnTransformedLayers(@TempDir Path temporaryFolder) throws IOException { + // Given + final BuildDirs buildDirs = new BuildDirs("layers-test", JKubeConfiguration.builder() + .outputDirectory("target/docker") + .project(JavaProject.builder().baseDirectory(temporaryFolder.toFile()).build()) + .build()); + final Map> originalLayers = new LinkedHashMap<>(); + originalLayers.put(Assembly.builder().id("layer-1").build(), Arrays.asList( + AssemblyFileEntry.builder().source(Files.createTempFile(temporaryFolder, "junit", "ext").toFile()) + .dest(buildDirs.getOutputDirectory().toPath().resolve("layer-1").resolve("l1.1.txt").toFile()).build(), + AssemblyFileEntry.builder().source(Files.createTempFile(temporaryFolder, "junit", "ext").toFile()) + .dest(buildDirs.getOutputDirectory().toPath().resolve("layer-1").resolve("l1.2.txt").toFile()).build() + )); + originalLayers.put(Assembly.builder().build(), Arrays.asList( + AssemblyFileEntry.builder().source(Files.createTempFile(temporaryFolder, "junit", "ext").toFile()) + .dest(new File(buildDirs.getOutputDirectory(), "l2.1.txt")).build(), + AssemblyFileEntry.builder().source(Files.createTempFile(temporaryFolder, "junit", "ext").toFile()) + .dest(new File(buildDirs.getOutputDirectory(), "l2.2.txt")).build() + )); + // Creates a denormalized path in JDK 8 + originalLayers.put(Assembly.builder().id("jkube-generated-layer-final-artifact").build(), Collections.singletonList( + AssemblyFileEntry.builder().source(Files.createTempFile(temporaryFolder, "junit", "ext").toFile()) + .dest(buildDirs.getOutputDirectory().toPath().resolve("jkube-generated-layer-final-artifact") + .resolve("deployments").resolve(".").resolve("edge.case").toFile()).build() + )); + // When + final List result = JibServiceUtil.layers(buildDirs, originalLayers); + // Then + assertThat(result).hasSize(3) + .anySatisfy(fel -> assertThat(fel) + .hasFieldOrPropertyWithValue("name", "layer-1") + .extracting(FileEntriesLayer::getEntries).asList().extracting("extractionPath.unixPath") + .containsExactly("/l1.1.txt", "/l1.2.txt") + ) + .anySatisfy(fel -> assertThat(fel) + .hasFieldOrPropertyWithValue("name", "") + .extracting(FileEntriesLayer::getEntries).asList().extracting("extractionPath.unixPath") + .containsExactly("/l2.1.txt", "/l2.2.txt") + ) + .anySatisfy(fel -> assertThat(fel) + .hasFieldOrPropertyWithValue("name", "jkube-generated-layer-final-artifact") + .extracting(FileEntriesLayer::getEntries).asList().extracting("extractionPath.unixPath") + .containsExactly("/deployments/edge.case") + ) + .extracting(FileEntriesLayer::getName) + .containsExactly("layer-1", "", "jkube-generated-layer-final-artifact"); + } + + } } diff --git a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/BuildConfiguration.java b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/BuildConfiguration.java index 42dd6a5909..c2847e6d31 100644 --- a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/BuildConfiguration.java +++ b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/BuildConfiguration.java @@ -116,6 +116,9 @@ public class BuildConfiguration implements Serializable { @Singular private List tags; + @Singular + private List platforms; + /** * Environment variables. *

@@ -174,7 +177,9 @@ public class BuildConfiguration implements Serializable { */ private Boolean skip; - // Docker build strategy specific configuration options + /////////////////////////////////////////////////////////////////////////// + // Fields applicable to docker build strategy + /////////////////////////////////////////////////////////////////////////// /** * Path to a directory used for the build's context. You can specify the Dockerfile to use with dockerFile, which by * default is the Dockerfile found in the contextDir. diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java index 3369a5ccb8..5aad3f7d82 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildService.java @@ -69,8 +69,9 @@ public void buildSingleImage(ImageConfiguration imageConfiguration) throws JKube } kitLogger.info("[[B]]JIB[[B]] image build started"); try (JibService jibService = new JibService(jibLogger, authConfigFactory, configuration, imageConfiguration)) { - final File dockerTarArchive = jibService.build(); - kitLogger.info(" %s successfully built", dockerTarArchive.getAbsolutePath()); + for (final File dockerTarArchive : jibService.build()) { + kitLogger.info(" %s successfully built", dockerTarArchive.getAbsolutePath()); + } } catch (Exception ex) { throw new JKubeServiceException("Error when building JIB image", ex); } @@ -88,6 +89,6 @@ protected void pushSingleImage(ImageConfiguration imageConfiguration, int retrie @Override public void postProcess() { - // No post processing required + // No post-processing required } } diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceBuildTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceBuildTest.java index 90b61238b2..3f59a0fd7c 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceBuildTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceBuildTest.java @@ -159,7 +159,7 @@ void build_shouldLogBuiltTarImage() throws JKubeServiceException { jibBuildService.build(ic); // Then assertThat(out.toString()) - .contains("/latest/tmp/jib-image.tar successfully built"); + .contains("/latest/tmp/jib-image.linux-amd64.tar successfully built"); } @Test @@ -218,13 +218,38 @@ void build_withLayersAndArtifact_shouldPerformJibBuild() throws Exception { separatorsToSystem("jkube-generated-layer-final-artifact/deployments/final-artifact.jar"), "deployments" ); - ArchiveAssertions.assertThat(dockerDir.resolve("tmp").resolve("jib-image.tar").toFile()) + ArchiveAssertions.assertThat(dockerDir.resolve("tmp").resolve("jib-image.linux-amd64.tar").toFile()) .fileTree() .hasSize(17) .contains("config.json", "manifest.json") .haveExactly(15, new Condition<>(s -> s.endsWith(".tar.gz"), "Tar File layers")); } + @Test + void buildMultiplatform_shouldBuildSeparateTars() throws Exception { + // Given + final ImageConfiguration ic = ImageConfiguration.builder() + .name("namespace/image-name:multiplatform") + .build(BuildConfiguration.builder() + .from("scratch") + .platform("linux/amd64") + .platform("linux/arm64") + .build()) + .build(); + final Path dockerDir = dockerOutput.resolve("namespace").resolve("image-name").resolve("multiplatform"); + // When + jibBuildService.build(ic); + // Then + ArchiveAssertions.assertThat(dockerDir.resolve("tmp").resolve("jib-image.linux-amd64.tar").toFile()) + .fileTree() + .hasSize(2) + .contains("config.json", "manifest.json"); + ArchiveAssertions.assertThat(dockerDir.resolve("tmp").resolve("jib-image.linux-arm64.tar").toFile()) + .fileTree() + .hasSize(2) + .contains("config.json", "manifest.json"); + } + @Nested @DisplayName("with global registry") class GlobalRegistry { @@ -265,7 +290,7 @@ void shouldConsiderRegistryForTargetImage() throws Exception { .resolve("gcr.io").resolve("namespace").resolve("image-name").resolve("tag"); // Note that the registry is part of the directory tree assertThat(dockerDir).exists().isDirectory(); - ArchiveAssertions.assertThat(dockerDir.resolve("tmp").resolve("jib-image.tar").toFile()) + ArchiveAssertions.assertThat(dockerDir.resolve("tmp").resolve("jib-image.linux-amd64.tar").toFile()) .entry("manifest.json") .asString() .satisfies(manifest -> assertThat(Serialization.unmarshal(manifest, new TypeReference>>(){})) diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServicePushTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServicePushTest.java index cc9669bb40..96a516e550 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServicePushTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServicePushTest.java @@ -93,7 +93,7 @@ void setUp() throws Exception { imageConfiguration = ImageConfiguration.builder() .name("test/test-image:0.0.1") .build(BuildConfiguration.builder() - .from("busybox") + .from("scratch") .build()) .registry(remoteOciServer) .build(); @@ -103,6 +103,7 @@ void setUp() throws Exception { .buildServiceConfig(BuildServiceConfig.builder().build()) .configuration(JKubeConfiguration.builder() .project(JavaProject.builder().baseDirectory(temporaryFolder.toFile()).build()) + .pullRegistryConfig(RegistryConfig.builder().settings(Collections.emptyList()).build()) .pushRegistryConfig(RegistryConfig.builder() .registry(remoteOciServer) .settings(Collections.singletonList( @@ -124,7 +125,7 @@ void setUp() throws Exception { .resolve("test-image") .resolve("0.0.1") .resolve("tmp") - .resolve("jib-image.tar"); + .resolve("jib-image.linux-amd64.tar"); Jib.fromScratch() .setFormat(ImageFormat.Docker) .containerize(Containerizer.to(TarImage @@ -180,8 +181,8 @@ void invalidCredentials_throwsException() { } @Nested - @DisplayName("withValidConfiguration") - class ValidConfiguration { + @DisplayName("withValidNoPlatformConfiguration") + class ValidNoPlatformConfiguration { @BeforeEach void pushValidImage() throws Exception { @@ -207,4 +208,54 @@ void pushesImage() throws Exception { } } + @Nested + @DisplayName("withValidMultiplatformConfiguration") + class ValidMultiplatformConfiguration { + + @BeforeEach + void pushValidImage() throws Exception { + imageConfiguration = imageConfiguration.toBuilder() + .name("test/test-image:multiplatform") + .build(imageConfiguration.getBuild().toBuilder() + .platform("linux/amd64") + .platform("linux/arm64") + .platform("darwin/amd64") + .build()) + .build(); + new JibImageBuildService(jKubeServiceHub) + .push(Collections.singletonList(imageConfiguration), 1, false); + } + + @Test + void logsImagePush() { + verify(logger, times(1)) + .info("Pushing image: %s", remoteOciServer + "/test/test-image:multiplatform"); + } + + @Test + void pushesImage() throws Exception { + final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer + "/v2/test/test-image/tags/list") + .openConnection(); + connection.setRequestProperty("Authorization", "Basic " + Base64.encodeBase64String("oci-user:oci-password".getBytes())); + connection.connect(); + assertThat(connection.getResponseCode()).isEqualTo(200); + assertThat(IOUtils.toString(connection.getInputStream(), StandardCharsets.UTF_8)) + .contains("{\"name\":\"test/test-image\",\"tags\":[\"multiplatform\"]}"); + } + + @Test + void pushedImageManifestIsMultiplatform() throws Exception { + final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer + "/v2/test/test-image/manifests/multiplatform") + .openConnection(); + connection.setRequestProperty("Authorization", "Basic " + Base64.encodeBase64String("oci-user:oci-password".getBytes())); + connection.setRequestProperty("Accept", "application/vnd.docker.distribution.manifest.list.v2+json"); + connection.connect(); + assertThat(connection.getResponseCode()).isEqualTo(200); + assertThat(IOUtils.toString(connection.getInputStream(), StandardCharsets.UTF_8)) + .contains(":{\"architecture\":\"amd64\",\"os\":\"linux\"}}") + .contains(":{\"architecture\":\"arm64\",\"os\":\"linux\"}}") + .contains(":{\"architecture\":\"amd64\",\"os\":\"darwin\"}}"); + } + } + } diff --git a/jkube-kit/doc/src/main/asciidoc/inc/_integrations.adoc b/jkube-kit/doc/src/main/asciidoc/inc/_integrations.adoc index d09585a12b..37a01c5c15 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/_integrations.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/_integrations.adoc @@ -47,6 +47,7 @@ and Dekorate. You can activate this feature by using the following flag `-Djkube in the command-line, or setting it up as a property (`true`). endif::[] +[[integrations.jib]] == JIB (Java Image Builder) *{plugin}* also provides user an option to build container images without having access to any docker daemon. You just need to set `jkube.build.strategy` property to `jib`. It will delegate the build process to diff --git a/jkube-kit/doc/src/main/asciidoc/inc/build/_configuration.adoc b/jkube-kit/doc/src/main/asciidoc/inc/build/_configuration.adoc index 4918e6bb63..fb01d11b27 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/build/_configuration.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/build/_configuration.adoc @@ -141,6 +141,18 @@ See the global configuration option <> for t | if set to true then it will compress all the `runCmds` into a single `RUN` directive so that only one image layer is created. | `jkube.container-image.optimise` +| *platforms* +a| List of `platform` elements with the target platforms (os/architecture) for which to build the image. Enables multi-platform builds. + +You should use a base image that includes supports for multiple platforms such as: + +- x86-64: `linux/amd64`, `linux/i386` +- ARM architectures: `linux/arm/v7`, `linux/arm64` +- PowerPC: `linux/ppc64le` + +_Supported only when using the <> build strategy_ +| `jkube.container-image.platforms` + | *ports* | The exposed ports which is a list of `port` elements, one for each port to expose. Whitespace is trimmed from each element and empty elements are ignored. The format can be either pure numerical ("8080") or with the protocol attached ("8080/tcp"). | `jkube.container-image.ports` From b884716737edf79976209af418ed6852b6fca1b8 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Tue, 28 May 2024 11:42:59 +0200 Subject: [PATCH 149/289] chore(deps): Bump com.marcnuri.helm-java:helm-java from 0.0.7 to 0.0.9 Signed-off-by: Marc Nuri --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 403f8140e4..f1f2182a55 100644 --- a/pom.xml +++ b/pom.xml @@ -100,7 +100,7 @@ 0.0.5 3.0.21 33.2.0-jre - 0.0.7 + 0.0.9 2.17.1 0.8.12 2.5.1 From 7e10e321000d595b23b9cbe212ab54e712431c92 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Tue, 28 May 2024 15:40:36 +0530 Subject: [PATCH 150/289] feat(buildpacks): clear BuildPack cache when nocache is enabled in build configuration + Add clearCache boolean option to BuildPackBuildOptions + Add `--clear-cache` flag to pack CLI command line arguments when clearCache is set to `true` + Configured BuildPackBuildService to set clearCache when nocache is enabled in image build configuration Signed-off-by: Rohan Kumar --- CHANGELOG.md | 1 + .../jkube/kit/service/buildpacks/BuildPackBuildOptions.java | 1 + .../service/buildpacks/controller/BuildPackCliController.java | 3 +++ .../kit/service/buildpacks/BuildPackCliControllerTest.java | 3 ++- .../kit/config/service/kubernetes/BuildPackBuildService.java | 2 ++ .../config/service/kubernetes/BuildPackBuildServiceTest.java | 3 ++- 6 files changed, 11 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a881a1b075..075c687ee5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ Usage: * Fix #2335: Add support for configuring nodeSelector spec for controller via xml/groovy DSL configuration * Fix #2459: Allow configuring Buildpacks build via ImageConfiguration * Fix #2462: `k8s:debug` throws error when using `buildpacks` build strategy +* Fix #2463: Buildpacks should clear build cache when `nocache` option is enabled * Fix #2470: Add configuration option for overriding buildpack builder image * Fix #2662: Sanitize VCS remote URL used in `jkube.eclipse.org/git-url` annotation * Fix #2860: Correctly pass Docker build-arg from the build configuration to the Openshift build strategy diff --git a/jkube-kit/build/service/buildpacks/src/main/java/org/eclipse/jkube/kit/service/buildpacks/BuildPackBuildOptions.java b/jkube-kit/build/service/buildpacks/src/main/java/org/eclipse/jkube/kit/service/buildpacks/BuildPackBuildOptions.java index 4faaf9d2ff..cef1c5bfba 100644 --- a/jkube-kit/build/service/buildpacks/src/main/java/org/eclipse/jkube/kit/service/buildpacks/BuildPackBuildOptions.java +++ b/jkube-kit/build/service/buildpacks/src/main/java/org/eclipse/jkube/kit/service/buildpacks/BuildPackBuildOptions.java @@ -34,6 +34,7 @@ public class BuildPackBuildOptions { private String imageName; private String creationTime; private String imagePullPolicy; + private boolean clearCache; private List tags; private Map env; private List volumes; diff --git a/jkube-kit/build/service/buildpacks/src/main/java/org/eclipse/jkube/kit/service/buildpacks/controller/BuildPackCliController.java b/jkube-kit/build/service/buildpacks/src/main/java/org/eclipse/jkube/kit/service/buildpacks/controller/BuildPackCliController.java index 2663071f87..f0c8efe8b8 100644 --- a/jkube-kit/build/service/buildpacks/src/main/java/org/eclipse/jkube/kit/service/buildpacks/controller/BuildPackCliController.java +++ b/jkube-kit/build/service/buildpacks/src/main/java/org/eclipse/jkube/kit/service/buildpacks/controller/BuildPackCliController.java @@ -86,6 +86,9 @@ private List createBuildCommandArguments(BuildPackBuildOptions buildOpti .collect(Collectors.toList()); buildArgs.addAll(extractRepeatedArgsForListElements("--env", keyValueEntryList)); } + if (buildOptions.isClearCache()) { + buildArgs.add("--clear-cache"); + } return buildArgs; } diff --git a/jkube-kit/build/service/buildpacks/src/test/java/org/eclipse/jkube/kit/service/buildpacks/BuildPackCliControllerTest.java b/jkube-kit/build/service/buildpacks/src/test/java/org/eclipse/jkube/kit/service/buildpacks/BuildPackCliControllerTest.java index 724e652397..e6110fc093 100644 --- a/jkube-kit/build/service/buildpacks/src/test/java/org/eclipse/jkube/kit/service/buildpacks/BuildPackCliControllerTest.java +++ b/jkube-kit/build/service/buildpacks/src/test/java/org/eclipse/jkube/kit/service/buildpacks/BuildPackCliControllerTest.java @@ -72,11 +72,12 @@ void build_whenInvokedWithMoreBuildOptions_thenOptionsPassedAsCommandLineArgumen .tags(Arrays.asList("t1", "t2", "t3")) .imagePullPolicy("if-not-present") .env(Collections.singletonMap("BP_SPRING_CLOUD_BINDINGS_DISABLED", "true")) + .clearCache(true) .build(); // When buildPackCliController.build(buildOptions); // Then - verify(kitLogger).info("[[s]]%s", "build foo/bar:latest --builder foo/builder:base --creation-time now --pull-policy if-not-present --volume /tmp/volume:/platform/volume:ro --tag foo/bar:t1 --tag foo/bar:t2 --tag foo/bar:t3 --env BP_SPRING_CLOUD_BINDINGS_DISABLED=true"); + verify(kitLogger).info("[[s]]%s", "build foo/bar:latest --builder foo/builder:base --creation-time now --pull-policy if-not-present --volume /tmp/volume:/platform/volume:ro --tag foo/bar:t1 --tag foo/bar:t2 --tag foo/bar:t3 --env BP_SPRING_CLOUD_BINDINGS_DISABLED=true --clear-cache"); } @Test diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildService.java index 2f89ea056d..f3b73a663e 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildService.java @@ -17,6 +17,7 @@ import java.io.IOException; import java.util.Locale; import java.util.Objects; +import java.util.Optional; import java.util.Properties; import org.apache.commons.lang3.StringUtils; @@ -89,6 +90,7 @@ protected void buildSingleImage(ImageConfiguration imageConfiguration) { } buildPackBuildOptionsBuilder.env(imageConfiguration.getBuild().getEnv()) .tags(imageConfiguration.getBuild().getTags()) + .clearCache(Optional.ofNullable(imageConfiguration.getBuild().getNocache()).orElse(false)) .volumes(imageConfiguration.getBuild().getVolumes()); } new BuildPackCliController(packCli, kitLogger).build(buildPackBuildOptionsBuilder.build()); diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildServiceTest.java index 9f6d806309..344235e308 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildServiceTest.java @@ -211,6 +211,7 @@ void whenImageConfigurationContainsPackBuildArguments_thenArgumentsPassedToBuild .volumes(Collections.singletonList("/tmp/volume:/platform/volume:ro")) .tags(Arrays.asList("t1", "t2", "t3")) .env(Collections.singletonMap("BP_SPRING_CLOUD_BINDINGS_DISABLED", "true")) + .nocache(true) .build()) .build(); @@ -218,7 +219,7 @@ void whenImageConfigurationContainsPackBuildArguments_thenArgumentsPassedToBuild buildPackBuildService.buildSingleImage(imageConfiguration); // Then - verify(kitLogger).info("[[s]]%s", "build foo/bar:latest --builder paketobuildpacks/builder:tiny --creation-time now --pull-policy if-not-present --volume /tmp/volume:/platform/volume:ro --tag foo/bar:t1 --tag foo/bar:t2 --tag foo/bar:t3 --env BP_SPRING_CLOUD_BINDINGS_DISABLED=true"); + verify(kitLogger).info("[[s]]%s", "build foo/bar:latest --builder paketobuildpacks/builder:tiny --creation-time now --pull-policy if-not-present --volume /tmp/volume:/platform/volume:ro --tag foo/bar:t1 --tag foo/bar:t2 --tag foo/bar:t3 --env BP_SPRING_CLOUD_BINDINGS_DISABLED=true --clear-cache"); } } } From c207e97e45c727326364742e050029c0a082bc86 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Wed, 29 May 2024 10:30:21 +0200 Subject: [PATCH 151/289] chore: remove CircleCI badge from README Signed-off-by: Marc Nuri --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index c66246b211..53bc61ed3f 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ > Cloud-Native Java Applications without a hassle -[![Circle CI](https://circleci.com/gh/eclipse/jkube/tree/master.svg?style=shield)](https://circleci.com/gh/eclipse/jkube/tree/master) [![E2E Tests](https://github.com/eclipse-jkube/jkube-integration-tests/actions/workflows/e2e-tests.yml/badge.svg)](https://github.com/eclipse-jkube/jkube-integration-tests/actions/workflows/e2e-tests.yml) [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=jkubeio_jkube&metric=sqale_rating)](https://sonarcloud.io/dashboard?id=jkubeio_jkube) [![Coverage](https://sonarcloud.io/api/project_badges/measure?project=jkubeio_jkube&metric=coverage)](https://sonarcloud.io/dashboard?id=jkubeio_jkube) From 94f2303221a4b85bde16a29874cb1803e3e61dcc Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Wed, 29 May 2024 17:52:52 +0530 Subject: [PATCH 152/289] feat(helm): helm dependency update support added to HelmService Related to #2110 Add a new method in dependencyUpdate in HelmService that will use helm-java dependency for dependency update of helm chart Signed-off-by: Rohan Kumar --- .../jkube/kit/resource/helm/HelmConfig.java | 3 + .../jkube/kit/resource/helm/HelmService.java | 22 +++ .../kit/resource/helm/HelmServiceUtil.java | 6 + .../helm/HelmServiceDependencyUpdateIT.java | 127 ++++++++++++++++++ .../resource/helm/HelmServiceUtilTest.java | 23 +++- 5 files changed, 180 insertions(+), 1 deletion(-) create mode 100644 jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceDependencyUpdateIT.java diff --git a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmConfig.java b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmConfig.java index 6d8f020689..481ec6523d 100644 --- a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmConfig.java +++ b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmConfig.java @@ -75,6 +75,9 @@ public class HelmConfig { private String security; private boolean lintStrict; private boolean lintQuiet; + private boolean debug; + private boolean dependencyVerify; + private boolean dependencySkipRefresh; @JsonProperty("dependencies") diff --git a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java index dccc9d8c39..1a8a385a86 100644 --- a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java +++ b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java @@ -19,6 +19,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Map; @@ -32,6 +33,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +import com.marcnuri.helm.DependencyCommand; import com.marcnuri.helm.Helm; import com.marcnuri.helm.LintCommand; import com.marcnuri.helm.LintResult; @@ -167,6 +169,26 @@ public void uploadHelmChart(HelmConfig helm) throws BadUploadException, IOExcept } } + public void dependencyUpdate(HelmConfig helmConfig) { + for (HelmConfig.HelmType helmType : helmConfig.getTypes()) { + logger.info("Running Helm Dependency Upgrade %s %s", helmConfig.getChart(), helmConfig.getVersion()); + DependencyCommand.DependencySubcommand dependencyUpdateCommand = new Helm(Paths.get(helmConfig.getOutputDir(), helmType.getOutputDir())) + .dependency().update(); + if (helmConfig.isDebug()) { + dependencyUpdateCommand.debug(); + } + if (helmConfig.isDependencyVerify()) { + dependencyUpdateCommand.verify(); + } + if (helmConfig.isDependencySkipRefresh()) { + dependencyUpdateCommand.skipRefresh(); + } + Arrays.stream(dependencyUpdateCommand.call() + .split(System.lineSeparator())) + .forEach(l -> logger.info("[[W]]%s", l)); + } + } + public void lint(HelmConfig helmConfig) { for (HelmConfig.HelmType helmType : helmConfig.getTypes()) { final Path helmPackage = resolveTarballFile(helmConfig, helmType); diff --git a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUtil.java b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUtil.java index bbf7cd32b3..eff6e5f588 100644 --- a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUtil.java +++ b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUtil.java @@ -77,6 +77,9 @@ public class HelmServiceUtil { protected static final String PROPERTY_HELM_LINT_STRICT = "jkube.helm.lint.strict"; protected static final String PROPERTY_HELM_LINT_QUIET = "jkube.helm.lint.quiet"; + protected static final String PROPERTY_HELM_DEBUG = "jkube.helm.debug"; + protected static final String PROPERTY_HELM_DEPENDENCY_VERIFY = "jkube.helm.dependencyVerify"; + protected static final String PROPERTY_HELM_DEPENDENCY_SKIP_REFRESH = "jkube.helm.dependencySkipRefresh"; private HelmServiceUtil() { } @@ -117,6 +120,9 @@ public static HelmConfig.HelmConfigBuilder initHelmConfig( helmConfig::getOutputDir)); helmConfig.setLintStrict(resolveBooleanFromPropertyOrDefault(PROPERTY_HELM_LINT_STRICT, project, helmConfig::isLintStrict)); helmConfig.setLintQuiet(resolveBooleanFromPropertyOrDefault(PROPERTY_HELM_LINT_QUIET, project, helmConfig::isLintQuiet)); + helmConfig.setDebug(resolveBooleanFromPropertyOrDefault(PROPERTY_HELM_DEBUG, project, helmConfig::isDebug)); + helmConfig.setDependencyVerify(resolveBooleanFromPropertyOrDefault(PROPERTY_HELM_DEPENDENCY_VERIFY, project, helmConfig::isDependencyVerify)); + helmConfig.setDependencySkipRefresh(resolveBooleanFromPropertyOrDefault(PROPERTY_HELM_DEPENDENCY_SKIP_REFRESH, project, helmConfig::isDependencySkipRefresh)); return helmConfig.toBuilder(); } diff --git a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceDependencyUpdateIT.java b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceDependencyUpdateIT.java new file mode 100644 index 0000000000..797a3ed9bb --- /dev/null +++ b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceDependencyUpdateIT.java @@ -0,0 +1,127 @@ +/* + * 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.resource.helm; + +import com.marcnuri.helm.Helm; +import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.config.resource.ResourceServiceConfig; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.util.Collections; + +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@DisplayName("HelmService.dependencyUpdate") +class HelmServiceDependencyUpdateIT { + @TempDir + private Path tempDir; + private HelmConfig helmConfig; + private HelmService helmService; + private KitLogger kitLogger; + + @BeforeEach + void setUp() throws URISyntaxException { + kitLogger = spy(new KitLogger.SilentLogger()); + Path outputDir = tempDir.resolve("output"); + helmConfig = HelmConfig.builder() + .chart("helm-test") + .version("0.1.0") + .chartExtension("tgz") + .types(Collections.singletonList(HelmConfig.HelmType.KUBERNETES)) + .tarballOutputDir(outputDir.toFile().getAbsolutePath()) + .dependencies(Collections.singletonList(HelmDependency.builder() + .name("the-dependency") + .version("0.1.0") + .repository("file://../../the-dependency") + .build())) + .outputDir(outputDir.toString()) + .sourceDir(new File(HelmServiceDependencyUpdateIT.class.getResource("/it/sources").toURI()).getAbsolutePath()) + .build(); + helmService = new HelmService(JKubeConfiguration.builder().build(), new ResourceServiceConfig(), kitLogger); + } + + @Nested + @DisplayName("valid helm chart provided") + class ValidChart { + @BeforeEach + void validChartPackage() throws IOException { + helmService.generateHelmCharts(helmConfig); + } + + @Test + @DisplayName("valid dependency provided, then dependency pulled") + void whenNoExplicitDependencyConfigProvided_thenDependencyDownloaded() { + // Given + Helm.create().withName("the-dependency").withDir(tempDir).call(); + // When + helmService.dependencyUpdate(helmConfig); + // Then + verifyHelmDependencyDownloaded(); + } + + @Test + void whenConfigurationOptionsProvided_thenDependencyDownloaded() { + // Given + helmConfig = helmConfig.toBuilder() + .debug(true) + .dependencySkipRefresh(true) + .dependencyVerify(true) + .build(); + Helm.create().withName("the-dependency").withDir(tempDir).call(); + // When + helmService.dependencyUpdate(helmConfig); + // Then + verifyHelmDependencyDownloaded(); + } + + @Test + @DisplayName("non existing dependency provided, then throw exception") + void whenInvalidDependencyProvided_thenThrowException() { + // When + Then + assertThatIllegalStateException() + .isThrownBy(() -> helmService.dependencyUpdate(helmConfig)) + .withMessageContaining("not found"); + } + + private void verifyHelmDependencyDownloaded() { + verify(kitLogger, times(1)) + .info("Running Helm Dependency Upgrade %s %s", "helm-test", "0.1.0"); + verify(kitLogger, times(1)) + .info("[[W]]%s", "Saving 1 charts"); + verify(kitLogger, times(1)) + .info("[[W]]%s", "Deleting outdated charts"); + } + } + + @Test + @DisplayName("invalid chart provided, then throw exception") + void whenInvalidChartDirProvided_thenThrowException() { + // When + Then + assertThatIllegalStateException() + .isThrownBy(() -> helmService.dependencyUpdate(helmConfig)) + .withMessageContaining("no such file or directory"); + } +} diff --git a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUtilTest.java b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUtilTest.java index 93f2dd65ed..d0b5afedcd 100644 --- a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUtilTest.java +++ b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUtilTest.java @@ -108,6 +108,9 @@ void initHelmConfig_withOriginalConfig_shouldInitConfigWithoutOverriding() throw .outputDir("output") .lintStrict(true) .lintQuiet(true) + .debug(true) + .dependencySkipRefresh(true) + .dependencyVerify(true) .build(); // When final HelmConfig result = HelmServiceUtil @@ -127,7 +130,10 @@ void initHelmConfig_withOriginalConfig_shouldInitConfigWithoutOverriding() throw .hasFieldOrPropertyWithValue("sourceDir", "sources") .hasFieldOrPropertyWithValue("outputDir", "output") .hasFieldOrPropertyWithValue("lintStrict", true) - .hasFieldOrPropertyWithValue("lintQuiet", true); + .hasFieldOrPropertyWithValue("lintQuiet", true) + .hasFieldOrPropertyWithValue("debug", true) + .hasFieldOrPropertyWithValue("dependencySkipRefresh", true) + .hasFieldOrPropertyWithValue("dependencyVerify", true); } @Test @@ -164,6 +170,21 @@ void initHelmConfig_withLintProperties_shouldInitConfigWithLintSettings() throws .hasFieldOrPropertyWithValue("lintQuiet", true); } + @Test + void initHelmConfig_withHelmDependencyProperties_shouldInitConfigWithHelmDependencySettings() throws IOException { + // Given + javaProject.getProperties().put("jkube.helm.dependencyVerify", "True"); + javaProject.getProperties().put("jkube.helm.dependencySkipRefresh", "trUe"); + // When + final HelmConfig result = HelmServiceUtil + .initHelmConfig(HelmConfig.HelmType.KUBERNETES, javaProject, templateDir, null) + .build(); + // Then + assertThat(result) + .hasFieldOrPropertyWithValue("dependencyVerify", true) + .hasFieldOrPropertyWithValue("dependencySkipRefresh", true); + } + @Test void initHelmConfig_whenValuesSchemaJsonPresentInProjectBaseDir_thenAddToHelmConfig() throws IOException { // Given From 741ee55e16c496ed9cfd0a6c2403cb9550d115cd Mon Sep 17 00:00:00 2001 From: bhiwagade-rahul Date: Thu, 30 May 2024 19:23:17 +0530 Subject: [PATCH 153/289] fix: removed unused import from SpringBootWatcherTest (3102) SpringBootWatcherTest Remove unused imports #3102 --- .../eclipse/jkube/springboot/watcher/SpringBootWatcherTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherTest.java b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherTest.java index 66cbcda584..0df09bfe54 100644 --- a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherTest.java +++ b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherTest.java @@ -23,7 +23,6 @@ import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.Plugin; import org.eclipse.jkube.kit.common.util.KubernetesHelper; -import org.eclipse.jkube.kit.common.util.SpringBootUtil; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.config.service.PortForwardService; import org.eclipse.jkube.watcher.api.WatcherContext; From ed6d0ed1838a0bf1c30edeb043b5c85847f9c278 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Thu, 30 May 2024 19:38:02 +0530 Subject: [PATCH 154/289] feat: helm dependency update exposed via mojos and gradle tasks Signed-off-by: Rohan Kumar --- .../jkube/gradle/plugin/KubernetesPlugin.java | 3 + .../KubernetesHelmDependencyUpdateTask.java | 46 +++++++++ .../gradle/plugin/KubernetesPluginTest.java | 3 +- ...ubernetesHelmDependencyUpdateTaskTest.java | 89 +++++++++++++++++ .../jkube/gradle/plugin/OpenShiftPlugin.java | 3 + .../OpenShiftHelmDependencyUpdateTask.java | 26 +++++ .../gradle/plugin/OpenShiftPluginTest.java | 3 +- ...OpenShiftHelmDependencyUpdateTaskTest.java | 89 +++++++++++++++++ .../mojo/build/HelmDependencyUpdateMojo.java | 28 ++++++ .../mojo/GeneratedPluginDescriptorTest.java | 1 + ...ubernetesHelmDependencyUpdateMojoTest.java | 99 +++++++++++++++++++ .../OpenshiftHelmDependencyUpdateMojo.java | 52 ++++++++++ ...penShiftGeneratedPluginDescriptorTest.java | 1 + ...OpenshiftHelmDependencyUpdateMojoTest.java | 99 +++++++++++++++++++ 14 files changed, 540 insertions(+), 2 deletions(-) create mode 100644 gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmDependencyUpdateTask.java create mode 100644 gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmDependencyUpdateTaskTest.java create mode 100644 gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmDependencyUpdateTask.java create mode 100644 gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmDependencyUpdateTaskTest.java create mode 100644 kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmDependencyUpdateMojo.java create mode 100644 kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/KubernetesHelmDependencyUpdateMojoTest.java create mode 100644 openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmDependencyUpdateMojo.java create mode 100644 openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmDependencyUpdateMojoTest.java diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesPlugin.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesPlugin.java index a18efc910a..8596cea26e 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesPlugin.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesPlugin.java @@ -23,6 +23,7 @@ import org.eclipse.jkube.gradle.plugin.task.KubernetesBuildTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesConfigViewTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesDebugTask; +import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmDependencyUpdateTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmLintTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmPushTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmTask; @@ -51,6 +52,7 @@ public Map>> getTaskPrecedence() { ret.put("k8sHelm", Collections.singletonList(KubernetesResourceTask.class)); ret.put("k8sHelmPush", Collections.singletonList(KubernetesHelmTask.class)); ret.put("k8sHelmLint", Collections.singletonList(KubernetesHelmTask.class)); + ret.put("k8sHelmDependencyUpdate", Collections.singletonList(KubernetesHelmTask.class)); return ret; } @@ -67,6 +69,7 @@ protected void jKubeApply(Project project) { register(project, "k8sHelm", KubernetesHelmTask.class); register(project, "k8sHelmPush", KubernetesHelmPushTask.class); register(project, "k8sHelmLint", KubernetesHelmLintTask.class); + register(project, "k8sHelmDependencyUpdate", KubernetesHelmDependencyUpdateTask.class); register(project, "k8sRemoteDev", KubernetesRemoteDevTask.class); register(project, "k8sWatch", KubernetesWatchTask.class); } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmDependencyUpdateTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmDependencyUpdateTask.java new file mode 100644 index 0000000000..7ffc6e325f --- /dev/null +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmDependencyUpdateTask.java @@ -0,0 +1,46 @@ +/* + * 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.gradle.plugin.task; + +import org.eclipse.jkube.gradle.plugin.KubernetesExtension; +import org.eclipse.jkube.kit.resource.helm.HelmConfig; + +import javax.inject.Inject; + +import static org.eclipse.jkube.kit.resource.helm.HelmServiceUtil.initHelmConfig; + +public class KubernetesHelmDependencyUpdateTask extends AbstractJKubeTask { + @Inject + public KubernetesHelmDependencyUpdateTask(Class extensionClass) { + super(extensionClass); + setDescription("Update the on-disk dependencies to mirror Chart.yaml"); + } + + @Override + public void run() { + if (kubernetesExtension.getSkipOrDefault()) { + return; + } + try { + final HelmConfig helm = initHelmConfig(kubernetesExtension.getDefaultHelmType(), kubernetesExtension.javaProject, + kubernetesExtension.getKubernetesTemplateOrDefault(), + kubernetesExtension.helm) + .build(); + jKubeServiceHub.getHelmService().dependencyUpdate(helm); + } catch (Exception exp) { + kitLogger.error("Error performing helm dependency update", exp); + throw new IllegalStateException(exp.getMessage(), exp); + } + } +} \ No newline at end of file diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/KubernetesPluginTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/KubernetesPluginTest.java index 16a119d983..faa1605f48 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/KubernetesPluginTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/KubernetesPluginTest.java @@ -81,12 +81,13 @@ void getTaskPrecedence_withValidProject_shouldReturnTaskPrecedence() { final Map>> result = new KubernetesPlugin().getTaskPrecedence(); // Then assertThat(result) - .hasSize(6) + .hasSize(7) .containsEntry("k8sApply", Collections.singletonList(KubernetesResourceTask.class)) .containsEntry("k8sDebug", Arrays.asList(KubernetesBuildTask.class, KubernetesResourceTask.class, KubernetesApplyTask.class)) .containsEntry("k8sPush", Collections.singletonList(KubernetesBuildTask.class)) .containsEntry("k8sHelm", Collections.singletonList(KubernetesResourceTask.class)) + .containsEntry("k8sHelmDependencyUpdate", Collections.singletonList(KubernetesHelmTask.class)) .containsEntry("k8sHelmPush", Collections.singletonList(KubernetesHelmTask.class)) .containsEntry("k8sHelmLint", Collections.singletonList(KubernetesHelmTask.class)); } diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmDependencyUpdateTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmDependencyUpdateTaskTest.java new file mode 100644 index 0000000000..10d1e47bd4 --- /dev/null +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmDependencyUpdateTaskTest.java @@ -0,0 +1,89 @@ +/* + * 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.gradle.plugin.task; + +import com.marcnuri.helm.Helm; +import org.apache.commons.io.FileUtils; +import org.eclipse.jkube.gradle.plugin.KubernetesExtension; +import org.eclipse.jkube.gradle.plugin.TestKubernetesExtension; +import org.eclipse.jkube.kit.resource.helm.HelmConfig; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +class KubernetesHelmDependencyUpdateTaskTest { + @RegisterExtension + private final TaskEnvironmentExtension taskEnvironment = new TaskEnvironmentExtension(); + + @BeforeEach + void setUp() throws IOException { + final TestKubernetesExtension extension = new TestKubernetesExtension(); + Helm.create().withDir(taskEnvironment.getRoot().toPath()).withName("empty-project").call(); + Path helmChartOutputDir = taskEnvironment.getRoot().toPath().resolve("build").resolve("jkube").resolve("helm"); + Files.createDirectories(helmChartOutputDir.resolve("kubernetes")); + FileUtils.copyDirectory(taskEnvironment.getRoot().toPath().resolve("empty-project").toFile(), helmChartOutputDir.resolve("kubernetes").toFile()); + Files.write(helmChartOutputDir.resolve("kubernetes").resolve("Chart.yaml"), + ("\ndependencies:\n" + + " - name: the-dependency\n" + + " version: 0.1.0\n" + + " repository: file://../../../../the-dependency\n").getBytes(StandardCharsets.UTF_8), + StandardOpenOption.APPEND); + System.setProperty("jkube.kubernetesTemplate", taskEnvironment.getRoot().getAbsolutePath()); + extension.helm = HelmConfig.builder().chartExtension("tgz").outputDir(helmChartOutputDir.toString()).build(); + extension.isUseColor = false; + when(taskEnvironment.project.getName()).thenReturn("empty-project"); + when(taskEnvironment.project.getVersion()).thenReturn("0.1.0"); + when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); + } + + @AfterEach + void tearDown() { + System.clearProperty("jkube.kubernetesTemplate"); + } + + @Test + void runTask_withInvalidHelmDependency_shouldThrowException() { + // Given + KubernetesHelmDependencyUpdateTask kubernetesHelmDependencyUpdateTask = new KubernetesHelmDependencyUpdateTask(KubernetesExtension.class); + // When + Then + assertThatThrownBy(kubernetesHelmDependencyUpdateTask::runTask) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("the-dependency not found"); + } + + @Test + void runTask_withHelmDependencyPresent_shouldSucceed() { + // Given + KubernetesHelmDependencyUpdateTask kubernetesHelmDependencyUpdateTask = new KubernetesHelmDependencyUpdateTask(KubernetesExtension.class); + Helm.create().withName("the-dependency").withDir(taskEnvironment.getRoot().toPath()).call(); + + // When + kubernetesHelmDependencyUpdateTask.runTask(); + // Then + verify(taskEnvironment.logger).lifecycle("k8s: Running Helm Dependency Upgrade empty-project 0.1.0"); + verify(taskEnvironment.logger).lifecycle("k8s: Saving 1 charts"); + verify(taskEnvironment.logger).lifecycle("k8s: Deleting outdated charts"); + } +} diff --git a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/OpenShiftPlugin.java b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/OpenShiftPlugin.java index 6087e82a27..150df93110 100644 --- a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/OpenShiftPlugin.java +++ b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/OpenShiftPlugin.java @@ -27,6 +27,7 @@ import org.eclipse.jkube.gradle.plugin.task.OpenShiftApplyTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftBuildTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftDebugTask; +import org.eclipse.jkube.gradle.plugin.task.OpenShiftHelmDependencyUpdateTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftHelmLintTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftHelmPushTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftHelmTask; @@ -55,6 +56,7 @@ public Map>> getTaskPrecedence() { ret.put("ocHelm", Arrays.asList(KubernetesResourceTask.class, OpenShiftResourceTask.class)); ret.put("ocHelmPush", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)); ret.put("ocHelmLint", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)); + ret.put("ocHelmDependencyUpdate", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)); return ret; } @@ -71,6 +73,7 @@ protected void jKubeApply(Project project) { register(project, "ocHelm", OpenShiftHelmTask.class); register(project, "ocHelmPush", OpenShiftHelmPushTask.class); register(project, "ocHelmLint", OpenShiftHelmLintTask.class); + register(project, "ocHelmDependencyUpdate", OpenShiftHelmDependencyUpdateTask.class); register(project, "ocRemoteDev", OpenShiftRemoteDevTask.class); register(project, "ocWatch", OpenShiftWatchTask.class); } diff --git a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmDependencyUpdateTask.java b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmDependencyUpdateTask.java new file mode 100644 index 0000000000..cbd05816ae --- /dev/null +++ b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmDependencyUpdateTask.java @@ -0,0 +1,26 @@ +/* + * 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.gradle.plugin.task; + +import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; + +import javax.inject.Inject; + +public class OpenShiftHelmDependencyUpdateTask extends KubernetesHelmDependencyUpdateTask implements OpenShiftJKubeTask { + @Inject + public OpenShiftHelmDependencyUpdateTask(Class extensionClass) { + super(extensionClass); + setDescription("Update the on-disk dependencies to mirror Chart.yaml"); + } +} diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/OpenShiftPluginTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/OpenShiftPluginTest.java index 872facb276..6fdfbc512e 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/OpenShiftPluginTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/OpenShiftPluginTest.java @@ -39,12 +39,13 @@ void configurePrecedence_withValidProject_shouldReturnTaskPrecedence() { final Map>> result = new OpenShiftPlugin().getTaskPrecedence(); // Then assertThat(result) - .hasSize(6) + .hasSize(7) .containsEntry("ocApply", Arrays.asList(KubernetesResourceTask.class, OpenShiftResourceTask.class)) .containsEntry("ocDebug", Arrays.asList(KubernetesBuildTask.class, OpenShiftBuildTask.class, KubernetesResourceTask.class, OpenShiftResourceTask.class, KubernetesApplyTask.class, OpenShiftApplyTask.class)) .containsEntry("ocPush", Arrays.asList(KubernetesBuildTask.class, OpenShiftBuildTask.class)) .containsEntry("ocHelm", Arrays.asList(KubernetesResourceTask.class, OpenShiftResourceTask.class)) + .containsEntry("ocHelmDependencyUpdate", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)) .containsEntry("ocHelmPush", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)) .containsEntry("ocHelmLint", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)); } diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmDependencyUpdateTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmDependencyUpdateTaskTest.java new file mode 100644 index 0000000000..ca9a415947 --- /dev/null +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmDependencyUpdateTaskTest.java @@ -0,0 +1,89 @@ +/* + * 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.gradle.plugin.task; + +import com.marcnuri.helm.Helm; +import org.apache.commons.io.FileUtils; +import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; +import org.eclipse.jkube.gradle.plugin.TestOpenShiftExtension; +import org.eclipse.jkube.kit.resource.helm.HelmConfig; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +class OpenShiftHelmDependencyUpdateTaskTest { + @RegisterExtension + private final TaskEnvironmentExtension taskEnvironment = new TaskEnvironmentExtension(); + + @BeforeEach + void setUp() throws IOException { + final TestOpenShiftExtension extension = new TestOpenShiftExtension(); + Helm.create().withDir(taskEnvironment.getRoot().toPath()).withName("empty-project").call(); + Path helmChartOutputDir = taskEnvironment.getRoot().toPath().resolve("build").resolve("jkube").resolve("helm"); + Files.createDirectories(helmChartOutputDir.resolve("openshift")); + FileUtils.copyDirectory(taskEnvironment.getRoot().toPath().resolve("empty-project").toFile(), helmChartOutputDir.resolve("openshift").toFile()); + Files.write(helmChartOutputDir.resolve("openshift").resolve("Chart.yaml"), + ("\ndependencies:\n" + + " - name: the-dependency\n" + + " version: 0.1.0\n" + + " repository: file://../../../../the-dependency\n").getBytes(StandardCharsets.UTF_8), + StandardOpenOption.APPEND); + System.setProperty("jkube.kubernetesTemplate", taskEnvironment.getRoot().getAbsolutePath()); + extension.helm = HelmConfig.builder().chartExtension("tgz").outputDir(helmChartOutputDir.toString()).build(); + extension.isUseColor = false; + when(taskEnvironment.project.getName()).thenReturn("empty-project"); + when(taskEnvironment.project.getVersion()).thenReturn("0.1.0"); + when(taskEnvironment.project.getExtensions().getByType(OpenShiftExtension.class)).thenReturn(extension); + } + + @AfterEach + void tearDown() { + System.clearProperty("jkube.kubernetesTemplate"); + } + + @Test + void runTask_withInvalidHelmDependency_shouldThrowException() { + // Given + OpenShiftHelmDependencyUpdateTask openShiftHelmDependencyUpdateTask = new OpenShiftHelmDependencyUpdateTask(OpenShiftExtension.class); + // When + Then + assertThatThrownBy(openShiftHelmDependencyUpdateTask::runTask) + .isInstanceOf(IllegalStateException.class) + .hasMessageContaining("the-dependency not found"); + } + + @Test + void runTask_withHelmDependencyPresent_shouldSucceed() { + // Given + OpenShiftHelmDependencyUpdateTask openShiftHelmDependencyUpdateTask = new OpenShiftHelmDependencyUpdateTask(OpenShiftExtension.class); + Helm.create().withName("the-dependency").withDir(taskEnvironment.getRoot().toPath()).call(); + + // When + openShiftHelmDependencyUpdateTask.runTask(); + // Then + verify(taskEnvironment.logger).lifecycle("oc: Running Helm Dependency Upgrade empty-project 0.1.0"); + verify(taskEnvironment.logger).lifecycle("oc: Saving 1 charts"); + verify(taskEnvironment.logger).lifecycle("oc: Deleting outdated charts"); + } +} diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmDependencyUpdateMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmDependencyUpdateMojo.java new file mode 100644 index 0000000000..1a8036f1ef --- /dev/null +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmDependencyUpdateMojo.java @@ -0,0 +1,28 @@ +/* + * 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.maven.plugin.mojo.build; + +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.ResolutionScope; + +@Mojo(name = "helm-dependency-update", defaultPhase = LifecyclePhase.INTEGRATION_TEST, requiresDependencyResolution = ResolutionScope.COMPILE) +public class HelmDependencyUpdateMojo extends AbstractHelmMojo { + + @Override + public void executeInternal() throws MojoExecutionException { + jkubeServiceHub.getHelmService().dependencyUpdate(getHelm()); + } +} diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/GeneratedPluginDescriptorTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/GeneratedPluginDescriptorTest.java index a7730a7c42..e5f7601e5e 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/GeneratedPluginDescriptorTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/GeneratedPluginDescriptorTest.java @@ -54,6 +54,7 @@ static Stream data() { arguments("log", "compile+runtime", "validate"), arguments("push", "compile", "install"), arguments("helm", "", "pre-integration-test"), + arguments("helm-dependency-update", "compile", "integration-test"), arguments("helm-push", "compile", "install"), arguments("helm-lint", "compile", "integration-test")); } diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/KubernetesHelmDependencyUpdateMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/KubernetesHelmDependencyUpdateMojoTest.java new file mode 100644 index 0000000000..25591ee912 --- /dev/null +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/KubernetesHelmDependencyUpdateMojoTest.java @@ -0,0 +1,99 @@ +/* + * 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.maven.plugin.mojo.build; + +import com.marcnuri.helm.Helm; +import org.apache.commons.io.FileUtils; +import org.apache.maven.project.MavenProject; +import org.apache.maven.settings.Settings; +import org.eclipse.jkube.kit.resource.helm.HelmConfig; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; + +class KubernetesHelmDependencyUpdateMojoTest { + + @TempDir + private Path projectDir; + private PrintStream originalPrintStream; + private ByteArrayOutputStream outputStream; + private HelmDependencyUpdateMojo helmDependencyUpdateMojo; + + + @BeforeEach + void setUp() throws Exception { + originalPrintStream = System.out; + outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + Helm.create().withDir(projectDir).withName("empty-project").call(); + Path helmChartOutputDir = projectDir.resolve("target").resolve("jkube").resolve("helm"); + Files.createDirectories(helmChartOutputDir.resolve("kubernetes")); + FileUtils.copyDirectory(projectDir.resolve("empty-project").toFile(), helmChartOutputDir.resolve("kubernetes").toFile()); + Files.write(helmChartOutputDir.resolve("kubernetes").resolve("Chart.yaml"), + ("\ndependencies:\n" + + " - name: the-dependency\n" + + " version: 0.1.0\n" + + " repository: file://../../../../the-dependency\n").getBytes(StandardCharsets.UTF_8), + StandardOpenOption.APPEND); + System.setProperty("jkube.kubernetesTemplate", projectDir.toFile().getAbsolutePath()); + helmDependencyUpdateMojo = new HelmDependencyUpdateMojo(); + helmDependencyUpdateMojo.helm = HelmConfig.builder().chartExtension("tgz").outputDir(helmChartOutputDir.toString()).build(); + helmDependencyUpdateMojo.interpolateTemplateParameters = true; + helmDependencyUpdateMojo.settings = new Settings(); + helmDependencyUpdateMojo.project = new MavenProject(); + helmDependencyUpdateMojo.project.setVersion("0.1.0"); + helmDependencyUpdateMojo.project.getBuild() + .setOutputDirectory(projectDir.resolve("target").resolve("classes").toFile().getAbsolutePath()); + helmDependencyUpdateMojo.project.getBuild().setDirectory(projectDir.resolve("target").toFile().getAbsolutePath()); + helmDependencyUpdateMojo.project.setFile(projectDir.resolve("target").toFile()); + } + + @AfterEach + void tearDown() { + System.setOut(originalPrintStream); + System.clearProperty("jkube.kubernetesTemplate"); + helmDependencyUpdateMojo = null; + } + + @Test + void execute_withInvalidHelmDependency_shouldThrowException() { + assertThatIllegalStateException() + .isThrownBy(helmDependencyUpdateMojo::execute) + .withMessageContaining("the-dependency not found"); + } + + @Test + void execute_withHelmDependencyPresent_shouldSucceed() throws Exception { + // Given + Helm.create().withName("the-dependency").withDir(projectDir).call(); + // When + helmDependencyUpdateMojo.execute(); + // Then + assertThat(outputStream.toString()) + .contains("Running Helm Dependency Upgrade empty-project 0.1.0") + .contains("Saving 1 charts") + .contains("Deleting outdated charts"); + } +} diff --git a/openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmDependencyUpdateMojo.java b/openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmDependencyUpdateMojo.java new file mode 100644 index 0000000000..c8048cd1f2 --- /dev/null +++ b/openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmDependencyUpdateMojo.java @@ -0,0 +1,52 @@ +/* + * 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.maven.plugin.mojo.build; + +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.plugins.annotations.ResolutionScope; +import org.eclipse.jkube.kit.resource.helm.HelmConfig; +import org.eclipse.jkube.maven.plugin.mojo.OpenShift; + +import java.io.File; + +@Mojo(name = "helm-dependency-update", defaultPhase = LifecyclePhase.INTEGRATION_TEST, requiresDependencyResolution = ResolutionScope.COMPILE) +public class OpenshiftHelmDependencyUpdateMojo extends HelmDependencyUpdateMojo { + /** + * One of: + *

    + *
  • A directory containing OpenShift Templates to use as Helm parameters.
  • + *
  • A file containing a Kubernetes List with OpenShift Template entries to be used as Helm parameters.
  • + *
+ */ + @Parameter(property = "jkube.openshiftTemplate", defaultValue = "${basedir}/target/classes/META-INF/jkube/openshift") + private File openShiftTemplate; + + + @Override + protected File getKubernetesTemplate() { + return openShiftTemplate; + } + + @Override + protected HelmConfig.HelmType getDefaultHelmType() { + return HelmConfig.HelmType.OPENSHIFT; + } + + @Override + protected String getLogPrefix() { + return OpenShift.DEFAULT_LOG_PREFIX; + } +} diff --git a/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/OpenShiftGeneratedPluginDescriptorTest.java b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/OpenShiftGeneratedPluginDescriptorTest.java index 256eb221d7..a04a9c94bc 100644 --- a/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/OpenShiftGeneratedPluginDescriptorTest.java +++ b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/OpenShiftGeneratedPluginDescriptorTest.java @@ -53,6 +53,7 @@ static Stream data() { arguments("log", "compile+runtime", "validate"), arguments("push", "compile", "install"), arguments("helm", "", "pre-integration-test"), + arguments("helm-dependency-update", "compile", "integration-test"), arguments("helm-push", "compile", "install"), arguments("helm-lint", "compile", "integration-test") ); diff --git a/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmDependencyUpdateMojoTest.java b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmDependencyUpdateMojoTest.java new file mode 100644 index 0000000000..7d7fc6bef3 --- /dev/null +++ b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmDependencyUpdateMojoTest.java @@ -0,0 +1,99 @@ +/* + * 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.maven.plugin.mojo.build; + +import com.marcnuri.helm.Helm; +import org.apache.commons.io.FileUtils; +import org.apache.maven.project.MavenProject; +import org.apache.maven.settings.Settings; +import org.eclipse.jkube.kit.resource.helm.HelmConfig; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; + +class OpenshiftHelmDependencyUpdateMojoTest { + + @TempDir + private Path projectDir; + private PrintStream originalPrintStream; + private ByteArrayOutputStream outputStream; + private OpenshiftHelmDependencyUpdateMojo openshiftHelmDependencyUpdateMojo; + + + @BeforeEach + void setUp() throws Exception { + originalPrintStream = System.out; + outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + Helm.create().withDir(projectDir).withName("empty-project").call(); + Path helmChartOutputDir = projectDir.resolve("target").resolve("jkube").resolve("helm"); + Files.createDirectories(helmChartOutputDir.resolve("openshift")); + FileUtils.copyDirectory(projectDir.resolve("empty-project").toFile(), helmChartOutputDir.resolve("openshift").toFile()); + Files.write(helmChartOutputDir.resolve("openshift").resolve("Chart.yaml"), + ("\ndependencies:\n" + + " - name: the-dependency\n" + + " version: 0.1.0\n" + + " repository: file://../../../../the-dependency\n").getBytes(StandardCharsets.UTF_8), + StandardOpenOption.APPEND); + System.setProperty("jkube.openshiftTemplate", projectDir.toFile().getAbsolutePath()); + openshiftHelmDependencyUpdateMojo = new OpenshiftHelmDependencyUpdateMojo(); + openshiftHelmDependencyUpdateMojo.helm = HelmConfig.builder().chartExtension("tgz").outputDir(helmChartOutputDir.toString()).build(); + openshiftHelmDependencyUpdateMojo.interpolateTemplateParameters = true; + openshiftHelmDependencyUpdateMojo.settings = new Settings(); + openshiftHelmDependencyUpdateMojo.project = new MavenProject(); + openshiftHelmDependencyUpdateMojo.project.setVersion("0.1.0"); + openshiftHelmDependencyUpdateMojo.project.getBuild() + .setOutputDirectory(projectDir.resolve("target").resolve("classes").toFile().getAbsolutePath()); + openshiftHelmDependencyUpdateMojo.project.getBuild().setDirectory(projectDir.resolve("target").toFile().getAbsolutePath()); + openshiftHelmDependencyUpdateMojo.project.setFile(projectDir.resolve("target").toFile()); + } + + @AfterEach + void tearDown() { + System.setOut(originalPrintStream); + System.clearProperty("jkube.openshiftTemplate"); + openshiftHelmDependencyUpdateMojo = null; + } + + @Test + void execute_withInvalidHelmDependency_shouldThrowException() { + assertThatIllegalStateException() + .isThrownBy(openshiftHelmDependencyUpdateMojo::execute) + .withMessageContaining("the-dependency not found"); + } + + @Test + void execute_withHelmDependencyPresent_shouldSucceed() throws Exception { + // Given + Helm.create().withName("the-dependency").withDir(projectDir).call(); + // When + openshiftHelmDependencyUpdateMojo.execute(); + // Then + assertThat(outputStream.toString()) + .contains("Running Helm Dependency Upgrade empty-project 0.1.0") + .contains("Saving 1 charts") + .contains("Deleting outdated charts"); + } +} From 487021f1a50fbf3a7269286e61dd119e2349c67c Mon Sep 17 00:00:00 2001 From: bhiwagade-rahul Date: Fri, 31 May 2024 10:09:40 +0530 Subject: [PATCH 155/289] fix: replace AssertJ's deprecated asList() DSL method in DaemonSetHandlerTest (3118) Update DaemonSetHandlerTest.java DaemonSetHandlerTest : Convert member field to a local variable #3108 --- Update class name --- Update DaemonSetHandlerTest.java import of InstanceOfAssertFactories not present in file --- .../jkube/kit/enricher/handler/DaemonSetHandlerTest.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/DaemonSetHandlerTest.java b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/DaemonSetHandlerTest.java index 877682d179..29ddf040d6 100644 --- a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/DaemonSetHandlerTest.java +++ b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/DaemonSetHandlerTest.java @@ -15,10 +15,11 @@ import java.util.ArrayList; import java.util.List; - +import org.assertj.core.api.InstanceOfAssertFactories; import io.fabric8.kubernetes.api.model.PodSpec; import io.fabric8.kubernetes.api.model.PodTemplateSpec; import io.fabric8.kubernetes.api.model.apps.DaemonSetSpec; +import io.fabric8.kubernetes.api.model.Volume; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; @@ -26,6 +27,7 @@ import org.eclipse.jkube.kit.config.resource.GroupArtifactVersion; import org.eclipse.jkube.kit.config.resource.VolumeConfig; + import io.fabric8.kubernetes.api.model.KubernetesListBuilder; import io.fabric8.kubernetes.api.model.apps.DaemonSet; import org.junit.jupiter.api.BeforeEach; @@ -37,14 +39,13 @@ class DaemonSetHandlerTest { - private ProbeHandler probeHandler; private List volumes; private List images; private DaemonSetHandler daemonSetHandler; @BeforeEach void before(){ - probeHandler = mock(ProbeHandler.class); + ProbeHandler probeHandler = new ProbeHandler(); volumes = new ArrayList<>(); images = new ArrayList<>(); List mounts = new ArrayList<>(); @@ -100,7 +101,7 @@ void get_withValidControllerName_shouldReturnConfigWithContainers() { .extracting(DaemonSetSpec::getTemplate).isNotNull() .extracting(PodTemplateSpec::getSpec) .extracting(PodSpec::getVolumes).isNotNull() - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(Volume.class)) .first() .hasFieldOrPropertyWithValue("hostPath.path", "/test/path") ); From b4f5109a4d3bfdae3d8c7dec6f40cef7c8c08631 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Fri, 31 May 2024 10:16:09 +0200 Subject: [PATCH 156/289] chore(deps): Bump version.kubernetes-client from 6.12.1 to 6.13.0 Signed-off-by: Marc Nuri --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f1f2182a55..085da7d669 100644 --- a/pom.xml +++ b/pom.xml @@ -105,7 +105,7 @@ 0.8.12 2.5.1 5.10.2 - 6.12.1 + 6.13.0 4.5 1.18.32 1.18.20.0 From 676996670e02b09e5702effccd7ec90d388b8fc9 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Fri, 31 May 2024 15:19:24 +0530 Subject: [PATCH 157/289] doc(helm): documentation for helm-dependency-update feature (3114) Signed-off-by: Rohan Kumar --- CHANGELOG.md | 1 + .../main/asciidoc/inc/tasks/build/_index.adoc | 2 + .../main/asciidoc/inc/helm/_jkube_helm.adoc | 6 +++ .../helm/_jkube_helm_dependency_update.adoc | 43 +++++++++++++++++++ ...example_helm_dependency_update_config.adoc | 15 +++++++ .../_gradle_helm_dependency_update.adoc | 10 +++++ ...example_helm_dependency_update_config.adoc | 20 +++++++++ .../maven/_mvn_helm_dependency_update.adoc | 11 +++++ .../main/asciidoc/inc/goals/build/_goals.adoc | 1 + 9 files changed, 109 insertions(+) create mode 100644 jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm_dependency_update.adoc create mode 100644 jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_example_helm_dependency_update_config.adoc create mode 100644 jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_gradle_helm_dependency_update.adoc create mode 100644 jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_example_helm_dependency_update_config.adoc create mode 100644 jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_mvn_helm_dependency_update.adoc diff --git a/CHANGELOG.md b/CHANGELOG.md index 075c687ee5..7c302178be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ Usage: * Fix #2904: `docker.buildArg.*` properties not taken into account in OpenShift plugins * Fix #3007: Kubernetes Maven Plugin generating resource manifests with line feeds on Windows * Fix #3067: Helm Push uses configured docker global and push registries instead of pull +* Fix #2110: Add new helm dependency update goal task (`k8s:helm-dependency-update` for maven and `k8sHelmDependencyUpdate` for gradle) ### 1.16.2 (2024-03-27) * Fix #2461: `k8s:watch`/`k8sWatch` should throw error in `buildpacks` build strategy diff --git a/gradle-plugin/doc/src/main/asciidoc/inc/tasks/build/_index.adoc b/gradle-plugin/doc/src/main/asciidoc/inc/tasks/build/_index.adoc index a74050e798..0671ee5ca7 100644 --- a/gradle-plugin/doc/src/main/asciidoc/inc/tasks/build/_index.adoc +++ b/gradle-plugin/doc/src/main/asciidoc/inc/tasks/build/_index.adoc @@ -14,3 +14,5 @@ include::{kitdoc-path}/inc/helm/_jkube_helm.adoc[] include::{kitdoc-path}/inc/helm/_jkube_helm_push.adoc[] include::{kitdoc-path}/inc/helm/_jkube_helm_lint.adoc[] + +include::{kitdoc-path}/inc/helm/_jkube_helm_dependency_update.adoc[] diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm.adoc index dc1186f0cb..0a2e3858f7 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm.adoc @@ -61,6 +61,12 @@ Defaults to `${project.version}`. endif::[] | `jkube.helm.version` +| *debug* +| enable verbose output for helm operations + +Defaults to `false` +| `jkube.helm.debug` + | *description* | The Chart single-sentence description. ifeval::["{plugin-type}" == "maven"] diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm_dependency_update.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm_dependency_update.adoc new file mode 100644 index 0000000000..a5137e74da --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm_dependency_update.adoc @@ -0,0 +1,43 @@ +ifeval::["{plugin-type}" == "maven"] +[[jkube:helm-dependency-update]] +== *{goal-prefix}:helm-dependency-update* +endif::[] +ifeval::["{plugin-type}" == "gradle"] +[[jkubeHelmDependencyUpdate]] +=== *{task-prefix}HelmDependencyUpdate* +endif::[] + +This feature allows you to update dependencies of your Eclipse JKube-generated +https://helm.sh/docs/topics/charts[Helm charts] + +It provides the same output as the https://helm.sh/docs/helm/helm_dependency_update/[`helm dependency update`] command. + +ifeval::["{plugin-type}" == "maven"] +include::maven/_mvn_helm_dependency_update.adoc[] +endif::[] +ifeval::["{plugin-type}" == "gradle"] +include::gradle/_gradle_helm_dependency_update.adoc[] +endif::[] + +.Helm Dependency Update configuration +[cols="1,5,1"] +|=== +| Element | Description | Property + +| *dependencyVerify* +| verify the packages against signatures +| `jkube.helm.dependencyVerify` + +| *dependencySkipRefresh* +| do not refresh the local repository cache +| `jkube.helm.dependencySkipRefresh` + +|=== + +.Example Helm Dependency Update configuration +ifeval::["{plugin-type}" == "maven"] +include::maven/_example_helm_dependency_update_config.adoc[] +endif::[] +ifeval::["{plugin-type}" == "gradle"] +include::gradle/_example_helm_dependency_update_config.adoc[] +endif::[] \ No newline at end of file diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_example_helm_dependency_update_config.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_example_helm_dependency_update_config.adoc new file mode 100644 index 0000000000..07582b25f6 --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_example_helm_dependency_update_config.adoc @@ -0,0 +1,15 @@ +[source,groovy,indent=0,subs="verbatim,quotes,attributes"] +---- +kubernetes { + helm { + dependencyVerify = false + debug = true + dependencySkipRefresh = false + dependencies = [{ + name = "foo" + version = "0.0.1" + repository = "https://charts.example.com/test" + }] + } +} +---- \ No newline at end of file diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_gradle_helm_dependency_update.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_gradle_helm_dependency_update.adoc new file mode 100644 index 0000000000..39214c9405 --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_gradle_helm_dependency_update.adoc @@ -0,0 +1,10 @@ +To update on-disk dependencies of a Helm chart you need to invoke the `{task-prefix}HelmDependencyUpdate` Gradle task on the command line: + +[source, sh, subs="+attributes"] +---- +gradle {task-prefix}Resource {task-prefix}Helm {task-prefix}HelmDependencyUpdate +---- + +[NOTE] +The `{task-prefix}Resource` and the `{task-prefix}Helm` tasks are required to create the resource descriptors which are included in the Helm chart and the Helm chart itself. +If you have already built the resource and created the chart, then you can omit these tasks. diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_example_helm_dependency_update_config.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_example_helm_dependency_update_config.adoc new file mode 100644 index 0000000000..841b07db44 --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_example_helm_dependency_update_config.adoc @@ -0,0 +1,20 @@ +[source,xml,indent=0,subs="verbatim,quotes,attributes"] +---- + + + + + + foo + 0.0.1 + https://charts.example.com/test-chart + + + + true + true + true + + + +---- \ No newline at end of file diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_mvn_helm_dependency_update.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_mvn_helm_dependency_update.adoc new file mode 100644 index 0000000000..f3ad0fe5c7 --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_mvn_helm_dependency_update.adoc @@ -0,0 +1,11 @@ +To update on-disk dependencies of a Helm chart you need to invoke the `{goal-prefix}:helm-dependency-update` Maven goal on the command line: + +[source, sh, subs="+attributes"] +---- +mvn {goal-prefix}:resource {goal-prefix}:helm {goal-prefix}:helm-dependency-update +---- + +[NOTE] +The `{goal-prefix}:resource` and the `{goal-prefix}:helm` goals are required to create the resource descriptors which are included in the Helm chart and the Helm chart itself. +If you have already built the resource and created the chart, then you can omit these goals. + diff --git a/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_goals.adoc b/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_goals.adoc index a379c8f004..350532fa0d 100644 --- a/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_goals.adoc +++ b/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_goals.adoc @@ -9,3 +9,4 @@ include::_jkube-apply.adoc[] include::{kitdoc-path}/inc/helm/_jkube_helm.adoc[] include::{kitdoc-path}/inc/helm/_jkube_helm_push.adoc[] include::{kitdoc-path}/inc/helm/_jkube_helm_lint.adoc[] +include::{kitdoc-path}/inc/helm/_jkube_helm_dependency_update.adoc[] From 14d3e236ec29b060d42ef8be2ac4e62980267eb6 Mon Sep 17 00:00:00 2001 From: bhiwagade-rahul Date: Mon, 3 Jun 2024 10:26:36 +0530 Subject: [PATCH 158/289] fix: replace AssertJ's deprecated asList() DSL method in JavaExecGeneratorTest.java (3117) Update JavaExecGeneratorTest.java JavaExecGeneratorTest : Replace AssertJ's deprecated asList() DSL method with asInstanceOf(InstanceOfAssertFactories.list(type.class)) #3106 --- Update JavaExecGeneratorTest.java Update type to Assembly.class --- Update JavaExecGeneratorTest.java Fix as per comment by @rohanKanojia --- .../jkube/generator/javaexec/JavaExecGeneratorTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/jkube-kit/generator/java-exec/src/test/java/org/eclipse/jkube/generator/javaexec/JavaExecGeneratorTest.java b/jkube-kit/generator/java-exec/src/test/java/org/eclipse/jkube/generator/javaexec/JavaExecGeneratorTest.java index 4da922ee35..36a5e76256 100644 --- a/jkube-kit/generator/java-exec/src/test/java/org/eclipse/jkube/generator/javaexec/JavaExecGeneratorTest.java +++ b/jkube-kit/generator/java-exec/src/test/java/org/eclipse/jkube/generator/javaexec/JavaExecGeneratorTest.java @@ -31,6 +31,7 @@ import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.Plugin; +import org.eclipse.jkube.kit.common.AssemblyFileSet; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.junit.jupiter.api.BeforeEach; @@ -111,9 +112,9 @@ void createAssemblyWithNoFatJarShouldAddDefaultFileSets() { // Then assertThat(result) .hasFieldOrPropertyWithValue("excludeFinalOutputArtifact", false) - .extracting(AssemblyConfiguration::getLayers).asList().hasSize(1) + .extracting(AssemblyConfiguration::getLayers).asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)).hasSize(1) .first().asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) - .extracting(Assembly::getFileSets).asList() + .extracting(Assembly::getFileSets).asInstanceOf(InstanceOfAssertFactories.list(AssemblyFileSet.class)) .hasSize(2); } From 63cec06d7b48795c2036659d00be71e0c62fb3d2 Mon Sep 17 00:00:00 2001 From: Joseph Victor Date: Mon, 3 Jun 2024 10:47:10 +0530 Subject: [PATCH 159/289] fix: replace deprecated method getNextTarEntry with recommended method getNextEntry in ArchiveAssertions (3109) Signed-off by: Joseph Victor --- .../org/eclipse/jkube/kit/common/assertj/ArchiveAssertions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/assertj/ArchiveAssertions.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/assertj/ArchiveAssertions.java index f5884b23f5..2e1f000e4b 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/assertj/ArchiveAssertions.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/assertj/ArchiveAssertions.java @@ -167,7 +167,7 @@ private static void processArchive(File file, TarEntryConsumer entryConsumer) th TarArchiveInputStream tis = inputStream(bis) ) { TarArchiveEntry entry; - while ((entry = tis.getNextTarEntry()) != null) { + while ((entry = tis.getNextEntry()) != null) { entryConsumer.accept(entry, tis); } } From a19995cd76bde278230d3735357087be8957cb7f Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Mon, 3 Jun 2024 12:50:34 +0530 Subject: [PATCH 160/289] fix(buildpacks): project directory passed on to `buildpacks` build strategy config + Add new field `appDirPath` to BuildPackBuildOptions to store application directory path + Pass abovementioned application directory path while running `pack build` by using `--path` flag during buildpacks build Signed-off-by: Rohan Kumar --- CHANGELOG.md | 1 + .../service/buildpacks/BuildPackBuildOptions.java | 1 + .../controller/BuildPackCliController.java | 1 + .../buildpacks/BuildPackCliControllerTest.java | 9 +++++++-- .../service/kubernetes/BuildPackBuildService.java | 1 + .../kubernetes/BuildPackBuildServiceTest.java | 15 ++++++++++----- 6 files changed, 21 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c302178be..16d47c262e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,7 @@ Usage: * Fix #3007: Kubernetes Maven Plugin generating resource manifests with line feeds on Windows * Fix #3067: Helm Push uses configured docker global and push registries instead of pull * Fix #2110: Add new helm dependency update goal task (`k8s:helm-dependency-update` for maven and `k8sHelmDependencyUpdate` for gradle) +* Fix #3122: JKube should also pass project directory in `buildpacks` build strategy ### 1.16.2 (2024-03-27) * Fix #2461: `k8s:watch`/`k8sWatch` should throw error in `buildpacks` build strategy diff --git a/jkube-kit/build/service/buildpacks/src/main/java/org/eclipse/jkube/kit/service/buildpacks/BuildPackBuildOptions.java b/jkube-kit/build/service/buildpacks/src/main/java/org/eclipse/jkube/kit/service/buildpacks/BuildPackBuildOptions.java index cef1c5bfba..b2a930f4ad 100644 --- a/jkube-kit/build/service/buildpacks/src/main/java/org/eclipse/jkube/kit/service/buildpacks/BuildPackBuildOptions.java +++ b/jkube-kit/build/service/buildpacks/src/main/java/org/eclipse/jkube/kit/service/buildpacks/BuildPackBuildOptions.java @@ -38,4 +38,5 @@ public class BuildPackBuildOptions { private List tags; private Map env; private List volumes; + private String path; } \ No newline at end of file diff --git a/jkube-kit/build/service/buildpacks/src/main/java/org/eclipse/jkube/kit/service/buildpacks/controller/BuildPackCliController.java b/jkube-kit/build/service/buildpacks/src/main/java/org/eclipse/jkube/kit/service/buildpacks/controller/BuildPackCliController.java index f0c8efe8b8..810921eb1c 100644 --- a/jkube-kit/build/service/buildpacks/src/main/java/org/eclipse/jkube/kit/service/buildpacks/controller/BuildPackCliController.java +++ b/jkube-kit/build/service/buildpacks/src/main/java/org/eclipse/jkube/kit/service/buildpacks/controller/BuildPackCliController.java @@ -89,6 +89,7 @@ private List createBuildCommandArguments(BuildPackBuildOptions buildOpti if (buildOptions.isClearCache()) { buildArgs.add("--clear-cache"); } + buildArgs.addAll(Arrays.asList("--path", buildOptions.getPath())); return buildArgs; } diff --git a/jkube-kit/build/service/buildpacks/src/test/java/org/eclipse/jkube/kit/service/buildpacks/BuildPackCliControllerTest.java b/jkube-kit/build/service/buildpacks/src/test/java/org/eclipse/jkube/kit/service/buildpacks/BuildPackCliControllerTest.java index e6110fc093..005b17b5a6 100644 --- a/jkube-kit/build/service/buildpacks/src/test/java/org/eclipse/jkube/kit/service/buildpacks/BuildPackCliControllerTest.java +++ b/jkube-kit/build/service/buildpacks/src/test/java/org/eclipse/jkube/kit/service/buildpacks/BuildPackCliControllerTest.java @@ -20,6 +20,7 @@ import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import java.io.File; import java.util.Arrays; @@ -37,6 +38,9 @@ class BuildPackCliControllerTest { private BuildPackBuildOptions buildOptions; private File pack; + @TempDir + private File temporaryFolder; + @BeforeEach void setUp() { kitLogger = spy(new KitLogger.SilentLogger()); @@ -47,6 +51,7 @@ void setUp() { .imageName("foo/bar:latest") .builderImage("foo/builder:base") .creationTime("now") + .path(temporaryFolder.getAbsolutePath()) .build(); } @@ -60,7 +65,7 @@ void build_whenInvoked_thenBuildPackBuildOptionsPassedAsCommandLineArguments() { buildPackCliController.build(buildOptions); // Then - verify(kitLogger).info("[[s]]%s", "build foo/bar:latest --builder foo/builder:base --creation-time now"); + verify(kitLogger).info("[[s]]%s", "build foo/bar:latest --builder foo/builder:base --creation-time now --path " + temporaryFolder.getAbsolutePath()); } @Test @@ -77,7 +82,7 @@ void build_whenInvokedWithMoreBuildOptions_thenOptionsPassedAsCommandLineArgumen // When buildPackCliController.build(buildOptions); // Then - verify(kitLogger).info("[[s]]%s", "build foo/bar:latest --builder foo/builder:base --creation-time now --pull-policy if-not-present --volume /tmp/volume:/platform/volume:ro --tag foo/bar:t1 --tag foo/bar:t2 --tag foo/bar:t3 --env BP_SPRING_CLOUD_BINDINGS_DISABLED=true --clear-cache"); + verify(kitLogger).info("[[s]]%s", "build foo/bar:latest --builder foo/builder:base --creation-time now --pull-policy if-not-present --volume /tmp/volume:/platform/volume:ro --tag foo/bar:t1 --tag foo/bar:t2 --tag foo/bar:t3 --env BP_SPRING_CLOUD_BINDINGS_DISABLED=true --clear-cache --path " + temporaryFolder.getAbsolutePath()); } @Test diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildService.java index f3b73a663e..58b895ef8a 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildService.java @@ -80,6 +80,7 @@ protected void buildSingleImage(ImageConfiguration imageConfiguration) { BuildPackBuildOptions.BuildPackBuildOptionsBuilder buildPackBuildOptionsBuilder = BuildPackBuildOptions.builder() .imageName(imageConfiguration.getName()) .builderImage(builderImage) + .path(jKubeConfiguration.getBasedir().getAbsolutePath()) .creationTime("now"); if (imageConfiguration.getBuild() != null) { if (StringUtils.isNotBlank(imageConfiguration.getBuild().getImagePullPolicy())) { diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildServiceTest.java index 344235e308..a372c8513f 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/BuildPackBuildServiceTest.java @@ -17,6 +17,7 @@ import org.eclipse.jkube.kit.build.service.docker.access.DockerAccess; import org.eclipse.jkube.kit.build.service.docker.access.DockerAccessException; import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.RegistryConfig; import org.eclipse.jkube.kit.common.TestHttpBuildPacksArtifactsServer; @@ -79,7 +80,11 @@ void setUp() { .platformMode(RuntimeMode.KUBERNETES) .dockerServiceHub(mock(DockerServiceHub.class)) .buildServiceConfig(buildServiceConfig) - .configuration(JKubeConfiguration.builder().build()) + .configuration(JKubeConfiguration.builder() + .project(JavaProject.builder() + .baseDirectory(temporaryFolder) + .build()) + .build()) .build(); imageConfiguration = ImageConfiguration.builder() .name("foo/bar:latest") @@ -170,7 +175,7 @@ void whenLocalPackConfigHasDefaultBuilderSet_thenUseThatBuilder() throws IOExcep buildPackBuildService.buildSingleImage(imageConfiguration); // Then - verify(kitLogger).info("[[s]]%s","build foo/bar:latest --builder cnbs/sample-builder:bionic --creation-time now"); + verify(kitLogger).info("[[s]]%s","build foo/bar:latest --builder cnbs/sample-builder:bionic --creation-time now --path " + temporaryFolder.getAbsolutePath()); } @Test @@ -183,7 +188,7 @@ void whenLocalPackConfigInvalid_thenUseOpinionatedBuilderImage() throws IOExcept buildPackBuildService.buildSingleImage(imageConfiguration); // Then - verify(kitLogger).info("[[s]]%s","build foo/bar:latest --builder paketobuildpacks/builder:base --creation-time now"); + verify(kitLogger).info("[[s]]%s","build foo/bar:latest --builder paketobuildpacks/builder:base --creation-time now --path " + temporaryFolder.getAbsolutePath()); } } @@ -197,7 +202,7 @@ void whenLocalPackCLIAndNoDefaultBuilderInPackConfig_thenUseOpinionatedBuilderIm buildPackBuildService.buildSingleImage(imageConfiguration); // Then - verify(kitLogger).info("[[s]]%s", "build foo/bar:latest --builder paketobuildpacks/builder:base --creation-time now"); + verify(kitLogger).info("[[s]]%s", "build foo/bar:latest --builder paketobuildpacks/builder:base --creation-time now --path " + temporaryFolder.getAbsolutePath()); } @Test @@ -219,7 +224,7 @@ void whenImageConfigurationContainsPackBuildArguments_thenArgumentsPassedToBuild buildPackBuildService.buildSingleImage(imageConfiguration); // Then - verify(kitLogger).info("[[s]]%s", "build foo/bar:latest --builder paketobuildpacks/builder:tiny --creation-time now --pull-policy if-not-present --volume /tmp/volume:/platform/volume:ro --tag foo/bar:t1 --tag foo/bar:t2 --tag foo/bar:t3 --env BP_SPRING_CLOUD_BINDINGS_DISABLED=true --clear-cache"); + verify(kitLogger).info("[[s]]%s", "build foo/bar:latest --builder paketobuildpacks/builder:tiny --creation-time now --pull-policy if-not-present --volume /tmp/volume:/platform/volume:ro --tag foo/bar:t1 --tag foo/bar:t2 --tag foo/bar:t3 --env BP_SPRING_CLOUD_BINDINGS_DISABLED=true --clear-cache --path " + temporaryFolder.getAbsolutePath()); } } } From 3c429359a63a6ea65a7fd848960258fa1177b0eb Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Mon, 3 Jun 2024 17:05:18 +0200 Subject: [PATCH 161/289] test: gradle integration tests run on Gradle 8.8 Prevents problems with latest Jackson (2.17.1) Signed-off-by: Marc Nuri --- gradle-plugin/it/src/it/helidon-properties/build.gradle | 2 +- gradle-plugin/it/src/it/helidon/build.gradle | 2 +- .../jkube/gradle/plugin/tests/ITGradleRunnerExtension.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/gradle-plugin/it/src/it/helidon-properties/build.gradle b/gradle-plugin/it/src/it/helidon-properties/build.gradle index cac3aa7780..5cdbf4c954 100644 --- a/gradle-plugin/it/src/it/helidon-properties/build.gradle +++ b/gradle-plugin/it/src/it/helidon-properties/build.gradle @@ -28,7 +28,7 @@ tasks.withType(JavaCompile) { } ext { - helidonversion = '2.6.0' + helidonversion = '2.6.7' mainClass='io.helidon.microprofile.cdi.Main' } diff --git a/gradle-plugin/it/src/it/helidon/build.gradle b/gradle-plugin/it/src/it/helidon/build.gradle index cac3aa7780..5cdbf4c954 100644 --- a/gradle-plugin/it/src/it/helidon/build.gradle +++ b/gradle-plugin/it/src/it/helidon/build.gradle @@ -28,7 +28,7 @@ tasks.withType(JavaCompile) { } ext { - helidonversion = '2.6.0' + helidonversion = '2.6.7' mainClass='io.helidon.microprofile.cdi.Main' } diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ITGradleRunnerExtension.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ITGradleRunnerExtension.java index 37a7d4bb1b..19aa199be3 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ITGradleRunnerExtension.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ITGradleRunnerExtension.java @@ -32,7 +32,7 @@ public class ITGradleRunnerExtension implements BeforeEachCallback, AfterEachCal @Override public void beforeEach(ExtensionContext context) throws Exception { gradleRunner = GradleRunner.create() - .withGradleDistribution(new URI("https://services.gradle.org/distributions/gradle-8.2.1-bin.zip")) + .withGradleDistribution(new URI("https://services.gradle.org/distributions/gradle-8.8-bin.zip")) .withDebug(true) .withPluginClasspath(Arrays.stream(System.getProperty("java.class.path").split(File.pathSeparator)) .map(File::new).collect(Collectors.toList())); From 8a7c363b9a0c5caf3a37f7976475c3694a728d9a Mon Sep 17 00:00:00 2001 From: Thulasithan Gnanenthiram <115763801+Thulasithang@users.noreply.github.com> Date: Tue, 4 Jun 2024 10:17:39 +0530 Subject: [PATCH 162/289] fix: removed unused import from WatchMojo (3100) Removed an unused import from WatchMojo.java file. Signed-off-by: Thulasithang --- .../org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java | 1 - 1 file changed, 1 deletion(-) diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java index 1b918d66d9..b0b7734d6f 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java @@ -14,7 +14,6 @@ package org.eclipse.jkube.maven.plugin.mojo.develop; import java.io.File; -import java.io.IOException; import java.net.URL; import java.util.List; From 8ca05f2b3f274792afd2e7a0b4aa5a6ebbd3b430 Mon Sep 17 00:00:00 2001 From: Sintivrousai <116221123+Sintivrousai@users.noreply.github.com> Date: Tue, 4 Jun 2024 07:58:45 +0300 Subject: [PATCH 163/289] test: SerializationTest passes on Windows (3113) Signed-off-by: Sintivrousai --- .../org/eclipse/jkube/kit/common/util/SerializationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SerializationTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SerializationTest.java index 52cf38955f..e1b58439d5 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SerializationTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SerializationTest.java @@ -224,12 +224,12 @@ void saveYaml_withConfigMap_savesFile(@TempDir Path targetDir) throws IOExceptio class MultiLineStringsSerializedToScalarYamlBlocks { @Test @DisplayName("string ends with newline, then add | to use block style in serialized object") - void whenStringEndingWithNewline_thenAddBlockIndicatorInSerializedObject(@TempDir Path targetDir) throws IOException { + void unmarshal_whenStringEndingWithNewline_thenAddBlockIndicatorInSerializedObject(@TempDir Path targetDir) throws IOException { // Given final File targetFile = targetDir.resolve("cm.yaml").toFile(); final ConfigMap source = new ConfigMapBuilder() .withNewMetadata() - .addToAnnotations("proxy.istio.io/config", String.format("proxyMetadata:%n ISTIO_META_DNS_CAPTURE: \"false\"%nholdApplicationUntilProxyStarts: true\n")) + .addToAnnotations("proxy.istio.io/config", "proxyMetadata:\n ISTIO_META_DNS_CAPTURE: \"false\"\nholdApplicationUntilProxyStarts: true\n") .endMetadata() .build(); // When From 6f644f8745ad7cfd289f4706c9c2bceab152df29 Mon Sep 17 00:00:00 2001 From: Sintivrousai <116221123+Sintivrousai@users.noreply.github.com> Date: Tue, 4 Jun 2024 11:09:38 +0300 Subject: [PATCH 164/289] test: HelmServiceTest passes on Windows (3116) Signed-off-by: SintiVrousai --- .../kit/resource/helm/HelmServiceTest.java | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTest.java b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTest.java index 5d4bf4a850..6cb73e7a92 100644 --- a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTest.java +++ b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceTest.java @@ -217,18 +217,19 @@ void generateHelmCharts_withValidValuesYamlFragment_usesMergedValues() throws Ex void generateHelmCharts_whenInvoked_thenGeneratedValuesYamlInAlphabeticalOrder() throws IOException { // Given Path unsortedValuesYaml = helmSourceDirectory.resolve("values.helm.yaml"); - Files.write(unsortedValuesYaml, ("root:\n" + - " ingress:\n" + - " className: \"IngressClass\"\n" + - " annotations:\n" + - " tls-acme: \"true\"\n" + - " ingress.class: nginx\n" + - " enabled: false\n" + - " country-codes:\n" + - " countries:\n" + - " spain: \"+34\"\n" + - " france: \"+33\"\n" + - " india: \"+91\"").getBytes()); + Files.write(unsortedValuesYaml, String.format( + "root:%n" + + " ingress:%n" + + " className: \"IngressClass\"%n" + + " annotations:%n" + + " tls-acme: \"true\"%n" + + " ingress.class: nginx%n" + + " enabled: false%n" + + " country-codes:%n" + + " countries:%n" + + " spain: \"+34\"%n" + + " france: \"+33\"%n" + + " india: \"+91\"").getBytes()); resourceServiceConfig = ResourceServiceConfig.builder().resourceDirs(Collections.singletonList(helmSourceDirectory.toFile())).build(); helmConfig.types(Collections.singletonList(HelmType.KUBERNETES)); @@ -239,19 +240,19 @@ void generateHelmCharts_whenInvoked_thenGeneratedValuesYamlInAlphabeticalOrder() // Then File generatedValuesYaml = helmOutputDirectory.resolve("kubernetes").resolve("values.yaml").toFile(); assertThat(new String(Files.readAllBytes(generatedValuesYaml.toPath()))) - .isEqualTo("---\n" + - "root:\n" + - " country-codes:\n" + - " countries:\n" + - " france: \"+33\"\n" + - " india: \"+91\"\n" + - " spain: \"+34\"\n" + - " ingress:\n" + - " annotations:\n" + - " ingress.class: nginx\n" + - " tls-acme: \"true\"\n" + - " className: IngressClass\n" + - " enabled: false\n"); + .isEqualTo(String.format("---%n" + + "root:%n" + + " country-codes:%n" + + " countries:%n" + + " france: \"+33\"%n" + + " india: \"+91\"%n" + + " spain: \"+34\"%n" + + " ingress:%n" + + " annotations:%n" + + " ingress.class: nginx%n" + + " tls-acme: \"true\"%n" + + " className: IngressClass%n" + + " enabled: false%n")); } @Test From 740279fed7fda5c43dbb130194beb9b263bb7d61 Mon Sep 17 00:00:00 2001 From: skayikci Date: Wed, 5 Jun 2024 07:04:27 +0200 Subject: [PATCH 165/289] fix: removed Exception never thrown by TriggersAnnotationEnricherTest.testEnrichmentNotPerformedInNonOpenShiftMode (3105) Signed-off-by: skayikci --- .../jkube/enricher/generic/TriggersAnnotationEnricherTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/TriggersAnnotationEnricherTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/TriggersAnnotationEnricherTest.java index f72cc18e90..4efd2f61c9 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/TriggersAnnotationEnricherTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/TriggersAnnotationEnricherTest.java @@ -56,7 +56,7 @@ void setUp() { } @Test - void testEnrichmentNotPerformedInNonOpenShiftMode() throws IOException { + void testEnrichmentNotPerformedInNonOpenShiftMode() { KubernetesListBuilder builder = new KubernetesListBuilder() .addToItems(new StatefulSetBuilder() .withNewMetadata() From 05f8369cae56fb102c7431b2587dcc5c1e3588b5 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Thu, 6 Jun 2024 13:58:58 +0530 Subject: [PATCH 166/289] test(gradle): update `git-url` regex in expected git annotation integration test manifests We had made changes for sanitizing git remote URL before adding git annotations in https://github.com/eclipse-jkube/jkube/pull/2831 Update regex in `kubernetes.yml` / `openshift.yml` expected files for git-annotations integration test. Signed-off-by: Rohan Kumar --- .../it/src/it/git-annotations/expected/kubernetes.yml | 4 ++-- .../it/src/it/git-annotations/expected/openshift.yml | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/gradle-plugin/it/src/it/git-annotations/expected/kubernetes.yml b/gradle-plugin/it/src/it/git-annotations/expected/kubernetes.yml index 11b6a72cb2..f04d1f41c9 100644 --- a/gradle-plugin/it/src/it/git-annotations/expected/kubernetes.yml +++ b/gradle-plugin/it/src/it/git-annotations/expected/kubernetes.yml @@ -6,7 +6,7 @@ items: kind: Deployment metadata: annotations: - jkube.eclipse.org/git-url: "@matches('(?:git|ssh|https?|git@[-\\w.]+):(\\/\\/)?(.*?)(\\.git)(\\/?|\\#[-\\d\\w._]+?)$')@" + jkube.eclipse.org/git-url: "@matches('(https://|git@)?github.com(:|/)+(.*?)(\\.git)')@" jkube.eclipse.org/git-commit: "@matches('\\b[0-9a-f]{5,40}\\b')@" jkube.eclipse.org/git-branch: "@assertThat(not(isEmptyString())@" labels: @@ -26,7 +26,7 @@ items: template: metadata: annotations: - jkube.eclipse.org/git-url: "@matches('(?:git|ssh|https?|git@[-\\w.]+):(\\/\\/)?(.*?)(\\.git)(\\/?|\\#[-\\d\\w._]+?)$')@" + jkube.eclipse.org/git-url: "@matches('(https://|git@)?github.com(:|/)+(.*?)(\\.git)')@" jkube.eclipse.org/git-commit: "@matches('\\b[0-9a-f]{5,40}\\b')@" jkube.eclipse.org/git-branch: "@assertThat(not(isEmptyString())@" labels: diff --git a/gradle-plugin/it/src/it/git-annotations/expected/openshift.yml b/gradle-plugin/it/src/it/git-annotations/expected/openshift.yml index 245ac51048..2fe2f5049e 100644 --- a/gradle-plugin/it/src/it/git-annotations/expected/openshift.yml +++ b/gradle-plugin/it/src/it/git-annotations/expected/openshift.yml @@ -7,8 +7,8 @@ items: metadata: annotations: app.openshift.io/vcs-ref: "@assertThat(not(isEmptyString())@" - jkube.eclipse.org/git-url: "@matches('(?:git|ssh|https?|git@[-\\w.]+):(\\/\\/)?(.*?)(\\.git)(\\/?|\\#[-\\d\\w._]+?)$')@" - app.openshift.io/vcs-uri: "@matches('(?:git|ssh|https?|git@[-\\w.]+):(\\/\\/)?(.*?)(\\.git)(\\/?|\\#[-\\d\\w._]+?)$')@" + jkube.eclipse.org/git-url: "@matches('(https://|git@)?github.com(:|/)+(.*?)(\\.git)')@" + app.openshift.io/vcs-uri: "@matches('(https://|git@)?github.com(:|/)+(.*?)(\\.git)')@" jkube.eclipse.org/git-commit: "@matches('\\b[0-9a-f]{5,40}\\b')@" jkube.eclipse.org/git-branch: "@assertThat(not(isEmptyString())@" labels: @@ -32,8 +32,8 @@ items: metadata: annotations: app.openshift.io/vcs-ref: "@assertThat(not(isEmptyString())@" - jkube.eclipse.org/git-url: "@matches('(?:git|ssh|https?|git@[-\\w.]+):(\\/\\/)?(.*?)(\\.git)(\\/?|\\#[-\\d\\w._]+?)$')@" - app.openshift.io/vcs-uri: "@matches('(?:git|ssh|https?|git@[-\\w.]+):(\\/\\/)?(.*?)(\\.git)(\\/?|\\#[-\\d\\w._]+?)$')@" + jkube.eclipse.org/git-url: "@matches('(https://|git@)?github.com(:|/)+(.*?)(\\.git)')@" + app.openshift.io/vcs-uri: "@matches('(https://|git@)?github.com(:|/)+(.*?)(\\.git)')@" jkube.eclipse.org/git-commit: "@matches('\\b[0-9a-f]{5,40}\\b')@" jkube.eclipse.org/git-branch: "@assertThat(not(isEmptyString())@" labels: From 671816bf773883f4f39f121ce0bf2afcfb618148 Mon Sep 17 00:00:00 2001 From: Sintivrousai <116221123+Sintivrousai@users.noreply.github.com> Date: Thu, 6 Jun 2024 12:03:22 +0300 Subject: [PATCH 167/289] tesst: HelmServiceDependencyUpdateIT works on windows (3121) Signed-off-by: SintiVrousai --- .../jkube/kit/resource/helm/HelmService.java | 6 +++--- .../helm/HelmServiceDependencyUpdateIT.java | 13 +++++++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java index 1a8a385a86..e56810adb8 100644 --- a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java +++ b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java @@ -183,9 +183,9 @@ public void dependencyUpdate(HelmConfig helmConfig) { if (helmConfig.isDependencySkipRefresh()) { dependencyUpdateCommand.skipRefresh(); } - Arrays.stream(dependencyUpdateCommand.call() - .split(System.lineSeparator())) - .forEach(l -> logger.info("[[W]]%s", l)); + Arrays.stream(dependencyUpdateCommand.call() + .split("\r?\n")) + .forEach(l -> logger.info("[[W]]%s", l)); } } diff --git a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceDependencyUpdateIT.java b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceDependencyUpdateIT.java index 797a3ed9bb..0fa258a6e2 100644 --- a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceDependencyUpdateIT.java +++ b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceDependencyUpdateIT.java @@ -22,6 +22,8 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import org.junit.jupiter.api.condition.EnabledOnOs; +import org.junit.jupiter.api.condition.OS; import java.io.File; import java.io.IOException; @@ -118,10 +120,21 @@ private void verifyHelmDependencyDownloaded() { @Test @DisplayName("invalid chart provided, then throw exception") + @EnabledOnOs(OS.LINUX) void whenInvalidChartDirProvided_thenThrowException() { // When + Then assertThatIllegalStateException() .isThrownBy(() -> helmService.dependencyUpdate(helmConfig)) .withMessageContaining("no such file or directory"); } + + @Test + @DisplayName("invalid chart provided, then throw exception for Windows") + @EnabledOnOs(OS.WINDOWS) + void whenInvalidChartDirProvided_thenThrowException_Windows() { + // When + Then + assertThatIllegalStateException() + .isThrownBy(() -> helmService.dependencyUpdate(helmConfig)) + .withMessageContaining("The system cannot find the path specified"); + } } From 9842b0c854c90239c0456519ac7891b307c2c28e Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Thu, 6 Jun 2024 14:36:14 +0530 Subject: [PATCH 168/289] refactor(jkube-kit): SpringBootWatcher uses ExternalCommand for starting spring devtools process (3131) refactor (jkube-kit) : SpringBootWatcher uses ExternalCommand for starting spring devtools process Signed-off-by: Rohan Kumar --- refactor (jkube-kit-spring-boot) : Refactor SpringBootWatcher to use ExternalCommand + Create a new class RemoteSpringBootDevtoolsCommand that will extend ExternalCommand class for starting remote spring boot process for watch + SpringBootWatcher uses abovementioned class for running remote spring application instead of directly using `Runtime.exec` Signed-off-by: Rohan Kumar --- .../jkube/kit/common/util/EnvUtil.java | 9 ++ .../jkube/kit/common/util/EnvUtilTest.java | 37 +++++ .../RemoteSpringBootDevtoolsCommand.java | 70 +++++++++ .../springboot/watcher/SpringBootWatcher.java | 91 +----------- .../RemoteSpringBootDevtoolsCommandTest.java | 136 ++++++++++++++++++ .../SpringBootWatcherIntegrationTest.java | 72 ++++++---- .../src/test/resources/dummy-java | 2 + .../src/test/resources/failing-java | 2 + 8 files changed, 306 insertions(+), 113 deletions(-) create mode 100644 jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/RemoteSpringBootDevtoolsCommand.java create mode 100644 jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/RemoteSpringBootDevtoolsCommandTest.java create mode 100755 jkube-kit/jkube-kit-spring-boot/src/test/resources/dummy-java create mode 100644 jkube-kit/jkube-kit-spring-boot/src/test/resources/failing-java diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/EnvUtil.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/EnvUtil.java index 235beaa4f4..34a30d9442 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/EnvUtil.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/EnvUtil.java @@ -535,4 +535,13 @@ public static File findBinaryFileInUserPath(String binaryName) { } return null; } + + public static String javaBinary() { + String path = new File(EnvUtil.getProperty("java.home")).toPath().resolve("bin").resolve("java").toFile() + .getAbsolutePath(); + if (isWindows()) { + path = path.concat(".exe"); + } + return path; + } } \ No newline at end of file diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/EnvUtilTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/EnvUtilTest.java index d94b314c49..968473492e 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/EnvUtilTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/EnvUtilTest.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Date; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Properties; @@ -490,4 +491,40 @@ void findBinaryFileInUserPath_whenFileNotFound_thenReturnNull(@TempDir File temp EnvUtil.overrideEnvGetter(System::getenv); } } + + @Test + @EnabledOnOs(OS.LINUX) + void javaBinary_whenLinuxBinaryPresent_shouldReturnPathToJavaBinary() { + try { + // Given + Map properties = new HashMap<>(); + properties.put("java.home", "/usr/java/jdk-foo"); + properties.put("os.name", "Linux"); + EnvUtil.overridePropertyGetter(properties::get); + + // When + Then + assertThat(EnvUtil.javaBinary()) + .isEqualTo("/usr/java/jdk-foo/bin/java"); + } finally { + EnvUtil.overridePropertyGetter(System::getProperty); + } + } + + @Test + @EnabledOnOs(OS.WINDOWS) + void javaBinary_whenWindowsBinaryPresent_shouldReturnPathToJavaBinary() { + try { + // Given + Map properties = new HashMap<>(); + properties.put("os.name", "Windows"); + properties.put("java.home", "C:\\Program Files\\Java\\jdk-foo"); + EnvUtil.overridePropertyGetter(properties::get); + + // When + Then + assertThat(EnvUtil.javaBinary()) + .isEqualTo("C:\\Program Files\\Java\\jdk-foo\\bin\\java.exe"); + } finally { + EnvUtil.overridePropertyGetter(System::getProperty); + } + } } diff --git a/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/RemoteSpringBootDevtoolsCommand.java b/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/RemoteSpringBootDevtoolsCommand.java new file mode 100644 index 0000000000..9e08929950 --- /dev/null +++ b/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/RemoteSpringBootDevtoolsCommand.java @@ -0,0 +1,70 @@ +/* + * 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.springboot; + +import org.eclipse.jkube.kit.common.ExternalCommand; +import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.PrefixedLogger; + +import static org.eclipse.jkube.kit.common.util.EnvUtil.javaBinary; + +public class RemoteSpringBootDevtoolsCommand extends ExternalCommand { + private final String classPath; + private final String remoteSecret; + private final String url; + private final KitLogger processLogger; + + public RemoteSpringBootDevtoolsCommand(String classPath, String remoteSecret, String url, KitLogger kitLogger) { + super(kitLogger); + this.classPath = classPath; + this.remoteSecret = remoteSecret; + this.url = url; + this.processLogger = new PrefixedLogger("Spring-Remote", kitLogger); + } + + @Override + protected void start() { + log.debug("Running: " + String.join(" ", getCommandAsString())); + } + + @Override + protected String[] getArgs() { + return new String[] { + javaBinary(), + "-cp", + classPath, + "-Dspring.devtools.remote.secret=" + remoteSecret, + "org.springframework.boot.devtools.RemoteSpringApplication", + url + }; + } + + @Override + protected void processLine(String line) { + processLogger.info("%s", line); + } + + @Override + protected void processError(String line) { + processLogger.error("%s", line); + } + + @Override + protected void end() { + if (getStatusCode() != 0) { + log.warn("Process returned status: %s", getStatusCode()); + } + log.info("Terminating the Spring remote client..."); + } +} diff --git a/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcher.java b/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcher.java index 4a50568cee..e049a02a1e 100644 --- a/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcher.java +++ b/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcher.java @@ -13,11 +13,8 @@ */ package org.eclipse.jkube.springboot.watcher; -import java.io.BufferedReader; import java.io.File; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; import java.net.URI; import java.net.URLClassLoader; import java.util.ArrayList; @@ -25,13 +22,11 @@ import java.util.List; import java.util.Map; import java.util.Properties; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; import java.util.stream.Stream; import io.fabric8.kubernetes.client.NamespacedKubernetesClient; -import org.eclipse.jkube.kit.common.KitLogger; -import org.eclipse.jkube.kit.common.PrefixedLogger; +import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.util.ClassUtil; import org.eclipse.jkube.kit.common.util.IoUtil; import org.eclipse.jkube.kit.common.util.JKubeProjectUtil; @@ -42,6 +37,7 @@ import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.config.service.PodLogService; import org.eclipse.jkube.kit.config.service.PortForwardService; +import org.eclipse.jkube.springboot.RemoteSpringBootDevtoolsCommand; import org.eclipse.jkube.watcher.api.BaseWatcher; import org.eclipse.jkube.watcher.api.WatcherContext; @@ -49,7 +45,6 @@ import io.fabric8.kubernetes.api.model.LabelSelector; import org.apache.commons.lang3.StringUtils; -import static org.eclipse.jkube.kit.common.util.EnvUtil.isWindows; import static org.eclipse.jkube.kit.common.util.SpringBootUtil.DEV_TOOLS_REMOTE_SECRET; import static org.eclipse.jkube.kit.common.util.SpringBootUtil.getSpringBootPluginConfiguration; import static org.eclipse.jkube.springboot.SpringBootDevtoolsUtils.getSpringBootDevToolsJar; @@ -57,15 +52,10 @@ public class SpringBootWatcher extends BaseWatcher { private final PortForwardService portForwardService; - private final Runtime runtime; public SpringBootWatcher(WatcherContext watcherContext) { - this(Runtime.getRuntime(), watcherContext); - } - SpringBootWatcher(Runtime runtime, WatcherContext watcherContext) { super(watcherContext, "spring-boot"); portForwardService = new PortForwardService(watcherContext.getLogger()); - this.runtime = runtime; } @Override @@ -132,7 +122,7 @@ private void runRemoteSpringApplication(String url) { if (pluginClassLoader instanceof URLClassLoader) { classLoaders.add((URLClassLoader) pluginClassLoader); } - try(URLClassLoader projectClassLoader = ClassUtil.createProjectClassLoader( + try (URLClassLoader projectClassLoader = ClassUtil.createProjectClassLoader( getContext().getBuildContext().getProject().getCompileClassPathElements(), log) ) { classLoaders.add(projectClassLoader); @@ -150,75 +140,18 @@ private void runRemoteSpringApplication(String url) { }).collect(Collectors.joining(File.pathSeparator, "", File.pathSeparator)) // Add dev tools to the classpath (the main class is not read from BOOT-INF/lib) .concat(devToolsPath); - final String[] command = new String[]{ - javaBinary(), - "-cp", - classPath, - "-Dspring.devtools.remote.secret=" + remoteSecret, - "org.springframework.boot.devtools.RemoteSpringApplication", - url - }; - + RemoteSpringBootDevtoolsCommand command = new RemoteSpringBootDevtoolsCommand(classPath, remoteSecret, url, log); try { - log.debug("Running: " + String.join(" ", command)); - final Process process = runtime.exec(command); - - final AtomicBoolean outputEnabled = new AtomicBoolean(true); - runtime.addShutdownHook(new Thread("jkube:watch [spring-boot] shutdown hook") { - @Override - public void run() { - log.info("Terminating the Spring remote client..."); - outputEnabled.set(false); - process.destroy(); - } - }); - KitLogger logger = new PrefixedLogger("Spring-Remote", log); - Thread stdOutPrinter = startOutputProcessor(logger, process.getInputStream(), false, outputEnabled); - Thread stdErrPrinter = startOutputProcessor(logger, process.getErrorStream(), true, outputEnabled); - int status = process.waitFor(); - stdOutPrinter.join(); - stdErrPrinter.join(); - if (status != 0) { - log.warn("Process returned status: %s", status); - } - } catch(InterruptedException ex) { - Thread.currentThread().interrupt(); - }catch (Exception e) { - throw new RuntimeException("Failed to run RemoteSpringApplication: " + e, e); + command.execute(); + } catch (Exception e) { + throw new JKubeException("Failed to run RemoteSpringApplication: " + e, e); } } catch (IOException e) { log.warn("Instructed to use project classpath, but cannot. Continuing build if we can: ", e); } } - protected Thread startOutputProcessor(final KitLogger logger, final InputStream inputStream, final boolean error, final AtomicBoolean outputEnabled) { - Thread printer = new Thread() { - @Override - public void run() { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { - String line; - while ((line = reader.readLine()) != null) { - if (outputEnabled.get()) { - if (error) { - logger.error("%s", line); - } else { - logger.info("%s", line); - } - } - } - } catch (Exception e) { - if (outputEnabled.get()) { - logger.error("Failed to process " + (error ? "stderr" : "stdout") + " from spring-remote process: " + e); - } - } - } - }; - - printer.start(); - return printer; - } - private String validateSpringBootDevtoolsSettings() { final Map configuration = getSpringBootPluginConfiguration(getContext().getBuildContext().getProject()); if(configuration != null && (!configuration.containsKey("excludeDevtools") || !configuration.get("excludeDevtools").equals("false"))) { @@ -235,15 +168,5 @@ private String validateSpringBootDevtoolsSettings() { } return properties.getProperty(DEV_TOOLS_REMOTE_SECRET); } - - private static String javaBinary() { - String path = new File(System.getProperty("java.home")).toPath().resolve("bin").resolve("java").toFile() - .getAbsolutePath(); - if (isWindows()) { - path = path.concat(".exe"); - } - return path; - } - } diff --git a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/RemoteSpringBootDevtoolsCommandTest.java b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/RemoteSpringBootDevtoolsCommandTest.java new file mode 100644 index 0000000000..4894f5ca28 --- /dev/null +++ b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/RemoteSpringBootDevtoolsCommandTest.java @@ -0,0 +1,136 @@ +/* + * 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.springboot; + +import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.util.EnvUtil; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledOnOs; +import org.junit.jupiter.api.condition.OS; +import org.junit.jupiter.api.io.TempDir; +import org.mockito.ArgumentCaptor; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + +import static org.assertj.core.api.Assertions.assertThatIOException; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; + +class RemoteSpringBootDevtoolsCommandTest { + private RemoteSpringBootDevtoolsCommand remoteSpringBootDevtoolsCommand; + private KitLogger kitLogger; + @TempDir + private Path temporaryFolder; + + @BeforeEach + void setUp() { + kitLogger = spy(new KitLogger.SilentLogger()); + remoteSpringBootDevtoolsCommand = new RemoteSpringBootDevtoolsCommand(temporaryFolder.resolve("tmp.jar").toString(), "remote-secret", "https://test-url", kitLogger); + } + + @Nested + @DisplayName("execute") + class Execute { + + @Test + @EnabledOnOs(OS.LINUX) + @DisplayName("when command successful, then verify exec called with correct arguments") + void execute_whenCommandSucceeds_thenVerifyProcessCalledWithExpectedArguments() throws IOException { + try { + // Given + Path testJavaHome = prepareJavaHomeWithJavaBinary("/dummy-java"); + Map propMap = createMapOfOverriddenSystemProperties(testJavaHome); + EnvUtil.overridePropertyGetter(propMap::get); + // When + remoteSpringBootDevtoolsCommand.execute(); + + // Then + ArgumentCaptor javaProcessArgumentCaptor = ArgumentCaptor.forClass(String.class); + verify(kitLogger).debug(javaProcessArgumentCaptor.capture()); + assertThat(javaProcessArgumentCaptor.getValue()) + .contains(String.format("Running: " + + "%s/bin/java -cp " + + "%s/tmp.jar " + + "-Dspring.devtools.remote.secret=remote-secret " + + "org.springframework.boot.devtools.RemoteSpringApplication " + + "https://test-url", testJavaHome, temporaryFolder)); + } finally { + EnvUtil.overridePropertyGetter(System::getProperty); + } + } + + @Test + @DisplayName("when command fails, then throw exception") + void execute_whenCommandFails_thenExceptionThrown() throws IOException { + try { + // Given + Path testJavaHome = prepareJavaHomeWithJavaBinary("/failing-java"); + Map propMap = createMapOfOverriddenSystemProperties(testJavaHome); + EnvUtil.overridePropertyGetter(propMap::get); + // When + Then + assertThatIOException() + .isThrownBy(() -> remoteSpringBootDevtoolsCommand.execute()) + .withMessageContaining("Failed to start"); + } finally { + EnvUtil.overridePropertyGetter(System::getProperty); + } + } + + private Path prepareJavaHomeWithJavaBinary(String resource) throws IOException { + File dummyJavaArtifact = new File(Objects.requireNonNull(RemoteSpringBootDevtoolsCommandTest.class.getResource(resource)).getFile()); + Path testJavaHome = temporaryFolder.resolve("java-home"); + Files.createDirectory(testJavaHome); + Files.createDirectory(testJavaHome.resolve("bin")); + Files.copy(dummyJavaArtifact.toPath(), testJavaHome.resolve("bin").resolve("java"), StandardCopyOption.COPY_ATTRIBUTES); + return testJavaHome; + } + + private Map createMapOfOverriddenSystemProperties(Path overriddenJavaHome) { + Map propMap = new HashMap<>(); + propMap.put("java.home", overriddenJavaHome.toString()); + propMap.put("os.name", "linux"); + return propMap; + } + } + + + @Test + @DisplayName("should log process output via prefixed logger at info level") + void processLine_shouldLogOutputWithPrefix() { + // Given + When + remoteSpringBootDevtoolsCommand.processLine("Test Output"); + // Then + verify(kitLogger).info("Spring-Remote: %s", "Test Output"); + } + + @Test + @DisplayName("should log process error via prefixed logger at error level") + void processError_shouldLogOutputWithPrefix() { + // Given + When + remoteSpringBootDevtoolsCommand.processError("Test Error"); + // Then + verify(kitLogger).error("Spring-Remote: %s", "Test Error"); + } +} diff --git a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java index 3bb8b28a46..0bac2d0dd6 100644 --- a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java +++ b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java @@ -13,6 +13,7 @@ */ package org.eclipse.jkube.springboot.watcher; +import io.fabric8.kubernetes.api.model.LabelSelectorBuilder; import io.fabric8.kubernetes.api.model.apps.Deployment; import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder; import io.fabric8.kubernetes.client.KubernetesClient; @@ -23,6 +24,7 @@ import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.Plugin; +import org.eclipse.jkube.kit.common.util.EnvUtil; import org.eclipse.jkube.kit.config.access.ClusterAccess; import org.eclipse.jkube.kit.config.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.resource.PlatformMode; @@ -32,18 +34,22 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -import org.mockito.ArgumentMatchers; +import org.mockito.ArgumentCaptor; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.StandardCopyOption; import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; -import static org.mockito.Mockito.RETURNS_DEEP_STUBS; -import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; @EnableKubernetesMockClient(crud = true) @@ -55,6 +61,7 @@ class SpringBootWatcherIntegrationTest { private WatcherContext watcherContext; private Path target; private Deployment deployment; + private KitLogger logger; @BeforeEach void setUp() throws IOException { @@ -65,7 +72,7 @@ void setUp() throws IOException { .endSpec() .build(); // Watcher Configuration - final KitLogger logger = new KitLogger.SilentLogger(); + logger = spy(new KitLogger.SilentLogger()); final JKubeServiceHub jKubeServiceHub = JKubeServiceHub.builder() .log(logger) .platformMode(RuntimeMode.KUBERNETES) @@ -119,30 +126,37 @@ void withNoRemoteSecretThrowsException() { @Test void withAllRequirementsShouldStartWatcherProcess() throws Exception { - final Runtime runtime = mock(Runtime.class, RETURNS_DEEP_STUBS); - target.resolve("spring-boot-lib.jar").toFile().createNewFile(); - target.resolve("spring-boot-devtools.jar").toFile().createNewFile(); - FileUtils.write(target.resolve("application.properties").toFile(), "spring.devtools.remote.secret=this-is-a-test", StandardCharsets.UTF_8); - new SpringBootWatcher(runtime, watcherContext) - .watch(Collections.emptyList(), null, Collections.singletonList(deployment), PlatformMode.kubernetes); - verify(runtime).exec(ArgumentMatchers.argThat(command -> command.length == 6 - && command[0].matches(".+java(\\.exe)?") - && new File(command[0]).exists() - && command[1].equals("-cp") - && command[2].contains( - realPath("spring-boot-lib.jar") + File.pathSeparator + realPath("spring-boot-devtools.jar")) - && command[3].equals("-Dspring.devtools.remote.secret=this-is-a-test") - && command[4].equals("org.springframework.boot.devtools.RemoteSpringApplication") - && command[5].matches("^http://localhost:\\d+$") - )); + try { + // Given + Map propMap = new HashMap<>(); + File dummyJavaArtifact = new File(Objects.requireNonNull(SpringBootWatcherIntegrationTest.class.getResource("/dummy-java")).getFile()); + Path testJavaHome = project.resolve("java-home"); + Files.createDirectory(testJavaHome); + Files.createDirectory(testJavaHome.resolve("bin")); + Files.copy(dummyJavaArtifact.toPath(), testJavaHome.resolve("bin").resolve("java"), StandardCopyOption.COPY_ATTRIBUTES); + propMap.put("java.home", testJavaHome.toString()); + propMap.put("os.name", "linux"); + EnvUtil.overridePropertyGetter(propMap::get); + Files.createFile(target.resolve("spring-boot-lib.jar")); + Files.createFile(target.resolve("spring-boot-devtools.jar")); + FileUtils.write(target.resolve("application.properties").toFile(), "spring.devtools.remote.secret=this-is-a-test", StandardCharsets.UTF_8); + // When + new SpringBootWatcher(watcherContext) + .watch(Collections.emptyList(), null, Collections.singletonList(deployment), PlatformMode.kubernetes); + // Then + ArgumentCaptor javaProcessArgumentCaptor = ArgumentCaptor.forClass(String.class); + verify(logger).info("spring-boot: Watching pods with selector %s waiting for a running pod...", new LabelSelectorBuilder().addToMatchLabels("app", "spring-boot-test").build()); + verify(logger).info("spring-boot: Terminating the Spring remote client..."); + verify(logger).debug(javaProcessArgumentCaptor.capture()); + assertThat(javaProcessArgumentCaptor.getValue()) + .contains("spring-boot: Running: ") + .contains(String.format("%s/bin/java -cp ", testJavaHome)) + .contains(String.format("%s/target/spring-boot-lib.jar:%s/target/spring-boot-devtools.jar ", project, project)) + .contains("-Dspring.devtools.remote.secret=this-is-a-test ") + .contains("org.springframework.boot.devtools.RemoteSpringApplication ") + .contains("http://localhost:"); + } finally { + EnvUtil.overridePropertyGetter(System::getProperty); + } } - - private String realPath(String jar) { - try { - return project.resolve("target").resolve(jar).toRealPath().toString(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - } diff --git a/jkube-kit/jkube-kit-spring-boot/src/test/resources/dummy-java b/jkube-kit/jkube-kit-spring-boot/src/test/resources/dummy-java new file mode 100755 index 0000000000..b972db2aeb --- /dev/null +++ b/jkube-kit/jkube-kit-spring-boot/src/test/resources/dummy-java @@ -0,0 +1,2 @@ +#!/bin/bash +echo "$@" \ No newline at end of file diff --git a/jkube-kit/jkube-kit-spring-boot/src/test/resources/failing-java b/jkube-kit/jkube-kit-spring-boot/src/test/resources/failing-java new file mode 100644 index 0000000000..80f336a035 --- /dev/null +++ b/jkube-kit/jkube-kit-spring-boot/src/test/resources/failing-java @@ -0,0 +1,2 @@ +#!/bin/bash +exit 1 \ No newline at end of file From b0d8dd695d102d65bcba322027c09106a1d0e761 Mon Sep 17 00:00:00 2001 From: Arman Yekkehkhani <72594459+arman-yekkehkhani@users.noreply.github.com> Date: Fri, 7 Jun 2024 08:25:59 +0330 Subject: [PATCH 169/289] fix: replace AssertJ's deprecated asList() DSL method in AssemblyConfigurationTest #3134 Signed-off-by: arman-yekkehkhani --- .../kit/common/AssemblyConfigurationTest.java | 32 +++++++++++++------ 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/AssemblyConfigurationTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/AssemblyConfigurationTest.java index b49041a697..0ae40b131a 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/AssemblyConfigurationTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/AssemblyConfigurationTest.java @@ -126,7 +126,9 @@ void getProcessedLayers_withFlat_shouldReturnOriginalLayers() { // Then assertThat(result).hasSize(1).first() .hasFieldOrPropertyWithValue("id", null) - .extracting(Assembly::getFiles).asList().hasSize(1).first() + .extracting(Assembly::getFiles) + .asInstanceOf(InstanceOfAssertFactories.list(AssemblyFile.class)) + .singleElement() .hasFieldOrPropertyWithValue("destName", "test"); } @@ -143,7 +145,9 @@ void getProcessedLayers_withSingleNoIdLayer_shouldAddIdToLayer() { // Then assertThat(result).hasSize(1).first() .hasFieldOrPropertyWithValue("id", "jkube-generated-layer-original") - .extracting(Assembly::getFiles).asList().hasSize(1).first() + .extracting(Assembly::getFiles) + .asInstanceOf(InstanceOfAssertFactories.list(AssemblyFile.class)) + .singleElement() .hasFieldOrPropertyWithValue("destName", "test"); } @@ -184,12 +188,16 @@ void getProcessedLayers_withSingleNoIdLayerAndArtifact_shouldReturnOriginalAndAr assertThat(result).hasSize(2) .anySatisfy(layer -> assertThat(layer) .hasFieldOrPropertyWithValue("id", "jkube-generated-layer-original") - .extracting(Assembly::getFiles).asList().hasSize(1).first() + .extracting(Assembly::getFiles) + .asInstanceOf(InstanceOfAssertFactories.list(AssemblyFile.class)) + .singleElement() .hasFieldOrPropertyWithValue("destName", "test") ) .element(1) .hasFieldOrPropertyWithValue("id", "jkube-generated-layer-final-artifact") - .extracting(Assembly::getFiles).asList().hasSize(1).first() + .extracting(Assembly::getFiles) + .asInstanceOf(InstanceOfAssertFactories.list(AssemblyFile.class)) + .singleElement() .hasFieldOrPropertyWithValue("destName", "final-artifact.jar"); } @@ -215,7 +223,9 @@ void getFlattenedClone_withNoInlineAndNoLayers_shouldReturnEmpty() { // Then assertThat(result.getFlattenedClone(configuration)) .hasFieldOrPropertyWithValue("flattened", true) - .extracting(AssemblyConfiguration::getLayers).asList().hasSize(1).first() + .extracting(AssemblyConfiguration::getLayers) + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)) + .singleElement() .hasFieldOrPropertyWithValue("id", null) .hasFieldOrPropertyWithValue("fileSets", Collections.emptyList()) .hasFieldOrPropertyWithValue("files", Collections.emptyList()); @@ -241,14 +251,16 @@ void getFlattenedClone_withInlineAndLayers_shouldReturnInlinesAndInlineLast() { // Then assertThat(result.getFlattenedClone(configuration)) .hasFieldOrPropertyWithValue("flattened", true) - .extracting(AssemblyConfiguration::getLayers).asList().hasSize(1) - .first().asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) + .extracting(AssemblyConfiguration::getLayers) + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)) + .singleElement() .hasFieldOrPropertyWithValue("id", null) .hasFieldOrPropertyWithValue("fileSets", Arrays.asList( AssemblyFileSet.builder().directory(new File("target")).build(), AssemblyFileSet.builder().directory(new File("static")).build() )) - .extracting(Assembly::getFiles).asList() + .extracting(Assembly::getFiles) + .asInstanceOf(InstanceOfAssertFactories.list(AssemblyFile.class)) .extracting("destName") .containsExactly("file.1", "file.2", "file.3", "file.old"); } @@ -283,7 +295,9 @@ void rawDeserialization() throws IOException { .hasFieldOrPropertyWithValue("user", "root") .hasFieldOrPropertyWithValue("tarLongFileMode", "posix") .hasFieldOrPropertyWithValue("flattened", false) - .extracting(AssemblyConfiguration::getLayers).asList().extracting("id") + .extracting(AssemblyConfiguration::getLayers) + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)) + .extracting("id") .containsExactly("multi-layer-support", "not-the-last-layer", "deprecated-single"); } } From 0ea0d6a6d2931b4602bad5bc46093c222d00222b Mon Sep 17 00:00:00 2001 From: skayikci Date: Fri, 7 Jun 2024 06:58:09 +0200 Subject: [PATCH 170/289] fix: replaced statement lambda with expression lambda on JibServiceTest (3135) Signed-off-by: skayikci --- .../jkube/kit/service/jib/JibServiceTest.java | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java index e2df323176..36ec7d4ef6 100644 --- a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java +++ b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java @@ -122,11 +122,9 @@ void build() throws Exception { assertThat(containerImageTarFiles) .singleElement() .returns("jib-image.linux-amd64.tar", File::getName) - .satisfies(jibContainerImageTar -> { - ArchiveAssertions.assertThat(jibContainerImageTar) - .fileTree() - .contains("manifest.json", "config.json"); - }); + .satisfies(jibContainerImageTar -> ArchiveAssertions.assertThat(jibContainerImageTar) + .fileTree() + .contains("manifest.json", "config.json")); } } @@ -143,14 +141,11 @@ void buildMultiplePlatforms() throws Exception { final List containerImageTarFiles = jibService.build(); assertThat(containerImageTarFiles) .hasSize(3) - .allSatisfy(jibContainerImageTar -> { - ArchiveAssertions.assertThat(jibContainerImageTar) - .fileTree() - .contains("manifest.json", "config.json"); - }) + .allSatisfy(jibContainerImageTar -> ArchiveAssertions.assertThat(jibContainerImageTar) + .fileTree() + .contains("manifest.json", "config.json")) .extracting(File::getName) .contains("jib-image.linux-amd64.tar", "jib-image.linux-arm64.tar", "jib-image.linux-arm.tar"); - ; } } From db2312636c3f0dda56dfa08a6a6475ec889cb33b Mon Sep 17 00:00:00 2001 From: Jinhong <139559460+Flowers2Algernon@users.noreply.github.com> Date: Fri, 7 Jun 2024 13:01:47 +0800 Subject: [PATCH 171/289] fix: added final modifier for field DockerFileBuilder.CopyEntry.source (3103) --- .../eclipse/jkube/kit/config/image/build/DockerFileBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/DockerFileBuilder.java b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/DockerFileBuilder.java index 824ada10aa..e54051aefd 100644 --- a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/DockerFileBuilder.java +++ b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/DockerFileBuilder.java @@ -474,7 +474,7 @@ private void validateMap(Map env) { // All entries required, destination is relative to exportDir private static final class CopyEntry { - private String source; + private final String source; private String destination; private CopyEntry(String src, String dest) { From c2e13f55d61e8f2dad2d4c1dd487b918f79da374 Mon Sep 17 00:00:00 2001 From: Tanmay Mathpal Date: Fri, 7 Jun 2024 10:36:56 +0530 Subject: [PATCH 172/289] feat(spring-boot): added support for explicit path for readiness and liveness probes SpringBootHealthCheckEnricher adds different probes for liveness and readiness if application.properties contains: ``` management.health.probes.enabled=true ``` Signed-off-by: l3002 --- .../common/util/SpringBootConfiguration.java | 2 + .../SpringBootHealthCheckEnricher.java | 22 ++- ...ingBootHealthCheckEnricherTestSupport.java | 131 +++++++++++++----- 3 files changed, 117 insertions(+), 38 deletions(-) diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/SpringBootConfiguration.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/SpringBootConfiguration.java index ae8103d508..7349afe7d7 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/SpringBootConfiguration.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/SpringBootConfiguration.java @@ -35,6 +35,7 @@ public class SpringBootConfiguration { private String managementContextPath; private String actuatorBasePath; private String actuatorDefaultBasePath; + private boolean managementHealthProbesEnabled; public static SpringBootConfiguration from(JavaProject project) { final Properties properties = SpringBootUtil.getSpringBootApplicationProperties( @@ -56,6 +57,7 @@ public static SpringBootConfiguration from(JavaProject project) { .managementPort(Optional.ofNullable(properties.getProperty("management.port")).map(Integer::parseInt).orElse(null)) .serverPort(Integer.parseInt(properties.getProperty("server.port", DEFAULT_SERVER_PORT))) .serverKeystore(properties.getProperty("server.ssl.key-store")) + .managementHealthProbesEnabled(Boolean.parseBoolean(properties.getProperty("management.health.probes.enabled"))) .managementKeystore(properties.getProperty("management.ssl.key-store")) .servletPath(properties.getProperty("server.servlet-path")) .serverContextPath(properties.getProperty("server.context-path")) diff --git a/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/enricher/SpringBootHealthCheckEnricher.java b/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/enricher/SpringBootHealthCheckEnricher.java index b592cee955..d9bc10375b 100644 --- a/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/enricher/SpringBootHealthCheckEnricher.java +++ b/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/enricher/SpringBootHealthCheckEnricher.java @@ -39,6 +39,9 @@ public class SpringBootHealthCheckEnricher extends AbstractHealthCheckEnricher { private static final String SCHEME_HTTPS = "HTTPS"; private static final String SCHEME_HTTP = "HTTP"; + private static final String LIVENESS_PROBE_SUFFIX = "/liveness"; + private static final String READINESS_PROBE_SUFFIX = "/readiness"; + @AllArgsConstructor private enum Config implements Configs.Config { READINESS_PROBE_INITIAL_DELAY_SECONDS("readinessProbeInitialDelaySeconds", "10"), @@ -67,7 +70,7 @@ protected Probe getReadinessProbe() { Integer timeout = Configs.asInteger(getConfig(Config.TIMEOUT_SECONDS)); Integer failureThreshold = Configs.asInteger(getConfig(Config.FAILURE_THRESHOLD)); Integer successThreshold = Configs.asInteger(getConfig(Config.SUCCESS_THRESHOLD)); - return discoverSpringBootHealthCheck(initialDelay, period, timeout, failureThreshold, successThreshold); + return discoverSpringBootHealthCheck(initialDelay, period, timeout, failureThreshold, successThreshold, READINESS_PROBE_SUFFIX); } @Override @@ -77,13 +80,13 @@ protected Probe getLivenessProbe() { Integer timeout = Configs.asInteger(getConfig(Config.TIMEOUT_SECONDS)); Integer failureThreshold = Configs.asInteger(getConfig(Config.FAILURE_THRESHOLD)); Integer successThreshold = Configs.asInteger(getConfig(Config.SUCCESS_THRESHOLD)); - return discoverSpringBootHealthCheck(initialDelay, period, timeout, failureThreshold, successThreshold); + return discoverSpringBootHealthCheck(initialDelay, period, timeout, failureThreshold, successThreshold, LIVENESS_PROBE_SUFFIX); } - protected Probe discoverSpringBootHealthCheck(Integer initialDelay, Integer period, Integer timeout, Integer failureTh, Integer successTh) { + protected Probe discoverSpringBootHealthCheck(Integer initialDelay, Integer period, Integer timeout, Integer failureTh, Integer successTh, String suffix) { try { if (getContext().getProjectClassLoaders().isClassInCompileClasspath(true, REQUIRED_CLASSES)) { - return buildProbe(initialDelay, period, timeout, failureTh, successTh); + return buildProbe(initialDelay, period, timeout, failureTh, successTh, suffix); } } catch (Exception ex) { log.error("Error while reading the spring-boot configuration", ex); @@ -91,7 +94,7 @@ protected Probe discoverSpringBootHealthCheck(Integer initialDelay, Integer peri return null; } - protected Probe buildProbe(Integer initialDelay, Integer period, Integer timeout, Integer failureTh, Integer successTh) { + protected Probe buildProbe(Integer initialDelay, Integer period, Integer timeout, Integer failureTh, Integer successTh, String suffix) { final SpringBootConfiguration springBootConfiguration = SpringBootConfiguration.from(getContext().getProject()); Integer managementPort = springBootConfiguration.getManagementPort(); boolean usingManagementPort = managementPort != null; @@ -122,9 +125,16 @@ protected Probe buildProbe(Integer initialDelay, Integer period, Integer timeout actuatorBasePath = springBootConfiguration.getActuatorBasePath(); } + // adds suffix to probe paths when ManagementHealthProbesEnabled is true + String probePath = prefix + actuatorBasePath + Configs.asString(getConfig(Config.PATH)); + if(springBootConfiguration.isManagementHealthProbesEnabled()){ + probePath += suffix; + } + probePath = normalizeMultipleSlashes(probePath); + // lets default to adding a spring boot actuator health check ProbeBuilder probeBuilder = new ProbeBuilder(). - withNewHttpGet().withNewPort(port).withPath(normalizeMultipleSlashes(prefix + actuatorBasePath + Configs.asString(getConfig(Config.PATH)))).withScheme(scheme).endHttpGet(); + withNewHttpGet().withNewPort(port).withPath(probePath).withScheme(scheme).endHttpGet(); if (initialDelay != null) { probeBuilder = probeBuilder.withInitialDelaySeconds(initialDelay); diff --git a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/enricher/AbstractSpringBootHealthCheckEnricherTestSupport.java b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/enricher/AbstractSpringBootHealthCheckEnricherTestSupport.java index c14d1940d7..8752bf97a6 100644 --- a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/enricher/AbstractSpringBootHealthCheckEnricherTestSupport.java +++ b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/enricher/AbstractSpringBootHealthCheckEnricherTestSupport.java @@ -86,7 +86,7 @@ private boolean isSpringBootOne() { void zeroConfig() { SpringBootHealthCheckEnricher enricher = new SpringBootHealthCheckEnricher(context); - Probe probe = enricher.buildProbe(10, null, null, 3, 1); + Probe probe = enricher.buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, getActuatorDefaultBasePath() + "/health", 8080); } @@ -96,7 +96,7 @@ void withServerPort() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, getActuatorDefaultBasePath() + "/health", 8282); } @@ -108,7 +108,7 @@ void withServerPortAndManagementPort() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, getActuatorDefaultBasePath() + "/health", 8383); } @@ -122,7 +122,7 @@ void withServerPortAndManagementPortAndServerContextPath() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, getActuatorDefaultBasePath() + "/health", 8383); } @@ -138,7 +138,7 @@ void withServerPortAndManagementPortAndServerContextPathAndActuatorBasePath() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/actuator-base-path/health", 8383); } @@ -153,7 +153,7 @@ void withServerPortAndManagementPortAndServerContextPathAndActuatorDefaultBasePa writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1, null); assertHTTPGetPathAndPort(probe, "/health", 8383); } @@ -170,7 +170,7 @@ void withServerPortAndManagementPortAndManagementContextPath() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/p2" + getActuatorDefaultBasePath() + "/health", 8383); } @@ -189,7 +189,7 @@ void withServerPortAndManagementPortAndManagementContextPathAndActuatorDefaultBa writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/p2/actuator-base-path/health", 8383); } @@ -207,7 +207,7 @@ void withServerPortAndManagementPortAndManagementContextPathAndActuatorDefaultBa writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/health", 8383); } @@ -227,7 +227,7 @@ void withServerPortAndManagementPortAndManagementContextPathAndServletPath() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/p2" + getActuatorDefaultBasePath() + "/health", 8383); } @@ -249,7 +249,7 @@ void withServerPortAndManagementPortAndManagementContextPathAndServletPathAndAct writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/p2/actuator-base-path/health", 8383); } @@ -270,7 +270,7 @@ void withServerPortAndManagementPortAndManagementContextPathAndServletPathAndAct writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/health", 8383); } @@ -283,7 +283,7 @@ void withServerPortAndManagementContextPath() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/p1" + getActuatorDefaultBasePath() +"/health", 8282); } @@ -298,7 +298,7 @@ void withServerPortAndManagementContextPathAndActuatorBasePath() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/p1/actuator-base-path/health", 8282); } @@ -312,7 +312,7 @@ void withServerPortAndManagementContextPathAndActuatorDefaultBasePathSlash() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/health", 8282); } @@ -327,7 +327,7 @@ void withServerPortAndServerContextPathAndManagementContextPath() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/p2/p1" + getActuatorDefaultBasePath() + "/health", 8282); } @@ -344,7 +344,7 @@ void withServerPortAndServerContextPathAndManagementContextPathAndActuatorBasePa writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/p2/p1/actuator-base-path/health", 8282); } @@ -360,7 +360,7 @@ void withServerPortAndServerContextPathAndManagementContextPathAndActuatorDefaul writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/health", 8282); } @@ -373,7 +373,7 @@ void withServerPortAndServletPath() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/servlet" + getActuatorDefaultBasePath() + "/health", 8282); } @@ -388,7 +388,7 @@ void withServerPortAndServletAndActuatorBasePathPath() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/servlet/actuator-base-path/health", 8282); } @@ -402,7 +402,7 @@ void withServerPortAndServletPathAndActuatorDefaultBasePathSlash() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/health", 8282); } @@ -418,7 +418,7 @@ void withServerPortAndManagementContextPathAndServletPath() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/servlet/p1" + getActuatorDefaultBasePath() + "/health", 8282); } @@ -436,7 +436,7 @@ void withServerPortAndManagementContextPathAndServletPathAndActuatorBasePath() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/servlet/p1/actuator-base-path/health", 8282); } @@ -453,7 +453,7 @@ void withServerPortAndManagementContextPathAndServletPathAndActuatorDefaultBaseP writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/health", 8282); } @@ -471,7 +471,7 @@ void withServerPortAndServerContextPathAndManagementContextPathAndServletPath() writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/p2/servlet/p1" + getActuatorDefaultBasePath() + "/health", 8282); } @@ -491,7 +491,7 @@ void withServerPortAndServerContextPathAndManagementContextPathAndServletPathAnd writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/p2/servlet/p1/actuator-base-path/health", 8282); } @@ -510,7 +510,7 @@ void withServerPortAndServerContextPathAndManagementContextPathAndServletPathAnd writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetPathAndPort(probe, "/health", 8282); } @@ -520,7 +520,7 @@ void schemeWithServerPort() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetSchemeAndPort(probe, "HTTP", 8443); } @@ -532,7 +532,7 @@ void schemeWithServerPortAndManagementKeystore() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetSchemeAndPort(probe, "HTTP", 8080); } @@ -543,7 +543,7 @@ void schemeWithServerPortAndServerKeystore() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetSchemeAndPort(probe, "HTTPS", 8443); } @@ -556,7 +556,7 @@ void schemeWithServerPortAndManagementPortAndServerKeystore() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetSchemeAndPort(probe, "HTTP", 8081); } @@ -570,7 +570,7 @@ void schemeWithServerPortAndManagementPortAndManagementKeystore() { writeProps(); Probe probe = new SpringBootHealthCheckEnricher(context) - .buildProbe(10, null, null, 3, 1); + .buildProbe(10, null, null, 3, 1,null); assertHTTPGetSchemeAndPort(probe, "HTTPS", 8443); } @@ -634,6 +634,73 @@ void testCustomPropertiesForLivenessAndReadiness() { assertHealthCheckDelays(livenessProbe, 460, 50, null); } + @Test + void testBuildProbeExplicitPathCreation_whenManagementHealthProbesEnabledIsTrue(){ + props.put("management.health.probes.enabled","true"); + writeProps(); + + Probe readinessProbe = new SpringBootHealthCheckEnricher(context).buildProbe(10, null, null, 3, 1,"/example"); + assertHTTPGetPathAndPort(readinessProbe,getActuatorDefaultBasePath() + "/health/example", 8080); + } + + @Test + void testBuildProbeDefaultPathCreation_whenManagementHealthProbesEnabledIsFalse(){ + props.put("management.health.probes.enabled","false"); + writeProps(); + + Probe readinessProbe = new SpringBootHealthCheckEnricher(context).buildProbe(10, null, null, 3, 1,"/example"); + assertHTTPGetPathAndPort(readinessProbe,getActuatorDefaultBasePath() + "/health", 8080); + } + + @Test + void testLivenessAndReadinessProbesForExplicitPath_whenManagementHealthProbesEnabledIsTrue(){ + props.put("management.health.probes.enabled","true"); + writeProps(); + + when(context.getProjectClassLoaders().isClassInCompileClasspath(true, REQUIRED_CLASSES)) + .thenReturn(true); + when(context.getProjectClassLoaders().getCompileClassLoader()) + .thenReturn(new URLClassLoader(new URL[0], AbstractSpringBootHealthCheckEnricherTestSupport.class.getClassLoader())); + + SpringBootHealthCheckEnricher enricher = new SpringBootHealthCheckEnricher(context); + + Probe livenessProbe = enricher.getLivenessProbe(); + assertHTTPGetPathAndPort(livenessProbe,getActuatorDefaultBasePath() + "/health/liveness",8080); + + Probe readinessProbe = enricher.getReadinessProbe(); + assertHTTPGetPathAndPort(readinessProbe,getActuatorDefaultBasePath() + "/health/readiness",8080); + + } + + @Test + void testLivenessAndReadinessProbesForDefaultPath_whenDefaultConfigUsed(){ + when(context.getProjectClassLoaders().isClassInCompileClasspath(true, REQUIRED_CLASSES)) + .thenReturn(true); + SpringBootHealthCheckEnricher enricher = new SpringBootHealthCheckEnricher(context); + + Probe livenessProbe = enricher.getLivenessProbe(); + assertHTTPGetPathAndPort(livenessProbe,getActuatorDefaultBasePath() + "/health",8080); + + Probe readinessProbe = enricher.getReadinessProbe(); + assertHTTPGetPathAndPort(readinessProbe,getActuatorDefaultBasePath() + "/health",8080); + } + + @Test + void testLivenessAndReadinessProbesForDefaultPath_whenManagementHealthProbesEnabledIsFalse(){ + props.put("management.health.probes.enabled","false"); + writeProps(); + + when(projectClassLoaders.isClassInCompileClasspath(true, REQUIRED_CLASSES)) + .thenReturn(true); + + SpringBootHealthCheckEnricher enricher = new SpringBootHealthCheckEnricher(context); + + Probe livenessProbe = enricher.getLivenessProbe(); + assertHTTPGetPathAndPort(livenessProbe,getActuatorDefaultBasePath() + "/health",8080); + Probe readinessProbe = enricher.getReadinessProbe(); + assertHTTPGetPathAndPort(readinessProbe,getActuatorDefaultBasePath() + "/health",8080); + } + private void assertHTTPGetPathAndPort(Probe probe, String path, int port) { assertThat(probe).isNotNull() .extracting(Probe::getHttpGet).isNotNull() From 638e5cc1cdbfab5e15048f89aacf35132a057a84 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Fri, 7 Jun 2024 09:01:11 +0200 Subject: [PATCH 173/289] chore: added missing changelog entry for #3036/#2665 Signed-off-by: Marc Nuri --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16d47c262e..6af6c2f831 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -28,6 +28,7 @@ Usage: * Fix #2463: Buildpacks should clear build cache when `nocache` option is enabled * Fix #2470: Add configuration option for overriding buildpack builder image * Fix #2662: Sanitize VCS remote URL used in `jkube.eclipse.org/git-url` annotation +* Fix #2665: Added support for explicit path for readiness and liveness probes in SpringBootHealthCheckEnricher * Fix #2860: Correctly pass Docker build-arg from the build configuration to the Openshift build strategy * Fix #2885: Provide a way to set labels on images defined by Generators * Fix #2901: Ensure Docker build arguments from properties are used during images pre-pulling From 64e498edc7b238b28eb652a563285abdb77a59bc Mon Sep 17 00:00:00 2001 From: Arman Yekkehkhani <72594459+arman-yekkehkhani@users.noreply.github.com> Date: Fri, 7 Jun 2024 11:25:55 +0330 Subject: [PATCH 174/289] feat(enrichers): imagePullSecrets supported in resource controller configuration (3133) feature(imagePullSecrets): Add support for specifying imagePullSecrets via resource configuration, issue #2467 Signed-off-by: arman-yekkehkhani --- feature(imagePullSecrets): add imagePullSecrets to _controller_resource_generation.adoc, issue #2467 Signed-off-by: arman-yekkehkhani --- Merge branch 'eclipse-jkube:master' into gh_2467-experimental --- feature(imagePullSecrets): add gradle plugin integration test, issue #2467 Signed-off-by: arman-yekkehkhani --- feature(imagePullSecrets): remove public access modifier from test class, issue #2467 Signed-off-by: arman-yekkehkhani --- feature(imagePullSecrets): add license, issue #2467 Signed-off-by: arman-yekkehkhani --- feature(imagePullSecrets): update CHANGELOG.md , issue #2467 Signed-off-by: arman-yekkehkhani --- CHANGELOG.md | 2 +- .../it/src/it/image-pull-secrets/build.gradle | 48 ++++++ .../expected/kubernetes.yml | 101 +++++++++++++ .../image-pull-secrets/expected/openshift.yml | 141 ++++++++++++++++++ .../plugin/tests/ImagePullSecretsIT.java | 59 ++++++++ .../resource/ControllerResourceConfig.java | 1 + .../ControllerResourceConfigTest.java | 8 +- .../src/test/resources/controller-config.json | 5 +- .../_controller_resource_generation.adoc | 3 + .../enricher/handler/PodTemplateHandler.java | 7 + .../handler/PodTemplateHandlerTest.java | 35 +++++ 11 files changed, 406 insertions(+), 4 deletions(-) create mode 100644 gradle-plugin/it/src/it/image-pull-secrets/build.gradle create mode 100644 gradle-plugin/it/src/it/image-pull-secrets/expected/kubernetes.yml create mode 100644 gradle-plugin/it/src/it/image-pull-secrets/expected/openshift.yml create mode 100644 gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ImagePullSecretsIT.java diff --git a/CHANGELOG.md b/CHANGELOG.md index 6af6c2f831..d1bf4d6a86 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -37,7 +37,7 @@ Usage: * Fix #3067: Helm Push uses configured docker global and push registries instead of pull * Fix #2110: Add new helm dependency update goal task (`k8s:helm-dependency-update` for maven and `k8sHelmDependencyUpdate` for gradle) * Fix #3122: JKube should also pass project directory in `buildpacks` build strategy - +* Fix #2467: Add support for specifying imagePullSecrets via resource configuration ### 1.16.2 (2024-03-27) * Fix #2461: `k8s:watch`/`k8sWatch` should throw error in `buildpacks` build strategy * Fix #2852: Bump version.kubernetes-client from 6.10.0 to 6.11.0 diff --git a/gradle-plugin/it/src/it/image-pull-secrets/build.gradle b/gradle-plugin/it/src/it/image-pull-secrets/build.gradle new file mode 100644 index 0000000000..dde5ff0266 --- /dev/null +++ b/gradle-plugin/it/src/it/image-pull-secrets/build.gradle @@ -0,0 +1,48 @@ +/* + * 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 + */ +plugins { + id 'org.eclipse.jkube.kubernetes' version "${jKubeVersion}" + id 'org.eclipse.jkube.openshift' version "${jKubeVersion}" + id 'java' +} + +group = 'org.eclipse.jkube.integration.tests.gradle' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = '11' + +repositories { + mavenCentral() +} + +def extensionConfig = { + offline = true + images { + image { + name = 'repository/image-pull-secrets:latest' + build { + from = 'quay.io/jkube/jkube-java-11' + ports = ['8080'] + } + } + } + + resources { + controller { + imagePullSecrets = ['secret-1', 'secret-2'] + } + } +} + +kubernetes(extensionConfig) +openshift(extensionConfig) \ No newline at end of file diff --git a/gradle-plugin/it/src/it/image-pull-secrets/expected/kubernetes.yml b/gradle-plugin/it/src/it/image-pull-secrets/expected/kubernetes.yml new file mode 100644 index 0000000000..46268b66bf --- /dev/null +++ b/gradle-plugin/it/src/it/image-pull-secrets/expected/kubernetes.yml @@ -0,0 +1,101 @@ +--- +apiVersion: v1 +kind: List +items: + - apiVersion: v1 + kind: Service + metadata: + annotations: + jkube.eclipse.org/git-commit: "@ignore@" + jkube.eclipse.org/git-url: "@ignore@" + jkube.eclipse.org/git-branch: "@ignore@" + labels: + app: image-pull-secrets + provider: jkube + version: 0.0.1-SNAPSHOT + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + app.kubernetes.io/name: image-pull-secrets + app.kubernetes.io/version: 0.0.1-SNAPSHOT + name: image-pull-secrets + spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 8080 + selector: + app: image-pull-secrets + provider: jkube + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/name: image-pull-secrets + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + - apiVersion: apps/v1 + kind: Deployment + metadata: + annotations: + jkube.eclipse.org/git-commit: "@ignore@" + jkube.eclipse.org/git-url: "@ignore@" + jkube.eclipse.org/git-branch: "@ignore@" + labels: + app: image-pull-secrets + provider: jkube + version: 0.0.1-SNAPSHOT + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + app.kubernetes.io/name: image-pull-secrets + app.kubernetes.io/version: 0.0.1-SNAPSHOT + name: image-pull-secrets + spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: image-pull-secrets + provider: jkube + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/name: image-pull-secrets + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + template: + metadata: + annotations: + jkube.eclipse.org/git-commit: "@ignore@" + jkube.eclipse.org/git-url: "@ignore@" + jkube.eclipse.org/git-branch: "@ignore@" + labels: + app: image-pull-secrets + provider: jkube + version: 0.0.1-SNAPSHOT + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + app.kubernetes.io/name: image-pull-secrets + app.kubernetes.io/version: 0.0.1-SNAPSHOT + name: image-pull-secrets + spec: + containers: + - env: + - name: KUBERNETES_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: HOSTNAME + valueFrom: + fieldRef: + fieldPath: metadata.name + image: repository/image-pull-secrets:latest + imagePullPolicy: IfNotPresent + name: repository-image-pull-secrets + ports: + - containerPort: 8080 + name: http + protocol: TCP + securityContext: + privileged: false + imagePullSecrets: + - name: secret-1 + - name: secret-2 \ No newline at end of file diff --git a/gradle-plugin/it/src/it/image-pull-secrets/expected/openshift.yml b/gradle-plugin/it/src/it/image-pull-secrets/expected/openshift.yml new file mode 100644 index 0000000000..2b32d25d2d --- /dev/null +++ b/gradle-plugin/it/src/it/image-pull-secrets/expected/openshift.yml @@ -0,0 +1,141 @@ +--- +apiVersion: v1 +kind: List +items: + - apiVersion: v1 + kind: Service + metadata: + annotations: + jkube.eclipse.org/git-commit: "@ignore@" + jkube.eclipse.org/git-url: "@ignore@" + app.openshift.io/vcs-ref: "@ignore@" + app.openshift.io/vcs-uri: "@ignore@" + jkube.eclipse.org/git-branch: "@ignore@" + labels: + app: image-pull-secrets + provider: jkube + version: 0.0.1-SNAPSHOT + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + app.kubernetes.io/name: image-pull-secrets + app.kubernetes.io/version: 0.0.1-SNAPSHOT + name: image-pull-secrets + spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 8080 + selector: + app: image-pull-secrets + provider: jkube + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/name: image-pull-secrets + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + - apiVersion: apps.openshift.io/v1 + kind: DeploymentConfig + metadata: + annotations: + jkube.eclipse.org/git-commit: "@ignore@" + jkube.eclipse.org/git-url: "@ignore@" + app.openshift.io/vcs-ref: "@ignore@" + app.openshift.io/vcs-uri: "@ignore@" + jkube.eclipse.org/git-branch: "@ignore@" + labels: + app: image-pull-secrets + provider: jkube + version: 0.0.1-SNAPSHOT + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + app.kubernetes.io/name: image-pull-secrets + app.kubernetes.io/version: 0.0.1-SNAPSHOT + name: image-pull-secrets + spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + app: image-pull-secrets + provider: jkube + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/name: image-pull-secrets + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + strategy: + rollingParams: + timeoutSeconds: 3600 + type: Rolling + template: + metadata: + annotations: + jkube.eclipse.org/git-commit: "@ignore@" + jkube.eclipse.org/git-url: "@ignore@" + app.openshift.io/vcs-ref: "@ignore@" + app.openshift.io/vcs-uri: "@ignore@" + jkube.eclipse.org/git-branch: "@ignore@" + labels: + app: image-pull-secrets + provider: jkube + version: 0.0.1-SNAPSHOT + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + app.kubernetes.io/name: image-pull-secrets + app.kubernetes.io/version: 0.0.1-SNAPSHOT + name: image-pull-secrets + spec: + containers: + - env: + - name: KUBERNETES_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + image: repository/image-pull-secrets:latest + imagePullPolicy: IfNotPresent + name: repository-image-pull-secrets + ports: + - containerPort: 8080 + name: http + protocol: TCP + securityContext: + privileged: false + imagePullSecrets: + - name: secret-1 + - name: secret-2 + triggers: + - type: ConfigChange + - imageChangeParams: + automatic: true + containerNames: + - repository-image-pull-secrets + from: + kind: ImageStreamTag + name: image-pull-secrets:latest + type: ImageChange + - apiVersion: route.openshift.io/v1 + kind: Route + metadata: + annotations: + jkube.eclipse.org/git-commit: "@ignore@" + jkube.eclipse.org/git-url: "@ignore@" + app.openshift.io/vcs-ref: "@ignore@" + app.openshift.io/vcs-uri: "@ignore@" + jkube.eclipse.org/git-branch: "@ignore@" + labels: + app: image-pull-secrets + provider: jkube + version: 0.0.1-SNAPSHOT + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + app.kubernetes.io/name: image-pull-secrets + app.kubernetes.io/version: 0.0.1-SNAPSHOT + name: image-pull-secrets + spec: + port: + targetPort: 8080 + to: + kind: Service + name: image-pull-secrets diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ImagePullSecretsIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ImagePullSecretsIT.java new file mode 100644 index 0000000000..596959604b --- /dev/null +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/ImagePullSecretsIT.java @@ -0,0 +1,59 @@ +/* + * 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.gradle.plugin.tests; + +import net.minidev.json.parser.ParseException; +import org.eclipse.jkube.kit.common.ResourceVerify; +import org.gradle.testkit.runner.BuildResult; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import java.io.IOException; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class ImagePullSecretsIT { + @RegisterExtension + final ITGradleRunnerExtension gradleRunner = new ITGradleRunnerExtension(); + + @Test + void k8sResource_whenRun_generatesK8sManifestsWithImagePullSecrets() throws IOException, ParseException { + final BuildResult result = gradleRunner.withITProject("image-pull-secrets") + .withArguments("k8sResource", "--stacktrace") + .build(); + + ResourceVerify.verifyResourceDescriptors(gradleRunner.resolveDefaultKubernetesResourceFile(), + gradleRunner.resolveFile("expected", "kubernetes.yml")); + assertThat(result).extracting(BuildResult::getOutput).asString() + .contains("Using resource templates from") + .contains("Adding a default Deployment") + .contains("Adding revision history limit to 2") + .contains("validating"); + } + + @Test + void ocResource_whenRun_generatesOpenShiftManifestsWithImagePullSecrets() throws IOException, ParseException { + final BuildResult result = gradleRunner.withITProject("image-pull-secrets") + .withArguments("ocResource", "--stacktrace") + .build(); + + ResourceVerify.verifyResourceDescriptors(gradleRunner.resolveDefaultOpenShiftResourceFile(), + gradleRunner.resolveFile("expected", "openshift.yml")); + assertThat(result).extracting(BuildResult::getOutput).asString() + .contains("Using resource templates from") + .contains("Adding a default Deployment") + .contains("Adding revision history limit to 2") + .contains("validating"); + } +} diff --git a/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/ControllerResourceConfig.java b/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/ControllerResourceConfig.java index 9c1a7579e2..4a3f235bdf 100644 --- a/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/ControllerResourceConfig.java +++ b/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/ControllerResourceConfig.java @@ -45,4 +45,5 @@ public class ControllerResourceConfig { private ContainerResourcesConfig containerResources; private String schedule; private Map nodeSelector; + private List imagePullSecrets; } diff --git a/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/resource/ControllerResourceConfigTest.java b/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/resource/ControllerResourceConfigTest.java index 58917e4a1c..0dc74bf42d 100644 --- a/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/resource/ControllerResourceConfigTest.java +++ b/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/resource/ControllerResourceConfigTest.java @@ -76,7 +76,8 @@ void builder() { .name("workdir") .type("emptyDir") .path("/work-dir") - .build())); + .build())) + .imagePullSecrets(Collections.singletonList("secret")); // When ControllerResourceConfig controllerResourceConfig = initContainerConfigBuilder.build(); @@ -123,7 +124,10 @@ private void assertControllerResourceConfig(ControllerResourceConfig controllerR .singleElement(InstanceOfAssertFactories.type(VolumeConfig.class)) .hasFieldOrPropertyWithValue("name", "workdir") .hasFieldOrPropertyWithValue("type", "emptyDir") - .hasFieldOrPropertyWithValue("path", "/work-dir")); + .hasFieldOrPropertyWithValue("path", "/work-dir")) + .satisfies( c -> assertThat(c.getImagePullSecrets()) + .singleElement(InstanceOfAssertFactories.type(String.class)) + .isEqualTo("secret")); } private void assertProbe(ProbeConfig probeConfig) { diff --git a/jkube-kit/config/resource/src/test/resources/controller-config.json b/jkube-kit/config/resource/src/test/resources/controller-config.json index 2e09f2f698..a302710d8d 100644 --- a/jkube-kit/config/resource/src/test/resources/controller-config.json +++ b/jkube-kit/config/resource/src/test/resources/controller-config.json @@ -41,5 +41,8 @@ "getUrl": "http://:8080/q/health", "initialDelaySeconds": 3, "timeoutSeconds": 3 - } + }, + "imagePullSecrets": [ + "secret" + ] } \ No newline at end of file diff --git a/jkube-kit/doc/src/main/asciidoc/inc/resource-generation/_controller_resource_generation.adoc b/jkube-kit/doc/src/main/asciidoc/inc/resource-generation/_controller_resource_generation.adoc index 548ddd08b2..ed0b1546ab 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/resource-generation/_controller_resource_generation.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/resource-generation/_controller_resource_generation.adoc @@ -99,6 +99,9 @@ For `Job`, this defaults to `OnFailure`. For others, it's not provided ({cluster | `nodeSelector` | Configuration element for adding nodeSelector to Pod template spec. + +|`imagePullSecrets` +| Specify https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/[secrets] for pulling images from private repos |=== [[initcontainer-configuration]] diff --git a/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/handler/PodTemplateHandler.java b/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/handler/PodTemplateHandler.java index 14aa126d2b..5109720839 100644 --- a/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/handler/PodTemplateHandler.java +++ b/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/handler/PodTemplateHandler.java @@ -13,6 +13,7 @@ */ package org.eclipse.jkube.kit.enricher.handler; +import io.fabric8.kubernetes.api.model.LocalObjectReference; import io.fabric8.kubernetes.api.model.ObjectMeta; import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.fabric8.kubernetes.api.model.PodSpec; @@ -27,6 +28,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import static org.eclipse.jkube.kit.enricher.api.util.KubernetesResourceUtil.createNewInitContainersFromConfig; @@ -60,6 +62,11 @@ private PodSpec createPodSpec(ControllerResourceConfig config, String restartPol .withInitContainers(createNewInitContainersFromConfig(config.getInitContainers())) .withVolumes(getVolumes(config)) .withNodeSelector(config.getNodeSelector()) + .withImagePullSecrets( + config.getImagePullSecrets() == null ? null: config.getImagePullSecrets() + .stream() + .map(LocalObjectReference::new) + .collect(Collectors.toList())) .build(); } diff --git a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/PodTemplateHandlerTest.java b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/PodTemplateHandlerTest.java index fa6a4efcaf..137b7c6270 100644 --- a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/PodTemplateHandlerTest.java +++ b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/PodTemplateHandlerTest.java @@ -13,8 +13,10 @@ */ package org.eclipse.jkube.kit.enricher.handler; +import io.fabric8.kubernetes.api.model.LocalObjectReference; import io.fabric8.kubernetes.api.model.PodSpec; import io.fabric8.kubernetes.api.model.PodTemplateSpec; +import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.common.JavaProject; @@ -25,6 +27,7 @@ import org.junit.jupiter.api.Test; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; @@ -184,6 +187,38 @@ void getPodTemplate_withRestartPolicyAndControllerResourceConfig_shouldGenerateP .hasFieldOrPropertyWithValue("spec.restartPolicy", "Always"); } + @Test + void gePodTemplate_withImagePullSecrets_shouldGeneratePodTemplateWithConfiguredSecretes() { + // Given + ControllerResourceConfig config = ControllerResourceConfig.builder() + .imagePullSecrets(Collections.singletonList("secret")) + .build(); + + // When + PodTemplateSpec podTemplateSpec = podTemplateHandler.getPodTemplate(config, null, images); + + // Then + assertThat(podTemplateSpec) + .extracting("spec.imagePullSecrets") + .asInstanceOf(InstanceOfAssertFactories.list(LocalObjectReference.class)) + .singleElement() + .hasFieldOrPropertyWithValue("name", "secret"); + } + + @Test + void getPodTemplate_withoutImagePullSecrets_shouldGeneratePodTemplateWithoutSecrets() { + // Given + ControllerResourceConfig config = ControllerResourceConfig.builder().build(); + + // When + PodTemplateSpec podTemplateSpec = podTemplateHandler.getPodTemplate(config, null, images); + + // Then + assertThat(podTemplateSpec) + .extracting("spec.imagePullSecrets") + .isNull(); + } + private ContainerHandler getContainerHandler() { return new ContainerHandler(project.getProperties(), new GroupArtifactVersion("g","a","v"), probeHandler); } From 6e6417ac548c9842d9b9debb3a7cfd46b8c84081 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Fri, 7 Jun 2024 18:18:00 +0530 Subject: [PATCH 175/289] test(gradle): added E2E test to verify SpringBootHealthCheckEnricher detects management health probe endpoints Related to #2665 Add gradle integration test to verify that SpringBootHealthCheckEnricher adds `/actuator/health/readiness` for readiness probe and `/actuator/health/liveness` for liveness probe when `management.health.probes.enabled` property is enabled in application.properties Signed-off-by: Rohan Kumar --- .../build.gradle | 39 +++++ .../expected/kubernetes.yml | 123 +++++++++++++ .../expected/openshift.yml | 163 ++++++++++++++++++ .../it/gradle/spring/boot/Application.java | 24 +++ .../src/main/resources/application.properties | 15 ++ .../SpringBootManagementHealthProbesIT.java | 68 ++++++++ 6 files changed, 432 insertions(+) create mode 100644 gradle-plugin/it/src/it/spring-boot-managementhealthprobes/build.gradle create mode 100644 gradle-plugin/it/src/it/spring-boot-managementhealthprobes/expected/kubernetes.yml create mode 100644 gradle-plugin/it/src/it/spring-boot-managementhealthprobes/expected/openshift.yml create mode 100644 gradle-plugin/it/src/it/spring-boot-managementhealthprobes/src/main/java/org/eclipse/jkube/it/gradle/spring/boot/Application.java create mode 100644 gradle-plugin/it/src/it/spring-boot-managementhealthprobes/src/main/resources/application.properties create mode 100644 gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/SpringBootManagementHealthProbesIT.java diff --git a/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/build.gradle b/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/build.gradle new file mode 100644 index 0000000000..5bef5796c1 --- /dev/null +++ b/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/build.gradle @@ -0,0 +1,39 @@ +/* + * 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 + */ +plugins { + id 'org.eclipse.jkube.kubernetes' version "${jKubeVersion}" + id 'org.eclipse.jkube.openshift' version "${jKubeVersion}" + id 'org.springframework.boot' version '2.7.17' + id 'io.spring.dependency-management' version '1.0.15.RELEASE' + id 'java' +} + +group = 'org.eclipse.jkube.integration.tests.gradle' +version = '0.0.1-SNAPSHOT' + +repositories { + mavenCentral() +} + +dependencies { + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-actuator' +} + +kubernetes { + offline = true +} +openshift { + offline = true +} diff --git a/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/expected/kubernetes.yml b/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/expected/kubernetes.yml new file mode 100644 index 0000000000..272da296b5 --- /dev/null +++ b/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/expected/kubernetes.yml @@ -0,0 +1,123 @@ +--- +apiVersion: v1 +kind: List +items: +- apiVersion: v1 + kind: Service + metadata: + annotations: + prometheus.io/scrape: "true" + prometheus.io/path: /metrics + prometheus.io/port: "9779" + jkube.eclipse.org/git-commit: "@ignore@" + jkube.eclipse.org/git-url: "@ignore@" + jkube.eclipse.org/git-branch: "@ignore@" + labels: + app: spring-boot-managementhealthprobes + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + app.kubernetes.io/name: spring-boot-managementhealthprobes + app.kubernetes.io/version: "@ignore@" + name: spring-boot-managementhealthprobes + spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 8080 + selector: + app: spring-boot-managementhealthprobes + provider: jkube + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/name: spring-boot-managementhealthprobes + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube +- apiVersion: apps/v1 + kind: Deployment + metadata: + annotations: + jkube.eclipse.org/git-commit: "@ignore@" + jkube.eclipse.org/git-url: "@ignore@" + jkube.eclipse.org/git-branch: "@ignore@" + labels: + app: spring-boot-managementhealthprobes + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + app.kubernetes.io/name: spring-boot-managementhealthprobes + app.kubernetes.io/version: "@ignore@" + name: spring-boot-managementhealthprobes + spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: spring-boot-managementhealthprobes + provider: jkube + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/name: spring-boot-managementhealthprobes + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + template: + metadata: + annotations: + jkube.eclipse.org/git-commit: "@ignore@" + jkube.eclipse.org/git-url: "@ignore@" + jkube.eclipse.org/git-branch: "@ignore@" + labels: + app: spring-boot-managementhealthprobes + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + app.kubernetes.io/name: spring-boot-managementhealthprobes + app.kubernetes.io/version: "@ignore@" + name: spring-boot-managementhealthprobes + spec: + containers: + - env: + - name: KUBERNETES_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + - name: HOSTNAME + valueFrom: + fieldRef: + fieldPath: metadata.name + image: gradle/spring-boot-managementhealthprobes:latest + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /actuator/health/liveness + port: 8080 + scheme: HTTP + initialDelaySeconds: 180 + successThreshold: 1 + name: spring-boot + ports: + - containerPort: 8080 + name: http + protocol: TCP + - containerPort: 9779 + name: prometheus + protocol: TCP + - containerPort: 8778 + name: jolokia + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /actuator/health/readiness + port: 8080 + scheme: HTTP + initialDelaySeconds: 10 + successThreshold: 1 + securityContext: + privileged: false diff --git a/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/expected/openshift.yml b/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/expected/openshift.yml new file mode 100644 index 0000000000..f9063335ad --- /dev/null +++ b/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/expected/openshift.yml @@ -0,0 +1,163 @@ +--- +apiVersion: v1 +kind: List +items: +- apiVersion: v1 + kind: Service + metadata: + annotations: + prometheus.io/scrape: "true" + prometheus.io/path: /metrics + prometheus.io/port: "9779" + jkube.eclipse.org/git-commit: "@ignore@" + jkube.eclipse.org/git-url: "@ignore@" + app.openshift.io/vcs-ref: "@ignore@" + app.openshift.io/vcs-uri: "@ignore@" + jkube.eclipse.org/git-branch: "@ignore@" + labels: + app: spring-boot-managementhealthprobes + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + app.kubernetes.io/name: spring-boot-managementhealthprobes + app.kubernetes.io/version: "@ignore@" + name: spring-boot-managementhealthprobes + spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 8080 + selector: + app: spring-boot-managementhealthprobes + provider: jkube + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/name: spring-boot-managementhealthprobes + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube +- apiVersion: apps.openshift.io/v1 + kind: DeploymentConfig + metadata: + annotations: + jkube.eclipse.org/git-commit: "@ignore@" + jkube.eclipse.org/git-url: "@ignore@" + app.openshift.io/vcs-ref: "@ignore@" + app.openshift.io/vcs-uri: "@ignore@" + jkube.eclipse.org/git-branch: "@ignore@" + labels: + app: spring-boot-managementhealthprobes + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + app.kubernetes.io/name: spring-boot-managementhealthprobes + app.kubernetes.io/version: "@ignore@" + name: spring-boot-managementhealthprobes + spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + app: spring-boot-managementhealthprobes + provider: jkube + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/name: spring-boot-managementhealthprobes + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + strategy: + rollingParams: + timeoutSeconds: 3600 + type: Rolling + template: + metadata: + annotations: + jkube.eclipse.org/git-commit: "@ignore@" + jkube.eclipse.org/git-url: "@ignore@" + app.openshift.io/vcs-ref: "@ignore@" + app.openshift.io/vcs-uri: "@ignore@" + jkube.eclipse.org/git-branch: "@ignore@" + labels: + app: spring-boot-managementhealthprobes + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + app.kubernetes.io/name: spring-boot-managementhealthprobes + app.kubernetes.io/version: "@ignore@" + name: spring-boot-managementhealthprobes + spec: + containers: + - env: + - name: KUBERNETES_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + image: spring-boot-managementhealthprobes:latest + imagePullPolicy: IfNotPresent + livenessProbe: + failureThreshold: 3 + httpGet: + path: /actuator/health/liveness + port: 8080 + scheme: HTTP + initialDelaySeconds: 180 + successThreshold: 1 + name: spring-boot + ports: + - containerPort: 8080 + name: http + protocol: TCP + - containerPort: 9779 + name: prometheus + protocol: TCP + - containerPort: 8778 + name: jolokia + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /actuator/health/readiness + port: 8080 + scheme: HTTP + initialDelaySeconds: 10 + successThreshold: 1 + securityContext: + privileged: false + triggers: + - type: ConfigChange + - imageChangeParams: + automatic: true + containerNames: + - spring-boot + from: + kind: ImageStreamTag + name: spring-boot-managementhealthprobes:latest + type: ImageChange +- apiVersion: route.openshift.io/v1 + kind: Route + metadata: + annotations: + jkube.eclipse.org/git-commit: "@ignore@" + jkube.eclipse.org/git-url: "@ignore@" + app.openshift.io/vcs-ref: "@ignore@" + app.openshift.io/vcs-uri: "@ignore@" + jkube.eclipse.org/git-branch: "@ignore@" + labels: + app: spring-boot-managementhealthprobes + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/part-of: org.eclipse.jkube.integration.tests.gradle + app.kubernetes.io/managed-by: jkube + app.kubernetes.io/name: spring-boot-managementhealthprobes + app.kubernetes.io/version: "@ignore@" + name: spring-boot-managementhealthprobes + spec: + port: + targetPort: 8080 + to: + kind: Service + name: spring-boot-managementhealthprobes diff --git a/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/src/main/java/org/eclipse/jkube/it/gradle/spring/boot/Application.java b/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/src/main/java/org/eclipse/jkube/it/gradle/spring/boot/Application.java new file mode 100644 index 0000000000..a3be3c31a3 --- /dev/null +++ b/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/src/main/java/org/eclipse/jkube/it/gradle/spring/boot/Application.java @@ -0,0 +1,24 @@ +/* + * 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.it.gradle.spring.boot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} \ No newline at end of file diff --git a/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/src/main/resources/application.properties b/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/src/main/resources/application.properties new file mode 100644 index 0000000000..ec2c116dc5 --- /dev/null +++ b/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/src/main/resources/application.properties @@ -0,0 +1,15 @@ +# +# 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 +# + +management.health.probes.enabled=true \ No newline at end of file diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/SpringBootManagementHealthProbesIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/SpringBootManagementHealthProbesIT.java new file mode 100644 index 0000000000..531695c5b0 --- /dev/null +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/SpringBootManagementHealthProbesIT.java @@ -0,0 +1,68 @@ +/* + * 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.gradle.plugin.tests; + +import net.minidev.json.parser.ParseException; +import org.eclipse.jkube.kit.common.ResourceVerify; +import org.gradle.testkit.runner.BuildResult; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import java.io.IOException; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +class SpringBootManagementHealthProbesIT { + @RegisterExtension + protected final ITGradleRunnerExtension gradleRunner = new ITGradleRunnerExtension(); + + @Test + void k8sResource_whenRun_generatesK8sManifestsWithProbesWithSpecificEndpoints() throws IOException, ParseException { + // When + final BuildResult result = gradleRunner.withITProject("spring-boot-managementhealthprobes") + .withArguments("build", "k8sResource", "--stacktrace") + .build(); + // Then + ResourceVerify.verifyResourceDescriptors(gradleRunner.resolveDefaultKubernetesResourceFile(), + gradleRunner.resolveFile("expected", "kubernetes.yml")); + assertThat(result).extracting(BuildResult::getOutput).asString() + .contains("Running generator spring-boot") + .contains("jkube-controller: Adding a default Deployment") + .contains("jkube-service: Adding a default service") + .contains("jkube-healthcheck-spring-boot: Adding readiness probe on port 8080") + .contains("jkube-healthcheck-spring-boot: Adding liveness probe on port 8080") + .contains("jkube-service-discovery: Using first mentioned service port '8080' ") + .contains("jkube-revision-history: Adding revision history limit to 2"); + } + + @Test + void ocResource_whenRun_generatesK8sManifestsWithProbesWithSpecificEndpoints() throws IOException, ParseException { + // When + final BuildResult result = gradleRunner.withITProject("spring-boot-managementhealthprobes") + .withArguments("build", "ocResource", "--stacktrace") + .build(); + // Then + ResourceVerify.verifyResourceDescriptors(gradleRunner.resolveDefaultOpenShiftResourceFile(), + gradleRunner.resolveFile("expected", "openshift.yml")); + assertThat(result).extracting(BuildResult::getOutput).asString() + .contains("Running generator spring-boot") + .contains("jkube-controller: Adding a default Deployment") + .contains("jkube-service: Adding a default service") + .contains("jkube-openshift-deploymentconfig: Converting Deployment to DeploymentConfig") + .contains("jkube-healthcheck-spring-boot: Adding readiness probe on port 8080") + .contains("jkube-healthcheck-spring-boot: Adding liveness probe on port 8080") + .contains("jkube-service-discovery: Using first mentioned service port '8080' ") + .contains("jkube-revision-history: Adding revision history limit to 2"); + } +} From c5a37e590d01cd91932b5fbbd85f2c170d3da88b Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Fri, 7 Jun 2024 20:45:36 +0530 Subject: [PATCH 176/289] doc(spring-boot): docs for support for explicit path for readiness and liveness probes Add a note in SpringBootHealthCheckEnricher documentation about the effect of `management.health.probes.enabled` property on enricher behavior. Signed-off-by: Rohan Kumar --- .../_jkube_healthcheck_spring_boot.adoc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/jkube-kit/doc/src/main/asciidoc/inc/enricher/spring-boot-healthcheck/_jkube_healthcheck_spring_boot.adoc b/jkube-kit/doc/src/main/asciidoc/inc/enricher/spring-boot-healthcheck/_jkube_healthcheck_spring_boot.adoc index e775fc5750..03ed9ad9cb 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/enricher/spring-boot-healthcheck/_jkube_healthcheck_spring_boot.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/enricher/spring-boot-healthcheck/_jkube_healthcheck_spring_boot.adoc @@ -14,6 +14,14 @@ endif::[] The enricher will try to discover the settings from the `application.properties` / `application.yaml` Spring Boot configuration file. +`/actuator/health` is the default endpoint for the liveness and readiness probes. + +If the user has enabled the `management.health.probes.enabled` property this Enricher uses the `/actuator/health/liveness` as liveness and `/actuator/health/readiness` as readiness probe endpoints instead. +[source,properties] +---- +management.health.probes.enabled=true +---- + The port number is read from the `management.port` option, and will use the default value of `8080` The scheme will use HTTPS if `server.ssl.key-store` option is in use, and fallback to use `HTTP` otherwise. From bf46ef466b5b7b1628a9964aa00e69ae78549c18 Mon Sep 17 00:00:00 2001 From: lukez963 <133926460+lukez963@users.noreply.github.com> Date: Mon, 10 Jun 2024 00:51:18 -0400 Subject: [PATCH 177/289] fix: removed unused import from WatcherManager Signed-off-by: Luke Zhang --- .../main/java/org/eclipse/jkube/watcher/api/WatcherManager.java | 1 - 1 file changed, 1 deletion(-) diff --git a/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherManager.java b/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherManager.java index a889afa45f..12de511d11 100644 --- a/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherManager.java +++ b/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherManager.java @@ -20,7 +20,6 @@ import org.eclipse.jkube.kit.common.util.OpenshiftHelper; import org.eclipse.jkube.kit.common.util.PluginServiceFactory; import org.eclipse.jkube.kit.config.image.ImageConfiguration; -import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; import org.eclipse.jkube.kit.config.resource.PlatformMode; import java.util.Collection; From b6e586bc357031043e8bb7b83dbbfd24c9868439 Mon Sep 17 00:00:00 2001 From: JeevananthamMoorthy Date: Mon, 10 Jun 2024 10:24:17 +0530 Subject: [PATCH 178/289] test: ResourceMojoTest works on windows (3152) Issue: 3139 ResourceMojoTest is failing on windows --- .../jkube/maven/plugin/mojo/build/ResourceMojoTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojoTest.java index 3f05436ba8..1cc84f473c 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojoTest.java @@ -101,7 +101,7 @@ void execute_generatesResourcesAndAttachesArtifact() throws Exception { final File generatedArtifact = new File(resourceMojo.targetDir, "kubernetes.yml"); assertThat(generatedArtifact) .exists() - .content().isEqualTo("---\napiVersion: v1\nkind: List\n"); + .content().isEqualTo(String.format("---%napiVersion: v1%nkind: List%n")); verify(resourceMojo.projectHelper, times(1)) .attachArtifact(resourceMojo.project, "yml", "kubernetes", generatedArtifact); } @@ -116,7 +116,7 @@ void execute_writeResourcesFirstThenValidatesThem() throws Exception { final File generatedArtifact = new File(resourceMojo.targetDir, "kubernetes.yml"); assertThat(generatedArtifact) .exists() - .content().isEqualTo("---\napiVersion: v1\nkind: List\n"); + .content().isEqualTo(String.format("---%napiVersion: v1%nkind: List%n")); verify(resourceMojo.projectHelper, times(1)) .attachArtifact(resourceMojo.project, "yml", "kubernetes", generatedArtifact); InOrder inOrder = inOrder(kitLogger); From 0091e7f571a034d5658f4a193a0d3e4b69c22aa9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jun 2024 06:58:06 +0200 Subject: [PATCH 179/289] chore(deps): Bump step-security/harden-runner from 2.8.0 to 2.8.1 Bumps [step-security/harden-runner](https://github.com/step-security/harden-runner) from 2.8.0 to 2.8.1. - [Release notes](https://github.com/step-security/harden-runner/releases) - [Commits](https://github.com/step-security/harden-runner/compare/f086349bfa2bd1361f7909c78558e816508cdc10...17d0e2bd7d51742c71671bd19fa12bdc9d40a3d6) --- updated-dependencies: - dependency-name: step-security/harden-runner dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/license.yml | 2 +- .github/workflows/quickstarts.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/license.yml b/.github/workflows/license.yml index e99ff38910..b70de2c87b 100644 --- a/.github/workflows/license.yml +++ b/.github/workflows/license.yml @@ -29,7 +29,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@f086349bfa2bd1361f7909c78558e816508cdc10 + uses: step-security/harden-runner@17d0e2bd7d51742c71671bd19fa12bdc9d40a3d6 with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/quickstarts.yml b/.github/workflows/quickstarts.yml index 05ecc37523..3f0beeab3c 100644 --- a/.github/workflows/quickstarts.yml +++ b/.github/workflows/quickstarts.yml @@ -29,7 +29,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@f086349bfa2bd1361f7909c78558e816508cdc10 + uses: step-security/harden-runner@17d0e2bd7d51742c71671bd19fa12bdc9d40a3d6 with: disable-sudo: true egress-policy: block From 7baf59a629ba7e1c630a1abe05805aa944861e4b Mon Sep 17 00:00:00 2001 From: Tanmay Mathpal Date: Mon, 10 Jun 2024 10:30:48 +0530 Subject: [PATCH 180/289] test: fixed readFile() in ResourceVerify works on Windows (3094) chore(test): fixed readFile() in ResourceVerify for Windows Signed-off-by: l3002 --- Merge branch 'eclipse-jkube:master' into Issue-Fix-#2841 --- .../main/java/org/eclipse/jkube/kit/common/ResourceVerify.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/common-it/src/main/java/org/eclipse/jkube/kit/common/ResourceVerify.java b/jkube-kit/common-it/src/main/java/org/eclipse/jkube/kit/common/ResourceVerify.java index f943b54416..65414b1a06 100644 --- a/jkube-kit/common-it/src/main/java/org/eclipse/jkube/kit/common/ResourceVerify.java +++ b/jkube-kit/common-it/src/main/java/org/eclipse/jkube/kit/common/ResourceVerify.java @@ -88,7 +88,7 @@ public static Object readWithPath(File file, String path) throws IOException { } public static String readFile(File path) throws IOException { - return new String(FileCopyUtils.copyToByteArray(Files.newInputStream(path.toPath())), Charset.defaultCharset()); + return new String(FileCopyUtils.copyToByteArray(Files.newInputStream(path.toPath())), Charset.defaultCharset()).replaceAll(System.lineSeparator(), "\n"); } public static TestContext createTestContext() { From d25c6769d1f7b7426d84499238e1fd08623f46bc Mon Sep 17 00:00:00 2001 From: Tanmay Mathpal Date: Tue, 11 Jun 2024 13:29:41 +0530 Subject: [PATCH 181/289] test: JibBuildServiceBuild.build_shouldLogBuiltTarImage() works on windows Signed-off-by: l3002 --- .../service/kubernetes/JibImageBuildServiceBuildTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceBuildTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceBuildTest.java index 3f59a0fd7c..e2ec695dd0 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceBuildTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServiceBuildTest.java @@ -159,7 +159,7 @@ void build_shouldLogBuiltTarImage() throws JKubeServiceException { jibBuildService.build(ic); // Then assertThat(out.toString()) - .contains("/latest/tmp/jib-image.linux-amd64.tar successfully built"); + .contains(separatorsToSystem("/latest/tmp/jib-image.linux-amd64.tar successfully built")); } @Test From cb683ea612f46c07c39c38345e1587ec7b708fe2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 13 Jun 2024 06:48:47 +0200 Subject: [PATCH 182/289] chore(deps): Bump actions/checkout from 4.1.6 to 4.1.7 Bumps [actions/checkout](https://github.com/actions/checkout) from 4.1.6 to 4.1.7. - [Release notes](https://github.com/actions/checkout/releases) - [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md) - [Commits](https://github.com/actions/checkout/compare/a5ac7e51b41094c92402da3b24376905380afc29...692973e3d937129bcbf40652eb9f2f61becf3332) --- updated-dependencies: - dependency-name: actions/checkout dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/license.yml | 2 +- .github/workflows/quickstarts.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/license.yml b/.github/workflows/license.yml index b70de2c87b..b5546292d8 100644 --- a/.github/workflows/license.yml +++ b/.github/workflows/license.yml @@ -40,7 +40,7 @@ jobs: repo.maven.apache.org:443 - name: Checkout - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 - name: Setup Java 11 uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 with: diff --git a/.github/workflows/quickstarts.yml b/.github/workflows/quickstarts.yml index 3f0beeab3c..ad5e463be7 100644 --- a/.github/workflows/quickstarts.yml +++ b/.github/workflows/quickstarts.yml @@ -52,7 +52,7 @@ jobs: services.gradle.org:443 - name: Checkout - uses: actions/checkout@a5ac7e51b41094c92402da3b24376905380afc29 + uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 - name: Setup Java 17 uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 with: From a5b83b998c7e1abd5107ce884f9a5cdea7022292 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Fri, 14 Jun 2024 22:38:39 +0530 Subject: [PATCH 183/289] feat(common): add utility class for exporting KubernetesClient configuration to a kubeconfig Add a utility class that would write a kubeconfig file by inspecting various attributes of KubernetesClient's configuration object. Signed-off-by: Rohan Kumar --- .../kit/common/util/KubernetesHelper.java | 82 ++++++++++++++++++ .../kit/common/util/KubernetesHelperTest.java | 85 +++++++++++++++++++ 2 files changed, 167 insertions(+) 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 e5542adef2..308812edee 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 @@ -18,6 +18,8 @@ import java.io.IOException; import java.net.UnknownHostException; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.time.Instant; import java.time.format.DateTimeFormatter; import java.util.ArrayList; @@ -37,14 +39,24 @@ import java.util.regex.Pattern; import java.util.stream.Collectors; +import io.fabric8.kubernetes.api.model.AuthInfoBuilder; +import io.fabric8.kubernetes.api.model.ClusterBuilder; +import io.fabric8.kubernetes.api.model.Context; import io.fabric8.kubernetes.api.model.HTTPHeader; import io.fabric8.kubernetes.api.model.KubernetesResource; +import io.fabric8.kubernetes.api.model.NamedAuthInfo; +import io.fabric8.kubernetes.api.model.NamedAuthInfoBuilder; +import io.fabric8.kubernetes.api.model.NamedCluster; +import io.fabric8.kubernetes.api.model.NamedClusterBuilder; +import io.fabric8.kubernetes.api.model.NamedContext; import io.fabric8.kubernetes.api.model.authorization.v1.ResourceAttributesBuilder; import io.fabric8.kubernetes.api.model.authorization.v1.SelfSubjectAccessReview; import io.fabric8.kubernetes.api.model.authorization.v1.SelfSubjectAccessReviewBuilder; +import io.fabric8.kubernetes.client.internal.KubeConfigUtils; import io.fabric8.kubernetes.client.utils.ApiVersionUtil; import org.apache.commons.io.IOUtils; import org.apache.commons.io.LineIterator; +import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.KitLogger; import io.fabric8.kubernetes.api.model.Container; @@ -816,5 +828,75 @@ public static boolean hasAccessForAction( .build()); return accessReviewFromServer.getStatus().getAllowed(); } + + /** + * Export KubernetesClient cluster config to a kubeconfig file + * + * @param kubernetesClientConfig KubernetesClient Config currently in use + * @return path to kubeconfig file created by inspecting KubernetesClient Config object. + */ + public static Path exportKubernetesClientConfigToFile(io.fabric8.kubernetes.client.Config kubernetesClientConfig, Path targetKubeConfig) { + try { + io.fabric8.kubernetes.api.model.ConfigBuilder kubeConfigBuilder = new io.fabric8.kubernetes.api.model.ConfigBuilder(); + kubeConfigBuilder.addToClusters(createKubeConfigClusterFromClient(kubernetesClientConfig)); + kubeConfigBuilder.addToContexts(kubernetesClientConfig.getCurrentContext()); + kubeConfigBuilder.withCurrentContext(kubernetesClientConfig.getCurrentContext().getName()); + kubeConfigBuilder.addToUsers(createKubeConfigUserFromClient(kubernetesClientConfig)); + KubeConfigUtils.persistKubeConfigIntoFile(kubeConfigBuilder.build(), targetKubeConfig.toString()); + return targetKubeConfig; + } catch (IOException ioException) { + throw new JKubeException("Failure in exporting KubernetesClient config : " + ioException.getMessage()); + } + } + + private static NamedCluster createKubeConfigClusterFromClient(io.fabric8.kubernetes.client.Config kubernetesClientConfig) { + ClusterBuilder clusterBuilder = new ClusterBuilder(); + if (StringUtils.isNotBlank(kubernetesClientConfig.getMasterUrl())) { + clusterBuilder.withServer(kubernetesClientConfig.getMasterUrl()); + } + if (StringUtils.isNotBlank(kubernetesClientConfig.getCaCertFile())) { + clusterBuilder.withCertificateAuthority(kubernetesClientConfig.getCaCertFile()); + } + if (StringUtils.isNotBlank(kubernetesClientConfig.getCaCertData())) { + clusterBuilder.withCertificateAuthorityData(kubernetesClientConfig.getCaCertData()); + } + return new NamedClusterBuilder().withName(Optional.ofNullable(kubernetesClientConfig.getCurrentContext()) + .map(NamedContext::getContext) + .map(Context::getCluster) + .orElse(null)) + .withCluster(clusterBuilder.build()).build(); + } + + private static NamedAuthInfo createKubeConfigUserFromClient(io.fabric8.kubernetes.client.Config kubernetesClientConfig) { + NamedAuthInfoBuilder namedAuthInfoBuilder = new NamedAuthInfoBuilder(); + if (kubernetesClientConfig.getCurrentContext() != null && + kubernetesClientConfig.getCurrentContext().getContext() != null && + StringUtils.isNotBlank(kubernetesClientConfig.getCurrentContext().getContext().getUser())) { + namedAuthInfoBuilder.withName(kubernetesClientConfig.getCurrentContext().getContext().getUser()); + } + AuthInfoBuilder authInfoBuilder = new AuthInfoBuilder(); + if (StringUtils.isNotBlank(kubernetesClientConfig.getAutoOAuthToken())) { + authInfoBuilder.withToken(kubernetesClientConfig.getAutoOAuthToken()); + } + if (StringUtils.isNotBlank(kubernetesClientConfig.getOauthToken())) { + authInfoBuilder.withToken(kubernetesClientConfig.getOauthToken()); + } + if (StringUtils.isNotBlank(kubernetesClientConfig.getClientCertFile())) { + authInfoBuilder.withClientCertificate(kubernetesClientConfig.getClientCertFile()); + } + if (StringUtils.isNotBlank(kubernetesClientConfig.getClientCertData())) { + authInfoBuilder.withClientCertificateData(kubernetesClientConfig.getClientCertData()); + } + if (StringUtils.isNotBlank(kubernetesClientConfig.getClientKeyData())) { + authInfoBuilder.withClientKeyData(kubernetesClientConfig.getClientKeyData()); + } + if (StringUtils.isNotBlank(kubernetesClientConfig.getClientKeyFile())) { + authInfoBuilder.withClientKey(kubernetesClientConfig.getClientKeyFile()); + } + if (kubernetesClientConfig.getAuthProvider() != null) { + authInfoBuilder.withAuthProvider(kubernetesClientConfig.getAuthProvider()); + } + return namedAuthInfoBuilder.withUser(authInfoBuilder.build()).build(); + } } 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 0506d770d8..fa63ca1cc4 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 @@ -15,6 +15,7 @@ import java.io.File; import java.io.IOException; +import java.nio.file.Path; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.util.ArrayList; @@ -26,15 +27,23 @@ import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Stream; +import io.fabric8.kubernetes.api.model.AuthProviderConfigBuilder; import io.fabric8.kubernetes.api.model.ConfigMap; import io.fabric8.kubernetes.api.model.KubernetesResource; +import io.fabric8.kubernetes.api.model.NamedAuthInfo; +import io.fabric8.kubernetes.api.model.NamedCluster; +import io.fabric8.kubernetes.api.model.NamedContext; +import io.fabric8.kubernetes.api.model.NamedContextBuilder; import io.fabric8.kubernetes.api.model.Pod; import io.fabric8.kubernetes.api.model.authorization.v1.SelfSubjectAccessReview; import io.fabric8.kubernetes.api.model.authorization.v1.SelfSubjectAccessReviewBuilder; import io.fabric8.kubernetes.api.model.runtime.RawExtension; +import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; +import org.assertj.core.api.InstanceOfAssertFactories; +import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.KitLogger; import io.fabric8.kubernetes.api.model.ConfigMapBuilder; @@ -64,6 +73,7 @@ import org.eclipse.jkube.kit.common.TestHttpStaticServer; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -71,6 +81,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.entry; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatExceptionOfType; import static org.eclipse.jkube.kit.common.util.KubernetesHelper.hasAccessForAction; @EnableKubernetesMockClient(crud = true) @@ -441,6 +452,80 @@ void extractPodLabelSelector_withJobWithNoSelector_shouldReturnTemplateLabels() .containsEntry("template", "label"); } + + @Test + void exportKubernetesClientConfigToFile_whenInvalidFileProvided_thenThrowException(@TempDir Path temporaryFolder) { + // Given + io.fabric8.kubernetes.client.Config kubernetesClientConfig = createKubernetesClientConfig(); + + // When + Then + assertThatExceptionOfType(JKubeException.class) + .isThrownBy(() -> KubernetesHelper.exportKubernetesClientConfigToFile(kubernetesClientConfig, temporaryFolder.resolve("i-dont-exist").resolve("config"))) + .withMessageContaining("Failure in exporting KubernetesClient config "); + } + + @Test + void exportKubernetesClientConfigToFile_whenValidTargetFile_thenWriteKubeConfigToFile(@TempDir Path temporaryFolder) throws IOException { + // Given + io.fabric8.kubernetes.client.Config kubernetesClientConfig = createKubernetesClientConfig(); + + // When + Path exportedKubeConfig = KubernetesHelper.exportKubernetesClientConfigToFile(kubernetesClientConfig, temporaryFolder.resolve("config")); + + // Then + assertThat(exportedKubeConfig).isNotNull(); + assertThat(Serialization.unmarshal(exportedKubeConfig.toFile(), io.fabric8.kubernetes.api.model.Config.class)) + .hasFieldOrPropertyWithValue("currentContext", "cluster1-context") + .satisfies(c -> assertThat(c.getContexts()) + .singleElement(InstanceOfAssertFactories.type(NamedContext.class)) + .hasFieldOrPropertyWithValue("name", "cluster1-context") + .hasFieldOrPropertyWithValue("context.cluster", "example-openshiftapps-com:6443") + .hasFieldOrPropertyWithValue("context.namespace", "example-ns") + .hasFieldOrPropertyWithValue("context.user", "example-user/example-openshiftapps-com:6443")) + .satisfies(c -> assertThat(c.getClusters()) + .singleElement(InstanceOfAssertFactories.type(NamedCluster.class)) + .hasFieldOrPropertyWithValue("name", "example-openshiftapps-com:6443") + .hasFieldOrPropertyWithValue("cluster.server", "https://example-openshiftapps-com:6443/") + .hasFieldOrPropertyWithValue("cluster.certificateAuthority", "ca.crt") + .hasFieldOrPropertyWithValue("cluster.certificateAuthorityData", "cert-data")) + .satisfies(c -> assertThat(c.getUsers()) + .singleElement(InstanceOfAssertFactories.type(NamedAuthInfo.class)) + .hasFieldOrPropertyWithValue("name", "example-user/example-openshiftapps-com:6443") + .hasFieldOrPropertyWithValue("user.token", "oauth-token") + .hasFieldOrPropertyWithValue("user.clientCertificate", "client.crt") + .hasFieldOrPropertyWithValue("user.clientCertificateData", "client-certificate-data") + .hasFieldOrPropertyWithValue("user.clientKeyData", "client-key-data") + .hasFieldOrPropertyWithValue("user.clientKey", "client.key") + .hasFieldOrPropertyWithValue("user.authProvider.name", "test-auth-provider") + .hasFieldOrPropertyWithValue("user.authProvider.config.key1", "value1")); + } + + private Config createKubernetesClientConfig() { + NamedContext currentContext = new NamedContextBuilder().withName("cluster1-context") + .withNewContext() + .withCluster("example-openshiftapps-com:6443") + .withNamespace("example-ns") + .withUser("example-user/example-openshiftapps-com:6443") + .endContext() + .build(); + return new io.fabric8.kubernetes.client.ConfigBuilder(io.fabric8.kubernetes.client.Config.empty()) + .withCurrentContext(currentContext) + .withMasterUrl("https://example-openshiftapps-com:6443/") + .withAutoOAuthToken("secret-token") + .withOauthToken("oauth-token") + .withCaCertData("cert-data") + .withCaCertFile("ca.crt") + .withClientCertFile("client.crt") + .withClientCertData("client-certificate-data") + .withClientKeyFile("client.key") + .withClientKeyData("client-key-data") + .withAuthProvider(new AuthProviderConfigBuilder() + .withName("test-auth-provider") + .withConfig(Collections.singletonMap("key1", "value1")) + .build()) + .build(); + } + @ParameterizedTest @ValueSource(booleans = {true, false}) void hasAccessForAction_whenApiServerReturnsAccessReviewWithStatus_thenReturnAllowed(boolean allowed) { From 7d0d85a2e6a13f8c314cc4133329006150381975 Mon Sep 17 00:00:00 2001 From: Thulasithan Gnanenthiram <115763801+Thulasithang@users.noreply.github.com> Date: Fri, 14 Jun 2024 22:45:13 +0530 Subject: [PATCH 184/289] fix: replaced deprecated org.apache.commons.io.input.CountingInputStream with org.apache.commons.io.input.BoundedInputStreamRefactor (3149) refactor: Replace deprecated functions. Replaced deprecated org.apache.commons.io.input.CountingInputStream with org.apache.commons.io.input.BoundedInputStream. Signed-off-by: Thulasithang --- .../jkube/kit/resource/helm/oci/OCIManifestLayer.java | 7 +++---- .../jkube/kit/resource/helm/oci/OCIRegistryClient.java | 6 +++--- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/oci/OCIManifestLayer.java b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/oci/OCIManifestLayer.java index c6d4801b88..ec9a3d004b 100644 --- a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/oci/OCIManifestLayer.java +++ b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/oci/OCIManifestLayer.java @@ -19,7 +19,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.io.input.CountingInputStream; +import org.apache.commons.io.input.BoundedInputStream; import java.io.IOException; @@ -34,12 +34,11 @@ public class OCIManifestLayer { private String digest; private long size; - public static OCIManifestLayer from(CountingInputStream blobStream) throws IOException { + public static OCIManifestLayer from(BoundedInputStream blobStream) throws IOException { blobStream.mark(Integer.MAX_VALUE); final String digest = "sha256:" + DigestUtils.sha256Hex(blobStream); - final long size = blobStream.getByteCount(); + final long size = blobStream.getCount(); blobStream.reset(); - blobStream.resetByteCount(); return OCIManifestLayer.builder() .digest(digest) .size(size) diff --git a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/oci/OCIRegistryClient.java b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/oci/OCIRegistryClient.java index 65fdc5bbfe..c355988d5a 100644 --- a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/oci/OCIRegistryClient.java +++ b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/oci/OCIRegistryClient.java @@ -17,7 +17,7 @@ import io.fabric8.kubernetes.client.http.HttpRequest; import io.fabric8.kubernetes.client.http.HttpResponse; import io.fabric8.kubernetes.client.utils.URLUtils; -import org.apache.commons.io.input.CountingInputStream; +import org.apache.commons.io.input.BoundedInputStream; import org.apache.commons.lang3.StringUtils; import org.eclipse.jkube.kit.common.util.Serialization; import org.eclipse.jkube.kit.resource.helm.BadUploadException; @@ -69,7 +69,7 @@ public void uploadOCIManifest(Chart chart, OCIManifestLayer chartConfig, OCIMani } public OCIManifestLayer uploadBlobIfNotUploadedYet(Chart chart, InputStream inputStream) throws IOException, BadUploadException { - try (CountingInputStream blobStream = new CountingInputStream(inputStream)) { + try (BoundedInputStream blobStream = new BoundedInputStream(inputStream)) { final OCIManifestLayer ociBlob = OCIManifestLayer.from(blobStream); if (isLayerUploadedAlready(chart, ociBlob)) { return ociBlob; @@ -105,7 +105,7 @@ private String initiateUploadProcess(Chart chart) { } } - private OCIManifestLayer uploadBlob(String uploadUrl, CountingInputStream blobStream) throws IOException, BadUploadException { + private OCIManifestLayer uploadBlob(String uploadUrl, BoundedInputStream blobStream) throws IOException, BadUploadException { final OCIManifestLayer ociBlob = OCIManifestLayer.from(blobStream); HttpRequest httpRequest = newRequest() .url(new URLUtils.URLBuilder(uploadUrl).addQueryParameter("digest", ociBlob.getDigest()).build()) From d623b32b3220c67ae13a0304ea84d4d63d535750 Mon Sep 17 00:00:00 2001 From: Mukarram Haq Date: Mon, 17 Jun 2024 03:32:54 -0400 Subject: [PATCH 185/289] deps(buildpacks): bump pack version from 0.32.1 to 0.34.2 (3154) Removed unused import from OpenShiftWatchMojo Signed-off-by: Mukarram Haq --- Merge branch 'eclipse-jkube:master' into master --- Updated to the latest pack version --- Reverted jkube.version back to original --- Merge branch 'eclipse-jkube:master' into 2969 --- jkube-kit/parent/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index a36fdc5f85..36043329e4 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -126,7 +126,7 @@ 0.27.0 - 0.32.1 + 0.34.2 exe https://github.com/buildpacks/pack/releases/download/v${pack.version}/pack-v${pack.version}-linux.tgz https://github.com/buildpacks/pack/releases/download/v${pack.version}/pack-v${pack.version}-linux-arm64.tgz From be1f6e102c2748fb22b5459c19dfeff965972670 Mon Sep 17 00:00:00 2001 From: Arman Yekkehkhani <72594459+arman-yekkehkhani@users.noreply.github.com> Date: Mon, 17 Jun 2024 11:18:41 +0330 Subject: [PATCH 186/289] fix: replace AssertJ's deprecated asList() DSL method in IngressConfigTest chore(deprecated assertions): replace asList with asInstanceOf(...) , issue #3157 Signed-off-by: arman-yekkehkhani --- chore(deprecated method): replace ObjectMapper.configure with JsonMapper builder , issue #2527 Signed-off-by: arman-yekkehkhani --- .../config/resource/IngressConfigTest.java | 50 ++++++++++--------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/resource/IngressConfigTest.java b/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/resource/IngressConfigTest.java index 8ad56b4976..6d33da2d61 100644 --- a/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/resource/IngressConfigTest.java +++ b/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/resource/IngressConfigTest.java @@ -14,7 +14,8 @@ package org.eclipse.jkube.kit.config.resource; import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.json.JsonMapper; +import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.Test; import java.io.IOException; @@ -28,35 +29,38 @@ class IngressConfigTest { @Test void rawDeserialization() throws IOException { // Given - final ObjectMapper mapper = new ObjectMapper(); - mapper.configure(MapperFeature.USE_ANNOTATIONS, false); + final JsonMapper mapper = JsonMapper.builder() + .configure(MapperFeature.USE_ANNOTATIONS, false) + .build(); // When final IngressConfig result = mapper.readValue( IngressConfigTest.class.getResourceAsStream("/ingress-config.json"), IngressConfig.class); // Then assertThat(result) - .satisfies(ic -> assertThat(ic).extracting(IngressConfig::getIngressRules).asList().containsExactly( - IngressRuleConfig.builder() - .host("example.com") - .path(IngressRulePathConfig.builder() - .pathType("ImplementationSpecific") - .path("/path") - .serviceName("service-name") - .servicePort(8080) - .resource(IngressRulePathResourceConfig.builder() - .apiGroup("group.k8s.io") - .kind("ResourceKind") - .name("resource-name") + .satisfies(ic -> assertThat(ic).extracting(IngressConfig::getIngressRules) + .asInstanceOf(InstanceOfAssertFactories.list(IngressRuleConfig.class)) + .containsExactly( + IngressRuleConfig.builder() + .host("example.com") + .path(IngressRulePathConfig.builder() + .pathType("ImplementationSpecific") + .path("/path") + .serviceName("service-name") + .servicePort(8080) + .resource(IngressRulePathResourceConfig.builder() + .apiGroup("group.k8s.io") + .kind("ResourceKind") + .name("resource-name") + .build()) .build()) - .build()) - .build() - )) - .satisfies(ic -> assertThat(ic).extracting(IngressConfig::getIngressTlsConfigs).asList() - .hasSize(1) - .element(0) + .build())) + .satisfies(ic -> assertThat(ic).extracting(IngressConfig::getIngressTlsConfigs) + .asInstanceOf(InstanceOfAssertFactories.list(IngressTlsConfig.class)) + .singleElement() .hasFieldOrPropertyWithValue("secretName", "shhhh") - .extracting("hosts").asList().containsExactly("tls.example.com") - ); + .extracting("hosts") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) + .containsExactly("tls.example.com")); } } \ No newline at end of file From cf73bdcc43c3e0845e5e2499891f5111602463f4 Mon Sep 17 00:00:00 2001 From: Arman Yekkehkhani <72594459+arman-yekkehkhani@users.noreply.github.com> Date: Mon, 17 Jun 2024 14:56:26 +0330 Subject: [PATCH 187/289] test(helm): add new tests to verify push/pull config when init HelmPushMojo Signed-off-by: arman-yekkehkhani --- .../plugin/mojo/build/HelmPushMojoTest.java | 35 +++++++++++++++---- 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojoTest.java index 10c8ec20fe..543a014f6c 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmPushMojoTest.java @@ -16,6 +16,7 @@ import java.nio.file.Path; import java.util.HashMap; +import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugin.descriptor.PluginDescriptor; import org.eclipse.jkube.kit.common.RegistryServerConfiguration; import org.eclipse.jkube.kit.resource.helm.BadUploadException; @@ -80,6 +81,34 @@ void tearDown() { helmPushMojo = null; } + @Test + void init_withValidServer_shouldSetPullRegistry() throws MojoFailureException { + // Given + helmPushMojo.settings.addServer(completeValidServer()); + + // When + helmPushMojo.init(); + + // Then + assertThat(helmPushMojo.jkubeServiceHub.getConfiguration().getPullRegistryConfig().getSettings()).singleElement() + .isEqualTo(RegistryServerConfiguration.builder() + .id("SNAP-REPO").username("mavenUser").password("mavenPassword").configuration(new HashMap<>()).build()); + } + + @Test + void init_withValidServer_shouldSetPushRegistry() throws MojoFailureException { + // Given + helmPushMojo.settings.addServer(completeValidServer()); + + // When + helmPushMojo.init(); + + // Then + assertThat(helmPushMojo.jkubeServiceHub.getConfiguration().getPushRegistryConfig().getSettings()).singleElement() + .isEqualTo(RegistryServerConfiguration.builder() + .id("SNAP-REPO").username("mavenUser").password("mavenPassword").configuration(new HashMap<>()).build()); + } + @Test void execute_withValidXMLConfig_shouldUpload() throws Exception { try (MockedConstruction helmServiceMockedConstruction = mockConstruction(HelmService.class)) { @@ -166,12 +195,6 @@ void execute_withValidMavenSettings_shouldUpload() throws Exception { // When helmPushMojo.execute(); // Then - assertThat(helmPushMojo.jkubeServiceHub.getConfiguration().getPullRegistryConfig().getSettings()).singleElement() - .isEqualTo(RegistryServerConfiguration.builder() - .id("SNAP-REPO").username("mavenUser").password("mavenPassword").configuration(new HashMap<>()).build()); - assertThat(helmPushMojo.jkubeServiceHub.getConfiguration().getPushRegistryConfig().getSettings()).singleElement() - .isEqualTo(RegistryServerConfiguration.builder() - .id("SNAP-REPO").username("mavenUser").password("mavenPassword").configuration(new HashMap<>()).build()); assertThat(helmServiceMockedConstruction.constructed()).hasSize(1); verify(helmServiceMockedConstruction.constructed().get(0), times(1)).uploadHelmChart(helmPushMojo.helm); } From 1500dc4ddc57c23a117712ab4dfe5a1feb986939 Mon Sep 17 00:00:00 2001 From: Arman Yekkehkhani <72594459+arman-yekkehkhani@users.noreply.github.com> Date: Mon, 17 Jun 2024 17:24:59 +0330 Subject: [PATCH 188/289] fix: replace AssertJ's deprecated asList() DSL method in HelidonGeneratorTest Signed-off-by: arman-yekkehkhani --- .../generator/HelidonGeneratorTest.java | 27 ++++++++++++------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/jkube-kit/jkube-kit-helidon/src/test/java/org/eclipse/jkube/helidon/generator/HelidonGeneratorTest.java b/jkube-kit/jkube-kit-helidon/src/test/java/org/eclipse/jkube/helidon/generator/HelidonGeneratorTest.java index 855197e8a4..d74a85729a 100644 --- a/jkube-kit/jkube-kit-helidon/src/test/java/org/eclipse/jkube/helidon/generator/HelidonGeneratorTest.java +++ b/jkube-kit/jkube-kit-helidon/src/test/java/org/eclipse/jkube/helidon/generator/HelidonGeneratorTest.java @@ -17,6 +17,7 @@ import org.eclipse.jkube.generator.api.GeneratorContext; import org.eclipse.jkube.kit.common.Assembly; import org.eclipse.jkube.kit.common.AssemblyConfiguration; +import org.eclipse.jkube.kit.common.AssemblyFileSet; import org.eclipse.jkube.kit.common.Dependency; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; @@ -193,7 +194,8 @@ void customize_withStandardPackaging_hasJolokiaPort(){ final List result = new HelidonGenerator(ctx).customize(new ArrayList<>(), true); // Then assertThat(result).singleElement() - .extracting("buildConfiguration.ports").asList() + .extracting("buildConfiguration.ports") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .contains("8778"); } @@ -218,7 +220,8 @@ void customize_withStandardPackaging_hasPrometheusPort(){ final List result = new HelidonGenerator(ctx).customize(new ArrayList<>(), true); // Then assertThat(result).singleElement() - .extracting("buildConfiguration.ports").asList() + .extracting("buildConfiguration.ports") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .contains("9779"); } @@ -256,20 +259,25 @@ void customize_inKubernetesAndJarArtifact_shouldCreateAssembly() throws IOExcept .hasFieldOrPropertyWithValue("targetDir", "/deployments") .hasFieldOrPropertyWithValue("excludeFinalOutputArtifact", true) .extracting(AssemblyConfiguration::getLayers) - .asList().hasSize(2) + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)) + .hasSize(2) .satisfies(layers -> assertThat(layers).first().asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) .hasFieldOrPropertyWithValue("id", "libs") .extracting(Assembly::getFileSets) - .asList().singleElement() + .asInstanceOf(InstanceOfAssertFactories.list(AssemblyFileSet.class)) + .singleElement() .hasFieldOrPropertyWithValue("outputDirectory", new File(".")) - .extracting("includes").asList() + .extracting("includes") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .containsExactly("libs")) .satisfies(layers -> assertThat(layers).element(1).asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) .hasFieldOrPropertyWithValue("id", "artifact") .extracting(Assembly::getFileSets) - .asList().singleElement() + .asInstanceOf(InstanceOfAssertFactories.list(AssemblyFileSet.class)) + .singleElement() .hasFieldOrPropertyWithValue("outputDirectory", new File(".")) - .extracting("includes").asList() + .extracting("includes") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .containsExactly("sample.jar")); } @@ -293,9 +301,10 @@ void customize_inKubernetesAndNativeArtifact_shouldCreateNativeAssembly() throws .extracting(BuildConfiguration::getAssembly) .hasFieldOrPropertyWithValue("targetDir", "/") .extracting(AssemblyConfiguration::getLayers) - .asList().singleElement().asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)) + .singleElement().asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) .extracting(Assembly::getFileSets) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(AssemblyFileSet.class)) .hasSize(1) .flatExtracting("includes") .containsExactly("sample"); From b1a9e628258321002693ef5cb5e4a21058618e92 Mon Sep 17 00:00:00 2001 From: Joseph Victor Date: Tue, 18 Jun 2024 10:21:00 +0530 Subject: [PATCH 189/289] fix: removed duplicated getNewestPod method from PortForwardService in favor of KubernetesHelper.getNewestPod fix : Duplicated getNewestPod method is removed from PortForwardService and KubernetesHelper.getNewestPod is used instead Signed-off-by: Joseph Victor --- Merge branch 'eclipse-jkube:master' into master --- .../kit/config/service/PortForwardService.java | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/PortForwardService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/PortForwardService.java index 03fb91ece0..20bd44673d 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/PortForwardService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/PortForwardService.java @@ -140,7 +140,7 @@ public void eventReceived(Action action, Pod pod) { } else { candidatePods = Collections.singletonList(pod); } - Pod newPod = getNewestPod(candidatePods); // may be null + Pod newPod = KubernetesHelper.getNewestPod(candidatePods); // may be null if (!podEquals(nextForwardedPod[0], newPod)) { nextForwardedPod[0] = newPod; podChanged.signal(); @@ -200,25 +200,11 @@ private Pod getNewestPod(NamespacedKubernetesClient kubernetes, LabelSelector se PodList list = pods.list(); if (list != null) { List items = list.getItems(); - return getNewestPod(items); + return KubernetesHelper.getNewestPod(items); } return null; } - private Pod getNewestPod(List items) { - Pod targetPod = null; - if (items != null) { - for (Pod pod : items) { - if (KubernetesHelper.isPodWaiting(pod) || KubernetesHelper.isPodRunning(pod)) { - if (targetPod == null || (KubernetesHelper.isPodReady(pod) && KubernetesHelper.isNewerResource(pod, targetPod))) { - targetPod = pod; - } - } - } - } - return targetPod; - } - // Visible for test static LocalPortForward forwardPortAsync(NamespacedKubernetesClient kubernetes, String podName, int containerPort, int localPort) { return kubernetes.pods().withName(podName).portForward(containerPort, localPort); From 693cefac0e1321866f450730fce948b077569653 Mon Sep 17 00:00:00 2001 From: Thulasithan Gnanenthiram <115763801+Thulasithang@users.noreply.github.com> Date: Tue, 18 Jun 2024 13:16:39 +0530 Subject: [PATCH 190/289] fix: replace AssertJ's deprecated asList() DSL method in OpenShiftHelperTest Replaced AssertJ's deprecated asList() DSL method with asInstanceOf(InstanceOfAssertFactories.list(type.class)). Signed-off-by: Thulasithang --- .../eclipse/jkube/kit/common/util/OpenshiftHelperTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/OpenshiftHelperTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/OpenshiftHelperTest.java index a3c8abc60b..1dd634fde9 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/OpenshiftHelperTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/OpenshiftHelperTest.java @@ -20,6 +20,8 @@ import io.fabric8.openshift.api.model.Template; import io.fabric8.openshift.api.model.TemplateBuilder; import io.fabric8.openshift.client.OpenShiftClient; + +import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -129,7 +131,7 @@ void testProcessTemplatesLocallyNotNull() throws IOException { assertThat(result) .isNotNull() .extracting(KubernetesList::getItems) - .asList() + .asInstanceOf(InstanceOfAssertFactories.LIST) .singleElement() .isInstanceOf(Pod.class); From 8b3ddfae846d2b8f485b97b8dc199227ded3fddc Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Wed, 19 Jun 2024 15:23:15 +0530 Subject: [PATCH 191/289] chore (deps) : Bump helm-java version to v0.0.10 Signed-off-by: Rohan Kumar --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 085da7d669..49b2b0c07d 100644 --- a/pom.xml +++ b/pom.xml @@ -100,7 +100,7 @@ 0.0.5 3.0.21 33.2.0-jre - 0.0.9 + 0.0.10 2.17.1 0.8.12 2.5.1 From dfe163dc10aebfa470ed5cb825a1278345b11113 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Wed, 19 Jun 2024 13:57:47 +0200 Subject: [PATCH 192/289] deps(karaf): bump karaf from 4.4.3 to 4.4.6 Signed-off-by: Marc Nuri --- quickstarts/maven/karaf-camel-2-log/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/quickstarts/maven/karaf-camel-2-log/pom.xml b/quickstarts/maven/karaf-camel-2-log/pom.xml index 3f96238cb3..7c03a448bd 100644 --- a/quickstarts/maven/karaf-camel-2-log/pom.xml +++ b/quickstarts/maven/karaf-camel-2-log/pom.xml @@ -34,7 +34,7 @@ 11 ${project.version} 2.25.4 - 4.4.3 + 4.4.6
From 4da625ec8a3854c1480127d622b320b56ea4ba92 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Fri, 21 Jun 2024 10:38:19 +0530 Subject: [PATCH 193/289] test(common): kubernetes mock server config can be exported to a valid .kube/config file fix (jkube-kit/common) : Update `KubernetesHelper.exportKubernetesClientConfigToFile` to add opinionated Cluster Context When using KubernetesClient with Kubernetes Mock Server, `kubernetesClient.getConfiguration()` returns a Config object with no context set. Handle this case in KubernetesMockServerUtil to create opinionated Context until this gets fixed in KubernetesMockServer Signed-off-by: Rohan Kumar --- review: KubernetesMockServerUtil is chained to KubernetesHelper Signed-off-by: Marc Nuri --- .../kit/common/util/KubernetesHelper.java | 5 +- .../kit/common/util/KubernetesHelperTest.java | 32 +++++++++++++ .../common/util/KubernetesMockServerUtil.java | 46 +++++++++++++++++++ 3 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/KubernetesMockServerUtil.java 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 308812edee..977459fab2 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 @@ -13,12 +13,10 @@ */ package org.eclipse.jkube.kit.common.util; - import java.io.File; import java.io.IOException; import java.net.UnknownHostException; import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.nio.file.Path; import java.time.Instant; import java.time.format.DateTimeFormatter; @@ -860,6 +858,9 @@ private static NamedCluster createKubeConfigClusterFromClient(io.fabric8.kuberne if (StringUtils.isNotBlank(kubernetesClientConfig.getCaCertData())) { clusterBuilder.withCertificateAuthorityData(kubernetesClientConfig.getCaCertData()); } + if (kubernetesClientConfig.isTrustCerts()) { + clusterBuilder.withInsecureSkipTlsVerify(true); + } return new NamedClusterBuilder().withName(Optional.ofNullable(kubernetesClientConfig.getCurrentContext()) .map(NamedContext::getContext) .map(Context::getCluster) 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 fa63ca1cc4..df2a7049aa 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 @@ -72,6 +72,7 @@ import io.fabric8.openshift.api.model.Template; import org.eclipse.jkube.kit.common.TestHttpStaticServer; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; @@ -454,6 +455,7 @@ void extractPodLabelSelector_withJobWithNoSelector_shouldReturnTemplateLabels() @Test + @DisplayName("when invalid target kubeconfig file provided, then thrown exception") void exportKubernetesClientConfigToFile_whenInvalidFileProvided_thenThrowException(@TempDir Path temporaryFolder) { // Given io.fabric8.kubernetes.client.Config kubernetesClientConfig = createKubernetesClientConfig(); @@ -465,6 +467,36 @@ void exportKubernetesClientConfigToFile_whenInvalidFileProvided_thenThrowExcepti } @Test + @DisplayName("should work with KubernetesClient config provided by KubernetesMockServer") + void exportKubernetesClientConfigToFile_worksWithKubernetesMockServer(@TempDir Path temporaryFolder) throws IOException { + // When + final Path result = KubernetesMockServerUtil.exportKubernetesClientConfigToFile(mockServer, temporaryFolder.resolve("config")); + // Then + final io.fabric8.kubernetes.api.model.Config kc = Serialization + .unmarshal(result.toFile(), io.fabric8.kubernetes.api.model.Config.class); + assertThat(kc) + .hasFieldOrPropertyWithValue("currentContext", "mock-server") + .satisfies(c -> assertThat(c.getContexts()) + .singleElement(InstanceOfAssertFactories.type(NamedContext.class)) + .hasFieldOrPropertyWithValue("name", "mock-server") + .hasFieldOrPropertyWithValue("context.namespace", "test") + .hasFieldOrPropertyWithValue("context.user", "mock-server-user") + .extracting("context.cluster").asString() + .matches("localhost:\\d+") + ) + .satisfies(c -> assertThat(c.getClusters()) + .singleElement(InstanceOfAssertFactories.type(NamedCluster.class)) + .hasFieldOrPropertyWithValue("cluster.insecureSkipTlsVerify", true) + .extracting("cluster.server", "name") + .allMatch(s -> s.toString().matches("(https://)?localhost:\\d+/?")) + ) + .satisfies(c -> assertThat(c.getUsers()) + .singleElement(InstanceOfAssertFactories.type(NamedAuthInfo.class)) + .hasFieldOrPropertyWithValue("name", "mock-server-user")); + } + + @Test + @DisplayName("should work with valid kube config") void exportKubernetesClientConfigToFile_whenValidTargetFile_thenWriteKubeConfigToFile(@TempDir Path temporaryFolder) throws IOException { // Given io.fabric8.kubernetes.client.Config kubernetesClientConfig = createKubernetesClientConfig(); diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/KubernetesMockServerUtil.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/KubernetesMockServerUtil.java new file mode 100644 index 0000000000..2023ddce00 --- /dev/null +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/KubernetesMockServerUtil.java @@ -0,0 +1,46 @@ +/* + * 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.util; + +import io.fabric8.kubernetes.api.model.NamedContext; +import io.fabric8.kubernetes.api.model.NamedContextBuilder; +import io.fabric8.kubernetes.client.Config; +import io.fabric8.kubernetes.client.ConfigBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; + +import java.nio.file.Path; + +public class KubernetesMockServerUtil { + + private KubernetesMockServerUtil() { } + + // TODO: Remove after https://github.com/fabric8io/kubernetes-client/issues/6068 is fixed + public static Path exportKubernetesClientConfigToFile(KubernetesMockServer mockServer, Path targetKubeConfig) { + final KubernetesClient client = mockServer.createClient(); + final NamedContext mockServerContext = new NamedContextBuilder() + .withName("mock-server") + .withNewContext() + .withNamespace(client.getNamespace()) + .withCluster(String.format("%s:%d", mockServer.getHostName(), mockServer.getPort())) + .withUser("mock-server-user") + .endContext() + .build(); + final Config kubernetesClientConfig = new ConfigBuilder(client.getConfiguration()) + .addToContexts(mockServerContext) + .withCurrentContext(mockServerContext) + .build(); + return KubernetesHelper.exportKubernetesClientConfigToFile(kubernetesClientConfig, targetKubeConfig); + } +} From 36a35f6851bb2aa025f6d03c89a179590761ddd6 Mon Sep 17 00:00:00 2001 From: Edoardo Causarano Date: Fri, 21 Jun 2024 16:26:20 +0200 Subject: [PATCH 194/289] fix: don't unconditionally add latest tag in generators (3163) fix: don't unconditionally add latest tag Tag `latest` should not be added when image name contains pattern `%t`, or it will likely break immutable repositories that don't allow overwriting artifact tags. Signed-off-by: Edoardo Causarano --- fix (jkube-kit/generator) : Remove addLatestTagIfSnapshot method from BaseGenerator Signed-off-by: Rohan Kumar --- CHANGELOG.md | 1 + .../jkube/generator/api/support/BaseGenerator.java | 6 ------ .../generator/api/support/BaseGeneratorTest.java | 14 -------------- .../generator/javaexec/JavaExecGenerator.java | 1 - .../JavaExecGeneratorCustomPropertiesTest.java | 2 +- .../jkube/generator/karaf/KarafGenerator.java | 1 - .../jkube/generator/karaf/KarafGeneratorTest.java | 2 +- .../jkube/generator/webapp/WebAppGenerator.java | 1 - .../generator/webapp/WebAppGeneratorTest.java | 4 ++-- 9 files changed, 5 insertions(+), 27 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d1bf4d6a86..e6e54123d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Usage: ./scripts/extract-changelog-for-version.sh 1.3.37 5 ``` ### 1.17-SNAPSHOT +* Fix #3161: JavaExecGenerator should honor %t setting and not unconditionally add `latest` tag * Fix #2098: Add support for multi-platform container image builds in jib build strategy * Fix #2335: Add support for configuring nodeSelector spec for controller via xml/groovy DSL configuration * Fix #2459: Allow configuring Buildpacks build via ImageConfiguration diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java index 8fdc431136..f109d7aa49 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java @@ -234,12 +234,6 @@ protected boolean shouldAddGeneratedImageConfiguration(List return true; } - protected void addLatestTagIfSnapshot(BuildConfiguration.BuildConfigurationBuilder buildBuilder) { - if (getProject().getVersion().endsWith("-SNAPSHOT")) { - buildBuilder.tags(Collections.singletonList("latest")); - } - } - protected void addTagsFromConfig(BuildConfiguration.BuildConfigurationBuilder buildConfigurationBuilder) { String commaSeparatedTags = getConfigWithFallback(Config.TAGS, "jkube.generator.tags", null); if (StringUtils.isNotBlank(commaSeparatedTags)) { diff --git a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java index 49823cffb6..56ebe2002e 100644 --- a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java +++ b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java @@ -354,20 +354,6 @@ void shouldAddGeneratedImageConfiguration_whenAddEnabledViaProperty_shouldReturn assertThat(result).isTrue(); } - @Test - @DisplayName("add latest tag if project's version is SNAPSHOT") - void addLatestTagIfSnapshot() { - ctx = ctx.toBuilder().project(ctx.getProject().toBuilder().version("1.2-SNAPSHOT").build()).build(); - BuildConfiguration.BuildConfigurationBuilder builder = BuildConfiguration.builder(); - new TestBaseGenerator(ctx, "test-generator").addLatestTagIfSnapshot(builder); - BuildConfiguration config = builder.build(); - List tags = config.getTags(); - assertThat(tags) - .singleElement() - .asString() - .endsWith("latest"); - } - @Test @DisplayName("add tags from config") void addTagsFromConfig() { diff --git a/jkube-kit/generator/java-exec/src/main/java/org/eclipse/jkube/generator/javaexec/JavaExecGenerator.java b/jkube-kit/generator/java-exec/src/main/java/org/eclipse/jkube/generator/javaexec/JavaExecGenerator.java index 23c6d73929..cda568f14f 100644 --- a/jkube-kit/generator/java-exec/src/main/java/org/eclipse/jkube/generator/javaexec/JavaExecGenerator.java +++ b/jkube-kit/generator/java-exec/src/main/java/org/eclipse/jkube/generator/javaexec/JavaExecGenerator.java @@ -155,7 +155,6 @@ protected BuildConfiguration.BuildConfigurationBuilder initImageBuildConfigurati addJolokiaPort(buildBuilder); addPrometheusPort(buildBuilder); - addLatestTagIfSnapshot(buildBuilder); addTagsFromConfig(buildBuilder); buildBuilder.workdir(getBuildWorkdir()); buildBuilder.entryPoint(getBuildEntryPoint()); diff --git a/jkube-kit/generator/java-exec/src/test/java/org/eclipse/jkube/generator/javaexec/JavaExecGeneratorCustomPropertiesTest.java b/jkube-kit/generator/java-exec/src/test/java/org/eclipse/jkube/generator/javaexec/JavaExecGeneratorCustomPropertiesTest.java index e7e4d9c85b..3a78b9ca8c 100644 --- a/jkube-kit/generator/java-exec/src/test/java/org/eclipse/jkube/generator/javaexec/JavaExecGeneratorCustomPropertiesTest.java +++ b/jkube-kit/generator/java-exec/src/test/java/org/eclipse/jkube/generator/javaexec/JavaExecGeneratorCustomPropertiesTest.java @@ -60,7 +60,7 @@ void customizeWithOverriddenPropertiesShouldAddImageConfiguration() { .hasFieldOrPropertyWithValue("alias", "java-exec") .extracting(ImageConfiguration::getBuildConfiguration) .hasFieldOrPropertyWithValue("from", "custom-image") - .hasFieldOrPropertyWithValue("tags", Collections.singletonList("latest")) + .hasFieldOrPropertyWithValue("tags", Collections.emptyList()) .hasFieldOrPropertyWithValue("env", new HashMap(){{ put("JAVA_APP_DIR", "/other-dir"); put("JAVA_MAIN_CLASS", "com.example.Main"); diff --git a/jkube-kit/generator/karaf/src/main/java/org/eclipse/jkube/generator/karaf/KarafGenerator.java b/jkube-kit/generator/karaf/src/main/java/org/eclipse/jkube/generator/karaf/KarafGenerator.java index cfa0ede2e4..9bcf9abc85 100644 --- a/jkube-kit/generator/karaf/src/main/java/org/eclipse/jkube/generator/karaf/KarafGenerator.java +++ b/jkube-kit/generator/karaf/src/main/java/org/eclipse/jkube/generator/karaf/KarafGenerator.java @@ -76,7 +76,6 @@ public List customize(List configs, bool if (!prePackagePhase) { buildBuilder.assembly(createDefaultAssembly()); } - addLatestTagIfSnapshot(buildBuilder); addTagsFromConfig(buildBuilder); imageBuilder .name(getImageName()) diff --git a/jkube-kit/generator/karaf/src/test/java/org/eclipse/jkube/generator/karaf/KarafGeneratorTest.java b/jkube-kit/generator/karaf/src/test/java/org/eclipse/jkube/generator/karaf/KarafGeneratorTest.java index 1ee87f01af..a436a2cdde 100644 --- a/jkube-kit/generator/karaf/src/test/java/org/eclipse/jkube/generator/karaf/KarafGeneratorTest.java +++ b/jkube-kit/generator/karaf/src/test/java/org/eclipse/jkube/generator/karaf/KarafGeneratorTest.java @@ -93,7 +93,7 @@ void customizeWithKarafMavenPluginShouldAddImageConfiguration() { .hasFieldOrPropertyWithValue("name", "%g/%a:%l") .hasFieldOrPropertyWithValue("alias", "karaf") .extracting(ImageConfiguration::getBuildConfiguration) - .hasFieldOrPropertyWithValue("tags", Collections.singletonList("latest")) + .hasFieldOrPropertyWithValue("tags", Collections.emptyList()) .hasFieldOrPropertyWithValue("ports", Arrays.asList("8181", "8778")) .extracting(BuildConfiguration::getEnv) .asInstanceOf(InstanceOfAssertFactories.MAP) diff --git a/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/WebAppGenerator.java b/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/WebAppGenerator.java index b15a1e4f34..6fde29558b 100644 --- a/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/WebAppGenerator.java +++ b/jkube-kit/generator/webapp/src/main/java/org/eclipse/jkube/generator/webapp/WebAppGenerator.java @@ -129,7 +129,6 @@ public List customize(List configs, bool if (!prePackagePhase) { buildBuilder.assembly(createAssembly(handler)); } - addLatestTagIfSnapshot(buildBuilder); addTagsFromConfig(buildBuilder); imageBuilder .name(getImageName()) diff --git a/jkube-kit/generator/webapp/src/test/java/org/eclipse/jkube/generator/webapp/WebAppGeneratorTest.java b/jkube-kit/generator/webapp/src/test/java/org/eclipse/jkube/generator/webapp/WebAppGeneratorTest.java index 8180a839cc..508439c9bb 100644 --- a/jkube-kit/generator/webapp/src/test/java/org/eclipse/jkube/generator/webapp/WebAppGeneratorTest.java +++ b/jkube-kit/generator/webapp/src/test/java/org/eclipse/jkube/generator/webapp/WebAppGeneratorTest.java @@ -118,7 +118,7 @@ void withDefaultHandler_shouldAddImageConfiguration() throws IOException { .hasFieldOrPropertyWithValue("name", "%g/%a:%l") .hasFieldOrPropertyWithValue("alias", "webapp") .extracting(ImageConfiguration::getBuildConfiguration) - .hasFieldOrPropertyWithValue("tags", Collections.singletonList("latest")) + .hasFieldOrPropertyWithValue("tags", Collections.emptyList()) .hasFieldOrPropertyWithValue("ports", Collections.singletonList("8080")) .hasFieldOrPropertyWithValue("env", new HashMap() {{ put("DEPLOY_DIR", "/deployments"); @@ -164,7 +164,7 @@ void withOverriddenProperties_shouldAddImageConfiguration() throws IOException { .hasFieldOrPropertyWithValue("name", "%a:%l") .hasFieldOrPropertyWithValue("alias", "webapp") .extracting(ImageConfiguration::getBuildConfiguration) - .hasFieldOrPropertyWithValue("tags", Collections.singletonList("latest")) + .hasFieldOrPropertyWithValue("tags", Collections.emptyList()) .hasFieldOrPropertyWithValue("ports", Arrays.asList("8082", "80")) .hasFieldOrPropertyWithValue("env", Collections.singletonMap("DEPLOY_DIR", "/other-dir")) .hasFieldOrPropertyWithValue("cmd.shell", "sleep 3600") From d88ad23aa5a3651b1f570f14add5bdda6b410c0e Mon Sep 17 00:00:00 2001 From: Clarence Dimitri CHARLES Date: Fri, 21 Jun 2024 19:18:22 +0200 Subject: [PATCH 195/289] refactor: add abstract class for helm-related tasks (3166) Created the Abstract HelmTask --- All the helm tasks now uses the AbstractHelmTask --- Unused import --- Fix tests --- Some refactorings and fix the tests --- Add license header to AbstractHelmTask --- Remove unused imports --- review: abstract helm task Signed-off-by: Marc Nuri --- .../gradle/plugin/task/AbstractHelmTask.java | 44 +++++++++++++++++++ .../gradle/plugin/task/AbstractJKubeTask.java | 2 +- .../KubernetesHelmDependencyUpdateTask.java | 39 +++++++--------- .../plugin/task/KubernetesHelmLintTask.java | 12 +---- .../plugin/task/KubernetesHelmPushTask.java | 13 ++---- .../plugin/task/KubernetesHelmTask.java | 8 +--- 6 files changed, 68 insertions(+), 50 deletions(-) create mode 100644 gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractHelmTask.java diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractHelmTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractHelmTask.java new file mode 100644 index 0000000000..cc08075198 --- /dev/null +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractHelmTask.java @@ -0,0 +1,44 @@ +/* + * 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.gradle.plugin.task; + +import org.eclipse.jkube.gradle.plugin.KubernetesExtension; + +import java.io.IOException; + +import static org.eclipse.jkube.kit.resource.helm.HelmServiceUtil.initHelmConfig; + +public abstract class AbstractHelmTask extends AbstractJKubeTask { + + protected AbstractHelmTask(Class extensionClass) { + super(extensionClass); + } + + @Override + protected void init() { + super.init(); + + try { + kubernetesExtension.helm = initHelmConfig( + kubernetesExtension.getDefaultHelmType(), + kubernetesExtension.javaProject, + kubernetesExtension.getKubernetesTemplateOrDefault(), + kubernetesExtension.helm + ).build(); + } catch (IOException e) { + throw new IllegalStateException(e.getMessage(), e); + } + } + +} diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java index c8c168800c..8012efff1f 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java @@ -77,7 +77,7 @@ public final void runTask() { run(); } - private void init() { + protected void init() { kubernetesExtension.javaProject = GradleUtil.convertGradleProject(getProject()); kitLogger = createLogger(null); clusterAccess = new ClusterAccess(initClusterConfiguration()); diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmDependencyUpdateTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmDependencyUpdateTask.java index 7ffc6e325f..db15bc36aa 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmDependencyUpdateTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmDependencyUpdateTask.java @@ -18,29 +18,22 @@ import javax.inject.Inject; -import static org.eclipse.jkube.kit.resource.helm.HelmServiceUtil.initHelmConfig; -public class KubernetesHelmDependencyUpdateTask extends AbstractJKubeTask { - @Inject - public KubernetesHelmDependencyUpdateTask(Class extensionClass) { - super(extensionClass); - setDescription("Update the on-disk dependencies to mirror Chart.yaml"); - } +public class KubernetesHelmDependencyUpdateTask extends AbstractHelmTask { + + @Inject + public KubernetesHelmDependencyUpdateTask(Class extensionClass) { + super(extensionClass); + setDescription("Update the on-disk dependencies to mirror Chart.yaml"); + } - @Override - public void run() { - if (kubernetesExtension.getSkipOrDefault()) { - return; - } - try { - final HelmConfig helm = initHelmConfig(kubernetesExtension.getDefaultHelmType(), kubernetesExtension.javaProject, - kubernetesExtension.getKubernetesTemplateOrDefault(), - kubernetesExtension.helm) - .build(); - jKubeServiceHub.getHelmService().dependencyUpdate(helm); - } catch (Exception exp) { - kitLogger.error("Error performing helm dependency update", exp); - throw new IllegalStateException(exp.getMessage(), exp); - } + @Override + public void run() { + try { + jKubeServiceHub.getHelmService().dependencyUpdate(kubernetesExtension.helm); + } catch (Exception exp) { + kitLogger.error("Error performing helm dependency update", exp); + throw new IllegalStateException(exp.getMessage(), exp); } -} \ No newline at end of file + } +} diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmLintTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmLintTask.java index d599f5a78e..d077cc673d 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmLintTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmLintTask.java @@ -18,9 +18,8 @@ import javax.inject.Inject; -import static org.eclipse.jkube.kit.resource.helm.HelmServiceUtil.initHelmConfig; +public class KubernetesHelmLintTask extends AbstractHelmTask { -public class KubernetesHelmLintTask extends AbstractJKubeTask { @Inject public KubernetesHelmLintTask(Class extensionClass) { super(extensionClass); @@ -29,15 +28,8 @@ public KubernetesHelmLintTask(Class extensionClas @Override public void run() { - if (kubernetesExtension.getSkipOrDefault()) { - return; - } try { - final HelmConfig helm = initHelmConfig(kubernetesExtension.getDefaultHelmType(), kubernetesExtension.javaProject, - kubernetesExtension.getKubernetesTemplateOrDefault(), - kubernetesExtension.helm) - .build(); - jKubeServiceHub.getHelmService().lint(helm); + jKubeServiceHub.getHelmService().lint(kubernetesExtension.helm); } catch (Exception exp) { kitLogger.error("Error performing helm lint", exp); throw new IllegalStateException(exp.getMessage(), exp); diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmPushTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmPushTask.java index 728b456d10..7490e3cb87 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmPushTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmPushTask.java @@ -18,10 +18,9 @@ import javax.inject.Inject; -import static org.eclipse.jkube.kit.resource.helm.HelmServiceUtil.initHelmConfig; import static org.eclipse.jkube.kit.resource.helm.HelmServiceUtil.initHelmPushConfig; -public class KubernetesHelmPushTask extends AbstractJKubeTask { +public class KubernetesHelmPushTask extends AbstractHelmTask { @Inject public KubernetesHelmPushTask(Class extensionClass) { super(extensionClass); @@ -30,15 +29,9 @@ public KubernetesHelmPushTask(Class extensionClas @Override public void run() { - if (kubernetesExtension.getSkipOrDefault()) { - return; - } try { - HelmConfig helm = initHelmConfig(kubernetesExtension.getDefaultHelmType(), kubernetesExtension.javaProject, - kubernetesExtension.getKubernetesTemplateOrDefault(), - kubernetesExtension.helm).build(); - initHelmPushConfig(helm, kubernetesExtension.javaProject); - jKubeServiceHub.getHelmService().uploadHelmChart(helm); + initHelmPushConfig(kubernetesExtension.helm, kubernetesExtension.javaProject); + jKubeServiceHub.getHelmService().uploadHelmChart(kubernetesExtension.helm); } catch (Exception exp) { kitLogger.error("Error performing Helm push", exp); throw new IllegalStateException(exp.getMessage(), exp); diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmTask.java index 7d0988ca0b..962494565c 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmTask.java @@ -20,9 +20,8 @@ import java.io.File; import java.io.IOException; -import static org.eclipse.jkube.kit.resource.helm.HelmServiceUtil.initHelmConfig; +public class KubernetesHelmTask extends AbstractHelmTask { -public class KubernetesHelmTask extends AbstractJKubeTask { @Inject public KubernetesHelmTask(Class extensionClass) { super(extensionClass); @@ -36,10 +35,7 @@ public void run() { if (manifest == null || !manifest.isFile()) { logManifestNotFoundWarning(manifest); } - HelmConfig helm = initHelmConfig(kubernetesExtension.getDefaultHelmType(), kubernetesExtension.javaProject, - kubernetesExtension.getKubernetesTemplateOrDefault(), - kubernetesExtension.helm).build(); - jKubeServiceHub.getHelmService().generateHelmCharts(helm); + jKubeServiceHub.getHelmService().generateHelmCharts(kubernetesExtension.helm); } catch (IOException exception) { throw new IllegalStateException(exception.getMessage(), exception); } From 2b4a30a79dee8e2e0f26a4dd15a7633e9525abd4 Mon Sep 17 00:00:00 2001 From: "Ashish K.Choudhary" <91479132+CroWzblooD@users.noreply.github.com> Date: Tue, 25 Jun 2024 10:23:01 +0530 Subject: [PATCH 196/289] fix: removed Exception never thrown by EnvUtilTest.testLoadTimestampShouldLoadFromFile (3052) issue: 3052 --- .../java/org/eclipse/jkube/kit/common/util/EnvUtilTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/EnvUtilTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/EnvUtilTest.java index 968473492e..4cf53bd623 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/EnvUtilTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/EnvUtilTest.java @@ -279,7 +279,7 @@ void testStoreTimestamp(@TempDir File temporaryFolder) throws IOException { } @Test - void testLoadTimestampShouldLoadFromFile() throws Exception { + void testLoadTimestampShouldLoadFromFile() { // Given final File file = new File(EnvUtilTest.class.getResource("/util/loadTimestamp.timestamp").getFile()); // When From 965dd5cb115960c23f46c6ba99d7b6ca68483f6e Mon Sep 17 00:00:00 2001 From: Jinhong <139559460+Flowers2Algernon@users.noreply.github.com> Date: Tue, 25 Jun 2024 14:32:05 +0800 Subject: [PATCH 197/289] fix: replace AssertJ's deprecated asList() DSL method with asInstanceOf in WildflyJARHealthCheckEnricherTest, WildflyJARGeneratorTest, VertxHealthCheckEnricherTest (3189) Replace AssertJ's deprecated asList() DSL method with asInstanceOf in WildflyJARHealthCheckEnricherTest --- Replace AssertJ's deprecated asList() DSL method with asInstanceOf in WildflyJARGeneratorTest.java --- Replace AssertJ's deprecated asList() DSL method with asInstanceOf in VertxHealthCheckEnricherTest.java --- review: remove wildcard import Signed-off-by: Marc Nuri --- .../VertxHealthCheckEnricherTest.java | 15 +++++----- .../WildflyJARHealthCheckEnricherTest.java | 30 ++++++++++--------- .../generator/WildflyJARGeneratorTest.java | 5 ++-- 3 files changed, 27 insertions(+), 23 deletions(-) diff --git a/jkube-kit/jkube-kit-vertx/src/test/java/org/eclipse/jkube/vertx/enricher/VertxHealthCheckEnricherTest.java b/jkube-kit/jkube-kit-vertx/src/test/java/org/eclipse/jkube/vertx/enricher/VertxHealthCheckEnricherTest.java index 936b4d94eb..c957b79720 100644 --- a/jkube-kit/jkube-kit-vertx/src/test/java/org/eclipse/jkube/vertx/enricher/VertxHealthCheckEnricherTest.java +++ b/jkube-kit/jkube-kit-vertx/src/test/java/org/eclipse/jkube/vertx/enricher/VertxHealthCheckEnricherTest.java @@ -23,6 +23,7 @@ import java.util.stream.Stream; import io.fabric8.kubernetes.api.model.ExecAction; +import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.Plugin; @@ -511,14 +512,14 @@ void withExecTypeUsingConfig_shouldConfigureProbesWithExec() throws Exception { assertThat(livenessProbe).isNotNull() .extracting(Probe::getExec) .extracting(ExecAction::getCommand) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .hasSize(3); Probe readinessProbe = enricher.getReadinessProbe(); assertThat(readinessProbe).isNotNull() .extracting(Probe::getExec) .extracting(ExecAction::getCommand) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .hasSize(3); } @@ -541,7 +542,7 @@ void withExecTypeReadinessUsingConfig_shouldDisableLiveness() throws Exception { Probe readinessProbe = enricher.getReadinessProbe(); assertThat(readinessProbe).isNotNull() .extracting(Probe::getExec) - .extracting(ExecAction::getCommand).asList() + .extracting(ExecAction::getCommand).asInstanceOf(InstanceOfAssertFactories.list(String.class)) .hasSize(3); } @@ -561,7 +562,7 @@ void withExecTypeLivenessUsingConfig_shouldDisableReadiness() throws Exception { Probe livenessProbe = enricher.getLivenessProbe(); assertThat(livenessProbe).isNotNull() .extracting(Probe::getExec) - .extracting(ExecAction::getCommand).asList() + .extracting(ExecAction::getCommand).asInstanceOf(InstanceOfAssertFactories.list(String.class)) .hasSize(3); Probe readinessProbe = enricher.getReadinessProbe(); @@ -670,7 +671,7 @@ void specificConfigOverrideGenericUserProperties() throws Exception { assertThat(livenessProbe).isNotNull() .hasFieldOrPropertyWithValue("tcpSocket", null) .extracting(Probe::getExec).isNotNull() - .extracting(ExecAction::getCommand).asList() + .extracting(ExecAction::getCommand).asInstanceOf(InstanceOfAssertFactories.list(String.class)) .singleElement() .isEqualTo("ls"); } @@ -690,7 +691,7 @@ void withGenericConfig_shouldOverrideGenericUserProperties() throws Exception { assertThat(readinessProbe).isNotNull() .hasFieldOrPropertyWithValue("tcpSocket", null) .extracting(Probe::getExec).isNotNull() - .extracting(ExecAction::getCommand).asList() + .extracting(ExecAction::getCommand).asInstanceOf(InstanceOfAssertFactories.list(String.class)) .singleElement() .isEqualTo("ls"); @@ -698,7 +699,7 @@ void withGenericConfig_shouldOverrideGenericUserProperties() throws Exception { assertThat(livenessProbe).isNotNull() .hasFieldOrPropertyWithValue("tcpSocket", null) .extracting(Probe::getExec).isNotNull() - .extracting(ExecAction::getCommand).asList() + .extracting(ExecAction::getCommand).asInstanceOf(InstanceOfAssertFactories.list(String.class)) .singleElement() .isEqualTo("ls"); } diff --git a/jkube-kit/jkube-kit-wildfly-jar/src/test/java/org/eclipse/jkube/wildfly/jar/enricher/WildflyJARHealthCheckEnricherTest.java b/jkube-kit/jkube-kit-wildfly-jar/src/test/java/org/eclipse/jkube/wildfly/jar/enricher/WildflyJARHealthCheckEnricherTest.java index ed1c3f35eb..ae9b93db33 100644 --- a/jkube-kit/jkube-kit-wildfly-jar/src/test/java/org/eclipse/jkube/wildfly/jar/enricher/WildflyJARHealthCheckEnricherTest.java +++ b/jkube-kit/jkube-kit-wildfly-jar/src/test/java/org/eclipse/jkube/wildfly/jar/enricher/WildflyJARHealthCheckEnricherTest.java @@ -13,14 +13,14 @@ */ package org.eclipse.jkube.wildfly.jar.enricher; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - +import io.fabric8.kubernetes.api.builder.TypedVisitor; +import io.fabric8.kubernetes.api.model.ContainerBuilder; import io.fabric8.kubernetes.api.model.ContainerFluent; +import io.fabric8.kubernetes.api.model.EnvVar; +import io.fabric8.kubernetes.api.model.KubernetesListBuilder; +import io.fabric8.kubernetes.api.model.Probe; +import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder; +import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.kit.common.Dependency; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.Plugin; @@ -29,20 +29,22 @@ import org.eclipse.jkube.kit.config.resource.ProcessorConfig; import org.eclipse.jkube.kit.enricher.api.JKubeEnricherContext; import org.eclipse.jkube.kit.enricher.api.model.Configuration; - -import io.fabric8.kubernetes.api.builder.TypedVisitor; -import io.fabric8.kubernetes.api.model.ContainerBuilder; -import io.fabric8.kubernetes.api.model.KubernetesListBuilder; -import io.fabric8.kubernetes.api.model.Probe; -import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; + class WildflyJARHealthCheckEnricherTest { protected JKubeEnricherContext context; @@ -281,7 +283,7 @@ public void visit(ContainerBuilder containerBuilder) { }); assertThat(containerBuilders).singleElement() - .extracting(ContainerFluent::buildEnv).asList() + .extracting(ContainerFluent::buildEnv).asInstanceOf(InstanceOfAssertFactories.list(EnvVar.class)) .singleElement() .hasFieldOrPropertyWithValue("name", "HOSTNAME") .extracting("valueFrom.fieldRef.fieldPath").isNotNull() diff --git a/jkube-kit/jkube-kit-wildfly-jar/src/test/java/org/eclipse/jkube/wildfly/jar/generator/WildflyJARGeneratorTest.java b/jkube-kit/jkube-kit-wildfly-jar/src/test/java/org/eclipse/jkube/wildfly/jar/generator/WildflyJARGeneratorTest.java index 57d6725bb8..9644e4fb82 100644 --- a/jkube-kit/jkube-kit-wildfly-jar/src/test/java/org/eclipse/jkube/wildfly/jar/generator/WildflyJARGeneratorTest.java +++ b/jkube-kit/jkube-kit-wildfly-jar/src/test/java/org/eclipse/jkube/wildfly/jar/generator/WildflyJARGeneratorTest.java @@ -23,6 +23,7 @@ import java.util.List; import java.util.Map; +import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.generator.api.GeneratorContext; import org.eclipse.jkube.kit.common.AssemblyFileSet; import org.eclipse.jkube.kit.common.JavaProject; @@ -105,7 +106,7 @@ void slimServer() throws IOException { assertThat(fileSets).isNotEmpty() .last() .hasFieldOrPropertyWithValue("directory", targetDir.toFile()) - .extracting(AssemblyFileSet::getIncludes).asList() + .extracting(AssemblyFileSet::getIncludes).asInstanceOf(InstanceOfAssertFactories.list(String.class)) .singleElement() .isEqualTo("myrepo"); } @@ -137,7 +138,7 @@ void slimServerAbsoluteDir() throws IOException { assertThat(fileSets).isNotEmpty() .last() .hasFieldOrPropertyWithValue("directory", targetDir.toFile()) - .extracting(AssemblyFileSet::getIncludes).asList() + .extracting(AssemblyFileSet::getIncludes).asInstanceOf(InstanceOfAssertFactories.list(String.class)) .singleElement() .isEqualTo("myrepo"); } From c6c87a07fb9bff615080cf2ab417028fe051f71b Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Tue, 25 Jun 2024 13:04:01 +0530 Subject: [PATCH 198/289] fix: remove storageClass related fields from VolumePermissionEnricher Signed-off-by: Rohan Kumar --- CHANGELOG.md | 5 +++ .../plugin/tests/VolumePermissionIT.java | 4 +-- .../_jkube_volume_permission.adoc | 14 -------- ...istentVolumeClaimStorageClassEnricher.java | 9 ++---- .../generic/VolumePermissionEnricher.java | 32 ------------------- ...ntVolumeClaimStorageClassEnricherTest.java | 4 +-- .../pom.xml | 4 ++- .../pom.xml | 6 ++-- 8 files changed, 17 insertions(+), 61 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e6e54123d9..83d27db13f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Usage: ./scripts/extract-changelog-for-version.sh 1.3.37 5 ``` ### 1.17-SNAPSHOT +* Fix #1989: Remove storageClass related fields from VolumePermissionEnricher * Fix #3161: JavaExecGenerator should honor %t setting and not unconditionally add `latest` tag * Fix #2098: Add support for multi-platform container image builds in jib build strategy * Fix #2335: Add support for configuring nodeSelector spec for controller via xml/groovy DSL configuration @@ -39,6 +40,10 @@ Usage: * Fix #2110: Add new helm dependency update goal task (`k8s:helm-dependency-update` for maven and `k8sHelmDependencyUpdate` for gradle) * Fix #3122: JKube should also pass project directory in `buildpacks` build strategy * Fix #2467: Add support for specifying imagePullSecrets via resource configuration + +_**Note**_: +- `defaultStorageClass` and `useStorageClassAnnotation` fields have been removed from VolumePermissionEnricher (`jkube-volume-permission`). Users are advised to use these fields from PersistentVolumeClaimStorageClassEnricher (`jkube-persistentvolumeclaim-storageclass`) instead. + ### 1.16.2 (2024-03-27) * Fix #2461: `k8s:watch`/`k8sWatch` should throw error in `buildpacks` build strategy * Fix #2852: Bump version.kubernetes-client from 6.10.0 to 6.11.0 diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/VolumePermissionIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/VolumePermissionIT.java index 2c19d6c7f8..52032cd181 100644 --- a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/VolumePermissionIT.java +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/VolumePermissionIT.java @@ -37,8 +37,8 @@ class VolumePermissionIT { static Stream data() { return Stream.of( arguments("default", new String[] {}), - arguments("custom-storageclass-annotation", new String[] {"-Pjkube.enricher.jkube-volume-permission.defaultStorageClass=cheese", "-Pjkube.enricher.jkube-volume-permission.useStorageClassAnnotation=true"}), - arguments("custom-storageclass", new String[] {"-Pjkube.enricher.jkube-volume-permission.defaultStorageClass=cheese"}) + arguments("custom-storageclass-annotation", new String[] {"-Pjkube.enricher.jkube-persistentvolumeclaim-storageclass.defaultStorageClass=cheese", "-Pjkube.enricher.jkube-persistentvolumeclaim-storageclass.useStorageClassAnnotation=true"}), + arguments("custom-storageclass", new String[] {"-Pjkube.enricher.jkube-persistentvolumeclaim-storageclass.defaultStorageClass=cheese"}) ); } diff --git a/jkube-kit/doc/src/main/asciidoc/inc/enricher/volume-permission/_jkube_volume_permission.adoc b/jkube-kit/doc/src/main/asciidoc/inc/enricher/volume-permission/_jkube_volume_permission.adoc index 5deb89fab8..cb8dcd7f23 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/enricher/volume-permission/_jkube_volume_permission.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/enricher/volume-permission/_jkube_volume_permission.adoc @@ -22,20 +22,6 @@ Enricher which fixes the permission of persistent volume mount with the help of Defaults to `777`. | `jkube.enricher.jkube-volume-permission.permission` -| *defaultStorageClass* -| _Deprecated: Use <>'s defaultStorageClass field_ - -PersistentVolume storage class. -| `jkube.enricher.jkube-volume-permission.defaultStorageClass` - -| *useStorageClassAnnotation* -| _Deprecated: Use <>'s defaultStorageClass field_ - -If enabled, storage class would be added to PersistentVolumeClaim metadata as `volume.beta.kubernetes.io/storage-class=` annotation rather than `.spec.storageClassName` - -Defaults to `false` -| `jkube.enricher.jkube-volume-permission.useStorageClassAnnotation` - | *cpuLimit* | Set PersistentVolume *initContainer*'s `.resources` CPU limit | `jkube.enricher.jkube-volume-permission.cpuLimit` diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/PersistentVolumeClaimStorageClassEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/PersistentVolumeClaimStorageClassEnricher.java index 23b89d5145..39cd19a387 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/PersistentVolumeClaimStorageClassEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/PersistentVolumeClaimStorageClassEnricher.java @@ -66,11 +66,7 @@ public void visit(PersistentVolumeClaimBuilder pvcBuilder) { } private boolean shouldUseAnnotation() { - if (Boolean.TRUE.equals(Boolean.parseBoolean(getConfig(Config.USE_ANNOTATION)))) { - return true; - } - VolumePermissionEnricher volumePermissionEnricher = new VolumePermissionEnricher((JKubeEnricherContext) getContext()); - return Boolean.TRUE.equals(volumePermissionEnricher.shouldUseAnnotation()); + return Boolean.parseBoolean(getConfig(Config.USE_ANNOTATION)); } private String getStorageClass() { @@ -78,7 +74,6 @@ private String getStorageClass() { if (StringUtils.isNotBlank(storageClassConfig)) { return storageClassConfig; } - VolumePermissionEnricher volumePermissionEnricher = new VolumePermissionEnricher((JKubeEnricherContext) getContext()); - return volumePermissionEnricher.getDefaultStorageClass(); + return null; } } diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/VolumePermissionEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/VolumePermissionEnricher.java index abeef50d08..16ea4385e4 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/VolumePermissionEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/VolumePermissionEnricher.java @@ -55,16 +55,6 @@ public class VolumePermissionEnricher extends BaseEnricher { enum Config implements Configs.Config { IMAGE_NAME("imageName", "quay.io/quay/busybox"), PERMISSION("permission", "777"), - /** - * @deprecated Use configuration field in PersistentVolumeClaimStorageClassEnricher - */ - @Deprecated - DEFAULT_STORAGE_CLASS("defaultStorageClass", null), - /** - * @deprecated Use configuration field in PersistentVolumeClaimStorageClassEnricher - */ - @Deprecated - USE_ANNOTATION("useStorageClassAnnotation", "false"), CPU_LIMIT("cpuLimit", null), CPU_REQUEST("cpuRequest", null), MEMORY_LIMIT("memoryLimit", null), @@ -206,26 +196,4 @@ private Map createResourcesMap(Configs.Config cpu, Configs.Con } }); } - - /** - * Get useAnnotation from enricher configuration - * TODO: This method is kept only for backward compatibility. This should - * be removed in future. See GitHub Issue for more details - * - * @return boolean value indicating whether StorageClass annotation should be used or not - */ - public boolean shouldUseAnnotation() { - return Boolean.parseBoolean(getConfig(Config.USE_ANNOTATION)); - } - - /** - * Get Default StorageClass from enricher configuration - * - * TODO: This method is kept only for backward compatibility. This should - * be removed in future. See GitHub Issue for more details - * @return default storage class - */ - public String getDefaultStorageClass() { - return getConfig(Config.DEFAULT_STORAGE_CLASS); - } } diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/PersistentVolumeClaimStorageClassEnricherTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/PersistentVolumeClaimStorageClassEnricherTest.java index f9cf3369c5..a5ee320402 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/PersistentVolumeClaimStorageClassEnricherTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/PersistentVolumeClaimStorageClassEnricherTest.java @@ -40,7 +40,7 @@ void setUp() { } @ParameterizedTest - @ValueSource(strings = {"jkube-persistentvolumeclaim-storageclass", "jkube-volume-permission"}) + @ValueSource(strings = {"jkube-persistentvolumeclaim-storageclass"}) void enrich_withPersistentVolumeClaim_shouldAddStorageClassToSpec(String enricher) { // Given Properties properties = new Properties(); @@ -63,7 +63,7 @@ void enrich_withPersistentVolumeClaim_shouldAddStorageClassToSpec(String enriche } @ParameterizedTest - @ValueSource(strings = {"jkube-persistentvolumeclaim-storageclass", "jkube-volume-permission"}) + @ValueSource(strings = {"jkube-persistentvolumeclaim-storageclass"}) void enrich_withPersistentVolumeClaimAndUseAnnotationEnabled_shouldAddStorageClassAnnotation(String enricher) { // Given Properties properties = new Properties(); diff --git a/kubernetes-maven-plugin/it/src/it/volume-enricher-custom-storage-class/pom.xml b/kubernetes-maven-plugin/it/src/it/volume-enricher-custom-storage-class/pom.xml index 0944be0149..5c90312913 100644 --- a/kubernetes-maven-plugin/it/src/it/volume-enricher-custom-storage-class/pom.xml +++ b/kubernetes-maven-plugin/it/src/it/volume-enricher-custom-storage-class/pom.xml @@ -35,8 +35,10 @@ - + cheese + + 250m 64Mi 500m diff --git a/openshift-maven-plugin/it/src/it/volume-enricher-custom-storage-class/pom.xml b/openshift-maven-plugin/it/src/it/volume-enricher-custom-storage-class/pom.xml index 3cb027c49b..c1fd60553e 100644 --- a/openshift-maven-plugin/it/src/it/volume-enricher-custom-storage-class/pom.xml +++ b/openshift-maven-plugin/it/src/it/volume-enricher-custom-storage-class/pom.xml @@ -35,9 +35,9 @@ - - cheese - + + cheese + From a133e5d560684cdecf81e470c9252b5167faa600 Mon Sep 17 00:00:00 2001 From: Thulasithan Gnanenthiram <115763801+Thulasithang@users.noreply.github.com> Date: Tue, 25 Jun 2024 13:10:29 +0530 Subject: [PATCH 199/289] test: OpenShiftResourceMojoTest.execute_generatesResourcesAndAttachesArtifact works on Windows OpenShiftResourceMojoTest is failing on Windows due to use of \n as line separator. Signed-off-by: Thulasithang --- .../maven/plugin/mojo/build/OpenShiftResourceMojoTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftResourceMojoTest.java b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftResourceMojoTest.java index 0f27187b3c..ea48613146 100644 --- a/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftResourceMojoTest.java +++ b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftResourceMojoTest.java @@ -85,7 +85,7 @@ void execute_generatesResourcesAndAttachesArtifact() throws Exception { final File generatedArtifact = new File(resourceMojo.targetDir, "openshift.yml"); assertThat(generatedArtifact) .exists() - .content().isEqualTo("---\napiVersion: v1\nkind: List\n"); + .content().isEqualTo(String.format("---%napiVersion: v1%nkind: List%n")); verify(resourceMojo.projectHelper, times(1)) .attachArtifact(resourceMojo.project, "yml", "openshift", generatedArtifact); } From 7e36a205225f215a0c341a8746071b0d9ccecfdb Mon Sep 17 00:00:00 2001 From: Tanmay Mathpal Date: Tue, 25 Jun 2024 14:50:51 +0530 Subject: [PATCH 200/289] test(spring-boot): disabled *nix-specific spring boot watcher integration test on windows (3191) chore(test): disabled failing test on Windows Signed-off-by: l3002 --- Merge branch 'eclipse-jkube:master' into Issue-Fix-#3178 --- .../springboot/watcher/SpringBootWatcherIntegrationTest.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java index 0bac2d0dd6..730a4521f1 100644 --- a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java +++ b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java @@ -33,6 +33,8 @@ import org.eclipse.jkube.watcher.api.WatcherContext; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.DisabledOnOs; +import org.junit.jupiter.api.condition.OS; import org.junit.jupiter.api.io.TempDir; import org.mockito.ArgumentCaptor; @@ -125,6 +127,7 @@ void withNoRemoteSecretThrowsException() { } @Test + @DisabledOnOs(OS.WINDOWS) void withAllRequirementsShouldStartWatcherProcess() throws Exception { try { // Given From 9dee5b047481246be704a0408f71fc917fc0ac6c Mon Sep 17 00:00:00 2001 From: Arman Yekkehkhani <72594459+arman-yekkehkhani@users.noreply.github.com> Date: Tue, 25 Jun 2024 12:53:22 +0330 Subject: [PATCH 201/289] refactor(common): delete EnvUtil.stringJoin and replace with String.join from std lib (3179) Signed-off-by: arman-yekkehkhani --- .../build/service/docker/BuildService.java | 2 +- .../jkube/kit/common/util/EnvUtil.java | 21 ------------------- .../jkube/kit/common/util/EnvUtilTest.java | 13 ------------ 3 files changed, 1 insertion(+), 35 deletions(-) diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java index 8897cbe217..55f35756aa 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/BuildService.java @@ -77,7 +77,7 @@ public void tagImage(String imageName, ImageConfiguration imageConfig) throws Do List tags = imageConfig.getBuildConfiguration().getTags(); if (!tags.isEmpty()) { - log.info("%s: Tag with %s", imageConfig.getDescription(), EnvUtil.stringJoin(tags, ",")); + log.info("%s: Tag with %s", imageConfig.getDescription(), String.join(",", tags)); for (String tag : tags) { if (tag != null) { diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/EnvUtil.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/EnvUtil.java index 34a30d9442..f18ed7980c 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/EnvUtil.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/EnvUtil.java @@ -217,27 +217,6 @@ public static String[] splitOnSpaceWithEscape(String toSplit) { return res; } - - /** - * Join a list of objects to a string with a given separator by calling Object.toString() on the elements. - * - * @param list to join - * @param separator separator to use - * @return the joined string. - */ - public static String stringJoin(List list, String separator) { - StringBuilder ret = new StringBuilder(); - boolean first = true; - for (Object o : list) { - if (!first) { - ret.append(separator); - } - ret.append(o); - first = false; - } - return ret.toString(); - } - /** * Extract part of given properties as a map. The given prefix is used to find the properties, * the rest of the property name is used as key for the map. diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/EnvUtilTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/EnvUtilTest.java index 4cf53bd623..c574f5e565 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/EnvUtilTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/EnvUtilTest.java @@ -206,19 +206,6 @@ void testPrepareAbsoluteSourceDirPathWindows() { .isEqualTo("C:\\users\\redhat\\jkube"); } - @Test - void testStringJoin(){ - //Given - List list = new ArrayList<>(); - String separator = ","; - list.add("element1"); - list.add("element2"); - //When - String result = EnvUtil.stringJoin(list,separator); - //Then - assertThat(result).isEqualTo("element1,element2"); - } - @Test void testExtractMavenPropertyName() { assertThat(EnvUtil.extractMavenPropertyName("${project.baseDir}")).isEqualTo("project.baseDir"); From 894fb8aa5ed367abfd48b065e23859b39e748e09 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Tue, 25 Jun 2024 11:33:59 +0200 Subject: [PATCH 202/289] feat: java exec base image doesn't rely on container detection Signed-off-by: Marc Nuri --- jkube-kit/parent/pom.xml | 2 +- .../kit/remotedev/KubernetesSshServiceForwarderTest.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index 36043329e4..d17b10e050 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -62,7 +62,7 @@ 9.7 - 0.0.23 + 0.0.24 9.3 diff --git a/jkube-kit/remote-dev/src/test/java/org/eclipse/jkube/kit/remotedev/KubernetesSshServiceForwarderTest.java b/jkube-kit/remote-dev/src/test/java/org/eclipse/jkube/kit/remotedev/KubernetesSshServiceForwarderTest.java index 605542bfd7..440b79baec 100644 --- a/jkube-kit/remote-dev/src/test/java/org/eclipse/jkube/kit/remotedev/KubernetesSshServiceForwarderTest.java +++ b/jkube-kit/remote-dev/src/test/java/org/eclipse/jkube/kit/remotedev/KubernetesSshServiceForwarderTest.java @@ -70,7 +70,7 @@ void tearDown() { } @Test - @DisplayName("deploys Pod with image: quay.io/jkube/jkube-remote-dev:0.0.23") + @DisplayName("deploys Pod with image: quay.io/jkube/jkube-remote-dev:0.0.24") void deployPodWithImage() { // When executorService.submit(kubernetesSshServiceForwarder); @@ -86,7 +86,7 @@ void deployPodWithImage() { .extracting(PodSpec::getContainers) .asList() .singleElement() - .hasFieldOrPropertyWithValue("image", "quay.io/jkube/jkube-remote-dev:0.0.23"); + .hasFieldOrPropertyWithValue("image", "quay.io/jkube/jkube-remote-dev:0.0.24"); } @Test @DisplayName("deploys Pod with port definitions") From 060503a5c330996be2987485e5121159f0f6af96 Mon Sep 17 00:00:00 2001 From: Tanmay Mathpal Date: Tue, 25 Jun 2024 18:05:55 +0530 Subject: [PATCH 203/289] test(gradle): gradle-plugin task tests work on Windows Signed-off-by: l3002 --- .../jkube/gradle/plugin/task/KubernetesConfigViewTaskTest.java | 2 +- .../jkube/gradle/plugin/task/KubernetesHelmPushTaskTest.java | 3 ++- .../jkube/gradle/plugin/task/KubernetesHelmTaskTest.java | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesConfigViewTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesConfigViewTaskTest.java index 7abfbd6005..88649b3ae1 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesConfigViewTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesConfigViewTaskTest.java @@ -48,6 +48,6 @@ void runTask_withManualSettings_shouldLogThem() { configViewTask.runTask(); // Then verify(taskEnvironment.logger, times(1)) - .lifecycle(matches("k8s: \n---\noffline: true\nbuildStrategy: \"s2i\"")); + .lifecycle(matches(String.format("k8s: %n---\noffline: true\nbuildStrategy: \"s2i\""))); } } diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmPushTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmPushTaskTest.java index f496454e82..09cb2b281b 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmPushTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmPushTaskTest.java @@ -26,6 +26,7 @@ import java.io.IOException; import java.nio.file.NoSuchFileException; +import static org.apache.commons.io.FilenameUtils.separatorsToSystem; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mockConstruction; @@ -60,7 +61,7 @@ void runTask_withNoTemplateDir_shouldThrowException() { // When & Then assertThatIllegalStateException() .isThrownBy(kubernetesHelmPushTask::runTask) - .withMessageContaining("META-INF/jkube/kubernetes") + .withMessageContaining(separatorsToSystem("META-INF/jkube/kubernetes")) .withCauseInstanceOf(NoSuchFileException.class); } diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmTaskTest.java index 0f5bd88fd8..642c08d49f 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmTaskTest.java @@ -26,6 +26,7 @@ import org.junit.jupiter.api.extension.RegisterExtension; import org.mockito.MockedConstruction; +import static org.apache.commons.io.FilenameUtils.separatorsToSystem; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mockConstruction; @@ -60,7 +61,7 @@ void runTask_withNoTemplateDir_shouldThrowException() { // When & Then assertThatIllegalStateException() .isThrownBy(kubernetesHelmTask::runTask) - .withMessageContaining("META-INF/jkube/kubernetes") + .withMessageContaining(separatorsToSystem("META-INF/jkube/kubernetes")) .withCauseInstanceOf(NoSuchFileException.class); } From 8435d6b22bb1cbcc25c8576c308cc9efb7106363 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Tue, 25 Jun 2024 18:28:50 +0530 Subject: [PATCH 204/289] fix: add missing properties to PropertyConfigResolver MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + Remove ENV_RUN field from ConfigKey enum as it’s related to Docker Maven Plugin’s run configuration that has been removed from JKube codebase. + Add missing properties for the following fields: - `registry` -> `jkube.container-image.registry` - `buildpacksBuilderImage` -> `jkube.container-image.buildpacksBuilderImage` - `createImageOptions` -> `jkube.container-image.createImageOptions` - `assembly.name` -> `jkube.container-image.assembly.name` - `assembly.excludeFinalOutputArtifact` -> `jkube.container-image.assembly.excludeFinalOutputArtifact` Signed-off-by: Rohan Kumar --- .../build/api/config/property/ConfigKey.java | 5 +++- .../property/PropertyConfigResolver.java | 5 ++++ .../property/PropertyConfigResolverTest.java | 30 +++++++++++++++++++ .../main/asciidoc/inc/build/_assembly.adoc | 4 +-- .../asciidoc/inc/build/_configuration.adoc | 4 +-- .../asciidoc/inc/image/_configuration.adoc | 2 +- 6 files changed, 44 insertions(+), 6 deletions(-) diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/ConfigKey.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/ConfigKey.java index 053c7911a7..9756e4a980 100644 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/ConfigKey.java +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/ConfigKey.java @@ -23,16 +23,20 @@ public enum ConfigKey { ALIAS, ARGS(ValueCombinePolicy.MERGE), + ASSEMBLY_NAME("assembly.name"), ASSEMBLY_TARGET_DIR("assembly.targetDir"), ASSEMBLY_EXPORT_TARGET_DIR("assembly.exportTargetDir"), ASSEMBLY_PERMISSIONS("assembly.permissions"), ASSEMBLY_USER("assembly.user"), ASSEMBLY_MODE("assembly.mode"), ASSEMBLY_TARLONGFILEMODE("assembly.tarLongFileMode"), + ASSEMBLY_EXCLUDE_FINAL_OUTPUT_ARTIFACT("assembly.excludeFinalOutputArtifact"), + BUILDPACKS_BUILDER_IMAGE("buildpacksBuilderImage"), BUILD_OPTIONS, CLEANUP, NOCACHE, CACHEFROM, + CREATE_IMAGE_OPTIONS("createImageOptions"), OPTIMISE, CMD, CONTEXT_DIR, @@ -41,7 +45,6 @@ public enum ConfigKey { ENTRYPOINT, ENV, ENV_BUILD("envBuild", ValueCombinePolicy.MERGE), - ENV_RUN("envRun", ValueCombinePolicy.MERGE), FILTER, FROM, FROM_EXT, diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolver.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolver.java index 7c7b885d9a..a99b049e64 100644 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolver.java +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolver.java @@ -49,6 +49,7 @@ public final ImageConfiguration resolve(ImageConfiguration fromConfig, JavaProje return ImageConfiguration.builder() .name(valueProvider.getString(ConfigKey.NAME, fromConfig.getName())) .alias(valueProvider.getString(ConfigKey.ALIAS, fromConfig.getAlias())) + .registry(valueProvider.getString(ConfigKey.REGISTRY, fromConfig.getRegistry())) .build(extractBuildConfiguration(fromConfig, valueProvider)) .watch(extractWatchConfig(fromConfig, valueProvider)) .build(); @@ -66,10 +67,12 @@ private BuildConfiguration extractBuildConfiguration(ImageConfiguration fromConf final BuildConfiguration config = fromConfig.getBuild() != null ? fromConfig.getBuild() : new BuildConfiguration(); return config.toBuilder() + .buildpacksBuilderImage(valueProvider.getString(ConfigKey.BUILDPACKS_BUILDER_IMAGE, valueOrNull(config, BuildConfiguration::getBuildpacksBuilderImage))) .cmd(extractArguments(valueProvider, ConfigKey.CMD, valueOrNull(config, BuildConfiguration::getCmd))) .cleanup(valueProvider.getString(ConfigKey.CLEANUP, valueOrNull(config, BuildConfiguration::getCleanup))) .nocache(valueProvider.getBoolean(ConfigKey.NOCACHE, valueOrNull(config, BuildConfiguration::getNocache))) .clearCacheFrom().cacheFrom(valueProvider.getList(ConfigKey.CACHEFROM, valueOr(config, BuildConfiguration::getCacheFrom, Collections.emptyList()))) + .createImageOptions(valueProvider.getMap(ConfigKey.CREATE_IMAGE_OPTIONS, valueOrNull(config, BuildConfiguration::getCreateImageOptions))) .optimise(valueProvider.getBoolean(ConfigKey.OPTIMISE, valueOrNull(config, BuildConfiguration::getOptimise))) .entryPoint(extractArguments(valueProvider, ConfigKey.ENTRYPOINT, valueOrNull(config, BuildConfiguration::getEntryPoint))) .assembly(extractAssembly(valueOrNull(config, BuildConfiguration::getAssembly), valueProvider)) @@ -104,12 +107,14 @@ private BuildConfiguration extractBuildConfiguration(ImageConfiguration fromConf private AssemblyConfiguration extractAssembly(AssemblyConfiguration originalConfig, ValueProvider valueProvider) { final AssemblyConfiguration config = originalConfig != null ? originalConfig : new AssemblyConfiguration(); return config.toBuilder() + .name(valueProvider.getString(ConfigKey.ASSEMBLY_NAME, valueOrNull(originalConfig, AssemblyConfiguration::getName))) .targetDir(valueProvider.getString(ConfigKey.ASSEMBLY_TARGET_DIR, valueOrNull(originalConfig, AssemblyConfiguration::getTargetDir))) .exportTargetDir(valueProvider.getBoolean(ConfigKey.ASSEMBLY_EXPORT_TARGET_DIR, valueOrNull(originalConfig, AssemblyConfiguration::getExportTargetDir))) .permissionsString(valueProvider.getString(ConfigKey.ASSEMBLY_PERMISSIONS, valueOrNull(originalConfig, AssemblyConfiguration::getPermissionsRaw))) .user(valueProvider.getString(ConfigKey.ASSEMBLY_USER, valueOrNull(originalConfig, AssemblyConfiguration::getUser))) .modeString(valueProvider.getString(ConfigKey.ASSEMBLY_MODE, valueOrNull(originalConfig, AssemblyConfiguration::getModeRaw))) .tarLongFileMode(valueProvider.getString(ConfigKey.ASSEMBLY_TARLONGFILEMODE, valueOrNull(originalConfig, AssemblyConfiguration::getTarLongFileMode))) + .excludeFinalOutputArtifact(valueProvider.getBoolean(ConfigKey.ASSEMBLY_EXCLUDE_FINAL_OUTPUT_ARTIFACT, Optional.ofNullable(valueOrNull(originalConfig, AssemblyConfiguration::isExcludeFinalOutputArtifact)).orElse(false))) .build(); } diff --git a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolverTest.java b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolverTest.java index b3e3545ea0..ab57a9274f 100644 --- a/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolverTest.java +++ b/jkube-kit/build/api/src/test/java/org/eclipse/jkube/kit/build/api/config/property/PropertyConfigResolverTest.java @@ -77,6 +77,11 @@ void setUp() { javaProject.getProperties().put("jkube.container-image.platforms.1", "linux/amd64"); javaProject.getProperties().put("jkube.container-image.platforms.2", "linux/arm64"); javaProject.getProperties().put("jkube.container-image.healthcheck.interval", "10s"); + javaProject.getProperties().put("jkube.container-image.registry", "example-registry.io"); + javaProject.getProperties().put("jkube.container-image.buildpacksBuilderImage", "custom-pack-builder-image:latest"); + javaProject.getProperties().put("jkube.container-image.createImageOptions.platform", "linux/amd64"); + javaProject.getProperties().put("jkube.container-image.assembly.name", "assembly1"); + javaProject.getProperties().put("jkube.container-image.assembly.excludeFinalOutputArtifact", "false"); } @Test @@ -167,6 +172,31 @@ void setsPlatforms() { void setsHealthCheckInterval() { assertThat(resolved.getBuild().getHealthCheck().getInterval()).isEqualTo("10s"); } + + @Test + void setsRegistry() { + assertThat(resolved.getRegistry()).isEqualTo("example-registry.io"); + } + + @Test + void setsCreateImageOptions() { + assertThat(resolved.getBuild().getCreateImageOptions()).containsEntry("platform", "linux/amd64"); + } + + @Test + void setsBuildPackBuilderImage() { + assertThat(resolved.getBuild().getBuildpacksBuilderImage()).isEqualTo("custom-pack-builder-image:latest"); + } + + @Test + void setsAssemblyName() { + assertThat(resolved.getBuild().getAssembly().getName()).isEqualTo("assembly1"); + } + + @Test + void setsAssemblyExcludeFinalOutputArtifact() { + assertThat(resolved.getBuild().getAssembly().isExcludeFinalOutputArtifact()).isFalse(); + } } @Nested diff --git a/jkube-kit/doc/src/main/asciidoc/inc/build/_assembly.adoc b/jkube-kit/doc/src/main/asciidoc/inc/build/_assembly.adoc index 80554d2e60..a64ab52588 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/build/_assembly.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/build/_assembly.adoc @@ -14,7 +14,7 @@ logic (see <> for more details). | Assembly name, which is `maven` by default. This name is used for the archives and directories created during the build. This directory holds the files specified by the assembly. If an <> is used then this name is also the relative directory which contains the assembly files. -| +| `jkube.container-image.assembly.name` | *targetDir* | Directory under which the files and artifacts contained in the assembly will be copied within the container. @@ -40,7 +40,7 @@ logic (see <> for more details). | *excludeFinalOutputArtifact* | By default, the project's final artifact will be included in the assembly, set this flag to true in case the artifact should be excluded from the assembly. -| +| `jkube.container-image.assembly.excludeFinalOutputArtifact` | *mode* a| Mode how the assembled files should be collected: diff --git a/jkube-kit/doc/src/main/asciidoc/inc/build/_configuration.adoc b/jkube-kit/doc/src/main/asciidoc/inc/build/_configuration.adoc index fb01d11b27..a966d221bf 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/build/_configuration.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/build/_configuration.adoc @@ -30,7 +30,7 @@ https://docs.docker.com/engine/reference/api/docker_remote_api_v1.24/#build-imag These options map to the ones listed as query parameters in the https://docs.docker.com/engine/api/v1.41/#operation/ImageCreate[Docker Remote API] and are restricted to simple options (e.g.: fromImage, fromSrc, platform). -| +| `jkube.container-image.createImageOptions` | *cleanup* | Cleanup dangling (untagged) images after each build (including any containers created from them). Default is `try` which tries to remove the old image, but doesn't fail the build if this is not possible because e.g. the image is still used by a running container. Use `remove` if you want to fail the build and `none` if no cleanup is requested. @@ -90,7 +90,7 @@ endif::[] | Configure https://buildpacks.io/docs/for-platform-operators/concepts/builder/[BuildPack builder] OCI image for BuildPack Build. This field is applicable only in `buildpacks` build strategy. This overrides builder image specified in local `~/.pack/config.toml`. If not specified this defaults to `null`. This field is only applicable for `buildpacks` build strategy. -| +| `jkube.container-image.buildpacksBuilderImage` | [[build-config-from-ext]]**fromExt** a| Extended definition for a base image. This field holds a map of defined in `key = "value"` format. The known keys are: diff --git a/jkube-kit/doc/src/main/asciidoc/inc/image/_configuration.adoc b/jkube-kit/doc/src/main/asciidoc/inc/image/_configuration.adoc index d4eb24e6af..5a279b4c5f 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/image/_configuration.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/image/_configuration.adoc @@ -17,7 +17,7 @@ | <> | Registry to use for this image. If the `name` already contains a registry this takes precedence. See <> for more details. -| +| `jkube.container-image.registry` | <> | From 2b7d1bf21232bd952708f803b734928a764a20d3 Mon Sep 17 00:00:00 2001 From: Arman Yekkehkhani <72594459+arman-yekkehkhani@users.noreply.github.com> Date: Mon, 1 Jul 2024 11:17:23 +0330 Subject: [PATCH 205/289] chore(quickstarts): remove duplicate dependency from micronaut (3204) Signed-off-by: arman-yekkehkhani --- quickstarts/maven/micronaut4/pom.xml | 5 ----- 1 file changed, 5 deletions(-) diff --git a/quickstarts/maven/micronaut4/pom.xml b/quickstarts/maven/micronaut4/pom.xml index b9d9c6d51a..4222d04bd0 100644 --- a/quickstarts/maven/micronaut4/pom.xml +++ b/quickstarts/maven/micronaut4/pom.xml @@ -112,11 +112,6 @@ junit-jupiter-engine test
- - io.micronaut.test - micronaut-test-junit5 - test - From 1d3b2d18bb95c5ef8c23c7d6836d9f4a69ed3a3a Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Tue, 2 Jul 2024 14:07:15 +0200 Subject: [PATCH 206/289] chore(deps): Bump version.kubernetes-client from 6.13.0 to 6.13.1 Signed-off-by: Marc Nuri --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 49b2b0c07d..0bba3e2b52 100644 --- a/pom.xml +++ b/pom.xml @@ -105,7 +105,7 @@ 0.8.12 2.5.1 5.10.2 - 6.13.0 + 6.13.1 4.5 1.18.32 1.18.20.0 From 7b6b0fed012575509d1f924fe36b96c7fb91d31d Mon Sep 17 00:00:00 2001 From: Thulasithan Gnanenthiram <115763801+Thulasithang@users.noreply.github.com> Date: Tue, 2 Jul 2024 18:01:15 +0530 Subject: [PATCH 207/289] test(gradle): gradle-plugin task openshift tests work on Windows (3209) fix: Fixed failing test on Windows OpenShiftResourceMojoTest is failing on Windows due to use of \n as line separator. Signed-off-by: Thulasithang --- fixed failing windows test. Replaced the '/' file separator using File.separator method. Signed-off-by: Thulasithang --- .../jkube/gradle/plugin/task/OpenShiftHelmPushTaskTest.java | 3 ++- .../jkube/gradle/plugin/task/OpenShiftHelmTaskTest.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmPushTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmPushTaskTest.java index 5882771b06..52310e948b 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmPushTaskTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmPushTaskTest.java @@ -23,6 +23,7 @@ import org.junit.jupiter.api.extension.RegisterExtension; import org.mockito.MockedConstruction; +import java.io.File; import java.io.IOException; import java.nio.file.NoSuchFileException; @@ -59,7 +60,7 @@ void runTask_withNoTemplateDir_shouldThrowException() { // When & Then assertThatIllegalStateException() .isThrownBy(openShiftHelmPushTask::runTask) - .withMessageContaining("META-INF/jkube/openshift") + .withMessageContaining("META-INF" + File.separator + "jkube" + File.separator + "openshift") .withCauseInstanceOf(NoSuchFileException.class); } diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmTaskTest.java index 23939518c2..3c88f34753 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmTaskTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmTaskTest.java @@ -22,6 +22,7 @@ import org.junit.jupiter.api.extension.RegisterExtension; import org.mockito.MockedConstruction; +import java.io.File; import java.io.IOException; import java.nio.file.NoSuchFileException; @@ -58,7 +59,7 @@ void runTask_withNoTemplateDir_shouldThrowException() { // When & Then assertThatIllegalStateException() .isThrownBy(kubernetesHelmTask::runTask) - .withMessageContaining("META-INF/jkube/openshift") + .withMessageContaining("META-INF" + File.separator + "jkube" + File.separator + "openshift") .withCauseInstanceOf(NoSuchFileException.class); } From 6e02a67642e0c4922f530c358f671206d62a81bb Mon Sep 17 00:00:00 2001 From: Anurag Sisodiya Date: Tue, 2 Jul 2024 18:05:45 +0530 Subject: [PATCH 208/289] fix: removed unused import from DockerImageWatcherRestartContainerTest DockerImageWatcherRestartContainerTest: Remove unused imports #2922 to clean up the code and improve readability. On branch pr/issue2922 --- .../watcher/standard/DockerImageWatcherRestartContainerTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherRestartContainerTest.java b/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherRestartContainerTest.java index 8ea8ee05ce..26f8a22355 100644 --- a/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherRestartContainerTest.java +++ b/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherRestartContainerTest.java @@ -40,7 +40,6 @@ import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.kit.build.service.docker.WatchService; import org.eclipse.jkube.kit.common.util.OpenshiftHelper; -import org.eclipse.jkube.kit.config.access.ClusterAccess; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.watcher.api.WatcherContext; import org.junit.jupiter.api.BeforeEach; From ab6358480f6e032411a80e1e4a9fb8cab082e9cc Mon Sep 17 00:00:00 2001 From: SnehaHS65 <65708833+SnehaHS65@users.noreply.github.com> Date: Thu, 4 Jul 2024 10:04:11 -0400 Subject: [PATCH 209/289] fix: replace duration.length() with duration.isEmpty() in GoTimeUtil Signed-off-by: Sneha Holehonnur Sridhar --- .../org/eclipse/jkube/kit/enricher/api/util/GoTimeUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/util/GoTimeUtil.java b/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/util/GoTimeUtil.java index 65f61166c4..15cd782150 100644 --- a/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/util/GoTimeUtil.java +++ b/jkube-kit/enricher/api/src/main/java/org/eclipse/jkube/kit/enricher/api/util/GoTimeUtil.java @@ -57,7 +57,7 @@ public static BigDecimal durationNs(String durationP) { return null; } String duration = durationP.trim(); - if (duration.length() == 0) { + if (duration.isEmpty()) { return null; } From 1f2b80a0205222cd16a895716d693e07ee4fd64a Mon Sep 17 00:00:00 2001 From: g-ivanova <72075589+g-ivanova@users.noreply.github.com> Date: Thu, 4 Jul 2024 17:13:26 +0300 Subject: [PATCH 210/289] fix: replace buildArgs.size()>0 with !buildArgs.isEmpty() in BuildOptions --- .../jkube/kit/build/service/docker/access/BuildOptions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/access/BuildOptions.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/access/BuildOptions.java index e354cb11f8..4f1881f7bc 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/access/BuildOptions.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/access/BuildOptions.java @@ -69,7 +69,7 @@ public BuildOptions cacheFrom(List cacheFrom) { } public BuildOptions buildArgs(Map buildArgs) { - if (buildArgs != null && buildArgs.size() > 0) { + if (buildArgs != null && !buildArgs.isEmpty()) { options.put("buildargs", JsonFactory.newJsonObject(buildArgs).toString()); } return this; From bad79987621896d122ec195bae8af5ca3a5bbca5 Mon Sep 17 00:00:00 2001 From: leulad <47708660+leulad@users.noreply.github.com> Date: Thu, 4 Jul 2024 17:15:35 +0300 Subject: [PATCH 211/289] fix: replaced Object.length()==0 with Object.isEmpty() in CommandLine Signed-off-by: leulad --- .../java/org/eclipse/jkube/kit/common/util/CommandLine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/CommandLine.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/CommandLine.java index 63b4780cd6..72abcf73d2 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/CommandLine.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/CommandLine.java @@ -25,7 +25,7 @@ public class CommandLine { private CommandLine() { } public static List translateCommandline(String toProcess) { - if (toProcess == null || toProcess.length() == 0) { + if (toProcess == null || toProcess.isEmpty()) { //no command? no string return Collections.emptyList(); } From 2130edade055e7d7ad8bfca35616a2679a3b9a6c Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Tue, 9 Jul 2024 12:38:57 +0200 Subject: [PATCH 212/289] chore: add missing changelog entries for #2911 and #2381 Signed-off-by: Marc Nuri --- CHANGELOG.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 83d27db13f..e576b2cd73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,9 +22,10 @@ Usage: ``` ### 1.17-SNAPSHOT * Fix #1989: Remove storageClass related fields from VolumePermissionEnricher -* Fix #3161: JavaExecGenerator should honor %t setting and not unconditionally add `latest` tag * Fix #2098: Add support for multi-platform container image builds in jib build strategy +* Fix #2110: Add new helm dependency update goal task (`k8s:helm-dependency-update` for maven and `k8sHelmDependencyUpdate` for gradle) * Fix #2335: Add support for configuring nodeSelector spec for controller via xml/groovy DSL configuration +* Fix #2381: All base images provide support for Java 21 * Fix #2459: Allow configuring Buildpacks build via ImageConfiguration * Fix #2462: `k8s:debug` throws error when using `buildpacks` build strategy * Fix #2463: Buildpacks should clear build cache when `nocache` option is enabled @@ -35,10 +36,11 @@ Usage: * Fix #2885: Provide a way to set labels on images defined by Generators * Fix #2901: Ensure Docker build arguments from properties are used during images pre-pulling * Fix #2904: `docker.buildArg.*` properties not taken into account in OpenShift plugins +* Fix #2911: Base images don't use manual container detection and rely on Java's built-in mechanisms * Fix #3007: Kubernetes Maven Plugin generating resource manifests with line feeds on Windows * Fix #3067: Helm Push uses configured docker global and push registries instead of pull -* Fix #2110: Add new helm dependency update goal task (`k8s:helm-dependency-update` for maven and `k8sHelmDependencyUpdate` for gradle) * Fix #3122: JKube should also pass project directory in `buildpacks` build strategy +* Fix #3161: JavaExecGenerator should honor %t setting and not unconditionally add `latest` tag * Fix #2467: Add support for specifying imagePullSecrets via resource configuration _**Note**_: From a1265e7ebfc3b33eb80fddb2f36526c7409f8f78 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Wed, 26 Jun 2024 16:06:47 +0530 Subject: [PATCH 213/289] refactor : Move ClusterAccess and ClusterConfiguration to `jkube-kit/common` + Move ClusterAccess and ClusterConfiguration classes from `jkube-kit/config/resource` -> `jkube-kit/common` so that they're accessible to JKubeConfiguration + Add new field `clusterConfiguration` in JKubeConfiguration for passing in Cluster configuration + Add new field `currentContext` to ClusterConfiguration in order to pass current context Signed-off-by: Rohan Kumar --- .../gradle/plugin/KubernetesExtension.java | 2 +- .../gradle/plugin/task/AbstractJKubeTask.java | 4 ++-- .../plugin/task/KubernetesApplyTaskTest.java | 2 +- .../plugin/task/KubernetesUndeployTaskTest.java | 2 +- .../plugin/task/KubernetesWatchTaskTest.java | 2 +- .../plugin/task/OpenShiftApplyTaskTest.java | 2 +- .../plugin/task/OpenShiftUndeployTaskTest.java | 2 +- .../plugin/task/OpenShiftWatchTaskTest.java | 2 +- .../jkube/kit/common/JKubeConfiguration.java | 2 ++ .../jkube/kit/common}/access/ClusterAccess.java | 2 +- .../common}/access/ClusterConfiguration.java | 17 +++++++++++++++-- .../kit/common}/access/ClusterAccessTest.java | 2 +- .../access/ClusterConfigurationTest.java | 7 ++++++- .../kit/config/service/JKubeServiceHub.java | 4 ++-- .../kubernetes/KubernetesClientUtil.java | 2 +- .../config/service/ApplyServiceCrudTest.java | 4 ++-- .../kit/config/service/ApplyServiceTest.java | 4 ++-- .../kit/config/service/DebugServiceTest.java | 4 ++-- .../kit/config/service/JKubeServiceHubTest.java | 2 +- .../kubernetes/KubernetesClientUtilTest.java | 2 +- .../KubernetesUndeployServiceTest.java | 4 ++-- .../openshift/OpenshiftUndeployServiceTest.java | 4 ++-- .../apply/_cluster_access_configuration.adoc | 4 ++++ .../SpringBootWatcherIntegrationTest.java | 4 ++-- .../standard/DockerImageWatcherTest.java | 2 +- .../plugin/mojo/build/AbstractDockerMojo.java | 4 ++-- .../plugin/mojo/build/AbstractJKubeMojo.java | 4 ++-- .../maven/plugin/mojo/build/ApplyMojoTest.java | 2 +- .../plugin/mojo/develop/DebugMojoTest.java | 4 +--- .../maven/plugin/mojo/develop/LogMojoTest.java | 2 +- .../plugin/mojo/develop/WatchMojoTest.java | 2 +- .../mojo/build/OpenShiftResourceMojoTest.java | 2 +- 32 files changed, 65 insertions(+), 43 deletions(-) rename jkube-kit/{config/resource/src/main/java/org/eclipse/jkube/kit/config => common/src/main/java/org/eclipse/jkube/kit/common}/access/ClusterAccess.java (96%) rename jkube-kit/{config/resource/src/main/java/org/eclipse/jkube/kit/config => common/src/main/java/org/eclipse/jkube/kit/common}/access/ClusterConfiguration.java (90%) rename jkube-kit/{config/resource/src/test/java/org/eclipse/jkube/kit/config => common/src/test/java/org/eclipse/jkube/kit/common}/access/ClusterAccessTest.java (96%) rename jkube-kit/{config/resource/src/test/java/org/eclipse/jkube/kit/config => common/src/test/java/org/eclipse/jkube/kit/common}/access/ClusterConfigurationTest.java (92%) diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesExtension.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesExtension.java index 5e59f97917..ffaa5c0f2f 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesExtension.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesExtension.java @@ -29,7 +29,7 @@ import org.eclipse.jkube.kit.common.ResourceFileType; import org.eclipse.jkube.kit.common.util.OpenshiftHelper; import org.eclipse.jkube.kit.common.util.ResourceClassifier; -import org.eclipse.jkube.kit.config.access.ClusterConfiguration; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.WatchMode; import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java index 8012efff1f..509e2293a4 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java @@ -33,8 +33,8 @@ import org.eclipse.jkube.kit.common.RegistryConfig; import org.eclipse.jkube.kit.common.util.LazyBuilder; import org.eclipse.jkube.kit.common.util.ResourceUtil; -import org.eclipse.jkube.kit.config.access.ClusterAccess; -import org.eclipse.jkube.kit.config.access.ClusterConfiguration; +import org.eclipse.jkube.kit.common.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.resource.ResourceServiceConfig; diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTaskTest.java index c260673c14..da4d700386 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTaskTest.java @@ -19,7 +19,7 @@ import io.fabric8.openshift.client.OpenShiftClient; import org.eclipse.jkube.gradle.plugin.KubernetesExtension; import org.eclipse.jkube.gradle.plugin.TestKubernetesExtension; -import org.eclipse.jkube.kit.config.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.service.ApplyService; import org.gradle.api.provider.Property; diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTaskTest.java index a54c2c7785..fb46cb9bda 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTaskTest.java @@ -20,7 +20,7 @@ import org.eclipse.jkube.gradle.plugin.KubernetesExtension; import org.eclipse.jkube.gradle.plugin.TestKubernetesExtension; -import org.eclipse.jkube.kit.config.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.service.kubernetes.KubernetesUndeployService; diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java index c98045fcdc..f10090b292 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java @@ -20,7 +20,7 @@ import org.eclipse.jkube.kit.build.service.docker.DockerAccessFactory; import org.eclipse.jkube.kit.build.service.docker.access.DockerAccess; import org.eclipse.jkube.kit.common.util.KubernetesHelper; -import org.eclipse.jkube.kit.config.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.service.kubernetes.DockerBuildService; import org.eclipse.jkube.watcher.api.WatcherManager; import org.junit.jupiter.api.AfterEach; diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftApplyTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftApplyTaskTest.java index a17f8ae758..30732b3fb8 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftApplyTaskTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftApplyTaskTest.java @@ -18,7 +18,7 @@ import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; import org.eclipse.jkube.gradle.plugin.TestOpenShiftExtension; -import org.eclipse.jkube.kit.config.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.service.ApplyService; import io.fabric8.openshift.client.OpenShiftClient; diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftUndeployTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftUndeployTaskTest.java index 9ef32c996d..efd40763b7 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftUndeployTaskTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftUndeployTaskTest.java @@ -19,7 +19,7 @@ import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; import org.eclipse.jkube.gradle.plugin.TestOpenShiftExtension; -import org.eclipse.jkube.kit.config.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.service.openshift.OpenshiftUndeployService; diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftWatchTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftWatchTaskTest.java index df04e1377f..4b8402b852 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftWatchTaskTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftWatchTaskTest.java @@ -17,7 +17,7 @@ import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; import org.eclipse.jkube.gradle.plugin.TestOpenShiftExtension; import org.eclipse.jkube.kit.common.util.KubernetesHelper; -import org.eclipse.jkube.kit.config.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.watcher.api.WatcherManager; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/JKubeConfiguration.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/JKubeConfiguration.java index 975d3ae50d..3d3c11f7f4 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/JKubeConfiguration.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/JKubeConfiguration.java @@ -24,6 +24,7 @@ import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; /** * @author roland @@ -38,6 +39,7 @@ public class JKubeConfiguration implements Serializable { private static final long serialVersionUID = 7459084747241070651L; private JavaProject project; + private ClusterConfiguration clusterConfiguration; private String sourceDirectory; private String outputDirectory; private Map buildArgs; diff --git a/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/access/ClusterAccess.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/access/ClusterAccess.java similarity index 96% rename from jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/access/ClusterAccess.java rename to jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/access/ClusterAccess.java index 4e5589140d..7fbf5c98c6 100644 --- a/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/access/ClusterAccess.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/access/ClusterAccess.java @@ -11,7 +11,7 @@ * Contributors: * Red Hat, Inc. - initial API and implementation */ -package org.eclipse.jkube.kit.config.access; +package org.eclipse.jkube.kit.common.access; import io.fabric8.kubernetes.client.Config; diff --git a/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/access/ClusterConfiguration.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/access/ClusterConfiguration.java similarity index 90% rename from jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/access/ClusterConfiguration.java rename to jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/access/ClusterConfiguration.java index d6df655a1b..48282a3e5c 100644 --- a/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/access/ClusterConfiguration.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/access/ClusterConfiguration.java @@ -11,10 +11,14 @@ * Contributors: * Red Hat, Inc. - initial API and implementation */ -package org.eclipse.jkube.kit.config.access; +package org.eclipse.jkube.kit.common.access; +import io.fabric8.kubernetes.api.model.NamedContext; +import io.fabric8.kubernetes.api.model.NamedContextBuilder; import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.ConfigBuilder; + +import java.io.Serializable; import java.lang.reflect.Field; import java.util.Map; import java.util.Optional; @@ -32,9 +36,10 @@ @AllArgsConstructor @NoArgsConstructor @EqualsAndHashCode -public class ClusterConfiguration { +public class ClusterConfiguration implements Serializable { private static final String PROPERTY_PREFIX = "jkube."; + private static final long serialVersionUID = 8756257530678486528L; private String username; private String password; @@ -49,6 +54,7 @@ public class ClusterConfiguration { private String clientKeyData; private String clientKeyAlgo; private String clientKeyPassphrase; + private String currentContext; private String trustStoreFile; private String trustStorePassphrase; private String keyStoreFile; @@ -134,6 +140,12 @@ public Config getConfig() { configBuilder.withTrustCerts(this.trustCerts); } + if (StringUtils.isNotBlank(this.currentContext)) { + configBuilder.withCurrentContext(new NamedContextBuilder() + .withName(this.currentContext) + .build()); + } + return configBuilder.build(); } @@ -153,6 +165,7 @@ public static ClusterConfigurationBuilder from(Config kubernetesConfig) { .clientKeyData(kubernetesConfig.getClientKeyData()) .clientKeyAlgo(kubernetesConfig.getClientKeyAlgo()) .clientKeyPassphrase(kubernetesConfig.getClientKeyPassphrase()) + .currentContext(Optional.ofNullable(kubernetesConfig.getCurrentContext()).map(NamedContext::getName).orElse(null)) .trustStoreFile(kubernetesConfig.getTrustStoreFile()) .trustStorePassphrase(kubernetesConfig.getTrustStorePassphrase()) .keyStoreFile(kubernetesConfig.getKeyStoreFile()) diff --git a/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/access/ClusterAccessTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/access/ClusterAccessTest.java similarity index 96% rename from jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/access/ClusterAccessTest.java rename to jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/access/ClusterAccessTest.java index 998dc4b022..2413e386d2 100644 --- a/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/access/ClusterAccessTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/access/ClusterAccessTest.java @@ -11,7 +11,7 @@ * Contributors: * Red Hat, Inc. - initial API and implementation */ -package org.eclipse.jkube.kit.config.access; +package org.eclipse.jkube.kit.common.access; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; diff --git a/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/access/ClusterConfigurationTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/access/ClusterConfigurationTest.java similarity index 92% rename from jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/access/ClusterConfigurationTest.java rename to jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/access/ClusterConfigurationTest.java index 1a461cec47..c6e68368c0 100644 --- a/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/access/ClusterConfigurationTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/access/ClusterConfigurationTest.java @@ -11,8 +11,9 @@ * Contributors: * Red Hat, Inc. - initial API and implementation */ -package org.eclipse.jkube.kit.config.access; +package org.eclipse.jkube.kit.common.access; +import io.fabric8.kubernetes.api.model.NamedContextBuilder; import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.ConfigBuilder; import org.junit.jupiter.api.Test; @@ -31,6 +32,7 @@ void should_load_configuration_from_properties() { properties.put("jkube.password", "the pa$$w*rd"); properties.put("jkube.masterUrl", "https://example.com"); properties.put("jkube.corner-case", "corner"); + properties.put("jkube.currentContext", "ctx1"); properties.put("manufactur8.jkube.corner-case", "cased"); // When final Config config = ClusterConfiguration.from(properties).build().getConfig(); @@ -38,6 +40,7 @@ void should_load_configuration_from_properties() { assertThat(config).isNotNull() .hasFieldOrPropertyWithValue("username", "user name") .hasFieldOrPropertyWithValue("password", "the pa$$w*rd") + .hasFieldOrPropertyWithValue("currentContext", new NamedContextBuilder().withName("ctx1").build()) .hasFieldOrPropertyWithValue("masterUrl", "https://example.com/"); } @@ -104,6 +107,7 @@ void loadsConfigurationFromKubernetesConfig() { .withClientKeyData("clientKeyData") .withClientKeyAlgo("clientKeyAlgo") .withClientKeyPassphrase("clientKeyPassphrase") + .withCurrentContext(new NamedContextBuilder().withName("ctx1").build()) .withTrustStoreFile("trustStoreFile") .withTrustStorePassphrase("trustStorePassphrase") .withKeyStoreFile("keyStoreFile") @@ -126,6 +130,7 @@ void loadsConfigurationFromKubernetesConfig() { .hasFieldOrPropertyWithValue("clientKeyData", "clientKeyData") .hasFieldOrPropertyWithValue("clientKeyAlgo", "clientKeyAlgo") .hasFieldOrPropertyWithValue("clientKeyPassphrase", "clientKeyPassphrase") + .hasFieldOrPropertyWithValue("currentContext", new NamedContextBuilder().withName("ctx1").build()) .hasFieldOrPropertyWithValue("trustStoreFile", "trustStoreFile") .hasFieldOrPropertyWithValue("trustStorePassphrase", "trustStorePassphrase") .hasFieldOrPropertyWithValue("keyStoreFile", "keyStoreFile") diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/JKubeServiceHub.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/JKubeServiceHub.java index 104fccd275..65652d344a 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/JKubeServiceHub.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/JKubeServiceHub.java @@ -26,8 +26,8 @@ import org.eclipse.jkube.kit.build.service.docker.DockerServiceHub; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.LazyBuilder; -import org.eclipse.jkube.kit.config.access.ClusterAccess; -import org.eclipse.jkube.kit.config.access.ClusterConfiguration; +import org.eclipse.jkube.kit.common.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.config.resource.ResourceService; import org.eclipse.jkube.kit.config.resource.ResourceServiceConfig; 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 9ba9356af2..bc78ed2f14 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 @@ -28,7 +28,7 @@ import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.OpenshiftHelper; -import org.eclipse.jkube.kit.config.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.image.ImageName; import io.fabric8.kubernetes.api.model.DeletionPropagation; diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ApplyServiceCrudTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ApplyServiceCrudTest.java index 6ecf43f722..f13017c4f9 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ApplyServiceCrudTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ApplyServiceCrudTest.java @@ -41,8 +41,8 @@ import io.fabric8.openshift.client.OpenShiftClient; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.KitLogger; -import org.eclipse.jkube.kit.config.access.ClusterAccess; -import org.eclipse.jkube.kit.config.access.ClusterConfiguration; +import org.eclipse.jkube.kit.common.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; 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 77ac9c1a13..eaad79c61c 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 @@ -42,8 +42,8 @@ import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.Serialization; -import org.eclipse.jkube.kit.config.access.ClusterAccess; -import org.eclipse.jkube.kit.config.access.ClusterConfiguration; +import org.eclipse.jkube.kit.common.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.eclipse.jkube.kit.config.service.openshift.WebServerEventCollector; diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/DebugServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/DebugServiceTest.java index c53e26b6c8..5f2d9d48d7 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/DebugServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/DebugServiceTest.java @@ -49,8 +49,8 @@ import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.Serialization; -import org.eclipse.jkube.kit.config.access.ClusterAccess; -import org.eclipse.jkube.kit.config.access.ClusterConfiguration; +import org.eclipse.jkube.kit.common.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.junit.jupiter.api.AfterEach; diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubTest.java index b1f065524c..e800734a7d 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubTest.java @@ -18,7 +18,7 @@ import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.service.MigrateService; import org.eclipse.jkube.kit.common.util.LazyBuilder; -import org.eclipse.jkube.kit.config.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; import org.eclipse.jkube.kit.config.resource.ResourceService; import org.eclipse.jkube.kit.config.resource.RuntimeMode; 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 14f7406778..11083dca1a 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 @@ -22,7 +22,7 @@ import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; import io.fabric8.kubernetes.client.Watcher; -import org.eclipse.jkube.kit.config.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.junit.jupiter.api.Test; 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 3b4b856e2c..26436a6473 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 @@ -34,8 +34,8 @@ import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.Serialization; -import org.eclipse.jkube.kit.config.access.ClusterAccess; -import org.eclipse.jkube.kit.config.access.ClusterConfiguration; +import org.eclipse.jkube.kit.common.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftUndeployServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftUndeployServiceTest.java index 96b3cebd0e..938fbe9f28 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftUndeployServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftUndeployServiceTest.java @@ -28,8 +28,8 @@ import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.Serialization; -import org.eclipse.jkube.kit.config.access.ClusterAccess; -import org.eclipse.jkube.kit.config.access.ClusterConfiguration; +import org.eclipse.jkube.kit.common.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; diff --git a/jkube-kit/doc/src/main/asciidoc/inc/apply/_cluster_access_configuration.adoc b/jkube-kit/doc/src/main/asciidoc/inc/apply/_cluster_access_configuration.adoc index 3b0ce91a4e..50ee722172 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/apply/_cluster_access_configuration.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/apply/_cluster_access_configuration.adoc @@ -88,6 +88,10 @@ endif::[] | Client Key Passphrase on which to operate. | `jkube.clientKeyPassphrase` +| *currentContext* +| Client Kubernetes Context that is currently in use +| `jkube.currentContext` + | *trustStoreFile* | Trust Store File on which to operate. | `jkube.trustStoreFile` diff --git a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java index 730a4521f1..226c0f7cad 100644 --- a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java +++ b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java @@ -25,8 +25,8 @@ import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.Plugin; import org.eclipse.jkube.kit.common.util.EnvUtil; -import org.eclipse.jkube.kit.config.access.ClusterAccess; -import org.eclipse.jkube.kit.config.access.ClusterConfiguration; +import org.eclipse.jkube.kit.common.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; diff --git a/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherTest.java b/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherTest.java index 1d56b92676..0a4e019a1f 100644 --- a/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherTest.java +++ b/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherTest.java @@ -20,7 +20,7 @@ import org.eclipse.jkube.kit.build.service.docker.watch.ExecTask; import org.eclipse.jkube.kit.build.service.docker.watch.WatchContext; import org.eclipse.jkube.kit.common.JavaProject; -import org.eclipse.jkube.kit.config.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.watcher.api.WatcherContext; diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java index 85f5d0d05a..65443b5c67 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java @@ -41,8 +41,8 @@ import org.eclipse.jkube.kit.common.util.EnvUtil; import org.eclipse.jkube.kit.common.util.MavenUtil; import org.eclipse.jkube.kit.common.util.ResourceUtil; -import org.eclipse.jkube.kit.config.access.ClusterAccess; -import org.eclipse.jkube.kit.config.access.ClusterConfiguration; +import org.eclipse.jkube.kit.common.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.image.build.RegistryAuthConfiguration; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.config.resource.ProcessorConfig; diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java index 9bc37db986..2cfd4c8ded 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java @@ -26,8 +26,8 @@ import org.eclipse.jkube.kit.common.util.LazyBuilder; import org.eclipse.jkube.kit.common.util.MavenUtil; import org.eclipse.jkube.kit.common.util.ResourceUtil; -import org.eclipse.jkube.kit.config.access.ClusterAccess; -import org.eclipse.jkube.kit.config.access.ClusterConfiguration; +import org.eclipse.jkube.kit.common.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.apache.maven.execution.MavenSession; import org.apache.maven.plugin.AbstractMojo; diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoTest.java index 47078d9f0d..bd1473130f 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoTest.java @@ -21,7 +21,7 @@ import java.util.Properties; import io.fabric8.openshift.client.NamespacedOpenShiftClient; -import org.eclipse.jkube.kit.config.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.apache.maven.plugin.MojoExecutionException; diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojoTest.java index ae69fa8fe0..0a619977e0 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojoTest.java @@ -20,7 +20,7 @@ import java.util.Properties; import org.eclipse.jkube.kit.common.util.AnsiLogger; -import org.eclipse.jkube.kit.config.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.service.DebugContext; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; @@ -37,8 +37,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.isNotNull; -import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/LogMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/LogMojoTest.java index 7f68b21109..141128e829 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/LogMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/LogMojoTest.java @@ -21,7 +21,7 @@ import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.openshift.client.OpenShiftClient; -import org.eclipse.jkube.kit.config.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; import org.eclipse.jkube.kit.config.service.PodLogService; diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java index 9e36a6ce0d..fdba01532e 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java @@ -24,7 +24,7 @@ import io.fabric8.kubernetes.client.KubernetesClient; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.JavaProject; -import org.eclipse.jkube.kit.config.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; diff --git a/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftResourceMojoTest.java b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftResourceMojoTest.java index ea48613146..15acbe6d15 100644 --- a/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftResourceMojoTest.java +++ b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftResourceMojoTest.java @@ -22,7 +22,7 @@ import org.apache.maven.project.MavenProjectHelper; import org.apache.maven.settings.Settings; import org.eclipse.jkube.kit.common.KitLogger; -import org.eclipse.jkube.kit.config.access.ClusterConfiguration; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.junit.jupiter.api.BeforeEach; From 72dd474e1cd64c46e30b14e09afcf21b1cf11099 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Wed, 26 Jun 2024 20:01:34 +0530 Subject: [PATCH 214/289] refactor : remove ClusterAccess from JKubeServiceHub constructor ClusterAccess is not required in the constructor as ClusterConfiguration is being passed in JKubeConfiguration Signed-off-by: Rohan Kumar --- .../gradle/plugin/task/AbstractJKubeTask.java | 6 +- .../plugin/task/KubernetesApplyTask.java | 3 +- .../plugin/task/KubernetesWatchTask.java | 2 + .../kit/config/service/JKubeServiceHub.java | 11 +-- .../config/service/ApplyServiceCrudTest.java | 7 +- .../kit/config/service/ApplyServiceTest.java | 7 +- .../kit/config/service/DebugServiceTest.java | 6 +- .../config/service/JKubeServiceHubTest.java | 78 +++++++++++-------- .../KubernetesUndeployServiceTest.java | 6 +- .../OpenshiftUndeployServiceTest.java | 6 +- .../service/plugins/PluginManagerTest.java | 2 +- .../service/plugins/PluginServiceTest.java | 10 ++- .../SpringBootWatcherIntegrationTest.java | 6 +- .../plugin/mojo/build/AbstractDockerMojo.java | 7 +- .../plugin/mojo/build/AbstractJKubeMojo.java | 6 +- .../maven/plugin/mojo/build/ApplyMojo.java | 3 +- .../maven/plugin/mojo/build/ResourceMojo.java | 3 +- .../maven/plugin/mojo/develop/WatchMojo.java | 2 + 18 files changed, 88 insertions(+), 83 deletions(-) diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java index 509e2293a4..16b497abb5 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java @@ -57,7 +57,6 @@ public abstract class AbstractJKubeTask extends DefaultTask implements Kubernete protected final KubernetesExtension kubernetesExtension; protected KitLogger kitLogger; - protected ClusterAccess clusterAccess; protected JKubeServiceHub jKubeServiceHub; protected static final String DOCKER_BUILD_TIMESTAMP = "docker/build.timestamp"; protected List resolvedImages; @@ -80,7 +79,6 @@ public final void runTask() { protected void init() { kubernetesExtension.javaProject = GradleUtil.convertGradleProject(getProject()); kitLogger = createLogger(null); - clusterAccess = new ClusterAccess(initClusterConfiguration()); jKubeServiceHub = initJKubeServiceHubBuilder().build(); kubernetesExtension.resources = updateResourceConfigNamespace(kubernetesExtension.getNamespaceOrNull(), kubernetesExtension.resources); resolvedImages = resolveImages(); @@ -142,8 +140,8 @@ protected JKubeServiceHub.JKubeServiceHubBuilder initJKubeServiceHubBuilder() { .registry(kubernetesExtension.getPushRegistryOrNull() != null ? kubernetesExtension.getPushRegistryOrNull() : kubernetesExtension.getRegistryOrDefault()) .build()) + .clusterConfiguration(initClusterConfiguration()) .build()) - .clusterAccess(clusterAccess) .offline(kubernetesExtension.getOfflineOrDefault()) .platformMode(kubernetesExtension.getRuntimeMode()) .resourceServiceConfig(initResourceServiceConfig()) @@ -176,7 +174,7 @@ protected GeneratorContext.GeneratorContextBuilder initGeneratorContextBuilder() .prePackagePhase(false) .useProjectClasspath(kubernetesExtension.getUseProjectClassPathOrDefault()) .sourceDirectory(kubernetesExtension.getBuildSourceDirectoryOrDefault()) - .openshiftNamespace(StringUtils.isNotBlank(kubernetesExtension.getNamespaceOrNull()) ? kubernetesExtension.getNamespaceOrNull() : clusterAccess.getNamespace()) + .openshiftNamespace(StringUtils.isNotBlank(kubernetesExtension.getNamespaceOrNull()) ? kubernetesExtension.getNamespaceOrNull() : new ClusterAccess(initClusterConfiguration()).getNamespace()) .buildTimestamp(getBuildTimestamp(null, null, kubernetesExtension.javaProject.getBuildDirectory().getAbsolutePath(), DOCKER_BUILD_TIMESTAMP)) .filter(kubernetesExtension.getFilterOrNull()); diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTask.java index 1534f0c6d3..bd3b2e828d 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTask.java @@ -19,6 +19,7 @@ import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClientException; import org.eclipse.jkube.gradle.plugin.KubernetesExtension; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.OpenshiftHelper; import org.eclipse.jkube.kit.config.service.ApplyService; @@ -92,6 +93,6 @@ protected void configureApplyService() { applyService.setRollingUpgradePreserveScale(kubernetesExtension.getRollingUpgradePreserveScaleOrDefault()); applyService.setRecreateMode(kubernetesExtension.getRecreateOrDefault()); applyService.setNamespace(kubernetesExtension.getNamespaceOrNull()); - applyService.setFallbackNamespace(resolveFallbackNamespace(kubernetesExtension.resources, clusterAccess)); + applyService.setFallbackNamespace(resolveFallbackNamespace(kubernetesExtension.resources, new ClusterAccess(initClusterConfiguration()))); } } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java index ca1eb42be7..456ebbb50e 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java @@ -20,6 +20,7 @@ import org.eclipse.jkube.kit.build.core.GavLabel; import org.eclipse.jkube.kit.build.service.docker.DockerServiceHub; import org.eclipse.jkube.kit.build.service.docker.watch.WatchContext; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.ResourceUtil; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; @@ -58,6 +59,7 @@ public void run() { try { List resources = KubernetesHelper.loadResources(getManifest(kubernetesClient)); WatcherContext context = createWatcherContext(); + ClusterAccess clusterAccess = new ClusterAccess(initClusterConfiguration()); WatcherManager.watch(resolvedImages, applicableNamespace(null, kubernetesExtension.getNamespaceOrNull(), kubernetesExtension.resources, clusterAccess), diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/JKubeServiceHub.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/JKubeServiceHub.java index 65652d344a..211c2dc9eb 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/JKubeServiceHub.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/JKubeServiceHub.java @@ -27,7 +27,6 @@ import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.LazyBuilder; import org.eclipse.jkube.kit.common.access.ClusterAccess; -import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.config.resource.ResourceService; import org.eclipse.jkube.kit.config.resource.ResourceServiceConfig; @@ -51,7 +50,6 @@ public class JKubeServiceHub implements Closeable { private final BuildServiceConfig buildServiceConfig; @Getter private final ResourceServiceConfig resourceServiceConfig; - private final ClusterAccess clusterAccess; @Getter @Setter private RuntimeMode platformMode; @@ -70,12 +68,11 @@ public class JKubeServiceHub implements Closeable { @Builder(toBuilder = true) public JKubeServiceHub( - ClusterAccess clusterAccess, RuntimeMode platformMode, KitLogger log, + RuntimeMode platformMode, KitLogger log, DockerServiceHub dockerServiceHub, JKubeConfiguration configuration, BuildServiceConfig buildServiceConfig, ResourceServiceConfig resourceServiceConfig, LazyBuilder resourceService, boolean offline) { - this.clusterAccess = clusterAccess; this.platformMode = platformMode; this.log = log; this.dockerServiceHub = dockerServiceHub; @@ -129,11 +126,7 @@ private ClusterAccess initClusterAccessIfNecessary() { if (offline) { throw new IllegalArgumentException("Connection to Cluster required. Please check if offline mode is set to false"); } - if (clusterAccess != null) { - return clusterAccess; - } - return new ClusterAccess(ClusterConfiguration.from( - System.getProperties(), configuration.getProject().getProperties()).build()); + return new ClusterAccess(configuration.getClusterConfiguration()); } public RuntimeMode getRuntimeMode() { diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ApplyServiceCrudTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ApplyServiceCrudTest.java index f13017c4f9..b318232121 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ApplyServiceCrudTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ApplyServiceCrudTest.java @@ -41,7 +41,6 @@ import io.fabric8.openshift.client.OpenShiftClient; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.KitLogger; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.junit.jupiter.api.BeforeEach; @@ -63,7 +62,6 @@ @EnableKubernetesMockClient(crud = true) class ApplyServiceCrudTest { - KubernetesMockServer kubernetesMockServer; KubernetesClient kubernetesClient; private KitLogger log; @@ -76,9 +74,10 @@ void setUp() { apiGroupList = new APIGroupList(); final JKubeServiceHub serviceHub = JKubeServiceHub.builder() .log(log) - .configuration(JKubeConfiguration.builder().build()) + .configuration(JKubeConfiguration.builder() + .clusterConfiguration(ClusterConfiguration.from(kubernetesClient.getConfiguration()).build()) + .build()) .platformMode(RuntimeMode.KUBERNETES) - .clusterAccess(new ClusterAccess(ClusterConfiguration.from(kubernetesClient.getConfiguration()).build())) .build(); applyService = serviceHub.getApplyService(); applyService.setNamespace("default"); 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 eaad79c61c..d80c79eb5d 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 @@ -42,7 +42,6 @@ import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.Serialization; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.eclipse.jkube.kit.config.service.openshift.WebServerEventCollector; @@ -72,7 +71,6 @@ @EnableKubernetesMockClient class ApplyServiceTest { - KubernetesMockServer mockServer; OpenShiftClient client; @@ -82,9 +80,10 @@ class ApplyServiceTest { void setUp() { final JKubeServiceHub serviceHub = JKubeServiceHub.builder() .log(new KitLogger.SilentLogger()) - .configuration(JKubeConfiguration.builder().build()) + .configuration(JKubeConfiguration.builder() + .clusterConfiguration(ClusterConfiguration.from(client.getConfiguration()).build()) + .build()) .platformMode(RuntimeMode.KUBERNETES) - .clusterAccess(new ClusterAccess(ClusterConfiguration.from(client.getConfiguration()).build())) .build(); applyService = serviceHub.getApplyService(); applyService.setNamespace("default"); diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/DebugServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/DebugServiceTest.java index 5f2d9d48d7..a269ffca3f 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/DebugServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/DebugServiceTest.java @@ -49,7 +49,6 @@ import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.Serialization; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; import org.eclipse.jkube.kit.config.resource.RuntimeMode; @@ -94,9 +93,10 @@ void setUp() { logger = spy(new KitLogger.SilentLogger()); final JKubeServiceHub serviceHub = JKubeServiceHub.builder() .log(logger) - .configuration(JKubeConfiguration.builder().build()) + .configuration(JKubeConfiguration.builder() + .clusterConfiguration(ClusterConfiguration.from(kubernetesClient.getConfiguration()).build()) + .build()) .platformMode(RuntimeMode.KUBERNETES) - .clusterAccess(new ClusterAccess(ClusterConfiguration.from(kubernetesClient.getConfiguration()).build())) .build(); debugContext = DebugContext.builder() .namespace("namespace") diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubTest.java index e800734a7d..fedb3c2393 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubTest.java @@ -13,12 +13,21 @@ */ package org.eclipse.jkube.kit.config.service; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.Client; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.http.HttpClient; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; +import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; +import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.kit.build.service.docker.DockerServiceHub; import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.common.service.MigrateService; import org.eclipse.jkube.kit.common.util.LazyBuilder; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; import org.eclipse.jkube.kit.config.resource.ResourceService; import org.eclipse.jkube.kit.config.resource.RuntimeMode; @@ -32,35 +41,39 @@ import org.eclipse.jkube.kit.resource.helm.HelmService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; -import org.mockito.MockedConstruction; +import org.junit.jupiter.api.io.TempDir; +import java.nio.file.Path; + +import static java.net.HttpURLConnection.HTTP_OK; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.assertThatNullPointerException; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.eclipse.jkube.kit.config.resource.RuntimeMode.KUBERNETES; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.mockConstruction; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @SuppressWarnings({"unused"}) +@EnableKubernetesMockClient(crud = true) class JKubeServiceHubTest { + @TempDir + Path temporaryFolder; private JKubeServiceHub.JKubeServiceHubBuilder jKubeServiceHubBuilder; - private OpenShiftClient openShiftClient; + KubernetesMockServer kubernetesMockServer; + OpenShiftClient openShiftClient; @BeforeEach void setUp() { - final ClusterAccess clusterAccess = mock(ClusterAccess.class, RETURNS_DEEP_STUBS); - openShiftClient = mock(OpenShiftClient.class); - when(clusterAccess.createDefaultClient()).thenReturn(openShiftClient); - when(openShiftClient.adapt(OpenShiftClient.class)).thenReturn(openShiftClient); jKubeServiceHubBuilder = JKubeServiceHub.builder() .platformMode(KUBERNETES) - .configuration(mock(JKubeConfiguration.class, RETURNS_DEEP_STUBS)) - .clusterAccess(clusterAccess) + .configuration(JKubeConfiguration.builder() + .clusterConfiguration(ClusterConfiguration.from(openShiftClient.getConfiguration()).build()) + .project(JavaProject.builder() + .baseDirectory(temporaryFolder.toFile()) + .build()) + .build()) .log(new KitLogger.SilentLogger()) .dockerServiceHub(mock(DockerServiceHub.class, RETURNS_DEEP_STUBS)) .offline(false) @@ -170,7 +183,7 @@ void getUndeployServiceInOpenShiftWithInvalidClient() { // Given jKubeServiceHubBuilder.platformMode(RuntimeMode.OPENSHIFT); try (JKubeServiceHub jKubeServiceHub = jKubeServiceHubBuilder.build()) { - when(openShiftClient.isSupported()).thenReturn(true); + kubernetesMockServer.setUnsupported("openshift.io"); // When final UndeployService result = jKubeServiceHub.getUndeployService(); // Then @@ -185,7 +198,9 @@ void getUndeployServiceInOpenShiftWithValidClient() { // Given jKubeServiceHubBuilder.platformMode(RuntimeMode.OPENSHIFT); try (JKubeServiceHub jKubeServiceHub = jKubeServiceHubBuilder.build()) { - when(openShiftClient.hasApiGroup("openshift.io", false)).thenReturn(true); + kubernetesMockServer.expect().get().withPath("/apis") + .andReturn(HTTP_OK, new APIGroupListBuilder().addToGroups(new APIGroupBuilder().withName("apps.openshift.io").build()).build()) + .once(); // When final UndeployService result = jKubeServiceHub.getUndeployService(); // Then @@ -247,30 +262,19 @@ void getResourceService() { } } - @Test - void clusterAccessIsNotInitializedIfProvided() { - // Given - try (final JKubeServiceHub jKubeServiceHub = jKubeServiceHubBuilder.build(); - MockedConstruction clusterAccessMockedConstruction = mockConstruction(ClusterAccess.class)) { - assertThat(clusterAccessMockedConstruction.constructed()).asList().isEmpty(); - // When - jKubeServiceHub.getClusterAccess(); - // Then - assertThat(clusterAccessMockedConstruction.constructed()).asList().isEmpty(); - } - } - @Test void clusterAccessIsInitializedLazily() { // Given - jKubeServiceHubBuilder.clusterAccess(null); - try (final JKubeServiceHub jKubeServiceHub = jKubeServiceHubBuilder.build(); - MockedConstruction clusterAccessMockedConstruction = mockConstruction(ClusterAccess.class)) { - assertThat(clusterAccessMockedConstruction.constructed()).asList().isEmpty(); + try (final JKubeServiceHub jKubeServiceHub = jKubeServiceHubBuilder.build()) { // When jKubeServiceHub.getClusterAccess(); // Then - assertThat(clusterAccessMockedConstruction.constructed()).asList().hasSize(1); + assertThat(jKubeServiceHub.getClusterAccess()) + .isNotNull(); + assertThat(jKubeServiceHub.getClusterAccess().createDefaultClient()) + .extracting(Client::getMasterUrl) + .extracting("host", "port") + .containsExactly(kubernetesMockServer.getHostName(), kubernetesMockServer.getPort()); } } @@ -300,10 +304,16 @@ void getApplyServiceWithOfflineThrowsException() { @Test void closeClosesInitializedClient() { + KubernetesClient kubernetesClient; try (final JKubeServiceHub jKubeServiceHub = jKubeServiceHubBuilder.build()) { - jKubeServiceHub.getClient(); + kubernetesClient = jKubeServiceHub.getClient(); } // Then - verify(openShiftClient, times(1)).close(); + assertThat(kubernetesClient) + .isNotNull() + .extracting(Client::getHttpClient) + .extracting(HttpClient::isClosed) + .asInstanceOf(InstanceOfAssertFactories.BOOLEAN) + .isTrue(); } } 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 26436a6473..e3d36ba448 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 @@ -34,7 +34,6 @@ import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.Serialization; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.resource.RuntimeMode; @@ -72,8 +71,9 @@ void setUp() { final JKubeServiceHub jKubeServiceHub = JKubeServiceHub.builder() .log(logger) .platformMode(RuntimeMode.KUBERNETES) - .configuration(JKubeConfiguration.builder().build()) - .clusterAccess(new ClusterAccess(ClusterConfiguration.from(kubernetesClient.getConfiguration()).namespace("test").build())) + .configuration(JKubeConfiguration.builder() + .clusterConfiguration(ClusterConfiguration.from(kubernetesClient.getConfiguration()).build()) + .build()) .build(); kubernetesUndeployService = new KubernetesUndeployService(jKubeServiceHub, logger); } diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftUndeployServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftUndeployServiceTest.java index 938fbe9f28..66ecb21d17 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftUndeployServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/OpenshiftUndeployServiceTest.java @@ -28,7 +28,6 @@ import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.Serialization; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.resource.RuntimeMode; @@ -73,8 +72,9 @@ void setUp() { final JKubeServiceHub jKubeServiceHub = JKubeServiceHub.builder() .log(logger) .platformMode(RuntimeMode.KUBERNETES) - .configuration(JKubeConfiguration.builder().build()) - .clusterAccess(new ClusterAccess(ClusterConfiguration.from(openShiftClient.getConfiguration()).namespace("test").build())) + .configuration(JKubeConfiguration.builder() + .clusterConfiguration(ClusterConfiguration.from(openShiftClient.getConfiguration()).build()) + .build()) .build(); resourceConfig = ResourceConfig.builder().namespace("test").build(); openshiftUndeployService = new OpenshiftUndeployService(jKubeServiceHub, logger); diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginManagerTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginManagerTest.java index ca3f5cf7c7..c3968e2bff 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginManagerTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginManagerTest.java @@ -35,7 +35,7 @@ class PluginManagerTest { @BeforeEach void setUp() { - jKubeServiceHub = new JKubeServiceHub(null, RuntimeMode.KUBERNETES, new KitLogger.StdoutLogger(), + jKubeServiceHub = new JKubeServiceHub(RuntimeMode.KUBERNETES, new KitLogger.StdoutLogger(), null, new JKubeConfiguration(), new BuildServiceConfig(), new ResourceServiceConfig(), new LazyBuilder<>(hub -> null), true); } diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginServiceTest.java index 0bc99bcfb4..5e9c4af7b5 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginServiceTest.java @@ -14,11 +14,15 @@ package org.eclipse.jkube.kit.config.service.plugins; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; +import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; import org.apache.commons.io.FileUtils; import org.eclipse.jkube.api.JKubePlugin; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.common.util.LazyBuilder; import org.eclipse.jkube.kit.config.resource.ResourceServiceConfig; import org.eclipse.jkube.kit.config.resource.RuntimeMode; @@ -41,6 +45,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +@EnableKubernetesMockClient(crud = true) class PluginServiceTest { @TempDir @@ -48,15 +53,18 @@ class PluginServiceTest { private KitLogger logger; private JKubeServiceHub jKubeServiceHub; + private KubernetesMockServer mockServer; + private KubernetesClient kubernetesClient; @BeforeEach void setUp() { logger = spy(new KitLogger.SilentLogger()); - jKubeServiceHub = new JKubeServiceHub(null, RuntimeMode.KUBERNETES, logger, null, + jKubeServiceHub = new JKubeServiceHub(RuntimeMode.KUBERNETES, logger, null, JKubeConfiguration.builder() .project(JavaProject.builder() .outputDirectory(temporaryFolder) .build()) + .clusterConfiguration(ClusterConfiguration.from(kubernetesClient.getConfiguration()).build()) .build(), new BuildServiceConfig(), new ResourceServiceConfig(), new LazyBuilder<>(hub -> null), true); } diff --git a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java index 226c0f7cad..691d231ac0 100644 --- a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java +++ b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/watcher/SpringBootWatcherIntegrationTest.java @@ -25,7 +25,6 @@ import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.Plugin; import org.eclipse.jkube.kit.common.util.EnvUtil; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.config.resource.RuntimeMode; @@ -78,8 +77,9 @@ void setUp() throws IOException { final JKubeServiceHub jKubeServiceHub = JKubeServiceHub.builder() .log(logger) .platformMode(RuntimeMode.KUBERNETES) - .configuration(JKubeConfiguration.builder().build()) - .clusterAccess(new ClusterAccess(ClusterConfiguration.from(kubernetesClient.getConfiguration()).namespace("test").build())) + .configuration(JKubeConfiguration.builder() + .clusterConfiguration(ClusterConfiguration.from(kubernetesClient.getConfiguration()).build()) + .build()) .build(); watcherContext = WatcherContext.builder() .logger(logger) diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java index 65443b5c67..04dff97aca 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java @@ -41,7 +41,6 @@ import org.eclipse.jkube.kit.common.util.EnvUtil; import org.eclipse.jkube.kit.common.util.MavenUtil; import org.eclipse.jkube.kit.common.util.ResourceUtil; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.image.build.RegistryAuthConfiguration; import org.eclipse.jkube.kit.config.resource.PlatformMode; @@ -311,9 +310,6 @@ public abstract class AbstractDockerMojo extends AbstractMojo protected KitLogger log; - // Access for creating OpenShift binary builds - protected ClusterAccess clusterAccess; - // The JKube service hub protected JKubeServiceHub jkubeServiceHub; @@ -375,7 +371,6 @@ public final void execute() throws MojoExecutionException, MojoFailureException protected void init() { log = new AnsiLogger(getLog(), useColorForLogging(), verbose, !settings.getInteractiveMode(), getLogPrefix()); authConfigFactory = new DockerAuthConfigFactory(log); - clusterAccess = new ClusterAccess(initClusterConfiguration()); runtimeMode = getConfiguredRuntimeMode(); } @@ -398,7 +393,6 @@ protected void doExecute() throws MojoExecutionException { jkubeServiceHub = JKubeServiceHub.builder() .log(log) .configuration(initJKubeConfiguration()) - .clusterAccess(clusterAccess) .platformMode(getConfiguredRuntimeMode()) .dockerServiceHub(DockerServiceHub.newInstance(log, dockerAccess)) .buildServiceConfig(buildServiceConfigBuilder().build()) @@ -434,6 +428,7 @@ protected JKubeConfiguration initJKubeConfiguration() throws DependencyResolutio .buildArgs(buildArgs) .pullRegistryConfig(getRegistryConfig(pullRegistry)) .pushRegistryConfig(getRegistryConfig(pushRegistry)) + .clusterConfiguration(initClusterConfiguration()) .build(); } diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java index 2cfd4c8ded..14780a8b38 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java @@ -26,7 +26,6 @@ import org.eclipse.jkube.kit.common.util.LazyBuilder; import org.eclipse.jkube.kit.common.util.MavenUtil; import org.eclipse.jkube.kit.common.util.ResourceUtil; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.apache.maven.execution.MavenSession; @@ -145,8 +144,6 @@ public abstract class AbstractJKubeMojo extends AbstractMojo implements KitLogge protected KitLogger log; - protected ClusterAccess clusterAccess; - // The JKube service hub protected JKubeServiceHub jkubeServiceHub; @@ -164,7 +161,6 @@ public void execute() throws MojoExecutionException, MojoFailureException { protected void init() throws MojoFailureException { log = createLogger(null); - clusterAccess = new ClusterAccess(initClusterConfiguration()); try { javaProject = MavenUtil.convertMavenProjectToJKubeProject(project, session); } catch (DependencyResolutionRequiredException e) { @@ -243,8 +239,8 @@ protected JKubeServiceHub.JKubeServiceHubBuilder initJKubeServiceHubBuilder(Java .settings(MavenUtil.getRegistryServerFromMavenSettings(settings)) .passwordDecryptionMethod(this::decrypt) .build()) + .clusterConfiguration(initClusterConfiguration()) .build()) - .clusterAccess(clusterAccess) .offline(offline) .platformMode(getRuntimeMode()) .resourceServiceConfig(initResourceServiceConfig()) diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojo.java index 10e6b5704a..c6aa99985e 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojo.java @@ -18,6 +18,7 @@ import java.util.Collection; import java.util.List; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.MavenUtil; import org.eclipse.jkube.kit.common.util.OpenshiftHelper; @@ -226,7 +227,7 @@ private void configureApplyService(KubernetesClient kubernetes) { applyService.setRollingUpgradePreserveScale(isRollingUpgradePreserveScale()); applyService.setRecreateMode(recreate); applyService.setNamespace(namespace); - applyService.setFallbackNamespace(resolveFallbackNamespace(resources, clusterAccess)); + applyService.setFallbackNamespace(resolveFallbackNamespace(resources, new ClusterAccess(initClusterConfiguration()))); boolean openShift = OpenshiftHelper.isOpenShift(kubernetes); if (openShift) { diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java index 9b174e97cd..04cfd6523c 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java @@ -25,6 +25,7 @@ import org.eclipse.jkube.generator.api.DefaultGeneratorManager; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.util.MavenUtil; import org.eclipse.jkube.kit.common.util.ResourceClassifier; import org.eclipse.jkube.kit.common.util.ResourceUtil; @@ -232,7 +233,7 @@ private List getResolvedImages(List imag .useProjectClasspath(useProjectClasspath) .strategy(JKubeBuildStrategy.docker) .prePackagePhase(true) - .openshiftNamespace(StringUtils.isNotBlank(this.namespace) ? this.namespace: clusterAccess.getNamespace()) + .openshiftNamespace(StringUtils.isNotBlank(this.namespace) ? this.namespace: new ClusterAccess(initClusterConfiguration()).getNamespace()) .buildTimestamp(getBuildTimestamp(getPluginContext(), CONTEXT_KEY_BUILD_TIMESTAMP, project.getBuild().getDirectory(), DOCKER_BUILD_TIMESTAMP)) .build()); return generatorManager.generateAndMerge(images); diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java index b0b7734d6f..9f6b0e18d9 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java @@ -22,6 +22,7 @@ import org.eclipse.jkube.kit.build.service.docker.DockerServiceHub; import org.eclipse.jkube.kit.build.service.docker.watch.WatchContext; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.util.AnsiLogger; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.MavenUtil; @@ -93,6 +94,7 @@ public void executeInternal() throws MojoExecutionException { KubernetesResourceUtil.validateKubernetesMasterUrl(masterUrl); List appliedK8sResources = KubernetesHelper.loadResources(getManifest(kubernetesClient)); WatcherContext context = getWatcherContext(); + ClusterAccess clusterAccess = new ClusterAccess(initClusterConfiguration()); WatcherManager.watch(getResolvedImages(), applicableNamespace(null, namespace, resources, clusterAccess), From 011799b1e4c80c9f42b2577a810545d233c9f2c3 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Fri, 28 Jun 2024 15:23:05 +0530 Subject: [PATCH 215/289] chore : Remove ClusterAcccess wrapper class from codebase ClusterAccess is just a wrapper around KubernetesClient. Remove it and directly use KubernetesClient and ClusterConfiguration wherever applicable. Signed-off-by: Rohan Kumar --- gradle-plugin/kubernetes/pom.xml | 8 ++++ .../gradle/plugin/task/AbstractJKubeTask.java | 7 +-- .../plugin/task/KubernetesApplyTask.java | 3 +- .../plugin/task/KubernetesWatchTask.java | 4 +- .../plugin/task/KubernetesApplyTaskTest.java | 20 +++----- .../task/KubernetesUndeployTaskTest.java | 17 +++---- .../plugin/task/KubernetesWatchTaskTest.java | 18 +++----- gradle-plugin/openshift/pom.xml | 8 ++++ .../plugin/task/OpenShiftApplyTaskTest.java | 32 +++++++------ .../task/OpenShiftUndeployTaskTest.java | 26 +++++++---- .../plugin/task/OpenShiftWatchTaskTest.java | 33 ++++++------- .../kit/common/access/ClusterAccess.java | 46 ------------------- .../kit/common/access/ClusterAccessTest.java | 44 ------------------ .../kit/config/service/JKubeServiceHub.java | 14 ++---- .../kubernetes/KubernetesClientUtil.java | 14 +++--- .../kubernetes/KubernetesUndeployService.java | 2 +- .../openshift/OpenshiftBuildService.java | 2 +- .../config/service/JKubeServiceHubTest.java | 16 ------- .../kubernetes/KubernetesClientUtilTest.java | 23 +++------- .../openshift/OpenShiftBuildServiceTest.java | 1 - .../jkube/watcher/api/WatcherContext.java | 2 +- .../standard/DockerImageWatcherTest.java | 3 -- kubernetes-maven-plugin/plugin/pom.xml | 8 ++++ .../plugin/mojo/build/AbstractJKubeMojo.java | 3 +- .../maven/plugin/mojo/build/ApplyMojo.java | 4 +- .../maven/plugin/mojo/build/ResourceMojo.java | 4 +- .../maven/plugin/mojo/develop/WatchMojo.java | 4 +- .../plugin/mojo/build/ApplyMojoTest.java | 26 +++-------- .../plugin/mojo/develop/DebugMojoTest.java | 5 -- .../plugin/mojo/develop/LogMojoTest.java | 4 -- .../plugin/mojo/develop/WatchMojoTest.java | 22 ++++----- .../mojo/build/OpenShiftResourceMojoTest.java | 2 +- 32 files changed, 146 insertions(+), 279 deletions(-) delete mode 100644 jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/access/ClusterAccess.java delete mode 100644 jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/access/ClusterAccessTest.java diff --git a/gradle-plugin/kubernetes/pom.xml b/gradle-plugin/kubernetes/pom.xml index 022a011145..89cd2880df 100644 --- a/gradle-plugin/kubernetes/pom.xml +++ b/gradle-plugin/kubernetes/pom.xml @@ -167,6 +167,14 @@ + + io.fabric8 + mockwebserver + + + io.fabric8 + openshift-server-mock + org.junit.jupiter junit-jupiter-engine diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java index 16b497abb5..fa7cc55c4a 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java @@ -22,6 +22,7 @@ import java.util.Optional; import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.KubernetesClientBuilder; import org.apache.commons.lang3.StringUtils; import org.eclipse.jkube.generator.api.DefaultGeneratorManager; import org.eclipse.jkube.generator.api.GeneratorContext; @@ -33,7 +34,6 @@ import org.eclipse.jkube.kit.common.RegistryConfig; import org.eclipse.jkube.kit.common.util.LazyBuilder; import org.eclipse.jkube.kit.common.util.ResourceUtil; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.resource.ResourceConfig; @@ -78,6 +78,7 @@ public final void runTask() { protected void init() { kubernetesExtension.javaProject = GradleUtil.convertGradleProject(getProject()); + kubernetesExtension.access = initClusterConfiguration(); kitLogger = createLogger(null); jKubeServiceHub = initJKubeServiceHubBuilder().build(); kubernetesExtension.resources = updateResourceConfigNamespace(kubernetesExtension.getNamespaceOrNull(), kubernetesExtension.resources); @@ -140,7 +141,7 @@ protected JKubeServiceHub.JKubeServiceHubBuilder initJKubeServiceHubBuilder() { .registry(kubernetesExtension.getPushRegistryOrNull() != null ? kubernetesExtension.getPushRegistryOrNull() : kubernetesExtension.getRegistryOrDefault()) .build()) - .clusterConfiguration(initClusterConfiguration()) + .clusterConfiguration(kubernetesExtension.access) .build()) .offline(kubernetesExtension.getOfflineOrDefault()) .platformMode(kubernetesExtension.getRuntimeMode()) @@ -174,7 +175,7 @@ protected GeneratorContext.GeneratorContextBuilder initGeneratorContextBuilder() .prePackagePhase(false) .useProjectClasspath(kubernetesExtension.getUseProjectClassPathOrDefault()) .sourceDirectory(kubernetesExtension.getBuildSourceDirectoryOrDefault()) - .openshiftNamespace(StringUtils.isNotBlank(kubernetesExtension.getNamespaceOrNull()) ? kubernetesExtension.getNamespaceOrNull() : new ClusterAccess(initClusterConfiguration()).getNamespace()) + .openshiftNamespace(StringUtils.isNotBlank(kubernetesExtension.getNamespaceOrNull()) ? kubernetesExtension.getNamespaceOrNull() : new KubernetesClientBuilder().withConfig(kubernetesExtension.access.getConfig()).build().getNamespace()) .buildTimestamp(getBuildTimestamp(null, null, kubernetesExtension.javaProject.getBuildDirectory().getAbsolutePath(), DOCKER_BUILD_TIMESTAMP)) .filter(kubernetesExtension.getFilterOrNull()); diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTask.java index bd3b2e828d..98839d4389 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTask.java @@ -19,7 +19,6 @@ import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.KubernetesClientException; import org.eclipse.jkube.gradle.plugin.KubernetesExtension; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.OpenshiftHelper; import org.eclipse.jkube.kit.config.service.ApplyService; @@ -93,6 +92,6 @@ protected void configureApplyService() { applyService.setRollingUpgradePreserveScale(kubernetesExtension.getRollingUpgradePreserveScaleOrDefault()); applyService.setRecreateMode(kubernetesExtension.getRecreateOrDefault()); applyService.setNamespace(kubernetesExtension.getNamespaceOrNull()); - applyService.setFallbackNamespace(resolveFallbackNamespace(kubernetesExtension.resources, new ClusterAccess(initClusterConfiguration()))); + applyService.setFallbackNamespace(resolveFallbackNamespace(kubernetesExtension.resources, jKubeServiceHub.getClient())); } } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java index 456ebbb50e..20383a32ad 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java @@ -20,7 +20,6 @@ import org.eclipse.jkube.kit.build.core.GavLabel; import org.eclipse.jkube.kit.build.service.docker.DockerServiceHub; import org.eclipse.jkube.kit.build.service.docker.watch.WatchContext; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.ResourceUtil; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; @@ -59,10 +58,9 @@ public void run() { try { List resources = KubernetesHelper.loadResources(getManifest(kubernetesClient)); WatcherContext context = createWatcherContext(); - ClusterAccess clusterAccess = new ClusterAccess(initClusterConfiguration()); WatcherManager.watch(resolvedImages, - applicableNamespace(null, kubernetesExtension.getNamespaceOrNull(), kubernetesExtension.resources, clusterAccess), + applicableNamespace(null, kubernetesExtension.getNamespaceOrNull(), kubernetesExtension.resources, kubernetesClient), resources, context); } catch (KubernetesClientException kubernetesClientException) { diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTaskTest.java index da4d700386..05e7819dbb 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTaskTest.java @@ -13,13 +13,14 @@ */ package org.eclipse.jkube.gradle.plugin.task; -import java.net.URL; import java.util.Collections; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; import io.fabric8.openshift.client.OpenShiftClient; import org.eclipse.jkube.gradle.plugin.KubernetesExtension; import org.eclipse.jkube.gradle.plugin.TestKubernetesExtension; -import org.eclipse.jkube.kit.common.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.service.ApplyService; import org.gradle.api.provider.Property; @@ -34,32 +35,26 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockConstruction; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +@EnableKubernetesMockClient(crud = true) class KubernetesApplyTaskTest { @RegisterExtension public final TaskEnvironmentExtension taskEnvironment = new TaskEnvironmentExtension(); - private MockedConstruction clusterAccessMockedConstruction; private MockedConstruction applyServiceMockedConstruction; private TestKubernetesExtension extension; + private KubernetesClient kubernetesClient; @BeforeEach void setUp(){ - clusterAccessMockedConstruction = mockConstruction(ClusterAccess.class, (mock, ctx) -> { - // OpenShiftClient instance needed due to OpenShift checks performed in KubernetesApply - final OpenShiftClient kubernetesClient = mock(OpenShiftClient.class); - when(kubernetesClient.getMasterUrl()).thenReturn(new URL("http://kubernetes-cluster")); - when(kubernetesClient.adapt(OpenShiftClient.class)).thenReturn(kubernetesClient); - when(mock.createDefaultClient()).thenReturn(kubernetesClient); - }); applyServiceMockedConstruction = mockConstruction(ApplyService.class); extension = new TestKubernetesExtension(); + extension.access = ClusterConfiguration.from(kubernetesClient.getConfiguration()).build(); when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); extension.isFailOnNoKubernetesJson = false; } @@ -67,7 +62,6 @@ void setUp(){ @AfterEach void tearDown() { applyServiceMockedConstruction.close(); - clusterAccessMockedConstruction.close(); } @Test @@ -115,7 +109,7 @@ void configureApplyService_withManifest_shouldSetDefaults() throws Exception { verify(as, times(1)).setRollingUpgradePreserveScale(false); verify(as, times(1)).setRecreateMode(false); verify(as, times(1)).setNamespace(null); - verify(as, times(1)).setFallbackNamespace(null); + verify(as, times(1)).setFallbackNamespace(kubernetesClient.getNamespace()); } @Test diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTaskTest.java index fb46cb9bda..536433a50f 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTaskTest.java @@ -14,17 +14,17 @@ package org.eclipse.jkube.gradle.plugin.task; import java.io.IOException; -import java.net.URL; import java.nio.file.Paths; import java.util.Collections; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; import org.eclipse.jkube.gradle.plugin.KubernetesExtension; import org.eclipse.jkube.gradle.plugin.TestKubernetesExtension; -import org.eclipse.jkube.kit.common.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.service.kubernetes.KubernetesUndeployService; -import io.fabric8.kubernetes.client.KubernetesClient; import org.gradle.api.provider.Property; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -34,37 +34,32 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockConstruction; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +@EnableKubernetesMockClient(crud = true) class KubernetesUndeployTaskTest { @RegisterExtension private final TaskEnvironmentExtension taskEnvironment = new TaskEnvironmentExtension(); private MockedConstruction kubernetesUndeployServiceMockedConstruction; - private MockedConstruction clusterAccessMockedConstruction; private TestKubernetesExtension extension; + private KubernetesClient kubernetesClient; @BeforeEach void setUp() { - clusterAccessMockedConstruction = mockConstruction(ClusterAccess.class, (mock, ctx) -> { - final KubernetesClient kubernetesClient = mock(KubernetesClient.class); - when(mock.createDefaultClient()).thenReturn(kubernetesClient); - when(kubernetesClient.getMasterUrl()).thenReturn(new URL("http://kubernetes-cluster")); - }); kubernetesUndeployServiceMockedConstruction = mockConstruction(KubernetesUndeployService.class); extension = new TestKubernetesExtension(); + extension.access = ClusterConfiguration.from(kubernetesClient.getConfiguration()).build(); when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); } @AfterEach void tearDown() { kubernetesUndeployServiceMockedConstruction.close(); - clusterAccessMockedConstruction.close(); } @Test diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java index f10090b292..25e7cdc829 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java @@ -14,13 +14,14 @@ package org.eclipse.jkube.gradle.plugin.task; import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; import org.assertj.core.api.AssertionsForClassTypes; import org.eclipse.jkube.gradle.plugin.KubernetesExtension; import org.eclipse.jkube.gradle.plugin.TestKubernetesExtension; import org.eclipse.jkube.kit.build.service.docker.DockerAccessFactory; import org.eclipse.jkube.kit.build.service.docker.access.DockerAccess; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.common.util.KubernetesHelper; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.service.kubernetes.DockerBuildService; import org.eclipse.jkube.watcher.api.WatcherManager; import org.junit.jupiter.api.AfterEach; @@ -30,11 +31,10 @@ import org.mockito.MockedConstruction; import org.mockito.MockedStatic; -import java.net.URL; - import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockConstruction; @@ -42,6 +42,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.when; +@EnableKubernetesMockClient(crud = true) class KubernetesWatchTaskTest { @RegisterExtension @@ -49,10 +50,10 @@ class KubernetesWatchTaskTest { private MockedConstruction dockerAccessFactoryMockedConstruction; private MockedConstruction dockerBuildServiceMockedConstruction; - private MockedConstruction clusterAccessMockedConstruction; private MockedStatic watcherManagerMockedStatic; private MockedStatic kubernetesHelperMockedStatic; private TestKubernetesExtension extension; + private KubernetesClient kubernetesClient; @BeforeEach void setUp() { @@ -62,14 +63,10 @@ void setUp() { dockerBuildServiceMockedConstruction = mockConstruction(DockerBuildService.class, (mock, ctx) -> { when(mock.isApplicable()).thenReturn(true); }); - clusterAccessMockedConstruction = mockConstruction(ClusterAccess.class, (mock, ctx) -> { - final KubernetesClient kubernetesClient = mock(KubernetesClient.class); - when(kubernetesClient.getMasterUrl()).thenReturn(new URL("http://kubernetes-cluster")); - when(mock.createDefaultClient()).thenReturn(kubernetesClient); - }); watcherManagerMockedStatic = mockStatic(WatcherManager.class); kubernetesHelperMockedStatic = mockStatic(KubernetesHelper.class); extension = new TestKubernetesExtension(); + extension.access = ClusterConfiguration.from(kubernetesClient.getConfiguration()).build(); when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); kubernetesHelperMockedStatic.when(KubernetesHelper::getDefaultNamespace).thenReturn(null); extension.isFailOnNoKubernetesJson = false; @@ -79,7 +76,6 @@ void setUp() { void tearDown() { watcherManagerMockedStatic.close(); kubernetesHelperMockedStatic.close(); - clusterAccessMockedConstruction.close(); dockerBuildServiceMockedConstruction.close(); dockerAccessFactoryMockedConstruction.close(); } @@ -107,6 +103,6 @@ void runTask_withManifest_shouldWatchEntities() throws Exception { // Then AssertionsForClassTypes.assertThat(watchTask.jKubeServiceHub.getBuildService()).isNotNull() .isInstanceOf(DockerBuildService.class); - watcherManagerMockedStatic.verify(() -> WatcherManager.watch(any(), isNull(), any(), any()), times(1)); + watcherManagerMockedStatic.verify(() -> WatcherManager.watch(any(), eq(kubernetesClient.getNamespace()), any(), any()), times(1)); } } diff --git a/gradle-plugin/openshift/pom.xml b/gradle-plugin/openshift/pom.xml index 793d0e14c6..d906d5fc38 100644 --- a/gradle-plugin/openshift/pom.xml +++ b/gradle-plugin/openshift/pom.xml @@ -64,6 +64,14 @@ + + io.fabric8 + mockwebserver + + + io.fabric8 + openshift-server-mock + org.junit.jupiter junit-jupiter-engine diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftApplyTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftApplyTaskTest.java index 30732b3fb8..14bba7000d 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftApplyTaskTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftApplyTaskTest.java @@ -13,59 +13,63 @@ */ package org.eclipse.jkube.gradle.plugin.task; -import java.net.URL; import java.util.Collections; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; +import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; +import io.fabric8.openshift.client.OpenShiftClient; import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; import org.eclipse.jkube.gradle.plugin.TestOpenShiftExtension; -import org.eclipse.jkube.kit.common.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.service.ApplyService; -import io.fabric8.openshift.client.OpenShiftClient; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.mockito.MockedConstruction; +import static java.net.HttpURLConnection.HTTP_OK; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockConstruction; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +@EnableKubernetesMockClient(crud = true) class OpenShiftApplyTaskTest { @RegisterExtension public final TaskEnvironmentExtension taskEnvironment = new TaskEnvironmentExtension(); - private MockedConstruction clusterAccessMockedConstruction; private MockedConstruction applyServiceMockedConstruction; private TestOpenShiftExtension extension; + private KubernetesMockServer kubernetesMockServer; + private OpenShiftClient openShiftClient; @BeforeEach void setUp() { - clusterAccessMockedConstruction = mockConstruction(ClusterAccess.class, (mock, ctx) -> { - final OpenShiftClient openShiftClient = mock(OpenShiftClient.class); - when(mock.createDefaultClient()).thenReturn(openShiftClient); - when(openShiftClient.getMasterUrl()).thenReturn(new URL("http://openshiftapps-com-cluster:6443")); - when(openShiftClient.hasApiGroup("openshift.io", false)).thenReturn(true); - }); applyServiceMockedConstruction = mockConstruction(ApplyService.class); extension = new TestOpenShiftExtension(); - when(taskEnvironment.project.getExtensions().getByType(OpenShiftExtension.class)).thenReturn(extension); + extension.access = ClusterConfiguration.from(openShiftClient.getConfiguration()).build(); extension.isFailOnNoKubernetesJson = false; + kubernetesMockServer.expect().get().withPath("/apis") + .andReturn(HTTP_OK, new APIGroupListBuilder() + .addToGroups(new APIGroupBuilder().withName("test.openshift.io").build()) + .build()) + .always(); + when(taskEnvironment.project.getExtensions().getByType(OpenShiftExtension.class)).thenReturn(extension); } @AfterEach void tearDown() { applyServiceMockedConstruction.close(); - clusterAccessMockedConstruction.close(); } @Test @@ -113,7 +117,7 @@ void configureApplyService_withManifest_shouldSetDefaults() throws Exception { verify(as, times(1)).setRollingUpgradePreserveScale(false); verify(as, times(1)).setRecreateMode(false); verify(as, times(1)).setNamespace(null); - verify(as, times(1)).setFallbackNamespace(null); + verify(as, times(1)).setFallbackNamespace(openShiftClient.getNamespace()); } @Test diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftUndeployTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftUndeployTaskTest.java index efd40763b7..c89fcd1bea 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftUndeployTaskTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftUndeployTaskTest.java @@ -17,13 +17,17 @@ import java.nio.file.Paths; import java.util.Collections; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; +import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; +import io.fabric8.openshift.client.OpenShiftClient; import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; import org.eclipse.jkube.gradle.plugin.TestOpenShiftExtension; -import org.eclipse.jkube.kit.common.access.ClusterAccess; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.service.openshift.OpenshiftUndeployService; -import io.fabric8.openshift.client.OpenShiftClient; import org.gradle.api.provider.Property; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; @@ -31,32 +35,35 @@ import org.junit.jupiter.api.extension.RegisterExtension; import org.mockito.MockedConstruction; +import static java.net.HttpURLConnection.HTTP_OK; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; -import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockConstruction; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +@EnableKubernetesMockClient(crud = true) class OpenShiftUndeployTaskTest { @RegisterExtension public final TaskEnvironmentExtension taskEnvironment = new TaskEnvironmentExtension(); private MockedConstruction openshiftUndeployServiceMockedConstruction; - private MockedConstruction clusterAccessMockedConstruction; private TestOpenShiftExtension extension; + private KubernetesMockServer kubernetesMockServer; + private OpenShiftClient openShiftClient; @BeforeEach void setUp() { - clusterAccessMockedConstruction = mockConstruction(ClusterAccess.class, (mock, ctx) -> { - final OpenShiftClient openShiftClient = mock(OpenShiftClient.class); - when(mock.createDefaultClient()).thenReturn(openShiftClient); - when(openShiftClient.hasApiGroup("openshift.io", false)).thenReturn(true); - }); openshiftUndeployServiceMockedConstruction = mockConstruction(OpenshiftUndeployService.class); extension = new TestOpenShiftExtension(); + extension.access = ClusterConfiguration.from(openShiftClient.getConfiguration()).build(); + kubernetesMockServer.expect().get().withPath("/apis") + .andReturn(HTTP_OK, new APIGroupListBuilder() + .addToGroups(new APIGroupBuilder().withName("test.openshift.io").build()) + .build()) + .always(); when(taskEnvironment.project.getExtensions().getByType(OpenShiftExtension.class)).thenReturn(extension); when(taskEnvironment.project.getName()).thenReturn("test-project"); } @@ -64,7 +71,6 @@ void setUp() { @AfterEach void tearDown() { openshiftUndeployServiceMockedConstruction.close(); - clusterAccessMockedConstruction.close(); } @Test diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftWatchTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftWatchTaskTest.java index 4b8402b852..6a6e741b85 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftWatchTaskTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftWatchTaskTest.java @@ -13,52 +13,54 @@ */ package org.eclipse.jkube.gradle.plugin.task; +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; +import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; import io.fabric8.openshift.client.OpenShiftClient; import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; import org.eclipse.jkube.gradle.plugin.TestOpenShiftExtension; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.common.util.KubernetesHelper; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.watcher.api.WatcherManager; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import org.mockito.MockedConstruction; import org.mockito.MockedStatic; -import java.net.URL; - +import static java.net.HttpURLConnection.HTTP_OK; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.isNull; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.mockConstruction; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.times; import static org.mockito.Mockito.when; +@EnableKubernetesMockClient(crud = true) class OpenShiftWatchTaskTest { @RegisterExtension private final TaskEnvironmentExtension taskEnvironment = new TaskEnvironmentExtension(); - private MockedConstruction clusterAccessMockedConstruction; private MockedStatic watcherManagerMockedStatic; private MockedStatic kubernetesHelperMockedStatic; private TestOpenShiftExtension extension; + private KubernetesMockServer kubernetesMockServer; + private OpenShiftClient openShiftClient; @BeforeEach void setUp() { - clusterAccessMockedConstruction = mockConstruction(ClusterAccess.class, (mock, ctx) -> { - final OpenShiftClient openShiftClient = mock(OpenShiftClient.class); - when(openShiftClient.getMasterUrl()).thenReturn(new URL("http://openshiftapps.com:6443")); - when(openShiftClient.adapt(OpenShiftClient.class)).thenReturn(openShiftClient); - when(mock.createDefaultClient()).thenReturn(openShiftClient); - }); watcherManagerMockedStatic = mockStatic(WatcherManager.class); kubernetesHelperMockedStatic = mockStatic(KubernetesHelper.class); extension = new TestOpenShiftExtension(); + extension.access = ClusterConfiguration.from(openShiftClient.getConfiguration()).build(); when(taskEnvironment.project.getExtensions().getByType(OpenShiftExtension.class)).thenReturn(extension); + kubernetesMockServer.expect().get().withPath("/apis") + .andReturn(HTTP_OK, new APIGroupListBuilder() + .addToGroups(new APIGroupBuilder().withName("test.openshift.io").build()) + .build()) + .always(); kubernetesHelperMockedStatic.when(KubernetesHelper::getDefaultNamespace).thenReturn(null); extension.isFailOnNoKubernetesJson = false; } @@ -66,7 +68,6 @@ void setUp() { @AfterEach void tearDown() { watcherManagerMockedStatic.close(); - clusterAccessMockedConstruction.close(); kubernetesHelperMockedStatic.close(); } @@ -89,6 +90,6 @@ void runTask_withManifest_shouldWatchEntities() throws Exception { // When watchTask.runTask(); // Then - watcherManagerMockedStatic.verify(() -> WatcherManager.watch(any(), isNull(), any(), any()), times(1)); + watcherManagerMockedStatic.verify(() -> WatcherManager.watch(any(), eq(openShiftClient.getNamespace()), any(), any()), times(1)); } } diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/access/ClusterAccess.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/access/ClusterAccess.java deleted file mode 100644 index 7fbf5c98c6..0000000000 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/access/ClusterAccess.java +++ /dev/null @@ -1,46 +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.access; - - -import io.fabric8.kubernetes.client.Config; -import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.kubernetes.client.KubernetesClientBuilder; - -/** - * @author roland - */ -public class ClusterAccess { - - private final ClusterConfiguration clusterConfiguration; - - public ClusterAccess(ClusterConfiguration clusterConfiguration) { - this.clusterConfiguration = clusterConfiguration == null ? - ClusterConfiguration.builder().build() : clusterConfiguration; - } - - public KubernetesClient createDefaultClient() { - return new KubernetesClientBuilder().withConfig(createDefaultConfig()).build(); - } - - private Config createDefaultConfig() { - return this.clusterConfiguration.getConfig(); - } - - public String getNamespace() { - return this.clusterConfiguration.getNamespace(); - } - -} - diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/access/ClusterAccessTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/access/ClusterAccessTest.java deleted file mode 100644 index 2413e386d2..0000000000 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/access/ClusterAccessTest.java +++ /dev/null @@ -1,44 +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.access; - -import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; -import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; -import io.fabric8.openshift.client.OpenShiftClient; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; - -import static org.assertj.core.api.Assertions.assertThat; - -@EnableKubernetesMockClient(https = false) -class ClusterAccessTest { - private KubernetesMockServer mockServer; - private ClusterConfiguration clusterConfiguration; - - @BeforeEach - void setUp() { - clusterConfiguration = ClusterConfiguration.builder() - .masterUrl(mockServer.url("/")) - .build(); - } - - @Test - void createDefaultClientShouldReturnKubernetesClient() { - // When - final KubernetesClient result = new ClusterAccess(clusterConfiguration).createDefaultClient(); - // Then - assertThat(result).isNotNull().isNotInstanceOf(OpenShiftClient.class); - } -} diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/JKubeServiceHub.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/JKubeServiceHub.java index 211c2dc9eb..56fc80771e 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/JKubeServiceHub.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/JKubeServiceHub.java @@ -18,6 +18,7 @@ import java.util.Optional; import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.KubernetesClientBuilder; import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -26,7 +27,6 @@ import org.eclipse.jkube.kit.build.service.docker.DockerServiceHub; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.LazyBuilder; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.config.resource.ResourceService; import org.eclipse.jkube.kit.config.resource.ResourceServiceConfig; @@ -62,7 +62,6 @@ public class JKubeServiceHub implements Closeable { private LazyBuilder migrateService; private LazyBuilder debugService; private LazyBuilder helmService; - private LazyBuilder clusterAccessLazyBuilder; private LazyBuilder kubernetesClientLazyBuilder; private final boolean offline; @@ -100,8 +99,7 @@ private void init() { } private void initLazyBuilders() { - clusterAccessLazyBuilder = new LazyBuilder<>(JKubeServiceHub::initClusterAccessIfNecessary); - kubernetesClientLazyBuilder = new LazyBuilder<>(hub -> getClusterAccess().createDefaultClient()); + kubernetesClientLazyBuilder = new LazyBuilder<>(hub -> initKubernetesClientIfNecessary()); buildServiceManager = new LazyBuilder<>(BuildServiceManager::new); pluginManager = new LazyBuilder<>(PluginManager::new); applyService = new LazyBuilder<>(ApplyService::new); @@ -122,11 +120,11 @@ private void initLazyBuilders() { helmService = new LazyBuilder<>(hub -> new HelmService(hub.getConfiguration(), hub.getResourceServiceConfig(), log)); } - private ClusterAccess initClusterAccessIfNecessary() { + private KubernetesClient initKubernetesClientIfNecessary() { if (offline) { throw new IllegalArgumentException("Connection to Cluster required. Please check if offline mode is set to false"); } - return new ClusterAccess(configuration.getClusterConfiguration()); + return new KubernetesClientBuilder().withConfig(configuration.getClusterConfiguration().getConfig()).build(); } public RuntimeMode getRuntimeMode() { @@ -173,8 +171,4 @@ public KubernetesClient getClient() { return kubernetesClientLazyBuilder.get(this); } - public ClusterAccess getClusterAccess() { - return clusterAccessLazyBuilder.get(this); - } - } 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 bc78ed2f14..3be43efc84 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 @@ -22,13 +22,14 @@ import java.util.concurrent.TimeUnit; import io.fabric8.kubernetes.api.model.GenericKubernetesResource; +import io.fabric8.kubernetes.client.Client; +import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.NamespacedKubernetesClient; import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.kubernetes.client.dsl.ScalableResource; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.OpenshiftHelper; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.image.ImageName; import io.fabric8.kubernetes.api.model.DeletionPropagation; @@ -171,8 +172,8 @@ public static void doDeleteAndWait(KubernetesClient kubernetesClient, GenericKub crClient.waitUntilCondition(Objects::isNull, seconds, TimeUnit.SECONDS); } - public static String applicableNamespace(HasMetadata resource, String namespace, ResourceConfig resourceConfig, ClusterAccess clusterAccess) { - return applicableNamespace(resource, namespace, resolveFallbackNamespace(resourceConfig, clusterAccess)); + public static String applicableNamespace(HasMetadata resource, String namespace, ResourceConfig resourceConfig, KubernetesClient kubernetesClient) { + return applicableNamespace(resource, namespace, resolveFallbackNamespace(resourceConfig, kubernetesClient)); } public static String applicableNamespace(HasMetadata resource, String namespace, String fallbackNamespace) { @@ -185,11 +186,12 @@ public static String applicableNamespace(HasMetadata resource, String namespace, return StringUtils.isNotBlank(fallbackNamespace) ? fallbackNamespace : KubernetesHelper.getDefaultNamespace(); } - public static String resolveFallbackNamespace(ResourceConfig resourceConfig, ClusterAccess clusterAccess) { + public static String resolveFallbackNamespace(ResourceConfig resourceConfig, KubernetesClient kubernetesClient) { return Optional.ofNullable(resourceConfig) .map(ResourceConfig::getNamespace) - .orElse(Optional.ofNullable(clusterAccess) - .map(ClusterAccess::getNamespace) + .orElse(Optional.ofNullable(kubernetesClient) + .map(Client::getConfiguration) + .map(Config::getNamespace) .orElse(null)); } 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 bb2d1f1e1c..5aa2fea029 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 @@ -51,7 +51,7 @@ public KubernetesUndeployService(JKubeServiceHub jKubeServiceHub, KitLogger logg @Override public void undeploy(List resourceDirs, ResourceConfig resourceConfig, File... manifestFiles) throws IOException { - final String fallbackNamespace = KubernetesClientUtil.resolveFallbackNamespace(resourceConfig, jKubeServiceHub.getClusterAccess()); + final String fallbackNamespace = KubernetesClientUtil.resolveFallbackNamespace(resourceConfig, jKubeServiceHub.getClient()); final List manifests = Stream.of(manifestFiles) .filter(Objects::nonNull).filter(File::exists).filter(File::isFile) .collect(Collectors.toList()); 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 249a5a2681..5eb28ee859 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 @@ -251,7 +251,7 @@ private void initClient() { if (buildServiceConfig.getResourceConfig() != null && buildServiceConfig.getResourceConfig().getNamespace() != null) { applicableOpenShiftNamespace = buildServiceConfig.getResourceConfig().getNamespace(); } else { - applicableOpenShiftNamespace = jKubeServiceHub.getClusterAccess().getNamespace(); + applicableOpenShiftNamespace = jKubeServiceHub.getClient().getNamespace(); } } diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubTest.java index fedb3c2393..4183d36b06 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/JKubeServiceHubTest.java @@ -262,22 +262,6 @@ void getResourceService() { } } - @Test - void clusterAccessIsInitializedLazily() { - // Given - try (final JKubeServiceHub jKubeServiceHub = jKubeServiceHubBuilder.build()) { - // When - jKubeServiceHub.getClusterAccess(); - // Then - assertThat(jKubeServiceHub.getClusterAccess()) - .isNotNull(); - assertThat(jKubeServiceHub.getClusterAccess().createDefaultClient()) - .extracting(Client::getMasterUrl) - .extracting("host", "port") - .containsExactly(kubernetesMockServer.getHostName(), kubernetesMockServer.getPort()); - } - } - @Test void getClientWithOfflineConnectionIsNotAllowed() { // Given 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 11083dca1a..6230901dd4 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 @@ -22,15 +22,12 @@ import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; import io.fabric8.kubernetes.client.Watcher; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; import static org.eclipse.jkube.kit.config.service.kubernetes.KubernetesClientUtil.doDeleteAndWait; -import static org.mockito.Mockito.RETURNS_DEEP_STUBS; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; + @SuppressWarnings("unused") @EnableKubernetesMockClient(crud = true) class KubernetesClientUtilTest { @@ -91,16 +88,13 @@ void applicableNamespace_whenNamespaceInResourceMetadata_shouldReturnProvidedNam } @Test - void applicableNamespace_whenNamespaceProvidedViaClusterAccess_shouldReturnProvidedNamespace() { + void applicableNamespace_whenNamespaceProvidedViaKubernetesClient_shouldReturnProvidedNamespace() { // Given - ClusterAccess mockedClusterAccess = mock(ClusterAccess.class, RETURNS_DEEP_STUBS); - when(mockedClusterAccess.getNamespace()).thenReturn("ns1"); - // When - String resolvedNamespace = KubernetesClientUtil.applicableNamespace(null, null, null, mockedClusterAccess); + String resolvedNamespace = KubernetesClientUtil.applicableNamespace(null, null, null, kubernetesClient); // Then - assertThat(resolvedNamespace).isEqualTo("ns1"); + assertThat(resolvedNamespace).isEqualTo(kubernetesClient.getNamespace()); } @Test @@ -128,16 +122,13 @@ void resolveFallbackNamespace_whenNamespaceProvidedViaResourceConfiguration_shou } @Test - void resolveFallbackNamespace_whenNamespaceProvidedViaClusterAccess_shouldReturnProvidedNamespace() { + void resolveFallbackNamespace_whenNamespaceProvidedViaKubernetesClient_shouldReturnProvidedNamespace() { // Given - ClusterAccess mockedClusterAccess = mock(ClusterAccess.class, RETURNS_DEEP_STUBS); - when(mockedClusterAccess.getNamespace()).thenReturn("ns1"); - // When - String resolvedNamespace = KubernetesClientUtil.resolveFallbackNamespace(null, mockedClusterAccess); + String resolvedNamespace = KubernetesClientUtil.resolveFallbackNamespace(null, kubernetesClient); // Then - assertThat(resolvedNamespace).isEqualTo("ns1"); + assertThat(resolvedNamespace).isEqualTo(kubernetesClient.getNamespace()); } @Test void getPodStatusMessagePostfix_whenActionIsDeleted_shouldReturnPodDeletedMessage() { 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 349fc663e4..89a614e7c5 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 @@ -60,7 +60,6 @@ void setUp() { jKubeServiceHub = mock(JKubeServiceHub.class, RETURNS_DEEP_STUBS); final OpenShiftClient oc = mock(OpenShiftClient.class); when(jKubeServiceHub.getClient()).thenReturn(oc); - when(jKubeServiceHub.getClusterAccess().createDefaultClient()).thenReturn(oc); when(jKubeServiceHub.getConfiguration()).thenReturn(JKubeConfiguration.builder() .project(JavaProject.builder() .buildFinalName("test-project") diff --git a/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherContext.java b/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherContext.java index 8f9955279b..b17555dc66 100644 --- a/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherContext.java +++ b/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherContext.java @@ -47,6 +47,6 @@ public class WatcherContext { private JKubeBuildStrategy jKubeBuildStrategy; public String getNamespace() { - return getJKubeServiceHub().getClusterAccess().getNamespace(); + return getJKubeServiceHub().getClient().getNamespace(); } } diff --git a/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherTest.java b/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherTest.java index 0a4e019a1f..528a944620 100644 --- a/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherTest.java +++ b/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherTest.java @@ -20,7 +20,6 @@ import org.eclipse.jkube.kit.build.service.docker.watch.ExecTask; import org.eclipse.jkube.kit.build.service.docker.watch.WatchContext; import org.eclipse.jkube.kit.common.JavaProject; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.watcher.api.WatcherContext; @@ -46,7 +45,6 @@ class DockerImageWatcherTest { @BeforeEach public void setUp() { WatcherContext watcherContext = mock(WatcherContext.class, RETURNS_DEEP_STUBS); - ClusterAccess mockedClusterAccess = mock(ClusterAccess.class); watchService = mock(WatchService.class); DockerServiceHub mockedDockerServiceHub = mock(DockerServiceHub.class,RETURNS_DEEP_STUBS); dockerImageWatcher = new DockerImageWatcher(watcherContext); @@ -57,7 +55,6 @@ public void setUp() { .groupId("org.example") .artifactId("test") .version("1.0.0-SNAPSHOT").build()); - when(watcherContext.getJKubeServiceHub().getClusterAccess()).thenReturn(mockedClusterAccess); } @Test diff --git a/kubernetes-maven-plugin/plugin/pom.xml b/kubernetes-maven-plugin/plugin/pom.xml index b938c8573d..7c0b9acd2f 100644 --- a/kubernetes-maven-plugin/plugin/pom.xml +++ b/kubernetes-maven-plugin/plugin/pom.xml @@ -157,6 +157,14 @@ jkube-kit-remote-dev + + io.fabric8 + mockwebserver + + + io.fabric8 + openshift-server-mock + org.junit.jupiter junit-jupiter-engine diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java index 14780a8b38..1392c2673f 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java @@ -161,6 +161,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { protected void init() throws MojoFailureException { log = createLogger(null); + access = initClusterConfiguration(); try { javaProject = MavenUtil.convertMavenProjectToJKubeProject(project, session); } catch (DependencyResolutionRequiredException e) { @@ -239,7 +240,7 @@ protected JKubeServiceHub.JKubeServiceHubBuilder initJKubeServiceHubBuilder(Java .settings(MavenUtil.getRegistryServerFromMavenSettings(settings)) .passwordDecryptionMethod(this::decrypt) .build()) - .clusterConfiguration(initClusterConfiguration()) + .clusterConfiguration(access) .build()) .offline(offline) .platformMode(getRuntimeMode()) diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojo.java index c6aa99985e..0856b7933b 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojo.java @@ -18,7 +18,7 @@ import java.util.Collection; import java.util.List; -import org.eclipse.jkube.kit.common.access.ClusterAccess; +import io.fabric8.kubernetes.client.KubernetesClientBuilder; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.MavenUtil; import org.eclipse.jkube.kit.common.util.OpenshiftHelper; @@ -227,7 +227,7 @@ private void configureApplyService(KubernetesClient kubernetes) { applyService.setRollingUpgradePreserveScale(isRollingUpgradePreserveScale()); applyService.setRecreateMode(recreate); applyService.setNamespace(namespace); - applyService.setFallbackNamespace(resolveFallbackNamespace(resources, new ClusterAccess(initClusterConfiguration()))); + applyService.setFallbackNamespace(resolveFallbackNamespace(resources, jkubeServiceHub.getClient())); boolean openShift = OpenshiftHelper.isOpenShift(kubernetes); if (openShift) { diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java index 04cfd6523c..fb4de251b3 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java @@ -20,12 +20,12 @@ import javax.validation.ConstraintViolationException; +import io.fabric8.kubernetes.client.KubernetesClientBuilder; import org.apache.commons.lang3.StringUtils; import org.eclipse.jkube.generator.api.GeneratorContext; import org.eclipse.jkube.generator.api.DefaultGeneratorManager; import org.eclipse.jkube.kit.common.KitLogger; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.util.MavenUtil; import org.eclipse.jkube.kit.common.util.ResourceClassifier; import org.eclipse.jkube.kit.common.util.ResourceUtil; @@ -233,7 +233,7 @@ private List getResolvedImages(List imag .useProjectClasspath(useProjectClasspath) .strategy(JKubeBuildStrategy.docker) .prePackagePhase(true) - .openshiftNamespace(StringUtils.isNotBlank(this.namespace) ? this.namespace: new ClusterAccess(initClusterConfiguration()).getNamespace()) + .openshiftNamespace(StringUtils.isNotBlank(this.namespace) ? this.namespace: new KubernetesClientBuilder().withConfig(access.getConfig()).build().getNamespace()) .buildTimestamp(getBuildTimestamp(getPluginContext(), CONTEXT_KEY_BUILD_TIMESTAMP, project.getBuild().getDirectory(), DOCKER_BUILD_TIMESTAMP)) .build()); return generatorManager.generateAndMerge(images); diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java index 9f6b0e18d9..fa7cbadcfa 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java @@ -22,7 +22,6 @@ import org.eclipse.jkube.kit.build.service.docker.DockerServiceHub; import org.eclipse.jkube.kit.build.service.docker.watch.WatchContext; import org.eclipse.jkube.kit.common.KitLogger; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.common.util.AnsiLogger; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.MavenUtil; @@ -94,10 +93,9 @@ public void executeInternal() throws MojoExecutionException { KubernetesResourceUtil.validateKubernetesMasterUrl(masterUrl); List appliedK8sResources = KubernetesHelper.loadResources(getManifest(kubernetesClient)); WatcherContext context = getWatcherContext(); - ClusterAccess clusterAccess = new ClusterAccess(initClusterConfiguration()); WatcherManager.watch(getResolvedImages(), - applicableNamespace(null, namespace, resources, clusterAccess), + applicableNamespace(null, namespace, resources, kubernetesClient), appliedK8sResources, context); diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoTest.java index bd1473130f..021a9a3d98 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoTest.java @@ -15,13 +15,13 @@ import java.io.File; import java.io.IOException; -import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; import java.util.Properties; -import io.fabric8.openshift.client.NamespacedOpenShiftClient; -import org.eclipse.jkube.kit.common.access.ClusterAccess; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.apache.maven.plugin.MojoExecutionException; @@ -32,38 +32,28 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -import org.mockito.MockedConstruction; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.mockConstruction; import static org.mockito.Mockito.when; +@EnableKubernetesMockClient(crud = true) class ApplyMojoTest { - private MockedConstruction clusterAccessMockedConstruction; private File kubernetesManifestFile; private MavenProject mavenProject; - private NamespacedOpenShiftClient defaultKubernetesClient; - private String kubeConfigNamespace; + private KubernetesClient defaultKubernetesClient; private ApplyMojo applyMojo; @BeforeEach void setUp(@TempDir Path temporaryFolder) throws IOException { - clusterAccessMockedConstruction = mockConstruction(ClusterAccess.class, (mock, context) -> { - when(mock.createDefaultClient()).thenReturn(defaultKubernetesClient); - when(mock.getNamespace()).thenAnswer(invocation -> kubeConfigNamespace); - }); kubernetesManifestFile = Files.createFile(temporaryFolder.resolve("kubernetes.yml")).toFile(); mavenProject = mock(MavenProject.class); when(mavenProject.getProperties()).thenReturn(new Properties()); - defaultKubernetesClient = mock(NamespacedOpenShiftClient.class); - when(defaultKubernetesClient.adapt(any())).thenReturn(defaultKubernetesClient); - when(defaultKubernetesClient.getMasterUrl()).thenReturn(URI.create("https://www.example.com").toURL()); // @formatter:off applyMojo = new ApplyMojo() {{ + access = ClusterConfiguration.from(defaultKubernetesClient.getConfiguration()).build(); project = mavenProject; settings = mock(Settings.class); kubernetesManifest = kubernetesManifestFile; @@ -74,7 +64,6 @@ void setUp(@TempDir Path temporaryFolder) throws IOException { @AfterEach void tearDown() { - clusterAccessMockedConstruction.close(); mavenProject = null; applyMojo = null; } @@ -128,13 +117,12 @@ void resolveEffectiveNamespace_whenNamespaceSetInResourceConfig() throws MojoExe @Test void resolveEffectiveNamespace_whenNoNamespaceConfigured() throws MojoExecutionException, MojoFailureException { // Given - kubeConfigNamespace = "clusteraccess-namespace"; // When applyMojo.execute(); // Then assertThat(applyMojo.applyService) .hasFieldOrPropertyWithValue("namespace", null) - .hasFieldOrPropertyWithValue("fallbackNamespace", "clusteraccess-namespace"); + .hasFieldOrPropertyWithValue("fallbackNamespace", defaultKubernetesClient.getNamespace()); } } diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojoTest.java index 0a619977e0..97f4f54309 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/DebugMojoTest.java @@ -20,7 +20,6 @@ import java.util.Properties; import org.eclipse.jkube.kit.common.util.AnsiLogger; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.service.DebugContext; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; @@ -36,7 +35,6 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.mock; @@ -49,7 +47,6 @@ class DebugMojoTest { private MockedConstruction jKubeServiceHubMockedConstruction; - private MockedConstruction clusterAccessMockedConstruction; private File kubernetesManifestFile; private MavenProject mavenProject; @@ -63,7 +60,6 @@ void setUp(@TempDir Path temporaryFolder) throws IOException { doReturn(oc).when(oc).adapt(OpenShiftClient.class); when(mock.getClient()).thenReturn(oc); }); - clusterAccessMockedConstruction = mockConstruction(ClusterAccess.class); kubernetesManifestFile = Files.createFile(temporaryFolder.resolve("kubernetes.yml")).toFile(); mavenProject = mock(MavenProject.class); when(mavenProject.getProperties()).thenReturn(new Properties()); @@ -79,7 +75,6 @@ void setUp(@TempDir Path temporaryFolder) throws IOException { @AfterEach void tearDown() { - clusterAccessMockedConstruction.close(); jKubeServiceHubMockedConstruction.close(); mavenProject = null; debugMojo = null; diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/LogMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/LogMojoTest.java index 141128e829..bf1648cf0f 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/LogMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/LogMojoTest.java @@ -21,7 +21,6 @@ import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.openshift.client.OpenShiftClient; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; import org.eclipse.jkube.kit.config.service.PodLogService; @@ -50,7 +49,6 @@ class LogMojoTest { private MockedConstruction jKubeServiceHubMockedConstruction; - private MockedConstruction clusterAccessMockedConstruction; private MockedConstruction podLogServiceMockedConstruction; private File kubernetesManifestFile; private MavenProject mavenProject; @@ -65,7 +63,6 @@ void setUp(@TempDir Path temporaryFolder) throws IOException { doReturn(oc).when(oc).adapt(OpenShiftClient.class); when(mock.getClient()).thenReturn(oc); }); - clusterAccessMockedConstruction = mockConstruction(ClusterAccess.class); podLogServiceMockedConstruction = mockConstruction(PodLogService.class); kubernetesManifestFile = Files.createTempFile(temporaryFolder, "kubernetes", ".yml").toFile(); mavenProject = mock(MavenProject.class); @@ -82,7 +79,6 @@ void setUp(@TempDir Path temporaryFolder) throws IOException { @AfterEach void tearDown() { - clusterAccessMockedConstruction.close(); jKubeServiceHubMockedConstruction.close(); mavenProject = null; logMojo = null; diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java index fdba01532e..8511bbb84c 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java @@ -14,7 +14,6 @@ package org.eclipse.jkube.maven.plugin.mojo.develop; import java.io.File; -import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; import java.util.Collections; @@ -22,9 +21,9 @@ import java.util.Properties; import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.JavaProject; -import org.eclipse.jkube.kit.common.access.ClusterAccess; import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; @@ -49,6 +48,7 @@ import static org.mockito.Mockito.when; import static org.mockito.Mockito.withSettings; +@EnableKubernetesMockClient(crud = true) class WatchMojoTest { private File kubernetesManifestFile; @@ -56,8 +56,8 @@ class WatchMojoTest { private Settings mavenSettings; private MockedStatic watcherManagerMockedStatic; private MockedConstruction jKubeServiceHubMockedConstruction; - private MockedConstruction clusterAccessMockedConstruction; private TestWatchMojo watchMojo; + private KubernetesClient kubernetesClient; @BeforeEach void setUp(@TempDir Path temporaryFolder) throws Exception { @@ -65,18 +65,13 @@ void setUp(@TempDir Path temporaryFolder) throws Exception { final File targetDir = Files.createDirectory(temporaryFolder.resolve("target")).toFile(); jKubeServiceHubMockedConstruction = mockConstruction(JKubeServiceHub.class, withSettings().defaultAnswer(RETURNS_DEEP_STUBS), (mock, context) -> { - final KubernetesClient kc = mock(KubernetesClient.class, RETURNS_DEEP_STUBS); - when(kc.getMasterUrl()).thenReturn(URI.create("https://www.example.com").toURL()); - when(mock.getClient()).thenReturn(kc); + when(mock.getClient()).thenReturn(kubernetesClient); when(mock.getConfiguration()).thenReturn(JKubeConfiguration.builder() .project(JavaProject.builder() .baseDirectory(temporaryFolder.toFile()) .build()) .build()); }); - clusterAccessMockedConstruction = mockConstruction(ClusterAccess.class, (mock, ctx) -> { - when(mock.getNamespace()).thenReturn("namespace-from-config"); - }); kubernetesManifestFile = Files.createTempFile(srcDir, "kubernetes", ".yml").toFile(); mavenProject = mock(MavenProject.class, RETURNS_DEEP_STUBS); when(mavenProject.getProperties()).thenReturn(new Properties()); @@ -103,20 +98,19 @@ void setUp(@TempDir Path temporaryFolder) throws Exception { @AfterEach void tearDown() { watcherManagerMockedStatic.close(); - clusterAccessMockedConstruction.close(); jKubeServiceHubMockedConstruction.close(); } @Test - void executeInternal_whenNoNamespaceConfigured_shouldDelegateToWatcherManagerWithClusterAccessNamespace() throws Exception { + void executeInternal_whenNoNamespaceConfigured_shouldDelegateToWatcherManagerWithKubernetesClientNamespace() throws Exception { // When watchMojo.execute(); // Then - watcherManagerMockedStatic.verify(() -> WatcherManager.watch(any(), eq("namespace-from-config"), any(), any()), times(1)); + watcherManagerMockedStatic.verify(() -> WatcherManager.watch(any(), eq(kubernetesClient.getNamespace()), any(), any()), times(1)); } @Test - void executeInternal_whenNamespaceConfiguredInResourceConfig_shouldDelegateToWatcherManagerWithClusterAccessNamespace() throws Exception { + void executeInternal_whenNamespaceConfiguredInResourceConfig_shouldDelegateToWatcherManagerWithResourceConfigNamespace() throws Exception { // Given ResourceConfig resources = ResourceConfig.builder() .namespace("namespace-from-resource_config") @@ -129,7 +123,7 @@ void executeInternal_whenNamespaceConfiguredInResourceConfig_shouldDelegateToWat } @Test - void executeInternal_whenNamespaceConfigured_shouldDelegateToWatcherManagerWithClusterAccessNamespace() throws Exception { + void executeInternal_whenNamespaceConfigured_shouldDelegateToWatcherManagerWithConfiguredNamespace() throws Exception { // Given watchMojo.setNamespace("configured-namespace"); // When diff --git a/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftResourceMojoTest.java b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftResourceMojoTest.java index 15acbe6d15..6b9f21d406 100644 --- a/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftResourceMojoTest.java +++ b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftResourceMojoTest.java @@ -91,7 +91,7 @@ void execute_generatesResourcesAndAttachesArtifact() throws Exception { } @Test - void executeInternal_resolvesGroupInImageNameToClusterAccessNamespace_whenNamespaceDetected() throws MojoExecutionException, MojoFailureException { + void executeInternal_resolvesGroupInImageNameToClusterConfigurationNamespace_whenNamespaceDetected() throws MojoExecutionException, MojoFailureException { // Given resourceMojo.project.setArtifactId("test-project"); ImageConfiguration imageConfiguration = ImageConfiguration.builder() From 1868f35aafb872aae337b5b09d81878f2cce655a Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Wed, 3 Jul 2024 15:45:35 +0200 Subject: [PATCH 216/289] review:refactor: remove ClusterAccess wrapper class Signed-off-by: Marc Nuri --- .../gradle/plugin/task/AbstractJKubeTask.java | 8 ++-- .../plugin/task/KubernetesApplyTask.java | 2 +- .../plugin/task/KubernetesWatchTask.java | 2 +- .../plugin/task/KubernetesApplyTaskTest.java | 1 - .../plugin/task/KubernetesWatchTaskTest.java | 1 - .../kubernetes/KubernetesClientUtil.java | 14 +++---- .../kubernetes/KubernetesUndeployService.java | 2 +- .../openshift/OpenshiftBuildService.java | 2 +- .../kubernetes/KubernetesClientUtilTest.java | 10 +++-- .../OpenshiftBuildServiceIntegrationTest.java | 2 + .../service/plugins/PluginServiceTest.java | 9 ----- .../jkube/watcher/api/WatcherContext.java | 2 +- .../plugin/mojo/build/AbstractDockerMojo.java | 6 ++- .../plugin/mojo/build/AbstractJKubeMojo.java | 6 ++- .../maven/plugin/mojo/build/ApplyMojo.java | 3 +- .../maven/plugin/mojo/build/ResourceMojo.java | 3 +- .../maven/plugin/mojo/develop/WatchMojo.java | 2 +- .../plugin/mojo/build/ApplyMojoTest.java | 9 ++++- .../plugin/mojo/develop/WatchMojoTest.java | 38 ++++++------------- 19 files changed, 54 insertions(+), 68 deletions(-) diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java index fa7cc55c4a..4fb3612216 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java @@ -22,7 +22,6 @@ import java.util.Optional; import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.kubernetes.client.KubernetesClientBuilder; import org.apache.commons.lang3.StringUtils; import org.eclipse.jkube.generator.api.DefaultGeneratorManager; import org.eclipse.jkube.generator.api.GeneratorContext; @@ -57,6 +56,7 @@ public abstract class AbstractJKubeTask extends DefaultTask implements Kubernete protected final KubernetesExtension kubernetesExtension; protected KitLogger kitLogger; + protected ClusterConfiguration clusterConfiguration; protected JKubeServiceHub jKubeServiceHub; protected static final String DOCKER_BUILD_TIMESTAMP = "docker/build.timestamp"; protected List resolvedImages; @@ -78,8 +78,8 @@ public final void runTask() { protected void init() { kubernetesExtension.javaProject = GradleUtil.convertGradleProject(getProject()); - kubernetesExtension.access = initClusterConfiguration(); kitLogger = createLogger(null); + clusterConfiguration = initClusterConfiguration(); jKubeServiceHub = initJKubeServiceHubBuilder().build(); kubernetesExtension.resources = updateResourceConfigNamespace(kubernetesExtension.getNamespaceOrNull(), kubernetesExtension.resources); resolvedImages = resolveImages(); @@ -141,7 +141,7 @@ protected JKubeServiceHub.JKubeServiceHubBuilder initJKubeServiceHubBuilder() { .registry(kubernetesExtension.getPushRegistryOrNull() != null ? kubernetesExtension.getPushRegistryOrNull() : kubernetesExtension.getRegistryOrDefault()) .build()) - .clusterConfiguration(kubernetesExtension.access) + .clusterConfiguration(clusterConfiguration) .build()) .offline(kubernetesExtension.getOfflineOrDefault()) .platformMode(kubernetesExtension.getRuntimeMode()) @@ -175,7 +175,7 @@ protected GeneratorContext.GeneratorContextBuilder initGeneratorContextBuilder() .prePackagePhase(false) .useProjectClasspath(kubernetesExtension.getUseProjectClassPathOrDefault()) .sourceDirectory(kubernetesExtension.getBuildSourceDirectoryOrDefault()) - .openshiftNamespace(StringUtils.isNotBlank(kubernetesExtension.getNamespaceOrNull()) ? kubernetesExtension.getNamespaceOrNull() : new KubernetesClientBuilder().withConfig(kubernetesExtension.access.getConfig()).build().getNamespace()) + .openshiftNamespace(StringUtils.isNotBlank(kubernetesExtension.getNamespaceOrNull()) ? kubernetesExtension.getNamespaceOrNull() : clusterConfiguration.getNamespace()) .buildTimestamp(getBuildTimestamp(null, null, kubernetesExtension.javaProject.getBuildDirectory().getAbsolutePath(), DOCKER_BUILD_TIMESTAMP)) .filter(kubernetesExtension.getFilterOrNull()); diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTask.java index 98839d4389..4f565a6c50 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTask.java @@ -92,6 +92,6 @@ protected void configureApplyService() { applyService.setRollingUpgradePreserveScale(kubernetesExtension.getRollingUpgradePreserveScaleOrDefault()); applyService.setRecreateMode(kubernetesExtension.getRecreateOrDefault()); applyService.setNamespace(kubernetesExtension.getNamespaceOrNull()); - applyService.setFallbackNamespace(resolveFallbackNamespace(kubernetesExtension.resources, jKubeServiceHub.getClient())); + applyService.setFallbackNamespace(resolveFallbackNamespace(kubernetesExtension.resources, clusterConfiguration)); } } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java index 20383a32ad..efdd17f437 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java @@ -60,7 +60,7 @@ public void run() { WatcherContext context = createWatcherContext(); WatcherManager.watch(resolvedImages, - applicableNamespace(null, kubernetesExtension.getNamespaceOrNull(), kubernetesExtension.resources, kubernetesClient), + applicableNamespace(null, kubernetesExtension.getNamespaceOrNull(), kubernetesExtension.resources, clusterConfiguration), resources, context); } catch (KubernetesClientException kubernetesClientException) { diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTaskTest.java index 05e7819dbb..9db143c800 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesApplyTaskTest.java @@ -17,7 +17,6 @@ import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; -import io.fabric8.openshift.client.OpenShiftClient; import org.eclipse.jkube.gradle.plugin.KubernetesExtension; import org.eclipse.jkube.gradle.plugin.TestKubernetesExtension; import org.eclipse.jkube.kit.common.access.ClusterConfiguration; diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java index 25e7cdc829..2890d2dcd8 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTaskTest.java @@ -35,7 +35,6 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.isNull; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.mockConstruction; import static org.mockito.Mockito.mockStatic; 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 3be43efc84..b778fa8fd5 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 @@ -22,12 +22,11 @@ import java.util.concurrent.TimeUnit; import io.fabric8.kubernetes.api.model.GenericKubernetesResource; -import io.fabric8.kubernetes.client.Client; -import io.fabric8.kubernetes.client.Config; import io.fabric8.kubernetes.client.NamespacedKubernetesClient; import io.fabric8.kubernetes.client.dsl.Resource; import io.fabric8.kubernetes.client.dsl.ScalableResource; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.OpenshiftHelper; import org.eclipse.jkube.kit.config.image.ImageName; @@ -172,8 +171,8 @@ public static void doDeleteAndWait(KubernetesClient kubernetesClient, GenericKub crClient.waitUntilCondition(Objects::isNull, seconds, TimeUnit.SECONDS); } - public static String applicableNamespace(HasMetadata resource, String namespace, ResourceConfig resourceConfig, KubernetesClient kubernetesClient) { - return applicableNamespace(resource, namespace, resolveFallbackNamespace(resourceConfig, kubernetesClient)); + public static String applicableNamespace(HasMetadata resource, String namespace, ResourceConfig resourceConfig, ClusterConfiguration clusterConfiguration) { + return applicableNamespace(resource, namespace, resolveFallbackNamespace(resourceConfig, clusterConfiguration)); } public static String applicableNamespace(HasMetadata resource, String namespace, String fallbackNamespace) { @@ -186,12 +185,11 @@ public static String applicableNamespace(HasMetadata resource, String namespace, return StringUtils.isNotBlank(fallbackNamespace) ? fallbackNamespace : KubernetesHelper.getDefaultNamespace(); } - public static String resolveFallbackNamespace(ResourceConfig resourceConfig, KubernetesClient kubernetesClient) { + public static String resolveFallbackNamespace(ResourceConfig resourceConfig, ClusterConfiguration clusterConfiguration) { return Optional.ofNullable(resourceConfig) .map(ResourceConfig::getNamespace) - .orElse(Optional.ofNullable(kubernetesClient) - .map(Client::getConfiguration) - .map(Config::getNamespace) + .orElse(Optional.ofNullable(clusterConfiguration) + .map(ClusterConfiguration::getNamespace) .orElse(null)); } 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 5aa2fea029..6933eb70da 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 @@ -51,7 +51,7 @@ public KubernetesUndeployService(JKubeServiceHub jKubeServiceHub, KitLogger logg @Override public void undeploy(List resourceDirs, ResourceConfig resourceConfig, File... manifestFiles) throws IOException { - final String fallbackNamespace = KubernetesClientUtil.resolveFallbackNamespace(resourceConfig, jKubeServiceHub.getClient()); + final String fallbackNamespace = KubernetesClientUtil.resolveFallbackNamespace(resourceConfig, jKubeServiceHub.getConfiguration().getClusterConfiguration()); final List manifests = Stream.of(manifestFiles) .filter(Objects::nonNull).filter(File::exists).filter(File::isFile) .collect(Collectors.toList()); 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 5eb28ee859..ddc5b9e8a6 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 @@ -251,7 +251,7 @@ private void initClient() { if (buildServiceConfig.getResourceConfig() != null && buildServiceConfig.getResourceConfig().getNamespace() != null) { applicableOpenShiftNamespace = buildServiceConfig.getResourceConfig().getNamespace(); } else { - applicableOpenShiftNamespace = jKubeServiceHub.getClient().getNamespace(); + applicableOpenShiftNamespace = jKubeServiceHub.getConfiguration().getClusterConfiguration().getNamespace(); } } 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 6230901dd4..e8c04f9c0f 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 @@ -22,6 +22,7 @@ import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; import io.fabric8.kubernetes.client.Watcher; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.junit.jupiter.api.Test; @@ -89,9 +90,9 @@ void applicableNamespace_whenNamespaceInResourceMetadata_shouldReturnProvidedNam @Test void applicableNamespace_whenNamespaceProvidedViaKubernetesClient_shouldReturnProvidedNamespace() { - // Given // When - String resolvedNamespace = KubernetesClientUtil.applicableNamespace(null, null, null, kubernetesClient); + String resolvedNamespace = KubernetesClientUtil.applicableNamespace(null, null, null, + ClusterConfiguration.from(kubernetesClient.getConfiguration()).build()); // Then assertThat(resolvedNamespace).isEqualTo(kubernetesClient.getNamespace()); @@ -123,13 +124,14 @@ void resolveFallbackNamespace_whenNamespaceProvidedViaResourceConfiguration_shou @Test void resolveFallbackNamespace_whenNamespaceProvidedViaKubernetesClient_shouldReturnProvidedNamespace() { - // Given // When - String resolvedNamespace = KubernetesClientUtil.resolveFallbackNamespace(null, kubernetesClient); + String resolvedNamespace = KubernetesClientUtil + .resolveFallbackNamespace(null, ClusterConfiguration.from(kubernetesClient.getConfiguration()).build()); // Then assertThat(resolvedNamespace).isEqualTo(kubernetesClient.getNamespace()); } + @Test void getPodStatusMessagePostfix_whenActionIsDeleted_shouldReturnPodDeletedMessage() { // Given 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 def6bfb197..a7ab792aba 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 @@ -37,6 +37,7 @@ import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.RegistryConfig; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.common.archive.ArchiveCompression; import org.eclipse.jkube.kit.common.util.Serialization; import org.eclipse.jkube.kit.config.image.ImageConfiguration; @@ -136,6 +137,7 @@ void init(@TempDir Path temporaryFolder) throws Exception { .buildDirectory(target) .build()) .pullRegistryConfig(RegistryConfig.builder().build()) + .clusterConfiguration(ClusterConfiguration.from(client.getConfiguration()).build()) .build()); image = ImageConfiguration.builder() diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginServiceTest.java index 5e9c4af7b5..095ba1223d 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/plugins/PluginServiceTest.java @@ -13,16 +13,11 @@ */ package org.eclipse.jkube.kit.config.service.plugins; - -import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; -import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; import org.apache.commons.io.FileUtils; import org.eclipse.jkube.api.JKubePlugin; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; -import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.common.util.LazyBuilder; import org.eclipse.jkube.kit.config.resource.ResourceServiceConfig; import org.eclipse.jkube.kit.config.resource.RuntimeMode; @@ -45,7 +40,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -@EnableKubernetesMockClient(crud = true) class PluginServiceTest { @TempDir @@ -53,8 +47,6 @@ class PluginServiceTest { private KitLogger logger; private JKubeServiceHub jKubeServiceHub; - private KubernetesMockServer mockServer; - private KubernetesClient kubernetesClient; @BeforeEach void setUp() { @@ -64,7 +56,6 @@ void setUp() { .project(JavaProject.builder() .outputDirectory(temporaryFolder) .build()) - .clusterConfiguration(ClusterConfiguration.from(kubernetesClient.getConfiguration()).build()) .build(), new BuildServiceConfig(), new ResourceServiceConfig(), new LazyBuilder<>(hub -> null), true); } diff --git a/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherContext.java b/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherContext.java index b17555dc66..c74182b93d 100644 --- a/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherContext.java +++ b/jkube-kit/watcher/api/src/main/java/org/eclipse/jkube/watcher/api/WatcherContext.java @@ -47,6 +47,6 @@ public class WatcherContext { private JKubeBuildStrategy jKubeBuildStrategy; public String getNamespace() { - return getJKubeServiceHub().getClient().getNamespace(); + return getJKubeServiceHub().getConfiguration().getClusterConfiguration().getNamespace(); } } diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java index 04dff97aca..b417e0619b 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java @@ -310,6 +310,9 @@ public abstract class AbstractDockerMojo extends AbstractMojo protected KitLogger log; + // Resolved Cluster Configuration + protected ClusterConfiguration clusterConfiguration; + // The JKube service hub protected JKubeServiceHub jkubeServiceHub; @@ -371,6 +374,7 @@ public final void execute() throws MojoExecutionException, MojoFailureException protected void init() { log = new AnsiLogger(getLog(), useColorForLogging(), verbose, !settings.getInteractiveMode(), getLogPrefix()); authConfigFactory = new DockerAuthConfigFactory(log); + clusterConfiguration = initClusterConfiguration(); runtimeMode = getConfiguredRuntimeMode(); } @@ -428,7 +432,7 @@ protected JKubeConfiguration initJKubeConfiguration() throws DependencyResolutio .buildArgs(buildArgs) .pullRegistryConfig(getRegistryConfig(pullRegistry)) .pushRegistryConfig(getRegistryConfig(pushRegistry)) - .clusterConfiguration(initClusterConfiguration()) + .clusterConfiguration(clusterConfiguration) .build(); } diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java index 1392c2673f..afd154865f 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractJKubeMojo.java @@ -144,6 +144,8 @@ public abstract class AbstractJKubeMojo extends AbstractMojo implements KitLogge protected KitLogger log; + protected ClusterConfiguration clusterConfiguration; + // The JKube service hub protected JKubeServiceHub jkubeServiceHub; @@ -161,7 +163,7 @@ public void execute() throws MojoExecutionException, MojoFailureException { protected void init() throws MojoFailureException { log = createLogger(null); - access = initClusterConfiguration(); + clusterConfiguration = initClusterConfiguration(); try { javaProject = MavenUtil.convertMavenProjectToJKubeProject(project, session); } catch (DependencyResolutionRequiredException e) { @@ -240,7 +242,7 @@ protected JKubeServiceHub.JKubeServiceHubBuilder initJKubeServiceHubBuilder(Java .settings(MavenUtil.getRegistryServerFromMavenSettings(settings)) .passwordDecryptionMethod(this::decrypt) .build()) - .clusterConfiguration(access) + .clusterConfiguration(clusterConfiguration) .build()) .offline(offline) .platformMode(getRuntimeMode()) diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojo.java index 0856b7933b..e6d220650f 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojo.java @@ -18,7 +18,6 @@ import java.util.Collection; import java.util.List; -import io.fabric8.kubernetes.client.KubernetesClientBuilder; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.MavenUtil; import org.eclipse.jkube.kit.common.util.OpenshiftHelper; @@ -227,7 +226,7 @@ private void configureApplyService(KubernetesClient kubernetes) { applyService.setRollingUpgradePreserveScale(isRollingUpgradePreserveScale()); applyService.setRecreateMode(recreate); applyService.setNamespace(namespace); - applyService.setFallbackNamespace(resolveFallbackNamespace(resources, jkubeServiceHub.getClient())); + applyService.setFallbackNamespace(resolveFallbackNamespace(resources, clusterConfiguration)); boolean openShift = OpenshiftHelper.isOpenShift(kubernetes); if (openShift) { diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java index fb4de251b3..5fab601cdf 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java @@ -20,7 +20,6 @@ import javax.validation.ConstraintViolationException; -import io.fabric8.kubernetes.client.KubernetesClientBuilder; import org.apache.commons.lang3.StringUtils; import org.eclipse.jkube.generator.api.GeneratorContext; @@ -233,7 +232,7 @@ private List getResolvedImages(List imag .useProjectClasspath(useProjectClasspath) .strategy(JKubeBuildStrategy.docker) .prePackagePhase(true) - .openshiftNamespace(StringUtils.isNotBlank(this.namespace) ? this.namespace: new KubernetesClientBuilder().withConfig(access.getConfig()).build().getNamespace()) + .openshiftNamespace(StringUtils.isNotBlank(this.namespace) ? this.namespace: clusterConfiguration.getNamespace()) .buildTimestamp(getBuildTimestamp(getPluginContext(), CONTEXT_KEY_BUILD_TIMESTAMP, project.getBuild().getDirectory(), DOCKER_BUILD_TIMESTAMP)) .build()); return generatorManager.generateAndMerge(images); diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java index fa7cbadcfa..107d8f7c19 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java @@ -95,7 +95,7 @@ public void executeInternal() throws MojoExecutionException { WatcherContext context = getWatcherContext(); WatcherManager.watch(getResolvedImages(), - applicableNamespace(null, namespace, resources, kubernetesClient), + applicableNamespace(null, namespace, resources, clusterConfiguration), appliedK8sResources, context); diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoTest.java index 021a9a3d98..0c154b5394 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/ApplyMojoTest.java @@ -19,6 +19,7 @@ import java.nio.file.Path; import java.util.Properties; +import io.fabric8.kubernetes.client.ConfigBuilder; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; import org.eclipse.jkube.kit.common.access.ClusterConfiguration; @@ -53,7 +54,11 @@ void setUp(@TempDir Path temporaryFolder) throws IOException { when(mavenProject.getProperties()).thenReturn(new Properties()); // @formatter:off applyMojo = new ApplyMojo() {{ - access = ClusterConfiguration.from(defaultKubernetesClient.getConfiguration()).build(); + access = ClusterConfiguration.from( + new ConfigBuilder(defaultKubernetesClient.getConfiguration()) + .withNamespace("kubernetes-client-config-namespace") + .build() + ).build(); project = mavenProject; settings = mock(Settings.class); kubernetesManifest = kubernetesManifestFile; @@ -122,7 +127,7 @@ void resolveEffectiveNamespace_whenNoNamespaceConfigured() throws MojoExecutionE // Then assertThat(applyMojo.applyService) .hasFieldOrPropertyWithValue("namespace", null) - .hasFieldOrPropertyWithValue("fallbackNamespace", defaultKubernetesClient.getNamespace()); + .hasFieldOrPropertyWithValue("fallbackNamespace", "kubernetes-client-config-namespace"); } } diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java index 8511bbb84c..2d5ad62f29 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojoTest.java @@ -17,16 +17,14 @@ import java.nio.file.Files; import java.nio.file.Path; import java.util.Collections; -import java.util.HashMap; import java.util.Properties; +import io.fabric8.kubernetes.client.ConfigBuilder; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; -import org.eclipse.jkube.kit.common.JKubeConfiguration; -import org.eclipse.jkube.kit.common.JavaProject; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy; import org.eclipse.jkube.kit.config.resource.ResourceConfig; -import org.eclipse.jkube.kit.config.service.JKubeServiceHub; import org.eclipse.jkube.watcher.api.WatcherManager; import org.apache.maven.project.MavenProject; @@ -35,43 +33,29 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; -import org.mockito.MockedConstruction; import org.mockito.MockedStatic; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.mockConstruction; import static org.mockito.Mockito.mockStatic; import static org.mockito.Mockito.times; import static org.mockito.Mockito.when; -import static org.mockito.Mockito.withSettings; @EnableKubernetesMockClient(crud = true) class WatchMojoTest { - private File kubernetesManifestFile; + private KubernetesClient kubernetesClient; + private File kubernetesManifestFile; private MavenProject mavenProject; - private Settings mavenSettings; private MockedStatic watcherManagerMockedStatic; - private MockedConstruction jKubeServiceHubMockedConstruction; private TestWatchMojo watchMojo; - private KubernetesClient kubernetesClient; @BeforeEach void setUp(@TempDir Path temporaryFolder) throws Exception { final Path srcDir = Files.createDirectory(temporaryFolder.resolve("src")); final File targetDir = Files.createDirectory(temporaryFolder.resolve("target")).toFile(); - jKubeServiceHubMockedConstruction = mockConstruction(JKubeServiceHub.class, - withSettings().defaultAnswer(RETURNS_DEEP_STUBS), (mock, context) -> { - when(mock.getClient()).thenReturn(kubernetesClient); - when(mock.getConfiguration()).thenReturn(JKubeConfiguration.builder() - .project(JavaProject.builder() - .baseDirectory(temporaryFolder.toFile()) - .build()) - .build()); - }); kubernetesManifestFile = Files.createTempFile(srcDir, "kubernetes", ".yml").toFile(); mavenProject = mock(MavenProject.class, RETURNS_DEEP_STUBS); when(mavenProject.getProperties()).thenReturn(new Properties()); @@ -81,16 +65,19 @@ void setUp(@TempDir Path temporaryFolder) throws Exception { when(mavenProject.getBasedir()).thenReturn(temporaryFolder.toFile()); when(mavenProject.getBuild().getDirectory()).thenReturn(targetDir.getAbsolutePath()); when(mavenProject.getBuild().getOutputDirectory()).thenReturn(targetDir.getAbsolutePath()); - mavenSettings = mock(Settings.class); watcherManagerMockedStatic = mockStatic(WatcherManager.class); // @formatter:off watchMojo = new TestWatchMojo() {{ project = mavenProject; - settings = mavenSettings; + settings = mock(Settings.class); kubernetesManifest = kubernetesManifestFile; resourceDir = temporaryFolder.resolve("src").resolve("main").resolve("jkube").toFile().getAbsoluteFile(); buildStrategy = JKubeBuildStrategy.jib; - setPluginContext(new HashMap<>()); + access = ClusterConfiguration.from( + new ConfigBuilder(kubernetesClient.getConfiguration()) + .withNamespace("kubernetes-client-config-namespace") + .build() + ).build(); }}; // @formatter:on } @@ -98,15 +85,14 @@ void setUp(@TempDir Path temporaryFolder) throws Exception { @AfterEach void tearDown() { watcherManagerMockedStatic.close(); - jKubeServiceHubMockedConstruction.close(); } @Test - void executeInternal_whenNoNamespaceConfigured_shouldDelegateToWatcherManagerWithKubernetesClientNamespace() throws Exception { + void executeInternal_whenNoNamespaceConfigured_shouldDelegateToWatcherManagerWithClusterConfigurationNamespace() throws Exception { // When watchMojo.execute(); // Then - watcherManagerMockedStatic.verify(() -> WatcherManager.watch(any(), eq(kubernetesClient.getNamespace()), any(), any()), times(1)); + watcherManagerMockedStatic.verify(() -> WatcherManager.watch(any(), eq("kubernetes-client-config-namespace"), any(), any()), times(1)); } @Test From ee6f352541400fbb9a784f67acc455251ee03de9 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Fri, 12 Jul 2024 13:17:33 +0530 Subject: [PATCH 217/289] test(common): remove workaround added for Fabric8 Kubernetes Mock Server empty context https://github.com/fabric8io/kubernetes-client/issues/6068 has been fixed and we've upgraded to KubernetesClient v6.13.1 which already contains fix for the abovementioned issue. We don't need to have this method anymore. Signed-off-by: Rohan Kumar --- .../kit/common/util/KubernetesHelperTest.java | 10 ++-- .../common/util/KubernetesMockServerUtil.java | 46 ------------------- 2 files changed, 5 insertions(+), 51 deletions(-) delete mode 100644 jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/KubernetesMockServerUtil.java 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 df2a7049aa..3fac3d7245 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 @@ -470,17 +470,17 @@ void exportKubernetesClientConfigToFile_whenInvalidFileProvided_thenThrowExcepti @DisplayName("should work with KubernetesClient config provided by KubernetesMockServer") void exportKubernetesClientConfigToFile_worksWithKubernetesMockServer(@TempDir Path temporaryFolder) throws IOException { // When - final Path result = KubernetesMockServerUtil.exportKubernetesClientConfigToFile(mockServer, temporaryFolder.resolve("config")); + final Path result = KubernetesHelper.exportKubernetesClientConfigToFile(mockClient.getConfiguration(), temporaryFolder.resolve("config")); // Then final io.fabric8.kubernetes.api.model.Config kc = Serialization .unmarshal(result.toFile(), io.fabric8.kubernetes.api.model.Config.class); assertThat(kc) - .hasFieldOrPropertyWithValue("currentContext", "mock-server") + .hasFieldOrPropertyWithValue("currentContext", "fabric8-mock-server-context") .satisfies(c -> assertThat(c.getContexts()) .singleElement(InstanceOfAssertFactories.type(NamedContext.class)) - .hasFieldOrPropertyWithValue("name", "mock-server") + .hasFieldOrPropertyWithValue("name", "fabric8-mock-server-context") .hasFieldOrPropertyWithValue("context.namespace", "test") - .hasFieldOrPropertyWithValue("context.user", "mock-server-user") + .hasFieldOrPropertyWithValue("context.user", "fabric8-mock-server-user") .extracting("context.cluster").asString() .matches("localhost:\\d+") ) @@ -492,7 +492,7 @@ void exportKubernetesClientConfigToFile_worksWithKubernetesMockServer(@TempDir P ) .satisfies(c -> assertThat(c.getUsers()) .singleElement(InstanceOfAssertFactories.type(NamedAuthInfo.class)) - .hasFieldOrPropertyWithValue("name", "mock-server-user")); + .hasFieldOrPropertyWithValue("name", "fabric8-mock-server-user")); } @Test diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/KubernetesMockServerUtil.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/KubernetesMockServerUtil.java deleted file mode 100644 index 2023ddce00..0000000000 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/KubernetesMockServerUtil.java +++ /dev/null @@ -1,46 +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.util; - -import io.fabric8.kubernetes.api.model.NamedContext; -import io.fabric8.kubernetes.api.model.NamedContextBuilder; -import io.fabric8.kubernetes.client.Config; -import io.fabric8.kubernetes.client.ConfigBuilder; -import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; - -import java.nio.file.Path; - -public class KubernetesMockServerUtil { - - private KubernetesMockServerUtil() { } - - // TODO: Remove after https://github.com/fabric8io/kubernetes-client/issues/6068 is fixed - public static Path exportKubernetesClientConfigToFile(KubernetesMockServer mockServer, Path targetKubeConfig) { - final KubernetesClient client = mockServer.createClient(); - final NamedContext mockServerContext = new NamedContextBuilder() - .withName("mock-server") - .withNewContext() - .withNamespace(client.getNamespace()) - .withCluster(String.format("%s:%d", mockServer.getHostName(), mockServer.getPort())) - .withUser("mock-server-user") - .endContext() - .build(); - final Config kubernetesClientConfig = new ConfigBuilder(client.getConfiguration()) - .addToContexts(mockServerContext) - .withCurrentContext(mockServerContext) - .build(); - return KubernetesHelper.exportKubernetesClientConfigToFile(kubernetesClientConfig, targetKubeConfig); - } -} From 2b5d27102fc98328c8fd987edf34a1c8a0986b5b Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Fri, 12 Jul 2024 17:00:07 +0530 Subject: [PATCH 218/289] fix(common): KubernetesHelper.exportKubernetesClientConfigToFile should not set certificate related fields in NamedCluster when `trustCerts=true` While adapting tests in HelmService for install goal, I'm facing problems with exported kubeconfig file. It is getting rejected by Kubernetes as invalid kubeconfig file. In KubernetesMockServer tests, we enable `trustCerts` option to skip certificate verification. However, ClusterConfiguration creates a KubernetesClient config object by merging opinionated default with user provided cluster attributes, this causes resulting config to contain additional fields from user's kubernetes environment. To work around this error, we should not set `certificateAuthority` and `certificateAuthorityData` fields whenever `trustCerts` is enabled. Signed-off-by: Rohan Kumar --- .../kit/common/util/KubernetesHelper.java | 4 ++-- .../kit/common/util/KubernetesHelperTest.java | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) 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 977459fab2..4cfdfe210c 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 @@ -852,10 +852,10 @@ private static NamedCluster createKubeConfigClusterFromClient(io.fabric8.kuberne if (StringUtils.isNotBlank(kubernetesClientConfig.getMasterUrl())) { clusterBuilder.withServer(kubernetesClientConfig.getMasterUrl()); } - if (StringUtils.isNotBlank(kubernetesClientConfig.getCaCertFile())) { + if (StringUtils.isNotBlank(kubernetesClientConfig.getCaCertFile()) && !kubernetesClientConfig.isTrustCerts()) { clusterBuilder.withCertificateAuthority(kubernetesClientConfig.getCaCertFile()); } - if (StringUtils.isNotBlank(kubernetesClientConfig.getCaCertData())) { + if (StringUtils.isNotBlank(kubernetesClientConfig.getCaCertData()) && !kubernetesClientConfig.isTrustCerts()) { clusterBuilder.withCertificateAuthorityData(kubernetesClientConfig.getCaCertData()); } if (kubernetesClientConfig.isTrustCerts()) { 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 3fac3d7245..32f8b4d581 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 @@ -532,6 +532,27 @@ void exportKubernetesClientConfigToFile_whenValidTargetFile_thenWriteKubeConfigT .hasFieldOrPropertyWithValue("user.authProvider.config.key1", "value1")); } + @Test + @DisplayName("should work with valid kube config") + void exportKubernetesClientConfigToFile_whenTrustCertsEnabled_thenDoNotAddCertData(@TempDir Path temporaryFolder) throws IOException { + // Given + io.fabric8.kubernetes.client.Config kubernetesClientConfig = createKubernetesClientConfig(); + kubernetesClientConfig.setTrustCerts(true); + + // When + Path exportedKubeConfig = KubernetesHelper.exportKubernetesClientConfigToFile(kubernetesClientConfig, temporaryFolder.resolve("config")); + + // Then + assertThat(exportedKubeConfig).isNotNull(); + assertThat(Serialization.unmarshal(exportedKubeConfig.toFile(), io.fabric8.kubernetes.api.model.Config.class)) + .satisfies(c -> assertThat(c.getClusters()) + .singleElement(InstanceOfAssertFactories.type(NamedCluster.class)) + .hasFieldOrPropertyWithValue("name", "example-openshiftapps-com:6443") + .hasFieldOrPropertyWithValue("cluster.server", "https://example-openshiftapps-com:6443/") + .hasFieldOrPropertyWithValue("cluster.certificateAuthority", null) + .hasFieldOrPropertyWithValue("cluster.certificateAuthorityData", null)); + } + private Config createKubernetesClientConfig() { NamedContext currentContext = new NamedContextBuilder().withName("cluster1-context") .withNewContext() From 6f767ec39e095c3b211dc9317eb6371a9be4c833 Mon Sep 17 00:00:00 2001 From: Raman Kumar <76739199+rexrk@users.noreply.github.com> Date: Mon, 15 Jul 2024 10:40:18 +0530 Subject: [PATCH 219/289] fix: removed unused import from NginxIngressControllerDetectorTest Signed-off-by: Raman Kumar --- .../ingresscontroller/NginxIngressControllerDetectorTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ingresscontroller/NginxIngressControllerDetectorTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ingresscontroller/NginxIngressControllerDetectorTest.java index 1ea0251084..32b8746471 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ingresscontroller/NginxIngressControllerDetectorTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/ingresscontroller/NginxIngressControllerDetectorTest.java @@ -15,7 +15,6 @@ import io.fabric8.kubernetes.api.model.PodBuilder; import io.fabric8.kubernetes.api.model.PodListBuilder; -import io.fabric8.kubernetes.api.model.authorization.v1.SelfSubjectAccessReview; import io.fabric8.kubernetes.api.model.authorization.v1.SelfSubjectAccessReviewBuilder; import io.fabric8.kubernetes.api.model.networking.v1.IngressClassBuilder; import io.fabric8.kubernetes.api.model.networking.v1.IngressClassListBuilder; From c61450bcd04a23813df5946fa921529bb2383d1f Mon Sep 17 00:00:00 2001 From: Arman Yekkehkhani <72594459+arman-yekkehkhani@users.noreply.github.com> Date: Mon, 15 Jul 2024 11:31:56 +0330 Subject: [PATCH 220/289] fix: replace AssertJ's deprecated asList() DSL method with asInstanceOf in DockerImageWatcherRestartContainerTest chore(DockerImageWatcherRestartContainerTest): substitute deprecated asList with asInstanceOf, issue #3176 Signed-off-by: arman-yekkehkhani --- chore(DockerWatcherRestartContainerTest): minor enhancement, issue #3176 Signed-off-by: arman-yekkehkhani --- chore(DockerWatcherRestartContainerTest): remove unused import, issue #3176 Signed-off-by: arman-yekkehkhani --- .../standard/DockerImageWatcherRestartContainerTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherRestartContainerTest.java b/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherRestartContainerTest.java index 26f8a22355..863bf1d1ac 100644 --- a/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherRestartContainerTest.java +++ b/jkube-kit/watcher/standard/src/test/java/org/eclipse/jkube/watcher/standard/DockerImageWatcherRestartContainerTest.java @@ -161,8 +161,8 @@ private void assertPodTemplateSpecContainsImage(PodTemplateSpec podTemplateSpec, assertThat(podTemplateSpec) .extracting(PodTemplateSpec::getSpec) .extracting(PodSpec::getContainers) - .asList() - .first(InstanceOfAssertFactories.type(Container.class)) + .asInstanceOf(InstanceOfAssertFactories.list(Container.class)) + .first() .extracting(Container::getImage) .isEqualTo(expectedImage); } From 3db16fd58999eff4144056b76e8107a3219e47ba Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Mon, 15 Jul 2024 13:50:05 +0530 Subject: [PATCH 221/289] feat(helm): HelmService exposes helm install functionality Signed-off-by: Rohan Kumar --- .../common/util/KubernetesMockServerUtil.java | 96 +++++++++ jkube-kit/helm/pom.xml | 4 + .../jkube/kit/resource/helm/HelmConfig.java | 4 + .../jkube/kit/resource/helm/HelmService.java | 52 +++++ .../kit/resource/helm/HelmServiceUtil.java | 11 ++ .../resource/helm/HelmServiceInstallIT.java | 185 ++++++++++++++++++ .../resource/helm/HelmServiceUtilTest.java | 33 +++- .../kubernetes/kubernetes.yml | 104 ++++++++++ 8 files changed, 487 insertions(+), 2 deletions(-) create mode 100644 jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/KubernetesMockServerUtil.java create mode 100644 jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceInstallIT.java create mode 100644 jkube-kit/helm/src/test/resources/it/source-helm-install/kubernetes/kubernetes.yml diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/KubernetesMockServerUtil.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/KubernetesMockServerUtil.java new file mode 100644 index 0000000000..6ea14a98a8 --- /dev/null +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/KubernetesMockServerUtil.java @@ -0,0 +1,96 @@ +/* + * 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.util; + +import io.fabric8.kubernetes.api.model.APIGroupBuilder; +import io.fabric8.kubernetes.api.model.APIGroupList; +import io.fabric8.kubernetes.api.model.APIGroupListBuilder; +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.client.VersionInfo; +import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; + +public class KubernetesMockServerUtil { + + private KubernetesMockServerUtil() { } + + // TODO: Remove after https://github.com/fabric8io/kubernetes-client/issues/6062 is fixed + public static void prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints(KubernetesMockServer server) { + server.expect().get() + .withPath("/version?timeout=32s") + .andReturn(200, new VersionInfo.Builder() + .withMajor("1") + .withMinor("30") + .build()) + .always(); + server.expect().get().withPath("/api?timeout=32s") + .andReturn(200, String.format("{\"kind\":\"APIVersions\",\"versions\":[\"v1\"],\"serverAddressByClientCIDRs\":[{\"clientCIDR\":\"0.0.0.0/0\",\"serverAddress\":\"%s:%d\"}]}", server.getHostName(), server.getPort())) + .always(); + server.expect().get().withPath("/apis?timeout=32s") + .andReturn(200, createNewAPIGroupList()) + .always(); + server.expect().get().withPath("/api/v1?timeout=32s") + .andReturn(200, createNewAPIResourceList()) + .always(); + server.expect().get().withPath("/apis/apps/v1?timeout=32s") + .andReturn(200, createNewAPIResourceList()) + .always(); + } + + private static APIResourceList createNewAPIResourceList() { + APIResourceListBuilder apiResourceListBuilder = new APIResourceListBuilder(); + apiResourceListBuilder.addToResources(new APIResourceBuilder() + .withNamespaced() + .withKind("Service") + .withName("services") + .withSingularName("service") + .build()); + apiResourceListBuilder.addToResources(new APIResourceBuilder() + .withName("deployments") + .withKind("Deployment") + .withSingularName("deployment") + .withNamespaced() + .build()); + apiResourceListBuilder.addToResources(new APIResourceBuilder() + .withName("serviceaccounts") + .withKind("ServiceAccount") + .withSingularName("serviceaccount") + .withNamespaced() + .build()); + apiResourceListBuilder.addToResources(new APIResourceBuilder() + .withName("secrets") + .withKind("Secret") + .withSingularName("secret") + .withNamespaced() + .build()); + return apiResourceListBuilder.build(); + } + + private static APIGroupList createNewAPIGroupList() { + return new APIGroupListBuilder() + .addToGroups(new APIGroupBuilder() + .withName("apps") + .addNewVersion() + .withGroupVersion("apps/v1") + .withVersion("v1") + .endVersion() + .withNewPreferredVersion() + .withGroupVersion("apps/v1") + .withVersion("v1") + .endPreferredVersion() + .build()) + .build(); + } +} diff --git a/jkube-kit/helm/pom.xml b/jkube-kit/helm/pom.xml index fa05a483d6..02f1be8674 100644 --- a/jkube-kit/helm/pom.xml +++ b/jkube-kit/helm/pom.xml @@ -83,5 +83,9 @@ io.fabric8 mockwebserver + + io.fabric8 + openshift-server-mock + diff --git a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmConfig.java b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmConfig.java index 481ec6523d..47138306e6 100644 --- a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmConfig.java +++ b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmConfig.java @@ -78,6 +78,10 @@ public class HelmConfig { private boolean debug; private boolean dependencyVerify; private boolean dependencySkipRefresh; + private String releaseName; + private boolean installDependencyUpdate; + private boolean installWaitReady; + private boolean disableOpenAPIValidation; @JsonProperty("dependencies") diff --git a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java index e56810adb8..dd77f671d2 100644 --- a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java +++ b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java @@ -18,6 +18,7 @@ import java.nio.charset.Charset; import java.nio.file.Path; import java.nio.file.Paths; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -35,8 +36,12 @@ import com.marcnuri.helm.DependencyCommand; import com.marcnuri.helm.Helm; +import com.marcnuri.helm.InstallCommand; import com.marcnuri.helm.LintCommand; import com.marcnuri.helm.LintResult; +import com.marcnuri.helm.Release; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.KubernetesClientBuilder; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.KitLogger; @@ -63,6 +68,7 @@ import static org.apache.commons.lang3.StringUtils.EMPTY; import static org.eclipse.jkube.kit.common.JKubeFileInterpolator.DEFAULT_FILTER; import static org.eclipse.jkube.kit.common.JKubeFileInterpolator.interpolate; +import static org.eclipse.jkube.kit.common.util.KubernetesHelper.exportKubernetesClientConfigToFile; import static org.eclipse.jkube.kit.common.util.MapUtil.getNestedMap; import static org.eclipse.jkube.kit.common.util.TemplateUtil.escapeYamlTemplate; import static org.eclipse.jkube.kit.common.util.YamlUtil.listYamls; @@ -189,6 +195,52 @@ public void dependencyUpdate(HelmConfig helmConfig) { } } + public void install(HelmConfig helmConfig) { + for (HelmConfig.HelmType helmType : helmConfig.getTypes()) { + logger.info("Installing Helm Chart %s %s", helmConfig.getChart(), helmConfig.getVersion()); + InstallCommand installCommand = new Helm(Paths.get(helmConfig.getOutputDir(), helmType.getOutputDir())) + .install(); + if (helmConfig.isInstallDependencyUpdate()) { + installCommand.dependencyUpdate(); + } + if (StringUtils.isNotBlank(helmConfig.getReleaseName())) { + installCommand.withName(helmConfig.getReleaseName()); + } + if (helmConfig.isInstallWaitReady()) { + installCommand.waitReady(); + } + if (helmConfig.isDisableOpenAPIValidation()) { + installCommand.disableOpenApiValidation(); + } + installCommand.withKubeConfig(createTemporaryKubeConfigForInstall()); + Release release = installCommand.call(); + logger.info("[[W]]NAME : %s", release.getName()); + logger.info("[[W]]NAMESPACE : %s", release.getNamespace()); + logger.info("[[W]]STATUS : %s", release.getStatus()); + logger.info("[[W]]REVISION : %s", release.getRevision()); + logger.info("[[W]]LAST DEPLOYED : %s", release.getLastDeployed().format(DateTimeFormatter.ofPattern("E MMM dd HH:mm:ss yyyy"))); + Arrays.stream(release.getOutput().split("---")) + .filter(o -> o.contains("Deleting outdated charts")) + .findFirst() + .ifPresent(s -> Arrays.stream(s.split("\r?\n")) + .filter(StringUtils::isNotBlank) + .forEach(l -> logger.info("[[W]]%s", l))); + } + } + + private Path createTemporaryKubeConfigForInstall() { + try { + File kubeConfigParentDir = new File(jKubeConfiguration.getProject().getBuildDirectory(), "jkube-temp"); + FileUtil.createDirectory(kubeConfigParentDir); + File helmInstallKubeConfig = new File(kubeConfigParentDir, "config"); + helmInstallKubeConfig.deleteOnExit(); + exportKubernetesClientConfigToFile(jKubeConfiguration.getClusterConfiguration().getConfig(), helmInstallKubeConfig.toPath()); + return helmInstallKubeConfig.toPath(); + } catch (IOException ioException) { + throw new JKubeException("Failure in creating temporary kubeconfig file", ioException); + } + } + public void lint(HelmConfig helmConfig) { for (HelmConfig.HelmType helmType : helmConfig.getTypes()) { final Path helmPackage = resolveTarballFile(helmConfig, helmType); diff --git a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUtil.java b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUtil.java index eff6e5f588..4a3a537fea 100644 --- a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUtil.java +++ b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUtil.java @@ -22,8 +22,10 @@ import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.Maintainer; import org.eclipse.jkube.kit.common.RegistryServerConfiguration; +import org.eclipse.jkube.kit.common.util.JKubeProjectUtil; import org.eclipse.jkube.kit.common.util.KubernetesHelper; import org.eclipse.jkube.kit.common.util.Serialization; +import org.eclipse.jkube.kit.config.resource.GroupArtifactVersion; import org.eclipse.jkube.kit.config.resource.JKubeAnnotations; import java.io.File; @@ -80,6 +82,10 @@ public class HelmServiceUtil { protected static final String PROPERTY_HELM_DEBUG = "jkube.helm.debug"; protected static final String PROPERTY_HELM_DEPENDENCY_VERIFY = "jkube.helm.dependencyVerify"; protected static final String PROPERTY_HELM_DEPENDENCY_SKIP_REFRESH = "jkube.helm.dependencySkipRefresh"; + protected static final String PROPERTY_HELM_RELEASE_NAME = "jkube.helm.release.name"; + protected static final String PROPERTY_HELM_INSTALL_DEPENDENCY_UPDATE = "jkube.helm.install.dependencyUpdate"; + protected static final String PROPERTY_HELM_INSTALL_WAIT_READY = "jkube.helm.install.waitReady"; + protected static final String PROPERTY_HELM_DISABLE_OPENAPI_VALIDATION = "jkube.helm.disableOpenAPIValidation"; private HelmServiceUtil() { } @@ -123,6 +129,11 @@ public static HelmConfig.HelmConfigBuilder initHelmConfig( helmConfig.setDebug(resolveBooleanFromPropertyOrDefault(PROPERTY_HELM_DEBUG, project, helmConfig::isDebug)); helmConfig.setDependencyVerify(resolveBooleanFromPropertyOrDefault(PROPERTY_HELM_DEPENDENCY_VERIFY, project, helmConfig::isDependencyVerify)); helmConfig.setDependencySkipRefresh(resolveBooleanFromPropertyOrDefault(PROPERTY_HELM_DEPENDENCY_SKIP_REFRESH, project, helmConfig::isDependencySkipRefresh)); + helmConfig.setReleaseName(resolveFromPropertyOrDefault(PROPERTY_HELM_RELEASE_NAME, project, helmConfig::getReleaseName, () -> JKubeProjectUtil.createDefaultResourceName(new GroupArtifactVersion(project.getGroupId(), project.getArtifactId(), project.getVersion()).getSanitizedArtifactId()))); + helmConfig.setInstallDependencyUpdate(original == null || original.isInstallDependencyUpdate()); + helmConfig.setInstallDependencyUpdate(resolveBooleanFromPropertyOrDefault(PROPERTY_HELM_INSTALL_DEPENDENCY_UPDATE, project, helmConfig::isInstallDependencyUpdate)); + helmConfig.setInstallWaitReady(resolveBooleanFromPropertyOrDefault(PROPERTY_HELM_INSTALL_WAIT_READY, project, helmConfig::isInstallWaitReady)); + helmConfig.setDisableOpenAPIValidation(resolveBooleanFromPropertyOrDefault(PROPERTY_HELM_DISABLE_OPENAPI_VALIDATION, project, helmConfig::isDisableOpenAPIValidation)); return helmConfig.toBuilder(); } diff --git a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceInstallIT.java b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceInstallIT.java new file mode 100644 index 0000000000..0c0e3e0733 --- /dev/null +++ b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceInstallIT.java @@ -0,0 +1,185 @@ +/* + * 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.resource.helm; + +import com.marcnuri.helm.Helm; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; +import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; +import io.fabric8.openshift.api.model.Template; +import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JavaProject; +import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; +import org.eclipse.jkube.kit.common.util.Serialization; +import org.eclipse.jkube.kit.config.resource.ResourceServiceConfig; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Collections; +import java.util.Objects; + +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.eclipse.jkube.kit.common.util.KubernetesMockServerUtil.prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@DisplayName("HelmService.install") +@EnableKubernetesMockClient(crud = true) +class HelmServiceInstallIT { + @TempDir + private Path tempDir; + private HelmConfig helmConfig; + private HelmService helmService; + private KitLogger kitLogger; + private KubernetesClient kubernetesClient; + private KubernetesMockServer server; + + @BeforeEach + void setUp() throws URISyntaxException, IOException { + kitLogger = spy(new KitLogger.SilentLogger()); + Template helmParameterTemplates = Serialization.unmarshal(HelmServiceInstallIT.class.getResource("/it/sources/global-template.yml"), Template.class); + Path outputDir = tempDir.resolve("output"); + helmConfig = HelmConfig.builder() + .chart("helm-test") + .version("0.1.0") + .chartExtension("tgz") + .types(Collections.singletonList(HelmConfig.HelmType.KUBERNETES)) + .tarballOutputDir(outputDir.toFile().getAbsolutePath()) + .outputDir(outputDir.toString()) + .parameterTemplates(Collections.singletonList(helmParameterTemplates)) + .sourceDir(new File(Objects.requireNonNull(HelmServiceInstallIT.class.getResource("/it/sources")).toURI()).getAbsolutePath()) + .releaseName("test-project") + .disableOpenAPIValidation(true) + .parameters(Arrays.asList( + HelmParameter.builder().name("annotation_from_config").value("{{ .Chart.Name | upper }}").build(), + HelmParameter.builder().name("annotation.from.config.dotted").value("{{ .Chart.Name }}").build(), + HelmParameter.builder().name("deployment.replicas").value(1).build())) + .build(); + // Remove after https://github.com/fabric8io/kubernetes-client/issues/6062 is fixed + prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints(server); + helmService = new HelmService(JKubeConfiguration.builder() + .project(JavaProject.builder() + .buildDirectory(tempDir.resolve("target").toFile()) + .build()) + .clusterConfiguration(ClusterConfiguration.from(kubernetesClient.getConfiguration()).build()) + .build(), new ResourceServiceConfig(), kitLogger); + } + + @Test + @DisplayName("when valid chart provided, then log installation details after install") + void validChart_thenLogInstalledChartDetails() throws IOException { + // Given + helmService.generateHelmCharts(helmConfig); + // When + helmService.install(helmConfig); + // Then + verify(kitLogger, times(1)).info("[[W]]NAME : %s", "test-project"); + verify(kitLogger, times(1)).info("[[W]]NAMESPACE : %s", ""); + verify(kitLogger, times(1)).info("[[W]]STATUS : %s", "deployed"); + verify(kitLogger, times(1)).info("[[W]]REVISION : %s", "1"); + } + + @Test + @DisplayName("dependency update flag enabled, then download chart") + void whenDependencyUpdateEnabled_thenDownloadDependency() throws IOException { + // Given + givenHelmDependencyPresent(); + helmConfig = helmConfig.toBuilder() + .installDependencyUpdate(true) + .build(); + helmService.generateHelmCharts(helmConfig); + + // When + helmService.install(helmConfig); + + // Then + verify(kitLogger, times(1)).info("[[W]]%s", "Saving 1 charts"); + verify(kitLogger, times(1)).info("[[W]]%s", "Deleting outdated charts"); + } + + @Test + @DisplayName("dependency update flag disabled, then throw exception") + void whenDependencyUpdateDisabled_thenDoNotDownloadDependency() throws IOException { + // Given + givenHelmDependencyPresent(); + helmConfig = helmConfig.toBuilder() + .installDependencyUpdate(false) + .build(); + helmService.generateHelmCharts(helmConfig); + + // When + Then + assertThatIllegalStateException() + .isThrownBy(() -> helmService.install(helmConfig)) + .withMessage("An error occurred while checking for chart dependencies. You may need to run `helm dependency build` to fetch missing dependencies: found in Chart.yaml, but missing in charts/ directory: the-dependency"); + } + + private void givenHelmDependencyPresent() { + Helm.create().withName("the-dependency").withDir(tempDir).call(); + helmConfig = helmConfig.toBuilder() + .dependencies(Collections.singletonList(HelmDependency.builder() + .name("the-dependency") + .version("0.1.0") + .repository("file://../../the-dependency") + .build())) + .build(); + } + + @Test + @DisplayName("when invalid chart provided, then throw exception") + void whenInvalidChartLocation_thenThrowException() { + assertThatIllegalStateException() + .isThrownBy(() -> helmService.install(helmConfig)) + .withMessageContaining(" not found"); + } + + @Test + @DisplayName("when helm chart release name invalid, then throw exception") + void whenHelmChartNameInvalid_thenThrowException() throws IOException { + // Given + helmConfig = helmConfig.toBuilder().releaseName("INVALID").build(); + helmService.generateHelmCharts(helmConfig); + // When + Then + assertThatIllegalStateException() + .isThrownBy(() -> helmService.install(helmConfig)) + .withMessageContaining("release name \"INVALID\": invalid release name"); + } + + @Test + @DisplayName("when dependency referenced doesn't exist, then throw exception") + void whenDependencyReferencedDoesNotExist_thenThrowException() throws IOException { + // Given + helmConfig = helmConfig.toBuilder() + .installDependencyUpdate(true) + .dependencies(Collections.singletonList(HelmDependency.builder() + .name("the-dependency") + .version("0.1.0") + .repository("file://../../the-dependency") + .build())) + .build(); + helmService.generateHelmCharts(helmConfig); + // When + Then + assertThatIllegalStateException() + .isThrownBy(() -> helmService.install(helmConfig)) + .withMessage(String.format("An error occurred while updating chart dependencies: directory %s/the-dependency not found", tempDir)); + } +} diff --git a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUtilTest.java b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUtilTest.java index d0b5afedcd..d2e320eca8 100644 --- a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUtilTest.java +++ b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUtilTest.java @@ -89,7 +89,11 @@ void initHelmConfig_withNoConfig_shouldInitConfigWithDefaultValues() throws IOEx .hasFieldOrPropertyWithValue("parameterTemplates", Collections.emptyList()) .hasFieldOrProperty("icon") .hasFieldOrPropertyWithValue("lintStrict", false) - .hasFieldOrPropertyWithValue("lintQuiet", false); + .hasFieldOrPropertyWithValue("lintQuiet", false) + .hasFieldOrPropertyWithValue("releaseName", "artifact-id") + .hasFieldOrPropertyWithValue("installDependencyUpdate", true) + .hasFieldOrPropertyWithValue("installWaitReady", false) + .hasFieldOrPropertyWithValue("disableOpenAPIValidation", false); assertThat(result.getSourceDir()).endsWith(separatorsToSystem("target/classes/META-INF/jkube/")); assertThat(result.getOutputDir()).endsWith(separatorsToSystem("target/jkube/helm/artifact-id")); assertThat(result.getTarballOutputDir()).endsWith(separatorsToSystem("target/jkube/helm/artifact-id")); @@ -111,6 +115,10 @@ void initHelmConfig_withOriginalConfig_shouldInitConfigWithoutOverriding() throw .debug(true) .dependencySkipRefresh(true) .dependencyVerify(true) + .releaseName("new-release-name") + .installDependencyUpdate(false) + .installWaitReady(true) + .disableOpenAPIValidation(true) .build(); // When final HelmConfig result = HelmServiceUtil @@ -133,7 +141,11 @@ void initHelmConfig_withOriginalConfig_shouldInitConfigWithoutOverriding() throw .hasFieldOrPropertyWithValue("lintQuiet", true) .hasFieldOrPropertyWithValue("debug", true) .hasFieldOrPropertyWithValue("dependencySkipRefresh", true) - .hasFieldOrPropertyWithValue("dependencyVerify", true); + .hasFieldOrPropertyWithValue("dependencyVerify", true) + .hasFieldOrPropertyWithValue("releaseName", "new-release-name") + .hasFieldOrPropertyWithValue("installDependencyUpdate", false) + .hasFieldOrPropertyWithValue("installWaitReady", true) + .hasFieldOrPropertyWithValue("disableOpenAPIValidation", true); } @Test @@ -185,6 +197,23 @@ void initHelmConfig_withHelmDependencyProperties_shouldInitConfigWithHelmDepende .hasFieldOrPropertyWithValue("dependencySkipRefresh", true); } + @Test + void initHelmConfig_withHelmInstallProperties_shouldInitConfigWithHelmInstallSettings() throws IOException { + // Given + javaProject.getProperties().put("jkube.helm.release.name", "test-release-name"); + javaProject.getProperties().put("jkube.helm.install.dependencyUpdate", "False"); + javaProject.getProperties().put("jkube.helm.install.waitReady", "true"); + // When + final HelmConfig result = HelmServiceUtil + .initHelmConfig(HelmConfig.HelmType.KUBERNETES, javaProject, templateDir, null) + .build(); + // Then + assertThat(result) + .hasFieldOrPropertyWithValue("releaseName", "test-release-name") + .hasFieldOrPropertyWithValue("installDependencyUpdate", false) + .hasFieldOrPropertyWithValue("installWaitReady", true); + } + @Test void initHelmConfig_whenValuesSchemaJsonPresentInProjectBaseDir_thenAddToHelmConfig() throws IOException { // Given diff --git a/jkube-kit/helm/src/test/resources/it/source-helm-install/kubernetes/kubernetes.yml b/jkube-kit/helm/src/test/resources/it/source-helm-install/kubernetes/kubernetes.yml new file mode 100644 index 0000000000..dc1daa6275 --- /dev/null +++ b/jkube-kit/helm/src/test/resources/it/source-helm-install/kubernetes/kubernetes.yml @@ -0,0 +1,104 @@ +# +# 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 +# + +apiVersion: v1 +kind: List +items: + - apiVersion: v1 + kind: Service + metadata: + annotations: + prometheus.io/scrape: "true" + prometheus.io/path: /metrics + prometheus.io/port: "9779" + labels: + app: ITChart + provider: jkube + version: 1.0.0-SNAPSHOT + group: org.eclipse.jkube.testing + app.kubernetes.io/part-of: org.eclipse.jkube.testing + app.kubernetes.io/managed-by: jkube + app.kubernetes.io/name: ITChart + app.kubernetes.io/version: 1.0.0-SNAPSHOT + name: ITChart + spec: + ports: + - name: http + port: 8080 + protocol: TCP + targetPort: 8080 + selector: + app: ITChart + provider: jkube + group: org.eclipse.jkube.testing + app.kubernetes.io/name: ITChart + app.kubernetes.io/part-of: org.eclipse.jkube.testing + app.kubernetes.io/managed-by: jkube + - apiVersion: apps/v1 + kind: Deployment + metadata: + labels: + app: ITChart + provider: jkube + version: 1.0.0-SNAPSHOT + group: org.eclipse.jkube.testing + app.kubernetes.io/part-of: org.eclipse.jkube.testing + app.kubernetes.io/managed-by: jkube + app.kubernetes.io/name: ITChart + app.kubernetes.io/version: 1.0.0-SNAPSHOT + name: ITChart + spec: + replicas: 1 + revisionHistoryLimit: 2 + selector: + matchLabels: + app: ITChart + provider: jkube + group: org.eclipse.jkube.testing + app.kubernetes.io/name: ITChart + app.kubernetes.io/part-of: test + app.kubernetes.io/managed-by: jkube + template: + metadata: + labels: + app: ITChart + provider: jkube + version: 1.0.0-SNAPSHOT + group: org.eclipse.jkube.testing + app.kubernetes.io/part-of: test + app.kubernetes.io/managed-by: jkube + app.kubernetes.io/name: ITChart + name: ITChart + spec: + containers: + - env: + - name: KUBERNETES_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + image: foo/ITChart:1.0.0-SNAPSHOT + imagePullPolicy: IfNotPresent + name: test-project + ports: + - containerPort: 8080 + name: http + protocol: TCP + - containerPort: 9779 + name: prometheus + protocol: TCP + - containerPort: 8778 + name: jolokia + protocol: TCP + securityContext: + privileged: false \ No newline at end of file From 7f45544821a2dfd09355e8811fa7e0d65188ad96 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Tue, 16 Jul 2024 10:35:20 +0530 Subject: [PATCH 222/289] feat(helm): Helm Install functionality exposed via Maven Mojos / Gradle Tasks Signed-off-by: Rohan Kumar --- gradle-plugin/kubernetes/pom.xml | 7 + .../jkube/gradle/plugin/KubernetesPlugin.java | 3 + .../task/KubernetesHelmInstallTask.java | 36 +++++ .../gradle/plugin/KubernetesPluginTest.java | 5 +- .../task/KubernetesHelmInstallTaskTest.java | 123 +++++++++++++++++ gradle-plugin/openshift/pom.xml | 7 + .../jkube/gradle/plugin/OpenShiftPlugin.java | 3 + .../plugin/task/OpenShiftHelmInstallTask.java | 26 ++++ .../gradle/plugin/OpenShiftPluginTest.java | 5 +- .../task/OpenShiftHelmInstallTaskTest.java | 123 +++++++++++++++++ kubernetes-maven-plugin/plugin/pom.xml | 6 + .../plugin/mojo/build/HelmInstallMojo.java | 27 ++++ .../mojo/GeneratedPluginDescriptorTest.java | 3 +- .../mojo/build/HelmInstallMojoTest.java | 130 ++++++++++++++++++ openshift-maven-plugin/plugin/pom.xml | 15 ++ .../mojo/build/OpenshiftHelmInstallMojo.java | 52 +++++++ ...penShiftGeneratedPluginDescriptorTest.java | 3 +- .../build/OpenshiftHelmInstallMojoTest.java | 130 ++++++++++++++++++ 18 files changed, 698 insertions(+), 6 deletions(-) create mode 100644 gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmInstallTask.java create mode 100644 gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmInstallTaskTest.java create mode 100644 gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmInstallTask.java create mode 100644 gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmInstallTaskTest.java create mode 100644 kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmInstallMojo.java create mode 100644 kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmInstallMojoTest.java create mode 100644 openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmInstallMojo.java create mode 100644 openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmInstallMojoTest.java diff --git a/gradle-plugin/kubernetes/pom.xml b/gradle-plugin/kubernetes/pom.xml index 89cd2880df..6c9a94d251 100644 --- a/gradle-plugin/kubernetes/pom.xml +++ b/gradle-plugin/kubernetes/pom.xml @@ -167,6 +167,13 @@ + + org.eclipse.jkube + jkube-kit-common + test + test-jar + + io.fabric8 mockwebserver diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesPlugin.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesPlugin.java index 8596cea26e..d7f8b1e0a0 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesPlugin.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesPlugin.java @@ -24,6 +24,7 @@ import org.eclipse.jkube.gradle.plugin.task.KubernetesConfigViewTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesDebugTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmDependencyUpdateTask; +import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmInstallTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmLintTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmPushTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmTask; @@ -53,6 +54,7 @@ public Map>> getTaskPrecedence() { ret.put("k8sHelmPush", Collections.singletonList(KubernetesHelmTask.class)); ret.put("k8sHelmLint", Collections.singletonList(KubernetesHelmTask.class)); ret.put("k8sHelmDependencyUpdate", Collections.singletonList(KubernetesHelmTask.class)); + ret.put("k8sHelmInstall", Collections.singletonList(KubernetesHelmTask.class)); return ret; } @@ -70,6 +72,7 @@ protected void jKubeApply(Project project) { register(project, "k8sHelmPush", KubernetesHelmPushTask.class); register(project, "k8sHelmLint", KubernetesHelmLintTask.class); register(project, "k8sHelmDependencyUpdate", KubernetesHelmDependencyUpdateTask.class); + register(project, "k8sHelmInstall", KubernetesHelmInstallTask.class); register(project, "k8sRemoteDev", KubernetesRemoteDevTask.class); register(project, "k8sWatch", KubernetesWatchTask.class); } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmInstallTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmInstallTask.java new file mode 100644 index 0000000000..2911c8b0c3 --- /dev/null +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmInstallTask.java @@ -0,0 +1,36 @@ +/* + * 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.gradle.plugin.task; + +import org.eclipse.jkube.gradle.plugin.KubernetesExtension; + +import javax.inject.Inject; + +public class KubernetesHelmInstallTask extends AbstractHelmTask { + @Inject + public KubernetesHelmInstallTask(Class extensionClass) { + super(extensionClass); + setDescription("Installs a helm chart onto Kubernetes cluster"); + } + + @Override + public void run() { + try { + jKubeServiceHub.getHelmService().install(kubernetesExtension.helm); + } catch (Exception exp) { + kitLogger.error("Error performing helm install", exp); + throw new IllegalStateException(exp.getMessage(), exp); + } + } +} diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/KubernetesPluginTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/KubernetesPluginTest.java index faa1605f48..ebe8735210 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/KubernetesPluginTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/KubernetesPluginTest.java @@ -81,7 +81,7 @@ void getTaskPrecedence_withValidProject_shouldReturnTaskPrecedence() { final Map>> result = new KubernetesPlugin().getTaskPrecedence(); // Then assertThat(result) - .hasSize(7) + .hasSize(8) .containsEntry("k8sApply", Collections.singletonList(KubernetesResourceTask.class)) .containsEntry("k8sDebug", Arrays.asList(KubernetesBuildTask.class, KubernetesResourceTask.class, KubernetesApplyTask.class)) @@ -89,6 +89,7 @@ void getTaskPrecedence_withValidProject_shouldReturnTaskPrecedence() { .containsEntry("k8sHelm", Collections.singletonList(KubernetesResourceTask.class)) .containsEntry("k8sHelmDependencyUpdate", Collections.singletonList(KubernetesHelmTask.class)) .containsEntry("k8sHelmPush", Collections.singletonList(KubernetesHelmTask.class)) - .containsEntry("k8sHelmLint", Collections.singletonList(KubernetesHelmTask.class)); + .containsEntry("k8sHelmLint", Collections.singletonList(KubernetesHelmTask.class)) + .containsEntry("k8sHelmInstall", Collections.singletonList(KubernetesHelmTask.class)); } } diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmInstallTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmInstallTaskTest.java new file mode 100644 index 0000000000..5668a5268c --- /dev/null +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmInstallTaskTest.java @@ -0,0 +1,123 @@ +/* + * 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.gradle.plugin.task; + +import com.marcnuri.helm.Helm; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; +import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; +import org.apache.commons.io.FileUtils; +import org.eclipse.jkube.gradle.plugin.KubernetesExtension; +import org.eclipse.jkube.gradle.plugin.TestKubernetesExtension; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; +import org.eclipse.jkube.kit.resource.helm.HelmConfig; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; + +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.eclipse.jkube.kit.common.util.KubernetesMockServerUtil.prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@EnableKubernetesMockClient(crud = true) +class KubernetesHelmInstallTaskTest { + @RegisterExtension + private final TaskEnvironmentExtension taskEnvironment = new TaskEnvironmentExtension(); + private KubernetesClient kubernetesClient; + private KubernetesMockServer server; + private TestKubernetesExtension extension; + + @BeforeEach + void setUp() throws IOException { + extension = new TestKubernetesExtension(); + // Remove after https://github.com/fabric8io/kubernetes-client/issues/6062 is fixed + prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints(server); + Helm.create().withDir(taskEnvironment.getRoot().toPath()).withName("empty-project").call(); + Path helmChartOutputDir = taskEnvironment.getRoot().toPath().resolve("build").resolve("jkube").resolve("helm"); + Files.createDirectories(helmChartOutputDir.resolve("kubernetes")); + FileUtils.copyDirectory(taskEnvironment.getRoot().toPath().resolve("empty-project").toFile(), helmChartOutputDir.resolve("kubernetes").toFile()); + Files.write(helmChartOutputDir.resolve("kubernetes").resolve("Chart.yaml"), + ("\ndependencies:\n" + + " - name: the-dependency\n" + + " version: 0.1.0\n" + + " repository: file://../../../../the-dependency\n").getBytes(StandardCharsets.UTF_8), + StandardOpenOption.APPEND); + System.setProperty("jkube.kubernetesTemplate", taskEnvironment.getRoot().getAbsolutePath()); + extension.helm = HelmConfig.builder() + .chartExtension("tgz") + .installDependencyUpdate(true) + .disableOpenAPIValidation(true) + .outputDir(helmChartOutputDir.toString()).build(); + extension.access = ClusterConfiguration.from(kubernetesClient.getConfiguration()).build(); + extension.isUseColor = false; + when(taskEnvironment.project.getName()).thenReturn("empty-project"); + when(taskEnvironment.project.getVersion()).thenReturn("0.1.0"); + when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); + } + + @AfterEach + void tearDown() { + System.clearProperty("jkube.kubernetesTemplate"); + } + + @Test + void runTask_withHelmDependencyPresent_shouldSucceed() { + // Given + KubernetesHelmInstallTask kubernetesHelmInstallTask = new KubernetesHelmInstallTask(KubernetesExtension.class); + Helm.create().withName("the-dependency").withDir(taskEnvironment.getRoot().toPath()).call(); + + // When + kubernetesHelmInstallTask.runTask(); + // Then + verify(taskEnvironment.logger).lifecycle("k8s: NAME : empty-project"); + verify(taskEnvironment.logger).lifecycle("k8s: NAMESPACE : "); + verify(taskEnvironment.logger).lifecycle("k8s: STATUS : deployed"); + verify(taskEnvironment.logger).lifecycle("k8s: REVISION : 1"); + verify(taskEnvironment.logger).lifecycle("k8s: Saving 1 charts"); + verify(taskEnvironment.logger).lifecycle("k8s: Deleting outdated charts"); + } + + @Test + void runTask_withHelmDependencyAbsent_shouldThrowException() { + // Given + KubernetesHelmInstallTask kubernetesHelmInstallTask = new KubernetesHelmInstallTask(KubernetesExtension.class); + // When + Then + assertThatIllegalStateException() + .isThrownBy(kubernetesHelmInstallTask::runTask) + .withMessageContaining("the-dependency not found"); + } + + @Test + void runTask_withInstallDependencyUpdateDisabled_shouldThrowException() { + // Given + extension.helm = extension.helm.toBuilder() + .installDependencyUpdate(false) + .build(); + when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); + KubernetesHelmInstallTask kubernetesHelmInstallTask = new KubernetesHelmInstallTask(KubernetesExtension.class); + // When + Then + assertThatIllegalStateException() + .isThrownBy(kubernetesHelmInstallTask::runTask) + .withMessage("An error occurred while checking for chart dependencies. " + + "You may need to run `helm dependency build` to fetch missing dependencies: found in Chart.yaml, but missing in charts/ directory: the-dependency"); + } +} diff --git a/gradle-plugin/openshift/pom.xml b/gradle-plugin/openshift/pom.xml index d906d5fc38..8538c21d3b 100644 --- a/gradle-plugin/openshift/pom.xml +++ b/gradle-plugin/openshift/pom.xml @@ -64,6 +64,13 @@ + + org.eclipse.jkube + jkube-kit-common + test + test-jar + + io.fabric8 mockwebserver diff --git a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/OpenShiftPlugin.java b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/OpenShiftPlugin.java index 150df93110..2425ab206c 100644 --- a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/OpenShiftPlugin.java +++ b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/OpenShiftPlugin.java @@ -28,6 +28,7 @@ import org.eclipse.jkube.gradle.plugin.task.OpenShiftBuildTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftDebugTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftHelmDependencyUpdateTask; +import org.eclipse.jkube.gradle.plugin.task.OpenShiftHelmInstallTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftHelmLintTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftHelmPushTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftHelmTask; @@ -57,6 +58,7 @@ public Map>> getTaskPrecedence() { ret.put("ocHelmPush", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)); ret.put("ocHelmLint", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)); ret.put("ocHelmDependencyUpdate", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)); + ret.put("ocHelmInstall", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)); return ret; } @@ -74,6 +76,7 @@ protected void jKubeApply(Project project) { register(project, "ocHelmPush", OpenShiftHelmPushTask.class); register(project, "ocHelmLint", OpenShiftHelmLintTask.class); register(project, "ocHelmDependencyUpdate", OpenShiftHelmDependencyUpdateTask.class); + register(project, "ocHelmInstall", OpenShiftHelmInstallTask.class); register(project, "ocRemoteDev", OpenShiftRemoteDevTask.class); register(project, "ocWatch", OpenShiftWatchTask.class); } diff --git a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmInstallTask.java b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmInstallTask.java new file mode 100644 index 0000000000..c7930dfdde --- /dev/null +++ b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmInstallTask.java @@ -0,0 +1,26 @@ +/* + * 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.gradle.plugin.task; + +import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; + +import javax.inject.Inject; + +public class OpenShiftHelmInstallTask extends KubernetesHelmInstallTask implements OpenShiftJKubeTask { + @Inject + public OpenShiftHelmInstallTask(Class extensionClass) { + super(extensionClass); + setDescription("Installs a helm chart onto OpenShift cluster"); + } +} diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/OpenShiftPluginTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/OpenShiftPluginTest.java index 6fdfbc512e..ce30318314 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/OpenShiftPluginTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/OpenShiftPluginTest.java @@ -39,7 +39,7 @@ void configurePrecedence_withValidProject_shouldReturnTaskPrecedence() { final Map>> result = new OpenShiftPlugin().getTaskPrecedence(); // Then assertThat(result) - .hasSize(7) + .hasSize(8) .containsEntry("ocApply", Arrays.asList(KubernetesResourceTask.class, OpenShiftResourceTask.class)) .containsEntry("ocDebug", Arrays.asList(KubernetesBuildTask.class, OpenShiftBuildTask.class, KubernetesResourceTask.class, OpenShiftResourceTask.class, KubernetesApplyTask.class, OpenShiftApplyTask.class)) @@ -47,6 +47,7 @@ void configurePrecedence_withValidProject_shouldReturnTaskPrecedence() { .containsEntry("ocHelm", Arrays.asList(KubernetesResourceTask.class, OpenShiftResourceTask.class)) .containsEntry("ocHelmDependencyUpdate", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)) .containsEntry("ocHelmPush", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)) - .containsEntry("ocHelmLint", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)); + .containsEntry("ocHelmLint", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)) + .containsEntry("ocHelmInstall", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)); } } diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmInstallTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmInstallTaskTest.java new file mode 100644 index 0000000000..836a7c8a1e --- /dev/null +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmInstallTaskTest.java @@ -0,0 +1,123 @@ +/* + * 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.gradle.plugin.task; + +import com.marcnuri.helm.Helm; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; +import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; +import org.apache.commons.io.FileUtils; +import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; +import org.eclipse.jkube.gradle.plugin.TestOpenShiftExtension; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; +import org.eclipse.jkube.kit.resource.helm.HelmConfig; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; + +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.eclipse.jkube.kit.common.util.KubernetesMockServerUtil.prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@EnableKubernetesMockClient(crud = true) +class OpenShiftHelmInstallTaskTest { + @RegisterExtension + private final TaskEnvironmentExtension taskEnvironment = new TaskEnvironmentExtension(); + private KubernetesClient kubernetesClient; + private KubernetesMockServer server; + private TestOpenShiftExtension extension; + + @BeforeEach + void setUp() throws IOException { + extension = new TestOpenShiftExtension(); + // Remove after https://github.com/fabric8io/kubernetes-client/issues/6062 is fixed + prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints(server); + Helm.create().withDir(taskEnvironment.getRoot().toPath()).withName("empty-project").call(); + Path helmChartOutputDir = taskEnvironment.getRoot().toPath().resolve("build").resolve("jkube").resolve("helm"); + Files.createDirectories(helmChartOutputDir.resolve("openshift")); + FileUtils.copyDirectory(taskEnvironment.getRoot().toPath().resolve("empty-project").toFile(), helmChartOutputDir.resolve("openshift").toFile()); + Files.write(helmChartOutputDir.resolve("openshift").resolve("Chart.yaml"), + ("\ndependencies:\n" + + " - name: the-dependency\n" + + " version: 0.1.0\n" + + " repository: file://../../../../the-dependency\n").getBytes(StandardCharsets.UTF_8), + StandardOpenOption.APPEND); + System.setProperty("jkube.kubernetesTemplate", taskEnvironment.getRoot().getAbsolutePath()); + extension.helm = HelmConfig.builder() + .chartExtension("tgz") + .installDependencyUpdate(true) + .disableOpenAPIValidation(true) + .outputDir(helmChartOutputDir.toString()).build(); + extension.access = ClusterConfiguration.from(kubernetesClient.getConfiguration()).build(); + extension.isUseColor = false; + when(taskEnvironment.project.getName()).thenReturn("empty-project"); + when(taskEnvironment.project.getVersion()).thenReturn("0.1.0"); + when(taskEnvironment.project.getExtensions().getByType(OpenShiftExtension.class)).thenReturn(extension); + } + + @AfterEach + void tearDown() { + System.clearProperty("jkube.kubernetesTemplate"); + } + + @Test + void runTask_withHelmDependencyPresent_shouldSucceed() { + // Given + OpenShiftHelmInstallTask openShiftHelmInstallTask = new OpenShiftHelmInstallTask(OpenShiftExtension.class); + Helm.create().withName("the-dependency").withDir(taskEnvironment.getRoot().toPath()).call(); + + // When + openShiftHelmInstallTask.runTask(); + // Then + verify(taskEnvironment.logger).lifecycle("oc: NAME : empty-project"); + verify(taskEnvironment.logger).lifecycle("oc: NAMESPACE : "); + verify(taskEnvironment.logger).lifecycle("oc: STATUS : deployed"); + verify(taskEnvironment.logger).lifecycle("oc: REVISION : 1"); + verify(taskEnvironment.logger).lifecycle("oc: Saving 1 charts"); + verify(taskEnvironment.logger).lifecycle("oc: Deleting outdated charts"); + } + + @Test + void runTask_withHelmDependencyAbsent_shouldThrowException() { + // Given + OpenShiftHelmInstallTask openShiftHelmInstallTask = new OpenShiftHelmInstallTask(OpenShiftExtension.class); + // When + Then + assertThatIllegalStateException() + .isThrownBy(openShiftHelmInstallTask::runTask) + .withMessageContaining("the-dependency not found"); + } + + @Test + void runTask_withInstallDependencyUpdateDisabled_shouldThrowException() { + // Given + extension.helm = extension.helm.toBuilder() + .installDependencyUpdate(false) + .build(); + when(taskEnvironment.project.getExtensions().getByType(OpenShiftExtension.class)).thenReturn(extension); + OpenShiftHelmInstallTask openShiftHelmInstallTask = new OpenShiftHelmInstallTask(OpenShiftExtension.class); + // When + Then + assertThatIllegalStateException() + .isThrownBy(openShiftHelmInstallTask::runTask) + .withMessage("An error occurred while checking for chart dependencies. " + + "You may need to run `helm dependency build` to fetch missing dependencies: found in Chart.yaml, but missing in charts/ directory: the-dependency"); + } +} diff --git a/kubernetes-maven-plugin/plugin/pom.xml b/kubernetes-maven-plugin/plugin/pom.xml index 7c0b9acd2f..0d681a1c3c 100644 --- a/kubernetes-maven-plugin/plugin/pom.xml +++ b/kubernetes-maven-plugin/plugin/pom.xml @@ -157,6 +157,12 @@ jkube-kit-remote-dev + + org.eclipse.jkube + jkube-kit-common + test + test-jar + io.fabric8 mockwebserver diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmInstallMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmInstallMojo.java new file mode 100644 index 0000000000..27855f929f --- /dev/null +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmInstallMojo.java @@ -0,0 +1,27 @@ +/* + * 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.maven.plugin.mojo.build; + +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.ResolutionScope; + +@Mojo(name = "helm-install", defaultPhase = LifecyclePhase.INSTALL, requiresDependencyResolution = ResolutionScope.COMPILE) +public class HelmInstallMojo extends AbstractHelmMojo { + @Override + public void executeInternal() throws MojoExecutionException { + jkubeServiceHub.getHelmService().install(getHelm()); + } +} diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/GeneratedPluginDescriptorTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/GeneratedPluginDescriptorTest.java index e5f7601e5e..e3e94a1f37 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/GeneratedPluginDescriptorTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/GeneratedPluginDescriptorTest.java @@ -56,7 +56,8 @@ static Stream data() { arguments("helm", "", "pre-integration-test"), arguments("helm-dependency-update", "compile", "integration-test"), arguments("helm-push", "compile", "install"), - arguments("helm-lint", "compile", "integration-test")); + arguments("helm-lint", "compile", "integration-test"), + arguments("helm-install", "compile", "install")); } @DisplayName("verify, phase and required dependency resolution") diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmInstallMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmInstallMojoTest.java new file mode 100644 index 0000000000..1fddbb4497 --- /dev/null +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmInstallMojoTest.java @@ -0,0 +1,130 @@ +/* + * 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.maven.plugin.mojo.build; + +import com.marcnuri.helm.Helm; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; +import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; +import org.apache.commons.io.FileUtils; +import org.apache.maven.project.MavenProject; +import org.apache.maven.settings.Settings; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; +import org.eclipse.jkube.kit.resource.helm.HelmConfig; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.eclipse.jkube.kit.common.util.KubernetesMockServerUtil.prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints; + +@EnableKubernetesMockClient(crud = true) +class HelmInstallMojoTest { + @TempDir + private Path projectDir; + private PrintStream originalPrintStream; + private ByteArrayOutputStream outputStream; + private HelmInstallMojo helmInstallMojo; + private KubernetesClient kubernetesClient; + private KubernetesMockServer server; + + @BeforeEach + void setUp() throws Exception { + originalPrintStream = System.out; + // Remove after https://github.com/fabric8io/kubernetes-client/issues/6062 is fixed + prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints(server); + outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + Helm.create().withDir(projectDir).withName("empty-project").call(); + Path helmChartOutputDir = projectDir.resolve("target").resolve("jkube").resolve("helm"); + Files.createDirectories(helmChartOutputDir.resolve("kubernetes")); + FileUtils.copyDirectory(projectDir.resolve("empty-project").toFile(), helmChartOutputDir.resolve("kubernetes").toFile()); + Files.write(helmChartOutputDir.resolve("kubernetes").resolve("Chart.yaml"), + ("\ndependencies:\n" + + " - name: the-dependency\n" + + " version: 0.1.0\n" + + " repository: file://../../../../the-dependency\n").getBytes(StandardCharsets.UTF_8), + StandardOpenOption.APPEND); + System.setProperty("jkube.kubernetesTemplate", projectDir.toFile().getAbsolutePath()); + helmInstallMojo = new HelmInstallMojo(); + helmInstallMojo.helm = HelmConfig.builder().chartExtension("tgz") + .outputDir(helmChartOutputDir.toString()) + .installDependencyUpdate(true) + .disableOpenAPIValidation(true) + .build(); + helmInstallMojo.access = ClusterConfiguration.from(kubernetesClient.getConfiguration()).build(); + helmInstallMojo.interpolateTemplateParameters = true; + helmInstallMojo.settings = new Settings(); + helmInstallMojo.project = new MavenProject(); + helmInstallMojo.project.setVersion("0.1.0"); + helmInstallMojo.project.getBuild() + .setOutputDirectory(projectDir.resolve("target").resolve("classes").toFile().getAbsolutePath()); + helmInstallMojo.project.getBuild().setDirectory(projectDir.resolve("target").toFile().getAbsolutePath()); + helmInstallMojo.project.setFile(projectDir.resolve("target").toFile()); + } + + @AfterEach + void tearDown() { + System.setOut(originalPrintStream); + System.clearProperty("jkube.kubernetesTemplate"); + helmInstallMojo = null; + } + + @Test + void execute_withInstallDependencyUpdateDisabled_shouldThrowException() { + // Given + helmInstallMojo.helm = helmInstallMojo.helm.toBuilder() + .installDependencyUpdate(false) + .build(); + // When + Then + assertThatIllegalStateException() + .isThrownBy(helmInstallMojo::execute) + .withMessage("An error occurred while checking for chart dependencies. " + + "You may need to run `helm dependency build` to fetch missing dependencies: found in Chart.yaml, but missing in charts/ directory: the-dependency"); + } + + @Test + void execute_withHelmDependencyPresent_shouldSucceed() throws Exception { + // Given + Helm.create().withName("the-dependency").withDir(projectDir).call(); + // When + helmInstallMojo.execute(); + // Then + assertThat(outputStream.toString()) + .contains("NAME : empty-project") + .contains("NAMESPACE : ") + .contains("STATUS : deployed") + .contains("REVISION : 1") + .contains("LAST DEPLOYED : ") + .contains("Saving 1 charts") + .contains("Deleting outdated charts"); + } + + @Test + void execute_withHelmDependencyAbsent_shouldThrowException() { + // When + Then + assertThatIllegalStateException() + .isThrownBy(() -> helmInstallMojo.execute()) + .withMessageContaining("the-dependency not found"); + } +} diff --git a/openshift-maven-plugin/plugin/pom.xml b/openshift-maven-plugin/plugin/pom.xml index a984e8f78a..6c00443965 100644 --- a/openshift-maven-plugin/plugin/pom.xml +++ b/openshift-maven-plugin/plugin/pom.xml @@ -41,6 +41,21 @@ ${jkube.kit.version} + + org.eclipse.jkube + jkube-kit-common + test + test-jar + + + io.fabric8 + mockwebserver + + + + io.fabric8 + openshift-server-mock + org.junit.jupiter junit-jupiter-engine diff --git a/openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmInstallMojo.java b/openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmInstallMojo.java new file mode 100644 index 0000000000..1fbc850c53 --- /dev/null +++ b/openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmInstallMojo.java @@ -0,0 +1,52 @@ +/* + * 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.maven.plugin.mojo.build; + +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.plugins.annotations.ResolutionScope; +import org.eclipse.jkube.kit.resource.helm.HelmConfig; +import org.eclipse.jkube.maven.plugin.mojo.OpenShift; + +import java.io.File; + +@Mojo(name = "helm-install", defaultPhase = LifecyclePhase.INSTALL, requiresDependencyResolution = ResolutionScope.COMPILE) +public class OpenshiftHelmInstallMojo extends HelmInstallMojo { + /** + * One of: + *
    + *
  • A directory containing OpenShift Templates to use as Helm parameters.
  • + *
  • A file containing a Kubernetes List with OpenShift Template entries to be used as Helm parameters.
  • + *
+ */ + @Parameter(property = "jkube.openshiftTemplate", defaultValue = "${basedir}/target/classes/META-INF/jkube/openshift") + private File openShiftTemplate; + + + @Override + protected File getKubernetesTemplate() { + return openShiftTemplate; + } + + @Override + protected HelmConfig.HelmType getDefaultHelmType() { + return HelmConfig.HelmType.OPENSHIFT; + } + + @Override + protected String getLogPrefix() { + return OpenShift.DEFAULT_LOG_PREFIX; + } +} diff --git a/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/OpenShiftGeneratedPluginDescriptorTest.java b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/OpenShiftGeneratedPluginDescriptorTest.java index a04a9c94bc..da9ce060ca 100644 --- a/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/OpenShiftGeneratedPluginDescriptorTest.java +++ b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/OpenShiftGeneratedPluginDescriptorTest.java @@ -55,7 +55,8 @@ static Stream data() { arguments("helm", "", "pre-integration-test"), arguments("helm-dependency-update", "compile", "integration-test"), arguments("helm-push", "compile", "install"), - arguments("helm-lint", "compile", "integration-test") + arguments("helm-lint", "compile", "integration-test"), + arguments("helm-install", "compile", "install") ); } diff --git a/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmInstallMojoTest.java b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmInstallMojoTest.java new file mode 100644 index 0000000000..7705e5b1a0 --- /dev/null +++ b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmInstallMojoTest.java @@ -0,0 +1,130 @@ +/* + * 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.maven.plugin.mojo.build; + +import com.marcnuri.helm.Helm; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; +import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; +import org.apache.commons.io.FileUtils; +import org.apache.maven.project.MavenProject; +import org.apache.maven.settings.Settings; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; +import org.eclipse.jkube.kit.resource.helm.HelmConfig; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.eclipse.jkube.kit.common.util.KubernetesMockServerUtil.prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints; + +@EnableKubernetesMockClient(crud = true) +class OpenshiftHelmInstallMojoTest { + @TempDir + private Path projectDir; + private PrintStream originalPrintStream; + private ByteArrayOutputStream outputStream; + private OpenshiftHelmInstallMojo openShiftHelmInstallMojo; + private KubernetesClient kubernetesClient; + private KubernetesMockServer server; + + @BeforeEach + void setUp() throws Exception { + originalPrintStream = System.out; + outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + Helm.create().withDir(projectDir).withName("empty-project").call(); + Path helmChartOutputDir = projectDir.resolve("target").resolve("jkube").resolve("helm"); + Files.createDirectories(helmChartOutputDir.resolve("openshift")); + FileUtils.copyDirectory(projectDir.resolve("empty-project").toFile(), helmChartOutputDir.resolve("openshift").toFile()); + Files.write(helmChartOutputDir.resolve("openshift").resolve("Chart.yaml"), + ("\ndependencies:\n" + + " - name: the-dependency\n" + + " version: 0.1.0\n" + + " repository: file://../../../../the-dependency\n").getBytes(StandardCharsets.UTF_8), + StandardOpenOption.APPEND); + System.setProperty("jkube.kubernetesTemplate", projectDir.toFile().getAbsolutePath()); + openShiftHelmInstallMojo = new OpenshiftHelmInstallMojo(); + openShiftHelmInstallMojo.helm = HelmConfig.builder().chartExtension("tgz") + .outputDir(helmChartOutputDir.toString()) + .installDependencyUpdate(true) + .disableOpenAPIValidation(true) + .build(); + openShiftHelmInstallMojo.interpolateTemplateParameters = true; + openShiftHelmInstallMojo.access = ClusterConfiguration.from(kubernetesClient.getConfiguration()).build(); + openShiftHelmInstallMojo.settings = new Settings(); + openShiftHelmInstallMojo.project = new MavenProject(); + openShiftHelmInstallMojo.project.setVersion("0.1.0"); + openShiftHelmInstallMojo.project.getBuild() + .setOutputDirectory(projectDir.resolve("target").resolve("classes").toFile().getAbsolutePath()); + openShiftHelmInstallMojo.project.getBuild().setDirectory(projectDir.resolve("target").toFile().getAbsolutePath()); + openShiftHelmInstallMojo.project.setFile(projectDir.resolve("target").toFile()); + // Remove after https://github.com/fabric8io/kubernetes-client/issues/6062 is fixed + prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints(server); + } + + @AfterEach + void tearDown() { + System.setOut(originalPrintStream); + System.clearProperty("jkube.kubernetesTemplate"); + openShiftHelmInstallMojo = null; + } + + @Test + void execute_withInstallDependencyUpdateDisabled_shouldThrowException() { + // Given + openShiftHelmInstallMojo.helm = openShiftHelmInstallMojo.helm.toBuilder() + .installDependencyUpdate(false) + .build(); + // When + Then + assertThatIllegalStateException() + .isThrownBy(openShiftHelmInstallMojo::execute) + .withMessage("An error occurred while checking for chart dependencies. " + + "You may need to run `helm dependency build` to fetch missing dependencies: found in Chart.yaml, but missing in charts/ directory: the-dependency"); + } + + @Test + void execute_withHelmDependencyPresent_shouldSucceed() throws Exception { + // Given + Helm.create().withName("the-dependency").withDir(projectDir).call(); + // When + openShiftHelmInstallMojo.execute(); + // Then + assertThat(outputStream.toString()) + .contains("NAME : empty-project") + .contains("NAMESPACE : ") + .contains("STATUS : deployed") + .contains("REVISION : 1") + .contains("LAST DEPLOYED : ") + .contains("Saving 1 charts") + .contains("Deleting outdated charts"); + } + + @Test + void execute_withHelmDependencyAbsent_shouldThrowException() { + // When + Then + assertThatIllegalStateException() + .isThrownBy(() -> openShiftHelmInstallMojo.execute()) + .withMessageContaining("the-dependency not found"); + } +} From 823178656ff9352ef150da3b7c10465514b2f044 Mon Sep 17 00:00:00 2001 From: Marco Carletti Date: Tue, 16 Jul 2024 12:57:43 +0200 Subject: [PATCH 223/289] fix: ImageEnricher#mergeEnvVariables causes error for empty env Signed-off-by: Marco Carletti --- CHANGELOG.md | 1 + .../java/org/eclipse/jkube/enricher/generic/ImageEnricher.java | 2 +- .../it/src/it/env-metadata/expected/kubernetes.yml | 1 + kubernetes-maven-plugin/it/src/it/env-metadata/pom.xml | 1 + 4 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e576b2cd73..00fc16a3ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -42,6 +42,7 @@ Usage: * Fix #3122: JKube should also pass project directory in `buildpacks` build strategy * Fix #3161: JavaExecGenerator should honor %t setting and not unconditionally add `latest` tag * Fix #2467: Add support for specifying imagePullSecrets via resource configuration +* Fix #3220: ImageEnricher#mergeEnvVariables causes error for empty env _**Note**_: - `defaultStorageClass` and `useStorageClassAnnotation` fields have been removed from VolumePermissionEnricher (`jkube-volume-permission`). Users are advised to use these fields from PersistentVolumeClaimStorageClassEnricher (`jkube-persistentvolumeclaim-storageclass`) instead. diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ImageEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ImageEnricher.java index 400fb11d1b..d95f7e4da5 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ImageEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/ImageEnricher.java @@ -284,7 +284,7 @@ private void mergeEnvVariables(Container container) { EnvVar newEnvVar = new EnvVarBuilder() .withName(resourceEnvEntry.getKey()) - .withValue(resourceEnvEntry.getValue()) + .withValue(Optional.ofNullable(resourceEnvEntry.getValue()).orElse("")) .build(); EnvVar oldEnvVar = containerEnvVars.stream() diff --git a/kubernetes-maven-plugin/it/src/it/env-metadata/expected/kubernetes.yml b/kubernetes-maven-plugin/it/src/it/env-metadata/expected/kubernetes.yml index 202f788b7f..2fa8f68809 100644 --- a/kubernetes-maven-plugin/it/src/it/env-metadata/expected/kubernetes.yml +++ b/kubernetes-maven-plugin/it/src/it/env-metadata/expected/kubernetes.yml @@ -72,6 +72,7 @@ items: spec: containers: - env: + - name: MY_ENV_empty - name: MY_ENV_key value: MY_ENV_value - name: KUBERNETES_NAMESPACE diff --git a/kubernetes-maven-plugin/it/src/it/env-metadata/pom.xml b/kubernetes-maven-plugin/it/src/it/env-metadata/pom.xml index 608ad233a5..8e05cf4245 100644 --- a/kubernetes-maven-plugin/it/src/it/env-metadata/pom.xml +++ b/kubernetes-maven-plugin/it/src/it/env-metadata/pom.xml @@ -51,6 +51,7 @@ + MY_ENV_value this_will_not_be_overridden From c6cef34b2797177f1f37c159bd47c7c353864a92 Mon Sep 17 00:00:00 2001 From: Rajvardhan Singh <97658238+invictus04@users.noreply.github.com> Date: Wed, 17 Jul 2024 13:51:59 +0530 Subject: [PATCH 224/289] fix: replaced String.length() == 0 with String.isEmpty() in DockerFileBuilderTest.java Signed-off-by: Rajvardhan Singh --- .../jkube/kit/config/image/build/DockerFileBuilderTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/build/DockerFileBuilderTest.java b/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/build/DockerFileBuilderTest.java index 01eb7ecfac..6e74d0c43b 100644 --- a/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/build/DockerFileBuilderTest.java +++ b/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/build/DockerFileBuilderTest.java @@ -285,7 +285,7 @@ private static Map dockerfileToMap(String dockerFile) { final Scanner scanner = new Scanner(dockerFile); while (scanner.hasNextLine()) { String line = scanner.nextLine(); - if (line.trim().length() == 0) { + if (line.trim().isEmpty()) { continue; } String[] commandAndArguments = line.trim().split("\\s+", 2); From d8db3e644cbb2609711125e7046ba4714bde994c Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Wed, 17 Jul 2024 13:54:33 +0530 Subject: [PATCH 225/289] doc(helm): documentation for Helm Install feature Signed-off-by: Rohan Kumar --- CHANGELOG.md | 1 + .../main/asciidoc/inc/tasks/build/_index.adoc | 2 + .../inc/helm/_jkube_helm_install.adoc | 45 +++++++++++++++++++ .../gradle/_example_helm_install_config.adoc | 10 +++++ .../inc/helm/gradle/_gradle_helm_install.adoc | 10 +++++ .../maven/_example_helm_install_config.adoc | 12 +++++ .../inc/helm/maven/_mvn_helm_install.adoc | 10 +++++ .../main/asciidoc/inc/goals/build/_goals.adoc | 1 + 8 files changed, 91 insertions(+) create mode 100644 jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm_install.adoc create mode 100644 jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_example_helm_install_config.adoc create mode 100644 jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_gradle_helm_install.adoc create mode 100644 jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_example_helm_install_config.adoc create mode 100644 jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_mvn_helm_install.adoc diff --git a/CHANGELOG.md b/CHANGELOG.md index 00fc16a3ce..fe0c45885d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ Usage: * Fix #2463: Buildpacks should clear build cache when `nocache` option is enabled * Fix #2470: Add configuration option for overriding buildpack builder image * Fix #2662: Sanitize VCS remote URL used in `jkube.eclipse.org/git-url` annotation +* Fix #2663: Add new helm install goal task (`k8s:helm-install` for maven and `k8sHelmInstall` for gradle) * Fix #2665: Added support for explicit path for readiness and liveness probes in SpringBootHealthCheckEnricher * Fix #2860: Correctly pass Docker build-arg from the build configuration to the Openshift build strategy * Fix #2885: Provide a way to set labels on images defined by Generators diff --git a/gradle-plugin/doc/src/main/asciidoc/inc/tasks/build/_index.adoc b/gradle-plugin/doc/src/main/asciidoc/inc/tasks/build/_index.adoc index 0671ee5ca7..8cafd72d76 100644 --- a/gradle-plugin/doc/src/main/asciidoc/inc/tasks/build/_index.adoc +++ b/gradle-plugin/doc/src/main/asciidoc/inc/tasks/build/_index.adoc @@ -16,3 +16,5 @@ include::{kitdoc-path}/inc/helm/_jkube_helm_push.adoc[] include::{kitdoc-path}/inc/helm/_jkube_helm_lint.adoc[] include::{kitdoc-path}/inc/helm/_jkube_helm_dependency_update.adoc[] + +include::{kitdoc-path}/inc/helm/_jkube_helm_install.adoc[] diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm_install.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm_install.adoc new file mode 100644 index 0000000000..01971e5f72 --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm_install.adoc @@ -0,0 +1,45 @@ +ifeval::["{plugin-type}" == "maven"] +[[jkube:helm-install]] +== *{goal-prefix}:helm-install* +endif::[] +ifeval::["{plugin-type}" == "gradle"] +[[jkubeHelmInstall]] +=== *{task-prefix}HelmInstall* +endif::[] + +This feature allows you to install your Eclipse JKube-generated +https://helm.sh/docs/topics/charts[Helm charts] + +ifeval::["{plugin-type}" == "maven"] +include::maven/_mvn_helm_install.adoc[] +endif::[] +ifeval::["{plugin-type}" == "gradle"] +include::gradle/_gradle_helm_install.adoc[] +endif::[] + +.Helm Install configuration +[cols="1,5,1"] +|=== +| Element | Description | Property + +| *releaseName* +| Name of Helm Release (instance of a chart running in a Kubernetes cluster). +| `jkube.helm.release.name` + +| *installDependencyUpdate* +| update dependencies if they are missing before installing the chart +| `jkube.helm.install.dependencyUpdate` + +| *installWaitReady* +| if set, will wait until all Pods, PVCs, Services, and minimum number of Pods of a Deployment, StatefulSet, or ReplicaSet are in a ready state before marking the release as successful. +| `jkube.helm.install.waitReady` + +|=== + +.Example Helm Install configuration +ifeval::["{plugin-type}" == "maven"] +include::maven/_example_helm_install_config.adoc[] +endif::[] +ifeval::["{plugin-type}" == "gradle"] +include::gradle/_example_helm_install_config.adoc[] +endif::[] \ No newline at end of file diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_example_helm_install_config.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_example_helm_install_config.adoc new file mode 100644 index 0000000000..ff07a32da6 --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_example_helm_install_config.adoc @@ -0,0 +1,10 @@ +[source,groovy,indent=0,subs="verbatim,quotes,attributes"] +---- +kubernetes { + helm { + releaseName = "test-release" + installWaitReady = false + installDependencyUpdate = false + } +} +---- \ No newline at end of file diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_gradle_helm_install.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_gradle_helm_install.adoc new file mode 100644 index 0000000000..909dd4c8ea --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_gradle_helm_install.adoc @@ -0,0 +1,10 @@ +To install Helm chart you need to invoke the `{task-prefix}HelmInstall` Gradle task on the command line: + +[source, sh, subs="+attributes"] +---- +gradle {task-prefix}Resource {task-prefix}Helm {task-prefix}HelmInstall +---- + +[NOTE] +The `{task-prefix}Resource` and the `{task-prefix}Helm` tasks are required to create the resource descriptors which are included in the Helm chart and the Helm chart itself. +If you have already built the resource and created the chart, then you can omit these tasks. \ No newline at end of file diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_example_helm_install_config.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_example_helm_install_config.adoc new file mode 100644 index 0000000000..0cd3fac93d --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_example_helm_install_config.adoc @@ -0,0 +1,12 @@ +[source,xml,indent=0,subs="verbatim,quotes,attributes"] +---- + + + + test-release + false + false + + + +---- \ No newline at end of file diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_mvn_helm_install.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_mvn_helm_install.adoc new file mode 100644 index 0000000000..2bdf2c1ef7 --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_mvn_helm_install.adoc @@ -0,0 +1,10 @@ +To install a Helm chart you need to invoke the `{goal-prefix}:helm-install` Maven goal on the command line: + +[source, sh, subs="+attributes"] +---- +mvn {goal-prefix}:resource {goal-prefix}:helm {goal-prefix}:helm-install +---- + +[NOTE] +The `{goal-prefix}:resource` and the `{goal-prefix}:helm` goals are required to create the resource descriptors which are included in the Helm chart and the Helm chart itself. +If you have already built the resource and created the chart, then you can omit these goals. \ No newline at end of file diff --git a/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_goals.adoc b/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_goals.adoc index 350532fa0d..3df289aa27 100644 --- a/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_goals.adoc +++ b/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_goals.adoc @@ -10,3 +10,4 @@ include::{kitdoc-path}/inc/helm/_jkube_helm.adoc[] include::{kitdoc-path}/inc/helm/_jkube_helm_push.adoc[] include::{kitdoc-path}/inc/helm/_jkube_helm_lint.adoc[] include::{kitdoc-path}/inc/helm/_jkube_helm_dependency_update.adoc[] +include::{kitdoc-path}/inc/helm/_jkube_helm_install.adoc[] From b594cb13775dd64d13cbda48314c80f99082ef0f Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Wed, 17 Jul 2024 16:08:36 +0530 Subject: [PATCH 226/289] doc(helm): replace references to the `helm install` CLI command with the new `helm-install` goal/task. Signed-off-by: Rohan Kumar --- jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm.adoc | 3 ++- .../src/main/asciidoc/inc/helm/gradle/_helm_install.adoc | 8 +------- .../src/main/asciidoc/inc/helm/maven/_helm_install.adoc | 6 +----- quickstarts/kit/helm/README.md | 2 +- quickstarts/maven/spring-boot-helm/README.md | 6 +++--- 5 files changed, 8 insertions(+), 17 deletions(-) diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm.adoc index 0a2e3858f7..11afb1d36b 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm.adoc @@ -279,14 +279,15 @@ ifeval::["{plugin-type}" == "gradle"] ==== Installing the generated Helm chart endif::[] -In a next step you can install this via the https://github.com/helm/helm/releases[helm command line tool] as follows: ifeval::["{plugin-type}" == "maven"] +In a next step you can install this via <> goal as follows: include::maven/_helm_install.adoc[] In addition, this goal will also create a tar-archive below `${basedir}/target` which contains the chart with its template. endif::[] ifeval::["{plugin-type}" == "gradle"] +In a next step you can install this via <> task as follows: include::gradle/_helm_install.adoc[] In addition, this task will also create a tar-archive below `outputDir` which contains the chart with its template. diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_helm_install.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_helm_install.adoc index 5ab4c75a4d..2b8d605249 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_helm_install.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_helm_install.adoc @@ -1,10 +1,4 @@ [source, sh, subs="+attributes"] ---- -helm install nameForChartInRepository build/jkube/helm/${chartName}/{cluster} ----- -or - -[source, sh, subs="+attributes"] ----- -helm install build/jkube/helm/${chartName}/{cluster} --generate-name +./gradlew {task-prefix}HelmInstall ---- \ No newline at end of file diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_helm_install.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_helm_install.adoc index 774251e4e1..cab5411613 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_helm_install.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_helm_install.adoc @@ -1,8 +1,4 @@ [source, sh, subs="+attributes"] ---- -helm install nameForChartInRepository target/jkube/helm/${chartName}/kubernetes ----- -or ----- -helm install target/jkube/helm/${chartName}/kubernetes --generate-name +mvn {goal-prefix}:helm-install ---- \ No newline at end of file diff --git a/quickstarts/kit/helm/README.md b/quickstarts/kit/helm/README.md index 71c275b5f3..a66e0c030e 100644 --- a/quickstarts/kit/helm/README.md +++ b/quickstarts/kit/helm/README.md @@ -20,7 +20,7 @@ Run the `mvn package` from your terminal. Once the process completes, a success informative message is printed. -You can now install the generated chart using the `helm install jkube-example ./target/helm/kubernetes` command. +You can install the generated chart by invoking `getHelmService().install(helmConfig)` programmatically or using the `helm install jkube-example ./target/helm/kubernetes` command. ```shell script diff --git a/quickstarts/maven/spring-boot-helm/README.md b/quickstarts/maven/spring-boot-helm/README.md index 030ba97ea3..89d1f8d1c0 100644 --- a/quickstarts/maven/spring-boot-helm/README.md +++ b/quickstarts/maven/spring-boot-helm/README.md @@ -93,13 +93,13 @@ mvn -Pprod clean package k8s:build k8s:resource k8s:helm The resulting Helm chart will be located in the `target/jkube/helm/spring-boot-helm` directory. -If you're testing this in Minikube, you can deploy the Helm chart using the following command: +If you're testing this in Minikube, you can deploy the Helm chart using the `k8s:helm-install` goal or `helm CLI`: ```shell -helm install spring-boot-helm target/jkube/helm/spring-boot-helm/kubernetes/ +mvn k8s:helm-install ``` -You can also override some of the values defined in the `values.yaml` file using the `--set` flag: +With `helm` CLI, You can also override some of the values defined in the `values.yaml` file using the `--set` flag: ```shell helm install spring-boot-helm target/jkube/helm/spring-boot-helm/kubernetes/ --set deployment.replicas=5 --set service.spec.type=NodePort From 5ba84cd21c4172f6e70e34e661278ba617699be2 Mon Sep 17 00:00:00 2001 From: Raushan Kumar Date: Thu, 18 Jul 2024 16:25:59 +0530 Subject: [PATCH 227/289] fix: MojoExecutionService 'goal.length() > 0' replaced with '!goal.isEmpty()' Signed-off-by: Raushan --- .../org/eclipse/jkube/kit/common/util/MojoExecutionService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/common-maven/src/main/java/org/eclipse/jkube/kit/common/util/MojoExecutionService.java b/jkube-kit/common-maven/src/main/java/org/eclipse/jkube/kit/common/util/MojoExecutionService.java index d01c773997..6f78b1274d 100644 --- a/jkube-kit/common-maven/src/main/java/org/eclipse/jkube/kit/common/util/MojoExecutionService.java +++ b/jkube-kit/common-maven/src/main/java/org/eclipse/jkube/kit/common/util/MojoExecutionService.java @@ -66,7 +66,7 @@ public void callPluginGoal(String fullGoal) { try { String executionId = null; - if (goal != null && goal.length() > 0 && goal.indexOf('#') > -1) { + if (goal != null && !goal.isEmpty() && goal.indexOf('#') > -1) { int pos = goal.indexOf('#'); executionId = goal.substring(pos + 1); goal = goal.substring(0, pos); From 9fb108562e89b508e50b571e28bba8db3433388b Mon Sep 17 00:00:00 2001 From: rohit-satya <151615370+rohit-satya@users.noreply.github.com> Date: Thu, 18 Jul 2024 19:02:18 +0530 Subject: [PATCH 228/289] refactor: use java streams api to get rid of nested if statements in KubernetesClientUtil (3072) refactor: use java streams api to get rid of nested if statements in KubernetesClientUtil Signed-off-by: Rohit Satya --- add unit tests Signed-off-by: Rohit Satya --- review : Address review comments related to imports and builders in KubernetesClientUtilTest Signed-off-by: Rohan Kumar Co-authored-by: Rohan Kumar --- .../kubernetes/KubernetesClientUtil.java | 20 ++----- .../kubernetes/KubernetesClientUtilTest.java | 57 +++++++++++++++++++ 2 files changed, 62 insertions(+), 15 deletions(-) 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 b778fa8fd5..efb2609d37 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 @@ -137,21 +137,11 @@ protected static String getPodCondition(Pod pod) { return ""; } - - for (PodCondition condition : conditions) { - String type = condition.getType(); - if (StringUtils.isNotBlank(type)) { - if ("ready".equalsIgnoreCase(type)) { - String statusText = condition.getStatus(); - if (StringUtils.isNotBlank(statusText)) { - if (Boolean.parseBoolean(statusText)) { - return type; - } - } - } - } - } - return ""; + return conditions.stream() + .filter(condition -> "ready".equalsIgnoreCase(condition.getType()) && Boolean.parseBoolean(condition.getStatus())) + .map(PodCondition::getType) + .findFirst() + .orElse(""); } public static GenericKubernetesResource doGetCustomResource(KubernetesClient kubernetesClient, GenericKubernetesResource resource, String namespace) { 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 e8c04f9c0f..165a06560d 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 @@ -156,4 +156,61 @@ void getPodStatusMessagePostfix_whenActionIsError_shouldReturnErrorMessage() { assertThat(messagePostfix).isEqualTo(": Error"); } + @Test + void getPodCondition_whenPodConditionIsReadyAndTrue_shouldReturnReady() { + // Given + Pod pod = new PodBuilder() + .withNewStatus() + .addNewCondition() + .withType("ready") + .withStatus("True") + .endCondition() + .endStatus() + .build(); + + // When + String condition = KubernetesClientUtil.getPodCondition(pod); + + // Then + assertThat(condition).isEqualTo("ready"); + } + + @Test + void getPodCondition_whenPodConditionIsReadyAndFalse_shouldReturnEmptyString() { + // Given + Pod pod = new PodBuilder() + .withNewStatus() + .addNewCondition() + .withType("ready") + .withStatus("False") + .endCondition() + .endStatus() + .build(); + + // When + String condition = KubernetesClientUtil.getPodCondition(pod); + + // Then + assertThat(condition).isEmpty(); + } + + @Test + void getPodCondition_whenPodConditionIsNotReady_shouldReturnEmptyString() { + // Given + Pod pod = new PodBuilder() + .withNewStatus() + .addNewCondition() + .withType("notready") + .withStatus("True") + .endCondition() + .endStatus() + .build(); + + // When + String condition = KubernetesClientUtil.getPodCondition(pod); + + // Then + assertThat(condition).isEmpty(); + } + } From 5110b0b5f23ff5978e91a7d1184eb23614f41aae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 07:07:03 +0200 Subject: [PATCH 229/289] chore(deps): Bump step-security/harden-runner from 2.8.1 to 2.9.0 Bumps [step-security/harden-runner](https://github.com/step-security/harden-runner) from 2.8.1 to 2.9.0. - [Release notes](https://github.com/step-security/harden-runner/releases) - [Commits](https://github.com/step-security/harden-runner/compare/17d0e2bd7d51742c71671bd19fa12bdc9d40a3d6...0d381219ddf674d61a7572ddd19d7941e271515c) --- updated-dependencies: - dependency-name: step-security/harden-runner dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- .github/workflows/license.yml | 2 +- .github/workflows/quickstarts.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/license.yml b/.github/workflows/license.yml index b5546292d8..34fd638370 100644 --- a/.github/workflows/license.yml +++ b/.github/workflows/license.yml @@ -29,7 +29,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@17d0e2bd7d51742c71671bd19fa12bdc9d40a3d6 + uses: step-security/harden-runner@0d381219ddf674d61a7572ddd19d7941e271515c with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/quickstarts.yml b/.github/workflows/quickstarts.yml index ad5e463be7..c6646b9602 100644 --- a/.github/workflows/quickstarts.yml +++ b/.github/workflows/quickstarts.yml @@ -29,7 +29,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@17d0e2bd7d51742c71671bd19fa12bdc9d40a3d6 + uses: step-security/harden-runner@0d381219ddf674d61a7572ddd19d7941e271515c with: disable-sudo: true egress-policy: block From cccdde503d3988141e6eaca774eaad7fad5c8ef2 Mon Sep 17 00:00:00 2001 From: Raushan Kumar Date: Fri, 19 Jul 2024 11:03:48 +0530 Subject: [PATCH 230/289] fix(gradle): maven-failsafe-plugin uses systemPropertyVariable instead of systemProperties Signed-off-by: Raushan --- gradle-plugin/it/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle-plugin/it/pom.xml b/gradle-plugin/it/pom.xml index 00ab244b16..925dce1927 100644 --- a/gradle-plugin/it/pom.xml +++ b/gradle-plugin/it/pom.xml @@ -91,7 +91,7 @@ - + itDir ${project.basedir} @@ -100,7 +100,7 @@ jKubeVersion ${project.version} - +
From 1a2b8b0a253b03ed3b0f4bc406c468bd267b8f38 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Fri, 19 Jul 2024 13:26:22 +0530 Subject: [PATCH 231/289] fix(spring-boot):parse layers.idx file to get layers information instead of running command Till now we were executing layertools list command to extract layer related information for Spring Boot Layered jar. This has started causing problems in Spring Boot 3.3.x where we're getting additional deprecation warning that's breaking behavior of SpringBootGenerator. Additionally, layertools command has become deprecated in Spring Boot 3.3.x Instead of relying on layertools command, directly read layers.idx file present in layered jar to extract list of layers. Signed-off-by: Rohan Kumar --- CHANGELOG.md | 1 + .../springboot/SpringBootLayeredJar.java | 32 +++++++------------ 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fe0c45885d..117d1500a7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ Usage: * Fix #3161: JavaExecGenerator should honor %t setting and not unconditionally add `latest` tag * Fix #2467: Add support for specifying imagePullSecrets via resource configuration * Fix #3220: ImageEnricher#mergeEnvVariables causes error for empty env +* Fix #3228: Springboot 3.3.1 layertools output format breaks LayeredJarGenerator _**Note**_: - `defaultStorageClass` and `useStorageClassAnnotation` fields have been removed from VolumePermissionEnricher (`jkube-volume-permission`). Users are advised to use these fields from PersistentVolumeClaimStorageClassEnricher (`jkube-persistentvolumeclaim-storageclass`) instead. diff --git a/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/SpringBootLayeredJar.java b/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/SpringBootLayeredJar.java index 934f54e932..4104b01f67 100644 --- a/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/SpringBootLayeredJar.java +++ b/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/SpringBootLayeredJar.java @@ -13,19 +13,20 @@ */ package org.eclipse.jkube.springboot; -import lombok.Getter; import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.StringUtils; import org.eclipse.jkube.kit.common.ExternalCommand; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.util.Serialization; import java.io.File; import java.io.IOException; import java.io.InputStream; -import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Properties; import java.util.jar.JarFile; +import java.util.stream.Collectors; import java.util.zip.ZipEntry; public class SpringBootLayeredJar { @@ -65,10 +66,15 @@ public String getMainClass() { } public List listLayers() { - final LayerListCommand layerListCommand = new LayerListCommand(kitLogger, layeredJar); - try { - layerListCommand.execute(); - return layerListCommand.getLayers(); + try (JarFile jarFile = new JarFile(layeredJar)) { + List>> layers = Serialization.unmarshal(jarFile.getInputStream(jarFile.getEntry("BOOT-INF/layers.idx")), List.class); + if (layers == null) { + throw new IOException("Unable to find layers information in BOOT-INF/layers.idx file"); + } + + return layers.stream() + .flatMap(m -> m.keySet().stream()) + .collect(Collectors.toList()); } catch (IOException ioException) { throw new IllegalStateException("Failure in getting spring boot jar layers information", ioException); } @@ -98,18 +104,4 @@ protected String[] getArgs() { } } - @Getter - private static class LayerListCommand extends LayerToolsCommand { - - private final List layers; - protected LayerListCommand(KitLogger log, File layeredJar) { - super(log, null, layeredJar, "list"); - layers = new ArrayList<>(); - } - - @Override - protected void processLine(String line) { - layers.add(line); - } - } } From e1d7e779121f068bbfc2e76c3a05b4bce135b406 Mon Sep 17 00:00:00 2001 From: Raman Kumar <76739199+rexrk@users.noreply.github.com> Date: Mon, 22 Jul 2024 10:36:44 +0530 Subject: [PATCH 232/289] fix: replace AssertJ's deprecated asList() DSL method in KubernetesSshServiceForwarderTest Signed-off-by: Raman Kumar --- .../kit/remotedev/KubernetesSshServiceForwarderTest.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/jkube-kit/remote-dev/src/test/java/org/eclipse/jkube/kit/remotedev/KubernetesSshServiceForwarderTest.java b/jkube-kit/remote-dev/src/test/java/org/eclipse/jkube/kit/remotedev/KubernetesSshServiceForwarderTest.java index 440b79baec..16d88c898c 100644 --- a/jkube-kit/remote-dev/src/test/java/org/eclipse/jkube/kit/remotedev/KubernetesSshServiceForwarderTest.java +++ b/jkube-kit/remote-dev/src/test/java/org/eclipse/jkube/kit/remotedev/KubernetesSshServiceForwarderTest.java @@ -17,6 +17,8 @@ import io.fabric8.kubernetes.api.model.PodBuilder; import io.fabric8.kubernetes.api.model.PodConditionBuilder; import io.fabric8.kubernetes.api.model.PodSpec; +import io.fabric8.kubernetes.api.model.Container; +import io.fabric8.kubernetes.api.model.ContainerPort; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; @@ -33,6 +35,7 @@ import java.util.concurrent.TimeUnit; import static org.assertj.core.api.Assertions.assertThat; +import org.assertj.core.api.InstanceOfAssertFactories; import static org.eclipse.jkube.kit.common.util.AsyncUtil.await; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.timeout; @@ -84,7 +87,7 @@ void deployPodWithImage() { assertThat(result) .extracting(Pod::getSpec) .extracting(PodSpec::getContainers) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(Container.class)) .singleElement() .hasFieldOrPropertyWithValue("image", "quay.io/jkube/jkube-remote-dev:0.0.24"); } @@ -103,10 +106,10 @@ void deployPodWithPortDefinitions() { assertThat(result) .extracting(Pod::getSpec) .extracting(PodSpec::getContainers) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(Container.class)) .singleElement() .extracting("ports") - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(ContainerPort.class)) .extracting("containerPort") .containsExactly(2222, 1337); } From a6687160ea6a8973837b1a4dfe186c687e8f695a Mon Sep 17 00:00:00 2001 From: Priyadarshini Tamilselvan Date: Mon, 22 Jul 2024 10:38:26 +0530 Subject: [PATCH 233/289] fix: replaced String.length() == 0 with String.isEmpty() in OpenShiftBuildServiceUtils.java Signed-off-by: Priya-753 --- .../config/service/openshift/OpenShiftBuildServiceUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java index eb30e953c5..505f3ca53a 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/openshift/OpenShiftBuildServiceUtils.java @@ -250,7 +250,7 @@ private static String getMapValueWithDefault(Map map, String fie private static boolean checkForNocache(ImageConfiguration imageConfig) { String nocache = System.getProperty("docker.nocache"); if (nocache != null) { - return nocache.length() == 0 || Boolean.parseBoolean(nocache); + return nocache.isEmpty() || Boolean.parseBoolean(nocache); } else { BuildConfiguration buildConfig = imageConfig.getBuildConfiguration(); return buildConfig.nocache(); From f3a6aaa651136a4031ce9c3fc146c857614045c5 Mon Sep 17 00:00:00 2001 From: vijaybhagwat24 Date: Mon, 22 Jul 2024 20:00:21 +0530 Subject: [PATCH 234/289] fix: 'MapMap.size() != 0' replaced with '!Map.isEmpty()' in ImageChangeTriggerEnricher issue-3203:- collection empty check added --- merged enclosing if Signed-off-by: Vijay Bhagwat --- .../generic/openshift/ImageChangeTriggerEnricher.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/ImageChangeTriggerEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/ImageChangeTriggerEnricher.java index 641f695958..0e9093321d 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/ImageChangeTriggerEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/ImageChangeTriggerEnricher.java @@ -79,8 +79,7 @@ public void visit(DeploymentConfigSpecBuilder builder) { } } // add a new image change trigger for the build stream - if (containerToImageMap.size() != 0) { - if(enableImageChangeTrigger && isOpenShiftMode()) { + if (!containerToImageMap.isEmpty() && enableImageChangeTrigger && isOpenShiftMode()) { for (Map.Entry entry : containerToImageMap.entrySet()) { String containerName = entry.getKey(); @@ -106,7 +105,7 @@ public void visit(DeploymentConfigSpecBuilder builder) { } } - } + } }); } From 7d3b969bac9bb1ffcb04d49af30e6840dd0cefb0 Mon Sep 17 00:00:00 2001 From: Raushan Kumar Date: Tue, 23 Jul 2024 13:46:44 +0530 Subject: [PATCH 235/289] test: KubernetesHelperTest tests work on Windows fix: assertion of urls in test Signed-off-by: Raushan --- refactor: used inline variables Signed-off-by: Raushan --- refactor: replaced to String.format Signed-off-by: Raushan --- .../jkube/kit/common/util/KubernetesHelperTest.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) 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 32f8b4d581..c4ed7d5a7c 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 @@ -25,6 +25,7 @@ import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicReference; +import java.util.stream.Collectors; import java.util.stream.Stream; import io.fabric8.kubernetes.api.model.AuthProviderConfigBuilder; @@ -488,8 +489,14 @@ void exportKubernetesClientConfigToFile_worksWithKubernetesMockServer(@TempDir P .singleElement(InstanceOfAssertFactories.type(NamedCluster.class)) .hasFieldOrPropertyWithValue("cluster.insecureSkipTlsVerify", true) .extracting("cluster.server", "name") - .allMatch(s -> s.toString().matches("(https://)?localhost:\\d+/?")) - ) + .satisfies(serverUrls -> { + List actualUrls = ((List) serverUrls).stream() + .map(Object::toString) + .collect(Collectors.toList()); + assertThat(actualUrls).hasSize(2) + .contains(String.format("https://%s:%d/", mockServer.getHostName(), mockServer.getPort()), + String.format("localhost:%d", mockServer.getPort())); + })) .satisfies(c -> assertThat(c.getUsers()) .singleElement(InstanceOfAssertFactories.type(NamedAuthInfo.class)) .hasFieldOrPropertyWithValue("name", "fabric8-mock-server-user")); From 15542dbfbd65f360fbc1cae4c0e24bbf331108c2 Mon Sep 17 00:00:00 2001 From: Raushan Kumar Date: Tue, 23 Jul 2024 16:23:55 +0530 Subject: [PATCH 236/289] fix: replace AssertJ's deprecated asList() DSL method in RegistryConfigTest (3244) refactor: improve assertion statements for registry config settings extraction Signed-off-by: Raushan --- fix: corrected class type Signed-off-by: Raushan --- .../org/eclipse/jkube/kit/common/RegistryConfigTest.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/RegistryConfigTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/RegistryConfigTest.java index fbdce9d172..eb62deabb8 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/RegistryConfigTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/RegistryConfigTest.java @@ -18,6 +18,7 @@ import com.fasterxml.jackson.databind.MapperFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; +import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; @@ -42,7 +43,9 @@ void rawDeserialization() throws IOException { .hasFieldOrPropertyWithValue("registry", "the-registry") .hasFieldOrPropertyWithValue("skipExtendedAuth", true) .hasFieldOrPropertyWithValue("authConfig", null) - .extracting(RegistryConfig::getSettings).asList().hasSize(1).extracting("id", "username") + .extracting(RegistryConfig::getSettings).asInstanceOf(InstanceOfAssertFactories.list(RegistryServerConfiguration.class)) + .hasSize(1) + .extracting("id", "username") .containsExactly(tuple("server-1", "the-user")); } } From 0585869d51772b255f6fc7614e5587bd54b6c1b4 Mon Sep 17 00:00:00 2001 From: Emily Knott Date: Tue, 23 Jul 2024 20:32:34 +0800 Subject: [PATCH 237/289] fix: replaced String.length() == 0 with String.isEmpty() in JKubeProjectUtil.java Signed-off-by: Emily Knott --- .../org/eclipse/jkube/kit/common/util/JKubeProjectUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/JKubeProjectUtil.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/JKubeProjectUtil.java index fda55821bc..b83df01692 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/JKubeProjectUtil.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/JKubeProjectUtil.java @@ -165,7 +165,7 @@ public static File getFinalOutputArtifact(JavaProject jkubeProject) { public static String createDefaultResourceName(String artifactId, String ... suffixes) { String suffix = StringUtils.join(suffixes, "-"); - String ret = artifactId + (suffix.length() > 0 ? "-" + suffix : ""); + String ret = artifactId + (!suffix.isEmpty() ? "-" + suffix : ""); if (ret.length() > MAX_RESOURCE_NAME_LENGTH) { ret = ret.substring(0, MAX_RESOURCE_NAME_LENGTH); } From 9a934cee18d000e15e7bc0426fa11fb1f96c029b Mon Sep 17 00:00:00 2001 From: vijaybhagwat24 Date: Wed, 24 Jul 2024 15:38:22 +0530 Subject: [PATCH 238/289] fix: replace AssertJ's deprecated asList() DSL method in ControllerResourceConfigTest (3254) issue-3240:-Replace assertJ Depricate method --- issue-3240:-Replace assertJ Depricate method --- issue-3240:-Replace singleElement() --- .../kit/config/resource/ControllerResourceConfigTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/resource/ControllerResourceConfigTest.java b/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/resource/ControllerResourceConfigTest.java index 0dc74bf42d..9c8698c1f9 100644 --- a/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/resource/ControllerResourceConfigTest.java +++ b/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/resource/ControllerResourceConfigTest.java @@ -116,8 +116,8 @@ private void assertControllerResourceConfig(ControllerResourceConfig controllerR .hasFieldOrPropertyWithValue("imagePullPolicy", "IfNotPresent") .hasFieldOrPropertyWithValue("cmd", Arguments.builder().exec(Arrays.asList("sleep", "10")).build()) .extracting(InitContainerConfig::getVolumes) - .asList() - .singleElement(InstanceOfAssertFactories.type(VolumeConfig.class)) + .asInstanceOf(InstanceOfAssertFactories.list(VolumeConfig.class)) + .singleElement() .hasFieldOrPropertyWithValue("name", "workdir") .hasFieldOrPropertyWithValue("path", "/work-dir")) .satisfies(c -> assertThat(c.getVolumes()) From d15061348ac89d025e2195b103e7fcb7282ea0b0 Mon Sep 17 00:00:00 2001 From: Raushan Kumar Date: Wed, 24 Jul 2024 15:39:54 +0530 Subject: [PATCH 239/289] fix: replace AssertJ's deprecated asList() DSL method in JKubeConfigurationTest (3255) Signed-off-by: Raushan --- .../org/eclipse/jkube/kit/common/JKubeConfigurationTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/JKubeConfigurationTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/JKubeConfigurationTest.java index f2ccd6fb35..835f73da07 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/JKubeConfigurationTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/JKubeConfigurationTest.java @@ -17,6 +17,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.json.JsonMapper; +import org.assertj.core.api.InstanceOfAssertFactories; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.condition.DisabledOnOs; import org.junit.jupiter.api.condition.OS; @@ -136,6 +137,7 @@ void rawDeserialization() throws IOException { .hasFieldOrPropertyWithValue("buildArgs.http_proxy", "127.0.0.1:8001") .hasFieldOrPropertyWithValue("pullRegistryConfig.registry", "the-pull-registry") .hasFieldOrPropertyWithValue("pushRegistryConfig.registry", "the-push-registry") - .extracting(JKubeConfiguration::getReactorProjects).asList().isEmpty(); + .extracting(JKubeConfiguration::getReactorProjects).asInstanceOf(InstanceOfAssertFactories.list(JavaProject.class)) + .isEmpty(); } } From d000d3ffdc1a18047df64f772391d8829f5b3cda Mon Sep 17 00:00:00 2001 From: Jessica Lane <48732966+jesslane94@users.noreply.github.com> Date: Wed, 24 Jul 2024 03:45:45 -0700 Subject: [PATCH 240/289] fix: replaced '.length() > 0' with '!.isEmpty()' in MappingConfig Signed-off-by: Jessica Lane --- .../kit/config/resource/MappingConfig.java | 2 +- .../config/resource/MappingConfigTest.java | 28 ++++++++++++++----- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/MappingConfig.java b/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/MappingConfig.java index 26dcac87b4..1198cd1589 100644 --- a/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/MappingConfig.java +++ b/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/MappingConfig.java @@ -38,6 +38,6 @@ public String[] getFilenamesAsArray() { } public boolean isValid() { - return kind != null && filenameTypes != null && filenameTypes.length() > 0; + return kind != null && filenameTypes != null && !filenameTypes.isEmpty(); } } diff --git a/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/resource/MappingConfigTest.java b/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/resource/MappingConfigTest.java index 640835e0fb..37d7b1a0d4 100644 --- a/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/resource/MappingConfigTest.java +++ b/jkube-kit/config/resource/src/test/java/org/eclipse/jkube/kit/config/resource/MappingConfigTest.java @@ -58,9 +58,9 @@ void getFilenamesAsArray_whenTypesPresent_thenReturnsArray() { void isValid_withMissingKind_shouldReturnFalse() { // Given MappingConfig config = MappingConfig.builder() - .apiVersion("custom-cron-tab.example.com/v1") - .filenameTypes("crontab,cr") - .build(); + .apiVersion("custom-cron-tab.example.com/v1") + .filenameTypes("crontab,cr") + .build(); // When boolean result = config.isValid(); // Then @@ -71,9 +71,23 @@ void isValid_withMissingKind_shouldReturnFalse() { void isValid_withMissingFileNameTypes_shouldReturnFalse() { // Given MappingConfig config = MappingConfig.builder() - .apiVersion("custom-cron-tab.example.com/v1") - .kind("Foo") - .build(); + .apiVersion("custom-cron-tab.example.com/v1") + .kind("Foo") + .build(); + // When + boolean result = config.isValid(); + // Then + assertThat(result).isFalse(); + } + + @Test + void isValid_withEmptyFileNameTypes_shouldReturnFalse() { + // Given + MappingConfig config = MappingConfig.builder() + .apiVersion("custom-cron-tab.example.com/v1") + .kind("Foo") + .filenameTypes("") + .build(); // When boolean result = config.isValid(); // Then @@ -110,7 +124,7 @@ void isValid_withKindAndApiVersionAndFileName_shouldReturnTrue() { @Test void equalsAndHashCodeShouldMatch() { // Given - MappingConfig mc1 = MappingConfig.builder().kind("Foo").filenameTypes("foos").build(); + MappingConfig mc1 = MappingConfig.builder().kind("Foo").filenameTypes("foos").build(); MappingConfig mc2 = MappingConfig.builder().kind("Foo").filenameTypes("foos").build(); // When + Then assertThat(mc1) From 7873439bee4e7dfe6afeac9dea6e7e6a9c49f926 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pedro=20Caires=20Ferreira?= Date: Thu, 25 Jul 2024 01:56:09 -0300 Subject: [PATCH 241/289] fix: replaced 'evts.size() > 0' with '!evts.isEmpty()' in WebServerEventCollector Signed-off-by: jpcairesf --- .../kit/config/service/openshift/WebServerEventCollector.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/WebServerEventCollector.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/WebServerEventCollector.java index 65262ba49d..51b4e4eba9 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/WebServerEventCollector.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/openshift/WebServerEventCollector.java @@ -63,7 +63,7 @@ public void assertEventsRecordedInOrder(String... expectedEvents) { LinkedList evts = new LinkedList<>(this.events); for (String exp : expectedEvents) { boolean found = false; - while (!found && evts.size() > 0) { + while (!found && !evts.isEmpty()) { String ev = evts.pop(); found = exp.equals(ev); } From c6abf41f2ce8194301e38f55fa6c014d34e02fbb Mon Sep 17 00:00:00 2001 From: Ivan Malutin <137520241+ivamly@users.noreply.github.com> Date: Thu, 25 Jul 2024 08:18:04 +0300 Subject: [PATCH 242/289] fix: removed unnecessary 'toString()' call in class KarafHealthCheckEnricher Signed-off-by: ivamly --- .../jkube/kit/enricher/specific/KarafHealthCheckEnricher.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/KarafHealthCheckEnricher.java b/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/KarafHealthCheckEnricher.java index f931e9587b..886dd3dd13 100644 --- a/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/KarafHealthCheckEnricher.java +++ b/jkube-kit/enricher/specific/src/main/java/org/eclipse/jkube/kit/enricher/specific/KarafHealthCheckEnricher.java @@ -76,7 +76,7 @@ private Probe discoverKarafProbe(String path, int initialDelay) { Object startupFeatures = lookup.get(); if (!(startupFeatures instanceof Map)) { throw new IllegalArgumentException(String.format("For element %s was expected a complex object but a simple object was found of type %s and value %s", - "startupFeatures", startupFeatures.getClass(), startupFeatures.toString())); + "startupFeatures", startupFeatures.getClass(), startupFeatures)); } final Map startUpFeaturesObject = (Map) startupFeatures; From cb574f063f020aa114a1c974879816932c30d193 Mon Sep 17 00:00:00 2001 From: Raushan Kumar Date: Thu, 25 Jul 2024 21:56:57 +0530 Subject: [PATCH 243/289] fix: replace AssertJ's deprecated asList() DSL method in ServiceHandlerTest (3273) refactor: asList to asInstanceof for ServiceHandlerTest Signed-off-by: Raushan --- refactor: corrected class type Signed-off-by: Raushan --- .../eclipse/jkube/kit/enricher/handler/ServiceHandlerTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/ServiceHandlerTest.java b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/ServiceHandlerTest.java index 5db105f361..a682ae46c1 100644 --- a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/ServiceHandlerTest.java +++ b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/ServiceHandlerTest.java @@ -15,6 +15,7 @@ import io.fabric8.kubernetes.api.model.ObjectMeta; import io.fabric8.kubernetes.api.model.Service; +import io.fabric8.kubernetes.api.model.ServicePort; import io.fabric8.kubernetes.api.model.ServiceSpec; import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.kit.config.resource.ServiceConfig; @@ -72,7 +73,7 @@ void getServices_withPortsAndWithoutHeadless() { .first() .satisfies(s -> assertThat(s.getSpec()) .hasFieldOrPropertyWithValue("type", "NodePort") - .extracting(ServiceSpec::getPorts).asList() + .extracting(ServiceSpec::getPorts).asInstanceOf(InstanceOfAssertFactories.list(ServicePort.class)) .first() .hasFieldOrPropertyWithValue("protocol", "TCP") .hasFieldOrPropertyWithValue("name", "port-test") From 7723ff77b106bbf4ebd0da7accab893e0d41a0d1 Mon Sep 17 00:00:00 2001 From: Ivan Malutin <137520241+ivamly@users.noreply.github.com> Date: Thu, 25 Jul 2024 19:29:28 +0300 Subject: [PATCH 244/289] fix: replace AssertJ's deprecated asList() DSL method in CronJobHandlerTest (3271) Replace AssertJ's deprecated asList() DSL method with asInstanceOf(InstanceOfAssertFactories.list(type.class)) Signed-off-by: ivamly --- Set the type Volume.class Signed-off-by: ivamly --- .../jkube/kit/enricher/handler/CronJobHandlerTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/CronJobHandlerTest.java b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/CronJobHandlerTest.java index db44f3cfaa..d67df9faeb 100644 --- a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/CronJobHandlerTest.java +++ b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/CronJobHandlerTest.java @@ -15,8 +15,10 @@ import io.fabric8.kubernetes.api.model.PodSpec; import io.fabric8.kubernetes.api.model.PodTemplateSpec; +import io.fabric8.kubernetes.api.model.Volume; import io.fabric8.kubernetes.api.model.batch.v1.CronJob; import io.fabric8.kubernetes.api.model.batch.v1.JobSpec; +import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.resource.ControllerResourceConfig; @@ -97,7 +99,7 @@ void get_withValidConfigs_shouldReturnConfigWithContainers() { .extracting(JobSpec::getTemplate) .extracting(PodTemplateSpec::getSpec) .hasFieldOrPropertyWithValue("restartPolicy", "Never") - .extracting(PodSpec::getVolumes).asList().first() + .extracting(PodSpec::getVolumes).asInstanceOf(InstanceOfAssertFactories.list(Volume.class)).first() .hasFieldOrPropertyWithValue("name", "test") .hasFieldOrPropertyWithValue("hostPath.path", "/test/path") ); From b6bf539d6173ae103f1d518743c7fa8b41ddc5bb Mon Sep 17 00:00:00 2001 From: Naman13112004 <140722679+Naman13112004@users.noreply.github.com> Date: Fri, 26 Jul 2024 12:26:17 +0530 Subject: [PATCH 245/289] fix: 'queryParams.size() > 0' replaced with '!queryParams.isEmpty()' in UrlBuilder (3272) Signed-off-by: Naman --- .../jkube/kit/build/service/docker/access/UrlBuilder.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/access/UrlBuilder.java b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/access/UrlBuilder.java index 7d86e98e67..962a37a115 100644 --- a/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/access/UrlBuilder.java +++ b/jkube-kit/build/service/docker/src/main/java/org/eclipse/jkube/kit/build/service/docker/access/UrlBuilder.java @@ -271,7 +271,7 @@ private Builder p(String key, int value) { } public String build() { - if (queryParams.size() > 0) { + if (!queryParams.isEmpty()) { StringBuilder ret = new StringBuilder(url); ret.append("?"); // Sort to make order predictable e.g. for unit testing From e1cde0bd0d4ab1a659db7b1f7a884705048b27de Mon Sep 17 00:00:00 2001 From: vijaybhagwat24 Date: Fri, 26 Jul 2024 19:46:34 +0530 Subject: [PATCH 246/289] fix: replace AssertJ's deprecated asList() DSL method in ProbeHandlerTest (3278) --- .../jkube/kit/enricher/handler/ProbeHandlerTest.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/ProbeHandlerTest.java b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/ProbeHandlerTest.java index ad8a61ce9a..6471bd4fb3 100644 --- a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/ProbeHandlerTest.java +++ b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/ProbeHandlerTest.java @@ -14,6 +14,7 @@ package org.eclipse.jkube.kit.enricher.handler; import io.fabric8.kubernetes.api.model.ExecAction; +import io.fabric8.kubernetes.api.model.HTTPHeader; import io.fabric8.kubernetes.api.model.IntOrString; import io.fabric8.kubernetes.api.model.Probe; import org.eclipse.jkube.kit.config.resource.ProbeConfig; @@ -25,6 +26,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.InstanceOfAssertFactories.list; class ProbeHandlerTest { private Probe probe; @@ -105,7 +107,7 @@ void getExecProbe_withExec() { .hasFieldOrPropertyWithValue("httpGet", null) .hasFieldOrPropertyWithValue("tcpSocket", null) .extracting(Probe::getExec).isNotNull() - .extracting(ExecAction::getCommand).asList() + .extracting(ExecAction::getCommand).asInstanceOf(list(String.class)) .hasSize(2) .containsExactly("cat", "/tmp/probe"); } @@ -270,11 +272,12 @@ void httpGetProbe_withCustomHeaders() { .hasFieldOrPropertyWithValue("httpGet.host", "www.example.com") .hasFieldOrPropertyWithValue("httpGet.port", new IntOrString(8080)) .hasFieldOrPropertyWithValue("httpGet.scheme", "HTTPS") - .satisfies(p -> assertThat(p).extracting("httpGet.httpHeaders").asList().element(0) + .satisfies(p -> assertThat(p).extracting("httpGet.httpHeaders") + .asInstanceOf(list(HTTPHeader.class)).element(0) .hasFieldOrPropertyWithValue("name", "Accept") .hasFieldOrPropertyWithValue("value", "application/json") ) - .satisfies(p -> assertThat(p).extracting("httpGet.httpHeaders").asList().element(1) + .satisfies(p -> assertThat(p).extracting("httpGet.httpHeaders").asInstanceOf(list(HTTPHeader.class)).element(1) .hasFieldOrPropertyWithValue("name", "User-Agent") .hasFieldOrPropertyWithValue("value", "MyUserAgent") ); From 9a804013552058585475d6d430165bc7c5ec9203 Mon Sep 17 00:00:00 2001 From: Aman Date: Mon, 5 Aug 2024 10:18:41 +0530 Subject: [PATCH 247/289] fix: 'line.length() > 0' replaced with '!line.isEmpty()' in PluginServiceFactory Signed-off-by: Aman --- .../org/eclipse/jkube/kit/common/util/PluginServiceFactory.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/PluginServiceFactory.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/PluginServiceFactory.java index 6437f88be7..85bfeffb27 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/PluginServiceFactory.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/PluginServiceFactory.java @@ -112,7 +112,7 @@ private void readServiceDefinitionFromUrl(Map extractorMap, private synchronized void createOrRemoveService(Map serviceMap, String line) throws ReflectiveOperationException { - if (line.length() > 0 && !COMMENT_LINE_PATTERN.matcher(line).matches()) { + if (!line.isEmpty() && !COMMENT_LINE_PATTERN.matcher(line).matches()) { ServiceEntry entry = new ServiceEntry(line); if (entry.isRemove()) { // Removing is a bit complex since we need to find out From 1b806883e6c6bb81002046574c3409d96f0a4550 Mon Sep 17 00:00:00 2001 From: Piotr Filochowski <37939948+Piotr-Filochowski@users.noreply.github.com> Date: Mon, 5 Aug 2024 07:07:14 +0200 Subject: [PATCH 248/289] fix: 'initContainersInSpec.size() == 0' replaced with 'initContainersInSpec.isEmpty()' in KubernetesResourceUtilTest initContainersInSpec.size() == 0' replaced with 'initContainersInSpec.isEmpty() Signed-off-by: Piotr Filochowski --- .../jkube/kit/enricher/api/util/KubernetesResourceUtilTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtilTest.java b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtilTest.java index c8e0beceb2..01022eed1f 100644 --- a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtilTest.java +++ b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtilTest.java @@ -629,7 +629,7 @@ void isContainerImage_whenImageAbsentInInitContainerConfig_thenReturnTrue() { private void verifyBuilder(PodTemplateSpecBuilder builder, List initContainers) { PodTemplateSpec spec = builder.build(); List initContainersInSpec = spec.getSpec().getInitContainers(); - if (initContainersInSpec.size() == 0) { + if (initContainersInSpec.isEmpty()) { assertThat(initContainers).isNull();; } else { assertThat(initContainers).hasSameSizeAs(initContainersInSpec); From cde6d091a8a2d2c176cf7163df2cbd43dac9d36d Mon Sep 17 00:00:00 2001 From: Jessica Lane <48732966+jesslane94@users.noreply.github.com> Date: Sun, 4 Aug 2024 22:10:21 -0700 Subject: [PATCH 249/289] fix: replace AssertJ's deprecated asList() DSL method in DeploymentConfigHandlerTest (3279) Signed-off-by: Jessica Lane --- .../kit/enricher/handler/DeploymentConfigHandlerTest.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/DeploymentConfigHandlerTest.java b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/DeploymentConfigHandlerTest.java index 302a949dcd..21b01acfd5 100644 --- a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/DeploymentConfigHandlerTest.java +++ b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/handler/DeploymentConfigHandlerTest.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Properties; +import io.fabric8.kubernetes.api.model.Container; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.resource.ControllerResourceConfig; @@ -33,6 +34,7 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import org.assertj.core.api.InstanceOfAssertFactories; class DeploymentConfigHandlerTest { @@ -67,7 +69,7 @@ void get_withNoImages_shouldReturnConfigWithNoContainers() { // Then assertThat(result) .hasFieldOrPropertyWithValue("metadata.name", "controller") - .extracting("spec.template.spec.containers").asList().isEmpty(); + .extracting("spec.template.spec.containers").asInstanceOf(InstanceOfAssertFactories.list(Container.class)).isEmpty(); } @Test @@ -83,7 +85,7 @@ void get_withImages_shouldReturnConfigWithContainers() { // Then assertThat(result) .hasFieldOrPropertyWithValue("metadata.name", "controller") - .extracting("spec.template.spec.containers").asList().hasSize(2) + .extracting("spec.template.spec.containers").asInstanceOf(InstanceOfAssertFactories.list(Container.class)).hasSize(2) .extracting("image", "name") .containsExactly(new Tuple("busybox:latest", "g-a"), new Tuple("jkubeio/java:latest", "jkubeio-a")); } @@ -96,7 +98,7 @@ void getPodTemplateSpec_withNoImages_shouldReturnPodTemplateSpecWithNoContainers // When final PodTemplateSpec result = deploymentConfigHandler.getPodTemplateSpec(controllerResourceConfig, images); // Then - assertThat(result).extracting("spec.containers").asList().isEmpty(); + assertThat(result).extracting("spec.containers").asInstanceOf(InstanceOfAssertFactories.list(Container.class)).isEmpty(); } @Test From 948b229356c4612b0eb4c48712411d0962d85e6b Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Mon, 5 Aug 2024 10:43:34 +0530 Subject: [PATCH 250/289] fix(micronaut): add Micronaut 4 maven plugin's groupId to MicronautUtils.hasMicronautPlugin Signed-off-by: Rohan Kumar --- CHANGELOG.md | 1 + .../eclipse/jkube/micronaut/MicronautUtils.java | 1 + .../generator/MicronautGeneratorTest.java | 14 ++++++++++---- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 117d1500a7..caf99dbda0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,6 +45,7 @@ Usage: * Fix #2467: Add support for specifying imagePullSecrets via resource configuration * Fix #3220: ImageEnricher#mergeEnvVariables causes error for empty env * Fix #3228: Springboot 3.3.1 layertools output format breaks LayeredJarGenerator +* Fix #3294: MicronautGenerator not getting invoked for Micronaut4 Maven project _**Note**_: - `defaultStorageClass` and `useStorageClassAnnotation` fields have been removed from VolumePermissionEnricher (`jkube-volume-permission`). Users are advised to use these fields from PersistentVolumeClaimStorageClassEnricher (`jkube-persistentvolumeclaim-storageclass`) instead. diff --git a/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/MicronautUtils.java b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/MicronautUtils.java index 4436174a18..9da8489c36 100644 --- a/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/MicronautUtils.java +++ b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/MicronautUtils.java @@ -53,6 +53,7 @@ public static Properties getMicronautConfiguration(URLClassLoader urlClassLoader public static boolean hasMicronautPlugin(JavaProject javaProject) { return JKubeProjectUtil.hasPlugin(javaProject, "io.micronaut.build", "micronaut-maven-plugin") || + JKubeProjectUtil.hasPlugin(javaProject, "io.micronaut.maven", "micronaut-maven-plugin") || JKubeProjectUtil.hasPlugin(javaProject, "io.micronaut.application", "io.micronaut.application.gradle.plugin"); } } diff --git a/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/generator/MicronautGeneratorTest.java b/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/generator/MicronautGeneratorTest.java index 2bc72c818a..99da146189 100644 --- a/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/generator/MicronautGeneratorTest.java +++ b/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/generator/MicronautGeneratorTest.java @@ -29,6 +29,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import static org.assertj.core.api.Assertions.assertThat; @@ -59,12 +61,16 @@ void isApplicableWithNoPlugin() { assertThat(result).isFalse(); } - @Test - void isApplicableWithMavenPlugin() { + @ParameterizedTest(name = "isApplicable with micronaut maven plugin groupId {0}, artifactId {1} should return true") + @CsvSource(value = { + "io.micronaut.build,micronaut-maven-plugin", + "io.micronaut.maven,micronaut-maven-plugin" + }) + void isApplicableWithMavenPlugin(String groupId, String artifactId) { // Given ctx.getProject().setPlugins(Collections.singletonList(Plugin.builder() - .groupId("io.micronaut.build") - .artifactId("micronaut-maven-plugin") + .groupId(groupId) + .artifactId(artifactId) .build() )); // When From 7aaf5c057acecf032597132f7c6f9152074f4df9 Mon Sep 17 00:00:00 2001 From: Arman Yekkehkhani <72594459+arman-yekkehkhani@users.noreply.github.com> Date: Mon, 5 Aug 2024 08:53:41 +0330 Subject: [PATCH 251/289] fix: replace AssertJ's deprecated asList() DSL method in JibServiceUtilTest (3281) chore(JibServiceUtilTest): replace deprecated asList method, issue #3242 Signed-off-by: arman-yekkehkhani --- chore(JibServiceUtilTest): improve imports, issue #3242 Signed-off-by: arman-yekkehkhani --- .../jkube/kit/service/jib/JibServiceUtilTest.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java index 791f2b6680..a71cbdb353 100644 --- a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java +++ b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceUtilTest.java @@ -17,9 +17,11 @@ import com.google.cloud.tools.jib.api.JibContainerBuilder; import com.google.cloud.tools.jib.api.buildplan.AbsoluteUnixPath; import com.google.cloud.tools.jib.api.buildplan.FileEntriesLayer; +import com.google.cloud.tools.jib.api.buildplan.FileEntry; import com.google.cloud.tools.jib.api.buildplan.ImageFormat; import com.google.cloud.tools.jib.api.buildplan.Platform; import com.google.cloud.tools.jib.api.buildplan.Port; +import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.kit.build.api.assembly.BuildDirs; import org.eclipse.jkube.kit.common.Assembly; import org.eclipse.jkube.kit.common.AssemblyConfiguration; @@ -317,17 +319,23 @@ void withMultipleLayers_shouldReturnTransformedLayers(@TempDir Path temporaryFol assertThat(result).hasSize(3) .anySatisfy(fel -> assertThat(fel) .hasFieldOrPropertyWithValue("name", "layer-1") - .extracting(FileEntriesLayer::getEntries).asList().extracting("extractionPath.unixPath") + .extracting(FileEntriesLayer::getEntries) + .asInstanceOf(InstanceOfAssertFactories.list(FileEntry.class)) + .extracting("extractionPath.unixPath") .containsExactly("/l1.1.txt", "/l1.2.txt") ) .anySatisfy(fel -> assertThat(fel) .hasFieldOrPropertyWithValue("name", "") - .extracting(FileEntriesLayer::getEntries).asList().extracting("extractionPath.unixPath") + .extracting(FileEntriesLayer::getEntries) + .asInstanceOf(InstanceOfAssertFactories.list(FileEntry.class)) + .extracting("extractionPath.unixPath") .containsExactly("/l2.1.txt", "/l2.2.txt") ) .anySatisfy(fel -> assertThat(fel) .hasFieldOrPropertyWithValue("name", "jkube-generated-layer-final-artifact") - .extracting(FileEntriesLayer::getEntries).asList().extracting("extractionPath.unixPath") + .extracting(FileEntriesLayer::getEntries) + .asInstanceOf(InstanceOfAssertFactories.list(FileEntry.class)) + .extracting("extractionPath.unixPath") .containsExactly("/deployments/edge.case") ) .extracting(FileEntriesLayer::getName) From 0a4691829adbbab0c11071019aba4b74e9808e90 Mon Sep 17 00:00:00 2001 From: Switchharsh Date: Mon, 5 Aug 2024 07:41:23 +0200 Subject: [PATCH 252/289] fix: removed unnecessary private modifier in enum constructor in BuildRecreateMode (3301) Signed-off-by: Harsh Khandelwal --- .../java/org/eclipse/jkube/kit/common/BuildRecreateMode.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/BuildRecreateMode.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/BuildRecreateMode.java index c32f662f78..e6ed68a0f2 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/BuildRecreateMode.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/BuildRecreateMode.java @@ -60,7 +60,7 @@ public static BuildRecreateMode fromParameter(String param) { return valueOf(param.toLowerCase()); } - private BuildRecreateMode(boolean bc, boolean is) { + BuildRecreateMode(boolean bc, boolean is) { this.isBuildConfig = bc; this.isImageStream = is; } From 7e5b4b9705926cfb824fe269bc53974acbe0ca1b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pedro=20Caires=20Ferreira?= Date: Mon, 5 Aug 2024 02:50:51 -0300 Subject: [PATCH 253/289] fix: replace AssertJ's deprecated asList() DSL method in KubernetesResourceUtilTest (3275) Signed-off-by: jpcairesf --- .../kit/enricher/api/util/KubernetesResourceUtilTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtilTest.java b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtilTest.java index 01022eed1f..5a42183664 100644 --- a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtilTest.java +++ b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtilTest.java @@ -17,6 +17,7 @@ import io.fabric8.kubernetes.api.model.ConfigMapBuilder; import io.fabric8.kubernetes.api.model.Container; import io.fabric8.kubernetes.api.model.ContainerBuilder; +import io.fabric8.kubernetes.api.model.ContainerPort; import io.fabric8.kubernetes.api.model.EnvVarBuilder; import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.api.model.KubernetesListBuilder; @@ -130,7 +131,8 @@ void mergePodSpec_withFragmentWithContainerNameAndSidecarDisabled_shouldPreserve .hasFieldOrPropertyWithValue("name", "demo") .hasFieldOrPropertyWithValue("image", "spring-boot-test:latest") .hasFieldOrPropertyWithValue("args", Collections.singletonList("/usr/local/s2i/run")) - .extracting("ports").asList().extracting("containerPort") + .extracting("ports").asInstanceOf(InstanceOfAssertFactories.list(ContainerPort.class)) + .extracting("containerPort") .containsExactly(8080, 9779, 8778); } From 37167aca8c469671ed0bd644c02d71f38a170ed3 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Mon, 5 Aug 2024 16:39:15 +0530 Subject: [PATCH 254/289] test : Add wait for oci server to become ready in JibImageBuildServicePushTest (3283) test : Add wait for oci server to become ready in JibImageBuildServicePushTest Wait for 5 seconds for verifying that created Helm Oci Server instance is accepting connections. Signed-off-by: Rohan Kumar --- test:feat: create TestOciServer to reuse OciServer test server Signed-off-by: Marc Nuri Co-authored-by: Marc Nuri --- .../jkube/kit/service/jib/JibServiceTest.java | 38 ++++----- jkube-kit/common/pom.xml | 5 ++ .../jkube/kit/common/TestOciServer.java | 84 +++++++++++++++++++ .../JibImageBuildServicePushTest.java | 44 ++++------ 4 files changed, 121 insertions(+), 50 deletions(-) create mode 100644 jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/TestOciServer.java diff --git a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java index 36ec7d4ef6..92ee505cff 100644 --- a/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java +++ b/jkube-kit/build/service/jib/src/test/java/org/eclipse/jkube/kit/service/jib/JibServiceTest.java @@ -19,9 +19,6 @@ import com.google.cloud.tools.jib.api.TarImage; import com.google.cloud.tools.jib.api.buildplan.ImageFormat; import com.google.cloud.tools.jib.global.JibSystemProperties; -import com.marcnuri.helm.jni.HelmLib; -import com.marcnuri.helm.jni.NativeLibrary; -import com.marcnuri.helm.jni.RepoServerOptions; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; import org.eclipse.jkube.kit.build.api.assembly.BuildDirs; @@ -31,11 +28,11 @@ import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.RegistryConfig; import org.eclipse.jkube.kit.common.RegistryServerConfiguration; +import org.eclipse.jkube.kit.common.TestOciServer; import org.eclipse.jkube.kit.common.assertj.ArchiveAssertions; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -55,35 +52,27 @@ class JibServiceTest { - private static HelmLib helmLib; @TempDir private Path tempDir; - private String remoteOciServer; + private TestOciServer remoteOciServer; private JibLogger jibLogger; private TestAuthConfigFactory testAuthConfigFactory; private JKubeConfiguration configuration; private ImageConfiguration imageConfiguration; - @BeforeAll - static void setUpAll() { - helmLib = NativeLibrary.getInstance().load(); - } - @BeforeEach void setUp() { - remoteOciServer = helmLib.RepoOciServerStart( - new RepoServerOptions(null, "oci-user", "oci-password") - ).out; + remoteOciServer = new TestOciServer(); jibLogger = new JibLogger(new KitLogger.SilentLogger()); testAuthConfigFactory = new TestAuthConfigFactory(); configuration = JKubeConfiguration.builder() .pullRegistryConfig(RegistryConfig.builder().build()) .pushRegistryConfig(RegistryConfig.builder() - .registry(remoteOciServer) + .registry(remoteOciServer.getUrl()) .settings(Collections.singletonList(RegistryServerConfiguration.builder() - .id(remoteOciServer) - .username("oci-user") - .password("oci-password") + .id(remoteOciServer.getUrl()) + .username(remoteOciServer.getUser()) + .password(remoteOciServer.getPassword()) .build())) .build()) .project(JavaProject.builder() @@ -91,13 +80,18 @@ void setUp() { .build()) .build(); imageConfiguration = ImageConfiguration.builder() - .name(remoteOciServer + "/" + "the-image-name") + .name(remoteOciServer.getUrl() + "/" + "the-image-name") .build(BuildConfiguration.builder() .from("scratch") .build()) .build(); } + @AfterEach + void tearDown() throws Exception { + remoteOciServer.close(); + } + @Test void prependsRegistryWhenNotConfiguredInName() throws Exception { configuration = configuration.toBuilder() @@ -207,7 +201,7 @@ void push() throws Exception { try (JibService jibService = new JibService(jibLogger, testAuthConfigFactory, configuration, imageConfiguration)) { jibService.push(); } - final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer + "/v2/the-image-name/tags/list") + final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer.getUrl() + "/v2/the-image-name/tags/list") .openConnection(); connection.setRequestProperty("Authorization", "Basic " + Base64.encodeBase64String("oci-user:oci-password".getBytes())); connection.connect(); @@ -227,7 +221,7 @@ void pushAdditionalTags() throws Exception { try (JibService jibService = new JibService(jibLogger, testAuthConfigFactory, configuration, imageConfiguration)) { jibService.push(); } - final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer + "/v2/the-image-name/tags/list") + final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer.getUrl() + "/v2/the-image-name/tags/list") .openConnection(); connection.setRequestProperty("Authorization", "Basic " + Base64.encodeBase64String("oci-user:oci-password".getBytes())); connection.connect(); @@ -248,7 +242,7 @@ void pushMultiplatform() throws Exception { try (JibService jibService = new JibService(jibLogger, testAuthConfigFactory, configuration, imageConfiguration)) { jibService.push(); } - final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer + "/v2/the-image-name/manifests/latest") + final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer.getUrl() + "/v2/the-image-name/manifests/latest") .openConnection(); connection.setRequestProperty("Authorization", "Basic " + Base64.encodeBase64String("oci-user:oci-password".getBytes())); connection.setRequestProperty("Accept", "application/vnd.docker.distribution.manifest.list.v2+json"); diff --git a/jkube-kit/common/pom.xml b/jkube-kit/common/pom.xml index 5fb24c919f..2389f6e75a 100644 --- a/jkube-kit/common/pom.xml +++ b/jkube-kit/common/pom.xml @@ -147,6 +147,11 @@ com.networknt json-schema-validator + + com.marcnuri.helm-java + helm-java + test + diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/TestOciServer.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/TestOciServer.java new file mode 100644 index 0000000000..c89f3bfc7c --- /dev/null +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/TestOciServer.java @@ -0,0 +1,84 @@ +/* + * 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.marcnuri.helm.jni.HelmLib; +import com.marcnuri.helm.jni.NativeLibrary; +import com.marcnuri.helm.jni.RepoServerOptions; +import lombok.Getter; +import org.eclipse.jkube.kit.common.util.Base64Util; + +import java.io.Closeable; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.time.Duration; + +import static org.eclipse.jkube.kit.common.util.AsyncUtil.await; +import static org.eclipse.jkube.kit.common.util.AsyncUtil.get; + +@Getter +public class TestOciServer implements Closeable { + + private static final Duration TIMEOUT = Duration.ofSeconds(5); + private static final String DEFAULT_USER = "oci-user"; + private static final String DEFAULT_PASSWORD = "oci-password"; + + // initialization-on-demand holder + private static final class HelmLibHolder { + private static final HelmLib INSTANCE = NativeLibrary.getInstance().load(); + } + + private static HelmLib getHelmLib() { + return HelmLibHolder.INSTANCE; + } + + private final String user; + private final String password; + private final String url; + + public TestOciServer() { + this(DEFAULT_USER, DEFAULT_PASSWORD); + } + + public TestOciServer(String user, String password) { + this.user = user; + this.password = password; + url = get(await(this::startServer).apply(this::waitForServer), TIMEOUT); + } + + @Override + public void close() throws IOException { + // No effect yet https://github.com/manusa/helm-java/blob/f44a88ed1ad351b2b5a00b5e735deb5cb35b32f7/native/internal/helm/repotest.go#L138 + getHelmLib().RepoServerStop(url); + } + + private String startServer() { + return getHelmLib().RepoOciServerStart( + new RepoServerOptions(null, user, password) + ).out; + } + + private boolean waitForServer(String serverUrl) { + try { + final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + serverUrl + "/v2/") + .openConnection(); + connection.setRequestProperty("Authorization", "Basic " + Base64Util.encodeToString(String.join(":", user, password))); + connection.connect(); + return connection.getResponseCode() == HttpURLConnection.HTTP_OK; + } catch (IOException e) { + return false; + } + } +} diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServicePushTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServicePushTest.java index 96a516e550..b5d3b06449 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServicePushTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/kubernetes/JibImageBuildServicePushTest.java @@ -18,9 +18,6 @@ import com.google.cloud.tools.jib.api.TarImage; import com.google.cloud.tools.jib.api.buildplan.ImageFormat; import com.google.cloud.tools.jib.global.JibSystemProperties; -import com.marcnuri.helm.jni.HelmLib; -import com.marcnuri.helm.jni.NativeLibrary; -import com.marcnuri.helm.jni.RepoServerOptions; import org.apache.commons.codec.binary.Base64; import org.apache.commons.io.IOUtils; import org.eclipse.jkube.kit.common.JKubeConfiguration; @@ -29,6 +26,7 @@ import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.RegistryConfig; import org.eclipse.jkube.kit.common.RegistryServerConfiguration; +import org.eclipse.jkube.kit.common.TestOciServer; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.resource.RuntimeMode; @@ -36,7 +34,6 @@ import org.eclipse.jkube.kit.config.service.JKubeServiceException; import org.eclipse.jkube.kit.config.service.JKubeServiceHub; import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -59,24 +56,16 @@ class JibImageBuildServicePushTest { - private static HelmLib helmLib; - @TempDir private Path temporaryFolder; private boolean sendCredentialsOverHttp; - private String remoteOciServer; - + private TestOciServer remoteOciServer; private KitLogger logger; private JKubeServiceHub jKubeServiceHub; private ImageConfiguration imageConfiguration; - @BeforeAll - static void setUpAll() { - helmLib = NativeLibrary.getInstance().load(); - } - @BeforeEach void setUp() throws Exception { sendCredentialsOverHttp = JibSystemProperties.sendCredentialsOverHttp(); @@ -85,9 +74,7 @@ void setUp() throws Exception { logger = spy(new KitLogger.SilentLogger()); // Setup OCI server - remoteOciServer = helmLib.RepoOciServerStart( - new RepoServerOptions(null, "oci-user", "oci-password") - ).out; + remoteOciServer = new TestOciServer(); // Configure OCI server in image and JKube imageConfiguration = ImageConfiguration.builder() @@ -95,7 +82,7 @@ void setUp() throws Exception { .build(BuildConfiguration.builder() .from("scratch") .build()) - .registry(remoteOciServer) + .registry(remoteOciServer.getUrl()) .build(); jKubeServiceHub = JKubeServiceHub.builder() .log(logger) @@ -105,12 +92,12 @@ void setUp() throws Exception { .project(JavaProject.builder().baseDirectory(temporaryFolder.toFile()).build()) .pullRegistryConfig(RegistryConfig.builder().settings(Collections.emptyList()).build()) .pushRegistryConfig(RegistryConfig.builder() - .registry(remoteOciServer) + .registry(remoteOciServer.getUrl()) .settings(Collections.singletonList( RegistryServerConfiguration.builder() - .id(remoteOciServer) - .username("oci-user") - .password("oci-password") + .id(remoteOciServer.getUrl()) + .username(remoteOciServer.getUser()) + .password(remoteOciServer.getPassword()) .build())) .passwordDecryptionMethod(s -> s) .build()) @@ -120,7 +107,7 @@ void setUp() throws Exception { // Build fake container image final Path tarPath = temporaryFolder .resolve("localhost") - .resolve(remoteOciServer.split(":")[1]) + .resolve(remoteOciServer.getUrl().split(":")[1]) .resolve("test") .resolve("test-image") .resolve("0.0.1") @@ -135,7 +122,8 @@ void setUp() throws Exception { } @AfterEach - void tearDown() { + void tearDown() throws Exception { + remoteOciServer.close(); if (!sendCredentialsOverHttp) { System.clearProperty(JibSystemProperties.SEND_CREDENTIALS_OVER_HTTP); } @@ -193,12 +181,12 @@ void pushValidImage() throws Exception { @Test void logsImagePush() { verify(logger, times(1)) - .info("Pushing image: %s", remoteOciServer + "/test/test-image:0.0.1"); + .info("Pushing image: %s", remoteOciServer.getUrl() + "/test/test-image:0.0.1"); } @Test void pushesImage() throws Exception { - final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer + "/v2/test/test-image/tags/list") + final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer.getUrl() + "/v2/test/test-image/tags/list") .openConnection(); connection.setRequestProperty("Authorization", "Basic " + Base64.encodeBase64String("oci-user:oci-password".getBytes())); connection.connect(); @@ -229,12 +217,12 @@ void pushValidImage() throws Exception { @Test void logsImagePush() { verify(logger, times(1)) - .info("Pushing image: %s", remoteOciServer + "/test/test-image:multiplatform"); + .info("Pushing image: %s", remoteOciServer.getUrl() + "/test/test-image:multiplatform"); } @Test void pushesImage() throws Exception { - final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer + "/v2/test/test-image/tags/list") + final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer.getUrl() + "/v2/test/test-image/tags/list") .openConnection(); connection.setRequestProperty("Authorization", "Basic " + Base64.encodeBase64String("oci-user:oci-password".getBytes())); connection.connect(); @@ -245,7 +233,7 @@ void pushesImage() throws Exception { @Test void pushedImageManifestIsMultiplatform() throws Exception { - final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer + "/v2/test/test-image/manifests/multiplatform") + final HttpURLConnection connection = (HttpURLConnection) new URL("http://" + remoteOciServer.getUrl() + "/v2/test/test-image/manifests/multiplatform") .openConnection(); connection.setRequestProperty("Authorization", "Basic " + Base64.encodeBase64String("oci-user:oci-password".getBytes())); connection.setRequestProperty("Accept", "application/vnd.docker.distribution.manifest.list.v2+json"); From 7a3f10305b24ad9df14019d9f62a6b39804ade60 Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Mon, 5 Aug 2024 14:29:38 +0200 Subject: [PATCH 255/289] ci:deps: bump eclipse-dash version to 1.1.1-SNAPSHOT / 1.1.0 Signed-off-by: Marc Nuri --- .jenkins/pipelines/dependencies.Jenkinsfile | 2 +- scripts/eclipse-dash-tool.sh | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.jenkins/pipelines/dependencies.Jenkinsfile b/.jenkins/pipelines/dependencies.Jenkinsfile index 20dff5ebb5..fdf66c9458 100644 --- a/.jenkins/pipelines/dependencies.Jenkinsfile +++ b/.jenkins/pipelines/dependencies.Jenkinsfile @@ -16,7 +16,7 @@ pipeline { sh 'echo "Eclipse Dash Tool"' // Eclipse Dash tool retrieves dependencies from submodules which might need artifacts from previous modules sh './mvnw -V -B -e -DskipTests install' - sh 'ECLIPSE_DASH_VERSION=1.0.2 ./scripts/eclipse-dash-tool.sh' + sh 'ECLIPSE_DASH_VERSION=1.1.0 ./scripts/eclipse-dash-tool.sh' } } } diff --git a/scripts/eclipse-dash-tool.sh b/scripts/eclipse-dash-tool.sh index ae024f64be..c021734223 100755 --- a/scripts/eclipse-dash-tool.sh +++ b/scripts/eclipse-dash-tool.sh @@ -22,15 +22,16 @@ REPOSITORY="https://repo.eclipse.org/content/repositories/dash-licenses/org/ecli TARGET_DIR="$PROJECT_ROOT/target" DEPENDENCY_LIST="$TARGET_DIR/dependencies.txt" TOOL_JAR="$TARGET_DIR/eclipse-dash.jar" +VERSION="1.1.1-SNAPSHOT" function downloadTool() { if [[ ! -f "$TOOL_JAR" ]] then if [[ -z "$ECLIPSE_DASH_VERSION" ]] then - echo "Getting latest Eclipse Dash 0.0.1-SNAPSHOT version" - version=$(curl -s "${REPOSITORY}/0.0.1-SNAPSHOT/maven-metadata.xml" | xpath -q -e "/metadata/versioning/snapshotVersions/snapshotVersion[extension='jar']/value/text()") - downloadUrl="${REPOSITORY}/0.0.1-SNAPSHOT/org.eclipse.dash.licenses-${version}.jar" + echo "Getting latest Eclipse Dash ${VERSION} version" + snapshotVersion=$(curl -s "${REPOSITORY}/${VERSION}/maven-metadata.xml" | xpath -q -e "/metadata/versioning/snapshotVersions/snapshotVersion[extension='jar']/value/text()") + downloadUrl="${REPOSITORY}/${VERSION}/org.eclipse.dash.licenses-${snapshotVersion}.jar" else echo "Using provided Eclipse Dash version ($ECLIPSE_DASH_VERSION)" downloadUrl="${REPOSITORY}/${ECLIPSE_DASH_VERSION}/org.eclipse.dash.licenses-${ECLIPSE_DASH_VERSION}.jar" From c25c674efa5e8ee18ebae25709b75faf2f5771b9 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Mon, 5 Aug 2024 18:08:06 +0530 Subject: [PATCH 256/289] feat(micronaut): support for Micronaut Framework Native Images MicronautGenerator would detect native build if these conditions are satisfied and prepares image with native artifact: - `packaging=native-image` property provided or `org.graalvm.buildtools.gradle.NativeImagePlugin` plugin present in project - native artifact is present in build directory Signed-off-by: Rohan Kumar --- jkube-kit/jkube-kit-micronaut/pom.xml | 13 + .../jkube/micronaut/MicronautUtils.java | 12 + .../AbstractMicronautNestedGenerator.java | 45 +++ .../micronaut/generator/FatJarGenerator.java | 31 ++ .../generator/MicronautGenerator.java | 43 ++ .../generator/MicronautNestedGenerator.java | 71 ++++ .../micronaut/generator/NativeGenerator.java | 99 +++++ .../META-INF/jkube/default-images.properties | 21 + .../jkube/micronaut/MicronautUtilsTest.java | 29 ++ .../MicronautGeneratorIntegrationTest.java | 379 ++++++++++++++++++ jkube-kit/parent/pom.xml | 5 + 11 files changed, 748 insertions(+) create mode 100644 jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/AbstractMicronautNestedGenerator.java create mode 100644 jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/FatJarGenerator.java create mode 100644 jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/MicronautNestedGenerator.java create mode 100644 jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/NativeGenerator.java create mode 100644 jkube-kit/jkube-kit-micronaut/src/main/resources-filtered/META-INF/jkube/default-images.properties create mode 100644 jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/generator/MicronautGeneratorIntegrationTest.java diff --git a/jkube-kit/jkube-kit-micronaut/pom.xml b/jkube-kit/jkube-kit-micronaut/pom.xml index 191567b6ea..4c74157b4f 100644 --- a/jkube-kit/jkube-kit-micronaut/pom.xml +++ b/jkube-kit/jkube-kit-micronaut/pom.xml @@ -65,4 +65,17 @@ + + + + + src/main/resources-filtered + true + + + src/main/resources + false + + + diff --git a/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/MicronautUtils.java b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/MicronautUtils.java index 9da8489c36..65556c021f 100644 --- a/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/MicronautUtils.java +++ b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/MicronautUtils.java @@ -56,4 +56,16 @@ public static boolean hasMicronautPlugin(JavaProject javaProject) { JKubeProjectUtil.hasPlugin(javaProject, "io.micronaut.maven", "micronaut-maven-plugin") || JKubeProjectUtil.hasPlugin(javaProject, "io.micronaut.application", "io.micronaut.application.gradle.plugin"); } + + public static boolean hasNativeImagePackaging(JavaProject javaProject) { + if (javaProject != null) { + if (javaProject.getProperties() != null && + javaProject.getProperties().getProperty("packaging") != null && + javaProject.getProperties().getProperty("packaging").equals("native-image")) { + return true; + } + return javaProject.getGradlePlugins() != null && javaProject.getGradlePlugins().contains("org.graalvm.buildtools.gradle.NativeImagePlugin"); + } + return false; + } } diff --git a/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/AbstractMicronautNestedGenerator.java b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/AbstractMicronautNestedGenerator.java new file mode 100644 index 0000000000..7384c0d504 --- /dev/null +++ b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/AbstractMicronautNestedGenerator.java @@ -0,0 +1,45 @@ +/* + * 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.micronaut.generator; + +import org.eclipse.jkube.generator.api.GeneratorConfig; +import org.eclipse.jkube.generator.api.GeneratorContext; +import org.eclipse.jkube.generator.javaexec.JavaExecGenerator; +import org.eclipse.jkube.kit.common.JavaProject; + +public abstract class AbstractMicronautNestedGenerator implements MicronautNestedGenerator { + + private final GeneratorContext generatorContext; + private final GeneratorConfig generatorConfig; + + AbstractMicronautNestedGenerator(GeneratorContext generatorContext, GeneratorConfig generatorConfig) { + this.generatorContext = generatorContext; + this.generatorConfig = generatorConfig; + } + + @Override + public final JavaProject getProject() { + return generatorContext.getProject(); + } + + @Override + public String getBuildWorkdir() { + return generatorConfig.get(JavaExecGenerator.Config.TARGET_DIR); + } + + @Override + public String getTargetDir() { + return generatorConfig.get(JavaExecGenerator.Config.TARGET_DIR); + } +} diff --git a/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/FatJarGenerator.java b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/FatJarGenerator.java new file mode 100644 index 0000000000..f7e4df72ca --- /dev/null +++ b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/FatJarGenerator.java @@ -0,0 +1,31 @@ +/* + * 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.micronaut.generator; + +import org.eclipse.jkube.generator.api.GeneratorConfig; +import org.eclipse.jkube.generator.api.GeneratorContext; + +import java.util.Map; +import java.util.function.Function; + +public class FatJarGenerator extends AbstractMicronautNestedGenerator { + public FatJarGenerator(GeneratorContext generatorContext, GeneratorConfig generatorConfig) { + super(generatorContext, generatorConfig); + } + + @Override + public Map getEnv(Function> javaExecEnvSupplier, boolean prePackagePhase) { + return javaExecEnvSupplier.apply(prePackagePhase); + } +} diff --git a/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/MicronautGenerator.java b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/MicronautGenerator.java index 1b0ade4639..69edbaa3ad 100644 --- a/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/MicronautGenerator.java +++ b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/MicronautGenerator.java @@ -14,9 +14,13 @@ package org.eclipse.jkube.micronaut.generator; import java.util.List; +import java.util.Map; +import java.util.Optional; import org.eclipse.jkube.generator.api.GeneratorContext; import org.eclipse.jkube.generator.javaexec.JavaExecGenerator; +import org.eclipse.jkube.kit.common.Arguments; +import org.eclipse.jkube.kit.common.AssemblyConfiguration; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import static org.eclipse.jkube.kit.common.util.JKubeProjectUtil.getClassLoader; @@ -26,8 +30,11 @@ public class MicronautGenerator extends JavaExecGenerator { + private final MicronautNestedGenerator nestedGenerator; + public MicronautGenerator(GeneratorContext context) { super(context, "micronaut"); + this.nestedGenerator = MicronautNestedGenerator.from(context, getGeneratorConfig()); } @Override @@ -35,6 +42,42 @@ public boolean isApplicable(List configs) { return shouldAddGeneratedImageConfiguration(configs) && hasMicronautPlugin(getProject()); } + @Override + protected Map getEnv(boolean prePackagePhase) { + return nestedGenerator.getEnv(ppp -> super.getEnv(ppp), prePackagePhase); + } + + @Override + protected String getDefaultJolokiaPort() { + return nestedGenerator.getDefaultJolokiaPort(); + } + + @Override + protected String getDefaultPrometheusPort() { + return nestedGenerator.getDefaultPrometheusPort(); + } + + @Override + protected String getBuildWorkdir() { + return nestedGenerator.getBuildWorkdir(); + } + + @Override + protected String getFromAsConfigured() { + return Optional.ofNullable(super.getFromAsConfigured()).orElse(nestedGenerator.getFrom()); + } + + @Override + protected Arguments getBuildEntryPoint() { + return nestedGenerator.getBuildEntryPoint(); + } + + @Override + protected AssemblyConfiguration createAssembly() { + return Optional.ofNullable(nestedGenerator.createAssemblyConfiguration(addAdditionalFiles())) + .orElse(super.createAssembly()); + } + @Override protected String getDefaultWebPort() { return extractPort( diff --git a/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/MicronautNestedGenerator.java b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/MicronautNestedGenerator.java new file mode 100644 index 0000000000..068989aff1 --- /dev/null +++ b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/MicronautNestedGenerator.java @@ -0,0 +1,71 @@ +/* + * 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.micronaut.generator; + +import org.eclipse.jkube.generator.api.GeneratorConfig; +import org.eclipse.jkube.generator.api.GeneratorContext; +import org.eclipse.jkube.kit.common.Arguments; +import org.eclipse.jkube.kit.common.AssemblyConfiguration; +import org.eclipse.jkube.kit.common.AssemblyFileSet; +import org.eclipse.jkube.kit.common.JavaProject; + +import java.io.File; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +import static org.eclipse.jkube.generator.javaexec.JavaExecGenerator.JOLOKIA_PORT_DEFAULT; +import static org.eclipse.jkube.generator.javaexec.JavaExecGenerator.PROMETHEUS_PORT_DEFAULT; +import static org.eclipse.jkube.kit.common.util.SpringBootUtil.findNativeArtifactFile; +import static org.eclipse.jkube.micronaut.MicronautUtils.hasNativeImagePackaging; + +public interface MicronautNestedGenerator { + JavaProject getProject(); + + default AssemblyConfiguration createAssemblyConfiguration(List defaultFileSets) { + return null; + } + + default String getFrom() { + return null; + } + + default String getDefaultJolokiaPort() { + return JOLOKIA_PORT_DEFAULT; + } + + default String getDefaultPrometheusPort() { + return PROMETHEUS_PORT_DEFAULT; + } + + default Arguments getBuildEntryPoint() { + return null; + } + + String getBuildWorkdir(); + + String getTargetDir(); + + Map getEnv(Function> javaExecEnvSupplier, boolean prePackagePhase); + + static MicronautNestedGenerator from(GeneratorContext generatorContext, GeneratorConfig generatorConfig) { + if (hasNativeImagePackaging(generatorContext.getProject())) { + File nativeBinary = findNativeArtifactFile(generatorContext.getProject()); + if (nativeBinary != null) { + return new NativeGenerator(generatorContext, generatorConfig, nativeBinary); + } + } + return new FatJarGenerator(generatorContext, generatorConfig); + } +} diff --git a/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/NativeGenerator.java b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/NativeGenerator.java new file mode 100644 index 0000000000..3f93410001 --- /dev/null +++ b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/NativeGenerator.java @@ -0,0 +1,99 @@ +/* + * 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.micronaut.generator; + +import org.eclipse.jkube.generator.api.FromSelector; +import org.eclipse.jkube.generator.api.GeneratorConfig; +import org.eclipse.jkube.generator.api.GeneratorContext; +import org.eclipse.jkube.kit.common.Arguments; +import org.eclipse.jkube.kit.common.Assembly; +import org.eclipse.jkube.kit.common.AssemblyConfiguration; +import org.eclipse.jkube.kit.common.AssemblyFileSet; +import org.eclipse.jkube.kit.common.JavaProject; + +import java.io.File; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.function.Function; + +import static org.eclipse.jkube.kit.common.util.FileUtil.getRelativePath; + +public class NativeGenerator extends AbstractMicronautNestedGenerator { + private final File nativeBinary; + private final FromSelector fromSelector; + + public NativeGenerator(GeneratorContext generatorContext, GeneratorConfig generatorConfig, File nativeBinary) { + super(generatorContext, generatorConfig); + this.nativeBinary = nativeBinary; + fromSelector = new FromSelector.Default(generatorContext, "micronaut-native"); + } + + @Override + public String getFrom() { + return fromSelector.getFrom(); + } + + @Override + public String getDefaultJolokiaPort() { + return "0"; + } + + @Override + public String getDefaultPrometheusPort() { + return "0"; + } + + @Override + public Arguments getBuildEntryPoint() { + return Arguments.builder() + .execArgument("./" + nativeBinary.getName()) + .build(); + } + + @Override + public String getBuildWorkdir() { + return "/"; + } + + @Override + public String getTargetDir() { + return "/"; + } + + @Override + public Map getEnv(Function> javaExecEnvSupplier, boolean prePackagePhase) { + return Collections.emptyMap(); + } + + @Override + public AssemblyConfiguration createAssemblyConfiguration(List defaultFileSets) { + Assembly.AssemblyBuilder assemblyBuilder = Assembly.builder(); + final JavaProject project = getProject(); + final AssemblyFileSet.AssemblyFileSetBuilder artifactFileSetBuilder = AssemblyFileSet.builder() + .outputDirectory(new File(".")) + .directory(getRelativePath(project.getBaseDirectory(), nativeBinary.getParentFile())) + .fileMode("0755"); + artifactFileSetBuilder.include(nativeBinary.getName()); + + assemblyBuilder.fileSets(defaultFileSets); + assemblyBuilder.fileSet(artifactFileSetBuilder.build()); + + return AssemblyConfiguration.builder() + .targetDir(getTargetDir()) + .excludeFinalOutputArtifact(true) + .layer(assemblyBuilder.build()) + .build(); + } +} diff --git a/jkube-kit/jkube-kit-micronaut/src/main/resources-filtered/META-INF/jkube/default-images.properties b/jkube-kit/jkube-kit-micronaut/src/main/resources-filtered/META-INF/jkube/default-images.properties new file mode 100644 index 0000000000..cb0f042e7d --- /dev/null +++ b/jkube-kit/jkube-kit-micronaut/src/main/resources-filtered/META-INF/jkube/default-images.properties @@ -0,0 +1,21 @@ +# +# 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 +# + +# Properties for specifying the default images version to use +# The replacement values are defined in the parent pom.xml as properties + +# Upstream images +micronaut-native.upstream.s2i=${image.micronaut-native.upstream.s2i} +micronaut-native.upstream.docker=${image.micronaut-native.upstream.docker} +micronaut-native.upstream.istag=${image.micronaut-native.upstream.istag} diff --git a/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/MicronautUtilsTest.java b/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/MicronautUtilsTest.java index e923773831..335767c90d 100644 --- a/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/MicronautUtilsTest.java +++ b/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/MicronautUtilsTest.java @@ -17,12 +17,16 @@ import java.net.URLClassLoader; import java.util.Properties; +import org.eclipse.jkube.kit.common.JavaProject; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.entry; import static org.eclipse.jkube.micronaut.MicronautUtils.extractPort; import static org.eclipse.jkube.micronaut.MicronautUtils.getMicronautConfiguration; +import static org.eclipse.jkube.micronaut.MicronautUtils.hasNativeImagePackaging; import static org.eclipse.jkube.micronaut.MicronautUtils.isHealthEnabled; class MicronautUtilsTest { @@ -93,4 +97,29 @@ void getMicronautConfigurationNoConfigFiles() { assertThat(props).isEmpty(); } + @ParameterizedTest + @CsvSource(value = { + "native-image,true", + "jar,false" + }) + void hasNativeImagePackaging_whenPackagingProvided_thenShouldReturnExpectedResult(String packaging, boolean expectedValue) { + // Given + Properties properties = new Properties(); + properties.put("packaging", packaging); + JavaProject javaProject = JavaProject.builder() + .properties(properties) + .build(); + // When + Then + assertThat(hasNativeImagePackaging(javaProject)).isEqualTo(expectedValue); + } + + @Test + void hasNativeImagePackaging_whenNativeImagePluginProvided_thenShouldReturnExpectedResult() { + // Given + JavaProject javaProject = JavaProject.builder() + .gradlePlugin("org.graalvm.buildtools.gradle.NativeImagePlugin") + .build(); + // When + Then + assertThat(hasNativeImagePackaging(javaProject)).isTrue(); + } } diff --git a/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/generator/MicronautGeneratorIntegrationTest.java b/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/generator/MicronautGeneratorIntegrationTest.java new file mode 100644 index 0000000000..1549de403c --- /dev/null +++ b/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/generator/MicronautGeneratorIntegrationTest.java @@ -0,0 +1,379 @@ +/* + * 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.micronaut.generator; + +import org.assertj.core.api.InstanceOfAssertFactories; +import org.eclipse.jkube.generator.api.GeneratorContext; +import org.eclipse.jkube.kit.common.Arguments; +import org.eclipse.jkube.kit.common.Assembly; +import org.eclipse.jkube.kit.common.AssemblyConfiguration; +import org.eclipse.jkube.kit.common.AssemblyFileSet; +import org.eclipse.jkube.kit.common.Dependency; +import org.eclipse.jkube.kit.common.JavaProject; +import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.Plugin; +import org.eclipse.jkube.kit.config.image.ImageConfiguration; +import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.Properties; +import java.util.jar.Attributes; +import java.util.jar.JarEntry; +import java.util.jar.JarOutputStream; +import java.util.jar.Manifest; + +import static org.assertj.core.api.Assertions.assertThat; + +class MicronautGeneratorIntegrationTest { + + private static final String MICRONAUT_VERSION = "4.2.0"; + private File targetDir; + private Properties properties; + private GeneratorContext context; + + @BeforeEach + void setUp(@TempDir Path temporaryFolder) throws IOException { + properties = new Properties(); + targetDir = Files.createDirectory(temporaryFolder.resolve("target")).toFile(); + final JavaProject javaProject = JavaProject.builder() + .baseDirectory(temporaryFolder.toFile()) + .buildDirectory(targetDir.getAbsoluteFile()) + .buildPackageDirectory(targetDir.getAbsoluteFile()) + .outputDirectory(targetDir) + .properties(properties) + .version("1.0.0") + .dependency(Dependency.builder() + .groupId("io.micronaut") + .artifactId("micronaut-http-server-netty") + .version(MICRONAUT_VERSION) + .build()) + .plugin(Plugin.builder() + .groupId("io.micronaut.maven") + .artifactId("micronaut-maven-plugin") + .version(MICRONAUT_VERSION) + .build()) + .artifactId("sample") + .buildFinalName("sample") + .build(); + context = GeneratorContext.builder() + .logger(new KitLogger.SilentLogger()) + .project(javaProject) + .build(); + } + + @Nested + @DisplayName("With fat Jar packaging") + class StandardPackaging { + + @BeforeEach + void standardFatJar() { + Manifest manifest = new Manifest(); + manifest.getMainAttributes().put(Attributes.Name.MANIFEST_VERSION, "1.0"); + manifest.getMainAttributes().put(Attributes.Name.MAIN_CLASS, "org.example.Foo"); + try (JarOutputStream jarOutputStream = new JarOutputStream(Files.newOutputStream( + targetDir.toPath().resolve("fat.jar")), manifest)) { + jarOutputStream.putNextEntry(new JarEntry("META-INF/")); + jarOutputStream.putNextEntry(new JarEntry("org/")); + jarOutputStream.putNextEntry(new JarEntry("org/example/")); + jarOutputStream.putNextEntry(new JarEntry("org/example/Foo.class")); + } catch (IOException e) { + throw new IllegalStateException(e); + } + } + + @Test + @DisplayName("has image name (group/artifact:latest)") + void imageNameContainsGroupArtifactAndLatestTag() { + // When + final List images = new MicronautGenerator(context) + .customize(new ArrayList<>(), false); + // Then + assertThat(images) + .singleElement(InstanceOfAssertFactories.type(ImageConfiguration.class)) + .hasFieldOrPropertyWithValue("name", "%g/%a:%l"); + } + + @Test + @DisplayName("has 'micronaut' image alias") + void imageAliasMicronaut() { + // When + final List images = new MicronautGenerator(context) + .customize(new ArrayList<>(), false); + // Then + assertThat(images) + .singleElement(InstanceOfAssertFactories.type(ImageConfiguration.class)) + .hasFieldOrPropertyWithValue("alias", "micronaut"); + } + + @Test + @DisplayName("has image from based on standard Java Exec generator image") + void hasFrom() { + // When + final List images = new MicronautGenerator(context) + .customize(new ArrayList<>(), false); + // Then + assertThat(images) + .singleElement(InstanceOfAssertFactories.type(ImageConfiguration.class)) + .extracting(ImageConfiguration::getBuild) + .extracting(BuildConfiguration::getFrom) + .asString() + .startsWith("quay.io/jkube/jkube-java"); + } + + @Test + @DisplayName("has '8080' web port") + void imageHasDefaultWebPort() { + // When + final List images = new MicronautGenerator(context) + .customize(new ArrayList<>(), false); + // Then + assertThat(images) + .singleElement() + .extracting("buildConfiguration.ports") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) + .contains("8080"); + } + + @Test + @DisplayName("has Jolokia port") + void hasJolokiaPort() { + // When + final List images = new MicronautGenerator(context) + .customize(new ArrayList<>(), false); + // Then + assertThat(images).singleElement() + .extracting("buildConfiguration.ports") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) + .contains("8778"); + } + + @Test + @DisplayName("has Prometheus port") + void hasPrometheusPort() { + // When + final List images = new MicronautGenerator(context) + .customize(new ArrayList<>(), false); + // Then + assertThat(images).singleElement() + .extracting("buildConfiguration.ports") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) + .contains("9779"); + } + + @Test + @DisplayName("has java environment variable for app dir") + void hasJavaJavaAppDirEnvVar() { + // When + final List images = new MicronautGenerator(context) + .customize(new ArrayList<>(), false); + // Then + assertThat(images) + .singleElement(InstanceOfAssertFactories.type(ImageConfiguration.class)) + .extracting(ImageConfiguration::getBuild) + .extracting(BuildConfiguration::getEnv) + .asInstanceOf(InstanceOfAssertFactories.MAP) + .containsEntry("JAVA_APP_DIR", "/deployments"); + } + + @Test + @DisplayName("creates assembly with Fat Jar") + void createAssembly() { + // When + final List images = new MicronautGenerator(context) + .customize(new ArrayList<>(), false); + // Then + assertThat(images) + .isNotNull() + .singleElement() + .extracting(ImageConfiguration::getBuild) + .extracting(BuildConfiguration::getAssembly) + .hasFieldOrPropertyWithValue("targetDir", "/deployments") + .hasFieldOrPropertyWithValue("excludeFinalOutputArtifact", true) + .extracting(AssemblyConfiguration::getLayers) + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)) + .hasSize(1) + .satisfies(layers -> assertThat(layers).element(0).asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) + .extracting(Assembly::getFileSets) + .asInstanceOf(InstanceOfAssertFactories.list(AssemblyFileSet.class)) + .element(2) + .hasFieldOrPropertyWithValue("outputDirectory", new File(".")) + .extracting("includes") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) + .containsExactly("fat.jar")); + } + + @Test + @DisplayName("with custom main class, has java environment for main class") + void withCustomMainClass_hasJavaMainClassEnvVar() { + // Given + properties.put("jkube.generator.micronaut.mainClass", "org.example.Foo"); + // When + final List images = new MicronautGenerator(context) + .customize(new ArrayList<>(), false); + // Then + assertThat(images) + .singleElement(InstanceOfAssertFactories.type(ImageConfiguration.class)) + .extracting(ImageConfiguration::getBuild) + .extracting(BuildConfiguration::getEnv) + .asInstanceOf(InstanceOfAssertFactories.MAP) + .containsEntry("JAVA_MAIN_CLASS", "org.example.Foo") + .containsEntry("JAVA_APP_DIR", "/deployments"); + } + + @Test + @DisplayName("with custom port in application.properties, has overridden web port in image") + void withApplicationPortOverridden_shouldUseOverriddenWebPort() { + // Given + context = context.toBuilder() + .project(context.getProject().toBuilder() + .compileClassPathElement(Objects.requireNonNull(getClass().getResource("/utils-test/port-config/properties/")).getPath()) + .build()) + .build(); + // When + final List images = new MicronautGenerator(context) + .customize(new ArrayList<>(), false); + // Then + assertThat(images) + .singleElement() + .extracting("buildConfiguration.ports") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) + .contains("1337"); + } + } + + @Nested + @DisplayName("With Native artifact") + class Native { + + @BeforeEach + void nativeArtifact() throws IOException { + properties.put("packaging", "native-image"); + context = context.toBuilder() + .project(context.getProject().toBuilder() + .properties(properties) + .build() + ) + .build(); + File nativeArtifactFile = Files.createFile(targetDir.toPath().resolve("native-binary-artifact")).toFile(); + assertThat(nativeArtifactFile.setExecutable(true)).isTrue(); + } + + @Test + @DisplayName("creates assembly with native artifact") + void createAssembly() { + // When + final List images = new MicronautGenerator(context) + .customize(new ArrayList<>(), false); + // Then + assertThat(images) + .isNotNull() + .singleElement() + .extracting(ImageConfiguration::getBuild) + .extracting(BuildConfiguration::getAssembly) + .hasFieldOrPropertyWithValue("targetDir", "/") + .hasFieldOrPropertyWithValue("excludeFinalOutputArtifact", true) + .extracting(AssemblyConfiguration::getLayers) + .asInstanceOf(InstanceOfAssertFactories.list(Assembly.class)) + .hasSize(1) + .satisfies(layers -> assertThat(layers).element(0).asInstanceOf(InstanceOfAssertFactories.type(Assembly.class)) + .extracting(Assembly::getFileSets) + .asInstanceOf(InstanceOfAssertFactories.list(AssemblyFileSet.class)) + .element(2) + .hasFieldOrPropertyWithValue("outputDirectory", new File(".")) + .hasFieldOrPropertyWithValue("fileMode", "0755") + .extracting("includes") + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) + .containsExactly("native-binary-artifact")); + } + + @Test + @DisplayName("has image from based on UBI image") + void hasFrom() { + // When + final List images = new MicronautGenerator(context) + .customize(new ArrayList<>(), false); + // Then + assertThat(images) + .singleElement(InstanceOfAssertFactories.type(ImageConfiguration.class)) + .extracting(ImageConfiguration::getBuild) + .extracting(BuildConfiguration::getFrom) + .asString() + .startsWith("registry.access.redhat.com/ubi9/ubi-minimal:"); + } + + @Test + @DisplayName("disables Jolokia port") + void disablesJolokiaPort() { + // When + final List images = new MicronautGenerator(context) + .customize(new ArrayList<>(), false); + // Then + assertThat(images).singleElement() + .extracting("buildConfiguration.env") + .asInstanceOf(InstanceOfAssertFactories.map(String.class, String.class)) + .containsEntry("AB_JOLOKIA_OFF", "true"); + } + + @Test + @DisplayName("disables Prometheus port") + void disablesPrometheusPort() { + // When + final List images = new MicronautGenerator(context) + .customize(new ArrayList<>(), false); + // Then + assertThat(images).singleElement() + .extracting("buildConfiguration.env") + .asInstanceOf(InstanceOfAssertFactories.map(String.class, String.class)) + .containsEntry("AB_PROMETHEUS_OFF", "true"); + } + + @Test + @DisplayName("sets workDir to root directory") + void setsWorkDir() { + // When + final List result = new MicronautGenerator(context) + .customize(new ArrayList<>(), false); + // Then + assertThat(result).singleElement() + .extracting("buildConfiguration.workdir").asString() + .startsWith("/"); + } + + @Test + @DisplayName("has entrypoint pointing to native binary") + void hasCustomEntrypoint() { + // When + final List images = new MicronautGenerator(context).customize(new ArrayList<>(), false); + // Then + assertThat(images) + .isNotNull() + .singleElement() + .extracting(ImageConfiguration::getBuild) + .extracting(BuildConfiguration::getEntryPoint) + .returns(Collections.singletonList("./native-binary-artifact"), Arguments::asStrings); + } + } +} diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index d17b10e050..a11040ebed 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -107,6 +107,11 @@ registry.access.redhat.com/ubi9/ubi-minimal:${version.image.ubi-minimal} registry.access.redhat.com/ubi9/ubi-minimal:${version.image.ubi-minimal} + + registry.access.redhat.com/ubi9/ubi-minimal:${version.image.ubi-minimal} + registry.access.redhat.com/ubi9/ubi-minimal:${version.image.ubi-minimal} + registry.access.redhat.com/ubi9/ubi-minimal:${version.image.ubi-minimal} + quay.io/quarkus/ubi-quarkus-native-binary-s2i:1.0 registry.access.redhat.com/ubi9/ubi-minimal:${version.image.ubi-minimal} From 646f2e32b06c108d0b82b278fa5f412df38f81f0 Mon Sep 17 00:00:00 2001 From: Arman Yekkehkhani <72594459+arman-yekkehkhani@users.noreply.github.com> Date: Mon, 5 Aug 2024 16:14:24 +0330 Subject: [PATCH 257/289] test:refactor: split namesUsedByDockerTests into separate test methods (3293) chore(refactor namesUsedByDockerTests): split namesUsedByDockerTests method to separate tests, issue #3288 Signed-off-by: arman-yekkehkhani --- chore(refactor namesUsedByDockerTests): replace MethodSource with ValueSource, issue #3288 Signed-off-by: arman-yekkehkhani --- .../jkube/kit/config/image/ImageNameTest.java | 53 +++++++++---------- 1 file changed, 26 insertions(+), 27 deletions(-) diff --git a/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageNameTest.java b/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageNameTest.java index 16585dae1d..67170fd89b 100644 --- a/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageNameTest.java +++ b/jkube-kit/config/image/src/test/java/org/eclipse/jkube/kit/config/image/ImageNameTest.java @@ -14,16 +14,19 @@ package org.eclipse.jkube.kit.config.image; import org.apache.commons.lang3.StringUtils; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.CsvSource; import org.junit.jupiter.params.provider.MethodSource; +import org.junit.jupiter.params.provider.ValueSource; import java.util.stream.Stream; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertThrows; class ImageNameTest { @@ -135,34 +138,30 @@ void shouldThrowExceptionOnTooLongImageName() { .isThrownBy(() -> new ImageName(tooLongName)) .withMessageContaining("Repository name must not be more than 255 characters"); } - - @Test - void namesUsedByDockerTests() { - StringBuilder longTag = new StringBuilder(); - for (int i = 0; i < 130; i++) { - longTag.append("a"); - } - String[] illegal = { - "fo$z$", "Foo@3cc", "Foo$3", "Foo*3", "Fo^3", "Foo!3", "F)xcz(", "fo%asd", "FOO/bar", - "repo:fo$z$", "repo:Foo@3cc", "repo:Foo$3", "repo:Foo*3", "repo:Fo^3", "repo:Foo!3", - "repo:%goodbye", "repo:#hashtagit", "repo:F)xcz(", "repo:-foo", "repo:..","repo:" + longTag.toString(), - "-busybox:test", "-test/busybox:test", "-index:5000/busybox:test" - }; - - for (String i : illegal) { - assertThatIllegalArgumentException() - .as("Name '%s' should fail", i) - .isThrownBy(() -> new ImageName(i)); - } - - String[] legal = { - "fooo/bar", "fooaa/test", "foooo:t", "HOSTNAME.DOMAIN.COM:443/foo/bar" - }; - - for (String l : legal) { - new ImageName(l); - } + @Nested + @DisplayName("used by docker") + class UsedByDockerTests { + @ParameterizedTest + @DisplayName("illegal docker name, should throw exception") + @ValueSource(strings = { "fo$z$", "Foo@3cc", "Foo$3", "Foo*3", "Fo^3", "Foo!3", "F)xcz(", "fo%asd", "FOO/bar", + "repo:fo$z$", "repo:Foo@3cc", "repo:Foo$3", "repo:Foo*3", "repo:Fo^3", "repo:Foo!3", + "repo:%goodbye", "repo:#hashtagit", "repo:F)xcz(", "repo:-foo", "repo:..", + "-busybox:test", "-test/busybox:test", "-index:5000/busybox:test", + "repo:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + }) + void givenIllegalNames_whenCreateImageName_shouldThrowIllegalArgumentException(String name) { + assertThatIllegalArgumentException() + .as("Name '%s' should fail", name) + .isThrownBy(() -> new ImageName(name)); + } + + @ParameterizedTest + @DisplayName("legal docker name, should proceed without exception") + @ValueSource(strings = { "fooo/bar", "fooaa/test", "foooo:t", "HOSTNAME.DOMAIN.COM:443/foo/bar" }) + void givenLegalNames_whenCreateImageName_shouldNotThrowException(String name) { + assertDoesNotThrow(() -> new ImageName(name)); + } } @Test From e0b07e7ce18aabda4cb89cedabffce7de7754b43 Mon Sep 17 00:00:00 2001 From: Sadiq Ahmed Killedar <125464939+Er-Sadiq@users.noreply.github.com> Date: Mon, 5 Aug 2024 19:52:11 +0530 Subject: [PATCH 258/289] =?UTF-8?q?refactor:=20anonymous=20new=20Thread()?= =?UTF-8?q?=20can=20be=20replaced=20with=20new=20Thread(()=20->=20{?= =?UTF-8?q?=E2=80=A6})=20in=20PortForwardService=20(3300)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update PortForwardService.java and replaced it with lamda function fixed issue:#3285 --- Update PortForwardService.java and replaced it with lamda function issue:#3285fixed issue:#3285 Signed-off-by: Sadiq Ahmed Killedar --- .../kit/config/service/PortForwardService.java | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/PortForwardService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/PortForwardService.java index 20bd44673d..e70cd898b0 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/PortForwardService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/PortForwardService.java @@ -169,16 +169,14 @@ public void onClose(WatcherException e) { Thread.currentThread().interrupt(); } }; - Runtime.getRuntime().addShutdownHook(new Thread() { - @Override - public void run() { - try { - handle.close(); - } catch (Exception e) { - // suppress - } + + Runtime.getRuntime().addShutdownHook(new Thread(() -> { + try { + handle.close(); + } catch (Exception e) { + // suppress } - }); + })); return handle; } From 2b8b1fc8d5d861941e5fa9540424189eab1364f1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 07:00:44 +0200 Subject: [PATCH 259/289] chore(deps): Bump actions/setup-java from 4.2.1 to 4.2.2 Bumps [actions/setup-java](https://github.com/actions/setup-java) from 4.2.1 to 4.2.2. - [Release notes](https://github.com/actions/setup-java/releases) - [Commits](https://github.com/actions/setup-java/compare/99b8673ff64fbf99d8d325f52d9a5bdedb8483e9...6a0805fcefea3d4657a47ac4c165951e33482018) --- updated-dependencies: - dependency-name: actions/setup-java dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/license.yml | 2 +- .github/workflows/quickstarts.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/license.yml b/.github/workflows/license.yml index 34fd638370..8566647003 100644 --- a/.github/workflows/license.yml +++ b/.github/workflows/license.yml @@ -42,7 +42,7 @@ jobs: - name: Checkout uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 - name: Setup Java 11 - uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 + uses: actions/setup-java@6a0805fcefea3d4657a47ac4c165951e33482018 with: java-version: '11' distribution: 'adopt' diff --git a/.github/workflows/quickstarts.yml b/.github/workflows/quickstarts.yml index c6646b9602..f6f2f4d988 100644 --- a/.github/workflows/quickstarts.yml +++ b/.github/workflows/quickstarts.yml @@ -54,7 +54,7 @@ jobs: - name: Checkout uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 - name: Setup Java 17 - uses: actions/setup-java@99b8673ff64fbf99d8d325f52d9a5bdedb8483e9 + uses: actions/setup-java@6a0805fcefea3d4657a47ac4c165951e33482018 with: java-version: '17' distribution: 'temurin' From fc7cc6809fb1ba353514106287e1777ef364a47a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 6 Aug 2024 07:00:57 +0200 Subject: [PATCH 260/289] chore(deps): Bump step-security/harden-runner from 2.9.0 to 2.9.1 Bumps [step-security/harden-runner](https://github.com/step-security/harden-runner) from 2.9.0 to 2.9.1. - [Release notes](https://github.com/step-security/harden-runner/releases) - [Commits](https://github.com/step-security/harden-runner/compare/0d381219ddf674d61a7572ddd19d7941e271515c...5c7944e73c4c2a096b17a9cb74d65b6c2bbafbde) --- updated-dependencies: - dependency-name: step-security/harden-runner dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/license.yml | 2 +- .github/workflows/quickstarts.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/license.yml b/.github/workflows/license.yml index 8566647003..e916485613 100644 --- a/.github/workflows/license.yml +++ b/.github/workflows/license.yml @@ -29,7 +29,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@0d381219ddf674d61a7572ddd19d7941e271515c + uses: step-security/harden-runner@5c7944e73c4c2a096b17a9cb74d65b6c2bbafbde with: disable-sudo: true egress-policy: block diff --git a/.github/workflows/quickstarts.yml b/.github/workflows/quickstarts.yml index f6f2f4d988..2eb7ed474b 100644 --- a/.github/workflows/quickstarts.yml +++ b/.github/workflows/quickstarts.yml @@ -29,7 +29,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@0d381219ddf674d61a7572ddd19d7941e271515c + uses: step-security/harden-runner@5c7944e73c4c2a096b17a9cb74d65b6c2bbafbde with: disable-sudo: true egress-policy: block From 0a4787e3bbb98315b71448d941b57c38ce4840eb Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Tue, 6 Aug 2024 12:05:46 +0530 Subject: [PATCH 261/289] fix: ClusterConfiguration.getConfig should also set namespace in current context Related to failures in #3304 ClusterConfiguration `getConfig()` method converts ClusterConfiguration to a KubernetesClient Config object. It should also set namespace in current context while setting current context in Config. Signed-off-by: Rohan Kumar --- .../jkube/kit/common/access/ClusterConfiguration.java | 3 +++ .../jkube/kit/common/access/ClusterConfigurationTest.java | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/access/ClusterConfiguration.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/access/ClusterConfiguration.java index 48282a3e5c..100f01bdc2 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/access/ClusterConfiguration.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/access/ClusterConfiguration.java @@ -143,6 +143,9 @@ public Config getConfig() { if (StringUtils.isNotBlank(this.currentContext)) { configBuilder.withCurrentContext(new NamedContextBuilder() .withName(this.currentContext) + .withNewContext() + .withNamespace(getNamespace()) + .endContext() .build()); } diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/access/ClusterConfigurationTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/access/ClusterConfigurationTest.java index c6e68368c0..dff98475eb 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/access/ClusterConfigurationTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/access/ClusterConfigurationTest.java @@ -30,6 +30,7 @@ void should_load_configuration_from_properties() { final Properties properties = new Properties(); properties.put("jkube.username", "user name"); properties.put("jkube.password", "the pa$$w*rd"); + properties.put("jkube.namespace", "myns1"); properties.put("jkube.masterUrl", "https://example.com"); properties.put("jkube.corner-case", "corner"); properties.put("jkube.currentContext", "ctx1"); @@ -40,7 +41,9 @@ void should_load_configuration_from_properties() { assertThat(config).isNotNull() .hasFieldOrPropertyWithValue("username", "user name") .hasFieldOrPropertyWithValue("password", "the pa$$w*rd") - .hasFieldOrPropertyWithValue("currentContext", new NamedContextBuilder().withName("ctx1").build()) + .hasFieldOrPropertyWithValue("namespace", "myns1") + .hasFieldOrPropertyWithValue("currentContext.name", "ctx1") + .hasFieldOrPropertyWithValue("currentContext.context.namespace", "myns1") .hasFieldOrPropertyWithValue("masterUrl", "https://example.com/"); } @@ -130,7 +133,7 @@ void loadsConfigurationFromKubernetesConfig() { .hasFieldOrPropertyWithValue("clientKeyData", "clientKeyData") .hasFieldOrPropertyWithValue("clientKeyAlgo", "clientKeyAlgo") .hasFieldOrPropertyWithValue("clientKeyPassphrase", "clientKeyPassphrase") - .hasFieldOrPropertyWithValue("currentContext", new NamedContextBuilder().withName("ctx1").build()) + .hasFieldOrPropertyWithValue("currentContext", new NamedContextBuilder().withName("ctx1").withNewContext().withNamespace("namespace").endContext().build()) .hasFieldOrPropertyWithValue("trustStoreFile", "trustStoreFile") .hasFieldOrPropertyWithValue("trustStorePassphrase", "trustStorePassphrase") .hasFieldOrPropertyWithValue("keyStoreFile", "keyStoreFile") From 51987ea299bb22f453738fba95abf14ceabea100 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Tue, 6 Aug 2024 12:30:49 +0530 Subject: [PATCH 262/289] doc(micronaut): added documentation for native builds (3298) Signed-off-by: Rohan Kumar --- CHANGELOG.md | 1 + .../asciidoc/inc/generator/_micronaut.adoc | 22 ++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index caf99dbda0..b3ddb352bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Usage: ./scripts/extract-changelog-for-version.sh 1.3.37 5 ``` ### 1.17-SNAPSHOT +* Fix #494: Support for Micronaut Framework Native Images * Fix #1989: Remove storageClass related fields from VolumePermissionEnricher * Fix #2098: Add support for multi-platform container image builds in jib build strategy * Fix #2110: Add new helm dependency update goal task (`k8s:helm-dependency-update` for maven and `k8sHelmDependencyUpdate` for gradle) diff --git a/jkube-kit/doc/src/main/asciidoc/inc/generator/_micronaut.adoc b/jkube-kit/doc/src/main/asciidoc/inc/generator/_micronaut.adoc index b90e1dab9c..29c5932b06 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/generator/_micronaut.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/generator/_micronaut.adoc @@ -4,7 +4,11 @@ The Micronaut generator (named `micronaut`) detects a Micronaut project by analyzing the plugin ifeval::["{plugin-type}" == "maven"] -dependencies searching for `io.micronaut.build:micronaut-maven-plugin`. +dependencies searching for : + +- `io.micronaut.build:micronaut-maven-plugin` (for Micronaut 3) or, +- `io.micronaut.maven:micronaut-maven-plugin` (for Micronaut 4) + endif::[] ifeval::["{plugin-type}" == "gradle"] dependencies searching for `io.micronaut.application:io.micronaut.application.gradle.plugin`. @@ -12,3 +16,19 @@ endif::[] This generator is based on the <> Generator and inherits all of its configuration values. + +The base images chosen are the following, however, these can be overridden using `jkube.generator.from` property: +[[generator-micronaut-from]] +.Webapp Base Images +[cols="1,4,4"] +|=== +| | Docker Build | S2I Build + +| *Native* +| `registry.access.redhat.com/ubi9/ubi-minimal:9.3` +| `registry.access.redhat.com/ubi9/ubi-minimal:9.3` + +| *Normal Build* +| `quay.io/jkube/jkube-java` +| `quay.io/jkube/jkube-java` +|=== From 6ca5629b4f5c72bc66d4b11466f68d1805b25ae9 Mon Sep 17 00:00:00 2001 From: Mohammed Faizan Date: Wed, 7 Aug 2024 18:51:10 +0530 Subject: [PATCH 263/289] 'content[i + 1].length() > 0' replaced with '!content[i + 1].isEmpty()' in RegistryAuthConfiguration (3308) --- .../jkube/kit/config/image/build/RegistryAuthConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/RegistryAuthConfiguration.java b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/RegistryAuthConfiguration.java index 4747b0702e..7cddab8980 100644 --- a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/RegistryAuthConfiguration.java +++ b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/build/RegistryAuthConfiguration.java @@ -53,7 +53,7 @@ public Map toMap() { "email", email }; for (int i = 0; i < content.length; i += 2) { - if (content[i + 1] != null && content[i + 1].length() > 0) { + if (content[i + 1] != null && !content[i + 1].isEmpty()) { authMap.put(content[i], content[i+1]); } } From 4618b456f8dd6a1695dc3ab7fd92ca4a363679b5 Mon Sep 17 00:00:00 2001 From: vijaybhagwat24 Date: Wed, 7 Aug 2024 19:02:13 +0530 Subject: [PATCH 264/289] test: HelmServiceInstallIT tests work on Windows (3277) issue-3265:-HelmServiceInstallIT test case failure fix --- issue-3265: File separator added in place of string separator --- .../eclipse/jkube/kit/resource/helm/HelmServiceInstallIT.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceInstallIT.java b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceInstallIT.java index 0c0e3e0733..3cd686e09b 100644 --- a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceInstallIT.java +++ b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceInstallIT.java @@ -180,6 +180,6 @@ void whenDependencyReferencedDoesNotExist_thenThrowException() throws IOExceptio // When + Then assertThatIllegalStateException() .isThrownBy(() -> helmService.install(helmConfig)) - .withMessage(String.format("An error occurred while updating chart dependencies: directory %s/the-dependency not found", tempDir)); + .withMessage(String.format("An error occurred while updating chart dependencies: directory %s%sthe-dependency not found", tempDir,File.separator)); } } From 4ff6ff6bb33e05257dda30c102b1632ab3f23271 Mon Sep 17 00:00:00 2001 From: Shivam <96533413+ShivamChavan01@users.noreply.github.com> Date: Wed, 7 Aug 2024 19:04:32 +0530 Subject: [PATCH 265/289] fix: replace AssertJ's deprecated asList() DSL method in WebAppGeneratorTest (3302) Issue #3286: Replace deprecated asList() in Web App Generator Test --- Removed the unused Imports --- Used Only Imports which are required --- .../jkube/generator/webapp/WebAppGeneratorTest.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/jkube-kit/generator/webapp/src/test/java/org/eclipse/jkube/generator/webapp/WebAppGeneratorTest.java b/jkube-kit/generator/webapp/src/test/java/org/eclipse/jkube/generator/webapp/WebAppGeneratorTest.java index 508439c9bb..797c363247 100644 --- a/jkube-kit/generator/webapp/src/test/java/org/eclipse/jkube/generator/webapp/WebAppGeneratorTest.java +++ b/jkube-kit/generator/webapp/src/test/java/org/eclipse/jkube/generator/webapp/WebAppGeneratorTest.java @@ -23,9 +23,12 @@ import java.util.List; import java.util.Map; import java.util.Properties; + +import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.generator.api.GeneratorContext; -import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.AssemblyFile; +import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.Plugin; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; @@ -126,7 +129,7 @@ void withDefaultHandler_shouldAddImageConfiguration() throws IOException { }}) .extracting(BuildConfiguration::getAssembly) .hasFieldOrPropertyWithValue("excludeFinalOutputArtifact", true) - .extracting("inline.files").asList().extracting("destName") + .extracting("inline.files").asInstanceOf(InstanceOfAssertFactories.list(AssemblyFile.class)).extracting("destName") .containsExactly("ROOT.war"); } @@ -172,7 +175,7 @@ void withOverriddenProperties_shouldAddImageConfiguration() throws IOException { .extracting(BuildConfiguration::getAssembly) .hasFieldOrPropertyWithValue("excludeFinalOutputArtifact", true) .hasFieldOrPropertyWithValue("user", "root") - .extracting("inline.files").asList().extracting("destName") + .extracting("inline.files").asInstanceOf(InstanceOfAssertFactories.list(AssemblyFile.class)).extracting("destName") .containsExactly("some-context.war"); } From 1d2ca4a6b61d70038f510a0be3e7d6178f0824d3 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Thu, 8 Aug 2024 12:22:28 +0530 Subject: [PATCH 266/289] feat(helm): HelmService exposes Helm uninstall functionality (3304) Signed-off-by: Rohan Kumar --- .../jkube/kit/resource/helm/HelmService.java | 18 ++- .../resource/helm/HelmServiceUninstallIT.java | 114 ++++++++++++++++++ 2 files changed, 128 insertions(+), 4 deletions(-) create mode 100644 jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUninstallIT.java diff --git a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java index dd77f671d2..9198293d36 100644 --- a/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java +++ b/jkube-kit/helm/src/main/java/org/eclipse/jkube/kit/resource/helm/HelmService.java @@ -40,8 +40,7 @@ import com.marcnuri.helm.LintCommand; import com.marcnuri.helm.LintResult; import com.marcnuri.helm.Release; -import io.fabric8.kubernetes.client.KubernetesClient; -import io.fabric8.kubernetes.client.KubernetesClientBuilder; +import com.marcnuri.helm.UninstallCommand; import org.eclipse.jkube.kit.common.JKubeConfiguration; import org.eclipse.jkube.kit.common.JKubeException; import org.eclipse.jkube.kit.common.KitLogger; @@ -87,6 +86,7 @@ public class HelmService { private static final String VALUES_FRAGMENT_REGEX = "^values\\.helm\\.(?yaml|yml|json)$"; public static final Pattern VALUES_FRAGMENT_PATTERN = Pattern.compile(VALUES_FRAGMENT_REGEX, Pattern.CASE_INSENSITIVE); + private static final String SYSTEM_LINE_SEPARATOR_REGEX = "\r?\n"; private final JKubeConfiguration jKubeConfiguration; private final ResourceServiceConfig resourceServiceConfig; @@ -190,7 +190,7 @@ public void dependencyUpdate(HelmConfig helmConfig) { dependencyUpdateCommand.skipRefresh(); } Arrays.stream(dependencyUpdateCommand.call() - .split("\r?\n")) + .split(SYSTEM_LINE_SEPARATOR_REGEX)) .forEach(l -> logger.info("[[W]]%s", l)); } } @@ -222,12 +222,22 @@ public void install(HelmConfig helmConfig) { Arrays.stream(release.getOutput().split("---")) .filter(o -> o.contains("Deleting outdated charts")) .findFirst() - .ifPresent(s -> Arrays.stream(s.split("\r?\n")) + .ifPresent(s -> Arrays.stream(s.split(SYSTEM_LINE_SEPARATOR_REGEX)) .filter(StringUtils::isNotBlank) .forEach(l -> logger.info("[[W]]%s", l))); } } + public void uninstall(HelmConfig helmConfig) { + logger.info("Uninstalling Helm Chart %s %s", helmConfig.getChart(), helmConfig.getVersion()); + UninstallCommand uninstallCommand = Helm.uninstall(helmConfig.getReleaseName()) + .withKubeConfig(createTemporaryKubeConfigForInstall()); + + Arrays.stream(uninstallCommand.call().split(SYSTEM_LINE_SEPARATOR_REGEX)) + .filter(StringUtils::isNotBlank) + .forEach(l -> logger.info("[[W]]%s", l)); + } + private Path createTemporaryKubeConfigForInstall() { try { File kubeConfigParentDir = new File(jKubeConfiguration.getProject().getBuildDirectory(), "jkube-temp"); diff --git a/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUninstallIT.java b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUninstallIT.java new file mode 100644 index 0000000000..520fd8357c --- /dev/null +++ b/jkube-kit/helm/src/test/java/org/eclipse/jkube/kit/resource/helm/HelmServiceUninstallIT.java @@ -0,0 +1,114 @@ +/* + * 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.resource.helm; + +import io.fabric8.kubernetes.api.model.Secret; +import io.fabric8.kubernetes.api.model.SecretListBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; +import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; +import io.fabric8.openshift.api.model.Template; +import org.eclipse.jkube.kit.common.JKubeConfiguration; +import org.eclipse.jkube.kit.common.JavaProject; +import org.eclipse.jkube.kit.common.KitLogger; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; +import org.eclipse.jkube.kit.common.util.Serialization; +import org.eclipse.jkube.kit.config.resource.ResourceServiceConfig; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.File; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Collections; +import java.util.Objects; + +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.eclipse.jkube.kit.common.util.KubernetesMockServerUtil.prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +@DisplayName("HelmService.uninstall") +@EnableKubernetesMockClient(crud = true) +class HelmServiceUninstallIT { + @TempDir + private Path tempDir; + private HelmConfig helmConfig; + private HelmService helmService; + private KitLogger kitLogger; + private KubernetesClient kubernetesClient; + private KubernetesMockServer server; + + @BeforeEach + void setUp() throws URISyntaxException, IOException { + kitLogger = spy(new KitLogger.SilentLogger()); + Template helmParameterTemplates = Serialization.unmarshal(HelmServiceUninstallIT.class.getResource("/it/sources/global-template.yml"), Template.class); + Path outputDir = tempDir.resolve("output"); + helmConfig = HelmConfig.builder() + .chart("helm-test") + .version("0.1.0") + .chartExtension("tgz") + .types(Collections.singletonList(HelmConfig.HelmType.KUBERNETES)) + .tarballOutputDir(outputDir.toFile().getAbsolutePath()) + .outputDir(outputDir.toString()) + .parameterTemplates(Collections.singletonList(helmParameterTemplates)) + .sourceDir(new File(Objects.requireNonNull(HelmServiceUninstallIT.class.getResource("/it/sources")).toURI()).getAbsolutePath()) + .releaseName("test-project") + .disableOpenAPIValidation(true) + .parameters(Arrays.asList( + HelmParameter.builder().name("annotation_from_config").value("{{ .Chart.Name | upper }}").build(), + HelmParameter.builder().name("annotation.from.config.dotted").value("{{ .Chart.Name }}").build(), + HelmParameter.builder().name("deployment.replicas").value(1).build())) + .build(); + // Remove after https://github.com/fabric8io/kubernetes-client/issues/6062 is fixed + prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints(server); + helmService = new HelmService(JKubeConfiguration.builder() + .project(JavaProject.builder() + .buildDirectory(tempDir.resolve("target").toFile()) + .build()) + .clusterConfiguration(ClusterConfiguration.from(kubernetesClient.getConfiguration()).build()) + .build(), new ResourceServiceConfig(), kitLogger); + } + + @Test + @DisplayName("uninstall invoked, then log uninstallation details after uninstall") + void uninstall_thenLogUninstalledChartDetails() throws IOException { + // Given + helmService.generateHelmCharts(helmConfig); + helmService.install(helmConfig); + Secret secret = kubernetesClient.secrets().withName("sh.helm.release.v1.test-project.v1").get(); + server.expect().get().withPath("/api/v1/namespaces/test/secrets?labelSelector=name%3Dtest-project%2Cowner%3Dhelm") + .andReturn(200, new SecretListBuilder() + .addToItems(secret) + .build()) + .once(); + // When + helmService.uninstall(helmConfig); + // Then + verify(kitLogger, times(1)).info("[[W]]%s", "release \"test-project\" uninstalled"); + } + + @Test + @DisplayName("when chart not present, then uninstall fails") + void chartAbsent_thenLogChartUninstallFailure() { + assertThatIllegalStateException() + .isThrownBy(() -> helmService.uninstall(helmConfig)) + .withMessageContaining(" not found"); + } +} From 729dc8a0e201499b7fde995d7e61a7de8da110ae Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Fri, 9 Aug 2024 10:51:14 +0530 Subject: [PATCH 267/289] feat(helm): Helm Uninstall functionality exposed via Maven Mojos / Gradle Tasks Signed-off-by: Rohan Kumar --- .../jkube/gradle/plugin/KubernetesPlugin.java | 3 + .../task/KubernetesHelmUninstallTask.java | 36 ++++++ .../gradle/plugin/KubernetesPluginTest.java | 6 +- .../task/KubernetesHelmUninstallTaskTest.java | 108 ++++++++++++++++ .../jkube/gradle/plugin/OpenShiftPlugin.java | 4 + .../task/OpenShiftHelmUninstallTask.java | 26 ++++ .../gradle/plugin/OpenShiftPluginTest.java | 7 +- .../task/OpenShiftHelmUninstallTaskTest.java | 108 ++++++++++++++++ .../plugin/mojo/build/HelmUninstallMojo.java | 27 ++++ .../mojo/GeneratedPluginDescriptorTest.java | 3 +- .../mojo/build/HelmUninstallMojoTest.java | 117 ++++++++++++++++++ .../build/OpenshiftHelmUninstallMojo.java | 52 ++++++++ ...penShiftGeneratedPluginDescriptorTest.java | 3 +- .../build/OpenShiftHelmUninstallMojoTest.java | 117 ++++++++++++++++++ 14 files changed, 611 insertions(+), 6 deletions(-) create mode 100644 gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmUninstallTask.java create mode 100644 gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmUninstallTaskTest.java create mode 100644 gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmUninstallTask.java create mode 100644 gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmUninstallTaskTest.java create mode 100644 kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmUninstallMojo.java create mode 100644 kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmUninstallMojoTest.java create mode 100644 openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmUninstallMojo.java create mode 100644 openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftHelmUninstallMojoTest.java diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesPlugin.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesPlugin.java index d7f8b1e0a0..880b80bc3d 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesPlugin.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/KubernetesPlugin.java @@ -28,6 +28,7 @@ import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmLintTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmPushTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmTask; +import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmUninstallTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesLogTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesPushTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesRemoteDevTask; @@ -55,6 +56,7 @@ public Map>> getTaskPrecedence() { ret.put("k8sHelmLint", Collections.singletonList(KubernetesHelmTask.class)); ret.put("k8sHelmDependencyUpdate", Collections.singletonList(KubernetesHelmTask.class)); ret.put("k8sHelmInstall", Collections.singletonList(KubernetesHelmTask.class)); + ret.put("k8sHelmUninstall", Arrays.asList(KubernetesHelmTask.class, KubernetesHelmInstallTask.class)); return ret; } @@ -73,6 +75,7 @@ protected void jKubeApply(Project project) { register(project, "k8sHelmLint", KubernetesHelmLintTask.class); register(project, "k8sHelmDependencyUpdate", KubernetesHelmDependencyUpdateTask.class); register(project, "k8sHelmInstall", KubernetesHelmInstallTask.class); + register(project, "k8sHelmUninstall", KubernetesHelmUninstallTask.class); register(project, "k8sRemoteDev", KubernetesRemoteDevTask.class); register(project, "k8sWatch", KubernetesWatchTask.class); } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmUninstallTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmUninstallTask.java new file mode 100644 index 0000000000..52851902f7 --- /dev/null +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmUninstallTask.java @@ -0,0 +1,36 @@ +/* + * 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.gradle.plugin.task; + +import org.eclipse.jkube.gradle.plugin.KubernetesExtension; + +import javax.inject.Inject; + +public class KubernetesHelmUninstallTask extends AbstractHelmTask { + @Inject + public KubernetesHelmUninstallTask(Class extensionClass) { + super(extensionClass); + setDescription("Uninstalls the Helm release from Kubernetes cluster"); + } + + @Override + public void run() { + try { + jKubeServiceHub.getHelmService().uninstall(kubernetesExtension.helm); + } catch (Exception exp) { + kitLogger.error("Error performing helm uninstall", exp); + throw new IllegalStateException(exp.getMessage(), exp); + } + } +} \ No newline at end of file diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/KubernetesPluginTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/KubernetesPluginTest.java index ebe8735210..45fd92b232 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/KubernetesPluginTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/KubernetesPluginTest.java @@ -22,6 +22,7 @@ import org.eclipse.jkube.gradle.plugin.task.JKubeTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesApplyTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesBuildTask; +import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmInstallTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesResourceTask; @@ -81,7 +82,7 @@ void getTaskPrecedence_withValidProject_shouldReturnTaskPrecedence() { final Map>> result = new KubernetesPlugin().getTaskPrecedence(); // Then assertThat(result) - .hasSize(8) + .hasSize(9) .containsEntry("k8sApply", Collections.singletonList(KubernetesResourceTask.class)) .containsEntry("k8sDebug", Arrays.asList(KubernetesBuildTask.class, KubernetesResourceTask.class, KubernetesApplyTask.class)) @@ -90,6 +91,7 @@ void getTaskPrecedence_withValidProject_shouldReturnTaskPrecedence() { .containsEntry("k8sHelmDependencyUpdate", Collections.singletonList(KubernetesHelmTask.class)) .containsEntry("k8sHelmPush", Collections.singletonList(KubernetesHelmTask.class)) .containsEntry("k8sHelmLint", Collections.singletonList(KubernetesHelmTask.class)) - .containsEntry("k8sHelmInstall", Collections.singletonList(KubernetesHelmTask.class)); + .containsEntry("k8sHelmInstall", Collections.singletonList(KubernetesHelmTask.class)) + .containsEntry("k8sHelmUninstall", Arrays.asList(KubernetesHelmTask.class, KubernetesHelmInstallTask.class)); } } diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmUninstallTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmUninstallTaskTest.java new file mode 100644 index 0000000000..507a148e12 --- /dev/null +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesHelmUninstallTaskTest.java @@ -0,0 +1,108 @@ +/* + * 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.gradle.plugin.task; + +import com.marcnuri.helm.Helm; +import io.fabric8.kubernetes.api.model.Secret; +import io.fabric8.kubernetes.api.model.SecretListBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; +import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; +import org.apache.commons.io.FileUtils; +import org.eclipse.jkube.gradle.plugin.KubernetesExtension; +import org.eclipse.jkube.gradle.plugin.TestKubernetesExtension; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; +import org.eclipse.jkube.kit.resource.helm.HelmConfig; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.eclipse.jkube.kit.common.util.KubernetesMockServerUtil.prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@EnableKubernetesMockClient(crud = true) +class KubernetesHelmUninstallTaskTest { + @RegisterExtension + private final TaskEnvironmentExtension taskEnvironment = new TaskEnvironmentExtension(); + private KubernetesClient kubernetesClient; + private KubernetesMockServer server; + private TestKubernetesExtension extension; + + @BeforeEach + void setUp() throws IOException { + extension = new TestKubernetesExtension(); + // Remove after https://github.com/fabric8io/kubernetes-client/issues/6062 is fixed + prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints(server); + Helm.create().withDir(taskEnvironment.getRoot().toPath()).withName("empty-project").call(); + Path helmChartOutputDir = taskEnvironment.getRoot().toPath().resolve("build").resolve("jkube").resolve("helm"); + Files.createDirectories(helmChartOutputDir.resolve("kubernetes")); + FileUtils.copyDirectory(taskEnvironment.getRoot().toPath().resolve("empty-project").toFile(), helmChartOutputDir.resolve("kubernetes").toFile()); + System.setProperty("jkube.kubernetesTemplate", taskEnvironment.getRoot().getAbsolutePath()); + extension.helm = HelmConfig.builder() + .chartExtension("tgz") + .disableOpenAPIValidation(true) + .outputDir(helmChartOutputDir.toString()).build(); + extension.access = ClusterConfiguration.from(kubernetesClient.getConfiguration()).build(); + extension.isUseColor = false; + when(taskEnvironment.project.getName()).thenReturn("empty-project"); + when(taskEnvironment.project.getVersion()).thenReturn("0.1.0"); + when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); + } + + @AfterEach + void tearDown() { + System.clearProperty("jkube.kubernetesTemplate"); + } + + @Test + @DisplayName("when Helm Release Installed on Kubernetes Cluster, then uninstall Helm Release") + void runTask_withHelmReleasePresentInKubernetesCluster_shouldSucceed() { + // Given + KubernetesHelmUninstallTask kubernetesHelmUninstallTask = new KubernetesHelmUninstallTask(KubernetesExtension.class); + kubernetesHelmUninstallTask.init(); + kubernetesHelmUninstallTask.jKubeServiceHub.getHelmService().install(extension.helm); + // Should be removed once https://github.com/fabric8io/kubernetes-client/issues/6220 gets fixed + Secret secret = kubernetesClient.secrets().withName("sh.helm.release.v1.empty-project.v1").get(); + server.expect().get().withPath("/api/v1/namespaces/test/secrets?labelSelector=name%3Dempty-project%2Cowner%3Dhelm") + .andReturn(200, new SecretListBuilder() + .addToItems(secret) + .build()) + .once(); + + // When + kubernetesHelmUninstallTask.runTask(); + // Then + verify(taskEnvironment.logger).lifecycle("k8s: release \"empty-project\" uninstalled"); + } + + @Test + @DisplayName("Helm Release not installed on Kubernetes cluster, then throw exception") + void execute_whenReleaseNotPresent_thenThrowException() { + // Given + KubernetesHelmUninstallTask kubernetesHelmUninstallTask = new KubernetesHelmUninstallTask(KubernetesExtension.class); + + // When + Then + assertThatIllegalStateException() + .isThrownBy(kubernetesHelmUninstallTask::runTask) + .withMessageContaining(" not found"); + } +} diff --git a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/OpenShiftPlugin.java b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/OpenShiftPlugin.java index 2425ab206c..bb08da4587 100644 --- a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/OpenShiftPlugin.java +++ b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/OpenShiftPlugin.java @@ -21,6 +21,7 @@ import org.eclipse.jkube.gradle.plugin.task.KubernetesApplyTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesBuildTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesConfigViewTask; +import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmInstallTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesLogTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesResourceTask; @@ -32,6 +33,7 @@ import org.eclipse.jkube.gradle.plugin.task.OpenShiftHelmLintTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftHelmPushTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftHelmTask; +import org.eclipse.jkube.gradle.plugin.task.OpenShiftHelmUninstallTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftPushTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftRemoteDevTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftResourceTask; @@ -59,6 +61,7 @@ public Map>> getTaskPrecedence() { ret.put("ocHelmLint", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)); ret.put("ocHelmDependencyUpdate", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)); ret.put("ocHelmInstall", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)); + ret.put("ocHelmUninstall", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class, KubernetesHelmInstallTask.class, OpenShiftHelmInstallTask.class)); return ret; } @@ -77,6 +80,7 @@ protected void jKubeApply(Project project) { register(project, "ocHelmLint", OpenShiftHelmLintTask.class); register(project, "ocHelmDependencyUpdate", OpenShiftHelmDependencyUpdateTask.class); register(project, "ocHelmInstall", OpenShiftHelmInstallTask.class); + register(project, "ocHelmUninstall", OpenShiftHelmUninstallTask.class); register(project, "ocRemoteDev", OpenShiftRemoteDevTask.class); register(project, "ocWatch", OpenShiftWatchTask.class); } diff --git a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmUninstallTask.java b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmUninstallTask.java new file mode 100644 index 0000000000..b78c94cf7d --- /dev/null +++ b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmUninstallTask.java @@ -0,0 +1,26 @@ +/* + * 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.gradle.plugin.task; + +import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; + +import javax.inject.Inject; + +public class OpenShiftHelmUninstallTask extends KubernetesHelmUninstallTask implements OpenShiftJKubeTask { + @Inject + public OpenShiftHelmUninstallTask(Class extensionClass) { + super(extensionClass); + setDescription("Uninstalls the Helm release from OpenShift cluster"); + } +} diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/OpenShiftPluginTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/OpenShiftPluginTest.java index ce30318314..7fa7409b26 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/OpenShiftPluginTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/OpenShiftPluginTest.java @@ -19,10 +19,12 @@ import org.eclipse.jkube.gradle.plugin.task.KubernetesApplyTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesBuildTask; +import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmInstallTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesHelmTask; import org.eclipse.jkube.gradle.plugin.task.KubernetesResourceTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftApplyTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftBuildTask; +import org.eclipse.jkube.gradle.plugin.task.OpenShiftHelmInstallTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftHelmTask; import org.eclipse.jkube.gradle.plugin.task.OpenShiftResourceTask; @@ -39,7 +41,7 @@ void configurePrecedence_withValidProject_shouldReturnTaskPrecedence() { final Map>> result = new OpenShiftPlugin().getTaskPrecedence(); // Then assertThat(result) - .hasSize(8) + .hasSize(9) .containsEntry("ocApply", Arrays.asList(KubernetesResourceTask.class, OpenShiftResourceTask.class)) .containsEntry("ocDebug", Arrays.asList(KubernetesBuildTask.class, OpenShiftBuildTask.class, KubernetesResourceTask.class, OpenShiftResourceTask.class, KubernetesApplyTask.class, OpenShiftApplyTask.class)) @@ -48,6 +50,7 @@ void configurePrecedence_withValidProject_shouldReturnTaskPrecedence() { .containsEntry("ocHelmDependencyUpdate", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)) .containsEntry("ocHelmPush", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)) .containsEntry("ocHelmLint", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)) - .containsEntry("ocHelmInstall", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)); + .containsEntry("ocHelmInstall", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class)) + .containsEntry("ocHelmUninstall", Arrays.asList(KubernetesHelmTask.class, OpenShiftHelmTask.class, KubernetesHelmInstallTask.class, OpenShiftHelmInstallTask.class)); } } diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmUninstallTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmUninstallTaskTest.java new file mode 100644 index 0000000000..ce5a7d1567 --- /dev/null +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftHelmUninstallTaskTest.java @@ -0,0 +1,108 @@ +/* + * 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.gradle.plugin.task; + +import com.marcnuri.helm.Helm; +import io.fabric8.kubernetes.api.model.Secret; +import io.fabric8.kubernetes.api.model.SecretListBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; +import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; +import org.apache.commons.io.FileUtils; +import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; +import org.eclipse.jkube.gradle.plugin.TestOpenShiftExtension; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; +import org.eclipse.jkube.kit.resource.helm.HelmConfig; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.RegisterExtension; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.eclipse.jkube.kit.common.util.KubernetesMockServerUtil.prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@EnableKubernetesMockClient(crud = true) +class OpenShiftHelmUninstallTaskTest { + @RegisterExtension + private final TaskEnvironmentExtension taskEnvironment = new TaskEnvironmentExtension(); + private KubernetesClient kubernetesClient; + private KubernetesMockServer server; + private TestOpenShiftExtension extension; + + @BeforeEach + void setUp() throws IOException { + extension = new TestOpenShiftExtension(); + // Remove after https://github.com/fabric8io/kubernetes-client/issues/6062 is fixed + prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints(server); + Helm.create().withDir(taskEnvironment.getRoot().toPath()).withName("empty-project").call(); + Path helmChartOutputDir = taskEnvironment.getRoot().toPath().resolve("build").resolve("jkube").resolve("helm"); + Files.createDirectories(helmChartOutputDir.resolve("openshift")); + FileUtils.copyDirectory(taskEnvironment.getRoot().toPath().resolve("empty-project").toFile(), helmChartOutputDir.resolve("openshift").toFile()); + System.setProperty("jkube.kubernetesTemplate", taskEnvironment.getRoot().getAbsolutePath()); + extension.helm = HelmConfig.builder() + .chartExtension("tgz") + .disableOpenAPIValidation(true) + .outputDir(helmChartOutputDir.toString()).build(); + extension.access = ClusterConfiguration.from(kubernetesClient.getConfiguration()).build(); + extension.isUseColor = false; + when(taskEnvironment.project.getName()).thenReturn("empty-project"); + when(taskEnvironment.project.getVersion()).thenReturn("0.1.0"); + when(taskEnvironment.project.getExtensions().getByType(OpenShiftExtension.class)).thenReturn(extension); + } + + @AfterEach + void tearDown() { + System.clearProperty("jkube.kubernetesTemplate"); + } + + @Test + @DisplayName("when Helm Release Installed on Kubernetes Cluster, then uninstall Helm Release") + void runTask_withHelmReleasePresentInKubernetesCluster_shouldSucceed() { + // Given + OpenShiftHelmUninstallTask openShiftHelmUninstallTask = new OpenShiftHelmUninstallTask(OpenShiftExtension.class); + openShiftHelmUninstallTask.init(); + openShiftHelmUninstallTask.jKubeServiceHub.getHelmService().install(extension.helm); + // Should be removed once https://github.com/fabric8io/kubernetes-client/issues/6220 gets fixed + Secret secret = kubernetesClient.secrets().withName("sh.helm.release.v1.empty-project.v1").get(); + server.expect().get().withPath("/api/v1/namespaces/test/secrets?labelSelector=name%3Dempty-project%2Cowner%3Dhelm") + .andReturn(200, new SecretListBuilder() + .addToItems(secret) + .build()) + .once(); + + // When + openShiftHelmUninstallTask.runTask(); + // Then + verify(taskEnvironment.logger).lifecycle("oc: release \"empty-project\" uninstalled"); + } + + @Test + @DisplayName("Helm Release not installed on Kubernetes cluster, then throw exception") + void execute_whenReleaseNotPresent_thenThrowException() { + // Given + OpenShiftHelmUninstallTask openShiftHelmUninstallTask = new OpenShiftHelmUninstallTask(OpenShiftExtension.class); + + // When + Then + assertThatIllegalStateException() + .isThrownBy(openShiftHelmUninstallTask::runTask) + .withMessageContaining(" not found"); + } +} diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmUninstallMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmUninstallMojo.java new file mode 100644 index 0000000000..3399b55295 --- /dev/null +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmUninstallMojo.java @@ -0,0 +1,27 @@ +/* + * 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.maven.plugin.mojo.build; + +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.ResolutionScope; + +@Mojo(name = "helm-uninstall", defaultPhase = LifecyclePhase.INSTALL, requiresDependencyResolution = ResolutionScope.COMPILE) +public class HelmUninstallMojo extends AbstractHelmMojo { + @Override + public void executeInternal() throws MojoExecutionException { + jkubeServiceHub.getHelmService().uninstall(getHelm()); + } +} diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/GeneratedPluginDescriptorTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/GeneratedPluginDescriptorTest.java index e3e94a1f37..eb6243f466 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/GeneratedPluginDescriptorTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/GeneratedPluginDescriptorTest.java @@ -57,7 +57,8 @@ static Stream data() { arguments("helm-dependency-update", "compile", "integration-test"), arguments("helm-push", "compile", "install"), arguments("helm-lint", "compile", "integration-test"), - arguments("helm-install", "compile", "install")); + arguments("helm-install", "compile", "install"), + arguments("helm-uninstall", "compile", "install")); } @DisplayName("verify, phase and required dependency resolution") diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmUninstallMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmUninstallMojoTest.java new file mode 100644 index 0000000000..2cb4f2e294 --- /dev/null +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmUninstallMojoTest.java @@ -0,0 +1,117 @@ +/* + * 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.maven.plugin.mojo.build; + +import com.marcnuri.helm.Helm; +import io.fabric8.kubernetes.api.model.Secret; +import io.fabric8.kubernetes.api.model.SecretListBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; +import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; +import org.apache.commons.io.FileUtils; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.project.MavenProject; +import org.apache.maven.settings.Settings; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; +import org.eclipse.jkube.kit.resource.helm.HelmConfig; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.nio.file.Files; +import java.nio.file.Path; + +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; +import static org.eclipse.jkube.kit.common.util.KubernetesMockServerUtil.prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints; + +@EnableKubernetesMockClient(crud = true) +class HelmUninstallMojoTest { + @TempDir + private Path projectDir; + private PrintStream originalPrintStream; + private ByteArrayOutputStream outputStream; + private HelmUninstallMojo helmUninstallMojo; + private KubernetesClient kubernetesClient; + private KubernetesMockServer server; + + @BeforeEach + void setUp() throws Exception { + originalPrintStream = System.out; + // Remove after https://github.com/fabric8io/kubernetes-client/issues/6062 is fixed + prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints(server); + outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + Helm.create().withDir(projectDir).withName("empty-project").call(); + Path helmChartOutputDir = projectDir.resolve("target").resolve("jkube").resolve("helm"); + Files.createDirectories(helmChartOutputDir.resolve("kubernetes")); + FileUtils.copyDirectory(projectDir.resolve("empty-project").toFile(), helmChartOutputDir.resolve("kubernetes").toFile()); + System.setProperty("jkube.kubernetesTemplate", projectDir.toFile().getAbsolutePath()); + helmUninstallMojo = new HelmUninstallMojo(); + helmUninstallMojo.helm = HelmConfig.builder().chartExtension("tgz") + .outputDir(helmChartOutputDir.toString()) + .disableOpenAPIValidation(true) + .build(); + helmUninstallMojo.access = ClusterConfiguration.from(kubernetesClient.getConfiguration()).build(); + helmUninstallMojo.interpolateTemplateParameters = true; + helmUninstallMojo.settings = new Settings(); + helmUninstallMojo.project = new MavenProject(); + helmUninstallMojo.project.setVersion("0.1.0"); + helmUninstallMojo.project.getBuild() + .setOutputDirectory(projectDir.resolve("target").resolve("classes").toFile().getAbsolutePath()); + helmUninstallMojo.project.getBuild().setDirectory(projectDir.resolve("target").toFile().getAbsolutePath()); + helmUninstallMojo.project.setFile(projectDir.resolve("target").toFile()); + } + + @AfterEach + void tearDown() { + System.setOut(originalPrintStream); + System.clearProperty("jkube.kubernetesTemplate"); + helmUninstallMojo = null; + } + + @Test + @DisplayName("Helm release installed on Kuberentes cluster, then uninstall helm release") + void execute_whenReleasePresent_shouldUninstallChartFromKubernetesCluster() throws MojoExecutionException, MojoFailureException { + // Given + helmUninstallMojo.init(); + helmUninstallMojo.jkubeServiceHub.getHelmService().install(helmUninstallMojo.helm); + // Should be removed once https://github.com/fabric8io/kubernetes-client/issues/6220 gets fixed + Secret secret = kubernetesClient.secrets().withName("sh.helm.release.v1.empty-project.v1").get(); + server.expect().get().withPath("/api/v1/namespaces/test/secrets?labelSelector=name%3Dempty-project%2Cowner%3Dhelm") + .andReturn(200, new SecretListBuilder() + .addToItems(secret) + .build()) + .once(); + // When + helmUninstallMojo.execute(); + // Then + assertThat(outputStream.toString()) + .contains("release \"empty-project\" uninstalled"); + } + + @Test + @DisplayName("Helm Release not installed on Kubernetes cluster, then throw exception") + void execute_whenReleaseNotPresent_thenThrowException() { + assertThatIllegalStateException() + .isThrownBy(() -> helmUninstallMojo.execute()) + .withMessageContaining(" not found"); + } +} diff --git a/openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmUninstallMojo.java b/openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmUninstallMojo.java new file mode 100644 index 0000000000..c6baffc09a --- /dev/null +++ b/openshift-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenshiftHelmUninstallMojo.java @@ -0,0 +1,52 @@ +/* + * 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.maven.plugin.mojo.build; + +import org.apache.maven.plugins.annotations.LifecyclePhase; +import org.apache.maven.plugins.annotations.Mojo; +import org.apache.maven.plugins.annotations.Parameter; +import org.apache.maven.plugins.annotations.ResolutionScope; +import org.eclipse.jkube.kit.resource.helm.HelmConfig; +import org.eclipse.jkube.maven.plugin.mojo.OpenShift; + +import java.io.File; + +@Mojo(name = "helm-uninstall", defaultPhase = LifecyclePhase.INSTALL, requiresDependencyResolution = ResolutionScope.COMPILE) +public class OpenshiftHelmUninstallMojo extends HelmUninstallMojo { + /** + * One of: + *
    + *
  • A directory containing OpenShift Templates to use as Helm parameters.
  • + *
  • A file containing a Kubernetes List with OpenShift Template entries to be used as Helm parameters.
  • + *
+ */ + @Parameter(property = "jkube.openshiftTemplate", defaultValue = "${basedir}/target/classes/META-INF/jkube/openshift") + private File openShiftTemplate; + + + @Override + protected File getKubernetesTemplate() { + return openShiftTemplate; + } + + @Override + protected HelmConfig.HelmType getDefaultHelmType() { + return HelmConfig.HelmType.OPENSHIFT; + } + + @Override + protected String getLogPrefix() { + return OpenShift.DEFAULT_LOG_PREFIX; + } +} diff --git a/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/OpenShiftGeneratedPluginDescriptorTest.java b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/OpenShiftGeneratedPluginDescriptorTest.java index da9ce060ca..7be2be8da2 100644 --- a/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/OpenShiftGeneratedPluginDescriptorTest.java +++ b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/OpenShiftGeneratedPluginDescriptorTest.java @@ -56,7 +56,8 @@ static Stream data() { arguments("helm-dependency-update", "compile", "integration-test"), arguments("helm-push", "compile", "install"), arguments("helm-lint", "compile", "integration-test"), - arguments("helm-install", "compile", "install") + arguments("helm-install", "compile", "install"), + arguments("helm-uninstall", "compile", "install") ); } diff --git a/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftHelmUninstallMojoTest.java b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftHelmUninstallMojoTest.java new file mode 100644 index 0000000000..d847f8a586 --- /dev/null +++ b/openshift-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/OpenShiftHelmUninstallMojoTest.java @@ -0,0 +1,117 @@ +/* + * 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.maven.plugin.mojo.build; + +import com.marcnuri.helm.Helm; +import io.fabric8.kubernetes.api.model.Secret; +import io.fabric8.kubernetes.api.model.SecretListBuilder; +import io.fabric8.kubernetes.client.KubernetesClient; +import io.fabric8.kubernetes.client.server.mock.EnableKubernetesMockClient; +import io.fabric8.kubernetes.client.server.mock.KubernetesMockServer; +import org.apache.commons.io.FileUtils; +import org.apache.maven.plugin.MojoExecutionException; +import org.apache.maven.plugin.MojoFailureException; +import org.apache.maven.project.MavenProject; +import org.apache.maven.settings.Settings; +import org.eclipse.jkube.kit.common.access.ClusterConfiguration; +import org.eclipse.jkube.kit.resource.helm.HelmConfig; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.PrintStream; +import java.nio.file.Files; +import java.nio.file.Path; + +import static org.assertj.core.api.Assertions.assertThatIllegalStateException; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.eclipse.jkube.kit.common.util.KubernetesMockServerUtil.prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints; + +@EnableKubernetesMockClient(crud = true) +class OpenshiftHelmUninstallMojoTest { + @TempDir + private Path projectDir; + private PrintStream originalPrintStream; + private ByteArrayOutputStream outputStream; + private OpenshiftHelmUninstallMojo openShiftHelmUninstallMojo; + private KubernetesClient kubernetesClient; + private KubernetesMockServer server; + + @BeforeEach + void setUp() throws Exception { + originalPrintStream = System.out; + outputStream = new ByteArrayOutputStream(); + System.setOut(new PrintStream(outputStream)); + Helm.create().withDir(projectDir).withName("empty-project").call(); + Path helmChartOutputDir = projectDir.resolve("target").resolve("jkube").resolve("helm"); + Files.createDirectories(helmChartOutputDir.resolve("openshift")); + FileUtils.copyDirectory(projectDir.resolve("empty-project").toFile(), helmChartOutputDir.resolve("openshift").toFile()); + System.setProperty("jkube.kubernetesTemplate", projectDir.toFile().getAbsolutePath()); + openShiftHelmUninstallMojo = new OpenshiftHelmUninstallMojo(); + openShiftHelmUninstallMojo.helm = HelmConfig.builder().chartExtension("tgz") + .outputDir(helmChartOutputDir.toString()) + .disableOpenAPIValidation(true) + .build(); + openShiftHelmUninstallMojo.interpolateTemplateParameters = true; + openShiftHelmUninstallMojo.access = ClusterConfiguration.from(kubernetesClient.getConfiguration()).build(); + openShiftHelmUninstallMojo.settings = new Settings(); + openShiftHelmUninstallMojo.project = new MavenProject(); + openShiftHelmUninstallMojo.project.setVersion("0.1.0"); + openShiftHelmUninstallMojo.project.getBuild() + .setOutputDirectory(projectDir.resolve("target").resolve("classes").toFile().getAbsolutePath()); + openShiftHelmUninstallMojo.project.getBuild().setDirectory(projectDir.resolve("target").toFile().getAbsolutePath()); + openShiftHelmUninstallMojo.project.setFile(projectDir.resolve("target").toFile()); + // Remove after https://github.com/fabric8io/kubernetes-client/issues/6062 is fixed + prepareMockWebServerExpectationsForAggregatedDiscoveryEndpoints(server); + } + + @AfterEach + void tearDown() { + System.setOut(originalPrintStream); + System.clearProperty("jkube.kubernetesTemplate"); + openShiftHelmUninstallMojo = null; + } + + @Test + @DisplayName("Helm release installed on Kuberentes cluster, then uninstall helm release") + void execute_whenReleasePresent_shouldUninstallChartFromKubernetesCluster() throws MojoExecutionException, MojoFailureException, IOException { + // Given + openShiftHelmUninstallMojo.init(); + openShiftHelmUninstallMojo.jkubeServiceHub.getHelmService().install(openShiftHelmUninstallMojo.helm); + // Should be removed once https://github.com/fabric8io/kubernetes-client/issues/6220 gets fixed + Secret secret = kubernetesClient.secrets().withName("sh.helm.release.v1.empty-project.v1").get(); + server.expect().get().withPath("/api/v1/namespaces/test/secrets?labelSelector=name%3Dempty-project%2Cowner%3Dhelm") + .andReturn(200, new SecretListBuilder() + .addToItems(secret) + .build()) + .once(); + // When + openShiftHelmUninstallMojo.execute(); + // Then + assertThat(outputStream.toString()) + .contains("release \"empty-project\" uninstalled"); + } + + @Test + @DisplayName("Helm Release not installed on Kubernetes cluster, then throw exception") + void execute_whenReleaseNotPresent_thenThrowException() { + assertThatIllegalStateException() + .isThrownBy(() -> openShiftHelmUninstallMojo.execute()) + .withMessageContaining(" not found"); + } +} From b1754e2ed7dbfe446d138a42e36a08d4035827cd Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Fri, 9 Aug 2024 20:24:03 +0530 Subject: [PATCH 268/289] doc(helm): documentation for Helm Uninstall feature Signed-off-by: Rohan Kumar --- CHANGELOG.md | 1 + .../main/asciidoc/inc/tasks/build/_index.adoc | 2 ++ .../main/asciidoc/inc/helm/_jkube_helm.adoc | 17 +++++++++ .../inc/helm/_jkube_helm_uninstall.adoc | 36 +++++++++++++++++++ .../_example_helm_uninstall_config.adoc | 8 +++++ .../helm/gradle/_gradle_helm_uninstall.adoc | 10 ++++++ .../inc/helm/gradle/_helm_uninstall.adoc | 4 +++ .../maven/_example_helm_uninstall_config.adoc | 10 ++++++ .../inc/helm/maven/_helm_uninstall.adoc | 4 +++ .../inc/helm/maven/_mvn_helm_uninstall.adoc | 10 ++++++ .../main/asciidoc/inc/goals/build/_goals.adoc | 1 + quickstarts/maven/spring-boot-helm/README.md | 5 +++ 12 files changed, 108 insertions(+) create mode 100644 jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm_uninstall.adoc create mode 100644 jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_example_helm_uninstall_config.adoc create mode 100644 jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_gradle_helm_uninstall.adoc create mode 100644 jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_helm_uninstall.adoc create mode 100644 jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_example_helm_uninstall_config.adoc create mode 100644 jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_helm_uninstall.adoc create mode 100644 jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_mvn_helm_uninstall.adoc diff --git a/CHANGELOG.md b/CHANGELOG.md index b3ddb352bc..d902558563 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ Usage: * Fix #2662: Sanitize VCS remote URL used in `jkube.eclipse.org/git-url` annotation * Fix #2663: Add new helm install goal task (`k8s:helm-install` for maven and `k8sHelmInstall` for gradle) * Fix #2665: Added support for explicit path for readiness and liveness probes in SpringBootHealthCheckEnricher +* Fix #2666: Add new helm uninstall goal task (`k8s:helm-uninstall` for maven and `k8sHelmUninstall` for gradle) * Fix #2860: Correctly pass Docker build-arg from the build configuration to the Openshift build strategy * Fix #2885: Provide a way to set labels on images defined by Generators * Fix #2901: Ensure Docker build arguments from properties are used during images pre-pulling diff --git a/gradle-plugin/doc/src/main/asciidoc/inc/tasks/build/_index.adoc b/gradle-plugin/doc/src/main/asciidoc/inc/tasks/build/_index.adoc index 8cafd72d76..31aa9bace6 100644 --- a/gradle-plugin/doc/src/main/asciidoc/inc/tasks/build/_index.adoc +++ b/gradle-plugin/doc/src/main/asciidoc/inc/tasks/build/_index.adoc @@ -18,3 +18,5 @@ include::{kitdoc-path}/inc/helm/_jkube_helm_lint.adoc[] include::{kitdoc-path}/inc/helm/_jkube_helm_dependency_update.adoc[] include::{kitdoc-path}/inc/helm/_jkube_helm_install.adoc[] + +include::{kitdoc-path}/inc/helm/_jkube_helm_uninstall.adoc[] diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm.adoc index 11afb1d36b..fa1a8bcc88 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm.adoc @@ -299,3 +299,20 @@ include::maven/_jkube_helm_maven_execution.adoc[] include::_jkube_helm_multimodule.adoc[] endif::[] +ifeval::["{plugin-type}" == "maven"] +=== Uninstalling the installed Helm release +endif::[] +ifeval::["{plugin-type}" == "gradle"] +==== Uninstalling the installed Helm release +endif::[] + + +ifeval::["{plugin-type}" == "maven"] +You can uninstall installed Helm release from {cluster} via <> goal as follows: +include::maven/_helm_uninstall.adoc[] +endif::[] +ifeval::["{plugin-type}" == "gradle"] +You can uninstall installed Helm release from {cluster} via <> task as follows: +include::gradle/_helm_uninstall.adoc[] + +endif::[] diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm_uninstall.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm_uninstall.adoc new file mode 100644 index 0000000000..39b647e4ac --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/_jkube_helm_uninstall.adoc @@ -0,0 +1,36 @@ +ifeval::["{plugin-type}" == "maven"] +[[jkube:helm-uninstall]] +== *{goal-prefix}:helm-uninstall* +endif::[] +ifeval::["{plugin-type}" == "gradle"] +[[jkubeHelmUninstall]] +=== *{task-prefix}HelmUninstall* +endif::[] + +This feature allows you to remove Helm release from {cluster} + +ifeval::["{plugin-type}" == "maven"] +include::maven/_mvn_helm_uninstall.adoc[] +endif::[] +ifeval::["{plugin-type}" == "gradle"] +include::gradle/_gradle_helm_uninstall.adoc[] +endif::[] + +.Helm Uninstall configuration +[cols="1,5,1"] +|=== +| Element | Description | Property + +| *releaseName* +| Name of Helm Release (instance of a chart running in a {cluster} cluster). +| `jkube.helm.release.name` + +|=== + +.Example Helm Uninstall configuration +ifeval::["{plugin-type}" == "maven"] +include::maven/_example_helm_uninstall_config.adoc[] +endif::[] +ifeval::["{plugin-type}" == "gradle"] +include::gradle/_example_helm_uninstall_config.adoc[] +endif::[] \ No newline at end of file diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_example_helm_uninstall_config.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_example_helm_uninstall_config.adoc new file mode 100644 index 0000000000..02ca89da9f --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_example_helm_uninstall_config.adoc @@ -0,0 +1,8 @@ +[source,groovy,indent=0,subs="verbatim,quotes,attributes"] +---- +kubernetes { + helm { + releaseName = "test-release" + } +} +---- \ No newline at end of file diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_gradle_helm_uninstall.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_gradle_helm_uninstall.adoc new file mode 100644 index 0000000000..32674240af --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_gradle_helm_uninstall.adoc @@ -0,0 +1,10 @@ +To uninstall a Helm release you need to invoke the `{task-prefix}HelmUninstall` gradle task on the command line: + +[source, sh, subs="+attributes"] +---- +gradle {task-prefix}Resource {task-prefix}Helm {task-prefix}HelmInstall {task-prefix}HelmUninstall +---- + +[NOTE] +The `{task-prefix}Resource`, `{task-prefix}Helm` and `{task-prefix}HelmInstall` tasks are required to ensure that Helm release gets installed in {cluster}. +If you already have the Helm release installed on {cluster}, then you can omit these tasks. \ No newline at end of file diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_helm_uninstall.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_helm_uninstall.adoc new file mode 100644 index 0000000000..13073e8e6c --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/gradle/_helm_uninstall.adoc @@ -0,0 +1,4 @@ +[source, sh, subs="+attributes"] +---- +./gradlew {task-prefix}HelmUninstall +---- \ No newline at end of file diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_example_helm_uninstall_config.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_example_helm_uninstall_config.adoc new file mode 100644 index 0000000000..b65375cd79 --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_example_helm_uninstall_config.adoc @@ -0,0 +1,10 @@ +[source,xml,indent=0,subs="verbatim,quotes,attributes"] +---- + + + + test-release + + + +---- diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_helm_uninstall.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_helm_uninstall.adoc new file mode 100644 index 0000000000..cfa8d306c8 --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_helm_uninstall.adoc @@ -0,0 +1,4 @@ +[source, sh, subs="+attributes"] +---- +mvn {goal-prefix}:helm-uninstall +---- \ No newline at end of file diff --git a/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_mvn_helm_uninstall.adoc b/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_mvn_helm_uninstall.adoc new file mode 100644 index 0000000000..f42318eeb7 --- /dev/null +++ b/jkube-kit/doc/src/main/asciidoc/inc/helm/maven/_mvn_helm_uninstall.adoc @@ -0,0 +1,10 @@ +To uninstall a Helm release you need to invoke the `{goal-prefix}:helm-uninstall` Maven goal on the command line: + +[source, sh, subs="+attributes"] +---- +mvn {goal-prefix}:resource {goal-prefix}:helm {goal-prefix}:helm-install {goal-prefix}:helm-uninstall +---- + +[NOTE] +The `{goal-prefix}:resource`, `{goal-prefix}:helm` and `{goal-prefix}:helm-install` goals are required to ensure that Helm release gets installed in {cluster}. +If you already have the Helm release installed on {cluster}, then you can omit these goals. \ No newline at end of file diff --git a/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_goals.adoc b/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_goals.adoc index 3df289aa27..2308ca6525 100644 --- a/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_goals.adoc +++ b/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_goals.adoc @@ -11,3 +11,4 @@ include::{kitdoc-path}/inc/helm/_jkube_helm_push.adoc[] include::{kitdoc-path}/inc/helm/_jkube_helm_lint.adoc[] include::{kitdoc-path}/inc/helm/_jkube_helm_dependency_update.adoc[] include::{kitdoc-path}/inc/helm/_jkube_helm_install.adoc[] +include::{kitdoc-path}/inc/helm/_jkube_helm_uninstall.adoc[] diff --git a/quickstarts/maven/spring-boot-helm/README.md b/quickstarts/maven/spring-boot-helm/README.md index 89d1f8d1c0..724ee67265 100644 --- a/quickstarts/maven/spring-boot-helm/README.md +++ b/quickstarts/maven/spring-boot-helm/README.md @@ -105,6 +105,11 @@ With `helm` CLI, You can also override some of the values defined in the `values helm install spring-boot-helm target/jkube/helm/spring-boot-helm/kubernetes/ --set deployment.replicas=5 --set service.spec.type=NodePort ``` +Once you've finished testing your app, you can remove this installed helm release from cluster via `k8s:helm-uninstall` goal +```shell +mvn k8s:helm-uninstall +``` + ## Customizing Chart via Maven properties Helm chart properties can be overridden through command line: From 21d0ece8595373b3fe045b18461dc8aeedbd5a4b Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Fri, 9 Aug 2024 17:14:35 +0200 Subject: [PATCH 269/289] chore(deps): Bump version.kubernetes-client from 6.13.1 to 6.13.2 Signed-off-by: Marc Nuri --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 0bba3e2b52..35a22005d2 100644 --- a/pom.xml +++ b/pom.xml @@ -105,7 +105,7 @@ 0.8.12 2.5.1 5.10.2 - 6.13.1 + 6.13.2 4.5 1.18.32 1.18.20.0 From ad717ae37a80702201575a14e0eb5e634175c6e1 Mon Sep 17 00:00:00 2001 From: Luigi De Masi <5583341+luigidemasi@users.noreply.github.com> Date: Mon, 12 Aug 2024 12:35:51 +0200 Subject: [PATCH 270/289] OpenShift route generator: prefer port name over port number for targetPort when it's possible --- .../it/src/it/autotls/expected/openshift.yml | 2 +- .../dockerfile-simple/expected/openshift.yml | 2 +- .../openshift.yml | 2 +- .../ftp-port-expose-annotation/openshift.yml | 2 +- .../expected/ftp-port-external/openshift.yml | 2 +- .../expected/http-port-external/openshift.yml | 2 +- .../expose/expected/http-port/openshift.yml | 2 +- .../expected/multiple-services/openshift.yml | 4 +- .../it/src/it/helidon/expected/openshift.yml | 2 +- .../image-pull-secrets/expected/openshift.yml | 2 +- .../it/initcontainers/expected/openshift.yml | 2 +- .../it/src/it/metadata/expected/openshift.yml | 2 +- .../multiple-services/expected/openshift.yml | 2 +- .../src/it/openliberty/expected/openshift.yml | 2 +- .../expected/liveness-readiness/openshift.yml | 2 +- .../expected/none/openshift.yml | 2 +- .../expected/startup/openshift.yml | 2 +- .../project-label/expected/app/openshift.yml | 2 +- .../expected/custom/openshift.yml | 2 +- .../expected/default/openshift.yml | 2 +- .../expected/group/openshift.yml | 2 +- .../expected/version/openshift.yml | 2 +- .../expected/openshift.yml | 2 +- .../route/expected/routeEnabled/openshift.yml | 2 +- .../expected/openshift.yml | 2 +- .../it/service-name/expected/openshift.yml | 2 +- .../it/src/it/service/expected/openshift.yml | 2 +- .../it/smallrye-health/expected/openshift.yml | 2 +- .../expected/openshift.yml | 2 +- .../expected/custom/openshift.yml | 2 +- .../expected/default/openshift.yml | 2 +- .../expected/disabled/openshift.yml | 2 +- .../labelsViaResourceConfig/openshift.yml | 2 +- .../generic/DefaultServiceEnricher.java | 10 +-- .../generic/openshift/RouteEnricher.java | 38 +++++++--- .../generic/openshift/RouteEnricherTest.java | 72 +++++++++++++++++-- .../openshift.yml | 2 +- .../openshift.yml | 2 +- .../expected/create-project/openshift.yml | 2 +- .../it/project/expected/default/openshift.yml | 2 +- .../expected/set-namespace/openshift.yml | 2 +- .../expected/openshift.yml | 2 +- .../src/it/statefulset/expected/openshift.yml | 2 +- 43 files changed, 135 insertions(+), 67 deletions(-) diff --git a/gradle-plugin/it/src/it/autotls/expected/openshift.yml b/gradle-plugin/it/src/it/autotls/expected/openshift.yml index e28e0c93d9..cc87876b34 100644 --- a/gradle-plugin/it/src/it/autotls/expected/openshift.yml +++ b/gradle-plugin/it/src/it/autotls/expected/openshift.yml @@ -142,7 +142,7 @@ items: name: autotls spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: autotls \ No newline at end of file diff --git a/gradle-plugin/it/src/it/dockerfile-simple/expected/openshift.yml b/gradle-plugin/it/src/it/dockerfile-simple/expected/openshift.yml index 60450645cd..7ca348b1ee 100644 --- a/gradle-plugin/it/src/it/dockerfile-simple/expected/openshift.yml +++ b/gradle-plugin/it/src/it/dockerfile-simple/expected/openshift.yml @@ -89,7 +89,7 @@ items: name: dockerfile-simple spec: port: - targetPort: 9080 + targetPort: glrpc to: kind: Service name: dockerfile-simple diff --git a/gradle-plugin/it/src/it/expose/expected/ftp-port-expose-annotation-enricher/openshift.yml b/gradle-plugin/it/src/it/expose/expected/ftp-port-expose-annotation-enricher/openshift.yml index 189d1237d1..03eb501d98 100644 --- a/gradle-plugin/it/src/it/expose/expected/ftp-port-expose-annotation-enricher/openshift.yml +++ b/gradle-plugin/it/src/it/expose/expected/ftp-port-expose-annotation-enricher/openshift.yml @@ -134,7 +134,7 @@ items: name: expose spec: port: - targetPort: 21 + targetPort: ftp to: kind: Service name: expose diff --git a/gradle-plugin/it/src/it/expose/expected/ftp-port-expose-annotation/openshift.yml b/gradle-plugin/it/src/it/expose/expected/ftp-port-expose-annotation/openshift.yml index 189d1237d1..03eb501d98 100644 --- a/gradle-plugin/it/src/it/expose/expected/ftp-port-expose-annotation/openshift.yml +++ b/gradle-plugin/it/src/it/expose/expected/ftp-port-expose-annotation/openshift.yml @@ -134,7 +134,7 @@ items: name: expose spec: port: - targetPort: 21 + targetPort: ftp to: kind: Service name: expose diff --git a/gradle-plugin/it/src/it/expose/expected/ftp-port-external/openshift.yml b/gradle-plugin/it/src/it/expose/expected/ftp-port-external/openshift.yml index dc0a6bfc91..9464e4efae 100644 --- a/gradle-plugin/it/src/it/expose/expected/ftp-port-external/openshift.yml +++ b/gradle-plugin/it/src/it/expose/expected/ftp-port-external/openshift.yml @@ -132,7 +132,7 @@ items: name: expose spec: port: - targetPort: 21 + targetPort: ftp to: kind: Service name: expose diff --git a/gradle-plugin/it/src/it/expose/expected/http-port-external/openshift.yml b/gradle-plugin/it/src/it/expose/expected/http-port-external/openshift.yml index fafc7378c0..8c9ac20329 100644 --- a/gradle-plugin/it/src/it/expose/expected/http-port-external/openshift.yml +++ b/gradle-plugin/it/src/it/expose/expected/http-port-external/openshift.yml @@ -132,7 +132,7 @@ items: name: expose spec: port: - targetPort: 80 + targetPort: http to: kind: Service name: expose diff --git a/gradle-plugin/it/src/it/expose/expected/http-port/openshift.yml b/gradle-plugin/it/src/it/expose/expected/http-port/openshift.yml index fafc7378c0..8c9ac20329 100644 --- a/gradle-plugin/it/src/it/expose/expected/http-port/openshift.yml +++ b/gradle-plugin/it/src/it/expose/expected/http-port/openshift.yml @@ -132,7 +132,7 @@ items: name: expose spec: port: - targetPort: 80 + targetPort: http to: kind: Service name: expose diff --git a/gradle-plugin/it/src/it/expose/expected/multiple-services/openshift.yml b/gradle-plugin/it/src/it/expose/expected/multiple-services/openshift.yml index 2fee0a99fe..e35de3bc04 100644 --- a/gradle-plugin/it/src/it/expose/expected/multiple-services/openshift.yml +++ b/gradle-plugin/it/src/it/expose/expected/multiple-services/openshift.yml @@ -230,7 +230,7 @@ items: name: expose spec: port: - targetPort: 443 + targetPort: https to: kind: Service name: expose @@ -256,7 +256,7 @@ items: name: ssh spec: port: - targetPort: 22 + targetPort: ssh to: kind: Service name: ssh diff --git a/gradle-plugin/it/src/it/helidon/expected/openshift.yml b/gradle-plugin/it/src/it/helidon/expected/openshift.yml index 36fdb46151..53100c9584 100644 --- a/gradle-plugin/it/src/it/helidon/expected/openshift.yml +++ b/gradle-plugin/it/src/it/helidon/expected/openshift.yml @@ -137,7 +137,7 @@ items: name: helidon spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: helidon diff --git a/gradle-plugin/it/src/it/image-pull-secrets/expected/openshift.yml b/gradle-plugin/it/src/it/image-pull-secrets/expected/openshift.yml index 2b32d25d2d..e0b52e582e 100644 --- a/gradle-plugin/it/src/it/image-pull-secrets/expected/openshift.yml +++ b/gradle-plugin/it/src/it/image-pull-secrets/expected/openshift.yml @@ -135,7 +135,7 @@ items: name: image-pull-secrets spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: image-pull-secrets diff --git a/gradle-plugin/it/src/it/initcontainers/expected/openshift.yml b/gradle-plugin/it/src/it/initcontainers/expected/openshift.yml index 885cb024b3..2b963ac3de 100644 --- a/gradle-plugin/it/src/it/initcontainers/expected/openshift.yml +++ b/gradle-plugin/it/src/it/initcontainers/expected/openshift.yml @@ -126,7 +126,7 @@ items: name: initcontainers spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: initcontainers diff --git a/gradle-plugin/it/src/it/metadata/expected/openshift.yml b/gradle-plugin/it/src/it/metadata/expected/openshift.yml index f98227b576..78a6c86e94 100644 --- a/gradle-plugin/it/src/it/metadata/expected/openshift.yml +++ b/gradle-plugin/it/src/it/metadata/expected/openshift.yml @@ -156,7 +156,7 @@ items: name: metadata spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: metadata diff --git a/gradle-plugin/it/src/it/multiple-services/expected/openshift.yml b/gradle-plugin/it/src/it/multiple-services/expected/openshift.yml index cacb26f9c7..e764eaca35 100644 --- a/gradle-plugin/it/src/it/multiple-services/expected/openshift.yml +++ b/gradle-plugin/it/src/it/multiple-services/expected/openshift.yml @@ -179,7 +179,7 @@ items: name: multiple-services spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: multiple-services diff --git a/gradle-plugin/it/src/it/openliberty/expected/openshift.yml b/gradle-plugin/it/src/it/openliberty/expected/openshift.yml index 921030db00..af507a80b0 100644 --- a/gradle-plugin/it/src/it/openliberty/expected/openshift.yml +++ b/gradle-plugin/it/src/it/openliberty/expected/openshift.yml @@ -137,7 +137,7 @@ items: name: openliberty spec: port: - targetPort: 9080 + targetPort: glrpc to: kind: Service name: openliberty diff --git a/gradle-plugin/it/src/it/probes-groovy-dsl-config/expected/liveness-readiness/openshift.yml b/gradle-plugin/it/src/it/probes-groovy-dsl-config/expected/liveness-readiness/openshift.yml index 488c8bda4c..d0fbb1e2b6 100644 --- a/gradle-plugin/it/src/it/probes-groovy-dsl-config/expected/liveness-readiness/openshift.yml +++ b/gradle-plugin/it/src/it/probes-groovy-dsl-config/expected/liveness-readiness/openshift.yml @@ -151,7 +151,7 @@ items: name: probes-groovy-dsl-config spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: probes-groovy-dsl-config diff --git a/gradle-plugin/it/src/it/probes-groovy-dsl-config/expected/none/openshift.yml b/gradle-plugin/it/src/it/probes-groovy-dsl-config/expected/none/openshift.yml index 1352c08d20..469283078c 100644 --- a/gradle-plugin/it/src/it/probes-groovy-dsl-config/expected/none/openshift.yml +++ b/gradle-plugin/it/src/it/probes-groovy-dsl-config/expected/none/openshift.yml @@ -119,7 +119,7 @@ items: name: probes-groovy-dsl-config spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: probes-groovy-dsl-config diff --git a/gradle-plugin/it/src/it/probes-groovy-dsl-config/expected/startup/openshift.yml b/gradle-plugin/it/src/it/probes-groovy-dsl-config/expected/startup/openshift.yml index b65ed95fb4..6f84bef580 100644 --- a/gradle-plugin/it/src/it/probes-groovy-dsl-config/expected/startup/openshift.yml +++ b/gradle-plugin/it/src/it/probes-groovy-dsl-config/expected/startup/openshift.yml @@ -127,7 +127,7 @@ items: name: probes-groovy-dsl-config spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: probes-groovy-dsl-config diff --git a/gradle-plugin/it/src/it/project-label/expected/app/openshift.yml b/gradle-plugin/it/src/it/project-label/expected/app/openshift.yml index edd7352665..2acc7dfcd1 100644 --- a/gradle-plugin/it/src/it/project-label/expected/app/openshift.yml +++ b/gradle-plugin/it/src/it/project-label/expected/app/openshift.yml @@ -110,7 +110,7 @@ items: name: project-label spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: project-label diff --git a/gradle-plugin/it/src/it/project-label/expected/custom/openshift.yml b/gradle-plugin/it/src/it/project-label/expected/custom/openshift.yml index 6a56de14b5..fd766595f8 100644 --- a/gradle-plugin/it/src/it/project-label/expected/custom/openshift.yml +++ b/gradle-plugin/it/src/it/project-label/expected/custom/openshift.yml @@ -109,7 +109,7 @@ items: name: project-label spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: project-label diff --git a/gradle-plugin/it/src/it/project-label/expected/default/openshift.yml b/gradle-plugin/it/src/it/project-label/expected/default/openshift.yml index b3cc6ec6fb..4a18233f4e 100644 --- a/gradle-plugin/it/src/it/project-label/expected/default/openshift.yml +++ b/gradle-plugin/it/src/it/project-label/expected/default/openshift.yml @@ -109,7 +109,7 @@ items: name: project-label spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: project-label diff --git a/gradle-plugin/it/src/it/project-label/expected/group/openshift.yml b/gradle-plugin/it/src/it/project-label/expected/group/openshift.yml index 2c1e061abc..26e64290bf 100644 --- a/gradle-plugin/it/src/it/project-label/expected/group/openshift.yml +++ b/gradle-plugin/it/src/it/project-label/expected/group/openshift.yml @@ -109,7 +109,7 @@ items: name: project-label spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: project-label diff --git a/gradle-plugin/it/src/it/project-label/expected/version/openshift.yml b/gradle-plugin/it/src/it/project-label/expected/version/openshift.yml index f39291f68c..f1576ed6fe 100644 --- a/gradle-plugin/it/src/it/project-label/expected/version/openshift.yml +++ b/gradle-plugin/it/src/it/project-label/expected/version/openshift.yml @@ -109,7 +109,7 @@ items: name: project-label spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: project-label diff --git a/gradle-plugin/it/src/it/route-name-fragment/expected/openshift.yml b/gradle-plugin/it/src/it/route-name-fragment/expected/openshift.yml index 4a09d20d47..ca3a8e7195 100644 --- a/gradle-plugin/it/src/it/route-name-fragment/expected/openshift.yml +++ b/gradle-plugin/it/src/it/route-name-fragment/expected/openshift.yml @@ -110,7 +110,7 @@ items: name: customized-name spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: customized-name diff --git a/gradle-plugin/it/src/it/route/expected/routeEnabled/openshift.yml b/gradle-plugin/it/src/it/route/expected/routeEnabled/openshift.yml index 95eda79fa0..44da9f56a1 100644 --- a/gradle-plugin/it/src/it/route/expected/routeEnabled/openshift.yml +++ b/gradle-plugin/it/src/it/route/expected/routeEnabled/openshift.yml @@ -110,7 +110,7 @@ items: name: route spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: route diff --git a/gradle-plugin/it/src/it/service-name-fragment/expected/openshift.yml b/gradle-plugin/it/src/it/service-name-fragment/expected/openshift.yml index f7c2ccefd1..7f58d70b19 100644 --- a/gradle-plugin/it/src/it/service-name-fragment/expected/openshift.yml +++ b/gradle-plugin/it/src/it/service-name-fragment/expected/openshift.yml @@ -106,7 +106,7 @@ items: name: customized-name spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: customized-name diff --git a/gradle-plugin/it/src/it/service-name/expected/openshift.yml b/gradle-plugin/it/src/it/service-name/expected/openshift.yml index 63ce0bd1b1..d1732741f1 100644 --- a/gradle-plugin/it/src/it/service-name/expected/openshift.yml +++ b/gradle-plugin/it/src/it/service-name/expected/openshift.yml @@ -106,7 +106,7 @@ items: name: customized-name spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: customized-name diff --git a/gradle-plugin/it/src/it/service/expected/openshift.yml b/gradle-plugin/it/src/it/service/expected/openshift.yml index a20fa75f84..8945d0e7c2 100644 --- a/gradle-plugin/it/src/it/service/expected/openshift.yml +++ b/gradle-plugin/it/src/it/service/expected/openshift.yml @@ -133,7 +133,7 @@ items: name: svc1 spec: port: - targetPort: 8080 + targetPort: port1 to: kind: Service name: svc1 diff --git a/gradle-plugin/it/src/it/smallrye-health/expected/openshift.yml b/gradle-plugin/it/src/it/smallrye-health/expected/openshift.yml index eb882d4dae..64dfa55144 100644 --- a/gradle-plugin/it/src/it/smallrye-health/expected/openshift.yml +++ b/gradle-plugin/it/src/it/smallrye-health/expected/openshift.yml @@ -137,7 +137,7 @@ items: name: smallrye-health spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: smallrye-health diff --git a/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/expected/openshift.yml b/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/expected/openshift.yml index f9063335ad..dc4c536c84 100644 --- a/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/expected/openshift.yml +++ b/gradle-plugin/it/src/it/spring-boot-managementhealthprobes/expected/openshift.yml @@ -157,7 +157,7 @@ items: name: spring-boot-managementhealthprobes spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: spring-boot-managementhealthprobes diff --git a/gradle-plugin/it/src/it/well-known-labels/expected/custom/openshift.yml b/gradle-plugin/it/src/it/well-known-labels/expected/custom/openshift.yml index 3599ed853d..01f2ef8692 100644 --- a/gradle-plugin/it/src/it/well-known-labels/expected/custom/openshift.yml +++ b/gradle-plugin/it/src/it/well-known-labels/expected/custom/openshift.yml @@ -137,7 +137,7 @@ items: name: well-known-labels spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: well-known-labels diff --git a/gradle-plugin/it/src/it/well-known-labels/expected/default/openshift.yml b/gradle-plugin/it/src/it/well-known-labels/expected/default/openshift.yml index 69e4eebf78..b0e9ccd830 100644 --- a/gradle-plugin/it/src/it/well-known-labels/expected/default/openshift.yml +++ b/gradle-plugin/it/src/it/well-known-labels/expected/default/openshift.yml @@ -131,7 +131,7 @@ items: name: well-known-labels spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: well-known-labels diff --git a/gradle-plugin/it/src/it/well-known-labels/expected/disabled/openshift.yml b/gradle-plugin/it/src/it/well-known-labels/expected/disabled/openshift.yml index 0665baffcb..14d87129f5 100644 --- a/gradle-plugin/it/src/it/well-known-labels/expected/disabled/openshift.yml +++ b/gradle-plugin/it/src/it/well-known-labels/expected/disabled/openshift.yml @@ -109,7 +109,7 @@ items: name: well-known-labels spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: well-known-labels diff --git a/gradle-plugin/it/src/it/well-known-labels/expected/labelsViaResourceConfig/openshift.yml b/gradle-plugin/it/src/it/well-known-labels/expected/labelsViaResourceConfig/openshift.yml index b93be39e80..356cdc8c11 100644 --- a/gradle-plugin/it/src/it/well-known-labels/expected/labelsViaResourceConfig/openshift.yml +++ b/gradle-plugin/it/src/it/well-known-labels/expected/labelsViaResourceConfig/openshift.yml @@ -138,7 +138,7 @@ items: name: well-known-labels spec: port: - targetPort: 8080 + targetPort: http to: kind: Service name: well-known-labels diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultServiceEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultServiceEnricher.java index 39f87f9428..0d9bba764d 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultServiceEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DefaultServiceEnricher.java @@ -611,7 +611,7 @@ private String ensureProtocol(ServicePort port) { return protocol; } - private static ServicePort getServicePortToExpose(ServiceBuilder serviceBuilder){ + public static ServicePort getServicePortToExpose(ServiceBuilder serviceBuilder){ ServiceSpec spec = serviceBuilder.buildSpec(); if (spec != null) { final List ports = spec.getPorts(); @@ -637,12 +637,4 @@ public static Integer getPortToExpose(ServiceBuilder serviceBuilder) { } return servicePort.getPort(); } - - public static Integer getTargetPortToExpose(ServiceBuilder serviceBuilder) { - ServicePort servicePort = getServicePortToExpose(serviceBuilder); - if (servicePort == null || servicePort.getTargetPort() == null){ - return null; - } - return servicePort.getTargetPort().getIntVal(); - } } diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricher.java index 7379d8abb8..21394fb7f7 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricher.java @@ -14,6 +14,7 @@ package org.eclipse.jkube.enricher.generic.openshift; import io.fabric8.kubernetes.api.model.HasMetadata; +import io.fabric8.kubernetes.api.model.ServicePort; import io.fabric8.openshift.api.model.RouteSpec; import org.eclipse.jkube.kit.common.Configs; import org.eclipse.jkube.kit.common.util.FileUtil; @@ -37,8 +38,7 @@ import java.util.Objects; -import static org.eclipse.jkube.enricher.generic.DefaultServiceEnricher.getPortToExpose; -import static org.eclipse.jkube.enricher.generic.DefaultServiceEnricher.getTargetPortToExpose; +import static org.eclipse.jkube.enricher.generic.DefaultServiceEnricher.getServicePortToExpose; import static org.eclipse.jkube.kit.enricher.api.util.KubernetesResourceUtil.mergeMetadata; import static org.eclipse.jkube.kit.enricher.api.util.KubernetesResourceUtil.mergeSimpleFields; import static org.eclipse.jkube.kit.enricher.api.util.KubernetesResourceUtil.removeItemFromKubernetesBuilder; @@ -121,14 +121,23 @@ private void addRoute(KubernetesListBuilder listBuilder, ServiceBuilder serviceB } } - private static RoutePort createRoutePort(ServiceBuilder serviceBuilder) { - RoutePort routePort = null; - final Integer serviceTargetPort = getTargetPortToExpose(serviceBuilder); - final Integer servicePort = serviceTargetPort != null ? serviceTargetPort : getPortToExpose(serviceBuilder); - if (servicePort != null) { - routePort = new RoutePort(); - routePort.setTargetPort(new IntOrString(servicePort)); + private static RoutePort createRoutePort(ServicePort servicePortToExpose) { + RoutePort routePort = new RoutePort(); + final String servicePortName = servicePortToExpose.getName(); + + if(servicePortName != null){ + routePort.setTargetPort(new IntOrString(servicePortName)); + return routePort; + } + + final IntOrString serviceTargetPort = servicePortToExpose.getTargetPort(); + if( serviceTargetPort != null && serviceTargetPort.getValue() != null){ + routePort.setTargetPort(serviceTargetPort); + return routePort; } + + final Integer servicePort = servicePortToExpose.getPort(); + routePort.setTargetPort(new IntOrString(servicePort)); return routePort; } @@ -224,8 +233,17 @@ private static void handleTlsTermination(RouteBuilder routeBuilder, String tlsTe static Route createOpinionatedRouteFromService(ServiceBuilder serviceBuilder, String routeDomainPostfix, String tlsTermination, String edgeTerminationPolicy, boolean isRouteWithTls) { ObjectMeta serviceMetadata = serviceBuilder.buildMetadata(); if (serviceMetadata != null) { + RoutePort routePort = null; String name = serviceMetadata.getName(); - RoutePort routePort = createRoutePort(serviceBuilder); + final ServicePort servicePortToExpose = getServicePortToExpose(serviceBuilder); + + if(servicePortToExpose != null && ( + servicePortToExpose.getName() != null || + servicePortToExpose.getPort() != null || + servicePortToExpose.getTargetPort() != null)){ + routePort = createRoutePort(servicePortToExpose); + } + if (routePort != null) { RouteBuilder routeBuilder = new RouteBuilder(). withMetadata(serviceMetadata). diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricherTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricherTest.java index 78e5e42d6a..f2c653c8f6 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricherTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/openshift/RouteEnricherTest.java @@ -96,8 +96,8 @@ void create_withDefaultsAndRouteDomainInOpenShift_shouldAddRouteWithDomainPostfi .containsExactly("Service", "Route") ) .last() - .extracting("metadata.name", "spec.host", "spec.to.kind", "spec.to.name", "spec.port.targetPort.intVal") - .contains("test-svc", "test-svc.jkube.eclipse.org", "Service", "test-svc", 8080); + .extracting("metadata.name", "spec.host", "spec.to.kind", "spec.to.name", "spec.port.targetPort.value") + .contains("test-svc", "test-svc.jkube.eclipse.org", "Service", "test-svc", "http"); } @Test @@ -173,8 +173,8 @@ void create_opinionatedRouteFromService() { // Then assertThat(route).isNotNull() - .extracting("metadata.name", "spec.host", "spec.to.kind", "spec.to.name", "spec.port.targetPort.intVal") - .contains("test-svc", "example.com", "Service", "test-svc", 8080); + .extracting("metadata.name", "spec.host", "spec.to.kind", "spec.to.name", "spec.port.targetPort.value") + .contains("test-svc", "example.com", "Service", "test-svc", "http"); } @Test @@ -268,7 +268,7 @@ void enrichWithTls(){ } @Test - void routeTargetPortFromServicePort() { + void portName_RouteTargetPortFromServicePort() { // Given ServiceBuilder serviceBuilder = new ServiceBuilder() .editOrNewMetadata() @@ -284,17 +284,73 @@ void routeTargetPortFromServicePort() { .endPort() .addToSelector("group", "test") .withType("LoadBalancer") - .editMatchingPort(e -> Boolean.TRUE).withPort(80).endPort().endSpec(); + .endSpec(); + + // When + Route route = RouteEnricher.createOpinionatedRouteFromService(serviceBuilder, "example.com", "edge", "Allow", false); + + // Then + assertThat(route).isNotNull() + .extracting("metadata.name", "spec.host", "spec.to.kind", "spec.to.name", "spec.port.targetPort.value") + .contains("test-svc", "example.com", "Service", "test-svc", "http"); + } + + @Test + void routeTargetPortFromServicePort() { + // Given + ServiceBuilder serviceBuilder = new ServiceBuilder() + .editOrNewMetadata() + .withName("test-svc") + .addToLabels("expose", "true") + .endMetadata() + .editOrNewSpec() + .addNewPort() + .withPort(80) + .withProtocol("TCP") + .withTargetPort(new IntOrString(8080)) + .endPort() + .addToSelector("group", "test") + .withType("LoadBalancer") + .endSpec(); // When Route route = RouteEnricher.createOpinionatedRouteFromService(serviceBuilder, "example.com", "edge", "Allow", false); // Then assertThat(route).isNotNull() - .extracting("metadata.name", "spec.host", "spec.to.kind", "spec.to.name", "spec.port.targetPort.intVal") + .extracting("metadata.name", "spec.host", "spec.to.kind", "spec.to.name", "spec.port.targetPort.value") .contains("test-svc", "example.com", "Service", "test-svc", 8080); } + @Test + void port_RouteTargetPortFromServicePort() { + // Given + ServiceBuilder serviceBuilder = new ServiceBuilder() + .editOrNewMetadata() + .withName("test-svc") + .addToLabels("expose", "true") + .endMetadata() + .editOrNewSpec() + .addNewPort() + .withPort(80) + .withProtocol("TCP") + .endPort() + .addToSelector("group", "test") + .withType("LoadBalancer") + .endSpec(); + + // When + Route route = RouteEnricher.createOpinionatedRouteFromService(serviceBuilder, "example.com", "edge", "Allow", false); + + // Then + assertThat(route).isNotNull() + .extracting("metadata.name", "spec.host", "spec.to.kind", "spec.to.name", "spec.port.targetPort.value") + .contains("test-svc", "example.com", "Service", "test-svc", 80); + } + + + + @Test void create_withNoExposeLabelPort8443_shouldCreateRoute() { // Given @@ -315,6 +371,7 @@ private ServiceBuilder getMockServiceBuilder() { return getMockServiceBuilder(8080, Collections.singletonMap("expose", "true")); } + private ServiceBuilder getMockServiceBuilder(int port, Map labels) { // @formatter:off return new ServiceBuilder() @@ -371,5 +428,6 @@ private void mockJKubeEnricherContextPropertiesNotCalled() { private void mockJKubeEnricherContextResourceConfigWithRouteDomain(String routeDomain) { when(context.getConfiguration().getResource().getRouteDomain()).thenReturn(routeDomain); } + } diff --git a/openshift-maven-plugin/it/src/it/project/expected/create-project-and-set-different-namespace/openshift.yml b/openshift-maven-plugin/it/src/it/project/expected/create-project-and-set-different-namespace/openshift.yml index 9020e6987e..c96832de0c 100644 --- a/openshift-maven-plugin/it/src/it/project/expected/create-project-and-set-different-namespace/openshift.yml +++ b/openshift-maven-plugin/it/src/it/project/expected/create-project-and-set-different-namespace/openshift.yml @@ -137,7 +137,7 @@ items: namespace: namespace-to-operate spec: port: - targetPort: 8080 + targetPort: "http" to: kind: Service name: project \ No newline at end of file diff --git a/openshift-maven-plugin/it/src/it/project/expected/create-project-and-set-namespace/openshift.yml b/openshift-maven-plugin/it/src/it/project/expected/create-project-and-set-namespace/openshift.yml index 7e1f665dca..4fb1035598 100644 --- a/openshift-maven-plugin/it/src/it/project/expected/create-project-and-set-namespace/openshift.yml +++ b/openshift-maven-plugin/it/src/it/project/expected/create-project-and-set-namespace/openshift.yml @@ -137,7 +137,7 @@ items: namespace: project-to-create-and-operate spec: port: - targetPort: 8080 + targetPort: "http" to: kind: Service name: project \ No newline at end of file diff --git a/openshift-maven-plugin/it/src/it/project/expected/create-project/openshift.yml b/openshift-maven-plugin/it/src/it/project/expected/create-project/openshift.yml index 65615445ea..a7d7d650a1 100644 --- a/openshift-maven-plugin/it/src/it/project/expected/create-project/openshift.yml +++ b/openshift-maven-plugin/it/src/it/project/expected/create-project/openshift.yml @@ -134,7 +134,7 @@ items: name: project spec: port: - targetPort: 8080 + targetPort: "http" to: kind: Service name: project \ No newline at end of file diff --git a/openshift-maven-plugin/it/src/it/project/expected/default/openshift.yml b/openshift-maven-plugin/it/src/it/project/expected/default/openshift.yml index 674c174a62..a857163ae6 100644 --- a/openshift-maven-plugin/it/src/it/project/expected/default/openshift.yml +++ b/openshift-maven-plugin/it/src/it/project/expected/default/openshift.yml @@ -123,7 +123,7 @@ items: name: project spec: port: - targetPort: 8080 + targetPort: "http" to: kind: Service name: project \ No newline at end of file diff --git a/openshift-maven-plugin/it/src/it/project/expected/set-namespace/openshift.yml b/openshift-maven-plugin/it/src/it/project/expected/set-namespace/openshift.yml index 0ae7e0dc03..b4c5fd2a38 100644 --- a/openshift-maven-plugin/it/src/it/project/expected/set-namespace/openshift.yml +++ b/openshift-maven-plugin/it/src/it/project/expected/set-namespace/openshift.yml @@ -126,7 +126,7 @@ items: namespace: namespace-to-operate spec: port: - targetPort: 8080 + targetPort: "http" to: kind: Service name: project \ No newline at end of file diff --git a/openshift-maven-plugin/it/src/it/simple-with-route-flag-true/expected/openshift.yml b/openshift-maven-plugin/it/src/it/simple-with-route-flag-true/expected/openshift.yml index 173f0231db..d8e81a8cb6 100644 --- a/openshift-maven-plugin/it/src/it/simple-with-route-flag-true/expected/openshift.yml +++ b/openshift-maven-plugin/it/src/it/simple-with-route-flag-true/expected/openshift.yml @@ -122,7 +122,7 @@ items: name: jkube-maven-sample-zero-config spec: port: - targetPort: 8080 + targetPort: "http" to: kind: Service name: jkube-maven-sample-zero-config diff --git a/openshift-maven-plugin/it/src/it/statefulset/expected/openshift.yml b/openshift-maven-plugin/it/src/it/statefulset/expected/openshift.yml index 41daa02b02..6aa7f34154 100644 --- a/openshift-maven-plugin/it/src/it/statefulset/expected/openshift.yml +++ b/openshift-maven-plugin/it/src/it/statefulset/expected/openshift.yml @@ -46,7 +46,7 @@ items: name: jkube-maven-sample-statefulset spec: port: - targetPort: 8080 + targetPort: "http" to: kind: Service name: jkube-maven-sample-statefulset From 6a810b6e0434e690b6602ead003c89a3db5830f2 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Mon, 12 Aug 2024 18:10:51 +0530 Subject: [PATCH 271/289] [RELEASE] Updated project version to 1.17.0 Signed-off-by: Rohan Kumar --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 + CHANGELOG.md | 2 +- gradle-plugin/doc/pom.xml | 2 +- gradle-plugin/it/pom.xml | 2 +- gradle-plugin/kubernetes/pom.xml | 2 +- gradle-plugin/openshift/pom.xml | 2 +- gradle-plugin/pom.xml | 2 +- jkube-kit/api/pom.xml | 2 +- jkube-kit/build/api/pom.xml | 4 ++-- jkube-kit/build/service/buildpacks/pom.xml | 2 +- jkube-kit/build/service/docker/pom.xml | 2 +- jkube-kit/build/service/jib/pom.xml | 2 +- jkube-kit/common-it/pom.xml | 2 +- jkube-kit/common-maven/pom.xml | 2 +- jkube-kit/common/pom.xml | 2 +- jkube-kit/config/image/pom.xml | 2 +- jkube-kit/config/resource/pom.xml | 2 +- jkube-kit/config/service/pom.xml | 2 +- jkube-kit/doc/pom.xml | 4 ++-- jkube-kit/enricher/api/pom.xml | 2 +- jkube-kit/enricher/generic/pom.xml | 2 +- jkube-kit/enricher/specific/pom.xml | 2 +- jkube-kit/generator/api/pom.xml | 2 +- jkube-kit/generator/dockerfile-simple/pom.xml | 2 +- jkube-kit/generator/java-exec/pom.xml | 2 +- jkube-kit/generator/karaf/pom.xml | 2 +- jkube-kit/generator/webapp/pom.xml | 2 +- jkube-kit/helm/pom.xml | 2 +- jkube-kit/jkube-kit-helidon/pom.xml | 2 +- jkube-kit/jkube-kit-micronaut/pom.xml | 2 +- jkube-kit/jkube-kit-microprofile/pom.xml | 2 +- jkube-kit/jkube-kit-openliberty/pom.xml | 2 +- jkube-kit/jkube-kit-quarkus/pom.xml | 2 +- jkube-kit/jkube-kit-smallrye/pom.xml | 2 +- jkube-kit/jkube-kit-spring-boot/pom.xml | 2 +- jkube-kit/jkube-kit-thorntail-v2/pom.xml | 2 +- jkube-kit/jkube-kit-vertx/pom.xml | 2 +- jkube-kit/jkube-kit-wildfly-jar/pom.xml | 2 +- jkube-kit/parent/pom.xml | 2 +- jkube-kit/pom.xml | 4 ++-- jkube-kit/profile/pom.xml | 2 +- jkube-kit/remote-dev/pom.xml | 2 +- jkube-kit/resource/service/pom.xml | 2 +- jkube-kit/watcher/api/pom.xml | 2 +- jkube-kit/watcher/standard/pom.xml | 2 +- kubernetes-maven-plugin/doc/pom.xml | 2 +- kubernetes-maven-plugin/it/pom.xml | 2 +- kubernetes-maven-plugin/plugin/pom.xml | 2 +- kubernetes-maven-plugin/pom.xml | 2 +- openshift-maven-plugin/it/pom.xml | 2 +- openshift-maven-plugin/plugin/pom.xml | 2 +- openshift-maven-plugin/pom.xml | 2 +- pom.xml | 4 ++-- quickstarts/gradle/dapr-hello-world/build.gradle | 4 ++-- .../docker-file-provided-context-and-assembly/build.gradle | 2 +- .../docker-file-provided-context-and-file/build.gradle | 2 +- .../gradle/docker-file-provided-context-dir/build.gradle | 2 +- .../gradle/docker-file-provided-docker-file/build.gradle | 2 +- quickstarts/gradle/docker-file-simple/build.gradle | 2 +- quickstarts/gradle/groovy-dsl-config/build.gradle | 2 +- quickstarts/gradle/micronaut-customized-image/build.gradle | 2 +- quickstarts/gradle/micronaut/build.gradle | 4 ++-- quickstarts/gradle/micronaut4/build.gradle | 4 ++-- quickstarts/gradle/openliberty/build.gradle | 2 +- quickstarts/gradle/plugin/app/build.gradle | 2 +- quickstarts/gradle/plugin/buildSrc/build.gradle | 2 +- quickstarts/gradle/quarkus-customized-image/build.gradle | 2 +- quickstarts/gradle/quarkus/build.gradle | 4 ++-- quickstarts/gradle/spring-boot-camel-complete/build.gradle | 4 ++-- quickstarts/gradle/spring-boot-crd/build.gradle | 6 +++--- quickstarts/gradle/spring-boot-helm/build.gradle | 4 ++-- quickstarts/gradle/spring-boot-watch/build.gradle | 4 ++-- .../gradle/spring-boot-with-jib-assembly/build.gradle | 2 +- quickstarts/gradle/spring-boot/build.gradle | 4 ++-- quickstarts/gradle/vertx/build.gradle | 4 ++-- quickstarts/gradle/webapp-custom/build.gradle | 2 +- quickstarts/gradle/webapp-jetty/build.gradle | 4 ++-- quickstarts/gradle/webapp-wildfly/build.gradle | 4 ++-- quickstarts/gradle/webapp/build.gradle | 4 ++-- quickstarts/kit/custom-foo-generator/app/build.gradle | 4 ++-- .../kit/custom-foo-generator/foo-generator/build.gradle | 2 +- .../kit/custom-istio-enricher-gradle/app/build.gradle | 4 ++-- .../kit/custom-istio-enricher-gradle/buildSrc/build.gradle | 2 +- .../compile-time-enricher/build.gradle | 2 +- quickstarts/kit/custom-istio-enricher/app/pom.xml | 4 ++-- .../kit/custom-istio-enricher/istio-enricher/pom.xml | 4 ++-- quickstarts/kit/custom-istio-enricher/pom.xml | 2 +- quickstarts/kit/docker-image/pom.xml | 2 +- .../kit/dynamic-docker-image-file-multi-layer/pom.xml | 2 +- quickstarts/kit/helm/pom.xml | 2 +- quickstarts/maven/docker-file-provided/pom.xml | 2 +- quickstarts/maven/docker-file-simple/pom.xml | 2 +- quickstarts/maven/external-resources/pom.xml | 2 +- quickstarts/maven/helidon-microprofile/pom.xml | 2 +- quickstarts/maven/helidon-se/pom.xml | 2 +- quickstarts/maven/hello-world/pom.xml | 2 +- .../javaee8-webprofile-liberty-app-it/pom.xml | 4 ++-- .../javaee8-webprofile-liberty-app/pom.xml | 4 ++-- quickstarts/maven/ibm-javaee8-webprofile-liberty/pom.xml | 2 +- quickstarts/maven/karaf-camel-2-log/pom.xml | 2 +- quickstarts/maven/karaf-camel-3-log/pom.xml | 2 +- quickstarts/maven/micronaut-customized-image/pom.xml | 2 +- quickstarts/maven/micronaut/pom.xml | 2 +- quickstarts/maven/micronaut4/pom.xml | 2 +- quickstarts/maven/openliberty-microprofile/pom.xml | 2 +- quickstarts/maven/openliberty/pom.xml | 2 +- quickstarts/maven/plugin/app/pom.xml | 4 ++-- quickstarts/maven/plugin/jkube-plugin/pom.xml | 4 ++-- quickstarts/maven/plugin/pom.xml | 2 +- quickstarts/maven/quarkus-customized-image/pom.xml | 2 +- quickstarts/maven/quarkus/pom.xml | 2 +- quickstarts/maven/spring-boot-camel-complete/pom.xml | 2 +- quickstarts/maven/spring-boot-crd/pom.xml | 2 +- quickstarts/maven/spring-boot-dekorate/pom.xml | 2 +- quickstarts/maven/spring-boot-helm/pom.xml | 2 +- quickstarts/maven/spring-boot-watch/pom.xml | 2 +- quickstarts/maven/spring-boot-with-jib/pom.xml | 2 +- quickstarts/maven/spring-boot/pom.xml | 2 +- quickstarts/maven/thorntail/pom.xml | 2 +- quickstarts/maven/tomee/pom.xml | 2 +- quickstarts/maven/uber-jar/pom.xml | 2 +- quickstarts/maven/vertx/pom.xml | 2 +- quickstarts/maven/vertx4/pom.xml | 2 +- quickstarts/maven/webapp-jetty/pom.xml | 2 +- quickstarts/maven/webapp-wildfly-datasource/pom.xml | 2 +- quickstarts/maven/webapp-wildfly/pom.xml | 2 +- quickstarts/maven/webapp/pom.xml | 2 +- quickstarts/maven/wildfly-jar-slim/pom.xml | 2 +- quickstarts/maven/wildfly-jar/pom.xml | 2 +- quickstarts/maven/xml-config/pom.xml | 2 +- quickstarts/maven/yaml-only/pom.xml | 2 +- quickstarts/maven/zero-config/pom.xml | 2 +- 132 files changed, 158 insertions(+), 157 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 019f9be3e9..db40afebd7 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -46,6 +46,7 @@ body: description: Eclipse JKube version (can be found in pom.xml dependency or build.gradle implementation section) options: - "SNAPSHOT" + - "1.17.0" - "1.16.2" - "1.15.0" - "1.14.0" diff --git a/CHANGELOG.md b/CHANGELOG.md index d902558563..c137b24afb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,7 +20,7 @@ Usage: # ./scripts/changelog.sh semanticVersionNumber [linkLabelStartNumber] ./scripts/extract-changelog-for-version.sh 1.3.37 5 ``` -### 1.17-SNAPSHOT +### 1.17.0 (2024-08-12) * Fix #494: Support for Micronaut Framework Native Images * Fix #1989: Remove storageClass related fields from VolumePermissionEnricher * Fix #2098: Add support for multi-platform container image builds in jib build strategy diff --git a/gradle-plugin/doc/pom.xml b/gradle-plugin/doc/pom.xml index 0db67146fa..d288c1c1df 100644 --- a/gradle-plugin/doc/pom.xml +++ b/gradle-plugin/doc/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube gradle-plugin - 1.17-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/gradle-plugin/it/pom.xml b/gradle-plugin/it/pom.xml index 925dce1927..2aac47f954 100644 --- a/gradle-plugin/it/pom.xml +++ b/gradle-plugin/it/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube gradle-plugin - 1.17-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/gradle-plugin/kubernetes/pom.xml b/gradle-plugin/kubernetes/pom.xml index 6c9a94d251..df6f141ac6 100644 --- a/gradle-plugin/kubernetes/pom.xml +++ b/gradle-plugin/kubernetes/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube gradle-plugin - 1.17-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/gradle-plugin/openshift/pom.xml b/gradle-plugin/openshift/pom.xml index 8538c21d3b..8779bd4c77 100644 --- a/gradle-plugin/openshift/pom.xml +++ b/gradle-plugin/openshift/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube gradle-plugin - 1.17-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/gradle-plugin/pom.xml b/gradle-plugin/pom.xml index ead90a236f..a4ac193344 100644 --- a/gradle-plugin/pom.xml +++ b/gradle-plugin/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube - 1.17-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/jkube-kit/api/pom.xml b/jkube-kit/api/pom.xml index 5137b9eec5..224d2124f4 100644 --- a/jkube-kit/api/pom.xml +++ b/jkube-kit/api/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../parent/pom.xml jkube-kit-api diff --git a/jkube-kit/build/api/pom.xml b/jkube-kit/build/api/pom.xml index 480f4f8de2..cd2cb08642 100644 --- a/jkube-kit/build/api/pom.xml +++ b/jkube-kit/build/api/pom.xml @@ -20,12 +20,12 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../../parent/pom.xml jkube-kit-build-api - 1.17-SNAPSHOT + 1.17.0 JKube Kit :: Build :: API diff --git a/jkube-kit/build/service/buildpacks/pom.xml b/jkube-kit/build/service/buildpacks/pom.xml index 26297912b2..c4d1a57f96 100644 --- a/jkube-kit/build/service/buildpacks/pom.xml +++ b/jkube-kit/build/service/buildpacks/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../../../parent/pom.xml diff --git a/jkube-kit/build/service/docker/pom.xml b/jkube-kit/build/service/docker/pom.xml index 29aa84b651..e0242ed0b5 100644 --- a/jkube-kit/build/service/docker/pom.xml +++ b/jkube-kit/build/service/docker/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../../../parent/pom.xml diff --git a/jkube-kit/build/service/jib/pom.xml b/jkube-kit/build/service/jib/pom.xml index 1a051b9033..58f2866514 100644 --- a/jkube-kit/build/service/jib/pom.xml +++ b/jkube-kit/build/service/jib/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../../../parent/pom.xml diff --git a/jkube-kit/common-it/pom.xml b/jkube-kit/common-it/pom.xml index 7c48d85d27..48a400f0f7 100644 --- a/jkube-kit/common-it/pom.xml +++ b/jkube-kit/common-it/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../parent/pom.xml diff --git a/jkube-kit/common-maven/pom.xml b/jkube-kit/common-maven/pom.xml index 2d26f06a7e..00fd7e1ee3 100644 --- a/jkube-kit/common-maven/pom.xml +++ b/jkube-kit/common-maven/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../parent/pom.xml diff --git a/jkube-kit/common/pom.xml b/jkube-kit/common/pom.xml index 2389f6e75a..f8d232a99c 100644 --- a/jkube-kit/common/pom.xml +++ b/jkube-kit/common/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../parent/pom.xml diff --git a/jkube-kit/config/image/pom.xml b/jkube-kit/config/image/pom.xml index cb1d7fcf53..fdaa4cc02d 100644 --- a/jkube-kit/config/image/pom.xml +++ b/jkube-kit/config/image/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/config/resource/pom.xml b/jkube-kit/config/resource/pom.xml index 609a01adb1..edd2e0a94b 100644 --- a/jkube-kit/config/resource/pom.xml +++ b/jkube-kit/config/resource/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/config/service/pom.xml b/jkube-kit/config/service/pom.xml index 61bdd6cf59..184169c09d 100644 --- a/jkube-kit/config/service/pom.xml +++ b/jkube-kit/config/service/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/doc/pom.xml b/jkube-kit/doc/pom.xml index 329db0d58c..a757cd5698 100644 --- a/jkube-kit/doc/pom.xml +++ b/jkube-kit/doc/pom.xml @@ -20,12 +20,12 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../parent/pom.xml jkube-kit-doc - 1.17-SNAPSHOT + 1.17.0 jar JKube Kit :: Documentation diff --git a/jkube-kit/enricher/api/pom.xml b/jkube-kit/enricher/api/pom.xml index dc3b38e3a6..2e0dc3f5c7 100644 --- a/jkube-kit/enricher/api/pom.xml +++ b/jkube-kit/enricher/api/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/enricher/generic/pom.xml b/jkube-kit/enricher/generic/pom.xml index df9a02266e..cfd65511e1 100644 --- a/jkube-kit/enricher/generic/pom.xml +++ b/jkube-kit/enricher/generic/pom.xml @@ -19,7 +19,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/enricher/specific/pom.xml b/jkube-kit/enricher/specific/pom.xml index 7ef2ac0248..10c54c615d 100644 --- a/jkube-kit/enricher/specific/pom.xml +++ b/jkube-kit/enricher/specific/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/generator/api/pom.xml b/jkube-kit/generator/api/pom.xml index f47b7e9c6f..685f750212 100644 --- a/jkube-kit/generator/api/pom.xml +++ b/jkube-kit/generator/api/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/generator/dockerfile-simple/pom.xml b/jkube-kit/generator/dockerfile-simple/pom.xml index 8b267a2249..b8cd927022 100644 --- a/jkube-kit/generator/dockerfile-simple/pom.xml +++ b/jkube-kit/generator/dockerfile-simple/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/generator/java-exec/pom.xml b/jkube-kit/generator/java-exec/pom.xml index fcdd7c8560..451307239a 100644 --- a/jkube-kit/generator/java-exec/pom.xml +++ b/jkube-kit/generator/java-exec/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/generator/karaf/pom.xml b/jkube-kit/generator/karaf/pom.xml index e1e6620a77..08789ddc5b 100644 --- a/jkube-kit/generator/karaf/pom.xml +++ b/jkube-kit/generator/karaf/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/generator/webapp/pom.xml b/jkube-kit/generator/webapp/pom.xml index b707ba6bda..5f0b955b47 100644 --- a/jkube-kit/generator/webapp/pom.xml +++ b/jkube-kit/generator/webapp/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/helm/pom.xml b/jkube-kit/helm/pom.xml index 02f1be8674..3a761b844b 100644 --- a/jkube-kit/helm/pom.xml +++ b/jkube-kit/helm/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../parent/pom.xml diff --git a/jkube-kit/jkube-kit-helidon/pom.xml b/jkube-kit/jkube-kit-helidon/pom.xml index c889c7cf66..5dfbebf578 100644 --- a/jkube-kit/jkube-kit-helidon/pom.xml +++ b/jkube-kit/jkube-kit-helidon/pom.xml @@ -21,7 +21,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17-SNAPSHOT + 1.17.0 ../parent/pom.xml diff --git a/jkube-kit/jkube-kit-micronaut/pom.xml b/jkube-kit/jkube-kit-micronaut/pom.xml index 4c74157b4f..da77eb8766 100644 --- a/jkube-kit/jkube-kit-micronaut/pom.xml +++ b/jkube-kit/jkube-kit-micronaut/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-microprofile/pom.xml b/jkube-kit/jkube-kit-microprofile/pom.xml index ed347e2497..69000ef659 100644 --- a/jkube-kit/jkube-kit-microprofile/pom.xml +++ b/jkube-kit/jkube-kit-microprofile/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-openliberty/pom.xml b/jkube-kit/jkube-kit-openliberty/pom.xml index 6065c13809..b2074c654f 100644 --- a/jkube-kit/jkube-kit-openliberty/pom.xml +++ b/jkube-kit/jkube-kit-openliberty/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-quarkus/pom.xml b/jkube-kit/jkube-kit-quarkus/pom.xml index 5ae4096651..911d31c689 100644 --- a/jkube-kit/jkube-kit-quarkus/pom.xml +++ b/jkube-kit/jkube-kit-quarkus/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-smallrye/pom.xml b/jkube-kit/jkube-kit-smallrye/pom.xml index a3a1f202bb..21f5ab8ece 100644 --- a/jkube-kit/jkube-kit-smallrye/pom.xml +++ b/jkube-kit/jkube-kit-smallrye/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-spring-boot/pom.xml b/jkube-kit/jkube-kit-spring-boot/pom.xml index 093dcc6ddf..bd21b499b3 100644 --- a/jkube-kit/jkube-kit-spring-boot/pom.xml +++ b/jkube-kit/jkube-kit-spring-boot/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-thorntail-v2/pom.xml b/jkube-kit/jkube-kit-thorntail-v2/pom.xml index 8fcf5a9549..22d57da170 100644 --- a/jkube-kit/jkube-kit-thorntail-v2/pom.xml +++ b/jkube-kit/jkube-kit-thorntail-v2/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-vertx/pom.xml b/jkube-kit/jkube-kit-vertx/pom.xml index 3fc7d70947..7b7b25275f 100644 --- a/jkube-kit/jkube-kit-vertx/pom.xml +++ b/jkube-kit/jkube-kit-vertx/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-wildfly-jar/pom.xml b/jkube-kit/jkube-kit-wildfly-jar/pom.xml index 7d160d31dd..893b8608b0 100644 --- a/jkube-kit/jkube-kit-wildfly-jar/pom.xml +++ b/jkube-kit/jkube-kit-wildfly-jar/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index a11040ebed..875c3ffbf5 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube - 1.17-SNAPSHOT + 1.17.0 ../../pom.xml diff --git a/jkube-kit/pom.xml b/jkube-kit/pom.xml index 294932c054..a721f9d425 100644 --- a/jkube-kit/pom.xml +++ b/jkube-kit/pom.xml @@ -18,13 +18,13 @@ 4.0.0 jkube-kit-build - 1.17-SNAPSHOT + 1.17.0 pom org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 parent/pom.xml diff --git a/jkube-kit/profile/pom.xml b/jkube-kit/profile/pom.xml index 860fd91004..2e589e7be6 100644 --- a/jkube-kit/profile/pom.xml +++ b/jkube-kit/profile/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/remote-dev/pom.xml b/jkube-kit/remote-dev/pom.xml index 8b90cfd53a..7bdb1187f4 100644 --- a/jkube-kit/remote-dev/pom.xml +++ b/jkube-kit/remote-dev/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../parent/pom.xml diff --git a/jkube-kit/resource/service/pom.xml b/jkube-kit/resource/service/pom.xml index 195988547f..f509f95b37 100644 --- a/jkube-kit/resource/service/pom.xml +++ b/jkube-kit/resource/service/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/watcher/api/pom.xml b/jkube-kit/watcher/api/pom.xml index 3dac897043..4ef04f8f42 100644 --- a/jkube-kit/watcher/api/pom.xml +++ b/jkube-kit/watcher/api/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/watcher/standard/pom.xml b/jkube-kit/watcher/standard/pom.xml index 7afd1bb29e..8a6f0d2c51 100644 --- a/jkube-kit/watcher/standard/pom.xml +++ b/jkube-kit/watcher/standard/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/kubernetes-maven-plugin/doc/pom.xml b/kubernetes-maven-plugin/doc/pom.xml index 4166b326a5..53757df600 100644 --- a/kubernetes-maven-plugin/doc/pom.xml +++ b/kubernetes-maven-plugin/doc/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube kubernetes-maven-plugin-parent - 1.17-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/kubernetes-maven-plugin/it/pom.xml b/kubernetes-maven-plugin/it/pom.xml index c1e25b402f..2440747b06 100644 --- a/kubernetes-maven-plugin/it/pom.xml +++ b/kubernetes-maven-plugin/it/pom.xml @@ -28,7 +28,7 @@ for running a single test with mvnDebug. org.eclipse.jkube kubernetes-maven-plugin-parent - 1.17-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/kubernetes-maven-plugin/plugin/pom.xml b/kubernetes-maven-plugin/plugin/pom.xml index 0d681a1c3c..60b77a4bc1 100644 --- a/kubernetes-maven-plugin/plugin/pom.xml +++ b/kubernetes-maven-plugin/plugin/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube kubernetes-maven-plugin-parent - 1.17-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/kubernetes-maven-plugin/pom.xml b/kubernetes-maven-plugin/pom.xml index 55adfab62c..50828caead 100644 --- a/kubernetes-maven-plugin/pom.xml +++ b/kubernetes-maven-plugin/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube - 1.17-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/openshift-maven-plugin/it/pom.xml b/openshift-maven-plugin/it/pom.xml index 06b7c06fac..3ea86abac3 100644 --- a/openshift-maven-plugin/it/pom.xml +++ b/openshift-maven-plugin/it/pom.xml @@ -26,7 +26,7 @@ for running a single test. org.eclipse.jkube openshift-maven-plugin-parent - 1.17-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/openshift-maven-plugin/plugin/pom.xml b/openshift-maven-plugin/plugin/pom.xml index 6c00443965..e74c0ea11a 100644 --- a/openshift-maven-plugin/plugin/pom.xml +++ b/openshift-maven-plugin/plugin/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube openshift-maven-plugin-parent - 1.17-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/openshift-maven-plugin/pom.xml b/openshift-maven-plugin/pom.xml index bba20d79c9..1e846b4959 100644 --- a/openshift-maven-plugin/pom.xml +++ b/openshift-maven-plugin/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube - 1.17-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/pom.xml b/pom.xml index 35a22005d2..1e1d46312b 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube jkube - 1.17-SNAPSHOT + 1.17.0 pom Eclipse JKube Eclipse JKube @@ -127,7 +127,7 @@ 1.7.36 3.11.0.3922 2.12.1 - 2024-03-27T11:10:46Z + 2024-08-12T12:31:39Z ${project.build.directory}/generated-docs diff --git a/quickstarts/gradle/dapr-hello-world/build.gradle b/quickstarts/gradle/dapr-hello-world/build.gradle index 4f35adcae5..5aa669cc67 100644 --- a/quickstarts/gradle/dapr-hello-world/build.gradle +++ b/quickstarts/gradle/dapr-hello-world/build.gradle @@ -25,8 +25,8 @@ plugins { id 'java' id 'org.springframework.boot' version '2.7.8' id 'io.spring.dependency-management' version '1.0.15.RELEASE' - id 'org.eclipse.jkube.kubernetes' version '1.16.2' - id 'org.eclipse.jkube.openshift' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' + id 'org.eclipse.jkube.openshift' version '1.17.0' } group = 'org.eclipse.jkube.quickstart.gradle.dapr' diff --git a/quickstarts/gradle/docker-file-provided-context-and-assembly/build.gradle b/quickstarts/gradle/docker-file-provided-context-and-assembly/build.gradle index d875f5d221..dc3d12252f 100644 --- a/quickstarts/gradle/docker-file-provided-context-and-assembly/build.gradle +++ b/quickstarts/gradle/docker-file-provided-context-and-assembly/build.gradle @@ -14,7 +14,7 @@ plugins { id 'org.springframework.boot' version '2.7.11' id 'io.spring.dependency-management' version '1.0.11.RELEASE' - id 'org.eclipse.jkube.kubernetes' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' id 'java' } diff --git a/quickstarts/gradle/docker-file-provided-context-and-file/build.gradle b/quickstarts/gradle/docker-file-provided-context-and-file/build.gradle index 4cebafbdcf..b155cc91d4 100644 --- a/quickstarts/gradle/docker-file-provided-context-and-file/build.gradle +++ b/quickstarts/gradle/docker-file-provided-context-and-file/build.gradle @@ -14,7 +14,7 @@ plugins { id 'org.springframework.boot' version '2.7.11' id 'io.spring.dependency-management' version '1.0.11.RELEASE' - id 'org.eclipse.jkube.kubernetes' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' id 'java' } diff --git a/quickstarts/gradle/docker-file-provided-context-dir/build.gradle b/quickstarts/gradle/docker-file-provided-context-dir/build.gradle index f417516b52..85cb67ccc0 100644 --- a/quickstarts/gradle/docker-file-provided-context-dir/build.gradle +++ b/quickstarts/gradle/docker-file-provided-context-dir/build.gradle @@ -14,7 +14,7 @@ plugins { id 'org.springframework.boot' version '2.7.11' id 'io.spring.dependency-management' version '1.0.11.RELEASE' - id 'org.eclipse.jkube.kubernetes' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' id 'java' } diff --git a/quickstarts/gradle/docker-file-provided-docker-file/build.gradle b/quickstarts/gradle/docker-file-provided-docker-file/build.gradle index 671267ba7a..38816eb72a 100644 --- a/quickstarts/gradle/docker-file-provided-docker-file/build.gradle +++ b/quickstarts/gradle/docker-file-provided-docker-file/build.gradle @@ -14,7 +14,7 @@ plugins { id 'org.springframework.boot' version '2.7.11' id 'io.spring.dependency-management' version '1.0.11.RELEASE' - id 'org.eclipse.jkube.kubernetes' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' id 'java' } diff --git a/quickstarts/gradle/docker-file-simple/build.gradle b/quickstarts/gradle/docker-file-simple/build.gradle index 542dba857b..57778104c2 100644 --- a/quickstarts/gradle/docker-file-simple/build.gradle +++ b/quickstarts/gradle/docker-file-simple/build.gradle @@ -14,7 +14,7 @@ plugins { id 'org.springframework.boot' version '2.7.11' id 'io.spring.dependency-management' version '1.0.11.RELEASE' - id 'org.eclipse.jkube.kubernetes' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' id 'java' } diff --git a/quickstarts/gradle/groovy-dsl-config/build.gradle b/quickstarts/gradle/groovy-dsl-config/build.gradle index dfb3922edb..15563f03a7 100644 --- a/quickstarts/gradle/groovy-dsl-config/build.gradle +++ b/quickstarts/gradle/groovy-dsl-config/build.gradle @@ -13,7 +13,7 @@ */ plugins { id 'java' - id("org.eclipse.jkube.kubernetes") version "1.16.2" + id("org.eclipse.jkube.kubernetes") version "1.17.0" } version = "1.5.1" diff --git a/quickstarts/gradle/micronaut-customized-image/build.gradle b/quickstarts/gradle/micronaut-customized-image/build.gradle index f993c8f178..0c96245c72 100644 --- a/quickstarts/gradle/micronaut-customized-image/build.gradle +++ b/quickstarts/gradle/micronaut-customized-image/build.gradle @@ -14,7 +14,7 @@ plugins { id("com.github.johnrengelman.shadow") version "7.0.0" id("io.micronaut.application") version "1.5.4" - id("org.eclipse.jkube.kubernetes") version "1.16.2" + id("org.eclipse.jkube.kubernetes") version "1.17.0" } version = "1.5.1" diff --git a/quickstarts/gradle/micronaut/build.gradle b/quickstarts/gradle/micronaut/build.gradle index fb46edb6d0..564f3cf563 100644 --- a/quickstarts/gradle/micronaut/build.gradle +++ b/quickstarts/gradle/micronaut/build.gradle @@ -14,8 +14,8 @@ plugins { id("com.github.johnrengelman.shadow") version "7.1.0" id("io.micronaut.application") version "3.0.2" - id("org.eclipse.jkube.kubernetes") version "1.16.2" - id("org.eclipse.jkube.openshift") version "1.16.2" + id("org.eclipse.jkube.kubernetes") version "1.17.0" + id("org.eclipse.jkube.openshift") version "1.17.0" } version = "0.1" diff --git a/quickstarts/gradle/micronaut4/build.gradle b/quickstarts/gradle/micronaut4/build.gradle index 66fe2868e3..9843970f1b 100644 --- a/quickstarts/gradle/micronaut4/build.gradle +++ b/quickstarts/gradle/micronaut4/build.gradle @@ -14,8 +14,8 @@ plugins { id("com.github.johnrengelman.shadow") version "8.1.1" id("io.micronaut.application") version "4.1.0" - id("org.eclipse.jkube.kubernetes") version "1.16.2" - id("org.eclipse.jkube.openshift") version "1.16.2" + id("org.eclipse.jkube.kubernetes") version "1.17.0" + id("org.eclipse.jkube.openshift") version "1.17.0" } version = "0.1" diff --git a/quickstarts/gradle/openliberty/build.gradle b/quickstarts/gradle/openliberty/build.gradle index 8a113078a9..3c297fed44 100644 --- a/quickstarts/gradle/openliberty/build.gradle +++ b/quickstarts/gradle/openliberty/build.gradle @@ -13,7 +13,7 @@ */ plugins { id 'io.openliberty.tools.gradle.Liberty' version '3.8.2' - id 'org.eclipse.jkube.kubernetes' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' id 'war' } diff --git a/quickstarts/gradle/plugin/app/build.gradle b/quickstarts/gradle/plugin/app/build.gradle index c7d1994009..00d0b53906 100644 --- a/quickstarts/gradle/plugin/app/build.gradle +++ b/quickstarts/gradle/plugin/app/build.gradle @@ -12,7 +12,7 @@ * Red Hat, Inc. - initial API and implementation */ plugins { - id 'org.eclipse.jkube.kubernetes' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' id 'org.springframework.boot' version '2.7.11' id 'io.spring.dependency-management' version '1.0.13.RELEASE' id 'java' diff --git a/quickstarts/gradle/plugin/buildSrc/build.gradle b/quickstarts/gradle/plugin/buildSrc/build.gradle index 7046bb1577..8746c8a639 100644 --- a/quickstarts/gradle/plugin/buildSrc/build.gradle +++ b/quickstarts/gradle/plugin/buildSrc/build.gradle @@ -26,5 +26,5 @@ repositories { } dependencies { - implementation 'org.eclipse.jkube:jkube-kit-api:1.16.2' + implementation 'org.eclipse.jkube:jkube-kit-api:1.17.0' } \ No newline at end of file diff --git a/quickstarts/gradle/quarkus-customized-image/build.gradle b/quickstarts/gradle/quarkus-customized-image/build.gradle index 5626efd0ac..1b64b0983a 100644 --- a/quickstarts/gradle/quarkus-customized-image/build.gradle +++ b/quickstarts/gradle/quarkus-customized-image/build.gradle @@ -14,7 +14,7 @@ plugins { id 'java' id 'io.quarkus' - id 'org.eclipse.jkube.openshift' version '1.16.2' + id 'org.eclipse.jkube.openshift' version '1.17.0' } repositories { diff --git a/quickstarts/gradle/quarkus/build.gradle b/quickstarts/gradle/quarkus/build.gradle index 25e7a0a4bd..ac991f2e6d 100644 --- a/quickstarts/gradle/quarkus/build.gradle +++ b/quickstarts/gradle/quarkus/build.gradle @@ -14,8 +14,8 @@ plugins { id 'java' id 'io.quarkus' - id 'org.eclipse.jkube.kubernetes' version '1.16.2' - id 'org.eclipse.jkube.openshift' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' + id 'org.eclipse.jkube.openshift' version '1.17.0' } repositories { diff --git a/quickstarts/gradle/spring-boot-camel-complete/build.gradle b/quickstarts/gradle/spring-boot-camel-complete/build.gradle index 7aebe0b682..08fa8d4e24 100644 --- a/quickstarts/gradle/spring-boot-camel-complete/build.gradle +++ b/quickstarts/gradle/spring-boot-camel-complete/build.gradle @@ -14,8 +14,8 @@ plugins { id 'org.springframework.boot' version '2.7.11' id 'io.spring.dependency-management' version '1.0.11.RELEASE' - id 'org.eclipse.jkube.kubernetes' version '1.16.2' - id 'org.eclipse.jkube.openshift' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' + id 'org.eclipse.jkube.openshift' version '1.17.0' id 'java' } diff --git a/quickstarts/gradle/spring-boot-crd/build.gradle b/quickstarts/gradle/spring-boot-crd/build.gradle index b88d69daa8..bb84c9eede 100644 --- a/quickstarts/gradle/spring-boot-crd/build.gradle +++ b/quickstarts/gradle/spring-boot-crd/build.gradle @@ -14,8 +14,8 @@ plugins { id 'org.springframework.boot' version '2.7.11' id 'io.spring.dependency-management' version '1.0.11.RELEASE' - id 'org.eclipse.jkube.kubernetes' version '1.16.2' - id 'org.eclipse.jkube.openshift' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' + id 'org.eclipse.jkube.openshift' version '1.17.0' id 'java' } @@ -31,7 +31,7 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-actuator' implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.eclipse.jkube.kubernetes:org.eclipse.jkube.kubernetes.gradle.plugin:1.16.2' + implementation 'org.eclipse.jkube.kubernetes:org.eclipse.jkube.kubernetes.gradle.plugin:1.17.0' } kubernetes { diff --git a/quickstarts/gradle/spring-boot-helm/build.gradle b/quickstarts/gradle/spring-boot-helm/build.gradle index 5c69c15437..70d6ef805e 100644 --- a/quickstarts/gradle/spring-boot-helm/build.gradle +++ b/quickstarts/gradle/spring-boot-helm/build.gradle @@ -14,8 +14,8 @@ plugins { id 'org.springframework.boot' version '2.7.11' id 'io.spring.dependency-management' version '1.0.11.RELEASE' - id 'org.eclipse.jkube.kubernetes' version '1.16.2' - id 'org.eclipse.jkube.openshift' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' + id 'org.eclipse.jkube.openshift' version '1.17.0' id 'java' } diff --git a/quickstarts/gradle/spring-boot-watch/build.gradle b/quickstarts/gradle/spring-boot-watch/build.gradle index e8efdf3342..08c3ce55f4 100644 --- a/quickstarts/gradle/spring-boot-watch/build.gradle +++ b/quickstarts/gradle/spring-boot-watch/build.gradle @@ -14,8 +14,8 @@ plugins { id 'org.springframework.boot' version '2.7.11' id 'io.spring.dependency-management' version '1.0.11.RELEASE' - id 'org.eclipse.jkube.kubernetes' version '1.16.2' - id 'org.eclipse.jkube.openshift' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' + id 'org.eclipse.jkube.openshift' version '1.17.0' id 'java' } diff --git a/quickstarts/gradle/spring-boot-with-jib-assembly/build.gradle b/quickstarts/gradle/spring-boot-with-jib-assembly/build.gradle index 4917134eb1..8660dba7bf 100644 --- a/quickstarts/gradle/spring-boot-with-jib-assembly/build.gradle +++ b/quickstarts/gradle/spring-boot-with-jib-assembly/build.gradle @@ -14,7 +14,7 @@ plugins { id 'org.springframework.boot' version '2.7.11' id 'io.spring.dependency-management' version '1.0.11.RELEASE' - id 'org.eclipse.jkube.kubernetes' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' id 'java' } diff --git a/quickstarts/gradle/spring-boot/build.gradle b/quickstarts/gradle/spring-boot/build.gradle index 47c73e5e32..2da7552707 100644 --- a/quickstarts/gradle/spring-boot/build.gradle +++ b/quickstarts/gradle/spring-boot/build.gradle @@ -12,8 +12,8 @@ * Red Hat, Inc. - initial API and implementation */ plugins { - id 'org.eclipse.jkube.kubernetes' version '1.16.2' - id 'org.eclipse.jkube.openshift' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' + id 'org.eclipse.jkube.openshift' version '1.17.0' id 'org.springframework.boot' version '2.7.11' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' diff --git a/quickstarts/gradle/vertx/build.gradle b/quickstarts/gradle/vertx/build.gradle index 65b86c7c40..22364d0cb9 100644 --- a/quickstarts/gradle/vertx/build.gradle +++ b/quickstarts/gradle/vertx/build.gradle @@ -14,8 +14,8 @@ plugins { id 'java' id 'application' - id 'org.eclipse.jkube.kubernetes' version '1.16.2' - id 'org.eclipse.jkube.openshift' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' + id 'org.eclipse.jkube.openshift' version '1.17.0' id 'com.github.johnrengelman.shadow' version '7.1.2' } diff --git a/quickstarts/gradle/webapp-custom/build.gradle b/quickstarts/gradle/webapp-custom/build.gradle index 660a7827bb..334a605f32 100644 --- a/quickstarts/gradle/webapp-custom/build.gradle +++ b/quickstarts/gradle/webapp-custom/build.gradle @@ -14,7 +14,7 @@ plugins { id 'java' id 'war' - id 'org.eclipse.jkube.kubernetes' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' } repositories { diff --git a/quickstarts/gradle/webapp-jetty/build.gradle b/quickstarts/gradle/webapp-jetty/build.gradle index 162fb27fbc..dc49e7572f 100644 --- a/quickstarts/gradle/webapp-jetty/build.gradle +++ b/quickstarts/gradle/webapp-jetty/build.gradle @@ -14,8 +14,8 @@ plugins { id 'java' id 'war' - id 'org.eclipse.jkube.kubernetes' version '1.16.2' - id 'org.eclipse.jkube.openshift' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' + id 'org.eclipse.jkube.openshift' version '1.17.0' } repositories { diff --git a/quickstarts/gradle/webapp-wildfly/build.gradle b/quickstarts/gradle/webapp-wildfly/build.gradle index 5e1a14ef8c..b148b0b7e8 100644 --- a/quickstarts/gradle/webapp-wildfly/build.gradle +++ b/quickstarts/gradle/webapp-wildfly/build.gradle @@ -14,8 +14,8 @@ plugins { id 'java' id 'war' - id 'org.eclipse.jkube.kubernetes' version '1.16.2' - id 'org.eclipse.jkube.openshift' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' + id 'org.eclipse.jkube.openshift' version '1.17.0' } repositories { diff --git a/quickstarts/gradle/webapp/build.gradle b/quickstarts/gradle/webapp/build.gradle index baa99414fd..15f72ea5e0 100644 --- a/quickstarts/gradle/webapp/build.gradle +++ b/quickstarts/gradle/webapp/build.gradle @@ -14,8 +14,8 @@ plugins { id 'java' id 'war' - id 'org.eclipse.jkube.kubernetes' version '1.16.2' - id 'org.eclipse.jkube.openshift' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' + id 'org.eclipse.jkube.openshift' version '1.17.0' } repositories { diff --git a/quickstarts/kit/custom-foo-generator/app/build.gradle b/quickstarts/kit/custom-foo-generator/app/build.gradle index 5d23483861..6e1e14c9b9 100644 --- a/quickstarts/kit/custom-foo-generator/app/build.gradle +++ b/quickstarts/kit/custom-foo-generator/app/build.gradle @@ -22,8 +22,8 @@ buildscript { } plugins { - id 'org.eclipse.jkube.kubernetes' version '1.16.2' - id 'org.eclipse.jkube.openshift' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' + id 'org.eclipse.jkube.openshift' version '1.17.0' id 'java' } diff --git a/quickstarts/kit/custom-foo-generator/foo-generator/build.gradle b/quickstarts/kit/custom-foo-generator/foo-generator/build.gradle index 4096b19e9e..77009417af 100644 --- a/quickstarts/kit/custom-foo-generator/foo-generator/build.gradle +++ b/quickstarts/kit/custom-foo-generator/foo-generator/build.gradle @@ -25,7 +25,7 @@ repositories { } dependencies { - implementation 'org.eclipse.jkube:jkube-kit-generator-api:1.16.2' + implementation 'org.eclipse.jkube:jkube-kit-generator-api:1.17.0' compileOnly 'org.projectlombok:lombok:1.18.22' annotationProcessor 'org.projectlombok:lombok:1.18.22' } diff --git a/quickstarts/kit/custom-istio-enricher-gradle/app/build.gradle b/quickstarts/kit/custom-istio-enricher-gradle/app/build.gradle index 9de044eb15..c5364b922f 100644 --- a/quickstarts/kit/custom-istio-enricher-gradle/app/build.gradle +++ b/quickstarts/kit/custom-istio-enricher-gradle/app/build.gradle @@ -12,8 +12,8 @@ * Red Hat, Inc. - initial API and implementation */ plugins { - id 'org.eclipse.jkube.kubernetes' version '1.16.2' - id 'org.eclipse.jkube.openshift' version '1.16.2' + id 'org.eclipse.jkube.kubernetes' version '1.17.0' + id 'org.eclipse.jkube.openshift' version '1.17.0' id 'org.springframework.boot' version '2.7.11' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' diff --git a/quickstarts/kit/custom-istio-enricher-gradle/buildSrc/build.gradle b/quickstarts/kit/custom-istio-enricher-gradle/buildSrc/build.gradle index f3a396d350..0025bcb2a0 100644 --- a/quickstarts/kit/custom-istio-enricher-gradle/buildSrc/build.gradle +++ b/quickstarts/kit/custom-istio-enricher-gradle/buildSrc/build.gradle @@ -18,7 +18,7 @@ repositories { } dependencies { - implementation 'org.eclipse.jkube:jkube-kit-enricher-api:1.16.2' + implementation 'org.eclipse.jkube:jkube-kit-enricher-api:1.17.0' implementation 'io.fabric8:istio-client:6.11.0' compileOnly 'org.projectlombok:lombok:1.18.22' annotationProcessor 'org.projectlombok:lombok:1.18.22' diff --git a/quickstarts/kit/custom-istio-enricher-gradle/compile-time-enricher/build.gradle b/quickstarts/kit/custom-istio-enricher-gradle/compile-time-enricher/build.gradle index f2c0f7a938..b4fd3f0153 100644 --- a/quickstarts/kit/custom-istio-enricher-gradle/compile-time-enricher/build.gradle +++ b/quickstarts/kit/custom-istio-enricher-gradle/compile-time-enricher/build.gradle @@ -17,7 +17,7 @@ plugins { } dependencies { - implementation 'org.eclipse.jkube:jkube-kit-enricher-api:1.16.2' + implementation 'org.eclipse.jkube:jkube-kit-enricher-api:1.17.0' } publishing { diff --git a/quickstarts/kit/custom-istio-enricher/app/pom.xml b/quickstarts/kit/custom-istio-enricher/app/pom.xml index 909cdac826..2a996473a9 100644 --- a/quickstarts/kit/custom-istio-enricher/app/pom.xml +++ b/quickstarts/kit/custom-istio-enricher/app/pom.xml @@ -21,12 +21,12 @@ eclipse-jkube-sample-custom-enricher-app jar - 1.16.2 + 1.17.0 org.eclipse.jkube.quickstarts.kit eclipse-jkube-sample-custom-enricher-parent - 1.16.2 + 1.17.0 ../pom.xml diff --git a/quickstarts/kit/custom-istio-enricher/istio-enricher/pom.xml b/quickstarts/kit/custom-istio-enricher/istio-enricher/pom.xml index 753ccbea0c..a60635257c 100644 --- a/quickstarts/kit/custom-istio-enricher/istio-enricher/pom.xml +++ b/quickstarts/kit/custom-istio-enricher/istio-enricher/pom.xml @@ -21,12 +21,12 @@ eclipse-jkube-sample-custom-enricher-istio jar - 1.16.2 + 1.17.0 org.eclipse.jkube.quickstarts.kit eclipse-jkube-sample-custom-enricher-parent - 1.16.2 + 1.17.0 ../pom.xml diff --git a/quickstarts/kit/custom-istio-enricher/pom.xml b/quickstarts/kit/custom-istio-enricher/pom.xml index 946809e057..fbcc2a3daa 100644 --- a/quickstarts/kit/custom-istio-enricher/pom.xml +++ b/quickstarts/kit/custom-istio-enricher/pom.xml @@ -21,7 +21,7 @@ eclipse-jkube-sample-custom-enricher-parent org.eclipse.jkube.quickstarts.kit - 1.16.2 + 1.17.0 pom diff --git a/quickstarts/kit/docker-image/pom.xml b/quickstarts/kit/docker-image/pom.xml index 1e67d36450..f1c26b8260 100644 --- a/quickstarts/kit/docker-image/pom.xml +++ b/quickstarts/kit/docker-image/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.kit docker-image - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Kit :: Docker Image jar diff --git a/quickstarts/kit/dynamic-docker-image-file-multi-layer/pom.xml b/quickstarts/kit/dynamic-docker-image-file-multi-layer/pom.xml index 58716a76bd..b4c96cf987 100644 --- a/quickstarts/kit/dynamic-docker-image-file-multi-layer/pom.xml +++ b/quickstarts/kit/dynamic-docker-image-file-multi-layer/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.kit dynamic-docker-image-file-multi-layer - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Kit :: Docker Image from Multilayer Dockerfile jar diff --git a/quickstarts/kit/helm/pom.xml b/quickstarts/kit/helm/pom.xml index 412599484b..1c5d1738a4 100644 --- a/quickstarts/kit/helm/pom.xml +++ b/quickstarts/kit/helm/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.kit helm - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Kit :: Helm jar diff --git a/quickstarts/maven/docker-file-provided/pom.xml b/quickstarts/maven/docker-file-provided/pom.xml index f5b6e1409a..d7c017c948 100644 --- a/quickstarts/maven/docker-file-provided/pom.xml +++ b/quickstarts/maven/docker-file-provided/pom.xml @@ -26,7 +26,7 @@ org.eclipse.jkube.quickstarts.maven docker-file-provided - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Docker File Provided jar diff --git a/quickstarts/maven/docker-file-simple/pom.xml b/quickstarts/maven/docker-file-simple/pom.xml index 661df09f6b..ee46b2ed9d 100644 --- a/quickstarts/maven/docker-file-simple/pom.xml +++ b/quickstarts/maven/docker-file-simple/pom.xml @@ -29,7 +29,7 @@ Eclipse JKube :: Quickstarts :: Maven :: Dockerfile :: Simple org.eclipse.jkube docker-file-simple - 1.16.2 + 1.17.0 This quickstart showcases how to use Eclipse JKube with external Docker files without any additional configuration. diff --git a/quickstarts/maven/external-resources/pom.xml b/quickstarts/maven/external-resources/pom.xml index b52466f716..0f7260f2ac 100644 --- a/quickstarts/maven/external-resources/pom.xml +++ b/quickstarts/maven/external-resources/pom.xml @@ -26,7 +26,7 @@ org.eclipse.jkube.quickstarts.maven external-resources - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: External Resources jar diff --git a/quickstarts/maven/helidon-microprofile/pom.xml b/quickstarts/maven/helidon-microprofile/pom.xml index f232841240..b7ba2ed9b0 100644 --- a/quickstarts/maven/helidon-microprofile/pom.xml +++ b/quickstarts/maven/helidon-microprofile/pom.xml @@ -26,7 +26,7 @@ org.eclipse.jkube.quickstarts.maven.helidon helidon-microprofile - 1.16.2 + 1.17.0 ${project.version} diff --git a/quickstarts/maven/helidon-se/pom.xml b/quickstarts/maven/helidon-se/pom.xml index d03534ead4..572d23395d 100644 --- a/quickstarts/maven/helidon-se/pom.xml +++ b/quickstarts/maven/helidon-se/pom.xml @@ -26,7 +26,7 @@ org.eclipse.jkube.quickstarts.maven.helidon helidon-se - 1.16.2 + 1.17.0 org.eclipse.jkube.quickstarts.maven.helidon.Main diff --git a/quickstarts/maven/hello-world/pom.xml b/quickstarts/maven/hello-world/pom.xml index 90b2ca46ab..2078dda6ea 100644 --- a/quickstarts/maven/hello-world/pom.xml +++ b/quickstarts/maven/hello-world/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.maven helloworld - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Hello World jar diff --git a/quickstarts/maven/ibm-javaee8-webprofile-liberty/javaee8-webprofile-liberty-app-it/pom.xml b/quickstarts/maven/ibm-javaee8-webprofile-liberty/javaee8-webprofile-liberty-app-it/pom.xml index d64610a51b..ae8a7d9219 100644 --- a/quickstarts/maven/ibm-javaee8-webprofile-liberty/javaee8-webprofile-liberty-app-it/pom.xml +++ b/quickstarts/maven/ibm-javaee8-webprofile-liberty/javaee8-webprofile-liberty-app-it/pom.xml @@ -21,12 +21,12 @@ org.eclipse.jkube.quickstarts.maven javaee8-webprofile-liberty - 1.16.2 + 1.17.0 ../pom.xml javaee8-webprofile-liberty-app-it - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: JavaEE 8 WebProfile :: IT jar diff --git a/quickstarts/maven/ibm-javaee8-webprofile-liberty/javaee8-webprofile-liberty-app/pom.xml b/quickstarts/maven/ibm-javaee8-webprofile-liberty/javaee8-webprofile-liberty-app/pom.xml index 8fe65e8c60..1271b34610 100644 --- a/quickstarts/maven/ibm-javaee8-webprofile-liberty/javaee8-webprofile-liberty-app/pom.xml +++ b/quickstarts/maven/ibm-javaee8-webprofile-liberty/javaee8-webprofile-liberty-app/pom.xml @@ -21,12 +21,12 @@ org.eclipse.jkube.quickstarts.maven javaee8-webprofile-liberty - 1.16.2 + 1.17.0 ../pom.xml javaee8-webprofile-liberty-app - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: JavaEE 8 WebProfile :: Application war diff --git a/quickstarts/maven/ibm-javaee8-webprofile-liberty/pom.xml b/quickstarts/maven/ibm-javaee8-webprofile-liberty/pom.xml index a4dbfceb24..19d068925d 100644 --- a/quickstarts/maven/ibm-javaee8-webprofile-liberty/pom.xml +++ b/quickstarts/maven/ibm-javaee8-webprofile-liberty/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.maven javaee8-webprofile-liberty - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: JavaEE 8 WebProfile pom diff --git a/quickstarts/maven/karaf-camel-2-log/pom.xml b/quickstarts/maven/karaf-camel-2-log/pom.xml index 7c03a448bd..1c981f34ad 100644 --- a/quickstarts/maven/karaf-camel-2-log/pom.xml +++ b/quickstarts/maven/karaf-camel-2-log/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.maven karaf-camel-2-log - 1.16.2 + 1.17.0 bundle Eclipse JKube :: Quickstarts :: Maven :: Karaf Camel 2 Log diff --git a/quickstarts/maven/karaf-camel-3-log/pom.xml b/quickstarts/maven/karaf-camel-3-log/pom.xml index d0ea4eaa52..42f4c627dc 100644 --- a/quickstarts/maven/karaf-camel-3-log/pom.xml +++ b/quickstarts/maven/karaf-camel-3-log/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.maven karaf-camel-3-log - 1.16.2 + 1.17.0 bundle Eclipse JKube :: Quickstarts :: Maven :: Karaf Camel 3 Log diff --git a/quickstarts/maven/micronaut-customized-image/pom.xml b/quickstarts/maven/micronaut-customized-image/pom.xml index 9e9ad98f20..683125739e 100644 --- a/quickstarts/maven/micronaut-customized-image/pom.xml +++ b/quickstarts/maven/micronaut-customized-image/pom.xml @@ -26,7 +26,7 @@ org.eclipse.jkube.quickstarts.maven micronaut-customized-image - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Micronaut customized Image Micronaut application featuring REST endpoints (micronaut-http) with validation (micronaut-validation). diff --git a/quickstarts/maven/micronaut/pom.xml b/quickstarts/maven/micronaut/pom.xml index f8ff9bfe45..5dafa25d1e 100644 --- a/quickstarts/maven/micronaut/pom.xml +++ b/quickstarts/maven/micronaut/pom.xml @@ -26,7 +26,7 @@ org.eclipse.jkube.quickstarts.maven micronaut - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Micronaut Micronaut application featuring REST endpoints (micronaut-http) with validation (micronaut-validation). diff --git a/quickstarts/maven/micronaut4/pom.xml b/quickstarts/maven/micronaut4/pom.xml index 4222d04bd0..758ca7bc24 100644 --- a/quickstarts/maven/micronaut4/pom.xml +++ b/quickstarts/maven/micronaut4/pom.xml @@ -26,7 +26,7 @@ org.eclipse.jkube.quickstarts.maven micronaut - 1.16.1 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Micronaut 4 Micronaut application featuring REST endpoints (micronaut-http) with validation (micronaut-validation). diff --git a/quickstarts/maven/openliberty-microprofile/pom.xml b/quickstarts/maven/openliberty-microprofile/pom.xml index 80e7d03869..32a01a8717 100644 --- a/quickstarts/maven/openliberty-microprofile/pom.xml +++ b/quickstarts/maven/openliberty-microprofile/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.maven openliberty-microprofile - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Open Liberty & MicroProfile war diff --git a/quickstarts/maven/openliberty/pom.xml b/quickstarts/maven/openliberty/pom.xml index f22a1f724a..6fdaaff62f 100644 --- a/quickstarts/maven/openliberty/pom.xml +++ b/quickstarts/maven/openliberty/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.maven openliberty - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Open Liberty war diff --git a/quickstarts/maven/plugin/app/pom.xml b/quickstarts/maven/plugin/app/pom.xml index 39f1606726..16e6e543b8 100644 --- a/quickstarts/maven/plugin/app/pom.xml +++ b/quickstarts/maven/plugin/app/pom.xml @@ -20,12 +20,12 @@ org.eclipse.jkube.quickstarts.maven plugin - 1.16.2 + 1.17.0 app Eclipse JKube :: Quickstarts :: Maven :: Plugin :: App - 1.16.2 + 1.17.0 NodePort diff --git a/quickstarts/maven/plugin/jkube-plugin/pom.xml b/quickstarts/maven/plugin/jkube-plugin/pom.xml index 23d5ccc226..7ffb42988a 100644 --- a/quickstarts/maven/plugin/jkube-plugin/pom.xml +++ b/quickstarts/maven/plugin/jkube-plugin/pom.xml @@ -20,12 +20,12 @@ org.eclipse.jkube.quickstarts.maven plugin - 1.16.2 + 1.17.0 jkube-plugin Eclipse JKube :: Quickstarts :: Maven :: Plugin :: JKube Plugin - 1.16.2 + 1.17.0 diff --git a/quickstarts/maven/plugin/pom.xml b/quickstarts/maven/plugin/pom.xml index 4711db24c3..9455d7d7f9 100644 --- a/quickstarts/maven/plugin/pom.xml +++ b/quickstarts/maven/plugin/pom.xml @@ -26,7 +26,7 @@ org.eclipse.jkube.quickstarts.maven plugin - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Plugin pom diff --git a/quickstarts/maven/quarkus-customized-image/pom.xml b/quickstarts/maven/quarkus-customized-image/pom.xml index c82e598072..f72ca238be 100644 --- a/quickstarts/maven/quarkus-customized-image/pom.xml +++ b/quickstarts/maven/quarkus-customized-image/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.maven quarkus-customized-image - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Quarkus customized Image Quarkus application with a single JAX-RS endpoint. diff --git a/quickstarts/maven/quarkus/pom.xml b/quickstarts/maven/quarkus/pom.xml index eaada05ba0..8caf37867a 100644 --- a/quickstarts/maven/quarkus/pom.xml +++ b/quickstarts/maven/quarkus/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.maven quarkus - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Quarkus Quarkus application with a single JAX-RS endpoint. diff --git a/quickstarts/maven/spring-boot-camel-complete/pom.xml b/quickstarts/maven/spring-boot-camel-complete/pom.xml index 41e39b3051..dd8272bfa5 100644 --- a/quickstarts/maven/spring-boot-camel-complete/pom.xml +++ b/quickstarts/maven/spring-boot-camel-complete/pom.xml @@ -26,7 +26,7 @@ org.eclipse.jkube.quickstarts.maven spring-boot-camel-complete - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Spring Boot - Camel jar diff --git a/quickstarts/maven/spring-boot-crd/pom.xml b/quickstarts/maven/spring-boot-crd/pom.xml index 4f2b737527..b43efea267 100644 --- a/quickstarts/maven/spring-boot-crd/pom.xml +++ b/quickstarts/maven/spring-boot-crd/pom.xml @@ -26,7 +26,7 @@ org.eclipse.jkube.quickstarts.maven spring-boot-crd - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Spring Boot - Custom Resources jar diff --git a/quickstarts/maven/spring-boot-dekorate/pom.xml b/quickstarts/maven/spring-boot-dekorate/pom.xml index fa403e5e2e..047ff56dbf 100644 --- a/quickstarts/maven/spring-boot-dekorate/pom.xml +++ b/quickstarts/maven/spring-boot-dekorate/pom.xml @@ -26,7 +26,7 @@ org.eclipse.jkube.quickstarts.maven spring-boot-dekorate - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Spring Boot - Dekorate jar diff --git a/quickstarts/maven/spring-boot-helm/pom.xml b/quickstarts/maven/spring-boot-helm/pom.xml index f83cd620f2..f87f0052de 100644 --- a/quickstarts/maven/spring-boot-helm/pom.xml +++ b/quickstarts/maven/spring-boot-helm/pom.xml @@ -26,7 +26,7 @@ org.eclipse.jkube.quickstarts.maven spring-boot-helm - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Spring Boot - Helm jar diff --git a/quickstarts/maven/spring-boot-watch/pom.xml b/quickstarts/maven/spring-boot-watch/pom.xml index 8094c06f3a..1a88901625 100644 --- a/quickstarts/maven/spring-boot-watch/pom.xml +++ b/quickstarts/maven/spring-boot-watch/pom.xml @@ -26,7 +26,7 @@ org.eclipse.jkube.quickstarts.maven spring-boot-watch - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Spring Boot Watch jar diff --git a/quickstarts/maven/spring-boot-with-jib/pom.xml b/quickstarts/maven/spring-boot-with-jib/pom.xml index 556126fb26..7f65a2e340 100644 --- a/quickstarts/maven/spring-boot-with-jib/pom.xml +++ b/quickstarts/maven/spring-boot-with-jib/pom.xml @@ -21,7 +21,7 @@ eclipse-jkube-sample-spring-boot-jib org.eclipse.jkube.quickstarts.maven - 1.16.2 + 1.17.0 jar diff --git a/quickstarts/maven/spring-boot/pom.xml b/quickstarts/maven/spring-boot/pom.xml index 647edb342c..bd3ae7044a 100644 --- a/quickstarts/maven/spring-boot/pom.xml +++ b/quickstarts/maven/spring-boot/pom.xml @@ -26,7 +26,7 @@ org.eclipse.jkube.quickstarts.maven spring-boot - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Spring Boot Web jar diff --git a/quickstarts/maven/thorntail/pom.xml b/quickstarts/maven/thorntail/pom.xml index b9cf60fb0f..bee91a9e5a 100644 --- a/quickstarts/maven/thorntail/pom.xml +++ b/quickstarts/maven/thorntail/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.maven thorntail - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Thorntail war diff --git a/quickstarts/maven/tomee/pom.xml b/quickstarts/maven/tomee/pom.xml index 8ca4d2c4dd..c329060725 100644 --- a/quickstarts/maven/tomee/pom.xml +++ b/quickstarts/maven/tomee/pom.xml @@ -19,7 +19,7 @@ 4.0.0 org.eclipse.jkube.quickstarts.maven tomee - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Tomee war diff --git a/quickstarts/maven/uber-jar/pom.xml b/quickstarts/maven/uber-jar/pom.xml index 68fd4d2db0..fc602993e4 100644 --- a/quickstarts/maven/uber-jar/pom.xml +++ b/quickstarts/maven/uber-jar/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.maven uberjar - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Uber Jar jar diff --git a/quickstarts/maven/vertx/pom.xml b/quickstarts/maven/vertx/pom.xml index 8a25056b79..8345b78b12 100644 --- a/quickstarts/maven/vertx/pom.xml +++ b/quickstarts/maven/vertx/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.maven vertx - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Vertx Web jar diff --git a/quickstarts/maven/vertx4/pom.xml b/quickstarts/maven/vertx4/pom.xml index 48576282cd..bcd8c5cb3d 100644 --- a/quickstarts/maven/vertx4/pom.xml +++ b/quickstarts/maven/vertx4/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.maven vertx-4 - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Vertx 4 Web jar diff --git a/quickstarts/maven/webapp-jetty/pom.xml b/quickstarts/maven/webapp-jetty/pom.xml index 41d85374a5..2a48be16ad 100644 --- a/quickstarts/maven/webapp-jetty/pom.xml +++ b/quickstarts/maven/webapp-jetty/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.maven webapp-jetty - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Webapp Jetty war diff --git a/quickstarts/maven/webapp-wildfly-datasource/pom.xml b/quickstarts/maven/webapp-wildfly-datasource/pom.xml index 989db664ff..ad4ff3f955 100644 --- a/quickstarts/maven/webapp-wildfly-datasource/pom.xml +++ b/quickstarts/maven/webapp-wildfly-datasource/pom.xml @@ -18,7 +18,7 @@ 4.0.0 org.eclipse.jkube webapp-wildfly-datasource - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Webapp :: Wildfly :: Datasource war diff --git a/quickstarts/maven/webapp-wildfly/pom.xml b/quickstarts/maven/webapp-wildfly/pom.xml index 7145fcbb4a..6c644b19ea 100644 --- a/quickstarts/maven/webapp-wildfly/pom.xml +++ b/quickstarts/maven/webapp-wildfly/pom.xml @@ -19,7 +19,7 @@ 4.0.0 org.eclipse.jkube jkube-maven-sample-webapp-wildfly - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Webapp :: Wildfly war diff --git a/quickstarts/maven/webapp/pom.xml b/quickstarts/maven/webapp/pom.xml index 30bf86eb56..fcf163f0d3 100644 --- a/quickstarts/maven/webapp/pom.xml +++ b/quickstarts/maven/webapp/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.maven webapp - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Webapp war diff --git a/quickstarts/maven/wildfly-jar-slim/pom.xml b/quickstarts/maven/wildfly-jar-slim/pom.xml index 25e4123a15..c68294ca96 100644 --- a/quickstarts/maven/wildfly-jar-slim/pom.xml +++ b/quickstarts/maven/wildfly-jar-slim/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.maven wildfly-jar-slim - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Wildfly JAR :: Slim war diff --git a/quickstarts/maven/wildfly-jar/pom.xml b/quickstarts/maven/wildfly-jar/pom.xml index 187cd5011c..73b2f448fb 100644 --- a/quickstarts/maven/wildfly-jar/pom.xml +++ b/quickstarts/maven/wildfly-jar/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.maven wildfly-jar - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Wildfly JAR war diff --git a/quickstarts/maven/xml-config/pom.xml b/quickstarts/maven/xml-config/pom.xml index d37e989ce5..47d1183fcc 100644 --- a/quickstarts/maven/xml-config/pom.xml +++ b/quickstarts/maven/xml-config/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.maven xml-config - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: XML configuration jar diff --git a/quickstarts/maven/yaml-only/pom.xml b/quickstarts/maven/yaml-only/pom.xml index cf69f052fc..7a05bf4a8c 100644 --- a/quickstarts/maven/yaml-only/pom.xml +++ b/quickstarts/maven/yaml-only/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube.quickstarts.maven yaml - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Yaml jar diff --git a/quickstarts/maven/zero-config/pom.xml b/quickstarts/maven/zero-config/pom.xml index f2e7f5a84a..f131110e47 100644 --- a/quickstarts/maven/zero-config/pom.xml +++ b/quickstarts/maven/zero-config/pom.xml @@ -20,7 +20,7 @@ jkube-maven-sample-zero-config org.eclipse.jkube - 1.16.2 + 1.17.0 Eclipse JKube :: Quickstarts :: Maven :: Zero-Config jar From 098597fedfbe3a31a81b7a259e62283db1398603 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Mon, 12 Aug 2024 18:12:50 +0530 Subject: [PATCH 272/289] [RELEASE] Prepare for next development iteration Signed-off-by: Rohan Kumar --- CHANGELOG.md | 2 ++ gradle-plugin/doc/pom.xml | 2 +- gradle-plugin/it/pom.xml | 2 +- gradle-plugin/kubernetes/pom.xml | 2 +- gradle-plugin/openshift/pom.xml | 2 +- gradle-plugin/pom.xml | 2 +- jkube-kit/api/pom.xml | 2 +- jkube-kit/build/api/pom.xml | 4 ++-- jkube-kit/build/service/buildpacks/pom.xml | 2 +- jkube-kit/build/service/docker/pom.xml | 2 +- jkube-kit/build/service/jib/pom.xml | 2 +- jkube-kit/common-it/pom.xml | 2 +- jkube-kit/common-maven/pom.xml | 2 +- jkube-kit/common/pom.xml | 2 +- jkube-kit/config/image/pom.xml | 2 +- jkube-kit/config/resource/pom.xml | 2 +- jkube-kit/config/service/pom.xml | 2 +- jkube-kit/doc/pom.xml | 4 ++-- jkube-kit/enricher/api/pom.xml | 2 +- jkube-kit/enricher/generic/pom.xml | 2 +- jkube-kit/enricher/specific/pom.xml | 2 +- jkube-kit/generator/api/pom.xml | 2 +- jkube-kit/generator/dockerfile-simple/pom.xml | 2 +- jkube-kit/generator/java-exec/pom.xml | 2 +- jkube-kit/generator/karaf/pom.xml | 2 +- jkube-kit/generator/webapp/pom.xml | 2 +- jkube-kit/helm/pom.xml | 2 +- jkube-kit/jkube-kit-helidon/pom.xml | 2 +- jkube-kit/jkube-kit-micronaut/pom.xml | 2 +- jkube-kit/jkube-kit-microprofile/pom.xml | 2 +- jkube-kit/jkube-kit-openliberty/pom.xml | 2 +- jkube-kit/jkube-kit-quarkus/pom.xml | 2 +- jkube-kit/jkube-kit-smallrye/pom.xml | 2 +- jkube-kit/jkube-kit-spring-boot/pom.xml | 2 +- jkube-kit/jkube-kit-thorntail-v2/pom.xml | 2 +- jkube-kit/jkube-kit-vertx/pom.xml | 2 +- jkube-kit/jkube-kit-wildfly-jar/pom.xml | 2 +- jkube-kit/parent/pom.xml | 2 +- jkube-kit/pom.xml | 4 ++-- jkube-kit/profile/pom.xml | 2 +- jkube-kit/remote-dev/pom.xml | 2 +- jkube-kit/resource/service/pom.xml | 2 +- jkube-kit/watcher/api/pom.xml | 2 +- jkube-kit/watcher/standard/pom.xml | 2 +- kubernetes-maven-plugin/doc/pom.xml | 2 +- kubernetes-maven-plugin/it/pom.xml | 2 +- kubernetes-maven-plugin/plugin/pom.xml | 2 +- kubernetes-maven-plugin/pom.xml | 2 +- openshift-maven-plugin/it/pom.xml | 2 +- openshift-maven-plugin/plugin/pom.xml | 2 +- openshift-maven-plugin/pom.xml | 2 +- pom.xml | 4 ++-- 52 files changed, 57 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c137b24afb..366d3433ff 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,8 @@ Usage: # ./scripts/changelog.sh semanticVersionNumber [linkLabelStartNumber] ./scripts/extract-changelog-for-version.sh 1.3.37 5 ``` +### 1.18-SNAPSHOT + ### 1.17.0 (2024-08-12) * Fix #494: Support for Micronaut Framework Native Images * Fix #1989: Remove storageClass related fields from VolumePermissionEnricher diff --git a/gradle-plugin/doc/pom.xml b/gradle-plugin/doc/pom.xml index d288c1c1df..045b404acf 100644 --- a/gradle-plugin/doc/pom.xml +++ b/gradle-plugin/doc/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube gradle-plugin - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/gradle-plugin/it/pom.xml b/gradle-plugin/it/pom.xml index 2aac47f954..18adca2d22 100644 --- a/gradle-plugin/it/pom.xml +++ b/gradle-plugin/it/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube gradle-plugin - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/gradle-plugin/kubernetes/pom.xml b/gradle-plugin/kubernetes/pom.xml index df6f141ac6..fe305b6f76 100644 --- a/gradle-plugin/kubernetes/pom.xml +++ b/gradle-plugin/kubernetes/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube gradle-plugin - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/gradle-plugin/openshift/pom.xml b/gradle-plugin/openshift/pom.xml index 8779bd4c77..01bca5c4de 100644 --- a/gradle-plugin/openshift/pom.xml +++ b/gradle-plugin/openshift/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube gradle-plugin - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/gradle-plugin/pom.xml b/gradle-plugin/pom.xml index a4ac193344..e750ffbbce 100644 --- a/gradle-plugin/pom.xml +++ b/gradle-plugin/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/jkube-kit/api/pom.xml b/jkube-kit/api/pom.xml index 224d2124f4..f08c8eca38 100644 --- a/jkube-kit/api/pom.xml +++ b/jkube-kit/api/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml jkube-kit-api diff --git a/jkube-kit/build/api/pom.xml b/jkube-kit/build/api/pom.xml index cd2cb08642..258a0cb2bb 100644 --- a/jkube-kit/build/api/pom.xml +++ b/jkube-kit/build/api/pom.xml @@ -20,12 +20,12 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml jkube-kit-build-api - 1.17.0 + 1.18-SNAPSHOT JKube Kit :: Build :: API diff --git a/jkube-kit/build/service/buildpacks/pom.xml b/jkube-kit/build/service/buildpacks/pom.xml index c4d1a57f96..b0502f5585 100644 --- a/jkube-kit/build/service/buildpacks/pom.xml +++ b/jkube-kit/build/service/buildpacks/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../../parent/pom.xml diff --git a/jkube-kit/build/service/docker/pom.xml b/jkube-kit/build/service/docker/pom.xml index e0242ed0b5..519b0eb17f 100644 --- a/jkube-kit/build/service/docker/pom.xml +++ b/jkube-kit/build/service/docker/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../../parent/pom.xml diff --git a/jkube-kit/build/service/jib/pom.xml b/jkube-kit/build/service/jib/pom.xml index 58f2866514..b19e867ea4 100644 --- a/jkube-kit/build/service/jib/pom.xml +++ b/jkube-kit/build/service/jib/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../../parent/pom.xml diff --git a/jkube-kit/common-it/pom.xml b/jkube-kit/common-it/pom.xml index 48a400f0f7..035e8834b5 100644 --- a/jkube-kit/common-it/pom.xml +++ b/jkube-kit/common-it/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml diff --git a/jkube-kit/common-maven/pom.xml b/jkube-kit/common-maven/pom.xml index 00fd7e1ee3..9444fee264 100644 --- a/jkube-kit/common-maven/pom.xml +++ b/jkube-kit/common-maven/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml diff --git a/jkube-kit/common/pom.xml b/jkube-kit/common/pom.xml index f8d232a99c..9def9d7b7e 100644 --- a/jkube-kit/common/pom.xml +++ b/jkube-kit/common/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml diff --git a/jkube-kit/config/image/pom.xml b/jkube-kit/config/image/pom.xml index fdaa4cc02d..7c0ce30e3d 100644 --- a/jkube-kit/config/image/pom.xml +++ b/jkube-kit/config/image/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/config/resource/pom.xml b/jkube-kit/config/resource/pom.xml index edd2e0a94b..6c002ffeea 100644 --- a/jkube-kit/config/resource/pom.xml +++ b/jkube-kit/config/resource/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/config/service/pom.xml b/jkube-kit/config/service/pom.xml index 184169c09d..cc7ebbcef5 100644 --- a/jkube-kit/config/service/pom.xml +++ b/jkube-kit/config/service/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/doc/pom.xml b/jkube-kit/doc/pom.xml index a757cd5698..1f4ecfe1b7 100644 --- a/jkube-kit/doc/pom.xml +++ b/jkube-kit/doc/pom.xml @@ -20,12 +20,12 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml jkube-kit-doc - 1.17.0 + 1.18-SNAPSHOT jar JKube Kit :: Documentation diff --git a/jkube-kit/enricher/api/pom.xml b/jkube-kit/enricher/api/pom.xml index 2e0dc3f5c7..d480903d5c 100644 --- a/jkube-kit/enricher/api/pom.xml +++ b/jkube-kit/enricher/api/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/enricher/generic/pom.xml b/jkube-kit/enricher/generic/pom.xml index cfd65511e1..8dffa67cd5 100644 --- a/jkube-kit/enricher/generic/pom.xml +++ b/jkube-kit/enricher/generic/pom.xml @@ -19,7 +19,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/enricher/specific/pom.xml b/jkube-kit/enricher/specific/pom.xml index 10c54c615d..4f1816adcc 100644 --- a/jkube-kit/enricher/specific/pom.xml +++ b/jkube-kit/enricher/specific/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/generator/api/pom.xml b/jkube-kit/generator/api/pom.xml index 685f750212..fd9ac12eee 100644 --- a/jkube-kit/generator/api/pom.xml +++ b/jkube-kit/generator/api/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/generator/dockerfile-simple/pom.xml b/jkube-kit/generator/dockerfile-simple/pom.xml index b8cd927022..1f30ee68a1 100644 --- a/jkube-kit/generator/dockerfile-simple/pom.xml +++ b/jkube-kit/generator/dockerfile-simple/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/generator/java-exec/pom.xml b/jkube-kit/generator/java-exec/pom.xml index 451307239a..663a88c195 100644 --- a/jkube-kit/generator/java-exec/pom.xml +++ b/jkube-kit/generator/java-exec/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/generator/karaf/pom.xml b/jkube-kit/generator/karaf/pom.xml index 08789ddc5b..3771aa8526 100644 --- a/jkube-kit/generator/karaf/pom.xml +++ b/jkube-kit/generator/karaf/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/generator/webapp/pom.xml b/jkube-kit/generator/webapp/pom.xml index 5f0b955b47..d19ed67b9c 100644 --- a/jkube-kit/generator/webapp/pom.xml +++ b/jkube-kit/generator/webapp/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/helm/pom.xml b/jkube-kit/helm/pom.xml index 3a761b844b..d1e608ee9f 100644 --- a/jkube-kit/helm/pom.xml +++ b/jkube-kit/helm/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml diff --git a/jkube-kit/jkube-kit-helidon/pom.xml b/jkube-kit/jkube-kit-helidon/pom.xml index 5dfbebf578..a9fdbfd85a 100644 --- a/jkube-kit/jkube-kit-helidon/pom.xml +++ b/jkube-kit/jkube-kit-helidon/pom.xml @@ -21,7 +21,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml diff --git a/jkube-kit/jkube-kit-micronaut/pom.xml b/jkube-kit/jkube-kit-micronaut/pom.xml index da77eb8766..ec0b08546e 100644 --- a/jkube-kit/jkube-kit-micronaut/pom.xml +++ b/jkube-kit/jkube-kit-micronaut/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-microprofile/pom.xml b/jkube-kit/jkube-kit-microprofile/pom.xml index 69000ef659..554151c67c 100644 --- a/jkube-kit/jkube-kit-microprofile/pom.xml +++ b/jkube-kit/jkube-kit-microprofile/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-openliberty/pom.xml b/jkube-kit/jkube-kit-openliberty/pom.xml index b2074c654f..bbbfab089f 100644 --- a/jkube-kit/jkube-kit-openliberty/pom.xml +++ b/jkube-kit/jkube-kit-openliberty/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-quarkus/pom.xml b/jkube-kit/jkube-kit-quarkus/pom.xml index 911d31c689..2826001271 100644 --- a/jkube-kit/jkube-kit-quarkus/pom.xml +++ b/jkube-kit/jkube-kit-quarkus/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-smallrye/pom.xml b/jkube-kit/jkube-kit-smallrye/pom.xml index 21f5ab8ece..1c7f03a160 100644 --- a/jkube-kit/jkube-kit-smallrye/pom.xml +++ b/jkube-kit/jkube-kit-smallrye/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-spring-boot/pom.xml b/jkube-kit/jkube-kit-spring-boot/pom.xml index bd21b499b3..5a3247b00e 100644 --- a/jkube-kit/jkube-kit-spring-boot/pom.xml +++ b/jkube-kit/jkube-kit-spring-boot/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-thorntail-v2/pom.xml b/jkube-kit/jkube-kit-thorntail-v2/pom.xml index 22d57da170..c5412c8d6c 100644 --- a/jkube-kit/jkube-kit-thorntail-v2/pom.xml +++ b/jkube-kit/jkube-kit-thorntail-v2/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-vertx/pom.xml b/jkube-kit/jkube-kit-vertx/pom.xml index 7b7b25275f..002020338e 100644 --- a/jkube-kit/jkube-kit-vertx/pom.xml +++ b/jkube-kit/jkube-kit-vertx/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-wildfly-jar/pom.xml b/jkube-kit/jkube-kit-wildfly-jar/pom.xml index 893b8608b0..bd23d2bd3c 100644 --- a/jkube-kit/jkube-kit-wildfly-jar/pom.xml +++ b/jkube-kit/jkube-kit-wildfly-jar/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index 875c3ffbf5..c7ebc9c99c 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube - 1.17.0 + 1.18-SNAPSHOT ../../pom.xml diff --git a/jkube-kit/pom.xml b/jkube-kit/pom.xml index a721f9d425..617e888315 100644 --- a/jkube-kit/pom.xml +++ b/jkube-kit/pom.xml @@ -18,13 +18,13 @@ 4.0.0 jkube-kit-build - 1.17.0 + 1.18-SNAPSHOT pom org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT parent/pom.xml diff --git a/jkube-kit/profile/pom.xml b/jkube-kit/profile/pom.xml index 2e589e7be6..9808e3be07 100644 --- a/jkube-kit/profile/pom.xml +++ b/jkube-kit/profile/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/remote-dev/pom.xml b/jkube-kit/remote-dev/pom.xml index 7bdb1187f4..fa3ee61cf6 100644 --- a/jkube-kit/remote-dev/pom.xml +++ b/jkube-kit/remote-dev/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml diff --git a/jkube-kit/resource/service/pom.xml b/jkube-kit/resource/service/pom.xml index f509f95b37..3cd245726a 100644 --- a/jkube-kit/resource/service/pom.xml +++ b/jkube-kit/resource/service/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/watcher/api/pom.xml b/jkube-kit/watcher/api/pom.xml index 4ef04f8f42..2887e06a78 100644 --- a/jkube-kit/watcher/api/pom.xml +++ b/jkube-kit/watcher/api/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/watcher/standard/pom.xml b/jkube-kit/watcher/standard/pom.xml index 8a6f0d2c51..86435392ba 100644 --- a/jkube-kit/watcher/standard/pom.xml +++ b/jkube-kit/watcher/standard/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/kubernetes-maven-plugin/doc/pom.xml b/kubernetes-maven-plugin/doc/pom.xml index 53757df600..f8d229c679 100644 --- a/kubernetes-maven-plugin/doc/pom.xml +++ b/kubernetes-maven-plugin/doc/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube kubernetes-maven-plugin-parent - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/kubernetes-maven-plugin/it/pom.xml b/kubernetes-maven-plugin/it/pom.xml index 2440747b06..54cbedf960 100644 --- a/kubernetes-maven-plugin/it/pom.xml +++ b/kubernetes-maven-plugin/it/pom.xml @@ -28,7 +28,7 @@ for running a single test with mvnDebug. org.eclipse.jkube kubernetes-maven-plugin-parent - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/kubernetes-maven-plugin/plugin/pom.xml b/kubernetes-maven-plugin/plugin/pom.xml index 60b77a4bc1..78c910c5e4 100644 --- a/kubernetes-maven-plugin/plugin/pom.xml +++ b/kubernetes-maven-plugin/plugin/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube kubernetes-maven-plugin-parent - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/kubernetes-maven-plugin/pom.xml b/kubernetes-maven-plugin/pom.xml index 50828caead..593a19c97a 100644 --- a/kubernetes-maven-plugin/pom.xml +++ b/kubernetes-maven-plugin/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/openshift-maven-plugin/it/pom.xml b/openshift-maven-plugin/it/pom.xml index 3ea86abac3..98d48f7d45 100644 --- a/openshift-maven-plugin/it/pom.xml +++ b/openshift-maven-plugin/it/pom.xml @@ -26,7 +26,7 @@ for running a single test. org.eclipse.jkube openshift-maven-plugin-parent - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/openshift-maven-plugin/plugin/pom.xml b/openshift-maven-plugin/plugin/pom.xml index e74c0ea11a..56f6e6e0c0 100644 --- a/openshift-maven-plugin/plugin/pom.xml +++ b/openshift-maven-plugin/plugin/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube openshift-maven-plugin-parent - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/openshift-maven-plugin/pom.xml b/openshift-maven-plugin/pom.xml index 1e846b4959..112b8664ed 100644 --- a/openshift-maven-plugin/pom.xml +++ b/openshift-maven-plugin/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/pom.xml b/pom.xml index 1e1d46312b..056f2e8f1e 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube jkube - 1.17.0 + 1.18-SNAPSHOT pom Eclipse JKube Eclipse JKube @@ -127,7 +127,7 @@ 1.7.36 3.11.0.3922 2.12.1 - 2024-08-12T12:31:39Z + 2024-08-12T12:41:13Z ${project.build.directory}/generated-docs From e627ebb36ad0b2bba049f2641db69f50a640782a Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Tue, 13 Aug 2024 14:33:52 +0530 Subject: [PATCH 273/289] chore(deps): bump maven-plugin-plugin to v3.13.1 Signed-off-by: Rohan Kumar --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 056f2e8f1e..4e54d1d9e6 100644 --- a/pom.xml +++ b/pom.xml @@ -116,7 +116,7 @@ 3.6.1 3.4.1 3.6.3 - 3.13.0 + 3.13.1 3.0.1 3.3.1 3.3.1 From f3426c6f97dfe35f98e1bdf834342be8bf4b2815 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Tue, 13 Aug 2024 14:44:03 +0530 Subject: [PATCH 274/289] [RELEASE] Updated project version to 1.17.0 Signed-off-by: Rohan Kumar --- CHANGELOG.md | 4 +--- gradle-plugin/doc/pom.xml | 2 +- gradle-plugin/it/pom.xml | 2 +- gradle-plugin/kubernetes/pom.xml | 2 +- gradle-plugin/openshift/pom.xml | 2 +- gradle-plugin/pom.xml | 2 +- jkube-kit/api/pom.xml | 2 +- jkube-kit/build/api/pom.xml | 4 ++-- jkube-kit/build/service/buildpacks/pom.xml | 2 +- jkube-kit/build/service/docker/pom.xml | 2 +- jkube-kit/build/service/jib/pom.xml | 2 +- jkube-kit/common-it/pom.xml | 2 +- jkube-kit/common-maven/pom.xml | 2 +- jkube-kit/common/pom.xml | 2 +- jkube-kit/config/image/pom.xml | 2 +- jkube-kit/config/resource/pom.xml | 2 +- jkube-kit/config/service/pom.xml | 2 +- jkube-kit/doc/pom.xml | 4 ++-- jkube-kit/enricher/api/pom.xml | 2 +- jkube-kit/enricher/generic/pom.xml | 2 +- jkube-kit/enricher/specific/pom.xml | 2 +- jkube-kit/generator/api/pom.xml | 2 +- jkube-kit/generator/dockerfile-simple/pom.xml | 2 +- jkube-kit/generator/java-exec/pom.xml | 2 +- jkube-kit/generator/karaf/pom.xml | 2 +- jkube-kit/generator/webapp/pom.xml | 2 +- jkube-kit/helm/pom.xml | 2 +- jkube-kit/jkube-kit-helidon/pom.xml | 2 +- jkube-kit/jkube-kit-micronaut/pom.xml | 2 +- jkube-kit/jkube-kit-microprofile/pom.xml | 2 +- jkube-kit/jkube-kit-openliberty/pom.xml | 2 +- jkube-kit/jkube-kit-quarkus/pom.xml | 2 +- jkube-kit/jkube-kit-smallrye/pom.xml | 2 +- jkube-kit/jkube-kit-spring-boot/pom.xml | 2 +- jkube-kit/jkube-kit-thorntail-v2/pom.xml | 2 +- jkube-kit/jkube-kit-vertx/pom.xml | 2 +- jkube-kit/jkube-kit-wildfly-jar/pom.xml | 2 +- jkube-kit/parent/pom.xml | 2 +- jkube-kit/pom.xml | 4 ++-- jkube-kit/profile/pom.xml | 2 +- jkube-kit/remote-dev/pom.xml | 2 +- jkube-kit/resource/service/pom.xml | 2 +- jkube-kit/watcher/api/pom.xml | 2 +- jkube-kit/watcher/standard/pom.xml | 2 +- kubernetes-maven-plugin/doc/pom.xml | 2 +- kubernetes-maven-plugin/it/pom.xml | 2 +- kubernetes-maven-plugin/plugin/pom.xml | 2 +- kubernetes-maven-plugin/pom.xml | 2 +- openshift-maven-plugin/it/pom.xml | 2 +- openshift-maven-plugin/plugin/pom.xml | 2 +- openshift-maven-plugin/pom.xml | 2 +- pom.xml | 4 ++-- 52 files changed, 56 insertions(+), 58 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 366d3433ff..4057afbdf4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,9 +20,7 @@ Usage: # ./scripts/changelog.sh semanticVersionNumber [linkLabelStartNumber] ./scripts/extract-changelog-for-version.sh 1.3.37 5 ``` -### 1.18-SNAPSHOT - -### 1.17.0 (2024-08-12) +### 1.17.0 (2024-08-13) * Fix #494: Support for Micronaut Framework Native Images * Fix #1989: Remove storageClass related fields from VolumePermissionEnricher * Fix #2098: Add support for multi-platform container image builds in jib build strategy diff --git a/gradle-plugin/doc/pom.xml b/gradle-plugin/doc/pom.xml index 045b404acf..d288c1c1df 100644 --- a/gradle-plugin/doc/pom.xml +++ b/gradle-plugin/doc/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube gradle-plugin - 1.18-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/gradle-plugin/it/pom.xml b/gradle-plugin/it/pom.xml index 18adca2d22..2aac47f954 100644 --- a/gradle-plugin/it/pom.xml +++ b/gradle-plugin/it/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube gradle-plugin - 1.18-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/gradle-plugin/kubernetes/pom.xml b/gradle-plugin/kubernetes/pom.xml index fe305b6f76..df6f141ac6 100644 --- a/gradle-plugin/kubernetes/pom.xml +++ b/gradle-plugin/kubernetes/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube gradle-plugin - 1.18-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/gradle-plugin/openshift/pom.xml b/gradle-plugin/openshift/pom.xml index 01bca5c4de..8779bd4c77 100644 --- a/gradle-plugin/openshift/pom.xml +++ b/gradle-plugin/openshift/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube gradle-plugin - 1.18-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/gradle-plugin/pom.xml b/gradle-plugin/pom.xml index e750ffbbce..a4ac193344 100644 --- a/gradle-plugin/pom.xml +++ b/gradle-plugin/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube - 1.18-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/jkube-kit/api/pom.xml b/jkube-kit/api/pom.xml index f08c8eca38..224d2124f4 100644 --- a/jkube-kit/api/pom.xml +++ b/jkube-kit/api/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../parent/pom.xml jkube-kit-api diff --git a/jkube-kit/build/api/pom.xml b/jkube-kit/build/api/pom.xml index 258a0cb2bb..cd2cb08642 100644 --- a/jkube-kit/build/api/pom.xml +++ b/jkube-kit/build/api/pom.xml @@ -20,12 +20,12 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../../parent/pom.xml jkube-kit-build-api - 1.18-SNAPSHOT + 1.17.0 JKube Kit :: Build :: API diff --git a/jkube-kit/build/service/buildpacks/pom.xml b/jkube-kit/build/service/buildpacks/pom.xml index b0502f5585..c4d1a57f96 100644 --- a/jkube-kit/build/service/buildpacks/pom.xml +++ b/jkube-kit/build/service/buildpacks/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../../../parent/pom.xml diff --git a/jkube-kit/build/service/docker/pom.xml b/jkube-kit/build/service/docker/pom.xml index 519b0eb17f..e0242ed0b5 100644 --- a/jkube-kit/build/service/docker/pom.xml +++ b/jkube-kit/build/service/docker/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../../../parent/pom.xml diff --git a/jkube-kit/build/service/jib/pom.xml b/jkube-kit/build/service/jib/pom.xml index b19e867ea4..58f2866514 100644 --- a/jkube-kit/build/service/jib/pom.xml +++ b/jkube-kit/build/service/jib/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../../../parent/pom.xml diff --git a/jkube-kit/common-it/pom.xml b/jkube-kit/common-it/pom.xml index 035e8834b5..48a400f0f7 100644 --- a/jkube-kit/common-it/pom.xml +++ b/jkube-kit/common-it/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../parent/pom.xml diff --git a/jkube-kit/common-maven/pom.xml b/jkube-kit/common-maven/pom.xml index 9444fee264..00fd7e1ee3 100644 --- a/jkube-kit/common-maven/pom.xml +++ b/jkube-kit/common-maven/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../parent/pom.xml diff --git a/jkube-kit/common/pom.xml b/jkube-kit/common/pom.xml index 9def9d7b7e..f8d232a99c 100644 --- a/jkube-kit/common/pom.xml +++ b/jkube-kit/common/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../parent/pom.xml diff --git a/jkube-kit/config/image/pom.xml b/jkube-kit/config/image/pom.xml index 7c0ce30e3d..fdaa4cc02d 100644 --- a/jkube-kit/config/image/pom.xml +++ b/jkube-kit/config/image/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/config/resource/pom.xml b/jkube-kit/config/resource/pom.xml index 6c002ffeea..edd2e0a94b 100644 --- a/jkube-kit/config/resource/pom.xml +++ b/jkube-kit/config/resource/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/config/service/pom.xml b/jkube-kit/config/service/pom.xml index cc7ebbcef5..184169c09d 100644 --- a/jkube-kit/config/service/pom.xml +++ b/jkube-kit/config/service/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/doc/pom.xml b/jkube-kit/doc/pom.xml index 1f4ecfe1b7..a757cd5698 100644 --- a/jkube-kit/doc/pom.xml +++ b/jkube-kit/doc/pom.xml @@ -20,12 +20,12 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../parent/pom.xml jkube-kit-doc - 1.18-SNAPSHOT + 1.17.0 jar JKube Kit :: Documentation diff --git a/jkube-kit/enricher/api/pom.xml b/jkube-kit/enricher/api/pom.xml index d480903d5c..2e0dc3f5c7 100644 --- a/jkube-kit/enricher/api/pom.xml +++ b/jkube-kit/enricher/api/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/enricher/generic/pom.xml b/jkube-kit/enricher/generic/pom.xml index 8dffa67cd5..cfd65511e1 100644 --- a/jkube-kit/enricher/generic/pom.xml +++ b/jkube-kit/enricher/generic/pom.xml @@ -19,7 +19,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/enricher/specific/pom.xml b/jkube-kit/enricher/specific/pom.xml index 4f1816adcc..10c54c615d 100644 --- a/jkube-kit/enricher/specific/pom.xml +++ b/jkube-kit/enricher/specific/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/generator/api/pom.xml b/jkube-kit/generator/api/pom.xml index fd9ac12eee..685f750212 100644 --- a/jkube-kit/generator/api/pom.xml +++ b/jkube-kit/generator/api/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/generator/dockerfile-simple/pom.xml b/jkube-kit/generator/dockerfile-simple/pom.xml index 1f30ee68a1..b8cd927022 100644 --- a/jkube-kit/generator/dockerfile-simple/pom.xml +++ b/jkube-kit/generator/dockerfile-simple/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/generator/java-exec/pom.xml b/jkube-kit/generator/java-exec/pom.xml index 663a88c195..451307239a 100644 --- a/jkube-kit/generator/java-exec/pom.xml +++ b/jkube-kit/generator/java-exec/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/generator/karaf/pom.xml b/jkube-kit/generator/karaf/pom.xml index 3771aa8526..08789ddc5b 100644 --- a/jkube-kit/generator/karaf/pom.xml +++ b/jkube-kit/generator/karaf/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/generator/webapp/pom.xml b/jkube-kit/generator/webapp/pom.xml index d19ed67b9c..5f0b955b47 100644 --- a/jkube-kit/generator/webapp/pom.xml +++ b/jkube-kit/generator/webapp/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/helm/pom.xml b/jkube-kit/helm/pom.xml index d1e608ee9f..3a761b844b 100644 --- a/jkube-kit/helm/pom.xml +++ b/jkube-kit/helm/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../parent/pom.xml diff --git a/jkube-kit/jkube-kit-helidon/pom.xml b/jkube-kit/jkube-kit-helidon/pom.xml index a9fdbfd85a..5dfbebf578 100644 --- a/jkube-kit/jkube-kit-helidon/pom.xml +++ b/jkube-kit/jkube-kit-helidon/pom.xml @@ -21,7 +21,7 @@ jkube-kit-parent org.eclipse.jkube - 1.18-SNAPSHOT + 1.17.0 ../parent/pom.xml diff --git a/jkube-kit/jkube-kit-micronaut/pom.xml b/jkube-kit/jkube-kit-micronaut/pom.xml index ec0b08546e..da77eb8766 100644 --- a/jkube-kit/jkube-kit-micronaut/pom.xml +++ b/jkube-kit/jkube-kit-micronaut/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-microprofile/pom.xml b/jkube-kit/jkube-kit-microprofile/pom.xml index 554151c67c..69000ef659 100644 --- a/jkube-kit/jkube-kit-microprofile/pom.xml +++ b/jkube-kit/jkube-kit-microprofile/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.18-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-openliberty/pom.xml b/jkube-kit/jkube-kit-openliberty/pom.xml index bbbfab089f..b2074c654f 100644 --- a/jkube-kit/jkube-kit-openliberty/pom.xml +++ b/jkube-kit/jkube-kit-openliberty/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.18-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-quarkus/pom.xml b/jkube-kit/jkube-kit-quarkus/pom.xml index 2826001271..911d31c689 100644 --- a/jkube-kit/jkube-kit-quarkus/pom.xml +++ b/jkube-kit/jkube-kit-quarkus/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.18-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-smallrye/pom.xml b/jkube-kit/jkube-kit-smallrye/pom.xml index 1c7f03a160..21f5ab8ece 100644 --- a/jkube-kit/jkube-kit-smallrye/pom.xml +++ b/jkube-kit/jkube-kit-smallrye/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.18-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-spring-boot/pom.xml b/jkube-kit/jkube-kit-spring-boot/pom.xml index 5a3247b00e..bd21b499b3 100644 --- a/jkube-kit/jkube-kit-spring-boot/pom.xml +++ b/jkube-kit/jkube-kit-spring-boot/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.18-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-thorntail-v2/pom.xml b/jkube-kit/jkube-kit-thorntail-v2/pom.xml index c5412c8d6c..22d57da170 100644 --- a/jkube-kit/jkube-kit-thorntail-v2/pom.xml +++ b/jkube-kit/jkube-kit-thorntail-v2/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-vertx/pom.xml b/jkube-kit/jkube-kit-vertx/pom.xml index 002020338e..7b7b25275f 100644 --- a/jkube-kit/jkube-kit-vertx/pom.xml +++ b/jkube-kit/jkube-kit-vertx/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.18-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-wildfly-jar/pom.xml b/jkube-kit/jkube-kit-wildfly-jar/pom.xml index bd23d2bd3c..893b8608b0 100644 --- a/jkube-kit/jkube-kit-wildfly-jar/pom.xml +++ b/jkube-kit/jkube-kit-wildfly-jar/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index c7ebc9c99c..875c3ffbf5 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube - 1.18-SNAPSHOT + 1.17.0 ../../pom.xml diff --git a/jkube-kit/pom.xml b/jkube-kit/pom.xml index 617e888315..a721f9d425 100644 --- a/jkube-kit/pom.xml +++ b/jkube-kit/pom.xml @@ -18,13 +18,13 @@ 4.0.0 jkube-kit-build - 1.18-SNAPSHOT + 1.17.0 pom org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 parent/pom.xml diff --git a/jkube-kit/profile/pom.xml b/jkube-kit/profile/pom.xml index 9808e3be07..2e589e7be6 100644 --- a/jkube-kit/profile/pom.xml +++ b/jkube-kit/profile/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.18-SNAPSHOT + 1.17.0 ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/remote-dev/pom.xml b/jkube-kit/remote-dev/pom.xml index fa3ee61cf6..7bdb1187f4 100644 --- a/jkube-kit/remote-dev/pom.xml +++ b/jkube-kit/remote-dev/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../parent/pom.xml diff --git a/jkube-kit/resource/service/pom.xml b/jkube-kit/resource/service/pom.xml index 3cd245726a..f509f95b37 100644 --- a/jkube-kit/resource/service/pom.xml +++ b/jkube-kit/resource/service/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/watcher/api/pom.xml b/jkube-kit/watcher/api/pom.xml index 2887e06a78..4ef04f8f42 100644 --- a/jkube-kit/watcher/api/pom.xml +++ b/jkube-kit/watcher/api/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/jkube-kit/watcher/standard/pom.xml b/jkube-kit/watcher/standard/pom.xml index 86435392ba..8a6f0d2c51 100644 --- a/jkube-kit/watcher/standard/pom.xml +++ b/jkube-kit/watcher/standard/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.18-SNAPSHOT + 1.17.0 ../../parent/pom.xml diff --git a/kubernetes-maven-plugin/doc/pom.xml b/kubernetes-maven-plugin/doc/pom.xml index f8d229c679..53757df600 100644 --- a/kubernetes-maven-plugin/doc/pom.xml +++ b/kubernetes-maven-plugin/doc/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube kubernetes-maven-plugin-parent - 1.18-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/kubernetes-maven-plugin/it/pom.xml b/kubernetes-maven-plugin/it/pom.xml index 54cbedf960..2440747b06 100644 --- a/kubernetes-maven-plugin/it/pom.xml +++ b/kubernetes-maven-plugin/it/pom.xml @@ -28,7 +28,7 @@ for running a single test with mvnDebug. org.eclipse.jkube kubernetes-maven-plugin-parent - 1.18-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/kubernetes-maven-plugin/plugin/pom.xml b/kubernetes-maven-plugin/plugin/pom.xml index 78c910c5e4..60b77a4bc1 100644 --- a/kubernetes-maven-plugin/plugin/pom.xml +++ b/kubernetes-maven-plugin/plugin/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube kubernetes-maven-plugin-parent - 1.18-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/kubernetes-maven-plugin/pom.xml b/kubernetes-maven-plugin/pom.xml index 593a19c97a..50828caead 100644 --- a/kubernetes-maven-plugin/pom.xml +++ b/kubernetes-maven-plugin/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube - 1.18-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/openshift-maven-plugin/it/pom.xml b/openshift-maven-plugin/it/pom.xml index 98d48f7d45..3ea86abac3 100644 --- a/openshift-maven-plugin/it/pom.xml +++ b/openshift-maven-plugin/it/pom.xml @@ -26,7 +26,7 @@ for running a single test. org.eclipse.jkube openshift-maven-plugin-parent - 1.18-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/openshift-maven-plugin/plugin/pom.xml b/openshift-maven-plugin/plugin/pom.xml index 56f6e6e0c0..e74c0ea11a 100644 --- a/openshift-maven-plugin/plugin/pom.xml +++ b/openshift-maven-plugin/plugin/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube openshift-maven-plugin-parent - 1.18-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/openshift-maven-plugin/pom.xml b/openshift-maven-plugin/pom.xml index 112b8664ed..1e846b4959 100644 --- a/openshift-maven-plugin/pom.xml +++ b/openshift-maven-plugin/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube - 1.18-SNAPSHOT + 1.17.0 ../pom.xml diff --git a/pom.xml b/pom.xml index 4e54d1d9e6..c68cbbc66e 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube jkube - 1.18-SNAPSHOT + 1.17.0 pom Eclipse JKube Eclipse JKube @@ -127,7 +127,7 @@ 1.7.36 3.11.0.3922 2.12.1 - 2024-08-12T12:41:13Z + 2024-08-13T09:08:40Z ${project.build.directory}/generated-docs From 2f1ac69221c8cda42bcbb6866f9b74908caa0189 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Tue, 13 Aug 2024 14:47:45 +0530 Subject: [PATCH 275/289] [RELEASE] Prepare for next development iteration Signed-off-by: Rohan Kumar --- CHANGELOG.md | 2 ++ gradle-plugin/doc/pom.xml | 2 +- gradle-plugin/it/pom.xml | 2 +- gradle-plugin/kubernetes/pom.xml | 2 +- gradle-plugin/openshift/pom.xml | 2 +- gradle-plugin/pom.xml | 2 +- jkube-kit/api/pom.xml | 2 +- jkube-kit/build/api/pom.xml | 4 ++-- jkube-kit/build/service/buildpacks/pom.xml | 2 +- jkube-kit/build/service/docker/pom.xml | 2 +- jkube-kit/build/service/jib/pom.xml | 2 +- jkube-kit/common-it/pom.xml | 2 +- jkube-kit/common-maven/pom.xml | 2 +- jkube-kit/common/pom.xml | 2 +- jkube-kit/config/image/pom.xml | 2 +- jkube-kit/config/resource/pom.xml | 2 +- jkube-kit/config/service/pom.xml | 2 +- jkube-kit/doc/pom.xml | 4 ++-- jkube-kit/enricher/api/pom.xml | 2 +- jkube-kit/enricher/generic/pom.xml | 2 +- jkube-kit/enricher/specific/pom.xml | 2 +- jkube-kit/generator/api/pom.xml | 2 +- jkube-kit/generator/dockerfile-simple/pom.xml | 2 +- jkube-kit/generator/java-exec/pom.xml | 2 +- jkube-kit/generator/karaf/pom.xml | 2 +- jkube-kit/generator/webapp/pom.xml | 2 +- jkube-kit/helm/pom.xml | 2 +- jkube-kit/jkube-kit-helidon/pom.xml | 2 +- jkube-kit/jkube-kit-micronaut/pom.xml | 2 +- jkube-kit/jkube-kit-microprofile/pom.xml | 2 +- jkube-kit/jkube-kit-openliberty/pom.xml | 2 +- jkube-kit/jkube-kit-quarkus/pom.xml | 2 +- jkube-kit/jkube-kit-smallrye/pom.xml | 2 +- jkube-kit/jkube-kit-spring-boot/pom.xml | 2 +- jkube-kit/jkube-kit-thorntail-v2/pom.xml | 2 +- jkube-kit/jkube-kit-vertx/pom.xml | 2 +- jkube-kit/jkube-kit-wildfly-jar/pom.xml | 2 +- jkube-kit/parent/pom.xml | 2 +- jkube-kit/pom.xml | 4 ++-- jkube-kit/profile/pom.xml | 2 +- jkube-kit/remote-dev/pom.xml | 2 +- jkube-kit/resource/service/pom.xml | 2 +- jkube-kit/watcher/api/pom.xml | 2 +- jkube-kit/watcher/standard/pom.xml | 2 +- kubernetes-maven-plugin/doc/pom.xml | 2 +- kubernetes-maven-plugin/it/pom.xml | 2 +- kubernetes-maven-plugin/plugin/pom.xml | 2 +- kubernetes-maven-plugin/pom.xml | 2 +- openshift-maven-plugin/it/pom.xml | 2 +- openshift-maven-plugin/plugin/pom.xml | 2 +- openshift-maven-plugin/pom.xml | 2 +- pom.xml | 4 ++-- 52 files changed, 57 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4057afbdf4..6cca74ea0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,8 @@ Usage: # ./scripts/changelog.sh semanticVersionNumber [linkLabelStartNumber] ./scripts/extract-changelog-for-version.sh 1.3.37 5 ``` +### 1.18-SNAPSHOT + ### 1.17.0 (2024-08-13) * Fix #494: Support for Micronaut Framework Native Images * Fix #1989: Remove storageClass related fields from VolumePermissionEnricher diff --git a/gradle-plugin/doc/pom.xml b/gradle-plugin/doc/pom.xml index d288c1c1df..045b404acf 100644 --- a/gradle-plugin/doc/pom.xml +++ b/gradle-plugin/doc/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube gradle-plugin - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/gradle-plugin/it/pom.xml b/gradle-plugin/it/pom.xml index 2aac47f954..18adca2d22 100644 --- a/gradle-plugin/it/pom.xml +++ b/gradle-plugin/it/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube gradle-plugin - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/gradle-plugin/kubernetes/pom.xml b/gradle-plugin/kubernetes/pom.xml index df6f141ac6..fe305b6f76 100644 --- a/gradle-plugin/kubernetes/pom.xml +++ b/gradle-plugin/kubernetes/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube gradle-plugin - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/gradle-plugin/openshift/pom.xml b/gradle-plugin/openshift/pom.xml index 8779bd4c77..01bca5c4de 100644 --- a/gradle-plugin/openshift/pom.xml +++ b/gradle-plugin/openshift/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube gradle-plugin - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/gradle-plugin/pom.xml b/gradle-plugin/pom.xml index a4ac193344..e750ffbbce 100644 --- a/gradle-plugin/pom.xml +++ b/gradle-plugin/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/jkube-kit/api/pom.xml b/jkube-kit/api/pom.xml index 224d2124f4..f08c8eca38 100644 --- a/jkube-kit/api/pom.xml +++ b/jkube-kit/api/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml jkube-kit-api diff --git a/jkube-kit/build/api/pom.xml b/jkube-kit/build/api/pom.xml index cd2cb08642..258a0cb2bb 100644 --- a/jkube-kit/build/api/pom.xml +++ b/jkube-kit/build/api/pom.xml @@ -20,12 +20,12 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml jkube-kit-build-api - 1.17.0 + 1.18-SNAPSHOT JKube Kit :: Build :: API diff --git a/jkube-kit/build/service/buildpacks/pom.xml b/jkube-kit/build/service/buildpacks/pom.xml index c4d1a57f96..b0502f5585 100644 --- a/jkube-kit/build/service/buildpacks/pom.xml +++ b/jkube-kit/build/service/buildpacks/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../../parent/pom.xml diff --git a/jkube-kit/build/service/docker/pom.xml b/jkube-kit/build/service/docker/pom.xml index e0242ed0b5..519b0eb17f 100644 --- a/jkube-kit/build/service/docker/pom.xml +++ b/jkube-kit/build/service/docker/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../../parent/pom.xml diff --git a/jkube-kit/build/service/jib/pom.xml b/jkube-kit/build/service/jib/pom.xml index 58f2866514..b19e867ea4 100644 --- a/jkube-kit/build/service/jib/pom.xml +++ b/jkube-kit/build/service/jib/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../../parent/pom.xml diff --git a/jkube-kit/common-it/pom.xml b/jkube-kit/common-it/pom.xml index 48a400f0f7..035e8834b5 100644 --- a/jkube-kit/common-it/pom.xml +++ b/jkube-kit/common-it/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml diff --git a/jkube-kit/common-maven/pom.xml b/jkube-kit/common-maven/pom.xml index 00fd7e1ee3..9444fee264 100644 --- a/jkube-kit/common-maven/pom.xml +++ b/jkube-kit/common-maven/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml diff --git a/jkube-kit/common/pom.xml b/jkube-kit/common/pom.xml index f8d232a99c..9def9d7b7e 100644 --- a/jkube-kit/common/pom.xml +++ b/jkube-kit/common/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml diff --git a/jkube-kit/config/image/pom.xml b/jkube-kit/config/image/pom.xml index fdaa4cc02d..7c0ce30e3d 100644 --- a/jkube-kit/config/image/pom.xml +++ b/jkube-kit/config/image/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/config/resource/pom.xml b/jkube-kit/config/resource/pom.xml index edd2e0a94b..6c002ffeea 100644 --- a/jkube-kit/config/resource/pom.xml +++ b/jkube-kit/config/resource/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/config/service/pom.xml b/jkube-kit/config/service/pom.xml index 184169c09d..cc7ebbcef5 100644 --- a/jkube-kit/config/service/pom.xml +++ b/jkube-kit/config/service/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/doc/pom.xml b/jkube-kit/doc/pom.xml index a757cd5698..1f4ecfe1b7 100644 --- a/jkube-kit/doc/pom.xml +++ b/jkube-kit/doc/pom.xml @@ -20,12 +20,12 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml jkube-kit-doc - 1.17.0 + 1.18-SNAPSHOT jar JKube Kit :: Documentation diff --git a/jkube-kit/enricher/api/pom.xml b/jkube-kit/enricher/api/pom.xml index 2e0dc3f5c7..d480903d5c 100644 --- a/jkube-kit/enricher/api/pom.xml +++ b/jkube-kit/enricher/api/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/enricher/generic/pom.xml b/jkube-kit/enricher/generic/pom.xml index cfd65511e1..8dffa67cd5 100644 --- a/jkube-kit/enricher/generic/pom.xml +++ b/jkube-kit/enricher/generic/pom.xml @@ -19,7 +19,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/enricher/specific/pom.xml b/jkube-kit/enricher/specific/pom.xml index 10c54c615d..4f1816adcc 100644 --- a/jkube-kit/enricher/specific/pom.xml +++ b/jkube-kit/enricher/specific/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/generator/api/pom.xml b/jkube-kit/generator/api/pom.xml index 685f750212..fd9ac12eee 100644 --- a/jkube-kit/generator/api/pom.xml +++ b/jkube-kit/generator/api/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/generator/dockerfile-simple/pom.xml b/jkube-kit/generator/dockerfile-simple/pom.xml index b8cd927022..1f30ee68a1 100644 --- a/jkube-kit/generator/dockerfile-simple/pom.xml +++ b/jkube-kit/generator/dockerfile-simple/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/generator/java-exec/pom.xml b/jkube-kit/generator/java-exec/pom.xml index 451307239a..663a88c195 100644 --- a/jkube-kit/generator/java-exec/pom.xml +++ b/jkube-kit/generator/java-exec/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/generator/karaf/pom.xml b/jkube-kit/generator/karaf/pom.xml index 08789ddc5b..3771aa8526 100644 --- a/jkube-kit/generator/karaf/pom.xml +++ b/jkube-kit/generator/karaf/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/generator/webapp/pom.xml b/jkube-kit/generator/webapp/pom.xml index 5f0b955b47..d19ed67b9c 100644 --- a/jkube-kit/generator/webapp/pom.xml +++ b/jkube-kit/generator/webapp/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/helm/pom.xml b/jkube-kit/helm/pom.xml index 3a761b844b..d1e608ee9f 100644 --- a/jkube-kit/helm/pom.xml +++ b/jkube-kit/helm/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml diff --git a/jkube-kit/jkube-kit-helidon/pom.xml b/jkube-kit/jkube-kit-helidon/pom.xml index 5dfbebf578..a9fdbfd85a 100644 --- a/jkube-kit/jkube-kit-helidon/pom.xml +++ b/jkube-kit/jkube-kit-helidon/pom.xml @@ -21,7 +21,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml diff --git a/jkube-kit/jkube-kit-micronaut/pom.xml b/jkube-kit/jkube-kit-micronaut/pom.xml index da77eb8766..ec0b08546e 100644 --- a/jkube-kit/jkube-kit-micronaut/pom.xml +++ b/jkube-kit/jkube-kit-micronaut/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-microprofile/pom.xml b/jkube-kit/jkube-kit-microprofile/pom.xml index 69000ef659..554151c67c 100644 --- a/jkube-kit/jkube-kit-microprofile/pom.xml +++ b/jkube-kit/jkube-kit-microprofile/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-openliberty/pom.xml b/jkube-kit/jkube-kit-openliberty/pom.xml index b2074c654f..bbbfab089f 100644 --- a/jkube-kit/jkube-kit-openliberty/pom.xml +++ b/jkube-kit/jkube-kit-openliberty/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-quarkus/pom.xml b/jkube-kit/jkube-kit-quarkus/pom.xml index 911d31c689..2826001271 100644 --- a/jkube-kit/jkube-kit-quarkus/pom.xml +++ b/jkube-kit/jkube-kit-quarkus/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-smallrye/pom.xml b/jkube-kit/jkube-kit-smallrye/pom.xml index 21f5ab8ece..1c7f03a160 100644 --- a/jkube-kit/jkube-kit-smallrye/pom.xml +++ b/jkube-kit/jkube-kit-smallrye/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-spring-boot/pom.xml b/jkube-kit/jkube-kit-spring-boot/pom.xml index bd21b499b3..5a3247b00e 100644 --- a/jkube-kit/jkube-kit-spring-boot/pom.xml +++ b/jkube-kit/jkube-kit-spring-boot/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-thorntail-v2/pom.xml b/jkube-kit/jkube-kit-thorntail-v2/pom.xml index 22d57da170..c5412c8d6c 100644 --- a/jkube-kit/jkube-kit-thorntail-v2/pom.xml +++ b/jkube-kit/jkube-kit-thorntail-v2/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-vertx/pom.xml b/jkube-kit/jkube-kit-vertx/pom.xml index 7b7b25275f..002020338e 100644 --- a/jkube-kit/jkube-kit-vertx/pom.xml +++ b/jkube-kit/jkube-kit-vertx/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/jkube-kit-wildfly-jar/pom.xml b/jkube-kit/jkube-kit-wildfly-jar/pom.xml index 893b8608b0..bd23d2bd3c 100644 --- a/jkube-kit/jkube-kit-wildfly-jar/pom.xml +++ b/jkube-kit/jkube-kit-wildfly-jar/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/parent/pom.xml b/jkube-kit/parent/pom.xml index 875c3ffbf5..c7ebc9c99c 100644 --- a/jkube-kit/parent/pom.xml +++ b/jkube-kit/parent/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube - 1.17.0 + 1.18-SNAPSHOT ../../pom.xml diff --git a/jkube-kit/pom.xml b/jkube-kit/pom.xml index a721f9d425..617e888315 100644 --- a/jkube-kit/pom.xml +++ b/jkube-kit/pom.xml @@ -18,13 +18,13 @@ 4.0.0 jkube-kit-build - 1.17.0 + 1.18-SNAPSHOT pom org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT parent/pom.xml diff --git a/jkube-kit/profile/pom.xml b/jkube-kit/profile/pom.xml index 2e589e7be6..9808e3be07 100644 --- a/jkube-kit/profile/pom.xml +++ b/jkube-kit/profile/pom.xml @@ -20,7 +20,7 @@ jkube-kit-parent org.eclipse.jkube - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml 4.0.0 diff --git a/jkube-kit/remote-dev/pom.xml b/jkube-kit/remote-dev/pom.xml index 7bdb1187f4..fa3ee61cf6 100644 --- a/jkube-kit/remote-dev/pom.xml +++ b/jkube-kit/remote-dev/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../parent/pom.xml diff --git a/jkube-kit/resource/service/pom.xml b/jkube-kit/resource/service/pom.xml index f509f95b37..3cd245726a 100644 --- a/jkube-kit/resource/service/pom.xml +++ b/jkube-kit/resource/service/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/watcher/api/pom.xml b/jkube-kit/watcher/api/pom.xml index 4ef04f8f42..2887e06a78 100644 --- a/jkube-kit/watcher/api/pom.xml +++ b/jkube-kit/watcher/api/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/jkube-kit/watcher/standard/pom.xml b/jkube-kit/watcher/standard/pom.xml index 8a6f0d2c51..86435392ba 100644 --- a/jkube-kit/watcher/standard/pom.xml +++ b/jkube-kit/watcher/standard/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube-kit-parent - 1.17.0 + 1.18-SNAPSHOT ../../parent/pom.xml diff --git a/kubernetes-maven-plugin/doc/pom.xml b/kubernetes-maven-plugin/doc/pom.xml index 53757df600..f8d229c679 100644 --- a/kubernetes-maven-plugin/doc/pom.xml +++ b/kubernetes-maven-plugin/doc/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube kubernetes-maven-plugin-parent - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/kubernetes-maven-plugin/it/pom.xml b/kubernetes-maven-plugin/it/pom.xml index 2440747b06..54cbedf960 100644 --- a/kubernetes-maven-plugin/it/pom.xml +++ b/kubernetes-maven-plugin/it/pom.xml @@ -28,7 +28,7 @@ for running a single test with mvnDebug. org.eclipse.jkube kubernetes-maven-plugin-parent - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/kubernetes-maven-plugin/plugin/pom.xml b/kubernetes-maven-plugin/plugin/pom.xml index 60b77a4bc1..78c910c5e4 100644 --- a/kubernetes-maven-plugin/plugin/pom.xml +++ b/kubernetes-maven-plugin/plugin/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube kubernetes-maven-plugin-parent - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/kubernetes-maven-plugin/pom.xml b/kubernetes-maven-plugin/pom.xml index 50828caead..593a19c97a 100644 --- a/kubernetes-maven-plugin/pom.xml +++ b/kubernetes-maven-plugin/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/openshift-maven-plugin/it/pom.xml b/openshift-maven-plugin/it/pom.xml index 3ea86abac3..98d48f7d45 100644 --- a/openshift-maven-plugin/it/pom.xml +++ b/openshift-maven-plugin/it/pom.xml @@ -26,7 +26,7 @@ for running a single test. org.eclipse.jkube openshift-maven-plugin-parent - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/openshift-maven-plugin/plugin/pom.xml b/openshift-maven-plugin/plugin/pom.xml index e74c0ea11a..56f6e6e0c0 100644 --- a/openshift-maven-plugin/plugin/pom.xml +++ b/openshift-maven-plugin/plugin/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube openshift-maven-plugin-parent - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/openshift-maven-plugin/pom.xml b/openshift-maven-plugin/pom.xml index 1e846b4959..112b8664ed 100644 --- a/openshift-maven-plugin/pom.xml +++ b/openshift-maven-plugin/pom.xml @@ -20,7 +20,7 @@ org.eclipse.jkube jkube - 1.17.0 + 1.18-SNAPSHOT ../pom.xml diff --git a/pom.xml b/pom.xml index c68cbbc66e..2d2503e7fa 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.eclipse.jkube jkube - 1.17.0 + 1.18-SNAPSHOT pom Eclipse JKube Eclipse JKube @@ -127,7 +127,7 @@ 1.7.36 3.11.0.3922 2.12.1 - 2024-08-13T09:08:40Z + 2024-08-13T09:16:47Z ${project.build.directory}/generated-docs From d0f7c62199284e015a30b00a6a3cacfc13d390ca Mon Sep 17 00:00:00 2001 From: Aman Date: Tue, 13 Aug 2024 19:48:08 +0530 Subject: [PATCH 276/289] fix: replace AssertJ's deprecated asList() DSL method in ControllerViaPluginConfigurationEnricherTest (3289) chore : replacing AssertJ's deprecated asList() DSL method with asInstanceOf(InstanceOfAssertFactories.list(type.class)) Signed-off-by: Aman --- chore : replacing AssertJ's deprecated asList() DSL method with asInstanceOf(InstanceOfAssertFactories.list(type.class)) --- ...lerViaPluginConfigurationEnricherTest.java | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/ControllerViaPluginConfigurationEnricherTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/ControllerViaPluginConfigurationEnricherTest.java index a6440bb18b..0b11d7324b 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/ControllerViaPluginConfigurationEnricherTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/ControllerViaPluginConfigurationEnricherTest.java @@ -14,6 +14,7 @@ package org.eclipse.jkube.enricher.generic; import io.fabric8.kubernetes.api.model.Container; +import io.fabric8.kubernetes.api.model.EnvVar; import io.fabric8.kubernetes.api.model.EnvVarBuilder; import io.fabric8.kubernetes.api.model.KubernetesList; import io.fabric8.kubernetes.api.model.KubernetesListBuilder; @@ -26,6 +27,7 @@ import io.fabric8.kubernetes.api.model.apps.StatefulSetBuilder; import io.fabric8.kubernetes.api.model.apps.StatefulSetSpec; import io.fabric8.openshift.api.model.DeploymentConfig; +import io.fabric8.openshift.api.model.DeploymentTriggerPolicy; import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.enricher.generic.openshift.DeploymentConfigEnricher; import org.eclipse.jkube.enricher.generic.openshift.ImageChangeTriggerEnricher; @@ -169,7 +171,7 @@ void enablesImageChangeTriggers() { // Then assertThat(kubernetesListBuilder.build().getItems()).asInstanceOf(InstanceOfAssertFactories.list(DeploymentConfig.class)) .singleElement() - .extracting("spec.triggers").asList().hasSize(2) + .extracting("spec.triggers").asInstanceOf(InstanceOfAssertFactories.list(DeploymentTriggerPolicy.class)).hasSize(2) .extracting("type") .containsExactlyInAnyOrder("ImageChange", "ConfigChange"); } @@ -177,34 +179,34 @@ void enablesImageChangeTriggers() { private void assertGeneratedListContainsDeploymentWithNameAndEnvVar(KubernetesListBuilder kubernetesListBuilder, String name) { assertThat(kubernetesListBuilder.build()) .extracting(KubernetesList::getItems) - .asList() - .singleElement(InstanceOfAssertFactories.type(Deployment.class)) + .asInstanceOf(InstanceOfAssertFactories.list(Deployment.class)) + .singleElement() .hasFieldOrPropertyWithValue("metadata.name", name) .extracting(Deployment::getSpec) .extracting(DeploymentSpec::getTemplate) .extracting(PodTemplateSpec::getSpec) .extracting(PodSpec::getContainers) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(Container.class)) .first(InstanceOfAssertFactories.type(Container.class)) .extracting(Container::getEnv) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(EnvVar.class)) .contains(new EnvVarBuilder().withName("FOO").withValue("bar").build()); } private void assertGeneratedListContainsStatefulSetWithNameAndEnvVar(KubernetesListBuilder kubernetesListBuilder, String name) { assertThat(kubernetesListBuilder.build()) .extracting(KubernetesList::getItems) - .asList() - .singleElement(InstanceOfAssertFactories.type(StatefulSet.class)) + .asInstanceOf(InstanceOfAssertFactories.list(StatefulSet.class)) + .singleElement() .hasFieldOrPropertyWithValue("metadata.name", name) .extracting(StatefulSet::getSpec) .extracting(StatefulSetSpec::getTemplate) .extracting(PodTemplateSpec::getSpec) .extracting(PodSpec::getContainers) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(Container.class)) .first(InstanceOfAssertFactories.type(Container.class)) .extracting(Container::getEnv) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(EnvVar.class)) .contains(new EnvVarBuilder().withName("FOO").withValue("bar").build()); } From b56bd2ce2982c06ac3ea28aaa0fb77ad359df6fc Mon Sep 17 00:00:00 2001 From: Raul Galvez Date: Mon, 26 Aug 2024 05:01:30 -0400 Subject: [PATCH 277/289] fix: removed unused import from RegistryAuth (3329) Signed-off-by: Raul Galvez --- .../java/org/eclipse/jkube/kit/build/api/auth/RegistryAuth.java | 1 - 1 file changed, 1 deletion(-) diff --git a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/auth/RegistryAuth.java b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/auth/RegistryAuth.java index fa695ad82e..68177b5662 100644 --- a/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/auth/RegistryAuth.java +++ b/jkube-kit/build/api/src/main/java/org/eclipse/jkube/kit/build/api/auth/RegistryAuth.java @@ -13,7 +13,6 @@ */ package org.eclipse.jkube.kit.build.api.auth; -import java.nio.charset.StandardCharsets; import java.util.Base64; import java.util.LinkedHashMap; import java.util.Map; From 19bbb240d0350330e6bd1dcc881e023f989a8a04 Mon Sep 17 00:00:00 2001 From: Luigi Cardito Date: Mon, 26 Aug 2024 12:00:12 +0200 Subject: [PATCH 278/289] fix: removed Exception never thrown by PortForwardServiceTest.setUp (3331) Signed-off-by: Luigi Cardito --- .../jkube/kit/config/service/PortForwardServiceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/PortForwardServiceTest.java b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/PortForwardServiceTest.java index d963c26df7..191cfe1e6b 100644 --- a/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/PortForwardServiceTest.java +++ b/jkube-kit/config/service/src/test/java/org/eclipse/jkube/kit/config/service/PortForwardServiceTest.java @@ -51,7 +51,7 @@ class PortForwardServiceTest { private KitLogger logger; @BeforeEach - public void setUp() throws Exception{ + void setUp() { logger = new KitLogger.SilentLogger(); } From bc140f1a744be78d5cdb3c5e3208e0d41f3ceda2 Mon Sep 17 00:00:00 2001 From: Mohammed Sadique <84969756+Sadique982@users.noreply.github.com> Date: Mon, 26 Aug 2024 15:33:17 +0530 Subject: [PATCH 279/289] fix: removed Exception never thrown by HelmLintMojoTest.setUp (3324) HelmLintMojoTest.setUp The declared Exception exception is never thrown #3053 Signed-off-by: Mohammed Sadique --- Fixed #3053 Signed-off-by: Mohammed Sadique --- Merge branch 'master' of https://github.com/Sadique982/jkube --- .../eclipse/jkube/maven/plugin/mojo/build/HelmLintMojoTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmLintMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmLintMojoTest.java index 6a084dcc76..c1c4704a6e 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmLintMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/HelmLintMojoTest.java @@ -40,7 +40,7 @@ class HelmLintMojoTest { @BeforeEach - void setUp() throws Exception { + void setUp() { originalPrintStream = System.out; outputStream = new ByteArrayOutputStream(); System.setOut(new PrintStream(outputStream)); From 76d69254ef00c2581218c3f5bcac9c5e4226ed2f Mon Sep 17 00:00:00 2001 From: vijaybhagwat24 Date: Mon, 26 Aug 2024 15:47:57 +0530 Subject: [PATCH 280/289] fix: replace AssertJ's deprecated asList() DSL method in IngressEnricherTest (3321) issue-3290: fixed deprecated asList methods in test class IngressEnricherTest --- test: correcting existing test issue-3290-corrected class type,removed unnecessary asList() occurrences. --- .../enricher/generic/IngressEnricherTest.java | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/IngressEnricherTest.java b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/IngressEnricherTest.java index e7e7ee82af..43360db928 100644 --- a/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/IngressEnricherTest.java +++ b/jkube-kit/enricher/generic/src/test/java/org/eclipse/jkube/enricher/generic/IngressEnricherTest.java @@ -13,14 +13,18 @@ */ package org.eclipse.jkube.enricher.generic; +import io.fabric8.kubernetes.api.model.HasMetadata; import io.fabric8.kubernetes.api.model.IntOrString; import io.fabric8.kubernetes.api.model.KubernetesListBuilder; import io.fabric8.kubernetes.api.model.ObjectMetaBuilder; import io.fabric8.kubernetes.api.model.Service; import io.fabric8.kubernetes.api.model.ServiceBuilder; import io.fabric8.kubernetes.api.model.ServiceSpecBuilder; +import io.fabric8.kubernetes.api.model.networking.v1.HTTPIngressPath; import io.fabric8.kubernetes.api.model.networking.v1.Ingress; +import io.fabric8.kubernetes.api.model.networking.v1.IngressRule; import io.fabric8.kubernetes.api.model.networking.v1.IngressSpec; +import io.fabric8.kubernetes.api.model.networking.v1.IngressTLS; import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.config.image.ImageConfiguration; @@ -110,27 +114,27 @@ void createIngressFromXMLConfigWithConfiguredServiceName() { // Then assertThat(kubernetesListBuilder) - .extracting(KubernetesListBuilder::buildItems).asList() + .extracting(KubernetesListBuilder::buildItems).asInstanceOf(InstanceOfAssertFactories.list(HasMetadata.class)) .hasSize(2) .element(1).asInstanceOf(InstanceOfAssertFactories.type(Ingress.class)) .hasFieldOrPropertyWithValue("apiVersion", "networking.k8s.io/v1") .hasFieldOrPropertyWithValue("metadata.name", providedService.getMetadata().getName()) .extracting(Ingress::getSpec) - .satisfies(is -> assertThat(is).extracting("tls").asList().element(0) + .satisfies(is -> assertThat(is).extracting("tls").asInstanceOf(InstanceOfAssertFactories.list(IngressTLS.class)).element(0) .hasFieldOrPropertyWithValue("secretName", "testsecret-tls") - .extracting("hosts").asList().containsExactly("https-example.foo.com")) + .extracting("hosts").asInstanceOf(InstanceOfAssertFactories.list(String.class)).containsExactly("https-example.foo.com")) .extracting(IngressSpec::getRules) - .satisfies(r -> assertThat(r).asList().element(0) + .satisfies(r -> assertThat(r).asInstanceOf(InstanceOfAssertFactories.list(IngressRule.class)).element(0) .hasFieldOrPropertyWithValue("host", "foo.bar.com") - .extracting("http.paths").asList().element(0) + .extracting("http.paths").asInstanceOf(InstanceOfAssertFactories.list(HTTPIngressPath.class)).element(0) .hasFieldOrPropertyWithValue("path", "/icons") .hasFieldOrPropertyWithValue("pathType", "ImplementationSpecific") .hasFieldOrPropertyWithValue("backend.service.name", "hello-k8s") .hasFieldOrPropertyWithValue("backend.service.port.number", 80) ) - .satisfies(r -> assertThat(r).asList().element(1) + .satisfies(r -> assertThat(r).asInstanceOf(InstanceOfAssertFactories.list(IngressRule.class)).element(1) .hasFieldOrPropertyWithValue("host", "*.foo.com") - .extracting("http.paths").asList().element(0) + .extracting("http.paths").asInstanceOf(InstanceOfAssertFactories.list(HTTPIngressPath.class)).element(0) .hasFieldOrPropertyWithValue("path", "/icons-storage") .hasFieldOrPropertyWithValue("pathType", "Exact") .hasFieldOrPropertyWithValue("backend.resource.apiGroup", "k8s.example.com") @@ -183,7 +187,7 @@ void getIngressRuleXMLConfig_withNonNullResourceConfig() { List ingressRuleXMLConfig = IngressEnricher.getIngressRuleXMLConfig(resourceConfig); // Then - assertThat(ingressRuleXMLConfig).asList().hasSize(1); + assertThat(ingressRuleXMLConfig).hasSize(1); } @Test @@ -192,7 +196,7 @@ void getIngressRuleXMLConfig_withNullResourceConfig() { List ingressRuleConfigs = IngressEnricher.getIngressRuleXMLConfig(null); // Then - assertThat(ingressRuleConfigs).asList().isEmpty(); + assertThat(ingressRuleConfigs).isEmpty(); } @Test @@ -210,7 +214,7 @@ void getIngressTlsXMLConfig_withNonNullResourceConfig() { List ingressTlsConfigs = IngressEnricher.getIngressTlsXMLConfig(resourceConfig); // Then - assertThat(ingressTlsConfigs).asList().hasSize(1); + assertThat(ingressTlsConfigs).hasSize(1); } @Test @@ -219,7 +223,7 @@ void getIngressTlsXMLConfig_withNullResourceConfig() { List ingressTlsConfigs = IngressEnricher.getIngressTlsXMLConfig(null); // Then - assertThat(ingressTlsConfigs).asList().isEmpty(); + assertThat(ingressTlsConfigs).isEmpty(); } @Test @@ -243,10 +247,10 @@ void networkingV1IngressIsGenerated() { // Then assertThat(kubernetesListBuilder) - .extracting(KubernetesListBuilder::buildItems).asList() + .extracting(KubernetesListBuilder::buildItems).asInstanceOf(InstanceOfAssertFactories.list(HasMetadata.class)) .hasSize(2) .element(1) - .extracting("spec.rules").asList() + .extracting("spec.rules").asInstanceOf(InstanceOfAssertFactories.list(IngressRule.class)) .extracting("host") .containsExactly("test.192.168.39.25.nip.io"); } From b5d0da270476aad97e58384ad4a1bfa98afed4bb Mon Sep 17 00:00:00 2001 From: samarthkoli <154528119+SamarthKoli@users.noreply.github.com> Date: Mon, 26 Aug 2024 18:41:46 +0530 Subject: [PATCH 281/289] fix: replaced 'registry.length() > 0' with '!registry.isEmpty()' in ImageName (3320) Signed-off-by: samarthkoli <154528119+SamarthKoli@users.noreply.github.com> Signed-off-by: samarthkoli --- .../main/java/org/eclipse/jkube/kit/config/image/ImageName.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/ImageName.java b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/ImageName.java index b2be6d4bd7..c7d4a4b420 100644 --- a/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/ImageName.java +++ b/jkube-kit/config/image/src/main/java/org/eclipse/jkube/kit/config/image/ImageName.java @@ -129,7 +129,7 @@ public String getDigest() { } public boolean hasRegistry() { - return registry != null && registry.length() > 0; + return registry != null && !registry.isEmpty(); } public boolean isFullyQualifiedName() { From 8cc048e699c982a901ec8d9236fcb1430953ece4 Mon Sep 17 00:00:00 2001 From: Andrew Cate <157550467+AndrewJCate@users.noreply.github.com> Date: Tue, 27 Aug 2024 06:23:26 -0700 Subject: [PATCH 282/289] fix: replaced String concatenation arguments with StringBuilder.append() (3322) --- .../org/eclipse/jkube/kit/common/util/ValidationUtil.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/ValidationUtil.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/ValidationUtil.java index af633b0980..dd8676837e 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/ValidationUtil.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/ValidationUtil.java @@ -42,7 +42,12 @@ public static String createValidationMessage(Set> constra leafBean = "" + hasMetadata.getKind() + ": " + metadata; } } - builder.append(violation.getPropertyPath() + " " + violation.getMessage() + " on bean: " + leafBean); + builder.append(violation.getPropertyPath()) + .append(" ") + .append(violation.getMessage()) + .append(" on bean: ") + .append(leafBean); + } return builder.toString(); } From 239ef826edd3f894191b728e460877e25d924c08 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Wed, 28 Aug 2024 18:10:32 +0530 Subject: [PATCH 283/289] refactor(common): moved application config resolution logic to PropertiesUtil (3328) refactor (jkube-kit/common) : Move application config resolution logic to PropertiesUtil HelidonUtils, MicronautUtils, QuarkusUtils seem to have similar method for reading application config as Properties. Move them to a generic method in PropertiesUtil. Signed-off-by: Rohan Kumar --- review: application config to properties Signed-off-by: Marc Nuri Co-authored-by: Marc Nuri --- .../jkube/kit/common/util/PropertiesUtil.java | 23 ++++++ .../jkube/kit/common/util/ThorntailUtil.java | 14 ++-- .../kit/common/util/PropertiesUtilTest.java | 75 +++++++++++++++++++ .../properties/application.properties | 1 + .../util/properties-util/yaml/application.yml | 2 + .../eclipse/jkube/helidon/HelidonUtils.java | 25 +------ .../jkube/micronaut/MicronautUtils.java | 23 +----- .../MicronautHealthCheckEnricher.java | 2 +- .../generator/MicronautGenerator.java | 3 +- ...autUtilsGetMicronautConfigurationTest.java | 20 +++-- .../jkube/micronaut/MicronautUtilsTest.java | 38 ++++++---- .../eclipse/jkube/quarkus/QuarkusUtils.java | 24 +----- .../ThorntailV2HealthCheckEnricher.java | 2 +- .../ThorntailV2HealthCheckEnricherTest.java | 41 ++++++---- 14 files changed, 185 insertions(+), 108 deletions(-) create mode 100644 jkube-kit/common/src/test/resources/util/properties-util/properties/application.properties create mode 100644 jkube-kit/common/src/test/resources/util/properties-util/yaml/application.yml diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/PropertiesUtil.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/PropertiesUtil.java index 350cc49730..932c82a554 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/PropertiesUtil.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/PropertiesUtil.java @@ -14,10 +14,12 @@ package org.eclipse.jkube.kit.common.util; import io.fabric8.kubernetes.client.utils.Utils; +import org.eclipse.jkube.kit.common.JavaProject; import java.io.IOException; import java.io.InputStream; import java.net.URL; +import java.net.URLClassLoader; import java.nio.file.Files; import java.nio.file.Path; import java.util.Collections; @@ -26,6 +28,9 @@ import java.util.Optional; import java.util.Properties; +import static org.eclipse.jkube.kit.common.util.JKubeProjectUtil.getClassLoader; +import static org.eclipse.jkube.kit.common.util.YamlUtil.getPropertiesFromYamlResource; + public class PropertiesUtil { private PropertiesUtil() {} @@ -92,4 +97,22 @@ public static Map toMap(Properties properties) { } return map; } + + public static Properties fromApplicationConfig(JavaProject javaProject, String[] appConfigSources) { + final URLClassLoader urlClassLoader = getClassLoader(javaProject); + for (String source : appConfigSources) { + final Properties properties; + if (source.endsWith(".properties")) { + properties = getPropertiesFromResource(urlClassLoader.findResource(source)); + } else { + properties = getPropertiesFromYamlResource(urlClassLoader.findResource(source)); + } + // Consider only the first non-empty application config source + if (!properties.isEmpty()) { + properties.putAll(toMap(javaProject.getProperties())); + return properties; + } + } + return javaProject.getProperties(); + } } diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/ThorntailUtil.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/ThorntailUtil.java index 2ab608928d..f380ef485f 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/ThorntailUtil.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/ThorntailUtil.java @@ -13,11 +13,14 @@ */ package org.eclipse.jkube.kit.common.util; -import java.net.URL; -import java.net.URLClassLoader; +import org.eclipse.jkube.kit.common.JavaProject; + import java.util.Properties; +import static org.eclipse.jkube.kit.common.util.PropertiesUtil.fromApplicationConfig; + public class ThorntailUtil { + private static final String[] THORNTAIL_APP_CONFIG_FILES_LIST = new String[] {"project-defaults.yml"}; private ThorntailUtil() {} @@ -25,11 +28,10 @@ private ThorntailUtil() {} * Returns the thorntail configuration (supports `project-defaults.yml`) * or an empty properties object if not found * - * @param compileClassLoader URLClassLoader for resource access + * @param javaProject Java Project * @return thorntail configuration properties */ - public static Properties getThorntailProperties(URLClassLoader compileClassLoader) { - URL ymlResource = compileClassLoader.findResource("project-defaults.yml"); - return YamlUtil.getPropertiesFromYamlResource(ymlResource); + public static Properties getThorntailProperties(JavaProject javaProject) { + return fromApplicationConfig(javaProject, THORNTAIL_APP_CONFIG_FILES_LIST); } } diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/PropertiesUtilTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/PropertiesUtilTest.java index 7f175804f9..5618ff6f2a 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/PropertiesUtilTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/PropertiesUtilTest.java @@ -13,10 +13,18 @@ */ package org.eclipse.jkube.kit.common.util; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Map; import java.util.Properties; +import org.eclipse.jkube.kit.common.JavaProject; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.entry; @@ -113,4 +121,71 @@ void toMap_validProperties_shouldReturnValidMap() { entry("Char", "c") ); } + + @Nested + @DisplayName("fromApplicationConfig") + class FromApplicationConfig { + @TempDir + private Path temporaryFolder; + + private JavaProject javaProject; + + @BeforeEach + void setUp() throws IOException { + javaProject = JavaProject.builder() + .compileClassPathElement(PropertiesUtil.class.getResource("/util/properties-util/yaml/").getPath()) + .compileClassPathElement(PropertiesUtil.class.getResource("/util/properties-util/properties/").getPath()) + .outputDirectory(Files.createDirectory(temporaryFolder.resolve("target")).toFile()) + .build(); + } + + @Test + @DisplayName("no source provided, return empty Properties") + void noSourceProvided_thenReturnEmptyProperty() { + // When + Properties properties = PropertiesUtil.fromApplicationConfig(javaProject, new String[0]); + // Then + assertThat(properties).isEmpty(); + } + + @Test + @DisplayName("application.yml source") + void yml() { + // When + Properties properties = PropertiesUtil.fromApplicationConfig(javaProject, new String[]{"application.yml"}); + // Then + assertThat(properties).containsExactly( + entry("application.name", "name-via-yaml")); + } + + @Test + @DisplayName("application.properties source") + void properties() { + // When + Properties properties = PropertiesUtil.fromApplicationConfig(javaProject, new String[]{"application.properties"}); + // Then + assertThat(properties).containsExactly( + entry("application.name", "name-via-properties")); + } + + @Test + @DisplayName("multiple sources provided, then first one takes precedence") + void multipleSources_thenFirstOneTakesPrecedence() { + // When + Properties properties = PropertiesUtil.fromApplicationConfig(javaProject, new String[]{"application.properties", "application.yml"}); + // Then + assertThat(properties).containsExactly( + entry("application.name", "name-via-properties")); + } + + @Test + @DisplayName("multiple sources provided, then first one takes precedence") + void multipleSourcesWithEmpty_thenFirstNonEmptyTakesPrecedence() { + // When + Properties properties = PropertiesUtil.fromApplicationConfig(javaProject, new String[]{"not-there", "application.yml", "application.properties"}); + // Then + assertThat(properties).containsExactly( + entry("application.name", "name-via-yaml")); + } + } } diff --git a/jkube-kit/common/src/test/resources/util/properties-util/properties/application.properties b/jkube-kit/common/src/test/resources/util/properties-util/properties/application.properties new file mode 100644 index 0000000000..7745c098ec --- /dev/null +++ b/jkube-kit/common/src/test/resources/util/properties-util/properties/application.properties @@ -0,0 +1 @@ +application.name=name-via-properties \ No newline at end of file diff --git a/jkube-kit/common/src/test/resources/util/properties-util/yaml/application.yml b/jkube-kit/common/src/test/resources/util/properties-util/yaml/application.yml new file mode 100644 index 0000000000..2786ae5226 --- /dev/null +++ b/jkube-kit/common/src/test/resources/util/properties-util/yaml/application.yml @@ -0,0 +1,2 @@ +application: + name: name-via-yaml \ No newline at end of file diff --git a/jkube-kit/jkube-kit-helidon/src/main/java/org/eclipse/jkube/helidon/HelidonUtils.java b/jkube-kit/jkube-kit-helidon/src/main/java/org/eclipse/jkube/helidon/HelidonUtils.java index 5917638aab..4baa8b0ff3 100644 --- a/jkube-kit/jkube-kit-helidon/src/main/java/org/eclipse/jkube/helidon/HelidonUtils.java +++ b/jkube-kit/jkube-kit-helidon/src/main/java/org/eclipse/jkube/helidon/HelidonUtils.java @@ -16,19 +16,13 @@ import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.util.JKubeProjectUtil; -import java.net.URLClassLoader; -import java.util.Arrays; -import java.util.List; import java.util.Properties; -import java.util.function.Supplier; -import static org.eclipse.jkube.kit.common.util.JKubeProjectUtil.getClassLoader; -import static org.eclipse.jkube.kit.common.util.PropertiesUtil.getPropertiesFromResource; -import static org.eclipse.jkube.kit.common.util.PropertiesUtil.toMap; -import static org.eclipse.jkube.kit.common.util.YamlUtil.getPropertiesFromYamlResource; +import static org.eclipse.jkube.kit.common.util.PropertiesUtil.fromApplicationConfig; public class HelidonUtils { private static final String HELIDON_HTTP_PORT = "server.port"; + private static final String[] HELIDON_APP_CONFIG_FILES_LIST = new String[] {"META-INF/microprofile-config.properties", "application.yaml", "application.yml"}; private HelidonUtils() { } @@ -46,20 +40,7 @@ public static boolean hasHelidonHealthDependency(JavaProject javaProject) { } public static Properties getHelidonConfiguration(JavaProject javaProject) { - final URLClassLoader urlClassLoader = getClassLoader(javaProject); - final List> sources = Arrays.asList( - () -> getPropertiesFromResource(urlClassLoader.findResource("META-INF/microprofile-config.properties")), - () -> getPropertiesFromYamlResource(urlClassLoader.findResource("application.yaml")), - () -> getPropertiesFromYamlResource(urlClassLoader.findResource("application.yml")) - ); - for (Supplier source : sources) { - final Properties props = source.get(); - if (!props.isEmpty()) { - props.putAll(toMap(javaProject.getProperties())); - return props; - } - } - return javaProject.getProperties(); + return fromApplicationConfig(javaProject, HELIDON_APP_CONFIG_FILES_LIST); } public static String extractPort(Properties properties, String defaultValue) { diff --git a/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/MicronautUtils.java b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/MicronautUtils.java index 65556c021f..c4f50bd86b 100644 --- a/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/MicronautUtils.java +++ b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/MicronautUtils.java @@ -16,15 +16,12 @@ import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.util.JKubeProjectUtil; -import java.net.URLClassLoader; import java.util.Properties; -import java.util.function.Supplier; -import static org.eclipse.jkube.kit.common.util.PropertiesUtil.getPropertiesFromResource; -import static org.eclipse.jkube.kit.common.util.YamlUtil.getPropertiesFromYamlResource; +import static org.eclipse.jkube.kit.common.util.PropertiesUtil.fromApplicationConfig; public class MicronautUtils { - + private static final String[] MICRONAUT_APP_CONFIG_FILES_LIST = new String[] {"application.properties", "application.yml", "application.yaml", "application.json"}; private MicronautUtils() {} public static String extractPort(Properties properties, String defaultValue) { @@ -35,20 +32,8 @@ public static boolean isHealthEnabled(Properties properties) { return properties.getProperty("endpoints.health.enabled", "false").equalsIgnoreCase("true"); } - @SuppressWarnings("unchecked") - public static Properties getMicronautConfiguration(URLClassLoader urlClassLoader) { - final Supplier[] sources = new Supplier[]{ - () -> getPropertiesFromResource(urlClassLoader.findResource("application.properties")), - () -> getPropertiesFromYamlResource(urlClassLoader.findResource("application.yml")), - () -> getPropertiesFromYamlResource(urlClassLoader.findResource("application.json")) - }; - for (Supplier source : sources) { - final Properties props = source.get(); - if (!props.isEmpty()) { - return props; - } - } - return new Properties(); + public static Properties getMicronautConfiguration(JavaProject javaProject) { + return fromApplicationConfig(javaProject, MICRONAUT_APP_CONFIG_FILES_LIST); } public static boolean hasMicronautPlugin(JavaProject javaProject) { diff --git a/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/enricher/MicronautHealthCheckEnricher.java b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/enricher/MicronautHealthCheckEnricher.java index e5f68d1383..c5c00b30ea 100644 --- a/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/enricher/MicronautHealthCheckEnricher.java +++ b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/enricher/MicronautHealthCheckEnricher.java @@ -77,7 +77,7 @@ private boolean isApplicable() { if (!hasMicronautPlugin(getContext().getProject())){ return false; } - return isHealthEnabled(getMicronautConfiguration(getClassLoader(getContext().getProject()))); + return isHealthEnabled(getMicronautConfiguration(getContext().getProject())); } private Probe buildProbe(Integer initialDelaySeconds, Integer periodSeconds){ diff --git a/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/MicronautGenerator.java b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/MicronautGenerator.java index 69edbaa3ad..00cfd56753 100644 --- a/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/MicronautGenerator.java +++ b/jkube-kit/jkube-kit-micronaut/src/main/java/org/eclipse/jkube/micronaut/generator/MicronautGenerator.java @@ -23,7 +23,6 @@ import org.eclipse.jkube.kit.common.AssemblyConfiguration; import org.eclipse.jkube.kit.config.image.ImageConfiguration; -import static org.eclipse.jkube.kit.common.util.JKubeProjectUtil.getClassLoader; import static org.eclipse.jkube.micronaut.MicronautUtils.extractPort; import static org.eclipse.jkube.micronaut.MicronautUtils.getMicronautConfiguration; import static org.eclipse.jkube.micronaut.MicronautUtils.hasMicronautPlugin; @@ -81,7 +80,7 @@ protected AssemblyConfiguration createAssembly() { @Override protected String getDefaultWebPort() { return extractPort( - getMicronautConfiguration(getClassLoader(getProject())), super.getDefaultWebPort() + getMicronautConfiguration(getProject()), super.getDefaultWebPort() ); } } diff --git a/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/MicronautUtilsGetMicronautConfigurationTest.java b/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/MicronautUtilsGetMicronautConfigurationTest.java index 0edbd797a5..5690f3e61f 100644 --- a/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/MicronautUtilsGetMicronautConfigurationTest.java +++ b/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/MicronautUtilsGetMicronautConfigurationTest.java @@ -13,11 +13,14 @@ */ package org.eclipse.jkube.micronaut; -import java.net.URL; -import java.net.URLClassLoader; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Properties; import java.util.stream.Stream; +import org.eclipse.jkube.kit.common.JavaProject; +import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -27,6 +30,8 @@ import static org.eclipse.jkube.micronaut.MicronautUtils.getMicronautConfiguration; class MicronautUtilsGetMicronautConfigurationTest { + @TempDir + private Path temporaryFolder; public static Stream data() { return Stream.of( @@ -38,13 +43,14 @@ public static Stream data() { @ParameterizedTest(name = "Micronaut configuration can be read from application.{0} files") @MethodSource("data") - void getMicronautConfigurationFromProperties(String directory, String nameSuffix) { + void getMicronautConfigurationFromProperties(String directory, String nameSuffix) throws IOException { // Given - final URLClassLoader ucl = URLClassLoader.newInstance(new URL[] { - MicronautUtilsGetMicronautConfigurationTest.class.getResource(String.format("/utils-test/port-config/%s/", directory)) - }); + JavaProject javaProject = JavaProject.builder() + .compileClassPathElement(MicronautUtilsGetMicronautConfigurationTest.class.getResource(String.format("/utils-test/port-config/%s/", directory)).getPath()) + .outputDirectory(Files.createDirectory(temporaryFolder.resolve("target")).toFile()) + .build(); // When - final Properties props = getMicronautConfiguration(ucl); + final Properties props = getMicronautConfiguration(javaProject); // Then assertThat(props).containsExactly( entry("micronaut.application.name", "port-config-test-" + nameSuffix), diff --git a/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/MicronautUtilsTest.java b/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/MicronautUtilsTest.java index 335767c90d..89d12abdc7 100644 --- a/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/MicronautUtilsTest.java +++ b/jkube-kit/jkube-kit-micronaut/src/test/java/org/eclipse/jkube/micronaut/MicronautUtilsTest.java @@ -13,12 +13,14 @@ */ package org.eclipse.jkube.micronaut; -import java.net.URL; -import java.net.URLClassLoader; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Properties; import org.eclipse.jkube.kit.common.JavaProject; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; @@ -30,6 +32,8 @@ import static org.eclipse.jkube.micronaut.MicronautUtils.isHealthEnabled; class MicronautUtilsTest { + @TempDir + private Path temporaryFolder; @Test void extractPortWithPort() { @@ -70,15 +74,16 @@ void isHealthEnabledWithHealthEnabled() { } @Test - void getMicronautConfigurationPrecedence() { + void getMicronautConfigurationPrecedence() throws IOException { // Given - final URLClassLoader ucl = URLClassLoader.newInstance(new URL[] { - MicronautUtilsTest.class.getResource("/utils-test/port-config/json/"), - MicronautUtilsTest.class.getResource("/utils-test/port-config/yaml/"), - MicronautUtilsTest.class.getResource("/utils-test/port-config/properties/") - }); + JavaProject javaProject = JavaProject.builder() + .compileClassPathElement(MicronautUtilsTest.class.getResource("/utils-test/port-config/json/").getPath()) + .compileClassPathElement(MicronautUtilsTest.class.getResource("/utils-test/port-config/yaml/").getPath()) + .compileClassPathElement(MicronautUtilsTest.class.getResource("/utils-test/port-config/properties/").getPath()) + .outputDirectory(Files.createDirectory(temporaryFolder.resolve("target")).toFile()) + .build(); // When - final Properties props = getMicronautConfiguration(ucl); + final Properties props = getMicronautConfiguration(javaProject); // Then assertThat(props).containsExactly( entry("micronaut.application.name", "port-config-test-PROPERTIES"), @@ -86,13 +91,14 @@ void getMicronautConfigurationPrecedence() { } @Test - void getMicronautConfigurationNoConfigFiles() { - // Given - final URLClassLoader ucl = URLClassLoader.newInstance(new URL[] { - MicronautUtilsTest.class.getResource("/") - }); - // When - final Properties props = getMicronautConfiguration(ucl); + void getMicronautConfigurationNoConfigFiles() throws IOException { + // Given + JavaProject javaProject = JavaProject.builder() + .compileClassPathElement("/") + .outputDirectory(Files.createDirectory(temporaryFolder.resolve("target")).toFile()) + .build(); + // When + final Properties props = getMicronautConfiguration(javaProject); // Then assertThat(props).isEmpty(); } diff --git a/jkube-kit/jkube-kit-quarkus/src/main/java/org/eclipse/jkube/quarkus/QuarkusUtils.java b/jkube-kit/jkube-kit-quarkus/src/main/java/org/eclipse/jkube/quarkus/QuarkusUtils.java index 147bf7c41f..803abb3bb1 100644 --- a/jkube-kit/jkube-kit-quarkus/src/main/java/org/eclipse/jkube/quarkus/QuarkusUtils.java +++ b/jkube-kit/jkube-kit-quarkus/src/main/java/org/eclipse/jkube/quarkus/QuarkusUtils.java @@ -14,10 +14,8 @@ package org.eclipse.jkube.quarkus; import java.io.File; -import java.net.URLClassLoader; import java.util.Optional; import java.util.Properties; -import java.util.function.Supplier; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -27,15 +25,13 @@ import org.apache.commons.lang3.StringUtils; import static org.eclipse.jkube.kit.common.util.FileUtil.stripPrefix; -import static org.eclipse.jkube.kit.common.util.JKubeProjectUtil.getClassLoader; -import static org.eclipse.jkube.kit.common.util.PropertiesUtil.getPropertiesFromResource; -import static org.eclipse.jkube.kit.common.util.PropertiesUtil.toMap; +import static org.eclipse.jkube.kit.common.util.PropertiesUtil.fromApplicationConfig; import static org.eclipse.jkube.kit.common.util.SemanticVersionUtil.isVersionAtLeast; -import static org.eclipse.jkube.kit.common.util.YamlUtil.getPropertiesFromYamlResource; public class QuarkusUtils { public static final String QUARKUS_GROUP_ID = "io.quarkus"; + private static final String[] QUARKUS_APP_CONFIG_FILES_LIST = new String[] {"application.properties", "application.yaml", "application.yml"}; private static final String RED_HAT_QUARKUS_BUILD_GROUP_ID = "com.redhat.quarkus.platform"; public static final String QUARKUS_PLATFORM_GROUP_ID = "io.quarkus.platform"; private static final String QUARKUS_HTTP_PORT = "quarkus.http.port"; @@ -100,22 +96,8 @@ public static String findSingleFileThatEndsWith(JavaProject project, String suff * @param project from which to read the configuration * @return the applicable Quarkus configuration properties */ - @SuppressWarnings("unchecked") public static Properties getQuarkusConfiguration(JavaProject project) { - final URLClassLoader urlClassLoader = getClassLoader(project); - final Supplier[] sources = new Supplier[]{ - () -> getPropertiesFromResource(urlClassLoader.findResource("application.properties")), - () -> getPropertiesFromYamlResource(urlClassLoader.findResource("application.yaml")), - () -> getPropertiesFromYamlResource(urlClassLoader.findResource("application.yml")) - }; - for (Supplier source : sources) { - final Properties props = source.get(); - if (!props.isEmpty()) { - props.putAll(toMap(project.getProperties())); - return props; - } - } - return project.getProperties(); + return fromApplicationConfig(project, QUARKUS_APP_CONFIG_FILES_LIST); } private static Optional getActiveProfile(JavaProject project) { diff --git a/jkube-kit/jkube-kit-thorntail-v2/src/main/java/org/eclipse/jkube/thorntail/v2/enricher/ThorntailV2HealthCheckEnricher.java b/jkube-kit/jkube-kit-thorntail-v2/src/main/java/org/eclipse/jkube/thorntail/v2/enricher/ThorntailV2HealthCheckEnricher.java index c85b4cc7b3..341ba313ed 100644 --- a/jkube-kit/jkube-kit-thorntail-v2/src/main/java/org/eclipse/jkube/thorntail/v2/enricher/ThorntailV2HealthCheckEnricher.java +++ b/jkube-kit/jkube-kit-thorntail-v2/src/main/java/org/eclipse/jkube/thorntail/v2/enricher/ThorntailV2HealthCheckEnricher.java @@ -91,7 +91,7 @@ protected String getScheme() { } protected int getPort() { - final Properties properties = ThorntailUtil.getThorntailProperties(getContext().getProjectClassLoaders().getCompileClassLoader()); + final Properties properties = ThorntailUtil.getThorntailProperties(getContext().getProject()); properties.putAll(System.getProperties()); if (properties.containsKey("thorntail.http.port")) { return Integer.parseInt((String) properties.get("thorntail.http.port")); diff --git a/jkube-kit/jkube-kit-thorntail-v2/src/test/java/org/eclipse/jkube/thorntail/v2/enricher/ThorntailV2HealthCheckEnricherTest.java b/jkube-kit/jkube-kit-thorntail-v2/src/test/java/org/eclipse/jkube/thorntail/v2/enricher/ThorntailV2HealthCheckEnricherTest.java index 868ded0487..8bb7ae7d09 100644 --- a/jkube-kit/jkube-kit-thorntail-v2/src/test/java/org/eclipse/jkube/thorntail/v2/enricher/ThorntailV2HealthCheckEnricherTest.java +++ b/jkube-kit/jkube-kit-thorntail-v2/src/test/java/org/eclipse/jkube/thorntail/v2/enricher/ThorntailV2HealthCheckEnricherTest.java @@ -13,11 +13,15 @@ */ package org.eclipse.jkube.thorntail.v2.enricher; -import java.net.URL; -import java.net.URLClassLoader; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Collections; import java.util.Properties; -import org.eclipse.jkube.kit.common.util.ProjectClassLoaders; +import org.eclipse.jkube.kit.common.Dependency; +import org.eclipse.jkube.kit.common.JavaProject; +import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.config.resource.ProcessorConfig; import org.eclipse.jkube.kit.enricher.api.JKubeEnricherContext; @@ -29,21 +33,21 @@ import io.fabric8.kubernetes.api.model.apps.DeploymentSpec; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.io.TempDir; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.tuple; -import static org.mockito.Mockito.RETURNS_DEEP_STUBS; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; class ThorntailV2HealthCheckEnricherTest { private JKubeEnricherContext context; private Properties properties; private KubernetesListBuilder klb; + @TempDir + private Path temporaryFolder; + @BeforeEach - void setUp() { - context = mock(JKubeEnricherContext.class,RETURNS_DEEP_STUBS); + void setUp() throws IOException { properties = new Properties(); ProcessorConfig processorConfig = new ProcessorConfig(); klb = new KubernetesListBuilder(); @@ -62,10 +66,19 @@ void setUp() { .endTemplate() .endSpec() .build()); - when(context.getProperties()).thenReturn(properties); - when(context.getConfiguration().getProcessorConfig()).thenReturn(processorConfig); - when(context.hasDependency("io.thorntail", "monitor")).thenReturn(true); - when(context.getProjectClassLoaders()).thenReturn( new ProjectClassLoaders(new URLClassLoader(new URL[0], ThorntailV2HealthCheckEnricherTest.class.getClassLoader()))); + context = JKubeEnricherContext.builder() + .project(JavaProject.builder() + .properties(properties) + .dependenciesWithTransitive(Collections.singletonList(Dependency.builder() + .groupId("io.thorntail") + .artifactId("monitor") + .version("2.7.0.Final") + .build())) + .outputDirectory(Files.createDirectory(temporaryFolder.resolve("target")).toFile()) + .build()) + .processorConfig(processorConfig) + .log(new KitLogger.SilentLogger()) + .build(); } @Test @@ -132,7 +145,9 @@ void createWithThorntailSpecificPropertiesInKubernetes() { @Test void createWithNoThorntailDependency() { // Given - when(context.hasDependency("io.thorntail", "monitor")).thenReturn(false); + context = context.toBuilder() + .project(context.getProject().toBuilder().dependenciesWithTransitive(Collections.emptyList()).build()) + .build(); // When new ThorntailV2HealthCheckEnricher(context).create(PlatformMode.kubernetes, klb); // Then From 46355cbe2d54512ed17cef9a5e0fb72624fc64e2 Mon Sep 17 00:00:00 2001 From: ChinoUkaegbu <77782533+ChinoUkaegbu@users.noreply.github.com> Date: Thu, 29 Aug 2024 12:21:17 +0400 Subject: [PATCH 284/289] fix: replace AssertJ's deprecated asList() DSL method in DependencyEnricher (3347) --- .../org/eclipse/jkube/enricher/generic/DependencyEnricher.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DependencyEnricher.java b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DependencyEnricher.java index 72c8f62984..b25d33d02f 100644 --- a/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DependencyEnricher.java +++ b/jkube-kit/enricher/generic/src/main/java/org/eclipse/jkube/enricher/generic/DependencyEnricher.java @@ -133,7 +133,7 @@ private void enrichKubernetes(final KubernetesListBuilder builder) { return null; }); processArtifactSetResources(this.kubernetesTemplateDependencyArtifacts, items -> { - List templates = Arrays.asList(items.toArray(new HasMetadata[0])); + HasMetadata[] templates = items.toArray(new HasMetadata[0]); // lets remove all the plain resources (without any ${PARAM} expressions) which match objects // in the Templates found from the k8s-templates.yml files which still contain ${PARAM} expressions From a84777f1b2ee886e359ecae6b53f8bda30faf1cc Mon Sep 17 00:00:00 2001 From: Abu Taleb Sekh Date: Thu, 29 Aug 2024 15:21:19 +0530 Subject: [PATCH 285/289] fix: explicit type arguments inferred for KubernetesResourceUtil Signed-off-by: atsI --- .../jkube/kit/enricher/api/util/KubernetesResourceUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 2daf365656..60c5449ec1 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 @@ -630,7 +630,7 @@ private static Map mergeMapsAndRemoveEmptyStrings(Map containers = podSpec.getContainers() != null ? podSpec.getContainers() : Collections.emptyList(); + List containers = podSpec.getContainers() != null ? podSpec.getContainers() : Collections.emptyList(); for (Container container : containers) { if (StringUtils.isNotBlank(container.getImage())) { return false; From 3d2eead1df3c9a231a0b6268f2d209d4570ca522 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Thu, 29 Aug 2024 15:52:00 +0530 Subject: [PATCH 286/289] feat(spring-boot): added support WebFlux SpringBoot projects when generating liveness/readiness probes SpringBootHealthCheckEnricher now considers WebFlux dependency while adding liveness and readiness probes. If user is depending on webflux dependency and is using `spring.webflux.base-path` property, it would automatically be picked up in probe endpoints Signed-off-by: Rohan Kumar --- CHANGELOG.md | 1 + .../common/util/SpringBootConfiguration.java | 4 +- .../jkube/kit/common/util/SpringBootUtil.java | 5 ++ .../kit/common/util/SpringBootUtilTest.java | 23 ++++++ .../_jkube_healthcheck_spring_boot.adoc | 2 + .../SpringBootHealthCheckEnricher.java | 11 ++- ...ingBootHealthCheckEnricherTestSupport.java | 76 +++++++++++++++++++ 7 files changed, 119 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6cca74ea0a..cd85d6e5aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ Usage: ./scripts/extract-changelog-for-version.sh 1.3.37 5 ``` ### 1.18-SNAPSHOT +* Fix #1125: Support WebFlux SpringBoot projects when it comes to generate probes for actuators ### 1.17.0 (2024-08-13) * Fix #494: Support for Micronaut Framework Native Images diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/SpringBootConfiguration.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/SpringBootConfiguration.java index 7349afe7d7..c396356c34 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/SpringBootConfiguration.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/SpringBootConfiguration.java @@ -35,6 +35,7 @@ public class SpringBootConfiguration { private String managementContextPath; private String actuatorBasePath; private String actuatorDefaultBasePath; + private String webFluxBasePath; private boolean managementHealthProbesEnabled; public static SpringBootConfiguration from(JavaProject project) { @@ -63,7 +64,8 @@ public static SpringBootConfiguration from(JavaProject project) { .serverContextPath(properties.getProperty("server.context-path")) .managementContextPath(properties.getProperty("management.context-path")) .actuatorBasePath("") - .actuatorDefaultBasePath(""); + .actuatorDefaultBasePath("") + .webFluxBasePath(properties.getProperty("spring.webflux.base-path")); if (majorVersion > 1) { configBuilder .managementPort(Optional.ofNullable(properties.getProperty("management.server.port")).map(Integer::parseInt).orElse(null)) diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/SpringBootUtil.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/SpringBootUtil.java index 018c03b5c9..186fc4c51e 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/SpringBootUtil.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/SpringBootUtil.java @@ -39,6 +39,7 @@ public class SpringBootUtil { public static final String DEV_TOOLS_REMOTE_SECRET = "spring.devtools.remote.secret"; public static final String DEV_TOOLS_REMOTE_SECRET_ENV = "SPRING_DEVTOOLS_REMOTE_SECRET"; + private static final String SPRING_WEB_FLUX_ARTIFACT_ID = "spring-boot-starter-webflux"; private static final String PLACEHOLDER_PREFIX = "${"; private static final String PLACEHOLDER_SUFFIX = "}"; private static final String VALUE_SEPARATOR = ":"; @@ -149,5 +150,9 @@ public static File findNativeArtifactFile(JavaProject project) { } return null; } + + public static boolean hasSpringWebFluxDependency(JavaProject javaProject) { + return JKubeProjectUtil.hasDependency(javaProject, SPRING_BOOT_GROUP_ID, SPRING_WEB_FLUX_ARTIFACT_ID); + } } diff --git a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SpringBootUtilTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SpringBootUtilTest.java index 76162b7ada..44ef5a8090 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SpringBootUtilTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/SpringBootUtilTest.java @@ -389,6 +389,29 @@ void findNativeArtifactFile_whenNativeExecutableInStandardGradleNativeDirectory_ assertThat(nativeArtifactFound).hasName("sample"); } + @Test + void hasSpringWebFluxDependency_whenWebFluxDependencyPresent_thenReturnTrue() { + // Given + JavaProject javaProject = JavaProject.builder().dependency(Dependency.builder() + .groupId("org.springframework.boot") + .artifactId("spring-boot-starter-webflux") + .build()) + .build(); + // When + Then + assertThat(SpringBootUtil.hasSpringWebFluxDependency(javaProject)).isTrue(); + } + + @Test + void hasSpringWebFluxDependency_whenNoWebFluxDependencyPresent_thenReturnFalse() { + // Given + JavaProject javaProject = JavaProject.builder().dependency(Dependency.builder() + .groupId("org.springframework.boot") + .artifactId("spring-boot-starter-web") + .build()).build(); + // When + Then + assertThat(SpringBootUtil.hasSpringWebFluxDependency(javaProject)).isFalse(); + } + static URLClassLoader createClassLoader(File temporaryFolder, String resource) throws IOException { File applicationProp = new File(Objects.requireNonNull(SpringBootUtilTest.class.getResource(resource)).getPath()); File classesInTarget = new File(new File(temporaryFolder, "target"), "classes"); diff --git a/jkube-kit/doc/src/main/asciidoc/inc/enricher/spring-boot-healthcheck/_jkube_healthcheck_spring_boot.adoc b/jkube-kit/doc/src/main/asciidoc/inc/enricher/spring-boot-healthcheck/_jkube_healthcheck_spring_boot.adoc index 03ed9ad9cb..93d979ba20 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/enricher/spring-boot-healthcheck/_jkube_healthcheck_spring_boot.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/enricher/spring-boot-healthcheck/_jkube_healthcheck_spring_boot.adoc @@ -12,6 +12,8 @@ ifeval::["{plugin-type}" == "gradle"] include::gradle/_actuator_dependency.adoc[] endif::[] +If you're using Spring Boot WebFlux, this enricher would automatically read `spring.webflux.base-path` property to infer base path for health check endpoints. + The enricher will try to discover the settings from the `application.properties` / `application.yaml` Spring Boot configuration file. `/actuator/health` is the default endpoint for the liveness and readiness probes. diff --git a/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/enricher/SpringBootHealthCheckEnricher.java b/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/enricher/SpringBootHealthCheckEnricher.java index d9bc10375b..09f0f81dd3 100644 --- a/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/enricher/SpringBootHealthCheckEnricher.java +++ b/jkube-kit/jkube-kit-spring-boot/src/main/java/org/eclipse/jkube/springboot/enricher/SpringBootHealthCheckEnricher.java @@ -24,6 +24,8 @@ import org.eclipse.jkube.kit.enricher.specific.AbstractHealthCheckEnricher; import org.apache.commons.lang3.StringUtils; +import static org.eclipse.jkube.kit.common.util.SpringBootUtil.hasSpringWebFluxDependency; + /** * Enriches spring-boot containers with health checks if the actuator module is present. */ @@ -112,8 +114,13 @@ protected Probe buildProbe(Integer initialDelay, Integer period, Integer timeout springBootConfiguration.getManagementContextPath() : ""; } else { scheme = StringUtils.isNotBlank(springBootConfiguration.getServerKeystore()) ? SCHEME_HTTPS : SCHEME_HTTP; - prefix = StringUtils.isNotBlank(springBootConfiguration.getServerContextPath()) ? - springBootConfiguration.getServerContextPath() : ""; + if (hasSpringWebFluxDependency(getContext().getProject()) && StringUtils.isNotBlank(springBootConfiguration.getWebFluxBasePath())) { + prefix = springBootConfiguration.getWebFluxBasePath(); + } else if (StringUtils.isNotBlank(springBootConfiguration.getServerContextPath())) { + prefix = springBootConfiguration.getServerContextPath(); + } else { + prefix = ""; + } prefix += StringUtils.isNotBlank(springBootConfiguration.getServletPath()) ? springBootConfiguration.getServletPath() : ""; prefix += StringUtils.isNotBlank(springBootConfiguration.getManagementContextPath()) ? diff --git a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/enricher/AbstractSpringBootHealthCheckEnricherTestSupport.java b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/enricher/AbstractSpringBootHealthCheckEnricherTestSupport.java index 8752bf97a6..612c74d037 100644 --- a/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/enricher/AbstractSpringBootHealthCheckEnricherTestSupport.java +++ b/jkube-kit/jkube-kit-spring-boot/src/test/java/org/eclipse/jkube/springboot/enricher/AbstractSpringBootHealthCheckEnricherTestSupport.java @@ -30,7 +30,10 @@ import org.eclipse.jkube.kit.config.resource.ProcessorConfig; import org.eclipse.jkube.kit.enricher.api.JKubeEnricherContext; import org.eclipse.jkube.kit.common.util.ProjectClassLoaders; +import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; @@ -701,6 +704,79 @@ void testLivenessAndReadinessProbesForDefaultPath_whenManagementHealthProbesEnab assertHTTPGetPathAndPort(readinessProbe,getActuatorDefaultBasePath() + "/health",8080); } + @Nested + @DisplayName("Spring Web Flux Dependency present") + class SpringWebFlux { + @BeforeEach + void setup() { + context.getProject().setDependencies(Collections.singletonList(Dependency.builder() + .groupId("org.springframework.boot") + .artifactId("spring-boot-starter-webflux") + .version(getSpringBootVersion()) + .build())); + when(context.getProjectClassLoaders().isClassInCompileClasspath(true, REQUIRED_CLASSES)) + .thenReturn(true); + } + + @Nested + @DisplayName("spring.webflux.base-path property configured") + class SpringWebFluxBasePathConfigured { + @BeforeEach + void setUp() { + props.put("spring.webflux.base-path", "/webflux"); + } + + @AfterEach + void tearDown() { + props.clear(); + } + + @Test + @DisplayName("when management server sharing main server port, then liveness, readiness probes use web flux base path in endpoints") + void whenProbesGenerated_thenProbesAddWebFluxBasePath() { + // Given + props.put("management.port", "8383"); + props.put("management.server.port", "8383"); + writeProps(); + SpringBootHealthCheckEnricher enricher = new SpringBootHealthCheckEnricher(context); + // When + Probe livenessProbe = enricher.getLivenessProbe(); + Probe readinessProbe = enricher.getReadinessProbe(); + // Then + assertHTTPGetPathAndPort(livenessProbe, getActuatorDefaultBasePath() + "/health",8383); + assertHTTPGetPathAndPort(readinessProbe,getActuatorDefaultBasePath() + "/health",8383); + } + + @Test + @DisplayName("when a separate management server port configured, then spring.webflux.base-path is ignored") + void whenManagementServerRunningOnDifferentPort_thenProbesDoNotUseWebFluxBasePath() { + // Given + writeProps(); + SpringBootHealthCheckEnricher enricher = new SpringBootHealthCheckEnricher(context); + // When + Probe livenessProbe = enricher.getLivenessProbe(); + Probe readinessProbe = enricher.getReadinessProbe(); + // Then + assertHTTPGetPathAndPort(livenessProbe,"/webflux" + getActuatorDefaultBasePath() + "/health",8080); + assertHTTPGetPathAndPort(readinessProbe,"/webflux" + getActuatorDefaultBasePath() + "/health",8080); + } + } + + @Test + @DisplayName("when no explicit base path configured, then use default base path") + void whenManagementServerRunningOnDifferentPort_thenProbesDoNotUseWebFluxBasePath() { + // Given + writeProps(); + SpringBootHealthCheckEnricher enricher = new SpringBootHealthCheckEnricher(context); + // When + Probe livenessProbe = enricher.getLivenessProbe(); + Probe readinessProbe = enricher.getReadinessProbe(); + // Then + assertHTTPGetPathAndPort(livenessProbe,getActuatorDefaultBasePath() + "/health",8080); + assertHTTPGetPathAndPort(readinessProbe,getActuatorDefaultBasePath() + "/health",8080); + } + } + private void assertHTTPGetPathAndPort(Probe probe, String path, int port) { assertThat(probe).isNotNull() .extracting(Probe::getHttpGet).isNotNull() From 766d3361e3fe89028efdd0cccb2856c0e99761f4 Mon Sep 17 00:00:00 2001 From: Dakota Dunn <159508874+heap-s@users.noreply.github.com> Date: Thu, 29 Aug 2024 09:45:38 -0400 Subject: [PATCH 287/289] fix: replace AssertJ's deprecated asList() DSL method in KubernetesResourceUtilTest (3349) Signed-off-by: heap-s --- .../enricher/api/util/KubernetesResourceUtilTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtilTest.java b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtilTest.java index 5a42183664..e58c060dc4 100644 --- a/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtilTest.java +++ b/jkube-kit/enricher/api/src/test/java/org/eclipse/jkube/kit/enricher/api/util/KubernetesResourceUtilTest.java @@ -166,7 +166,7 @@ void mergePodSpec_withFragmentWithNoContainerNameAndSidecarDisabled_shouldGetCon .hasFieldOrPropertyWithValue("resources.requests.memory.amount", "256") .hasFieldOrPropertyWithValue("resources.limits.cpu.amount", "1.0") .hasFieldOrPropertyWithValue("resources.limits.memory.amount", "512") - .extracting("ports").asList().extracting("containerPort") + .extracting("ports").asInstanceOf(InstanceOfAssertFactories.list(ContainerPort.class)).extracting("containerPort") .containsExactly(8080, 9779, 8778); } @@ -300,7 +300,7 @@ void mergeResources_whenDeploymentProvidedAndFirstDeploymentWithEmptySpec_thenSh .extracting(DeploymentSpec::getTemplate) .extracting(PodTemplateSpec::getSpec) .extracting(PodSpec::getContainers) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(Container.class)) .singleElement(InstanceOfAssertFactories.type(Container.class)) .hasFieldOrPropertyWithValue("env", Collections.singletonList(new EnvVarBuilder().withName("E1").withValue("V1").build())) .hasFieldOrPropertyWithValue("name", "foo"); @@ -338,7 +338,7 @@ void mergeResources_whenDeploymentProvidedAndSecondDeploymentWithEmptySpec_thenS .extracting(DeploymentSpec::getTemplate) .extracting(PodTemplateSpec::getSpec) .extracting(PodSpec::getContainers) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(Container.class)) .singleElement(InstanceOfAssertFactories.type(Container.class)) .hasFieldOrPropertyWithValue("name", "foo"); } @@ -393,7 +393,7 @@ void mergeResources_whenBothDeploymentNonEmptySpec_thenShouldMergeBothObjects() .extracting(DeploymentSpec::getTemplate) .extracting(PodTemplateSpec::getSpec) .extracting(PodSpec::getContainers) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(Container.class)) .singleElement(InstanceOfAssertFactories.type(Container.class)) .hasFieldOrPropertyWithValue("name", "c1"); } @@ -486,7 +486,7 @@ void mergeResources_whenPodsProvided_thenMergeBothPodMetadataOnly() { .hasFieldOrPropertyWithValue("metadata.labels.l2", "v2") .extracting(Pod::getSpec) .extracting(PodSpec::getContainers) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(Container.class)) .singleElement(InstanceOfAssertFactories.type(Container.class)) .hasFieldOrPropertyWithValue("name", "c1") .hasFieldOrPropertyWithValue("image", "image1:latest"); From 422a7543d381b0bdf899d70ada981bcdfec3612b Mon Sep 17 00:00:00 2001 From: Oleksandr Krutko <46520164+arsenalzp@users.noreply.github.com> Date: Fri, 30 Aug 2024 09:25:16 +0200 Subject: [PATCH 288/289] fix(openshift): retrieve builder pod logs from builds() DSL entrypoint remove unused comments, add improve OpenshiftBuildServiceIntegrationTest tests Signed-off-by: Oleksandr Krutko revert to initial version of file quickstarts/maven/spring-boot/pom.xml Signed-off-by: Oleksandr Krutko --- CHANGELOG.md | 1 + .../kit/config/service/openshift/OpenshiftBuildService.java | 2 +- .../service/openshift/OpenshiftBuildServiceIntegrationTest.java | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cd85d6e5aa..3bfa85efa0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ Usage: ``` ### 1.18-SNAPSHOT * Fix #1125: Support WebFlux SpringBoot projects when it comes to generate probes for actuators +* Fix #2844: `oc:build` on openshift use `pods/log` to retrieve logs from build ### 1.17.0 (2024-08-13) * Fix #494: Support for Micronaut Framework Native Images 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 ddc5b9e8a6..ef240889a3 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 @@ -466,7 +466,7 @@ private void waitForOpenShiftBuildToComplete(OpenShiftClient client, Build build // Don't query for logs directly, Watch over the build pod: waitUntilPodIsReady(buildName + "-build", 120, log); log.info("Waiting for build " + buildName + " to complete..."); - try (LogWatch logWatch = client.pods().inNamespace(applicableOpenShiftNamespace).withName(buildName + "-build").watchLog()) { + try (LogWatch logWatch = client.builds().inNamespace(applicableOpenShiftNamespace).withName(buildName).watchLog()) { KubernetesHelper.printLogsAsync(logWatch, line -> log.info("[[s]]%s", line)) .whenComplete((v, t) -> { if (t != null) { 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 a7ab792aba..eb5023b9bc 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 @@ -592,6 +592,7 @@ private WebServerEventCollector prepareMockServer( if (!imageStreamExists) { mockServer.expect().get().withPath("/apis/image.openshift.io/v1/namespaces/ns1/imagestreams/" + resourceName).andReturn(404, "").once(); } + mockServer.expect().get().withPath("/api/v1/namespaces/ns1/pods?labelSelector=openshift.io%2Fbuild.name").andReply(collector.record("build-config-check").andReturn(200, bc)).always(); mockServer.expect().get().withPath("/apis/image.openshift.io/v1/namespaces/ns1/imagestreams/" + resourceName).andReturn(200, imageStream).always(); mockServer.expect().post().withPath("/apis/image.openshift.io/v1/namespaces/ns1/imagestreams").andReturn(201, imageStream).once(); From 121c427d0a9ad04a5f4af02f55627204dd78ee43 Mon Sep 17 00:00:00 2001 From: Jinhong <139559460+Flowers2Algernon@users.noreply.github.com> Date: Fri, 30 Aug 2024 16:13:34 +0800 Subject: [PATCH 289/289] fix: replace AssertJ's deprecated asList() DSL method in QuarkusGeneratorExposedPortsTest (3350) --- .../generator/QuarkusGeneratorExposedPortsTest.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/jkube-kit/jkube-kit-quarkus/src/test/java/org/eclipse/jkube/quarkus/generator/QuarkusGeneratorExposedPortsTest.java b/jkube-kit/jkube-kit-quarkus/src/test/java/org/eclipse/jkube/quarkus/generator/QuarkusGeneratorExposedPortsTest.java index a195a33b0b..b3c54e1892 100644 --- a/jkube-kit/jkube-kit-quarkus/src/test/java/org/eclipse/jkube/quarkus/generator/QuarkusGeneratorExposedPortsTest.java +++ b/jkube-kit/jkube-kit-quarkus/src/test/java/org/eclipse/jkube/quarkus/generator/QuarkusGeneratorExposedPortsTest.java @@ -21,6 +21,7 @@ import java.util.List; import java.util.Properties; +import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.generator.api.GeneratorContext; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; @@ -69,7 +70,7 @@ void withDefaults_shouldAddDefaults() throws IOException { assertThat(result).singleElement() .extracting(ImageConfiguration::getBuildConfiguration) .extracting(BuildConfiguration::getPorts) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .containsExactly("8080", "8778", "9779"); } @@ -83,7 +84,7 @@ void withDefaultsInNative_shouldAddDefaultsForNative() throws IOException { assertThat(result).singleElement() .extracting(ImageConfiguration::getBuildConfiguration) .extracting(BuildConfiguration::getPorts) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .containsExactly("8080"); } @@ -101,7 +102,7 @@ void withApplicationProperties_shouldAddConfigured() throws IOException { assertThat(result).singleElement() .extracting(ImageConfiguration::getBuildConfiguration) .extracting(BuildConfiguration::getPorts) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .containsExactly("1337", "8778", "9779"); } @@ -120,7 +121,7 @@ void withApplicationPropertiesAndProfile_shouldAddConfiguredProfile() throws IOE assertThat(result).singleElement() .extracting(ImageConfiguration::getBuildConfiguration) .extracting(BuildConfiguration::getPorts) - .asList() + .asInstanceOf(InstanceOfAssertFactories.list(String.class)) .containsExactly("31337", "8778", "9779"); }