diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java index 4d635761b2..7656ba377a 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java @@ -22,6 +22,7 @@ import java.util.Optional; import io.fabric8.kubernetes.client.KubernetesClient; +import org.apache.commons.lang3.StringUtils; import org.eclipse.jkube.generator.api.DefaultGeneratorManager; import org.eclipse.jkube.generator.api.GeneratorContext; import org.eclipse.jkube.gradle.plugin.GradleLogger; @@ -167,6 +168,7 @@ protected GeneratorContext.GeneratorContextBuilder initGeneratorContextBuilder() .prePackagePhase(false) .useProjectClasspath(kubernetesExtension.getUseProjectClassPathOrDefault()) .sourceDirectory(kubernetesExtension.getBuildSourceDirectoryOrDefault()) + .openshiftNamespace(StringUtils.isNotBlank(kubernetesExtension.getNamespaceOrNull()) ? kubernetesExtension.getNamespaceOrNull() : clusterAccess.getNamespace()) .buildTimestamp(getBuildTimestamp(null, null, kubernetesExtension.javaProject.getBuildDirectory().getAbsolutePath(), DOCKER_BUILD_TIMESTAMP)) .filter(kubernetesExtension.getFilterOrNull()); diff --git a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTask.java b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTask.java index 2628d443c0..5b13d173df 100644 --- a/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTask.java +++ b/gradle-plugin/openshift/src/main/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTask.java @@ -13,17 +13,9 @@ */ package org.eclipse.jkube.gradle.plugin.task; -import java.util.List; -import java.util.Optional; -import java.util.Properties; - import javax.inject.Inject; import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; -import org.eclipse.jkube.kit.config.image.ImageConfiguration; -import org.eclipse.jkube.kit.config.resource.RuntimeMode; - -import static org.eclipse.jkube.kit.build.api.helper.ImageNameFormatter.DOCKER_IMAGE_USER; public class OpenShiftResourceTask extends KubernetesResourceTask implements OpenShiftJKubeTask { @@ -33,19 +25,4 @@ public OpenShiftResourceTask(Class extensionClass) setDescription( "Generates or copies the OpenShift JSON file and attaches it to the build so its installed and released to maven repositories like other build artifacts."); } - - @Override - public List resolveImages() { - RuntimeMode runtimeMode = kubernetesExtension.getRuntimeMode(); - final Properties properties = kubernetesExtension.javaProject.getProperties(); - if (!properties.contains(DOCKER_IMAGE_USER)) { - String namespaceToBeUsed = Optional.ofNullable(kubernetesExtension.getNamespaceOrNull()).orElse(clusterAccess.getNamespace()); - kitLogger.info("Using container image name of namespace: " + namespaceToBeUsed); - properties.setProperty(DOCKER_IMAGE_USER, namespaceToBeUsed); - } - if (!properties.contains(RuntimeMode.JKUBE_EFFECTIVE_PLATFORM_MODE)) { - properties.setProperty(RuntimeMode.JKUBE_EFFECTIVE_PLATFORM_MODE, runtimeMode.toString()); - } - return super.resolveImages(); - } } diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTaskTest.java index 891dcedefb..822a0e96f1 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTaskTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftResourceTaskTest.java @@ -14,23 +14,15 @@ package org.eclipse.jkube.gradle.plugin.task; import java.nio.file.Paths; -import java.util.Collections; import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; import org.eclipse.jkube.gradle.plugin.TestOpenShiftExtension; -import org.eclipse.jkube.kit.common.util.KubernetesHelper; -import org.eclipse.jkube.kit.config.image.ImageConfiguration; -import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; -import io.fabric8.kubernetes.api.model.HasMetadata; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; -import org.mockito.MockedStatic; -import org.mockito.Mockito; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.when; class OpenShiftResourceTaskTest { @@ -38,11 +30,9 @@ class OpenShiftResourceTaskTest { @RegisterExtension private final TaskEnvironmentExtension taskEnvironment = new TaskEnvironmentExtension(); - private OpenShiftExtension extension; - @BeforeEach void setUp() { - extension = new TestOpenShiftExtension(); + OpenShiftExtension extension = new TestOpenShiftExtension(); when(taskEnvironment.project.getExtensions().getByType(OpenShiftExtension.class)).thenReturn(extension); when(taskEnvironment.project.getGroup()).thenReturn("org.eclipse.jkube.testing"); when(taskEnvironment.project.getName()).thenReturn("test-project"); @@ -62,30 +52,4 @@ void runTask_withImageConfiguration_shouldGenerateResources() { "apiVersion: v1\n" + "kind: List\n"); } - - @Test - void runTask_resolvesGroupInImageNameToNamespaceSetViaConfiguration_whenNoNamespaceDetected() { - try (MockedStatic kubernetesHelper = Mockito.mockStatic(KubernetesHelper.class)) { - // Given - kubernetesHelper.when(KubernetesHelper::getDefaultNamespace).thenReturn("test-custom-namespace"); - kubernetesHelper.when(() -> KubernetesHelper.getKind(any())).thenReturn("DeploymentConfig"); - kubernetesHelper.when(() -> KubernetesHelper.getName((HasMetadata) any())).thenReturn("test-project"); - ImageConfiguration imageConfiguration = ImageConfiguration.builder() - .name("%g/%a") - .build(BuildConfiguration.builder() - .from("test-base-image:latest") - .build()) - .build(); - extension.images = Collections.singletonList(imageConfiguration); - OpenShiftResourceTask resourceTask = new OpenShiftResourceTask(OpenShiftExtension.class); - - // When - resourceTask.runTask(); - - // Then - assertThat(resourceTask.resolvedImages) - .singleElement() - .hasFieldOrPropertyWithValue("name", "test-custom-namespace/test-project"); - } - } } diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java index 8da9fe6d60..7937a95483 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/DefaultGeneratorManager.java @@ -17,6 +17,7 @@ import java.util.Arrays; import java.util.HashSet; import java.util.List; +import java.util.Properties; import java.util.Set; import java.util.stream.Collectors; @@ -30,6 +31,9 @@ import org.eclipse.jkube.kit.config.image.GeneratorManager; import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; +import org.eclipse.jkube.kit.config.resource.RuntimeMode; + +import static org.eclipse.jkube.kit.build.api.helper.ImageNameFormatter.DOCKER_IMAGE_USER; /** * Manager responsible for finding and calling generators @@ -48,6 +52,7 @@ public class DefaultGeneratorManager implements GeneratorManager { public DefaultGeneratorManager(GeneratorContext context) { this.genCtx = context; propertyConfigResolver = new PropertyConfigResolver(); + addOpenShiftBuildRelatedProperties(); } @Override @@ -117,6 +122,21 @@ private List filterImages(List imagesToF return filteredImages; } + // TODO: Should be moved to a more suitable place (Probably within the JavaProject class) + private void addOpenShiftBuildRelatedProperties() { + if (genCtx.getRuntimeMode() == RuntimeMode.OPENSHIFT) { + final Properties properties = genCtx.getProject().getProperties(); + final String namespaceToBeUsed = genCtx.getOpenshiftNamespace(); + if (!properties.contains(DOCKER_IMAGE_USER) && StringUtils.isNotBlank(namespaceToBeUsed)) { + genCtx.getLogger().info("Using container image name of namespace: " + namespaceToBeUsed); + properties.setProperty(DOCKER_IMAGE_USER, namespaceToBeUsed); + } + if (!properties.contains(RuntimeMode.JKUBE_EFFECTIVE_PLATFORM_MODE)) { + properties.setProperty(RuntimeMode.JKUBE_EFFECTIVE_PLATFORM_MODE, genCtx.getRuntimeMode().toString()); + } + } + } + private boolean matchesConfiguredImages(String imageList, ImageConfiguration imageConfig) { if (imageList == null) { return true; diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorContext.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorContext.java index f7890eabd0..ff368dbab3 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorContext.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/GeneratorContext.java @@ -57,6 +57,7 @@ public class GeneratorContext { private String openshiftPullSecret; private String openshiftPushSecret; private String openshiftBuildOutputKind; + private String openshiftNamespace; private BuildRecreateMode openshiftBuildRecreate; diff --git a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java index a939048fca..7559158da1 100644 --- a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java +++ b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/DefaultGeneratorManagerTest.java @@ -29,6 +29,7 @@ import org.eclipse.jkube.kit.config.image.ImageConfiguration; import org.eclipse.jkube.kit.config.image.build.BuildConfiguration; import org.eclipse.jkube.kit.config.resource.ProcessorConfig; +import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -276,6 +277,23 @@ void whenProvidedViaBothPluginAndImageConfiguration_thenDoNotModifyConfiguration .hasFieldOrPropertyWithValue("openshiftBuildOutputKind", "ImageStreamTag-via-image-config") .hasFieldOrPropertyWithValue("openshiftBuildRecreateMode", BuildRecreateMode.buildConfig); } + + @Test + void whenOpenShiftRuntimeMode_thenShouldResolveGroupToNamespace() { + // Given + baseImageConfig = baseImageConfig.toBuilder().name("%g/%a").build(); + generatorContext = generatorContext.toBuilder() + .openshiftNamespace("test-custom-namespace") + .runtimeMode(RuntimeMode.OPENSHIFT) + .build(); + // When + final List result = new DefaultGeneratorManager(generatorContext) + .generateAndMerge(Collections.singletonList(baseImageConfig)); + // Then + assertThat(result) + .singleElement() + .hasFieldOrPropertyWithValue("name", "test-custom-namespace/test-java-project"); + } } @Nested diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java index 116cb4656d..9b174e97cd 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/ResourceMojo.java @@ -17,10 +17,10 @@ import java.io.IOException; import java.util.Collections; import java.util.List; -import java.util.Properties; import javax.validation.ConstraintViolationException; +import org.apache.commons.lang3.StringUtils; import org.eclipse.jkube.generator.api.GeneratorContext; import org.eclipse.jkube.generator.api.DefaultGeneratorManager; @@ -35,7 +35,6 @@ import org.eclipse.jkube.kit.config.resource.MappingConfig; import org.eclipse.jkube.kit.config.resource.PlatformMode; import org.eclipse.jkube.kit.config.resource.ProcessorConfig; -import org.eclipse.jkube.kit.config.resource.RuntimeMode; import org.eclipse.jkube.kit.enricher.api.DefaultEnricherManager; import org.eclipse.jkube.kit.enricher.api.JKubeEnricherContext; import org.eclipse.jkube.kit.profile.ProfileUtil; @@ -50,7 +49,6 @@ import org.apache.maven.plugins.annotations.ResolutionScope; import org.apache.maven.project.MavenProjectHelper; -import static org.eclipse.jkube.kit.build.api.helper.ImageNameFormatter.DOCKER_IMAGE_USER; import static org.eclipse.jkube.kit.common.util.BuildReferenceDateUtil.getBuildTimestamp; import static org.eclipse.jkube.kit.common.util.DekorateUtil.DEFAULT_RESOURCE_LOCATION; import static org.eclipse.jkube.kit.common.util.DekorateUtil.useDekorate; @@ -150,7 +148,6 @@ public void executeInternal() throws MojoExecutionException, MojoFailureExceptio updateKindFilenameMappings(mappings); try { - lateInit(); // Resolve the Docker image build configuration resolvedImages = getResolvedImages(images, log); if (!skip && (!isPomProject() || hasJKubeDir())) { @@ -202,23 +199,6 @@ private void validateIfRequired(File resourceDir, ResourceClassifier classifier) } } - private void lateInit() { - RuntimeMode runtimeMode = getRuntimeMode(); - jkubeServiceHub.setPlatformMode(runtimeMode); - if (runtimeMode.equals(RuntimeMode.OPENSHIFT)) { - Properties properties = javaProject.getProperties(); - if (!properties.contains(DOCKER_IMAGE_USER)) { - String namespaceToBeUsed = this.namespace != null && !this.namespace.isEmpty() ? - this.namespace: clusterAccess.getNamespace(); - log.info("Using docker image name of namespace: " + namespaceToBeUsed); - properties.setProperty(DOCKER_IMAGE_USER, namespaceToBeUsed); - } - if (!properties.contains(RuntimeMode.JKUBE_EFFECTIVE_PLATFORM_MODE)) { - properties.setProperty(RuntimeMode.JKUBE_EFFECTIVE_PLATFORM_MODE, runtimeMode.toString()); - } - } - } - private KubernetesList generateResources() throws IOException { log.verbose("Generating resources"); JKubeEnricherContext.JKubeEnricherContextBuilder ctxBuilder = JKubeEnricherContext.builder() @@ -252,6 +232,7 @@ private List getResolvedImages(List imag .useProjectClasspath(useProjectClasspath) .strategy(JKubeBuildStrategy.docker) .prePackagePhase(true) + .openshiftNamespace(StringUtils.isNotBlank(this.namespace) ? this.namespace: clusterAccess.getNamespace()) .buildTimestamp(getBuildTimestamp(getPluginContext(), CONTEXT_KEY_BUILD_TIMESTAMP, project.getBuild().getDirectory(), DOCKER_BUILD_TIMESTAMP)) .build()); return generatorManager.generateAndMerge(images);