You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ma...@apache.org on 2023/06/21 13:53:41 UTC

[camel-karavan] branch main updated: First prototype for #804

This is an automated email from the ASF dual-hosted git repository.

marat pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel-karavan.git


The following commit(s) were added to refs/heads/main by this push:
     new f4b6c7a2 First prototype for #804
f4b6c7a2 is described below

commit f4b6c7a206afb5a062f5c8b1e112b68290c3a61a
Author: Marat Gubaidullin <ma...@gmail.com>
AuthorDate: Wed Jun 21 09:53:30 2023 -0400

    First prototype for #804
---
 .../camel/karavan/service/KubernetesService.java   |  12 ++-
 .../org/apache/camel/karavan/cli/CommandUtils.java |   9 +-
 .../org/apache/camel/karavan/cli/KaravanCli.java   |   6 +-
 .../apache/camel/karavan/cli/KaravanConfig.java    |  12 ++-
 .../karavan/cli/resources/KaravanConfigMap.java    |  67 +++++++++++++
 .../apache/camel/karavan/cli/resources/Nexus.java  | 111 +++++++++++++++++++++
 karavan-cli/src/main/resources/settings.xml        |  10 ++
 7 files changed, 220 insertions(+), 7 deletions(-)

diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/KubernetesService.java b/karavan-app/src/main/java/org/apache/camel/karavan/service/KubernetesService.java
index 6d0042c3..50c0fb3d 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/service/KubernetesService.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/service/KubernetesService.java
@@ -391,7 +391,7 @@ public class KubernetesService implements HealthCheck{
             ProjectFile properties = infinispanService.getProjectFile(project.getProjectId(), APPLICATION_PROPERTIES_FILENAME);
             Map<String,String> containerResources = ServiceUtil
                     .getRunnerContainerResourcesMap(properties, isOpenshift(), project.getRuntime().equals("quarkus"));
-            Pod pod = getPod(project.getProjectId(), runnerName, containerResources);
+            Pod pod = getRunnerPod(project.getProjectId(), runnerName, containerResources);
             Pod result = kubernetesClient().resource(pod).createOrReplace();
             LOGGER.info("Created pod " + result.getMetadata().getName());
         }
@@ -421,7 +421,7 @@ public class KubernetesService implements HealthCheck{
                 .build();
     }
 
