This is an automated email from the ASF dual-hosted git repository. cdeppisch pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/camel.git
commit 1afb7a9c3abd51fcf473e8d774ade3e6dcffaa17 Author: Thomas Diesler <tdies...@redhat.com> AuthorDate: Fri Jul 12 19:07:33 2024 +0200 [CAMEL-20975] camel-jbang: Derive image group from project groupId --- .../jbang/core/commands/k/IntegrationExport.java | 5 +- .../core/commands/kubernetes/KubernetesExport.java | 21 ++++--- .../commands/kubernetes/KubernetesExportTest.java | 67 ++++++++++++++++------ 3 files changed, 62 insertions(+), 31 deletions(-) diff --git a/dsl/camel-jbang/camel-jbang-plugin-k/src/main/java/org/apache/camel/dsl/jbang/core/commands/k/IntegrationExport.java b/dsl/camel-jbang/camel-jbang-plugin-k/src/main/java/org/apache/camel/dsl/jbang/core/commands/k/IntegrationExport.java index e481bf24337..247e4889a5d 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-k/src/main/java/org/apache/camel/dsl/jbang/core/commands/k/IntegrationExport.java +++ b/dsl/camel-jbang/camel-jbang-plugin-k/src/main/java/org/apache/camel/dsl/jbang/core/commands/k/IntegrationExport.java @@ -44,8 +44,11 @@ public class IntegrationExport extends KubernetesExport { public IntegrationExport(CamelJBangMain main, RuntimeType runtime, String[] files, String exportDir, String imageGroup, boolean quiet) { - super(main, runtime, files, exportDir, quiet); + super(main, files); + this.runtime = runtime; this.imageGroup = imageGroup; + this.exportDir = exportDir; + this.quiet = quiet; } @Override diff --git a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java index fc2a1ca264c..d7bfc5a5603 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java +++ b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/main/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExport.java @@ -103,13 +103,10 @@ public class KubernetesExport extends Export { super(main); } - public KubernetesExport(CamelJBangMain main, RuntimeType runtime, String[] files, String exportDir, boolean quiet) { + public KubernetesExport(CamelJBangMain main, String[] files) { super(main); - this.runtime = runtime; this.files = Arrays.asList(files); - this.exportDir = exportDir; - this.quiet = quiet; } public KubernetesExport(CamelJBangMain main, ExportConfigurer configurer) { @@ -138,21 +135,25 @@ public class KubernetesExport extends Export { Map<String, String> exportProps = new HashMap<>(); String resolvedImageRegistry = resolveImageRegistry(); - // TODO: remove when fixed kubernetes-client version is part of the Quarkus platform - // pin kubernetes-client to this version because of https://github.com/fabric8io/kubernetes-client/issues/6059 - addDependencies("camel:cli-connector", "io.fabric8:kubernetes-client:6.13.1"); - String resolvedImageGroup = null; if (image != null) { resolvedImageGroup = extractImageGroup(image); } else if (imageGroup != null) { resolvedImageGroup = imageGroup; + } else if (gav != null) { + var groupId = parseMavenGav(gav).getGroupId(); + var dotToks = groupId.split("\\."); + resolvedImageGroup = dotToks[dotToks.length - 1]; } if (runtime == RuntimeType.quarkus) { // Quarkus specific dependencies - addDependencies("io.quarkus:quarkus-kubernetes"); + addDependencies("io.quarkus:quarkus-kubernetes", "camel:cli-connector"); + + // TODO: remove when fixed kubernetes-client version is part of the Quarkus platform + // pin kubernetes-client to this version because of https://github.com/fabric8io/kubernetes-client/issues/6059 + addDependencies("io.fabric8:kubernetes-client:6.13.1"); // Mutually exclusive image build plugins - use Jib by default if (!getDependenciesList().contains("io.quarkus:quarkus-container-image-docker")) { @@ -172,8 +173,6 @@ public class KubernetesExport extends Export { if (resolvedImageGroup != null) { exportProps.put("quarkus.container-image.group", resolvedImageGroup); } - } else { - printer().println("Kubernetes export for runtime '" + runtime + "' not supported"); } additionalProperties = Optional.ofNullable(additionalProperties).orElse(""); diff --git a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java index df683a0d373..83accb91fa7 100644 --- a/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java +++ b/dsl/camel-jbang/camel-jbang-plugin-kubernetes/src/test/java/org/apache/camel/dsl/jbang/core/commands/kubernetes/KubernetesExportTest.java @@ -19,34 +19,53 @@ package org.apache.camel.dsl.jbang.core.commands.kubernetes; import java.io.File; import java.io.FileInputStream; +import java.io.FileReader; import java.io.IOException; import java.nio.file.Files; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Optional; import io.fabric8.kubernetes.api.model.apps.Deployment; import org.apache.camel.dsl.jbang.core.commands.CamelJBangMain; import org.apache.camel.dsl.jbang.core.commands.kubernetes.traits.BaseTrait; -import org.apache.camel.dsl.jbang.core.common.RuntimeType; +import org.apache.maven.model.Model; +import org.apache.maven.model.io.xpp3.MavenXpp3Reader; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import picocli.CommandLine; class KubernetesExportTest { private File workingDir; + private String[] defaultArgs; @BeforeEach public void setup() throws IOException { workingDir = Files.createTempDirectory("camel-k8s-export").toFile(); workingDir.deleteOnExit(); + defaultArgs = new String[] { "--dir=" + workingDir, "--quiet" }; } @Test - public void shouldGenerateKubernetesManifest() throws Exception { - KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }, workingDir.toString()); + public void shouldGenerateQuarkusProject() throws Exception { + KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }, "--gav=examples:route:1.0.0"); int exit = command.doCall(); Assertions.assertEquals(0, exit); + Model model = readMavenModel(); + Assertions.assertEquals("examples", model.getGroupId()); + Assertions.assertEquals("route", model.getArtifactId()); + Assertions.assertEquals("1.0.0", model.getVersion()); + } + + @Test + public void shouldGenerateKubernetesManifest() throws Exception { + KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }, "--image-group=camel-test"); + int exit = command.doCall(); + Assertions.assertEquals(0, exit); Deployment deployment = getDeployment(workingDir); Assertions.assertEquals("route", deployment.getMetadata().getName()); Assertions.assertEquals(1, deployment.getSpec().getTemplate().getSpec().getContainers().size()); @@ -61,14 +80,14 @@ class KubernetesExportTest { @Test public void shouldAddContainerSpec() throws Exception { - KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }, workingDir.toString()); + KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }, "--gav=camel-test:route:1.0.0"); command.traits = new String[] { "container.port=8088", "container.image-pull-policy=IfNotPresent" }; command.doCall(); Deployment deployment = getDeployment(workingDir); Assertions.assertEquals("route", deployment.getMetadata().getName()); Assertions.assertEquals(1, deployment.getSpec().getTemplate().getSpec().getContainers().size()); - Assertions.assertEquals("quay.io/camel-test/route:1.0-SNAPSHOT", + Assertions.assertEquals("quay.io/camel-test/route:1.0.0", deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getImage()); Assertions.assertEquals("IfNotPresent", deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getImagePullPolicy()); @@ -81,7 +100,7 @@ class KubernetesExportTest { @Test public void shouldAddVolumes() throws Exception { - KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }, workingDir.toString()); + KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }); command.volumes = new String[] { "pvc-foo:/container/path/foo", "pvc-bar:/container/path/bar" }; command.doCall(); @@ -109,7 +128,7 @@ class KubernetesExportTest { @Test public void shouldAddEnvVars() throws Exception { - KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }, workingDir.toString()); + KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }); command.envVars = new String[] { "CAMEL_FOO=bar", "MY_ENV=foo" }; command.doCall(); @@ -129,7 +148,7 @@ class KubernetesExportTest { @Test public void shouldAddAnnotations() throws Exception { - KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }, workingDir.toString()); + KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }); command.annotations = new String[] { "foo=bar" }; command.doCall(); @@ -141,19 +160,19 @@ class KubernetesExportTest { @Test public void shouldAddLabels() throws Exception { - KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }, workingDir.toString()); - command.labels = new String[] { "foo=bar" }; + KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }, "--label=foo=bar"); command.doCall(); Deployment deployment = getDeployment(workingDir); Assertions.assertEquals("route", deployment.getMetadata().getName()); Assertions.assertEquals(2, deployment.getMetadata().getLabels().size()); + Assertions.assertEquals("route", deployment.getMetadata().getLabels().get("camel.apache.org/integration")); Assertions.assertEquals("bar", deployment.getMetadata().getLabels().get("foo")); } @Test public void shouldAddConfigs() throws Exception { - KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }, workingDir.toString()); + KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }); command.configs = new String[] { "secret:foo", "configmap:bar" }; command.doCall(); @@ -178,7 +197,7 @@ class KubernetesExportTest { @Test public void shouldAddResources() throws Exception { - KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }, workingDir.toString()); + KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }); command.resources = new String[] { "configmap:foo/file.txt" }; command.doCall(); @@ -197,7 +216,7 @@ class KubernetesExportTest { @Test public void shouldAddOpenApis() throws Exception { - KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }, workingDir.toString()); + KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }); command.openApis = new String[] { "configmap:openapi/spec.yaml" }; command.doCall(); @@ -216,7 +235,7 @@ class KubernetesExportTest { @Test public void shouldUseImage() throws Exception { - KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }, workingDir.toString()); + KubernetesExport command = createCommand(new String[] { "classpath:route.yaml" }); command.image = "quay.io/camel/demo-app:1.0"; command.doCall(); @@ -227,11 +246,12 @@ class KubernetesExportTest { deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getImage()); } - private KubernetesExport createCommand(String[] files, String exportDir) { - KubernetesExport command = new KubernetesExport( - new CamelJBangMain(), - RuntimeType.quarkus, files, exportDir, true); - command.imageGroup = "camel-test"; + private KubernetesExport createCommand(String[] files, String... args) { + var argsArr = Optional.ofNullable(args).orElse(new String[0]); + var argsLst = new ArrayList<>(Arrays.asList(argsArr)); + argsLst.addAll(Arrays.asList(defaultArgs)); + KubernetesExport command = new KubernetesExport(new CamelJBangMain(), files); + CommandLine.populateCommand(command, argsLst.toArray(new String[0])); return command; } @@ -240,4 +260,13 @@ class KubernetesExportTest { return KubernetesHelper.yaml().loadAs(fis, Deployment.class); } } + + private Model readMavenModel() throws Exception { + File f = workingDir.toPath().resolve("pom.xml").toFile(); + Assertions.assertTrue(f.isFile(), "Not a pom.xml file: " + f); + MavenXpp3Reader mavenReader = new MavenXpp3Reader(); + Model model = mavenReader.read(new FileReader(f)); + model.setPomFile(f); + return model; + } }