From 213d59c536b2402df45a81d130b16b7ae2abb4ce 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) Modify ResourceServiceConfig to recieve a list of files as resourceDirs instead of receiving a single resourceDir. Resource fragments in these files can be combined while generating resources. Signed-off-by: Rohan Kumar --- CHANGELOG.md | 1 + .../asciidoc/inc/_groovy-configuration.adoc | 2 +- .../it/src/it/multi-environments/build.gradle | 21 ++++++ .../expected/common/kubernetes.yml | 15 ++++ .../expected/common/openshift.yml | 15 ++++ .../expected/commonanddev/kubernetes.yml | 26 +++++++ .../expected/commonanddev/openshift.yml | 26 +++++++ .../expected/commonandprod/kubernetes.yml | 26 +++++++ .../expected/commonandprod/openshift.yml | 26 +++++++ .../expected/dev/kubernetes.yml | 15 ++++ .../expected/dev/openshift.yml | 15 ++++ .../expected/prod/kubernetes.yml | 15 ++++ .../expected/prod/openshift.yml | 15 ++++ .../main/jkube/common/common-configmap.yml | 16 ++++ .../src/main/jkube/dev/dev-configmap.yml | 16 ++++ .../src/main/jkube/prod/prod-configmap.yml | 16 ++++ .../plugin/tests/MultiEnvironmentsIT.java | 74 +++++++++++++++++++ .../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 +++- .../kit/common/util/ResourceUtilTest.java | 42 +++++++++++ .../resource/ResourceServiceConfig.java | 3 +- .../kit/config/service/UndeployService.java | 3 +- .../kubernetes/KubernetesUndeployService.java | 2 +- .../jkube/kit/profile/ProfileUtil.java | 52 +++++++++---- .../jkube/kit/profile/ProfileUtilTest.java | 30 +++++--- .../config/profiles-lookup-dir/profiles.yaml | 2 + .../service/DefaultResourceService.java | 44 +++++++---- .../service/DefaultResourceServiceTest.java | 39 +++++++++- .../jkube/common/common-configmap.yml | 2 + .../test/resources/jkube/common/profiles.yml | 2 + .../jkube/common/test/test-configmap.yml | 6 ++ .../resources/jkube/dev/dev-configmap.yml | 2 + .../inc/goals/build/_jkube-apply.adoc | 2 +- .../inc/goals/build/_jkube-resource.adoc | 2 +- .../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 +- 44 files changed, 562 insertions(+), 77 deletions(-) create mode 100644 gradle-plugin/it/src/it/multi-environments/build.gradle create mode 100644 gradle-plugin/it/src/it/multi-environments/expected/common/kubernetes.yml create mode 100644 gradle-plugin/it/src/it/multi-environments/expected/common/openshift.yml create mode 100644 gradle-plugin/it/src/it/multi-environments/expected/commonanddev/kubernetes.yml create mode 100644 gradle-plugin/it/src/it/multi-environments/expected/commonanddev/openshift.yml create mode 100644 gradle-plugin/it/src/it/multi-environments/expected/commonandprod/kubernetes.yml create mode 100644 gradle-plugin/it/src/it/multi-environments/expected/commonandprod/openshift.yml create mode 100644 gradle-plugin/it/src/it/multi-environments/expected/dev/kubernetes.yml create mode 100644 gradle-plugin/it/src/it/multi-environments/expected/dev/openshift.yml create mode 100644 gradle-plugin/it/src/it/multi-environments/expected/prod/kubernetes.yml create mode 100644 gradle-plugin/it/src/it/multi-environments/expected/prod/openshift.yml create mode 100644 gradle-plugin/it/src/it/multi-environments/src/main/jkube/common/common-configmap.yml create mode 100644 gradle-plugin/it/src/it/multi-environments/src/main/jkube/dev/dev-configmap.yml create mode 100644 gradle-plugin/it/src/it/multi-environments/src/main/jkube/prod/prod-configmap.yml create mode 100644 gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/MultiEnvironmentsIT.java create mode 100644 jkube-kit/resource/service/src/test/resources/jkube/common/common-configmap.yml create mode 100644 jkube-kit/resource/service/src/test/resources/jkube/common/profiles.yml create mode 100644 jkube-kit/resource/service/src/test/resources/jkube/common/test/test-configmap.yml create mode 100644 jkube-kit/resource/service/src/test/resources/jkube/dev/dev-configmap.yml diff --git a/CHANGELOG.md b/CHANGELOG.md index 02c41f37b7..f251081639 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ Usage: * Fix #1194: jkube controller name configuration ignored when using resource fragments * Fix #1201: ThorntailV2Generator works with Gradle Plugins * Fix #1208: Allow env variables to be passed to a webapp generator s2i builder +* Fix #1218: Generate yaml files for different environments * Fix #1251: Generate a preview of jkube documentation for PR if needed * Fix #1259: Add integration test and docs for NameEnricher * Fix #1260: Add documentation for PodAnnotationEnricher diff --git a/gradle-plugin/doc/src/main/asciidoc/inc/_groovy-configuration.adoc b/gradle-plugin/doc/src/main/asciidoc/inc/_groovy-configuration.adoc index 90298fcd81..164ad89d82 100644 --- a/gradle-plugin/doc/src/main/asciidoc/inc/_groovy-configuration.adoc +++ b/gradle-plugin/doc/src/main/asciidoc/inc/_groovy-configuration.adoc @@ -314,7 +314,7 @@ Defaults to 0. | *resourceEnvironment* | Environment name where resources are placed. For example, if you set this property to dev and resourceDir is the -default one, plugin will look at `src/main/jkube/dev`. +default one, plugin will look at `src/main/jkube/dev`. Multiple environments can also be provided in form of comma separated strings. Resource fragments in these directories will be combined while generating resources. Defaults to `null`. | `jkube.environment` diff --git a/gradle-plugin/it/src/it/multi-environments/build.gradle b/gradle-plugin/it/src/it/multi-environments/build.gradle new file mode 100644 index 0000000000..a895b8ba77 --- /dev/null +++ b/gradle-plugin/it/src/it/multi-environments/build.gradle @@ -0,0 +1,21 @@ +plugins { + id 'org.eclipse.jkube.kubernetes' version "${jKubeVersion}" + id 'org.eclipse.jkube.openshift' version "${jKubeVersion}" + id 'java' +} + +group = 'org.eclipse.jkube.integration.tests.gradle' +version = '0.0.1-SNAPSHOT' +sourceCompatibility = '11' + +repositories { + mavenCentral() +} + +kubernetes { + offline = true +} + +openshift { + offline = true +} \ No newline at end of file diff --git a/gradle-plugin/it/src/it/multi-environments/expected/common/kubernetes.yml b/gradle-plugin/it/src/it/multi-environments/expected/common/kubernetes.yml new file mode 100644 index 0000000000..c00cefb5b3 --- /dev/null +++ b/gradle-plugin/it/src/it/multi-environments/expected/common/kubernetes.yml @@ -0,0 +1,15 @@ +--- +apiVersion: v1 +kind: List +items: +- apiVersion: v1 + kind: ConfigMap + metadata: + labels: + app: multi-environments + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + name: common + data: + type: common diff --git a/gradle-plugin/it/src/it/multi-environments/expected/common/openshift.yml b/gradle-plugin/it/src/it/multi-environments/expected/common/openshift.yml new file mode 100644 index 0000000000..c00cefb5b3 --- /dev/null +++ b/gradle-plugin/it/src/it/multi-environments/expected/common/openshift.yml @@ -0,0 +1,15 @@ +--- +apiVersion: v1 +kind: List +items: +- apiVersion: v1 + kind: ConfigMap + metadata: + labels: + app: multi-environments + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + name: common + data: + type: common diff --git a/gradle-plugin/it/src/it/multi-environments/expected/commonanddev/kubernetes.yml b/gradle-plugin/it/src/it/multi-environments/expected/commonanddev/kubernetes.yml new file mode 100644 index 0000000000..cf0f49663e --- /dev/null +++ b/gradle-plugin/it/src/it/multi-environments/expected/commonanddev/kubernetes.yml @@ -0,0 +1,26 @@ +--- +apiVersion: v1 +kind: List +items: +- apiVersion: v1 + kind: ConfigMap + metadata: + labels: + app: multi-environments + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + name: common + data: + type: common +- apiVersion: v1 + kind: ConfigMap + metadata: + labels: + app: multi-environments + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + name: dev + data: + type: dev diff --git a/gradle-plugin/it/src/it/multi-environments/expected/commonanddev/openshift.yml b/gradle-plugin/it/src/it/multi-environments/expected/commonanddev/openshift.yml new file mode 100644 index 0000000000..cf0f49663e --- /dev/null +++ b/gradle-plugin/it/src/it/multi-environments/expected/commonanddev/openshift.yml @@ -0,0 +1,26 @@ +--- +apiVersion: v1 +kind: List +items: +- apiVersion: v1 + kind: ConfigMap + metadata: + labels: + app: multi-environments + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + name: common + data: + type: common +- apiVersion: v1 + kind: ConfigMap + metadata: + labels: + app: multi-environments + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + name: dev + data: + type: dev diff --git a/gradle-plugin/it/src/it/multi-environments/expected/commonandprod/kubernetes.yml b/gradle-plugin/it/src/it/multi-environments/expected/commonandprod/kubernetes.yml new file mode 100644 index 0000000000..06a5cc3355 --- /dev/null +++ b/gradle-plugin/it/src/it/multi-environments/expected/commonandprod/kubernetes.yml @@ -0,0 +1,26 @@ +--- +apiVersion: v1 +kind: List +items: +- apiVersion: v1 + kind: ConfigMap + metadata: + labels: + app: multi-environments + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + name: common + data: + type: common +- apiVersion: v1 + kind: ConfigMap + metadata: + labels: + app: multi-environments + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + name: prod + data: + type: prod diff --git a/gradle-plugin/it/src/it/multi-environments/expected/commonandprod/openshift.yml b/gradle-plugin/it/src/it/multi-environments/expected/commonandprod/openshift.yml new file mode 100644 index 0000000000..06a5cc3355 --- /dev/null +++ b/gradle-plugin/it/src/it/multi-environments/expected/commonandprod/openshift.yml @@ -0,0 +1,26 @@ +--- +apiVersion: v1 +kind: List +items: +- apiVersion: v1 + kind: ConfigMap + metadata: + labels: + app: multi-environments + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + name: common + data: + type: common +- apiVersion: v1 + kind: ConfigMap + metadata: + labels: + app: multi-environments + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + name: prod + data: + type: prod diff --git a/gradle-plugin/it/src/it/multi-environments/expected/dev/kubernetes.yml b/gradle-plugin/it/src/it/multi-environments/expected/dev/kubernetes.yml new file mode 100644 index 0000000000..d620e48c55 --- /dev/null +++ b/gradle-plugin/it/src/it/multi-environments/expected/dev/kubernetes.yml @@ -0,0 +1,15 @@ +--- +apiVersion: v1 +kind: List +items: +- apiVersion: v1 + kind: ConfigMap + metadata: + labels: + app: multi-environments + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + name: dev + data: + type: dev diff --git a/gradle-plugin/it/src/it/multi-environments/expected/dev/openshift.yml b/gradle-plugin/it/src/it/multi-environments/expected/dev/openshift.yml new file mode 100644 index 0000000000..d620e48c55 --- /dev/null +++ b/gradle-plugin/it/src/it/multi-environments/expected/dev/openshift.yml @@ -0,0 +1,15 @@ +--- +apiVersion: v1 +kind: List +items: +- apiVersion: v1 + kind: ConfigMap + metadata: + labels: + app: multi-environments + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + name: dev + data: + type: dev diff --git a/gradle-plugin/it/src/it/multi-environments/expected/prod/kubernetes.yml b/gradle-plugin/it/src/it/multi-environments/expected/prod/kubernetes.yml new file mode 100644 index 0000000000..ecc4e6a558 --- /dev/null +++ b/gradle-plugin/it/src/it/multi-environments/expected/prod/kubernetes.yml @@ -0,0 +1,15 @@ +--- +apiVersion: v1 +kind: List +items: +- apiVersion: v1 + kind: ConfigMap + metadata: + labels: + app: multi-environments + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + name: prod + data: + type: prod diff --git a/gradle-plugin/it/src/it/multi-environments/expected/prod/openshift.yml b/gradle-plugin/it/src/it/multi-environments/expected/prod/openshift.yml new file mode 100644 index 0000000000..ecc4e6a558 --- /dev/null +++ b/gradle-plugin/it/src/it/multi-environments/expected/prod/openshift.yml @@ -0,0 +1,15 @@ +--- +apiVersion: v1 +kind: List +items: +- apiVersion: v1 + kind: ConfigMap + metadata: + labels: + app: multi-environments + provider: jkube + version: "@ignore@" + group: org.eclipse.jkube.integration.tests.gradle + name: prod + data: + type: prod diff --git a/gradle-plugin/it/src/it/multi-environments/src/main/jkube/common/common-configmap.yml b/gradle-plugin/it/src/it/multi-environments/src/main/jkube/common/common-configmap.yml new file mode 100644 index 0000000000..5a9c18c53e --- /dev/null +++ b/gradle-plugin/it/src/it/multi-environments/src/main/jkube/common/common-configmap.yml @@ -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 +# + +data: + type: common \ No newline at end of file diff --git a/gradle-plugin/it/src/it/multi-environments/src/main/jkube/dev/dev-configmap.yml b/gradle-plugin/it/src/it/multi-environments/src/main/jkube/dev/dev-configmap.yml new file mode 100644 index 0000000000..5c0920e134 --- /dev/null +++ b/gradle-plugin/it/src/it/multi-environments/src/main/jkube/dev/dev-configmap.yml @@ -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 +# + +data: + type: dev \ No newline at end of file diff --git a/gradle-plugin/it/src/it/multi-environments/src/main/jkube/prod/prod-configmap.yml b/gradle-plugin/it/src/it/multi-environments/src/main/jkube/prod/prod-configmap.yml new file mode 100644 index 0000000000..86cdc31f91 --- /dev/null +++ b/gradle-plugin/it/src/it/multi-environments/src/main/jkube/prod/prod-configmap.yml @@ -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 +# + +data: + type: prod \ No newline at end of file diff --git a/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/MultiEnvironmentsIT.java b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/MultiEnvironmentsIT.java new file mode 100644 index 0000000000..9c78a43011 --- /dev/null +++ b/gradle-plugin/it/src/test/java/org/eclipse/jkube/gradle/plugin/tests/MultiEnvironmentsIT.java @@ -0,0 +1,74 @@ +/** + * 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 net.minidev.json.parser.ParseException; +import org.eclipse.jkube.kit.common.ResourceVerify; +import org.gradle.testkit.runner.BuildResult; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +import java.io.IOException; +import java.util.Arrays; +import java.util.Collection; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +@RunWith(Parameterized.class) +public class MultiEnvironmentsIT { + @Rule + public final ITGradleRunner gradleRunner = new ITGradleRunner(); + + @Parameterized.Parameters(name = "environment {0}") + public static Collection data() { + return Arrays.asList( + new Object[] { "common" }, + new Object[] { "dev" }, + new Object[] { "prod" }, + new Object[] { "common,dev"}, + new Object[] { "common,prod"} + ); + } + + @Parameterized.Parameter + public String environment; + + @Test + public void k8sResource_whenRun_generatesK8sManifestsContainingConfigMap() throws IOException, ParseException { + // When + final BuildResult result = gradleRunner.withITProject("multi-environments") + .withArguments("build", "-Pjkube.environment=" + environment, "k8sResource", "--stacktrace") + .build(); + // Then + ResourceVerify.verifyResourceDescriptors(gradleRunner.resolveDefaultKubernetesResourceFile(), + gradleRunner.resolveFile("expected", environment.replace(",", "and"), "kubernetes.yml")); + assertThat(result).extracting(BuildResult::getOutput).asString() + .contains("Running in Kubernetes mode"); + } + + @Test + public void ocResource_whenRun_generatesOpenShiftManifestsContainingConfigMap() throws IOException, ParseException { + // When + final BuildResult result = gradleRunner.withITProject("multi-environments") + .withArguments("build", "-Pjkube.environment=" + environment, "ocResource", "--stacktrace") + .build(); + // Then + ResourceVerify.verifyResourceDescriptors(gradleRunner.resolveDefaultOpenShiftResourceFile(), + gradleRunner.resolveFile("expected", environment.replace(",", "and"), "openshift.yml")); + assertThat(result).extracting(BuildResult::getOutput).asString() + .contains("Running in OpenShift mode"); + } +} 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/common/src/test/java/org/eclipse/jkube/kit/common/util/ResourceUtilTest.java b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/ResourceUtilTest.java index a9aec5bc52..5735734555 100644 --- a/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/ResourceUtilTest.java +++ b/jkube-kit/common/src/test/java/org/eclipse/jkube/kit/common/util/ResourceUtilTest.java @@ -277,4 +277,46 @@ public void save_withValidYamlFileAndItemWithAdditionalProperties_shouldSave() t assertThat(file).hasSameTextualContentAs( new File(ResourceUtilTest.class.getResource( "/util/resource-util/expected/config-map-placeholders.yml").getFile())); } + + @Test + public void getFinalResourceDirs_withMultipleEnvs_shouldReturnEnvResourceDirList() throws IOException { + // Given + File resourceDir = temporaryFolder.newFolder("src", "main", "jkube"); + + // When + List finalResourceDirs = ResourceUtil.getFinalResourceDirs(resourceDir, "common,dev"); + + // Then + assertThat(finalResourceDirs) + .hasSize(2) + .containsExactlyInAnyOrder(new File(resourceDir, "common"), new File(resourceDir, "dev")); + } + + @Test + public void getFinalResourceDirs_withNullEnv_shouldReturnResourceDir() throws IOException { + // Given + File resourceDir = temporaryFolder.newFolder("src", "main", "jkube"); + + // When + List finalResourceDirs = ResourceUtil.getFinalResourceDirs(resourceDir, null); + + // Then + assertThat(finalResourceDirs) + .hasSize(1) + .containsExactly(resourceDir); + } + + @Test + public void getFinalResourceDirs_withEmptyEnv_shouldReturnResourceDir() throws IOException { + // Given + File resourceDir = temporaryFolder.newFolder("src", "main", "jkube"); + + // When + List finalResourceDirs = ResourceUtil.getFinalResourceDirs(resourceDir, ""); + + // Then + assertThat(finalResourceDirs) + .hasSize(1) + .containsExactly(resourceDir); + } } 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..f3f3d56995 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); } 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..207c11c789 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 @@ -42,7 +42,7 @@ public void simple() throws IOException { assertNotNull(is); List profiles = ProfileUtil.fromYaml(is); assertNotNull(profiles); - assertEquals(3, profiles.size()); + assertEquals(4, profiles.size()); Profile profile = profiles.get(0); assertEquals("simple", profile.getName()); ProcessorConfig config = profile.getEnricherConfig(); @@ -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")); @@ -144,4 +144,16 @@ public void shouldExtend() throws Exception { assertTrue(aProfile.getGeneratorConfig().use("spring.swarm")); assertFalse(aProfile.getGeneratorConfig().use("java.app")); } + + @Test + public void findProfile_whenProfileUsedWithInvalidParent_thenThrowsException() throws URISyntaxException { + // Given + File profileDir = getProfileDir(); + + // When + IllegalArgumentException illegalArgumentException = assertThrows(IllegalArgumentException.class, () -> ProfileUtil.findProfile("invalid-parent", profileDir)); + + // Then + assertEquals("No parent profile 'i-dont-exist' defined", illegalArgumentException.getMessage()); + } } diff --git a/jkube-kit/profile/src/test/resources/jkube/config/profiles-lookup-dir/profiles.yaml b/jkube-kit/profile/src/test/resources/jkube/config/profiles-lookup-dir/profiles.yaml index 83b23ccadd..987163de09 100644 --- a/jkube-kit/profile/src/test/resources/jkube/config/profiles-lookup-dir/profiles.yaml +++ b/jkube-kit/profile/src/test/resources/jkube/config/profiles-lookup-dir/profiles.yaml @@ -40,3 +40,5 @@ - jkube-project - jkube-debug - jkube-ingress +- name: invalid-parent + extends: i-dont-exist 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..839a7d6a9b 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,7 +15,13 @@ import java.io.File; import java.io.IOException; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import io.fabric8.kubernetes.api.model.ConfigMapBuilder; +import org.eclipse.jkube.kit.common.JavaProject; import org.eclipse.jkube.kit.common.KitLogger; import org.eclipse.jkube.kit.common.ResourceFileType; import org.eclipse.jkube.kit.common.util.ResourceClassifier; @@ -47,6 +53,8 @@ public class DefaultResourceServiceTest { @SuppressWarnings("unused") @Mocked private ResourceConfig resourceConfig; + @Mocked + private JavaProject project; private File targetDir; private ResourceServiceConfig resourceServiceConfig; @@ -58,8 +66,9 @@ public void init() throws IOException { resourceServiceConfig = ResourceServiceConfig.builder() .interpolateTemplateParameters(true) .targetDir(targetDir) + .project(project) .resourceFileType(ResourceFileType.yaml) - .resourceDir(temporaryFolder.newFolder("resources")) + .resourceDirs(Collections.singletonList(temporaryFolder.newFolder("resources"))) .resourceConfig(resourceConfig) .build(); defaultResourceService = new DefaultResourceService(resourceServiceConfig); @@ -74,6 +83,34 @@ public void generateResourcesWithNoResourcesShouldReturnEmpty() throws IOExcepti assertThat(result.getItems()).isEmpty(); } + @Test + public void generateResources_withResources_shouldReturnKubernetesResourceList() throws IOException { + // Given + File resourceDir1 = new File(Objects.requireNonNull(getClass().getResource("/jkube/common")).getFile()); + File resourceDir2 = new File(Objects.requireNonNull(getClass().getResource("/jkube/dev")).getFile()); + List resourceDirs = Arrays.asList(resourceDir1, resourceDir2); + resourceServiceConfig = resourceServiceConfig.toBuilder().resourceDirs(resourceDirs).build(); + defaultResourceService = new DefaultResourceService(resourceServiceConfig); + + // When + final KubernetesList result = defaultResourceService + .generateResources(PlatformMode.kubernetes, enricherManager, kitLogger); + + // Then + assertThat(result.getItems()) + .hasSize(3) + .containsExactlyInAnyOrder( + new ConfigMapBuilder().withNewMetadata().withName("test-profile").endMetadata() + .withData(Collections.singletonMap("type", "test")) + .build(), + new ConfigMapBuilder().withNewMetadata().withName("common").endMetadata() + .withData(Collections.singletonMap("type", "common")) + .build(), + new ConfigMapBuilder().withNewMetadata().withName("dev").endMetadata() + .withData(Collections.singletonMap("type", "dev")) + .build()); + } + @SuppressWarnings("AccessStaticViaInstance") @Test public void writeResources(@Mocked WriteUtil writeUtil, @Mocked TemplateUtil templateUtil) throws IOException { diff --git a/jkube-kit/resource/service/src/test/resources/jkube/common/common-configmap.yml b/jkube-kit/resource/service/src/test/resources/jkube/common/common-configmap.yml new file mode 100644 index 0000000000..c75eaac81a --- /dev/null +++ b/jkube-kit/resource/service/src/test/resources/jkube/common/common-configmap.yml @@ -0,0 +1,2 @@ +data: + type: common \ No newline at end of file diff --git a/jkube-kit/resource/service/src/test/resources/jkube/common/profiles.yml b/jkube-kit/resource/service/src/test/resources/jkube/common/profiles.yml new file mode 100644 index 0000000000..0129b2bc40 --- /dev/null +++ b/jkube-kit/resource/service/src/test/resources/jkube/common/profiles.yml @@ -0,0 +1,2 @@ +- name: test + order: 10 \ No newline at end of file diff --git a/jkube-kit/resource/service/src/test/resources/jkube/common/test/test-configmap.yml b/jkube-kit/resource/service/src/test/resources/jkube/common/test/test-configmap.yml new file mode 100644 index 0000000000..5206d59d1a --- /dev/null +++ b/jkube-kit/resource/service/src/test/resources/jkube/common/test/test-configmap.yml @@ -0,0 +1,6 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: test-profile +data: + type: test \ No newline at end of file diff --git a/jkube-kit/resource/service/src/test/resources/jkube/dev/dev-configmap.yml b/jkube-kit/resource/service/src/test/resources/jkube/dev/dev-configmap.yml new file mode 100644 index 0000000000..28948ecc1a --- /dev/null +++ b/jkube-kit/resource/service/src/test/resources/jkube/dev/dev-configmap.yml @@ -0,0 +1,2 @@ +data: + type: dev diff --git a/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_jkube-apply.adoc b/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_jkube-apply.adoc index b50049cb63..ff21b7c9ce 100644 --- a/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_jkube-apply.adoc +++ b/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_jkube-apply.adoc @@ -111,7 +111,7 @@ endif::[] | *environment* | Environment name where resources are placed. For example, if you set this property to dev and resourceDir is the - default one, jkube will look at `src/main/jkube/dev`. + default one, jkube will look at `src/main/jkube/dev`. Multiple environments can also be provided in form of comma separated strings. Resource fragments in these directories will be combined while generating resources. Defaults to `null`. | `jkube.environment` diff --git a/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_jkube-resource.adoc b/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_jkube-resource.adoc index 6118643872..d4d2131a58 100644 --- a/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_jkube-resource.adoc +++ b/kubernetes-maven-plugin/doc/src/main/asciidoc/inc/goals/build/_jkube-resource.adoc @@ -893,7 +893,7 @@ endif::[] | *environment* | Environment name where resources are placed. For example, if you set this property to dev and resourceDir is the - default one, plugin will look at `src/main/jkube/dev`. + default one, plugin will look at `src/main/jkube/dev`. Multiple environments can also be provided in form of comma separated strings. Resource fragments in these directories will be combined while generating resources. Defaults to `null`. | `jkube.environment` 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