Skip to content

Commit

Permalink
refactor (kubernetes-maven-plugin) : Remove Customizer interface refe…
Browse files Browse the repository at this point in the history
…rences from Mojos

+ Remove ConfigHelper.Customizer interface from AbstractDockerMojo,
  AbstractJKubeMojos; mojos would directly pass a
  UnaryOperator<List<ImageConfiguration>> for customize images operation
+ Add a helper class JKubeMojoUtils to keeping common methods between
  mojos

Signed-off-by: Rohan Kumar <rohaan@redhat.com>
  • Loading branch information
rohanKanojia committed Mar 8, 2024
1 parent 3b529bd commit 60edfc8
Show file tree
Hide file tree
Showing 8 changed files with 47 additions and 79 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
import java.util.Optional;

import io.fabric8.kubernetes.client.KubernetesClient;
import org.eclipse.jkube.generator.api.GeneratorContext;
import org.eclipse.jkube.generator.api.DefaultGeneratorManager;
import org.eclipse.jkube.generator.api.GeneratorContext;
import org.eclipse.jkube.gradle.plugin.GradleLogger;
import org.eclipse.jkube.gradle.plugin.GradleUtil;
import org.eclipse.jkube.gradle.plugin.KubernetesExtension;
Expand All @@ -35,7 +35,6 @@
import org.eclipse.jkube.kit.common.util.ResourceUtil;
import org.eclipse.jkube.kit.config.access.ClusterAccess;
import org.eclipse.jkube.kit.config.access.ClusterConfiguration;
import org.eclipse.jkube.kit.config.image.GeneratorManager;
import org.eclipse.jkube.kit.config.image.ImageConfiguration;
import org.eclipse.jkube.kit.config.resource.ResourceConfig;
import org.eclipse.jkube.kit.config.resource.ResourceServiceConfig;
Expand Down Expand Up @@ -117,11 +116,6 @@ public KubernetesExtension getExtension() {
return kubernetesExtension;
}

private List<ImageConfiguration> customizeConfig(List<ImageConfiguration> configs) {
GeneratorManager generatorManager = new DefaultGeneratorManager(initGeneratorContextBuilder().build());
return generatorManager.generate(configs, false);
}

