From 8d476a25216b4901da8df008e9cd5b06f5bd1c2e Mon Sep 17 00:00:00 2001 From: Davide Cavestro Date: Mon, 8 Apr 2024 19:13:44 +0200 Subject: [PATCH] feat: provide a way to set labels on images defined by Generators (#2885) --- .../inc/generator/_options_common.adoc | 4 ++++ .../generator/api/support/BaseGenerator.java | 17 +++++++++++++++++ .../api/support/BaseGeneratorTest.java | 19 +++++++++++++++++++ 3 files changed, 40 insertions(+) diff --git a/jkube-kit/doc/src/main/asciidoc/inc/generator/_options_common.adoc b/jkube-kit/doc/src/main/asciidoc/inc/generator/_options_common.adoc index 3a430d557b..78e163bd9c 100644 --- a/jkube-kit/doc/src/main/asciidoc/inc/generator/_options_common.adoc +++ b/jkube-kit/doc/src/main/asciidoc/inc/generator/_options_common.adoc @@ -35,6 +35,10 @@ or already added by a generator which has been run previously. The mode takes only effect when running in OpenShift mode. | `jkube.generator.fromMode` +| *labels* +| A comma separated list of additional labels you want to set on your image with +| `jkube.generator.labels` + | *name* | The Docker image name used when doing Docker builds. For OpenShift S2I builds its the name of the image stream. This can be a pattern as described in <>. The default is `%g/%a:%l`. Note that this flag would only work diff --git a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java index 8658888a49..ce3feaf51d 100644 --- a/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java +++ b/jkube-kit/generator/api/src/main/java/org/eclipse/jkube/generator/api/support/BaseGenerator.java @@ -79,6 +79,9 @@ enum Config implements Configs.Config { // Base image mode (only relevant for OpenShift) FROM_MODE("fromMode", null), + // Labels + LABELS("labels", null), + // Optional registry REGISTRY("registry", null), @@ -248,6 +251,18 @@ private boolean containsBuildConfiguration(List configs) { return false; } + + protected void addLabelsFromConfig(Map labels) { + String commaSeparatedLabels = getConfigWithFallback(Config.LABELS, "jkube.generator.labels", null); + if (StringUtils.isNotBlank(commaSeparatedLabels)) { + Map configLabels = Arrays.stream(commaSeparatedLabels.split(",")) + .map(envNameValue -> envNameValue.split("=")) + .filter(e -> e.length == 2) + .collect(Collectors.toMap(e -> e[0].trim(), e -> e[1].trim())); + labels.putAll(configLabels); + } + } + protected void addSchemaLabels(BuildConfiguration.BuildConfigurationBuilder buildBuilder, PrefixedLogger log) { final JavaProject project = getProject(); String docURL = project.getDocumentationUrl(); @@ -268,6 +283,8 @@ protected void addSchemaLabels(BuildConfiguration.BuildConfigurationBuilder buil labels.put(BuildLabelAnnotations.VERSION.value(), project.getVersion()); labels.put(BuildLabelAnnotations.SCHEMA_VERSION.value(), LABEL_SCHEMA_VERSION); + addLabelsFromConfig(labels); + try { Repository repository = GitUtil.getGitRepository(project.getBaseDirectory()); if (repository != null) { diff --git a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java index fa2a410e46..3670759921 100644 --- a/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java +++ b/jkube-kit/generator/api/src/test/java/org/eclipse/jkube/generator/api/support/BaseGeneratorTest.java @@ -21,6 +21,8 @@ import java.util.Collections; import java.util.List; import java.util.Properties; +import java.util.Map; +import java.util.LinkedHashMap; import org.assertj.core.api.InstanceOfAssertFactories; import org.eclipse.jkube.generator.api.FromSelector; @@ -402,6 +404,23 @@ void addTagsFromProperty() { .containsExactlyInAnyOrder("tag-1", "tag-2", "other-tag"); } + @Test + @DisplayName("add labels from property") + void addLabelsFromProperty() { + when(ctx.getProject()).thenReturn(project); + BuildConfiguration.BuildConfigurationBuilder builder = BuildConfiguration.builder(); + properties.put("jkube.generator.labels", " label-1=a, label-2=b , invalid-label"); + Map extractedLabels = new LinkedHashMap<>(); + BaseGenerator generator = createGenerator(null); + generator.addLabelsFromConfig(extractedLabels); + assertThat(extractedLabels) + .hasSize(2) + .contains( + entry("label-1", "a"), + entry("label-2", "b") + ); + } + private void inKubernetes() { when(ctx.getRuntimeMode()).thenReturn(RuntimeMode.KUBERNETES); }