-    private Pod getPod(String projectId, String name, Map<String,String> containerResources) {
+    private Pod getRunnerPod(String projectId, String name, Map<String,String> containerResources) {
         Map<String,String> labels = new HashMap<>();
         labels.putAll(getRuntimeLabels());
         labels.putAll(getKaravanRunnerLabels(name));
@@ -448,7 +448,9 @@ public class KubernetesService implements HealthCheck{
                 .withResources(resources)
                 .withImagePullPolicy("Always")
                 .withVolumeMounts(
-                        new VolumeMountBuilder().withName(name).withMountPath("/karavan/.jbang/cache").build())
+                        new VolumeMountBuilder().withName("maven-settings")
+                                .withMountPath("/karavan/maven-settings.xml")
+                                .withSubPath("maven-settings").build())
                 .build();
 
         PodSpec spec = new PodSpecBuilder()
@@ -456,7 +458,9 @@ public class KubernetesService implements HealthCheck{
                 .withContainers(container)
                 .withRestartPolicy("Never")
                 .withVolumes(
-                        new VolumeBuilder().withName(name).withNewPersistentVolumeClaim(name, false).build())
+                        new VolumeBuilder().withName("maven-settings")
+                                .withConfigMap(new ConfigMapVolumeSourceBuilder()
+                                        .withName("maven-settings").build()).build())
                 .build();
 
         return new PodBuilder()
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/CommandUtils.java b/karavan-cli/src/main/java/org/apache/camel/karavan/cli/CommandUtils.java
index c465f48b..53b10eef 100644
--- a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/CommandUtils.java
+++ b/karavan-cli/src/main/java/org/apache/camel/karavan/cli/CommandUtils.java
@@ -87,7 +87,14 @@ public class CommandUtils {
             log("Karavan secrets found");
         }
 
-        // Create service accounts
+        // Create Nexus Proxy
+        if (config.isNexusProxy()) {
+            createOrReplace(Nexus.getDeployment(config), client);
+            createOrReplace(Nexus.getService(config), client);
+        }
+        // Create ConfigMap
+        createOrReplace(KaravanConfigMap.getConfigMap(config), client);
+        // Create Service Accounts
         createOrReplace(KaravanServiceAccount.getServiceAccount(config), client);
         createOrReplace(KaravanServiceAccount.getServiceAccountPipeline(config), client);
         // Create Roles and role bindings
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanCli.java b/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanCli.java
index 38c3aa8f..a852c8e9 100644
--- a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanCli.java
+++ b/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanCli.java
@@ -65,6 +65,9 @@ public class KaravanCli implements Callable<Integer> {
     @CommandLine.Option(names = {"--image-registry-password"}, description = "Image registry password")
     private String imageRegistryPassword;
 
+    @CommandLine.Option(names = {"--nexus-proxy"}, description = "Deploy nexus proxy")
+    private boolean nexusProxy;
+
     @CommandLine.Option(names = { "-h", "--help" }, usageHelp = true, description = "Display help")
     private boolean helpRequested;
 
@@ -94,7 +97,8 @@ public class KaravanCli implements Callable<Integer> {
                 imageRegistry,
                 imageGroup,
                 imageRegistryUsername,
-                imageRegistryPassword
+                imageRegistryPassword,
+                nexusProxy
         );
         if (yaml) {
             Files.writeString(Path.of(file), ResourceUtils.generateResources(config));
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanConfig.java b/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanConfig.java
index 320e856f..476acf1e 100644
--- a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanConfig.java
+++ b/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanConfig.java
@@ -46,13 +46,14 @@ public class KaravanConfig {
     private String imageGroup;
     private String imageRegistryUsername;
     private String imageRegistryPassword;
+    private boolean nexusProxy;
 
     public KaravanConfig(String version, String namespace, String environment, String runtimes, String auth,
                          int nodePort, int instances, String baseImage, String baseBuilderImage, boolean isOpenShift,
                          Map<String, String> labels, String masterPassword, String oidcSecret, String oidcServerUrl,
                          String oidcFrontendUrl, String gitRepository, String gitUsername, String gitPassword,
                          String gitBranch, String gitPullInterval, String imageRegistry, String imageGroup,
-                         String imageRegistryUsername, String imageRegistryPassword) {
+                         String imageRegistryUsername, String imageRegistryPassword, boolean nexusProxy) {
         this.version = version;
         this.namespace = namespace;
         this.environment = environment;
@@ -77,6 +78,7 @@ public class KaravanConfig {
         this.imageGroup = imageGroup;
         this.imageRegistryUsername = imageRegistryUsername;
         this.imageRegistryPassword = imageRegistryPassword;
+        this.nexusProxy = nexusProxy;
     }
 
     public boolean gitConfigured() {
@@ -291,4 +293,12 @@ public class KaravanConfig {
     public void setImageGroup(String imageGroup) {
         this.imageGroup = imageGroup;
     }
+
+    public boolean isNexusProxy() {
+        return nexusProxy;
+    }
+
+    public void setNexusProxy(boolean nexusProxy) {
+        this.nexusProxy = nexusProxy;
+    }
 }
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanConfigMap.java b/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanConfigMap.java
new file mode 100644
index 00000000..83e8aab6
--- /dev/null
+++ b/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanConfigMap.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.karavan.cli.resources;
+
+import io.fabric8.kubernetes.api.model.ConfigMap;
+import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
+import org.apache.camel.karavan.cli.Constants;
+import org.apache.camel.karavan.cli.KaravanConfig;
+import org.apache.camel.karavan.cli.ResourceUtils;
+
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+public class KaravanConfigMap {
+
+    private static final String MAVEN_URL = "<url>https://repo.maven.apache.org/maven2/</url>";
+
+    public static ConfigMap getConfigMap(KaravanConfig config) {
+
+        String xml = getXml(config);
+
+        return new ConfigMapBuilder()
+                .withNewMetadata()
+                .withName(Constants.NAME)
+                .withNamespace(config.getNamespace())
+                .withLabels(ResourceUtils.getLabels(Constants.NAME, config.getVersion(), Map.of()))
+                .endMetadata()
+                .withData(Map.of("maven-settings", xml))
+                .build();
+    }
+
+    private static String getXml(KaravanConfig config) {
+        try {
+            InputStream inputStream = KaravanConfigMap.class.getResourceAsStream("/settings.xml");
+            return new BufferedReader(new InputStreamReader(inputStream))
+                    .lines()
+                    .map(s -> {
+                        if (config.isNexusProxy() && s.contains("<url>http://nexus.karavan/</url>")) {
+                            String newMavenUrl = "<url>http://nexus." + config.getNamespace() + "/</url>";
+                            return s.replace(MAVEN_URL, newMavenUrl);
+                        } else {
+                            return s;
+                        }
+                    })
+                    .collect(Collectors.joining(System.getProperty("line.separator")));
+        } catch (Exception e) {
+            return null;
+        }
+    }
+}
diff --git a/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/Nexus.java b/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/Nexus.java
new file mode 100644
index 00000000..cb4aaecb
--- /dev/null
+++ b/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/Nexus.java
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.karavan.cli.resources;
+
+import io.fabric8.kubernetes.api.model.*;
+import io.fabric8.kubernetes.api.model.apps.Deployment;
+import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;
+import org.apache.camel.karavan.cli.Constants;
+import org.apache.camel.karavan.cli.KaravanConfig;
+
+import java.util.Map;
+
+public class Nexus {
+
+    public static final String NEXUS_NAME = "nexus";
+    public static final String NEXUS_IMAGE = "sonatype/nexus3";
+    public static final String NEXUS_DATA = "nexus-data";
+    public static final int NEXUS_PORT = 8081;
+
+    public static Service getService(KaravanConfig config) {
+
+        ServicePortBuilder portBuilder = new ServicePortBuilder()
+                .withPort(80)
+                .withProtocol("TCP")
+                .withTargetPort(new IntOrString(NEXUS_PORT));
+
+        return new ServiceBuilder()
+                .withNewMetadata()
+                .withName(NEXUS_NAME)
+                .withNamespace(config.getNamespace())
+                .endMetadata()
+                .withNewSpec()
+                .withSelector(Map.of("app", NEXUS_NAME))
+                .withPorts(portBuilder.build())
+                .endSpec()
+                .build();
+    }
+
+    public static Deployment getDeployment (KaravanConfig config) {
+        return new DeploymentBuilder()
+                .withNewMetadata()
+                .withName(NEXUS_NAME)
+                .withNamespace(config.getNamespace())
+                .endMetadata()
+
+                .withNewSpec()
+                .withNewSelector()
+                .addToMatchLabels(Map.of("app", NEXUS_NAME))
+                .endSelector()
+
+                .withNewTemplate()
+                .withNewMetadata()
+                .addToLabels(Map.of("app", NEXUS_NAME))
+                .endMetadata()
+
+                .withNewSpec()
+                    .addNewContainer()
+                        .withName(NEXUS_NAME)
+                        .withImage(NEXUS_IMAGE)
+                        .withImagePullPolicy("Always")
+                        .addNewPort()
+                            .withContainerPort(NEXUS_PORT)
+                            .withName("8081-tcp")
+                        .endPort()
+                        .withVolumeMounts(
+                                new VolumeMountBuilder().withName(NEXUS_DATA).withMountPath("/" + NEXUS_DATA).build()
+                        )
+                    .withLivenessProbe(
+                            new ProbeBuilder()
+                                    .withHttpGet(new HTTPGetActionBuilder()
+                                            .withPath("/service/rest/v1/status")
+                                            .withPort(new IntOrString(NEXUS_PORT))
+                                            .build())
+                                    .withInitialDelaySeconds(90)
+                                    .withPeriodSeconds(3)
+                                    .build())
+                    .withReadinessProbe(
+                            new ProbeBuilder()
+                                    .withHttpGet(new HTTPGetActionBuilder()
+                                            .withPath("/service/rest/v1/status")
+                                            .withPort(new IntOrString(NEXUS_PORT))
+                                            .build())
+                                    .withInitialDelaySeconds(90)
+                                    .withPeriodSeconds(3)
+                                    .build())
+                    .endContainer()
+                .withServiceAccount(Constants.NAME)
+                .withVolumes(
+                        new VolumeBuilder().withName(NEXUS_DATA).withEmptyDir(new EmptyDirVolumeSource()).build()
+                )
+                .endSpec()
+                .endTemplate()
+                .endSpec()
+                .build();
+    }
+
+}
diff --git a/karavan-cli/src/main/resources/settings.xml b/karavan-cli/src/main/resources/settings.xml
new file mode 100644
index 00000000..9acf76d3
--- /dev/null
+++ b/karavan-cli/src/main/resources/settings.xml
@@ -0,0 +1,10 @@
+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
+    <mirrors>
+        <mirror>
+            <id>karavan-maven-repository-manager</id>
+            <name>Maven Repository Manager</name>
+            <url>https://repo.maven.apache.org/maven2/</url>
+            <mirrorOf>*</mirrorOf>
+        </mirror>
+    </mirrors>
+</settings>
\ No newline at end of file