private boolean isAnsiEnabled() {
return kubernetesExtension.getUseColorOrDefault()
&& getProject().getGradle().getStartParameter().getConsoleOutput() != ConsoleOutput.Plain;
Expand Down Expand Up @@ -197,7 +191,8 @@ protected List<ImageConfiguration> resolveImages(ImageConfigResolver imageConfig
DOCKER_BUILD_TIMESTAMP),
kubernetesExtension.images, imageConfigResolver, kitLogger,
kubernetesExtension.getFilter().getOrNull(),
this::customizeConfig,
new DefaultGeneratorManager(initGeneratorContextBuilder().build()),
false,
jKubeServiceHub.getConfiguration());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import org.eclipse.jkube.kit.build.api.config.handler.property.PropertyConfigHandler;
import org.eclipse.jkube.kit.build.api.config.handler.property.PropertyMode;
import org.eclipse.jkube.kit.common.JKubeConfiguration;
import org.eclipse.jkube.kit.config.image.GeneratorManager;
import org.eclipse.jkube.kit.config.image.ImageConfiguration;
import org.eclipse.jkube.kit.config.image.build.BuildConfiguration;
import org.eclipse.jkube.kit.common.JavaProject;
Expand Down Expand Up @@ -58,16 +59,18 @@ private ConfigHelper() {}
* @param images the original image config list (can be null)
* @param imageResolver the resolver used to extend on an image configuration
* @param imageNameFilter filter to select only certain image configurations with the given name
* @param imageCustomizer final customization hook for mangling the configuration
* @param generatorManager for applying generators on image configurations
* @param isPrePackagePhase whether no artifacts have been packaged in build output directory.
* @return a list of resolved and customized image configuration.
*/
private static List<ImageConfiguration> resolveImages(KitLogger logger,
List<ImageConfiguration> images,
Resolver imageResolver,
String imageNameFilter,
Customizer imageCustomizer) {
GeneratorManager generatorManager,
boolean isPrePackagePhase) {
List<ImageConfiguration> ret = resolveConfiguration(imageResolver, images);
ret = imageCustomizer.customizeConfig(ret);
ret = generatorManager.generate(ret, isPrePackagePhase);
final List<ImageConfiguration> filtered = filterImages(imageNameFilter,ret);
if (!ret.isEmpty() && filtered.isEmpty() && imageNameFilter != null) {
final List<String> imageNames = ret.stream().map(ImageConfiguration::getName).collect(Collectors.toList());
Expand Down Expand Up @@ -163,15 +166,16 @@ private static void verifyImageNames(List<ImageConfiguration> ret) {
}
}

public static List<ImageConfiguration> initImageConfiguration(Date buildTimeStamp, List<ImageConfiguration> unresolvedImages, ImageConfigResolver imageConfigResolver, KitLogger log, String filter, ConfigHelper.Customizer customizer, JKubeConfiguration jKubeConfiguration) {
public static List<ImageConfiguration> initImageConfiguration(Date buildTimeStamp, List<ImageConfiguration> unresolvedImages, ImageConfigResolver imageConfigResolver, KitLogger log, String filter, GeneratorManager generatorManager, boolean isPrePackagePhase, JKubeConfiguration jKubeConfiguration) {
final ImageNameFormatter imageNameFormatter = new ImageNameFormatter(jKubeConfiguration.getProject(), buildTimeStamp);
// Resolve images
final List<ImageConfiguration> resolvedImages = ConfigHelper.resolveImages(
log,
unresolvedImages,
(ImageConfiguration image) -> imageConfigResolver.resolve(image, jKubeConfiguration.getProject()),
filter, // A filter which image to process
customizer); // customizer (can be overwritten by a subclass)
generatorManager, // GeneratorManager which will invoke generators
isPrePackagePhase);

// Check for simple Dockerfile mode
ImageConfiguration dockerFileImageConfig = createImageConfigurationForSimpleDockerfile(resolvedImages, jKubeConfiguration, imageNameFormatter);
Expand Down Expand Up @@ -219,15 +223,6 @@ private static void printDockerfileInfoIfDockerfileMode(ImageConfiguration image
}
}

/**
* Allow subclasses to customize the given set of image configurations. This is called
* after resolving of images. a customizer is free to change the image configuration as he want.
* Use this with responsibility.
*/
public interface Customizer {
List<ImageConfiguration> customizeConfig(List<ImageConfiguration> configs);
}

/**
* A resolver can map one given image configuration to one or more image configurations
* This is e.g. used for resolving properties
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
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;
Expand Down Expand Up @@ -47,11 +48,13 @@ class ConfigHelperTest {
private ImageConfigResolver imageConfigResolver;
private JavaProject javaProject;
private JKubeConfiguration jKubeConfiguration;
private GeneratorManager generatorManager;

@BeforeEach
void setUp() {
logger = spy(new KitLogger.SilentLogger());
imageConfigResolver = mock(ImageConfigResolver.class, RETURNS_DEEP_STUBS);
generatorManager = mock(GeneratorManager.class);
javaProject = JavaProject.builder()
.groupId("org.eclipse.jkube")
.artifactId("test-java-project")
Expand All @@ -71,9 +74,10 @@ void initImageConfiguration_withSimpleImageConfiguration_shouldReturnImageConfig
List<ImageConfiguration> images = new ArrayList<>();
images.add(dummyImageConfiguration);
when(imageConfigResolver.resolve(dummyImageConfiguration, javaProject)).thenReturn(images);
when(generatorManager.generate(images, false)).thenReturn(images);

// When
List<ImageConfiguration> resolvedImages = ConfigHelper.initImageConfiguration(new Date(), images, imageConfigResolver, logger, null, configs -> configs, jKubeConfiguration);
List<ImageConfiguration> resolvedImages = ConfigHelper.initImageConfiguration(new Date(), images, imageConfigResolver, logger, null, generatorManager, false, jKubeConfiguration);

// Then
assertThat(resolvedImages).isNotNull()
Expand All @@ -92,7 +96,7 @@ void initImageConfiguration_withSimpleDockerFileInProjectBaseDir_shouldCreateIma
.build();

// When
List<ImageConfiguration> resolvedImages = ConfigHelper.initImageConfiguration(new Date(), images, imageConfigResolver, logger, null, configs -> configs, jKubeConfiguration);
List<ImageConfiguration> resolvedImages = ConfigHelper.initImageConfiguration(new Date(), images, imageConfigResolver, logger, null, generatorManager, false, jKubeConfiguration);

// Then
assertThat(resolvedImages).isNotNull()
Expand All @@ -116,9 +120,10 @@ void initImageConfiguration_withSimpleDockerFileModeEnabledAndImageConfiguration
.build())
.build();
when(imageConfigResolver.resolve(dummyImageConfiguration, jKubeConfiguration.getProject())).thenReturn(images);
when(generatorManager.generate(images, false)).thenReturn(images);

// When
List<ImageConfiguration> resolvedImages = ConfigHelper.initImageConfiguration(new Date(), images, imageConfigResolver, logger, null, configs -> configs, jKubeConfiguration);
List<ImageConfiguration> resolvedImages = ConfigHelper.initImageConfiguration(new Date(), images, imageConfigResolver, logger, null, generatorManager, false, jKubeConfiguration);

// Then
assertThat(resolvedImages).isNotNull()
Expand All @@ -139,7 +144,7 @@ void initImageConfiguration_whenImageConfigurationNameBlank_thenThrowException()

// When + Then
assertThatIllegalArgumentException()
.isThrownBy(() -> ConfigHelper.initImageConfiguration(new Date(), images, imageConfigResolver, logger, null, configs -> configs, jKubeConfiguration))
.isThrownBy(() -> ConfigHelper.initImageConfiguration(new Date(), images, imageConfigResolver, logger, null, generatorManager, false, jKubeConfiguration))
.withMessage("Configuration error: <image> must have a non-null <name>");
}

Expand All @@ -149,9 +154,10 @@ void initImageConfiguration_whenNoMatchForImageFilter_thenLogWarning() {
ImageConfiguration dummyImageConfiguration = createNewDummyImageConfiguration();
List<ImageConfiguration> images = Collections.singletonList(createNewDummyImageConfiguration());
when(imageConfigResolver.resolve(dummyImageConfiguration, javaProject)).thenReturn(images);
when(generatorManager.generate(images, false)).thenReturn(images);

// When
ConfigHelper.initImageConfiguration(new Date(), images, imageConfigResolver, logger, "i-dont-exist", configs -> configs, jKubeConfiguration);
ConfigHelper.initImageConfiguration(new Date(), images, imageConfigResolver, logger, "i-dont-exist", generatorManager, false, jKubeConfiguration);

// Then
verify(logger).warn("None of the resolved images [%s] match the configured filter '%s'", "foo/bar:latest", "i-dont-exist");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,9 @@
import java.util.Map;
import java.util.Optional;

import org.eclipse.jkube.generator.api.GeneratorContext;
import org.eclipse.jkube.generator.api.DefaultGeneratorManager;
import org.eclipse.jkube.generator.api.GeneratorContext;
import org.eclipse.jkube.kit.build.core.GavLabel;
import org.eclipse.jkube.kit.config.image.GeneratorManager;
import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy;
import org.eclipse.jkube.kit.common.JKubeConfiguration;
import org.eclipse.jkube.kit.build.service.docker.DockerAccessFactory;
Expand Down Expand Up @@ -88,7 +87,7 @@
import static org.eclipse.jkube.maven.plugin.mojo.build.AbstractJKubeMojo.DEFAULT_LOG_PREFIX;

public abstract class AbstractDockerMojo extends AbstractMojo
implements ConfigHelper.Customizer, Contextualizable, KitLoggerProvider {
implements Contextualizable, KitLoggerProvider {

public static final String CONTEXT_KEY_LOG_DISPATCHER = "CONTEXT_KEY_DOCKER_LOG_DISPATCHER";

Expand Down Expand Up @@ -409,7 +408,7 @@ protected void doExecute() throws MojoExecutionException {
.buildServiceConfig(buildServiceConfigBuilder().build())
.offline(offline)
.build();
resolvedImages = ConfigHelper.initImageConfiguration(getBuildTimestamp(getPluginContext(), CONTEXT_KEY_BUILD_TIMESTAMP, project.getBuild().getDirectory(), DOCKER_BUILD_TIMESTAMP), images, imageConfigResolver, log, filter, this, jkubeServiceHub.getConfiguration());
resolvedImages = ConfigHelper.initImageConfiguration(getBuildTimestamp(getPluginContext(), CONTEXT_KEY_BUILD_TIMESTAMP, project.getBuild().getDirectory(), DOCKER_BUILD_TIMESTAMP), images, imageConfigResolver, log, filter, new DefaultGeneratorManager(generatorContextBuilder().build()), false, jkubeServiceHub.getConfiguration());
executeInternal();
} catch (IOException | DependencyResolutionRequiredException exp) {
logException(exp);
Expand Down Expand Up @@ -565,22 +564,6 @@ protected BuildServiceConfig.BuildServiceConfigBuilder buildServiceConfigBuilder
});
}

/**
* Customization hook called by the base plugin.
*
* @param configs configuration to customize
* @return the configuration customized by our generators.
*/
public List<ImageConfiguration> customizeConfig(List<ImageConfiguration> configs) {
log.info("Building Docker image");
try {
GeneratorManager generatorManager = new DefaultGeneratorManager(generatorContextBuilder().build());
return generatorManager.generate(configs, false);
} catch (DependencyResolutionRequiredException de) {
throw new IllegalArgumentException("Instructed to use project classpath, but cannot. Continuing build if we can: ", de);
}
}

protected String getLogPrefix() {
return DEFAULT_LOG_PREFIX;
}
Expand All @@ -606,10 +589,10 @@ public EnricherContext getEnricherContext() throws DependencyResolutionRequiredE
}

