From f7d1d682407403e777e5c298d4154cbe0fbe3284 Mon Sep 17 00:00:00 2001 From: Rohan Kumar Date: Thu, 7 Nov 2019 23:31:00 +0530 Subject: [PATCH] + Resolving template placeholders only in kubernetes.yaml but not individual template files (which will be resolved by helm mojo) + HELM mode does not support parameters without value Ported PR https://github.com/fabric8io/fabric8-maven-plugin/pull/1713 Ported PR https://github.com/fabric8io/fabric8-maven-plugin/pull/1733 --- .../kit/common/util/KubernetesHelper.java | 47 +++++++++++++++++++ .../maven/plugin/mojo/build/ResourceMojo.java | 2 + 2 files changed, 49 insertions(+) diff --git a/jkube-kit/common/src/main/java/io/jkube/kit/common/util/KubernetesHelper.java b/jkube-kit/common/src/main/java/io/jkube/kit/common/util/KubernetesHelper.java index b9461ae135..e5ed21f765 100644 --- a/jkube-kit/common/src/main/java/io/jkube/kit/common/util/KubernetesHelper.java +++ b/jkube-kit/common/src/main/java/io/jkube/kit/common/util/KubernetesHelper.java @@ -20,6 +20,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.net.UnknownHostException; +import java.nio.charset.Charset; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; @@ -80,7 +81,9 @@ import io.fabric8.openshift.api.model.Template; import io.jkube.kit.common.KitLogger; import io.jkube.kit.common.ResourceFileType; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.maven.plugin.MojoExecutionException; /** * @author roland @@ -712,5 +715,49 @@ public static Pod getNewestPod(Collection pods) { }); return sortedPods.get(sortedPods.size() - 1); } + + public static void resolveTemplateVariablesIfAny(KubernetesList resources, File targetDir) throws IllegalStateException { + Template template = findTemplate(resources); + if (template != null) { + List parameters = template.getParameters(); + if (parameters == null || parameters.isEmpty()) { + return; + } + File kubernetesYaml = new File(targetDir, "kubernetes.yml"); + resolveTemplateVariables(parameters, kubernetesYaml); + } + } + + public static void resolveTemplateVariables(List parameters, File kubernetesYaml) throws IllegalStateException { + String text; + try { + text = FileUtils.readFileToString(kubernetesYaml, Charset.defaultCharset()); + } catch (IOException e) { + throw new IllegalStateException("Failed to load " + kubernetesYaml + " so we can replace template expressions " + e, e); + } + String original = text; + for (io.fabric8.openshift.api.model.Parameter parameter : parameters) { + String from = "${" + parameter.getName() + "}"; + String to = parameter.getValue(); + if (to == null) { + throw new IllegalStateException("Missing value for HELM template parameter " + from + " in " + kubernetesYaml); + } + text = text.replace(from, to); + } + if (!original.equals(text)) { + try { + FileUtils.writeStringToFile(kubernetesYaml, text, Charset.defaultCharset()); + } catch (IOException e) { + throw new IllegalStateException("Failed to save " + kubernetesYaml + " after replacing template expressions " +e, e); + } + } + } + + public static Template findTemplate(KubernetesList resources) { + return (Template) resources.getItems().stream() + .filter(template -> template instanceof Template) + .findFirst() + .orElse(null); + } } diff --git a/kubernetes-maven-plugin/plugin/src/main/java/io/jkube/maven/plugin/mojo/build/ResourceMojo.java b/kubernetes-maven-plugin/plugin/src/main/java/io/jkube/maven/plugin/mojo/build/ResourceMojo.java index 5a7ad89ec5..5deff69683 100644 --- a/kubernetes-maven-plugin/plugin/src/main/java/io/jkube/maven/plugin/mojo/build/ResourceMojo.java +++ b/kubernetes-maven-plugin/plugin/src/main/java/io/jkube/maven/plugin/mojo/build/ResourceMojo.java @@ -636,6 +636,8 @@ protected void writeResources(KubernetesList resources, ResourceClassifier class File file = writeResourcesIndividualAndComposite(resources, resourceFileBase, this.resourceFileType, log, generateRoute); + KubernetesHelper.resolveTemplateVariablesIfAny(resources, this.targetDir); + // Attach it to the Maven reactor so that it will also get deployed projectHelper.attachArtifact(project, this.resourceFileType.getArtifactType(), classifier.getValue(), file); }