From 8568439477c641ef8cdeff9424d71cfb680d4e51 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Mon, 11 Mar 2024 23:19:36 +0530 Subject: [PATCH 1/3] 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 Signed-off-by: Rohan Kumar --- gradle-plugin/kubernetes/pom.xml | 6 + .../META-INF/jkube/profiles-default.yml | 2 + .../META-INF/jkube/profiles-default.yml | 2 + .../kit/build/api/helper/ConfigHelper.java | 31 --- .../build/api/helper/ConfigHelperTest.java | 93 +++----- .../common/util/BuildReferenceDateUtil.java | 6 +- .../jkube/kit/common/util/EnvUtil.java | 5 +- .../generator/api/support/BaseGenerator.java | 5 - .../api/support/BaseGeneratorTest.java | 17 -- jkube-kit/generator/dockerfile-simple/pom.xml | 47 ++++ .../simple/SimpleDockerfileGenerator.java | 57 +++++ .../META-INF/jkube/generator-default | 5 + .../simple/SimpleDockerfileGeneratorTest.java | 214 ++++++++++++++++++ .../resources/dummy-javaproject/Dockerfile | 0 jkube-kit/parent/pom.xml | 6 + jkube-kit/pom.xml | 1 + kubernetes-maven-plugin/plugin/pom.xml | 5 + .../META-INF/jkube/profiles-default.yml | 2 + .../plugin/mojo/develop/WatchMojoTest.java | 1 + .../META-INF/jkube/profiles-default.yml | 2 + 20 files changed, 388 insertions(+), 119 deletions(-) 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/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 rename jkube-kit/{build/api => generator/dockerfile-simple}/src/test/resources/dummy-javaproject/Dockerfile (100%) diff --git a/gradle-plugin/kubernetes/pom.xml b/gradle-plugin/kubernetes/pom.xml index 0ea24f1d38..798a407b3b 100644 --- a/gradle-plugin/kubernetes/pom.xml +++ b/gradle-plugin/kubernetes/pom.xml @@ -72,6 +72,12 @@ jkube-kit-generator-java-exec ${jkube.kit.version} + + + org.eclipse.jkube + jkube-kit-generator-dockerfile-simple + + 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/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/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/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/support/BaseGenerator.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java index 3659ae5f56..524f064ab3 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; @@ -215,10 +214,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..ede9df65fb --- /dev/null +++ b/jkube-kit/generator/dockerfile-simple/pom.xml @@ -0,0 +1,47 @@ + + + + 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 + test + + + 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..a1fa4f74ba --- /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.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.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(), + "jkube.image.name", "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/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/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 91e5f30d9c..a7b4edb0e0 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/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/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 4b3172c4f3b6a282dd8ed8c75c89fd588741a7f1 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Mon, 1 Apr 2024 22:37:30 +0530 Subject: [PATCH 2/3] test : Add test for verifying generator order in default profile Signed-off-by: Rohan Kumar --- .../plugin/task/KubernetesBuildTaskTest.java | 51 ++++++ .../kit/build/api/helper/DockerFileUtil.java | 58 ------- .../build/api/helper/DockerFileUtilTest.java | 81 ---------- .../api/DefaultGeneratorManager.java | 20 +-- jkube-kit/generator/dockerfile-simple/pom.xml | 1 - .../simple/SimpleDockerfileGenerator.java | 8 +- .../simple/SimpleDockerfileUtil.java | 90 +++++++++++ .../simple/SimpleDockerfileUtilTest.java | 145 ++++++++++++++++++ .../test/resources}/Dockerfile_expose_ports | 0 .../plugin/mojo/build/BuildMojoTest.java | 46 ++++++ 10 files changed, 347 insertions(+), 153 deletions(-) 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/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%) 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..27ef3ef18e 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 @@ -13,13 +13,25 @@ */ package org.eclipse.jkube.gradle.plugin.task; +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.Properties; +import org.assertj.core.api.Assertions; +import org.assertj.core.api.InstanceOfAssertFactories; +import org.eclipse.jkube.generator.api.DefaultGeneratorManager; +import org.eclipse.jkube.generator.api.GeneratorContext; 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.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.eclipse.jkube.kit.config.service.JKubeServiceException; @@ -29,8 +41,10 @@ import org.gradle.api.provider.Property; 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 org.junit.jupiter.api.io.TempDir; import org.mockito.MockedConstruction; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; @@ -137,4 +151,41 @@ public Property getSkipBuild() { assertThat(dockerBuildServiceMockedConstruction.constructed()).isEmpty(); verify(buildTask.jKubeServiceHub.getBuildService(), times(0)).build(any()); } + + @Test + @DisplayName("when Dockerfile present in project base directory, then generate opinionated ImageConfiguration for Dockerfile") + void simpleDockerfileModeWorksAsExpected(@TempDir File temporaryFolder) throws IOException { + // Given + File dockerFileInProjectBaseDir = temporaryFolder.toPath().resolve("Dockerfile").toFile(); + Files.createFile(dockerFileInProjectBaseDir.toPath()); + extension = new TestKubernetesExtension() { + @Override + public Property getResourceSourceDirectory() { + return super.getResourceSourceDirectory().value(new File(temporaryFolder, "src/main/jkube")); + } + }; + extension.javaProject = JavaProject.builder() + .baseDirectory(temporaryFolder) + .outputDirectory(temporaryFolder.toPath().resolve("target").toFile()) + .buildDirectory(temporaryFolder.toPath().resolve("target").toFile()) + .plugin(Plugin.builder().groupId("org.springframework.boot").artifactId("org.springframework.boot.gradle.plugin").build()) + .properties(new Properties()).build(); + when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); + final KubernetesBuildTask buildTask = new KubernetesBuildTask(KubernetesExtension.class); + buildTask.kitLogger = new KitLogger.SilentLogger(); + GeneratorContext generatorContext = buildTask.initGeneratorContextBuilder().build(); + List imageConfigurations = new ArrayList<>(); + DefaultGeneratorManager generatorManager = new DefaultGeneratorManager(generatorContext); + + // When + List imageConfigurationList = generatorManager.generate(imageConfigurations); + + // Then + Assertions.assertThat(imageConfigurationList) + .hasSize(1) + .singleElement(InstanceOfAssertFactories.type(ImageConfiguration.class)) + .extracting(ImageConfiguration::getBuild) + .extracting(BuildConfiguration::getDockerFileRaw) + .isEqualTo(dockerFileInProjectBaseDir.getAbsolutePath()); + } } 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/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/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/dockerfile-simple/pom.xml b/jkube-kit/generator/dockerfile-simple/pom.xml index ede9df65fb..8b267a2249 100644 --- a/jkube-kit/generator/dockerfile-simple/pom.xml +++ b/jkube-kit/generator/dockerfile-simple/pom.xml @@ -37,7 +37,6 @@ org.junit.jupiter junit-jupiter-engine - test org.assertj 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 index a1fa4f74ba..69587237d7 100644 --- 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 @@ -21,10 +21,10 @@ import java.io.File; import java.util.List; -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.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; 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/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..25bdf1174e --- /dev/null +++ b/jkube-kit/generator/dockerfile-simple/src/test/java/org/eclipse/jkube/generator/dockerfile/simple/SimpleDockerfileUtilTest.java @@ -0,0 +1,145 @@ +/* + * 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(); + } + } + + @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/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/BuildMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/BuildMojoTest.java index d3cc306baa..5ce1a6ca8f 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/BuildMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/BuildMojoTest.java @@ -14,13 +14,28 @@ package org.eclipse.jkube.maven.plugin.mojo.build; import org.apache.maven.project.MavenProject; +import org.assertj.core.api.InstanceOfAssertFactories; +import org.eclipse.jkube.generator.api.DefaultGeneratorManager; +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.Plugin; +import org.eclipse.jkube.kit.config.image.ImageConfiguration; +import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.resource.ContainerResourcesConfig; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.service.BuildServiceConfig; 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.util.ArrayList; +import java.util.List; +import java.util.Properties; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; @@ -58,4 +73,35 @@ void buildServiceConfigBuilder_shouldReturnNonNullResourceConfigIfConfigured() { .returns("200m", c -> c.getLimits().get("cpu")) .returns("1Gi", c -> c.getRequests().get("memory")); } + + @Test + @DisplayName("when Dockerfile present in project base directory, then generate opinionated ImageConfiguration for Dockerfile") + void simpleDockerfileModeWorksAsExpected(@TempDir File temporaryFolder) throws IOException { + // Given + BuildMojo buildMojo = new BuildMojo(); + File dockerFileInProjectBaseDir = temporaryFolder.toPath().resolve("Dockerfile").toFile(); + Files.createFile(dockerFileInProjectBaseDir.toPath()); + buildMojo.resourceDir = new File("src/main/jkube"); + buildMojo.log = new KitLogger.SilentLogger(); + buildMojo.javaProject = JavaProject.builder() + .baseDirectory(temporaryFolder) + .outputDirectory(temporaryFolder.toPath().resolve("target").toFile()) + .buildDirectory(temporaryFolder.toPath().resolve("target").toFile()) + .plugin(Plugin.builder().groupId("org.springframework.boot").artifactId("spring-boot-maven-plugin").build()) + .properties(new Properties()).build(); + GeneratorContext generatorContext = buildMojo.generatorContextBuilder().build(); + List imageConfigurations = new ArrayList<>(); + DefaultGeneratorManager generatorManager = new DefaultGeneratorManager(generatorContext); + + // When + List imageConfigurationList = generatorManager.generate(imageConfigurations); + + // Then + assertThat(imageConfigurationList) + .hasSize(1) + .singleElement(InstanceOfAssertFactories.type(ImageConfiguration.class)) + .extracting(ImageConfiguration::getBuild) + .extracting(BuildConfiguration::getDockerFileRaw) + .isEqualTo(dockerFileInProjectBaseDir.getAbsolutePath()); + } } From 8aca467a6230cb4794d43d8de6f6e12f2f79c03c Mon Sep 17 00:00:00 2001 From: Marc Nuri Date: Thu, 11 Apr 2024 11:39:42 +0200 Subject: [PATCH 3/3] review: IT for gradle and maven plugin precedence Signed-off-by: Marc Nuri --- .../Dockerfile | 16 +++++ .../build.gradle | 33 +++++++++++ .../Dockerfile | 16 +++++ .../build.gradle | 33 +++++++++++ ...DockerfileSimpleExtensionPrecedenceIT.java | 59 +++++++++++++++++++ .../plugin/tests/ITGradleRunnerExtension.java | 10 ++++ gradle-plugin/kubernetes/pom.xml | 1 + .../plugin/TestKubernetesExtension.java | 3 +- .../plugin/task/KubernetesBuildTaskTest.java | 50 ---------------- .../generator/api/support/BaseGenerator.java | 7 ++- .../simple/SimpleDockerfileGenerator.java | 2 +- .../simple/SimpleDockerfileUtilTest.java | 6 ++ .../Dockerfile | 16 +++++ .../invoker.properties | 17 ++++++ .../pom.xml | 54 +++++++++++++++++ .../maven/sample/spring/boot/Application.java | 26 ++++++++ .../sample/spring/boot/HelloController.java | 27 +++++++++ .../verify.groovy | 18 ++++++ .../plugin/mojo/build/BuildMojoTest.java | 46 --------------- .../Dockerfile | 16 +++++ .../invoker.properties | 17 ++++++ .../pom.xml | 54 +++++++++++++++++ .../maven/sample/spring/boot/Application.java | 26 ++++++++ .../sample/spring/boot/HelloController.java | 27 +++++++++ .../verify.groovy | 18 ++++++ 25 files changed, 498 insertions(+), 100 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 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 83b0a034bb..de0a25720f 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 798a407b3b..022a011145 100644 --- a/gradle-plugin/kubernetes/pom.xml +++ b/gradle-plugin/kubernetes/pom.xml @@ -76,6 +76,7 @@ org.eclipse.jkube jkube-kit-generator-dockerfile-simple + ${jkube.kit.version} 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 27ef3ef18e..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 @@ -13,25 +13,13 @@ */ package org.eclipse.jkube.gradle.plugin.task; -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.Properties; -import org.assertj.core.api.Assertions; -import org.assertj.core.api.InstanceOfAssertFactories; -import org.eclipse.jkube.generator.api.DefaultGeneratorManager; -import org.eclipse.jkube.generator.api.GeneratorContext; 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.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.eclipse.jkube.kit.config.service.JKubeServiceException; @@ -41,10 +29,8 @@ import org.gradle.api.provider.Property; 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 org.junit.jupiter.api.io.TempDir; import org.mockito.MockedConstruction; import static org.assertj.core.api.Assertions.assertThatIllegalStateException; @@ -152,40 +138,4 @@ public Property getSkipBuild() { verify(buildTask.jKubeServiceHub.getBuildService(), times(0)).build(any()); } - @Test - @DisplayName("when Dockerfile present in project base directory, then generate opinionated ImageConfiguration for Dockerfile") - void simpleDockerfileModeWorksAsExpected(@TempDir File temporaryFolder) throws IOException { - // Given - File dockerFileInProjectBaseDir = temporaryFolder.toPath().resolve("Dockerfile").toFile(); - Files.createFile(dockerFileInProjectBaseDir.toPath()); - extension = new TestKubernetesExtension() { - @Override - public Property getResourceSourceDirectory() { - return super.getResourceSourceDirectory().value(new File(temporaryFolder, "src/main/jkube")); - } - }; - extension.javaProject = JavaProject.builder() - .baseDirectory(temporaryFolder) - .outputDirectory(temporaryFolder.toPath().resolve("target").toFile()) - .buildDirectory(temporaryFolder.toPath().resolve("target").toFile()) - .plugin(Plugin.builder().groupId("org.springframework.boot").artifactId("org.springframework.boot.gradle.plugin").build()) - .properties(new Properties()).build(); - when(taskEnvironment.project.getExtensions().getByType(KubernetesExtension.class)).thenReturn(extension); - final KubernetesBuildTask buildTask = new KubernetesBuildTask(KubernetesExtension.class); - buildTask.kitLogger = new KitLogger.SilentLogger(); - GeneratorContext generatorContext = buildTask.initGeneratorContextBuilder().build(); - List imageConfigurations = new ArrayList<>(); - DefaultGeneratorManager generatorManager = new DefaultGeneratorManager(generatorContext); - - // When - List imageConfigurationList = generatorManager.generate(imageConfigurations); - - // Then - Assertions.assertThat(imageConfigurationList) - .hasSize(1) - .singleElement(InstanceOfAssertFactories.type(ImageConfiguration.class)) - .extracting(ImageConfiguration::getBuild) - .extracting(BuildConfiguration::getDockerFileRaw) - .isEqualTo(dockerFileInProjectBaseDir.getAbsolutePath()); - } } 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 524f064ab3..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 @@ -48,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"; @@ -185,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"); } } 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 index 69587237d7..eac1616af9 100644 --- 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 @@ -46,7 +46,7 @@ public List customize(List configs, bool "docker/build.timestamp")); File topDockerfile = getTopLevelDockerfile(getContext().getProject().getBaseDirectory()); String defaultImageName = imageNameFormatter.format(getValueFromProperties(getContext().getProject().getProperties(), - "jkube.image.name", "jkube.generator.name")); + 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) { 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 index 25bdf1174e..ef62a6db16 100644 --- 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 @@ -50,6 +50,12 @@ void whenDockerfilePresentInBaseDirectory_thenReturnTrue() { 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 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/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/BuildMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/BuildMojoTest.java index 5ce1a6ca8f..d3cc306baa 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/BuildMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/build/BuildMojoTest.java @@ -14,28 +14,13 @@ package org.eclipse.jkube.maven.plugin.mojo.build; import org.apache.maven.project.MavenProject; -import org.assertj.core.api.InstanceOfAssertFactories; -import org.eclipse.jkube.generator.api.DefaultGeneratorManager; -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.Plugin; -import org.eclipse.jkube.kit.config.image.ImageConfiguration; -import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.resource.ContainerResourcesConfig; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import org.eclipse.jkube.kit.config.service.BuildServiceConfig; 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.util.ArrayList; -import java.util.List; -import java.util.Properties; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.RETURNS_DEEP_STUBS; @@ -73,35 +58,4 @@ void buildServiceConfigBuilder_shouldReturnNonNullResourceConfigIfConfigured() { .returns("200m", c -> c.getLimits().get("cpu")) .returns("1Gi", c -> c.getRequests().get("memory")); } - - @Test - @DisplayName("when Dockerfile present in project base directory, then generate opinionated ImageConfiguration for Dockerfile") - void simpleDockerfileModeWorksAsExpected(@TempDir File temporaryFolder) throws IOException { - // Given - BuildMojo buildMojo = new BuildMojo(); - File dockerFileInProjectBaseDir = temporaryFolder.toPath().resolve("Dockerfile").toFile(); - Files.createFile(dockerFileInProjectBaseDir.toPath()); - buildMojo.resourceDir = new File("src/main/jkube"); - buildMojo.log = new KitLogger.SilentLogger(); - buildMojo.javaProject = JavaProject.builder() - .baseDirectory(temporaryFolder) - .outputDirectory(temporaryFolder.toPath().resolve("target").toFile()) - .buildDirectory(temporaryFolder.toPath().resolve("target").toFile()) - .plugin(Plugin.builder().groupId("org.springframework.boot").artifactId("spring-boot-maven-plugin").build()) - .properties(new Properties()).build(); - GeneratorContext generatorContext = buildMojo.generatorContextBuilder().build(); - List imageConfigurations = new ArrayList<>(); - DefaultGeneratorManager generatorManager = new DefaultGeneratorManager(generatorContext); - - // When - List imageConfigurationList = generatorManager.generate(imageConfigurations); - - // Then - assertThat(imageConfigurationList) - .hasSize(1) - .singleElement(InstanceOfAssertFactories.type(ImageConfiguration.class)) - .extracting(ImageConfiguration::getBuild) - .extracting(BuildConfiguration::getDockerFileRaw) - .isEqualTo(dockerFileInProjectBaseDir.getAbsolutePath()); - } } 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") +