// Get generator context
protected GeneratorContext.GeneratorContextBuilder generatorContextBuilder() throws DependencyResolutionRequiredException {
protected GeneratorContext.GeneratorContextBuilder generatorContextBuilder() {
return GeneratorContext.builder()
.config(ProfileUtil.blendProfileWithConfiguration(ProfileUtil.GENERATOR_CONFIG, profile, ResourceUtil.getFinalResourceDirs(resourceDir, environment), generator))
.project(MavenUtil.convertMavenProjectToJKubeProject(project, session))
.project(javaProject)
.logger(log)
.runtimeMode(runtimeMode)
.useProjectClasspath(useProjectClasspath);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import org.eclipse.jkube.kit.common.KitLogger;
import org.eclipse.jkube.kit.common.util.MavenUtil;
import org.eclipse.jkube.kit.common.util.ResourceClassifier;
import org.eclipse.jkube.kit.common.util.ResourceUtil;
import org.eclipse.jkube.kit.common.util.validator.ResourceValidator;
import org.eclipse.jkube.kit.config.image.GeneratorManager;
import org.eclipse.jkube.kit.config.image.ImageConfiguration;
Expand Down Expand Up @@ -254,36 +255,26 @@ private ProcessorConfig extractEnricherConfig() throws IOException {
jkubeServiceHub.getResourceServiceConfig().getResourceDirs(), enricher);
}

private ProcessorConfig extractGeneratorConfig() throws IOException {
return ProfileUtil.blendProfileWithConfiguration(ProfileUtil.GENERATOR_CONFIG, profile,
jkubeServiceHub.getResourceServiceConfig().getResourceDirs(), generator);
}

// ==================================================================================

private List<ImageConfiguration> getResolvedImages(List<ImageConfiguration> images, final KitLogger log)
throws IOException {
GeneratorManager generatorManager = new DefaultGeneratorManager(GeneratorContext.builder()
.config(ProfileUtil.blendProfileWithConfiguration(ProfileUtil.GENERATOR_CONFIG, profile, ResourceUtil.getFinalResourceDirs(resourceDir, environment), generator))
.project(javaProject)
.logger(log)
.runtimeMode(getRuntimeMode())
.useProjectClasspath(useProjectClasspath)
.strategy(JKubeBuildStrategy.docker)
.build());
return ConfigHelper.initImageConfiguration(
getBuildTimestamp(getPluginContext(), CONTEXT_KEY_BUILD_TIMESTAMP, project.getBuild().getDirectory(),
DOCKER_BUILD_TIMESTAMP),
images, imageConfigResolver,
log,
null, // no filter on image name yet (TODO: Maybe add this, too ?)
configs -> {
try {
GeneratorManager generatorManager = new DefaultGeneratorManager(GeneratorContext.builder()
.config(extractGeneratorConfig())
.project(javaProject)
.runtimeMode(getRuntimeMode())
.logger(log)
.strategy(JKubeBuildStrategy.docker)
.useProjectClasspath(useProjectClasspath)
.build());
return generatorManager.generate(configs, true);
} catch (Exception e) {
throw new IllegalArgumentException("Cannot extract generator: " + e, e);
}
},
generatorManager,
true,
jkubeServiceHub.getConfiguration());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,10 +130,10 @@ private WatcherContext getWatcherContext() throws MojoExecutionException {
}

@Override
protected GeneratorContext.GeneratorContextBuilder generatorContextBuilder() throws DependencyResolutionRequiredException {
protected GeneratorContext.GeneratorContextBuilder generatorContextBuilder() {
return GeneratorContext.builder()
.config(ProfileUtil.blendProfileWithConfiguration(ProfileUtil.GENERATOR_CONFIG, profile, ResourceUtil.getFinalResourceDirs(resourceDir, environment), generator))
.project(MavenUtil.convertMavenProjectToJKubeProject(project, session))
.project(javaProject)
.logger(log)
.runtimeMode(getConfiguredRuntimeMode())
.useProjectClasspath(useProjectClasspath)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,17 @@
*/
package org.eclipse.jkube.maven.plugin.mojo.build;

import org.apache.maven.artifact.DependencyResolutionRequiredException;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.eclipse.jkube.generator.api.GeneratorContext;
import org.eclipse.jkube.kit.config.image.ImageConfiguration;
import org.eclipse.jkube.kit.config.image.build.JKubeBuildStrategy;
import org.eclipse.jkube.kit.config.resource.RuntimeMode;
import org.eclipse.jkube.kit.config.service.BuildServiceConfig;
import org.eclipse.jkube.maven.plugin.mojo.OpenShift;

import java.util.List;

import static org.eclipse.jkube.kit.config.resource.RuntimeMode.KUBERNETES;

/**
Expand Down Expand Up @@ -83,11 +80,12 @@ public RuntimeMode getConfiguredRuntimeMode() {
return RuntimeMode.OPENSHIFT;
}

public List<ImageConfiguration> customizeConfig(List<ImageConfiguration> configs) {
@Override
protected void doExecute() throws MojoExecutionException {
if (runtimeMode == RuntimeMode.OPENSHIFT) {
log.info("Using [[B]]OpenShift[[B]] build with strategy [[B]]%s[[B]]", getJKubeBuildStrategy().getLabel());
}
return super.customizeConfig(configs);
super.doExecute();
}

@Override
Expand All @@ -101,7 +99,7 @@ protected BuildServiceConfig.BuildServiceConfigBuilder buildServiceConfigBuilder
}

@Override
protected GeneratorContext.GeneratorContextBuilder generatorContextBuilder() throws DependencyResolutionRequiredException {
protected GeneratorContext.GeneratorContextBuilder generatorContextBuilder() {
return super.generatorContextBuilder()
.strategy(getJKubeBuildStrategy());
}
Expand Down
Loading

0 comments on commit 60edfc8

Please sign in to comment.