Skip to content

Commit

Permalink
refactor(jkube-kit): Move logic for adding OpenShift Build specific p…
Browse files Browse the repository at this point in the history
…roperties to DefaultGeneratorManager (3037)

refactor (jkube-kit) : Move logic for adding OpenShift Build specific properties to DefaultGeneratorManager

In Resource mojo and tasks, we've duplicated code that adds the
following properties to JavaProject in case of OpenShift mode:
- `jkube.image.user` : Sets image user property to currently logged in
  OpenShift namespace so that image user portion points to namespace
- `jkube.internal.effective.platform.mode` : Used by some enrichers to
  determine whether current platform is OpenShift. This looks like a
  remnant of Fabric8 Maven Plugin refactor. We should get rid of this in
  follow up PR.

This PR only moves code from Mojos/Tasks -> DefaultGeneratorManager.generateAndMerge()

Signed-off-by: Rohan Kumar <rohaan@redhat.com>
---
review: openshift-specific properties refactor

Signed-off-by: Marc Nuri <marc@marcnuri.com>
  • Loading branch information
rohanKanojia authored May 14, 2024
1 parent 6c7f976 commit 6be0c39
Show file tree
Hide file tree
Showing 7 changed files with 44 additions and 81 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {

Expand All @@ -33,19 +25,4 @@ public OpenShiftResourceTask(Class<? extends OpenShiftExtension> 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<ImageConfiguration> 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();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,35 +14,25 @@
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 {

@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");
Expand All @@ -62,30 +52,4 @@ void runTask_withImageConfiguration_shouldGenerateResources() {
"apiVersion: v1\n" +
"kind: List\n");
}

@Test
void runTask_resolvesGroupInImageNameToNamespaceSetViaConfiguration_whenNoNamespaceDetected() {
try (MockedStatic<KubernetesHelper> 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");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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
Expand All @@ -48,6 +52,7 @@ public class DefaultGeneratorManager implements GeneratorManager {
public DefaultGeneratorManager(GeneratorContext context) {
this.genCtx = context;
propertyConfigResolver = new PropertyConfigResolver();
addOpenShiftBuildRelatedProperties();
}

@Override
Expand Down Expand Up @@ -117,6 +122,21 @@ private List<ImageConfiguration> filterImages(List<ImageConfiguration> 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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ public class GeneratorContext {
private String openshiftPullSecret;
private String openshiftPushSecret;
private String openshiftBuildOutputKind;
private String openshiftNamespace;
private BuildRecreateMode openshiftBuildRecreate;


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<ImageConfiguration> result = new DefaultGeneratorManager(generatorContext)
.generateAndMerge(Collections.singletonList(baseImageConfig));
// Then
assertThat(result)
.singleElement()
.hasFieldOrPropertyWithValue("name", "test-custom-namespace/test-java-project");
}
}

@Nested
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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())) {
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -252,6 +232,7 @@ private List<ImageConfiguration> getResolvedImages(List<ImageConfiguration> 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);
Expand Down

0 comments on commit 6be0c39

Please sign in to comment.