From 53a4429f13afacdca7d86eb90612685895ae4203 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Tue, 26 Apr 2022 22:31:58 +0530 Subject: [PATCH] fix (jkube-kit) : Generate yaml files for different environments (#1218 Signed-off-by: Rohan Kumar --- .../gradle/plugin/task/AbstractJKubeTask.java | 6 +- .../plugin/task/KubernetesResourceTask.java | 2 +- .../plugin/task/KubernetesUndeployTask.java | 6 +- .../plugin/task/KubernetesWatchTask.java | 2 +- .../task/KubernetesUndeployTaskTest.java | 5 +- .../task/OpenShiftUndeployTaskTest.java | 5 +- .../jkube/kit/common/util/ResourceUtil.java | 15 +++-- .../resource/ResourceServiceConfig.java | 3 +- .../kit/config/service/UndeployService.java | 3 +- .../kubernetes/KubernetesUndeployService.java | 2 +- .../jkube/kit/profile/ProfileUtil.java | 62 ++++++++++++++----- .../jkube/kit/profile/ProfileUtilTest.java | 16 ++--- .../service/DefaultResourceService.java | 44 ++++++++----- .../service/DefaultResourceServiceTest.java | 3 +- .../plugin/mojo/build/AbstractDockerMojo.java | 4 +- .../maven/plugin/mojo/build/ResourceMojo.java | 12 ++-- .../plugin/mojo/develop/UndeployMojo.java | 4 +- .../maven/plugin/mojo/develop/WatchMojo.java | 2 +- .../plugin/mojo/develop/UndeployMojoTest.java | 3 +- 19 files changed, 126 insertions(+), 73 deletions(-) diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/AbstractJKubeTask.java index 259fff032c..fcbb7efd93 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 @@ -161,15 +161,15 @@ protected ClusterConfiguration initClusterConfiguration() { System.getProperties(), kubernetesExtension.javaProject.getProperties()).build(); } - protected final File resolveResourceSourceDirectory() { - return ResourceUtil.getFinalResourceDir(kubernetesExtension.getResourceSourceDirectoryOrDefault(), + protected final List resolveResourceSourceDirectory() { + return ResourceUtil.getFinalResourceDirs(kubernetesExtension.getResourceSourceDirectoryOrDefault(), kubernetesExtension.getResourceEnvironmentOrNull()); } protected ProcessorConfig extractGeneratorConfig() { try { - return ProfileUtil.blendProfileWithConfiguration(ProfileUtil.GENERATOR_CONFIG, kubernetesExtension.getProfileOrNull(), kubernetesExtension.getResourceTargetDirectoryOrDefault(), kubernetesExtension.generator); + return ProfileUtil.blendProfileWithConfiguration(ProfileUtil.GENERATOR_CONFIG, kubernetesExtension.getProfileOrNull(), ResourceUtil.getFinalResourceDirs(kubernetesExtension.getResourceSourceDirectoryOrDefault(), kubernetesExtension.getResourceEnvironmentOrNull()), kubernetesExtension.generator); } catch (IOException e) { throw new IllegalArgumentException("Cannot extract generator config: " + e, e); } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesResourceTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesResourceTask.java index e28d38fa55..8b9e8dcc13 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesResourceTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesResourceTask.java @@ -56,7 +56,7 @@ protected JKubeServiceHub.JKubeServiceHubBuilder initJKubeServiceHubBuilder() { } final ResourceServiceConfig resourceServiceConfig = ResourceServiceConfig.builder() .project(kubernetesExtension.javaProject) - .resourceDir(resolveResourceSourceDirectory()) + .resourceDirs(resolveResourceSourceDirectory()) .targetDir(kubernetesExtension.getResourceTargetDirectoryOrDefault()) .resourceFileType(kubernetesExtension.getResourceFileTypeOrDefault()) .resourceConfig(resourceConfig) diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTask.java index 9f701bcfb6..c80e5077c5 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTask.java @@ -14,7 +14,6 @@ package org.eclipse.jkube.gradle.plugin.task; import org.eclipse.jkube.gradle.plugin.KubernetesExtension; -import org.eclipse.jkube.kit.common.util.ResourceUtil; import org.eclipse.jkube.kit.config.resource.ResourceConfig; import javax.inject.Inject; @@ -41,10 +40,9 @@ public void run() { .filter(s -> !s.isEmpty()) .orElse(null)) .build(); - final File environmentResourceDir = ResourceUtil.getFinalResourceDir(resolveResourceSourceDirectory(), - kubernetesExtension.getResourceEnvironmentOrNull()); + final List environmentResourceDirs = resolveResourceSourceDirectory(); jKubeServiceHub.getUndeployService() - .undeploy(environmentResourceDir, resources, findManifestsToUndeploy().toArray(new File[0])); + .undeploy(environmentResourceDirs, resources, findManifestsToUndeploy().toArray(new File[0])); } catch (IOException e) { throw new IllegalStateException(e.getMessage(), e); } diff --git a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java index 4625c1c33f..15346b4163 100644 --- a/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java +++ b/gradle-plugin/kubernetes/src/main/java/org/eclipse/jkube/gradle/plugin/task/KubernetesWatchTask.java @@ -91,7 +91,7 @@ private WatcherContext createWatcherContext() throws IOException { private ProcessorConfig extractWatcherConfig() { try { - return ProfileUtil.blendProfileWithConfiguration(ProfileUtil.WATCHER_CONFIG, kubernetesExtension.getProfileOrNull(), ResourceUtil.getFinalResourceDir(kubernetesExtension.getResourceSourceDirectoryOrDefault(), kubernetesExtension.getResourceEnvironmentOrNull()), kubernetesExtension.watcher); + return ProfileUtil.blendProfileWithConfiguration(ProfileUtil.WATCHER_CONFIG, kubernetesExtension.getProfileOrNull(), ResourceUtil.getFinalResourceDirs(kubernetesExtension.getResourceSourceDirectoryOrDefault(), kubernetesExtension.getResourceEnvironmentOrNull()), kubernetesExtension.watcher); } catch (IOException e) { throw new IllegalArgumentException("Cannot extract watcher config: " + e, e); } diff --git a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTaskTest.java b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTaskTest.java index 4cfb7763bf..971b0d22f8 100644 --- a/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTaskTest.java +++ b/gradle-plugin/kubernetes/src/test/java/org/eclipse/jkube/gradle/plugin/task/KubernetesUndeployTaskTest.java @@ -16,6 +16,7 @@ import java.io.IOException; import java.net.URL; import java.nio.file.Paths; +import java.util.Collections; import org.eclipse.jkube.gradle.plugin.KubernetesExtension; import org.eclipse.jkube.gradle.plugin.TestKubernetesExtension; @@ -91,8 +92,8 @@ public void runTask_withOfflineTrue_shouldUndeployResources() throws IOException assertThat(kubernetesUndeployServiceMockedConstruction.constructed()).hasSize(1); verify(kubernetesUndeployServiceMockedConstruction.constructed().iterator().next(), times(1)) .undeploy( - taskEnvironment.getRoot().toPath().resolve(Paths.get("src", "main", "jkube")) - .toFile(), + Collections.singletonList(taskEnvironment.getRoot().toPath().resolve(Paths.get("src", "main", "jkube")) + .toFile()), ResourceConfig.builder().build(), taskEnvironment.getRoot().toPath() .resolve(Paths.get("build", "classes", "java", "main", "META-INF", "jkube", "kubernetes.yml")).toFile() ); diff --git a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftUndeployTaskTest.java b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftUndeployTaskTest.java index d644e30a89..226f2cffdb 100644 --- a/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftUndeployTaskTest.java +++ b/gradle-plugin/openshift/src/test/java/org/eclipse/jkube/gradle/plugin/task/OpenShiftUndeployTaskTest.java @@ -15,6 +15,7 @@ import java.io.IOException; import java.nio.file.Paths; +import java.util.Collections; import org.eclipse.jkube.gradle.plugin.OpenShiftExtension; import org.eclipse.jkube.gradle.plugin.TestOpenShiftExtension; @@ -91,8 +92,8 @@ public void runTask_withOfflineTrue_shouldUndeployResources() throws IOException assertThat(openshiftUndeployServiceMockedConstruction.constructed()).hasSize(1); verify(openshiftUndeployServiceMockedConstruction.constructed().iterator().next(), times(1)) .undeploy( - taskEnvironment.getRoot().toPath().resolve(Paths.get("src", "main", "jkube")) - .toFile(), + Collections.singletonList(taskEnvironment.getRoot().toPath().resolve(Paths.get("src", "main", "jkube")) + .toFile()), ResourceConfig.builder().build(), taskEnvironment.getRoot().toPath() .resolve(Paths.get("build", "classes", "java", "main", "META-INF", "jkube", "openshift.yml")).toFile(), taskEnvironment.getRoot().toPath().resolve(Paths.get("build", "test-project-is.yml")).toFile() diff --git a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/ResourceUtil.java b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/ResourceUtil.java index 38ee1f6def..fe0163106d 100644 --- a/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/ResourceUtil.java +++ b/jkube-kit/common/src/main/java/org/eclipse/jkube/kit/common/util/ResourceUtil.java @@ -134,11 +134,18 @@ private static ObjectMapper getObjectMapper(ResourceFileType resourceFileType) { .disable(SerializationFeature.WRITE_NULL_MAP_VALUES); } - public static File getFinalResourceDir(File resourceDir, String environment) { - if (resourceDir != null && StringUtils.isNotEmpty(environment)) { - return new File(resourceDir, environment); + public static List getFinalResourceDirs(File resourceDir, String environmentAsCommaSeparateStr) { + List resourceDirs = new ArrayList<>(); + + if (resourceDir != null && StringUtils.isNotEmpty(environmentAsCommaSeparateStr)) { + String[] environments = environmentAsCommaSeparateStr.split(","); + for (String environment : environments) { + resourceDirs.add(new File(resourceDir, environment.trim())); + } + } else if (StringUtils.isEmpty(environmentAsCommaSeparateStr)) { + resourceDirs.add(resourceDir); } - return resourceDir; + return resourceDirs; } diff --git a/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/ResourceServiceConfig.java b/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/ResourceServiceConfig.java index ba33c87375..75c7b49d10 100644 --- a/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/ResourceServiceConfig.java +++ b/jkube-kit/config/resource/src/main/java/org/eclipse/jkube/kit/config/resource/ResourceServiceConfig.java @@ -14,6 +14,7 @@ package org.eclipse.jkube.kit.config.resource; import java.io.File; +import java.util.List; import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.ResourceFileType; @@ -35,7 +36,7 @@ public class ResourceServiceConfig { private JavaProject project; - private File resourceDir; + private List resourceDirs; private File targetDir; private ResourceFileType resourceFileType; private ResourceConfig resourceConfig; diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/UndeployService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/UndeployService.java index 6a383f1e66..ef3ecfa388 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/UndeployService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/UndeployService.java @@ -17,8 +17,9 @@ import java.io.File; import java.io.IOException; +import java.util.List; public interface UndeployService { - void undeploy(File resourceDir, ResourceConfig resourceConfig, File... manifestFiles) throws IOException; + void undeploy(List resourceDir, ResourceConfig resourceConfig, File... manifestFiles) throws IOException; } diff --git a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployService.java b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployService.java index b0487adf60..5db4ed8f85 100644 --- a/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployService.java +++ b/jkube-kit/config/service/src/main/java/org/eclipse/jkube/kit/config/service/kubernetes/KubernetesUndeployService.java @@ -50,7 +50,7 @@ public KubernetesUndeployService(JKubeServiceHub jKubeServiceHub, KitLogger logg } @Override - public void undeploy(File resourceDir, ResourceConfig resourceConfig, File... manifestFiles) throws IOException { + public void undeploy(List resourceDirs, ResourceConfig resourceConfig, File... manifestFiles) throws IOException { final String fallbackNamespace = KubernetesClientUtil.resolveFallbackNamespace(resourceConfig, jKubeServiceHub.getClusterAccess()); final List manifests = Stream.of(manifestFiles) .filter(Objects::nonNull).filter(File::exists).filter(File::isFile) diff --git a/jkube-kit/profile/src/main/java/org/eclipse/jkube/kit/profile/ProfileUtil.java b/jkube-kit/profile/src/main/java/org/eclipse/jkube/kit/profile/ProfileUtil.java index 08e379af9a..a3febd2cf6 100644 --- a/jkube-kit/profile/src/main/java/org/eclipse/jkube/kit/profile/ProfileUtil.java +++ b/jkube-kit/profile/src/main/java/org/eclipse/jkube/kit/profile/ProfileUtil.java @@ -52,31 +52,51 @@ private ProfileUtil() {} * Find a profile. Profiles are looked up at various locations: * *
    - *
  • A given directory with the name profiles.yml (and variations, {@link #findProfile(String, File)}
  • + *
  • A given directory with the name profiles.yml (and variations, {@link #findProfile(String, List)}
  • *
* @param profileArg the profile's name - * @param resourceDir a directory to check for profiles. + * @param resourceDirs a directory to check for profiles. * @return the profile found or the default profile if none of this name is given * @throws IOException */ + public static Profile findProfile(String profileArg, List resourceDirs) throws IOException { + if (resourceDirs != null) { + for (File resourceDir : resourceDirs) { + Profile profile = findProfile(profileArg, resourceDir); + if (profile != null) { + return profile; + } + } + } + String profile = profileArg == null ? DEFAULT_PROFILE : profileArg; + Profile defaultLookupProfile = lookup(profile, null); + defaultLookupProfile = checkParentProfileAndInherit(defaultLookupProfile, null); + if (defaultLookupProfile != null) { + return defaultLookupProfile; + } + + throw new IllegalArgumentException("No profile '" + profile + "' defined"); + } + public static Profile findProfile(String profileArg, File resourceDir) throws IOException { try { String profile = profileArg == null ? DEFAULT_PROFILE : profileArg; Profile profileFound = lookup(profile, resourceDir); - if (profileFound != null) { - if(profileFound.getParentProfile() != null) { - profileFound = inheritFromParentProfile(profileFound, resourceDir); - log.info(profileFound + " inheriting resources from " + profileFound.getParentProfile()); - } - return profileFound; - } else { - throw new IllegalArgumentException("No profile '" + profile + "' defined"); - } + profileFound = checkParentProfileAndInherit(profileFound, resourceDir); + return profileFound; } catch (IOException e) { throw new IOException("Error while looking up profile " + profileArg + ": " + e.getMessage(),e); } } + private static Profile checkParentProfileAndInherit(Profile profile, File resourceDir) throws IOException { + if (profile != null && profile.getParentProfile() != null) { + profile = inheritFromParentProfile(profile, resourceDir); + log.info("%s inheriting resources from %s", profile, profile.getParentProfile()); + } + return profile; + } + private static Profile inheritFromParentProfile(Profile aProfile, File resourceDir) throws IOException { Profile aParentProfile = lookup(aProfile.getParentProfile(), resourceDir); if(aParentProfile != null) { @@ -94,17 +114,17 @@ private static Profile inheritFromParentProfile(Profile aProfile, File resourceD * * @param configExtractor how to extract the config from a profile when found * @param profile the profile name (can be null, then no profile is used) - * @param resourceDir resource directory where to lookup the profile (in addition to a classpath lookup) + * @param resourceDirs resource directory where to lookup the profile (in addition to a classpath lookup) * @return the merged configuration which can be empty if no profile is given * @param config the provided configuration * @throws IOException */ public static ProcessorConfig blendProfileWithConfiguration(ProcessorConfigurationExtractor configExtractor, String profile, - File resourceDir, + List resourceDirs, ProcessorConfig config) throws IOException { // Get specified profile or the default profile - ProcessorConfig profileConfig = extractProcesssorConfiguration(configExtractor, profile, resourceDir); + ProcessorConfig profileConfig = extractProcesssorConfiguration(configExtractor, profile, resourceDirs); return ProcessorConfig.mergeProcessorConfigs(config, profileConfig); } @@ -140,8 +160,8 @@ public static Profile lookup(String name, File directory) throws IOException { private static ProcessorConfig extractProcesssorConfiguration(ProcessorConfigurationExtractor extractor, String profile, - File resourceDir) throws IOException { - Profile profileFound = findProfile(profile, resourceDir); + List resourceDirs) throws IOException { + Profile profileFound = findProfile(profile, resourceDirs); return extractor.extract(profileFound); } @@ -193,6 +213,16 @@ public static List readAllFromClasspath(String name, String ext) throws // ================================================================================ + private static File findProfileYaml(List directories) { + for (File directory : directories) { + File ret = findProfileYaml(directory); + if (ret != null && ret.exists()) { + return ret; + } + } + return null; + } + // check for various variations of profile files private static File findProfileYaml(File directory) { for (String profileFile : PROFILE_FILENAMES) { diff --git a/jkube-kit/profile/src/test/java/org/eclipse/jkube/kit/profile/ProfileUtilTest.java b/jkube-kit/profile/src/test/java/org/eclipse/jkube/kit/profile/ProfileUtilTest.java index 76d772ac73..859600d548 100644 --- a/jkube-kit/profile/src/test/java/org/eclipse/jkube/kit/profile/ProfileUtilTest.java +++ b/jkube-kit/profile/src/test/java/org/eclipse/jkube/kit/profile/ProfileUtilTest.java @@ -95,9 +95,9 @@ public void findProfile_whenValidProfileArg_returnsValidProfile() throws URISynt @Test public void findProfile_whenNonExistentProfileArg_throwsException () throws URISyntaxException { - File profileDir = getProfileDir(); + List profileDirs = Collections.singletonList(getProfileDir()); - IllegalArgumentException illegalArgumentException = assertThrows(IllegalArgumentException.class, () -> ProfileUtil.findProfile("not-there", profileDir)); + IllegalArgumentException illegalArgumentException = assertThrows(IllegalArgumentException.class, () -> ProfileUtil.findProfile("not-there", profileDirs)); assertTrue(illegalArgumentException.getMessage().contains("not-there")); @@ -115,18 +115,18 @@ public void blendProfiles() throws Exception { ProcessorConfig origConfig = new ProcessorConfig(Arrays.asList("i1", "i2"), Collections.singleton("spring.swarm"), null); ProcessorConfig mergeConfig = ProfileUtil.blendProfileWithConfiguration(ProfileUtil.ENRICHER_CONFIG, - "simple", - getProfileDir(), - origConfig); + "simple", + Collections.singletonList(getProfileDir()), + origConfig); assertTrue(mergeConfig.use("base")); assertTrue(mergeConfig.use("i1")); assertEquals("http://jolokia.org", mergeConfig.getConfig().get("base").get("url")); mergeConfig = ProfileUtil.blendProfileWithConfiguration(ProfileUtil.GENERATOR_CONFIG, - "simple", - getProfileDir(), - origConfig); + "simple", + Collections.singletonList(getProfileDir()), + origConfig); assertTrue(mergeConfig.use("i2")); assertFalse(mergeConfig.use("spring.swarm")); diff --git a/jkube-kit/resource/service/src/main/java/org/eclipse/jkube/kit/resource/service/DefaultResourceService.java b/jkube-kit/resource/service/src/main/java/org/eclipse/jkube/kit/resource/service/DefaultResourceService.java index fc00d2f24c..072bf85817 100644 --- a/jkube-kit/resource/service/src/main/java/org/eclipse/jkube/kit/resource/service/DefaultResourceService.java +++ b/jkube-kit/resource/service/src/main/java/org/eclipse/jkube/kit/resource/service/DefaultResourceService.java @@ -16,6 +16,7 @@ import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import javax.validation.ConstraintViolationException; @@ -81,10 +82,8 @@ private KubernetesListBuilder generateAppResources(PlatformMode platformMode, En throws IOException { final ResourceConfig resourceConfig = resourceServiceConfig.getResourceConfig(); - final File resourceDir = resourceServiceConfig.getResourceDir(); try { - File[] resourceFiles = listResourceFragments(resourceDir, resourceConfig !=null ? resourceConfig.getRemotes() : null, log); - log.info("Using resource templates from %s", resourceDir); + File[] resourceFiles = aggregateResourceFragments(resourceServiceConfig.getResourceDirs(), resourceConfig, log); final File[] processedResource = processResourceFiles(resourceFiles); KubernetesListBuilder builder = processResourceFragments(platformMode, processedResource); @@ -115,19 +114,21 @@ private List generateProfiledResourcesFromSubdirectories( PlatformMode platformMode, EnricherManager enricherManager) throws IOException { final List ret = new ArrayList<>(); - final File resourceDir = resourceServiceConfig.getResourceDir(); - File[] profileDirs = resourceDir.listFiles(File::isDirectory); - if (profileDirs != null) { - for (File profileDir : profileDirs) { - Profile foundProfile = ProfileUtil.findProfile(profileDir.getName(), resourceDir); - ProcessorConfig enricherConfig = foundProfile.getEnricherConfig(); - File[] resourceFiles = listResourceFragments(profileDir); - final File[] processedResources = processResourceFiles(resourceFiles); - if (processedResources.length > 0) { - KubernetesListBuilder profileBuilder = readResourceFragments(platformMode, processedResources); - enricherManager.createDefaultResources(platformMode, enricherConfig, profileBuilder); - enricherManager.enrich(platformMode, enricherConfig, profileBuilder); - ret.addAll(profileBuilder.buildItems()); + final List resourceDirs = resourceServiceConfig.getResourceDirs(); + for (File resourceDir : resourceDirs) { + File[] profileDirs = resourceDir.listFiles(File::isDirectory); + if (profileDirs != null) { + for (File profileDir : profileDirs) { + Profile foundProfile = ProfileUtil.findProfile(profileDir.getName(), resourceDir); + ProcessorConfig enricherConfig = foundProfile.getEnricherConfig(); + File[] resourceFiles = listResourceFragments(profileDir); + final File[] processedResources = processResourceFiles(resourceFiles); + if (processedResources.length > 0) { + KubernetesListBuilder profileBuilder = readResourceFragments(platformMode, processedResources); + enricherManager.createDefaultResources(platformMode, enricherConfig, profileBuilder); + enricherManager.enrich(platformMode, enricherConfig, profileBuilder); + ret.addAll(profileBuilder.buildItems()); + } } } } @@ -149,5 +150,16 @@ private File[] processResourceFiles(File[] resourceFiles) throws IOException { return resourceFiles; } + private File[] aggregateResourceFragments(List resourceDirs, ResourceConfig resourceConfig, KitLogger log) { + List fragments = new ArrayList<>(); + for (File resourceDir : resourceDirs) { + log.info("Using resource templates from %s", resourceDir); + File[] resourceFiles = listResourceFragments(resourceDir, resourceConfig !=null ? resourceConfig.getRemotes() : null, log); + if (resourceFiles != null && resourceFiles.length > 0) { + fragments.addAll(Arrays.asList(resourceFiles)); + } + } + return fragments.toArray(new File[0]); + } } diff --git a/jkube-kit/resource/service/src/test/java/org/eclipse/jkube/kit/resource/service/DefaultResourceServiceTest.java b/jkube-kit/resource/service/src/test/java/org/eclipse/jkube/kit/resource/service/DefaultResourceServiceTest.java index 0609609019..33f8128db1 100644 --- a/jkube-kit/resource/service/src/test/java/org/eclipse/jkube/kit/resource/service/DefaultResourceServiceTest.java +++ b/jkube-kit/resource/service/src/test/java/org/eclipse/jkube/kit/resource/service/DefaultResourceServiceTest.java @@ -15,6 +15,7 @@ import java.io.File; import java.io.IOException; +import java.util.Collections; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.ResourceFileType; @@ -59,7 +60,7 @@ public void init() throws IOException { .interpolateTemplateParameters(true) .targetDir(targetDir) .resourceFileType(ResourceFileType.yaml) - .resourceDir(temporaryFolder.newFolder("resources")) + .resourceDirs(Collections.singletonList(temporaryFolder.newFolder("resources"))) .resourceConfig(resourceConfig) .build(); defaultResourceService = new DefaultResourceService(resourceServiceConfig); diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java index 8976405da8..69aee87efc 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/build/AbstractDockerMojo.java @@ -712,7 +712,7 @@ protected GeneratorContext.GeneratorContextBuilder generatorContextBuilder() thr // Get generator config protected ProcessorConfig extractGeneratorConfig() { try { - return ProfileUtil.blendProfileWithConfiguration(ProfileUtil.GENERATOR_CONFIG, profile, ResourceUtil.getFinalResourceDir(resourceDir, environment), generator); + return ProfileUtil.blendProfileWithConfiguration(ProfileUtil.GENERATOR_CONFIG, profile, ResourceUtil.getFinalResourceDirs(resourceDir, environment), generator); } catch (IOException e) { throw new IllegalArgumentException("Cannot extract generator config: " + e, e); } @@ -721,7 +721,7 @@ protected ProcessorConfig extractGeneratorConfig() { // Get enricher config protected ProcessorConfig extractEnricherConfig() { try { - return ProfileUtil.blendProfileWithConfiguration(ProfileUtil.ENRICHER_CONFIG, profile, ResourceUtil.getFinalResourceDir(resourceDir, environment), enricher); + return ProfileUtil.blendProfileWithConfiguration(ProfileUtil.ENRICHER_CONFIG, profile, ResourceUtil.getFinalResourceDirs(resourceDir, environment), enricher); } catch (IOException e) { throw new IllegalArgumentException("Cannot extract enricher config: " + e, e); } 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 48cb6f699d..eafeabfcbe 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 @@ -182,7 +182,7 @@ public class ResourceMojo extends AbstractJKubeMojo { protected MavenProjectHelper projectHelper; // resourceDir when environment has been applied - private File realResourceDir; + private List realResourceDirs; @@ -230,10 +230,10 @@ protected RuntimeMode getRuntimeMode() { @Override protected JKubeServiceHub.JKubeServiceHubBuilder initJKubeServiceHubBuilder(JavaProject javaProject) { - realResourceDir = ResourceUtil.getFinalResourceDir(resourceDir, environment); + realResourceDirs = ResourceUtil.getFinalResourceDirs(resourceDir, environment); final ResourceServiceConfig resourceServiceConfig = ResourceServiceConfig.builder() .project(javaProject) - .resourceDir(realResourceDir) + .resourceDirs(realResourceDirs) .targetDir(targetDir) .resourceFileType(resourceFileType) .resourceConfig(resources) @@ -310,11 +310,11 @@ private KubernetesList generateResources() } private ProcessorConfig extractEnricherConfig() throws IOException { - return ProfileUtil.blendProfileWithConfiguration(ProfileUtil.ENRICHER_CONFIG, profile, realResourceDir, enricher); + return ProfileUtil.blendProfileWithConfiguration(ProfileUtil.ENRICHER_CONFIG, profile, realResourceDirs, enricher); } private ProcessorConfig extractGeneratorConfig() throws IOException { - return ProfileUtil.blendProfileWithConfiguration(ProfileUtil.GENERATOR_CONFIG, profile, realResourceDir, generator); + return ProfileUtil.blendProfileWithConfiguration(ProfileUtil.GENERATOR_CONFIG, profile, realResourceDirs, generator); } // ================================================================================== @@ -370,7 +370,7 @@ private File[] mavenFilterFiles(File[] resourceFiles, File outDir) throws IOExce } private boolean hasJKubeDir() { - return realResourceDir.isDirectory(); + return !realResourceDirs.isEmpty() && realResourceDirs.get(0).isDirectory(); } private boolean isPomProject() { diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/UndeployMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/UndeployMojo.java index be69aa1010..2ebb8de0eb 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/UndeployMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/UndeployMojo.java @@ -72,9 +72,9 @@ public final void executeInternal() throws MojoExecutionException { } protected void undeploy() throws IOException { - final File environmentResourceDir = ResourceUtil.getFinalResourceDir(resourceDir, environment); + final List environmentResourceDirs = ResourceUtil.getFinalResourceDirs(resourceDir, environment); jkubeServiceHub.getUndeployService() - .undeploy(environmentResourceDir, resources, getManifestsToUndeploy().toArray(new File[0])); + .undeploy(environmentResourceDirs, resources, getManifestsToUndeploy().toArray(new File[0])); } protected List getManifestsToUndeploy() { diff --git a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java index 049f0e64b2..1909a1f26a 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/org/eclipse/jkube/maven/plugin/mojo/develop/WatchMojo.java @@ -154,7 +154,7 @@ protected GeneratorContext.GeneratorContextBuilder generatorContextBuilder() thr // Get watcher config private ProcessorConfig extractWatcherConfig() { try { - return ProfileUtil.blendProfileWithConfiguration(ProfileUtil.WATCHER_CONFIG, profile, ResourceUtil.getFinalResourceDir(resourceDir, environment), watcher); + return ProfileUtil.blendProfileWithConfiguration(ProfileUtil.WATCHER_CONFIG, profile, ResourceUtil.getFinalResourceDirs(resourceDir, environment), watcher); } catch (IOException e) { throw new IllegalArgumentException("Cannot extract watcher config: " + e, e); } diff --git a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/UndeployMojoTest.java b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/UndeployMojoTest.java index df770ab1e6..0263dc9d75 100644 --- a/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/UndeployMojoTest.java +++ b/kubernetes-maven-plugin/plugin/src/test/java/org/eclipse/jkube/maven/plugin/mojo/develop/UndeployMojoTest.java @@ -15,6 +15,7 @@ import java.io.File; import java.io.IOException; +import java.util.Collections; import java.util.Properties; import org.eclipse.jkube.kit.common.util.MavenUtil; @@ -95,7 +96,7 @@ public void executeWithCustomProperties() throws Exception { private void assertUndeployServiceUndeployWasCalled() throws Exception { // @formatter:off new Verifications() {{ - jKubeServiceHub.getUndeployService().undeploy(mockResourceDir, withNotNull(), mockManifest); + jKubeServiceHub.getUndeployService().undeploy(Collections.singletonList(mockResourceDir), withNotNull(), mockManifest); times = 1; }}; // @formatter:on