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 2024/10/24 13:02:35 UTC

(camel-karavan) branch main updated (c577c880 -> 051d8dd8)

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

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


    from c577c880 Fix #1443
     new 1be80ca4 Project Improvements
     new 9f9715f9 Kubernetes Improvements
     new fa5528fa Docker Improvements
     new f183adf3 Git Improvements
     new 16f2ac34 Camel Statuses Improvements
     new c947dc41 Camel Statuses Improvements
     new 4b9918c2 API Resources Improvements
     new 2382e1df Container Type Improvements
     new 051d8dd8 Karavan Improvements

The 9 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../org/apache/camel/karavan/KaravanCache.java     |  10 +-
 .../org/apache/camel/karavan/KaravanEvents.java    |   2 +
 .../apache/camel/karavan/KaravanStartupLoader.java |  30 ++++
 .../camel/karavan/api/AbstractApiResource.java     |   7 +-
 .../camel/karavan/api/ContainerResource.java       |  18 +-
 .../apache/camel/karavan/api/DevModeResource.java  |   4 +-
 .../camel/karavan/api/InfrastructureResource.java  |  12 +-
 .../camel/karavan/api/MetadataResources.java       |   7 +
 .../camel/karavan/api/ProjectFileResource.java     |  24 ++-
 .../apache/camel/karavan/api/ProjectResource.java  |   6 +-
 .../apache/camel/karavan/api/StatusResource.java   |  13 +-
 .../camel/karavan/docker/DockerEventHandler.java   |   4 +-
 .../camel/karavan/docker/DockerForKaravan.java     |  33 ++--
 .../apache/camel/karavan/docker/DockerService.java |  12 +-
 .../apache/camel/karavan/docker/DockerUtils.java   |  30 ++--
 .../karavan/kubernetes/DeploymentEventHandler.java |  18 +-
 .../karavan/kubernetes/KubernetesService.java      | 187 ++++++++++++++++++---
 .../kubernetes/KubernetesStatusService.java        |   6 +-
 .../camel/karavan/kubernetes/PodEventHandler.java  |  12 +-
 .../karavan/kubernetes/ServiceEventHandler.java    |   6 +-
 .../karavan/listener/CamelReloadListener.java      |  20 +--
 .../karavan/listener/CamelStatusListener.java      |  12 +-
 .../KubernetesCommandListener.java}                |  25 ++-
 .../listener/PodContainerCommandListener.java      |   5 +-
 .../apache/camel/karavan/model/ContainerType.java  |  15 +-
 .../camel/karavan/model/DeploymentStatus.java      |  14 +-
 .../camel/karavan/model/KubernetesConfigMap.java   |  33 ++++
 .../camel/karavan/model/KubernetesSecret.java      |  33 ++++
 .../camel/karavan/model/PodContainerStatus.java    |  40 +++--
 .../org/apache/camel/karavan/model/Project.java    |   1 +
 .../apache/camel/karavan/model/ProjectCommit.java  |  90 ++++++++++
 ...StatusValue.java => ProjectFileCommitDiff.java} |  46 +++--
 .../karavan/scheduler/CamelStatusScheduler.java    |   9 +-
 .../karavan/scheduler/DockerStatusScheduler.java   |   4 +-
 .../apache/camel/karavan/service/CodeService.java  |  22 ++-
 .../apache/camel/karavan/service/GitService.java   |  88 +++++++++-
 .../camel/karavan/service/ProjectService.java      |  16 +-
 .../main/webui/src/config/ConfigurationPage.tsx    |   6 -
 38 files changed, 711 insertions(+), 209 deletions(-)
 copy karavan-app/src/main/java/org/apache/camel/karavan/{scheduler/NotificationPingScheduler.java => listener/KubernetesCommandListener.java} (58%)
 copy karavan-vscode/webview/vscode.ts => karavan-app/src/main/java/org/apache/camel/karavan/model/ContainerType.java (84%)
 create mode 100644 karavan-app/src/main/java/org/apache/camel/karavan/model/KubernetesConfigMap.java
 create mode 100644 karavan-app/src/main/java/org/apache/camel/karavan/model/KubernetesSecret.java
 create mode 100644 karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectCommit.java
 copy karavan-app/src/main/java/org/apache/camel/karavan/model/{CamelStatusValue.java => ProjectFileCommitDiff.java} (58%)


(camel-karavan) 03/09: Docker Improvements

Posted by ma...@apache.org.
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

commit fa5528fad4a8f40af80328c2d38e6c2f3a6a16bb
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Thu Oct 24 09:00:27 2024 -0400

    Docker Improvements
---
 .../camel/karavan/docker/DockerEventHandler.java   |  4 +--
 .../camel/karavan/docker/DockerForKaravan.java     | 33 +++++++++++++---------
 .../apache/camel/karavan/docker/DockerService.java | 12 ++++----
 .../apache/camel/karavan/docker/DockerUtils.java   | 30 ++++++++++----------
 .../karavan/scheduler/DockerStatusScheduler.java   |  4 +--
 5 files changed, 44 insertions(+), 39 deletions(-)

diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventHandler.java b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventHandler.java
index cdda60df..f368a42f 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventHandler.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventHandler.java
@@ -25,7 +25,7 @@ import io.vertx.core.json.JsonObject;
 import io.vertx.mutiny.core.eventbus.EventBus;
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
-import org.apache.camel.karavan.model.PodContainerStatus;
+import org.apache.camel.karavan.model.ContainerType;
 import org.apache.camel.karavan.service.RegistryService;
 import org.jboss.logging.Logger;
 
@@ -71,7 +71,7 @@ public class DockerEventHandler implements ResultCallback<Event> {
 
     public void onContainerEvent(Event event, Container container) throws InterruptedException {
         if ("exited".equalsIgnoreCase(container.getState())
-                && Objects.equals(container.getLabels().get(LABEL_TYPE), PodContainerStatus.ContainerType.build.name())) {
+                && Objects.equals(container.getLabels().get(LABEL_TYPE), ContainerType.build.name())) {
             String tag = container.getLabels().get(LABEL_TAG);
             String projectId = container.getLabels().get(LABEL_PROJECT_ID);
             syncImage(projectId, tag);
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java
index a1804dd9..22f6b319 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java
@@ -22,14 +22,14 @@ import com.github.dockerjava.api.model.MountType;
 import com.github.dockerjava.api.model.RestartPolicy;
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
-import org.apache.camel.karavan.model.*;
+import org.apache.camel.karavan.model.ContainerType;
+import org.apache.camel.karavan.model.DockerComposeService;
+import org.apache.camel.karavan.model.DockerComposeVolume;
+import org.apache.camel.karavan.model.Project;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.jboss.logging.Logger;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
+import java.util.*;
 
 import static org.apache.camel.karavan.KaravanConstants.*;
 import static org.apache.camel.karavan.service.CodeService.BUILD_SCRIPT_FILENAME;
@@ -49,21 +49,21 @@ public class DockerForKaravan {
     DockerService dockerService;
 
     public void runProjectInDevMode(String projectId, String jBangOptions, DockerComposeService composeService,
-                                    Map<String, String> files, String projectDevmodeImage) throws Exception {
-        Container c = createDevmodeContainer(projectId, jBangOptions, composeService, projectDevmodeImage);
+                                    Map<String, String> files, String projectDevmodeImage, Map<String, String> labels, Map<String, String> envVars) throws Exception {
+        Container c = createDevmodeContainer(projectId, jBangOptions, composeService, projectDevmodeImage, labels, envVars);
         dockerService.runContainer(projectId);
         dockerService.copyFiles(c.getId(), "/karavan/code", files, true);
     }
 
     protected Container createDevmodeContainer(String projectId, String jBangOptions, DockerComposeService compose,
-                                               String projectDevmodeImage) throws InterruptedException {
+                                               String projectDevmodeImage, Map<String, String> labels, Map<String, String> envVars) throws InterruptedException {
         LOGGER.infof("DevMode starting for %s with JBANG_OPTIONS=%s", projectId, jBangOptions);
 
         HealthCheck healthCheck = new HealthCheck().withTest(List.of("CMD", "curl", "-f", "http://localhost:8080/q/dev/health"))
                 .withInterval(10000000000L).withTimeout(10000000000L).withStartPeriod(10000000000L).withRetries(30);
 
         List<String> env = new ArrayList<>(compose.getEnvironmentList());
-
+        envVars.forEach((k,v) -> env.add(k + "=" + v));
         if (jBangOptions != null && !jBangOptions.trim().isEmpty()) {
             env.add(ENV_VAR_JBANG_OPTIONS + "=" + jBangOptions);
         }
@@ -74,13 +74,15 @@ public class DockerForKaravan {
 
         var imageName = projectDevmodeImage != null ? projectDevmodeImage : devmodeImage;
 
+        var containerLabels = new HashMap<>(labels);
+        containerLabels.put(LABEL_TYPE, ContainerType.devmode.name());
+        containerLabels.put(LABEL_PROJECT_ID, projectId);
+        containerLabels.put(LABEL_CAMEL_RUNTIME, CamelRuntime.CAMEL_MAIN.getValue());
+
         return dockerService.createContainer(projectId,
                 (imageName),
                 env, compose.getPortsMap(), healthCheck,
-                Map.of(LABEL_TYPE, PodContainerStatus.ContainerType.devmode.name(),
-                        LABEL_PROJECT_ID, projectId,
-                        LABEL_CAMEL_RUNTIME, CamelRuntime.CAMEL_MAIN.getValue()
-                ),
+                containerLabels,
                 compose.getVolumes(), null, RestartPolicy.noRestart(), DockerService.PULL_IMAGE.ifNotExists,
                 compose.getCpus(), compose.getCpu_percent(), compose.getMem_limit(), compose.getMem_reservation());
     }
@@ -88,6 +90,9 @@ public class DockerForKaravan {
     public void runBuildProject(Project project, String script, DockerComposeService compose, Map<String, String> sshFiles, String tag) throws Exception {
         String containerName = project.getProjectId() + BUILDER_SUFFIX;
         dockerService.deleteContainer(containerName);
+        if (createM2.orElse(false)) {
+            compose.getVolumes().add(new DockerComposeVolume(MountType.VOLUME.name(), project.getProjectId() + "-build-m2-repository", "/karavan/.m2/repository"));
+        }
         Container c = createBuildContainer(containerName, project, compose.getEnvironmentList(), compose.getVolumes(), tag);
         dockerService.copyExecFile(c.getId(), "/karavan/builder", BUILD_SCRIPT_FILENAME, script);
         sshFiles.forEach((name, text) -> {
@@ -102,7 +107,7 @@ public class DockerForKaravan {
         return dockerService.createContainer(containerName, devmodeImage,
                 env, Map.of(), new HealthCheck(),
                 Map.of(
-                        LABEL_TYPE, PodContainerStatus.ContainerType.build.name(),
+                        LABEL_TYPE, ContainerType.build.name(),
                         LABEL_PROJECT_ID, project.getProjectId(),
                         LABEL_TAG, tag
                 ),
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java
index 025077c7..8d944295 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java
@@ -33,9 +33,9 @@ import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.enterprise.event.Observes;
 import jakarta.inject.Inject;
 import org.apache.camel.karavan.model.ContainerImage;
+import org.apache.camel.karavan.model.ContainerType;
 import org.apache.camel.karavan.model.DockerComposeService;
 import org.apache.camel.karavan.model.DockerComposeVolume;
-import org.apache.camel.karavan.model.PodContainerStatus;
 import org.apache.camel.karavan.service.CodeService;
 import org.apache.camel.karavan.service.ConfigService;
 import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
@@ -181,13 +181,13 @@ public class DockerService {
                                      String... command) throws InterruptedException {
         List<Container> containers = findContainer(name);
         if (containers.isEmpty()) {
-            if (Objects.equals(labels.get(LABEL_TYPE), PodContainerStatus.ContainerType.devmode.name())
-                    || Objects.equals(labels.get(LABEL_TYPE), PodContainerStatus.ContainerType.build.name())
-                    || Objects.equals(labels.get(LABEL_TYPE), PodContainerStatus.ContainerType.devservice.name())) {
+            if (Objects.equals(labels.get(LABEL_TYPE), ContainerType.devmode.name())
+                    || Objects.equals(labels.get(LABEL_TYPE), ContainerType.build.name())
+                    || Objects.equals(labels.get(LABEL_TYPE), ContainerType.devservice.name())) {
                 LOGGER.info("Pulling DevMode image from DockerHub: " + image);
                 pullImageFromDockerHub(image, Objects.equals(pullImage, PULL_IMAGE.always));
             }
-            if (Objects.equals(labels.get(LABEL_TYPE), PodContainerStatus.ContainerType.project.name())) {
+            if (Objects.equals(labels.get(LABEL_TYPE), ContainerType.project.name())) {
                 LOGGER.info("Pulling Project image from Registry: " + image);
                 pullImage(image, Objects.equals(pullImage, PULL_IMAGE.always));
             }
@@ -208,7 +208,7 @@ public class DockerService {
                 if (command.length > 0) {
                     createContainerCmd.withCmd(command);
                 }
-                if (Objects.equals(labels.get(LABEL_PROJECT_ID), PodContainerStatus.ContainerType.build.name())) {
+                if (Objects.equals(labels.get(LABEL_PROJECT_ID), ContainerType.build.name())) {
                     mounts.add(new Mount().withType(MountType.BIND).withSource("/var/run/docker.sock").withTarget("/var/run/docker.sock"));
                 }
 
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerUtils.java b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerUtils.java
index a4c71beb..1f85f119 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerUtils.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerUtils.java
@@ -19,6 +19,7 @@ package org.apache.camel.karavan.docker;
 import com.github.dockerjava.api.model.*;
 import io.smallrye.mutiny.tuples.Tuple2;
 import org.apache.camel.karavan.model.ContainerPort;
+import org.apache.camel.karavan.model.ContainerType;
 import org.apache.camel.karavan.model.DockerComposeHealthCheck;
 import org.apache.camel.karavan.model.PodContainerStatus;
 
@@ -96,7 +97,6 @@ public class DockerUtils {
 
     static Ports getPortBindings(Map<Integer, Integer> ports) {
         Ports portBindings = new Ports();
-
         ports.forEach((hostPort, containerPort) -> {
             Ports.Binding binding = Ports.Binding.bindPort(hostPort);
             portBindings.bind(ExposedPort.tcp(containerPort), binding);
@@ -110,12 +110,12 @@ public class DockerUtils {
                 .map(p -> new ContainerPort(p.getPrivatePort(), p.getPublicPort(), p.getType()))
                 .collect(Collectors.toList());
         List<PodContainerStatus.Command> commands = getContainerCommand(container.getState());
-        PodContainerStatus.ContainerType type = getContainerType(container.getLabels());
+        ContainerType type = getContainerType(container.getLabels());
         String created = Instant.ofEpochSecond(container.getCreated()).toString();
         String projectId = container.getLabels().getOrDefault(LABEL_PROJECT_ID, name);
         String camelRuntime = container.getLabels().getOrDefault(LABEL_CAMEL_RUNTIME, "");
         return PodContainerStatus.createWithId(projectId, name, environment, container.getId(), container.getImage(),
-                ports, type, commands, container.getState(), created, camelRuntime);
+                ports, type, commands, container.getState(), created, camelRuntime, container.getLabels());
     }
 
     public static void updateStatistics(PodContainerStatus podContainerStatus, Statistics stats) {
@@ -160,20 +160,20 @@ public class DockerUtils {
         }
     }
 
-    static PodContainerStatus.ContainerType getContainerType(Map<String, String> labels) {
+    static ContainerType getContainerType(Map<String, String> labels) {
         String type = labels.get(LABEL_TYPE);
-        if (Objects.equals(type, PodContainerStatus.ContainerType.devmode.name())) {
-            return PodContainerStatus.ContainerType.devmode;
-        } else if (Objects.equals(type, PodContainerStatus.ContainerType.devservice.name())) {
-            return PodContainerStatus.ContainerType.devservice;
-        } else if (Objects.equals(type, PodContainerStatus.ContainerType.project.name())) {
-            return PodContainerStatus.ContainerType.project;
-        } else if (Objects.equals(type, PodContainerStatus.ContainerType.internal.name())) {
-            return PodContainerStatus.ContainerType.internal;
-        } else if (Objects.equals(type, PodContainerStatus.ContainerType.build.name())) {
-            return PodContainerStatus.ContainerType.build;
+        if (Objects.equals(type, ContainerType.devmode.name())) {
+            return ContainerType.devmode;
+        } else if (Objects.equals(type, ContainerType.devservice.name())) {
+            return ContainerType.devservice;
+        } else if (Objects.equals(type, ContainerType.project.name())) {
+            return ContainerType.project;
+        } else if (Objects.equals(type, ContainerType.internal.name())) {
+            return ContainerType.internal;
+        } else if (Objects.equals(type, ContainerType.build.name())) {
+            return ContainerType.build;
         }
-        return PodContainerStatus.ContainerType.unknown;
+        return ContainerType.unknown;
     }
 
     static List<PodContainerStatus.Command> getContainerCommand(String state) {
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/DockerStatusScheduler.java b/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/DockerStatusScheduler.java
index 2de5ed0a..94788ad5 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/DockerStatusScheduler.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/DockerStatusScheduler.java
@@ -46,7 +46,7 @@ public class DockerStatusScheduler {
     @Inject
     EventBus eventBus;
 
-    @Scheduled(every = "{karavan.container.statistics.interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
+    @Scheduled(every = "{karavan.container.statistics.interval:off}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
     void collectContainersStatistics() {
         if (!ConfigService.inKubernetes()) {
             List<PodContainerStatus> statusesInDocker = getContainersStatuses();
@@ -56,7 +56,7 @@ public class DockerStatusScheduler {
         }
     }
 
-    @Scheduled(every = "{karavan.container.status.interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
+    @Scheduled(every = "{karavan.container.status.interval:off}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
     void collectContainersStatuses() {
         if (!ConfigService.inKubernetes()) {
             List<PodContainerStatus> statusesInDocker = getContainersStatuses();


(camel-karavan) 06/09: Camel Statuses Improvements

Posted by ma...@apache.org.
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

commit c947dc41ba5ace97539d48ee718947e9e2621b66
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Thu Oct 24 09:01:10 2024 -0400

    Camel Statuses Improvements
---
 karavan-app/src/main/webui/src/config/ConfigurationPage.tsx | 6 ------
 1 file changed, 6 deletions(-)

diff --git a/karavan-app/src/main/webui/src/config/ConfigurationPage.tsx b/karavan-app/src/main/webui/src/config/ConfigurationPage.tsx
index f7711754..18bd909c 100644
--- a/karavan-app/src/main/webui/src/config/ConfigurationPage.tsx
+++ b/karavan-app/src/main/webui/src/config/ConfigurationPage.tsx
@@ -56,12 +56,6 @@ export const ConfigurationPage = (props: Props) => {
                         Cleanup statuses
                     </Button>
                 </ToolbarItem>}
-                {tab === 'secrets' && <ToolbarItem>
-                    <Button>Add Secret</Button>
-                </ToolbarItem>}
-                {tab === 'configMaps' && <ToolbarItem>
-                    <Button>Add ConfigMap</Button>
-                </ToolbarItem>}
             </ToolbarContent>
         </Toolbar>);
     }


(camel-karavan) 05/09: Camel Statuses Improvements

Posted by ma...@apache.org.
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

commit 16f2ac345c5b9f51900f617ef382552e083ce9f0
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Thu Oct 24 09:01:00 2024 -0400

    Camel Statuses Improvements
---
 .../camel/karavan/listener/CamelReloadListener.java  | 20 ++++++++++----------
 .../camel/karavan/listener/CamelStatusListener.java  | 12 +++++++-----
 .../karavan/scheduler/CamelStatusScheduler.java      |  9 ++++-----
 3 files changed, 21 insertions(+), 20 deletions(-)

diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/listener/CamelReloadListener.java b/karavan-app/src/main/java/org/apache/camel/karavan/listener/CamelReloadListener.java
index ebf16525..ec12d275 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/listener/CamelReloadListener.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/listener/CamelReloadListener.java
@@ -123,16 +123,16 @@ public class CamelReloadListener {
     }
 
      String getContainerAddressForReload(PodContainerStatus podContainerStatus) throws Exception {
-        if (ConfigService.inKubernetes()) {
-            return "http://" + podContainerStatus.getProjectId() + "." + kubernetesService.getNamespace();
-        } else if (ConfigService.inDocker()) {
-            return "http://" + podContainerStatus.getProjectId() + ":8080";
-        } else if (podContainerStatus.getPorts() != null && !podContainerStatus.getPorts().isEmpty()) {
-            Integer port = podContainerStatus.getPorts().get(0).getPublicPort();
-            if (port != null) {
-                return "http://localhost:" + port;
-            }
-        }
+         if (ConfigService.inKubernetes()) {
+             return "http://" + podContainerStatus.getPodIP() + ":8080";
+         } else if (ConfigService.inDocker()) {
+             return "http://" + podContainerStatus.getContainerName() + ":8080";
+         } else if (podContainerStatus.getPorts() != null && !podContainerStatus.getPorts().isEmpty()) {
+             Integer port = podContainerStatus.getPorts().get(0).getPublicPort();
+             if (port != null) {
+                 return "http://localhost:" + port;
+             }
+         }
         throw new Exception("No port configured for project " + podContainerStatus.getContainerName());
     }
 
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/listener/CamelStatusListener.java b/karavan-app/src/main/java/org/apache/camel/karavan/listener/CamelStatusListener.java
index 354ee6bd..d50c8d5b 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/listener/CamelStatusListener.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/listener/CamelStatusListener.java
@@ -37,6 +37,7 @@ import org.jboss.logging.Logger;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 import java.util.concurrent.ExecutionException;
 
 import static org.apache.camel.karavan.KaravanEvents.CMD_COLLECT_CAMEL_STATUS;
@@ -82,7 +83,7 @@ public class CamelStatusListener {
             CamelStatus cs = new CamelStatus(projectId, containerName, statuses, environment);
             karavanCache.saveCamelStatus(cs);
         } catch (Exception ex) {
-            LOGGER.error("collectCamelStatuses " + (ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage()));
+//            LOGGER.warn("collectCamelStatuses " + (ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage()));
         }
     }
 
@@ -101,11 +102,13 @@ public class CamelStatusListener {
     }
 
     public String getCamelStatus(PodContainerStatus podContainerStatus, CamelStatusValue.Name statusName) throws Exception {
-        String url = getContainerAddressForStatus(podContainerStatus) + "/q/dev/" + statusName.name();
+        var name = statusName.name();
+        var path = "/q/dev/" + name + (Objects.equals(name, "trace") ? "?dump=true" : "");
+        String url = getContainerAddressForStatus(podContainerStatus) + path;
         try {
             return getResult(url, 500);
         } catch (InterruptedException | ExecutionException ex) {
-            LOGGER.error("getCamelStatus " + (ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage()));
+//            LOGGER.warn("getCamelStatus " + (ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage()));
         }
         return null;
     }
@@ -120,8 +123,7 @@ public class CamelStatusListener {
                 return res.encodePrettily();
             }
         } catch (Exception ex) {
-            LOGGER.error("getResult " + url);
-            LOGGER.error("getResult " + (ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage()));
+//            LOGGER.warn("getResult " + (ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage()));
         }
         return null;
     }
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/CamelStatusScheduler.java b/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/CamelStatusScheduler.java
index 2f0b6ff6..552e91a9 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/CamelStatusScheduler.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/CamelStatusScheduler.java
@@ -24,13 +24,14 @@ import jakarta.inject.Inject;
 import org.apache.camel.karavan.KaravanCache;
 import org.apache.camel.karavan.KaravanConstants;
 import org.apache.camel.karavan.model.CamelStatusRequest;
-import org.apache.camel.karavan.model.PodContainerStatus;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.jboss.logging.Logger;
 
 import java.util.Map;
 import java.util.Objects;
 
+import static org.apache.camel.karavan.KaravanConstants.CAMEL_PREFIX;
+import static org.apache.camel.karavan.KaravanConstants.LABEL_KUBERNETES_RUNTIME;
 import static org.apache.camel.karavan.KaravanEvents.CMD_COLLECT_CAMEL_STATUS;
 
 @ApplicationScoped
@@ -51,10 +52,8 @@ public class CamelStatusScheduler {
     public void collectCamelStatuses() {
         LOGGER.debug("Collect Camel Statuses");
         karavanCache.getPodContainerStatuses(environment).stream()
-                .filter(cs ->
-                        cs.getType() == PodContainerStatus.ContainerType.project
-                                || cs.getType() == PodContainerStatus.ContainerType.devmode
-                ).filter(cs -> Objects.equals(cs.getCamelRuntime(), KaravanConstants.CamelRuntime.CAMEL_MAIN.getValue()))
+                .filter(cs -> Objects.equals(cs.getLabels().get(LABEL_KUBERNETES_RUNTIME), CAMEL_PREFIX))
+                .filter(cs -> Objects.equals(cs.getCamelRuntime(), KaravanConstants.CamelRuntime.CAMEL_MAIN.getValue()))
                 .forEach(cs -> {
                     CamelStatusRequest csr = new CamelStatusRequest(cs.getProjectId(), cs.getContainerName());
                     eventBus.publish(CMD_COLLECT_CAMEL_STATUS,


(camel-karavan) 09/09: Karavan Improvements

Posted by ma...@apache.org.
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

commit 051d8dd838b9218025d30e8934900eceff16f985
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Thu Oct 24 09:02:28 2024 -0400

    Karavan Improvements
---
 .../org/apache/camel/karavan/KaravanCache.java     | 10 +++++---
 .../org/apache/camel/karavan/KaravanEvents.java    |  2 ++
 .../apache/camel/karavan/KaravanStartupLoader.java | 30 ++++++++++++++++++++++
 3 files changed, 39 insertions(+), 3 deletions(-)

diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanCache.java b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanCache.java
index 4a355245..94d60d9d 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanCache.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanCache.java
@@ -294,13 +294,17 @@ public class KaravanCache {
         return camelStatuses.get(key);
     }
 
-    public List<CamelStatus> getCamelStatusesByEnv(CamelStatusValue.Name name) {
+    public List<CamelStatus> getCamelStatusesByName(CamelStatusValue.Name name) {
         return getCopyCamelStatuses().stream().peek(cs -> {
             var values = cs.getStatuses();
             cs.setStatuses(values.stream().filter(v -> Objects.equals(v.getName(), name)).toList());
         }).toList();
     }
 
+    public List<CamelStatus> getCamelAllStatuses() {
+        return getCopyCamelStatuses();
+    }
+
     public List<CamelStatus> getCamelStatusesByProjectAndEnv(String projectId, String env) {
         return getCopyCamelStatuses().stream().filter(el -> Objects.equals(el.getProjectId(), projectId) && Objects.equals(el.getEnv(), env)).toList();
     }
@@ -328,11 +332,11 @@ public class KaravanCache {
     }
 
     public List<PodContainerStatus> getLoadedDevModeStatuses() {
-        return getCopyPodContainerStatuses().stream().filter(el -> Objects.equals(el.getType(), PodContainerStatus.ContainerType.devmode) && Objects.equals(el.getCodeLoaded(), true)).toList();
+        return getCopyPodContainerStatuses().stream().filter(el -> Objects.equals(el.getType(), ContainerType.devmode) && Objects.equals(el.getCodeLoaded(), true)).toList();
     }
 
     public List<PodContainerStatus> getDevModeStatuses() {
-        return getCopyPodContainerStatuses().stream().filter(el -> Objects.equals(el.getType(), PodContainerStatus.ContainerType.devmode)).toList();
+        return getCopyPodContainerStatuses().stream().filter(el -> Objects.equals(el.getType(), ContainerType.devmode)).toList();
     }
 
     public List<PodContainerStatus> getContainerStatusByEnv(String env) {
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanEvents.java b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanEvents.java
index f2fa16d7..7c3e8fe1 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanEvents.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanEvents.java
@@ -42,6 +42,8 @@ public class KaravanEvents {
     public static final String CMD_RELOAD_PROJECT_CODE = "CMD_RELOAD_PROJECT_CODE";
     public static final String CMD_DELETE_CONTAINER = "CMD_DELETE_CONTAINER";
 
+    public static final String CMD_RESTART_INFORMERS = "CMD_RESTART_INFORMERS";
+
     public static final String POD_CONTAINER_UPDATED = "POD_CONTAINER_UPDATED";
     public static final String POD_CONTAINER_DELETED = "POD_CONTAINER_DELETED";
 
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanStartupLoader.java b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanStartupLoader.java
index 5b760eff..b59787cf 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanStartupLoader.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanStartupLoader.java
@@ -107,6 +107,7 @@ public class KaravanStartupLoader implements HealthCheck {
                 addKameletsProject();
                 addTemplatesProject();
                 addConfigurationProject();
+                addServicesProject();
             }
             ready.set(true);
         } else {
@@ -128,6 +129,8 @@ public class KaravanStartupLoader implements HealthCheck {
                     project = new Project(Project.Type.kamelets.name(), "Custom Kamelets", repo.getCommitId(), repo.getLastCommitTimestamp(), Project.Type.kamelets);
                 } else if (folderName.equals(Project.Type.configuration.name())) {
                     project = new Project(Project.Type.configuration.name(), "Configuration", repo.getCommitId(), repo.getLastCommitTimestamp(), Project.Type.configuration);
+                } else if (folderName.equals(Project.Type.services.name())) {
+                    project = new Project(Project.Type.services.name(), "Dev Services", repo.getCommitId(), repo.getLastCommitTimestamp(), Project.Type.services);
                 } else {
                     project = projectService.getProjectFromRepo(repo);
                 }
@@ -209,4 +212,31 @@ public class KaravanStartupLoader implements HealthCheck {
             LOGGER.error("Error during configuration project creation", e);
         }
     }
+
+    void addServicesProject() {
+        try {
+            Project services = karavanCache.getProject(Project.Type.services.name());
+            if (services == null) {
+                LOGGER.info("Add dev services project");
+                services = new Project(Project.Type.services.name(), "Dev services", "", Instant.now().toEpochMilli(), Project.Type.services);
+                karavanCache.saveProject(services, true);
+
+                codeService.getDevServicesFiles().forEach((name, value) -> {
+                    ProjectFile file = new ProjectFile(name, value, Project.Type.services.name(), Instant.now().toEpochMilli());
+                    karavanCache.saveProjectFile(file, false, true);
+                });
+            } else {
+                codeService.getDevServicesFiles().forEach((name, value) -> {
+                    ProjectFile f = karavanCache.getProjectFile(Project.Type.services.name(), name);
+                    if (f == null) {
+                        LOGGER.info("Add new service " + name);
+                        ProjectFile file = new ProjectFile(name, value, Project.Type.services.name(), Instant.now().toEpochMilli());
+                        karavanCache.saveProjectFile(file, false, true);
+                    }
+                });
+            }
+        } catch (Exception e) {
+            LOGGER.error("Error during services project creation", e);
+        }
+    }
 }


(camel-karavan) 07/09: API Resources Improvements

Posted by ma...@apache.org.
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

commit 4b9918c221f1713be026b5d207347ff6e3062cfa
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Thu Oct 24 09:01:57 2024 -0400

    API Resources Improvements
---
 .../apache/camel/karavan/api/AbstractApiResource.java  |  7 +++++--
 .../apache/camel/karavan/api/ContainerResource.java    | 18 +++++++++---------
 .../org/apache/camel/karavan/api/DevModeResource.java  |  4 +++-
 .../camel/karavan/api/InfrastructureResource.java      | 12 ++++++++----
 .../apache/camel/karavan/api/MetadataResources.java    |  7 +++++++
 .../org/apache/camel/karavan/api/StatusResource.java   | 13 ++++++++++---
 6 files changed, 42 insertions(+), 19 deletions(-)

diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/AbstractApiResource.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/AbstractApiResource.java
index 631171fe..650b3e91 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/api/AbstractApiResource.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/AbstractApiResource.java
@@ -35,12 +35,15 @@ public class AbstractApiResource {
     public HashMap<String, String> getIdentity(SecurityContext securityContext) {
         var identity = new HashMap<String, String>();
         identity.put("email", "karavan@test.org");
+        identity.put("name", "karavan");
 
         if (securityContext != null && securityContext.getUserPrincipal() != null && securityContext.getUserPrincipal() instanceof DefaultJWTCallerPrincipal principal) {
-            identity.put("name", principal.getName());
+            if (principal.getName() != null) {
+                identity.put("name", principal.getName());
+            }
             identity.put("email", principal.getClaim(Claims.email));
         } else if (securityIdentity != null) {
-            if (securityIdentity.getPrincipal() != null) {
+            if (securityIdentity.getPrincipal() != null && securityIdentity.getPrincipal().getName() != null) {
                 identity.put("name", securityIdentity.getPrincipal().getName());
             }
             if (securityIdentity.getAttributes().get("email") != null && !securityIdentity.getAttributes().get("email").toString().isBlank()) {
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java
index af7b6533..84b45ea4 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java
@@ -29,6 +29,7 @@ import org.apache.camel.karavan.KaravanConstants;
 import org.apache.camel.karavan.docker.DockerComposeConverter;
 import org.apache.camel.karavan.docker.DockerService;
 import org.apache.camel.karavan.kubernetes.KubernetesService;
+import org.apache.camel.karavan.model.ContainerType;
 import org.apache.camel.karavan.model.DockerComposeService;
 import org.apache.camel.karavan.model.PodContainerStatus;
 import org.apache.camel.karavan.service.ConfigService;
@@ -112,29 +113,28 @@ public class ContainerResource {
         }
     }
 
-    private void deployContainer(String projectId, String type, JsonObject command) throws InterruptedException {
-        if (Objects.equals(type, PodContainerStatus.ContainerType.devservice.name())) {
-            String code = projectService.getDevServiceCode();
+    public void deployContainer(String projectId, String type, JsonObject command) throws InterruptedException {
+        if (Objects.equals(type, ContainerType.devservice.name())) {
+            String code = projectService.getDockerDevServiceCode();
             DockerComposeService dockerComposeService = DockerComposeConverter.fromCode(code, projectId);
             if (dockerComposeService != null) {
                 Map<String, String> labels = new HashMap<>();
-                labels.put(LABEL_TYPE, PodContainerStatus.ContainerType.devservice.name());
-                labels.put(LABEL_CAMEL_RUNTIME, CamelRuntime.CAMEL_MAIN.getValue());
+                labels.put(LABEL_TYPE, ContainerType.devservice.name());
                 labels.put(LABEL_PROJECT_ID, projectId);
                 dockerService.createContainerFromCompose(dockerComposeService, labels, needPull(command));
                 dockerService.runContainer(dockerComposeService.getContainer_name());
             }
-        } else if (Objects.equals(type, PodContainerStatus.ContainerType.project.name())) {
+        } else if (Objects.equals(type, ContainerType.project.name())) {
             DockerComposeService dockerComposeService = projectService.getProjectDockerComposeService(projectId);
             if (dockerComposeService != null) {
                 Map<String, String> labels = new HashMap<>();
-                labels.put(LABEL_TYPE, PodContainerStatus.ContainerType.project.name());
+                labels.put(LABEL_TYPE, ContainerType.project.name());
                 labels.put(LABEL_CAMEL_RUNTIME, CamelRuntime.CAMEL_MAIN.getValue());
                 labels.put(LABEL_PROJECT_ID, projectId);
                 dockerService.createContainerFromCompose(dockerComposeService, labels, needPull(command));
                 dockerService.runContainer(dockerComposeService.getContainer_name());
             }
-        } else if (Objects.equals(type, PodContainerStatus.ContainerType.devmode.name())) {
+        } else if (Objects.equals(type, ContainerType.devmode.name())) {
 //                        TODO: merge with DevMode service
 //                        dockerForKaravan.createDevmodeContainer(name, "");
 //                        dockerService.runContainer(name);
@@ -151,7 +151,7 @@ public class ContainerResource {
     private void setContainerStatusTransit(String projectId, String name, String type) {
         PodContainerStatus status = karavanCache.getPodContainerStatus(projectId, environment, name);
         if (status == null) {
-            status = PodContainerStatus.createByType(projectId, environment, PodContainerStatus.ContainerType.valueOf(type));
+            status = PodContainerStatus.createByType(projectId, environment, ContainerType.valueOf(type));
         }
         status.setInTransit(true);
         eventBus.publish(POD_CONTAINER_UPDATED, JsonObject.mapFrom(status));
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java
index 0f894c4b..2fac96a2 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java
@@ -29,6 +29,8 @@ import org.apache.camel.karavan.service.ProjectService;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.jboss.logging.Logger;
 
+import java.util.Map;
+
 import static org.apache.camel.karavan.KaravanEvents.CMD_DELETE_CONTAINER;
 import static org.apache.camel.karavan.KaravanEvents.CMD_RELOAD_PROJECT_CODE;
 
@@ -55,7 +57,7 @@ public class DevModeResource {
     @Path("/{jBangOptions}")
     public Response runProjectWithJBangOptions(Project project, @PathParam("jBangOptions") String jBangOptions) {
         try {
-            String containerName = projectService.runProjectWithJBangOptions(project, jBangOptions);
+            String containerName = projectService.runProjectWithJBangOptions(project, jBangOptions, Map.of(), Map.of());
             if (containerName != null) {
                 return Response.ok(containerName).build();
             } else {
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/InfrastructureResource.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/InfrastructureResource.java
index 9b89294c..862ec999 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/api/InfrastructureResource.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/InfrastructureResource.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.karavan.api;
 
+import io.vertx.core.eventbus.EventBus;
 import jakarta.inject.Inject;
 import jakarta.ws.rs.*;
 import jakarta.ws.rs.core.MediaType;
@@ -23,7 +24,7 @@ import jakarta.ws.rs.core.Response;
 import org.apache.camel.karavan.KaravanCache;
 import org.apache.camel.karavan.KaravanConstants;
 import org.apache.camel.karavan.kubernetes.KubernetesService;
-import org.apache.camel.karavan.kubernetes.KubernetesStatusService;
+import org.apache.camel.karavan.model.ContainerType;
 import org.apache.camel.karavan.model.DeploymentStatus;
 import org.apache.camel.karavan.model.ProjectFile;
 import org.apache.camel.karavan.model.ServiceStatus;
@@ -33,10 +34,13 @@ import org.jboss.logging.Logger;
 
 import java.util.Comparator;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.stream.Collectors;
 
 import static org.apache.camel.karavan.KaravanConstants.KUBERNETES_YAML_FILENAME;
+import static org.apache.camel.karavan.KaravanConstants.LABEL_TYPE;
+import static org.apache.camel.karavan.KaravanEvents.CMD_RESTART_INFORMERS;
 
 @Path("/ui/infrastructure")
 public class InfrastructureResource {
@@ -48,7 +52,7 @@ public class InfrastructureResource {
     KubernetesService kubernetesService;
 
     @Inject
-    KubernetesStatusService kubernetesStatusService;
+    EventBus eventBus;
 
     @ConfigProperty(name = "karavan.environment", defaultValue = KaravanConstants.DEV)
     String environment;
@@ -90,7 +94,7 @@ public class InfrastructureResource {
         if (resources == null) {
             return Response.status(Response.Status.NOT_FOUND).entity("Resource file " + KUBERNETES_YAML_FILENAME + " not found").build();
         }
-        kubernetesService.startDeployment(resources.getCode());
+        kubernetesService.startDeployment(resources.getCode(), Map.of(LABEL_TYPE, ContainerType.project.name()));
         return Response.ok().build();
     }
 
@@ -154,7 +158,7 @@ public class InfrastructureResource {
     @Path("/informers")
     public Response restartInformers() {
         if (ConfigService.inKubernetes()) {
-            kubernetesStatusService.startInformers();
+            eventBus.publish(CMD_RESTART_INFORMERS, "");
             return Response.ok().build();
         } else {
             return Response.noContent().build();
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/MetadataResources.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/MetadataResources.java
index 183e7e0a..f5cf8643 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/api/MetadataResources.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/MetadataResources.java
@@ -84,4 +84,11 @@ public class MetadataResources {
     public String getSpiBeans() {
         return codeService.getResourceFile("/metadata/spiBeans.json");
     }
+
+    @GET
+    @Path("/mainConfiguration")
+    @Produces(MediaType.APPLICATION_JSON)
+    public String getMainConfiguration() {
+        return codeService.getResourceFile("/metadata/camel-main-configuration-metadata.json");
+    }
 }
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java
index d4711aee..0e96a431 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java
@@ -49,9 +49,16 @@ public class StatusResource {
 
     @GET
     @Produces(MediaType.APPLICATION_JSON)
-    @Path("/camel/context")
-    public List<CamelStatus> getCamelContextStatusByEnv() {
-        return karavanCache.getCamelStatusesByEnv(CamelStatusValue.Name.context);
+    @Path("/camel")
+    public List<CamelStatus> getCamelAllStatuses() {
+        return karavanCache.getCamelAllStatuses();
+    }
+
+    @GET
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("/camel/{context}")
+    public List<CamelStatus> getCamelContextStatusesByName(@PathParam("context") String context) {
+        return karavanCache.getCamelStatusesByName(CamelStatusValue.Name.valueOf(context));
     }
 
     @DELETE


(camel-karavan) 04/09: Git Improvements

Posted by ma...@apache.org.
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

commit f183adf3be7874ee4b124aaa6f13470e0b13f669
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Thu Oct 24 09:00:34 2024 -0400

    Git Improvements
---
 .../apache/camel/karavan/service/GitService.java   | 88 +++++++++++++++++++++-
 1 file changed, 87 insertions(+), 1 deletion(-)

diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java b/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java
index d1e81300..83660f3b 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java
@@ -29,23 +29,31 @@ import org.eclipse.jgit.api.errors.InvalidRemoteException;
 import org.eclipse.jgit.api.errors.RefNotFoundException;
 import org.eclipse.jgit.api.errors.TransportException;
 import org.eclipse.jgit.diff.DiffEntry;
+import org.eclipse.jgit.diff.DiffFormatter;
 import org.eclipse.jgit.lib.*;
 import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevTree;
+import org.eclipse.jgit.revwalk.RevWalk;
 import org.eclipse.jgit.transport.*;
 import org.eclipse.jgit.transport.ssh.jsch.JschConfigSessionFactory;
+import org.eclipse.jgit.treewalk.AbstractTreeIterator;
+import org.eclipse.jgit.treewalk.CanonicalTreeParser;
 import org.eclipse.jgit.treewalk.TreeWalk;
 import org.eclipse.jgit.treewalk.filter.TreeFilter;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.jboss.logging.Logger;
 
+import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.IOException;
 import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.*;
 import java.util.regex.Pattern;
+import java.util.stream.StreamSupport;
 
 @ApplicationScoped
 public class GitService {
@@ -179,7 +187,7 @@ public class GitService {
         LOGGER.info("Temp folder created " + folder);
         Git git = null;
         if (ephemeral) {
-            LOGGER.error("New ephemeral repository");
+            LOGGER.warn("New ephemeral repository");
             git = init(folder, gitConfig.getUri(), gitConfig.getBranch());
         } else {
             try {
@@ -462,4 +470,82 @@ public class GitService {
         }
         return sshSessionFactory;
     }
+
+    public List<ProjectCommit> getProjectCommits(String projectId) {
+        List<ProjectCommit> result = new ArrayList<>();
+        try {
+            Git pollGit = getGit(true, vertx.fileSystem().createTempDirectoryBlocking("commits"));
+            if (pollGit != null) {
+                StreamSupport.stream(pollGit.log().all().addPath(projectId).call().spliterator(), false)
+                        .sorted(Comparator.comparingInt(RevCommit::getCommitTime))
+                        .forEach(commit -> {
+                            var diffs = getProjectFileCommitDiffs(pollGit, commit);
+                            var projectCommit = new ProjectCommit(commit.getId().getName(), projectId,
+                                    commit.getAuthorIdent().getName(), commit.getAuthorIdent().getEmailAddress(),
+                                    commit.getShortMessage(), diffs);
+                            result.add(projectCommit);
+                        });
+            }
+        } catch (Exception e) {
+            LOGGER.error("Error", e);
+        }
+        return result;
+    }
+
+    private List<ProjectFileCommitDiff> getProjectFileCommitDiffs(Git git, RevCommit commit) {
+        List<ProjectFileCommitDiff> result = new ArrayList<>();
+        var repository = git.getRepository();
+        try {
+            try (RevWalk revWalk = new RevWalk(repository)) {
+                if (commit.getParentCount() > 0) {
+                    RevCommit parentCommit = commit.getParent(0);
+                    revWalk.parseCommit(parentCommit);
+
+                    AbstractTreeIterator oldTreeIter = prepareTreeParser(repository, parentCommit);
+                    AbstractTreeIterator newTreeIter = prepareTreeParser(repository, commit);
+
+                    try (ByteArrayOutputStream baos = new ByteArrayOutputStream();
+                         DiffFormatter diffFormatter = new DiffFormatter(baos)) {
+                        diffFormatter.setRepository(repository);
+                        List<DiffEntry> diffs = diffFormatter.scan(oldTreeIter, newTreeIter);
+
+                        for (DiffEntry diff : diffs) {
+                            diffFormatter.format(diff);
+                            var fileDiff = new ProjectFileCommitDiff(diff.getChangeType().name(), diff.getNewPath(), diff.getOldPath(), baos.toString(StandardCharsets.UTF_8));
+                            result.add(fileDiff);
+                            baos.reset();  // Clear the output stream for the next diff
+                        }
+                    }
+                } else {
+                    try (TreeWalk treeWalk = new TreeWalk(repository)) {
+                        treeWalk.addTree(commit.getTree());
+                        treeWalk.setRecursive(true);
+                        while (treeWalk.next()) {
+                            // Get the object ID for the file (blob)
+                            ObjectId objectId = treeWalk.getObjectId(0);
+                            // Load the file content
+                            ObjectLoader loader = repository.open(objectId);
+                            byte[] content = loader.getBytes();
+                            var fileDiff = new ProjectFileCommitDiff(DiffEntry.ChangeType.ADD.name(), treeWalk.getPathString(), DiffEntry.DEV_NULL, new String(content, StandardCharsets.UTF_8));
+                            result.add(fileDiff);
+                        }
+                    }
+                }
+            }
+        } catch (IOException e) {
+           LOGGER.error("Error", e);
+        }
+        return result;
+    }
+
+    private static AbstractTreeIterator prepareTreeParser(Repository repository, RevCommit commit) throws IOException {
+        try (RevWalk walk = new RevWalk(repository)) {
+            RevTree tree = walk.parseTree(commit.getTree().getId());
+            CanonicalTreeParser treeParser = new CanonicalTreeParser();
+            try (ObjectReader reader = repository.newObjectReader()) {
+                treeParser.reset(reader, tree.getId());
+            }
+            return treeParser;
+        }
+    }
 }


(camel-karavan) 02/09: Kubernetes Improvements

Posted by ma...@apache.org.
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

commit 9f9715f9479b526685880309247a060085b55e0d
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Thu Oct 24 09:00:17 2024 -0400

    Kubernetes Improvements
---
 .../karavan/kubernetes/KubernetesService.java      | 187 ++++++++++++++++++---
 .../kubernetes/KubernetesStatusService.java        |   6 +-
 .../listener/KubernetesCommandListener.java        |  40 +++++
 .../camel/karavan/model/KubernetesConfigMap.java   |  33 ++++
 .../camel/karavan/model/KubernetesSecret.java      |  33 ++++
 5 files changed, 274 insertions(+), 25 deletions(-)

diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java
index b5e5cba8..8e5b5967 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java
@@ -28,7 +28,10 @@ import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.enterprise.inject.Default;
 import jakarta.enterprise.inject.Produces;
 import jakarta.inject.Inject;
-import org.apache.camel.karavan.model.PodContainerStatus;
+import org.apache.camel.karavan.KaravanConstants;
+import org.apache.camel.karavan.model.ContainerType;
+import org.apache.camel.karavan.model.KubernetesConfigMap;
+import org.apache.camel.karavan.model.KubernetesSecret;
 import org.apache.camel.karavan.model.Project;
 import org.apache.camel.karavan.service.CodeService;
 import org.apache.camel.karavan.service.ConfigService;
@@ -48,6 +51,9 @@ public class KubernetesService {
 
     private static final Logger LOGGER = Logger.getLogger(KubernetesService.class.getName());
 
+    @ConfigProperty(name = "karavan.environment", defaultValue = KaravanConstants.DEV)
+    private String environment;
+
     @Inject
     CodeService codeService;
 
@@ -111,7 +117,7 @@ public class KubernetesService {
     public void runBuildProject(Project project, String podFragment) {
         try (KubernetesClient client = kubernetesClient()) {
             String containerName = project.getProjectId() + BUILDER_SUFFIX;
-            Map<String, String> labels = getLabels(containerName, project, PodContainerStatus.ContainerType.build);
+            Map<String, String> labels = getLabels(containerName, project, ContainerType.build);
 
 //        Delete old build pod
             Pod old = client.pods().inNamespace(getNamespace()).withName(containerName).get();
@@ -128,17 +134,17 @@ public class KubernetesService {
         }
     }
 
-    private Map<String, String> getLabels(String name, Project project, PodContainerStatus.ContainerType type) {
+    private Map<String, String> getLabels(String name, Project project, ContainerType type) {
         Map<String, String> labels = new HashMap<>();
-        labels.putAll(getRuntimeLabels());
         labels.putAll(getPartOfLabels());
         labels.put("app.kubernetes.io/name", name);
         labels.put(LABEL_PROJECT_ID, project.getProjectId());
         if (type != null) {
             labels.put(LABEL_TYPE, type.name());
         }
-        if (Objects.equals(type, PodContainerStatus.ContainerType.devmode)) {
+        if (Objects.equals(type, ContainerType.devmode)) {
             labels.put(LABEL_CAMEL_RUNTIME, CamelRuntime.CAMEL_MAIN.getValue());
+            labels.putAll(getRuntimeLabels());
         }
         return labels;
     }
@@ -229,7 +235,7 @@ public class KubernetesService {
 
     public boolean hasDockerConfigSecret() {
         try (KubernetesClient client = kubernetesClient()) {
-            return client.secrets().inNamespace(namespace).withName(BUILD_DOCKER_CONFIG_SECRET).get() != null;
+            return client.secrets().inNamespace(getNamespace()).withName(BUILD_DOCKER_CONFIG_SECRET).get() != null;
         } catch (Exception ex) {
             LOGGER.error(ex.getMessage());
             return false;
@@ -244,16 +250,21 @@ public class KubernetesService {
 
     public void rolloutDeployment(String name) {
         try (KubernetesClient client = kubernetesClient()) {
-            client.apps().deployments().inNamespace(namespace).withName(name).rolling().restart();
+            client.apps().deployments().inNamespace(getNamespace()).withName(name).rolling().restart();
         } catch (Exception ex) {
             LOGGER.error(ex.getMessage());
         }
     }
 
-    public void startDeployment(String resources) {
+    public void startDeployment(String resources, Map<String, String> labels) {
         try (KubernetesClient client = kubernetesClient()) {
             KubernetesList list = Serialization.unmarshal(resources, KubernetesList.class);
-            list.getItems().forEach(item -> client.resource(item).serverSideApply());
+            list.getItems().forEach(item -> {
+                if (labels != null ) {
+                    item.getMetadata().getLabels().putAll(labels);
+                }
+                client.resource(item).inNamespace(getNamespace()).serverSideApply();
+            });
         } catch (Exception ex) {
             LOGGER.error(ex.getMessage());
         }
@@ -261,9 +272,9 @@ public class KubernetesService {
 
     public void deleteDeployment(String name) {
         try (KubernetesClient client = kubernetesClient()) {
-            LOGGER.info("Delete deployment: " + name + " in the namespace: " + namespace);
-            client.apps().deployments().inNamespace(namespace).withName(name).delete();
-            client.services().inNamespace(namespace).withName(name).delete();
+            LOGGER.info("Delete deployment: " + name + " in the namespace: " + getNamespace());
+            client.apps().deployments().inNamespace(getNamespace()).withName(name).delete();
+            client.services().inNamespace(getNamespace()).withName(name).delete();
         } catch (Exception ex) {
             LOGGER.error(ex.getMessage());
         }
@@ -322,9 +333,10 @@ public class KubernetesService {
         return result;
     }
 
-    public void runDevModeContainer(Project project, String jBangOptions, Map<String, String> files, String projectDevmodeImage, String deploymentFragment) {
+    public void runDevModeContainer(Project project, String jBangOptions, Map<String, String> files, String projectDevmodeImage, String deploymentFragment, Map<String, String> labels, Map<String, String> envVars) {
         String name = project.getProjectId();
-        Map<String, String> labels = getLabels(name, project, PodContainerStatus.ContainerType.devmode);
+        Map<String, String> podLabels = new HashMap<>(labels);
+        podLabels.putAll(getLabels(name, project, ContainerType.devmode));
 
         try (KubernetesClient client = kubernetesClient()) {
             if (devmodePVC.orElse(false)) {
@@ -332,13 +344,13 @@ public class KubernetesService {
             }
             Pod old = client.pods().inNamespace(getNamespace()).withName(name).get();
             if (old == null) {
-                Pod pod = getDevModePod(name, jBangOptions, labels, projectDevmodeImage, deploymentFragment);
+                Pod pod = getDevModePod(name, jBangOptions, podLabels, projectDevmodeImage, deploymentFragment, envVars);
                 Pod result = client.resource(pod).serverSideApply();
                 copyFilesToContainer(result, files, "/karavan/code");
                 LOGGER.info("Created pod " + result.getMetadata().getName());
             }
         }
-        createService(name, labels);
+        createService(name, podLabels);
     }
 
     private void copyFilesToContainer(Pod pod, Map<String, String> files, String dirName) {
@@ -375,7 +387,7 @@ public class KubernetesService {
                 .build();
     }
 
-    private Pod getDevModePod(String name, String jbangOptions, Map<String, String> labels, String projectDevmodeImage, String deploymentFragment) {
+    private Pod getDevModePod(String name, String jbangOptions, Map<String, String> labels, String projectDevmodeImage, String deploymentFragment, Map<String, String> envVars) {
 
         Deployment deployment = Serialization.unmarshal(deploymentFragment, Deployment.class);
         PodSpec podSpec = null;
@@ -404,13 +416,17 @@ public class KubernetesService {
                 .withProtocol("TCP")
                 .build();
 
+        List<EnvVar> environmentVariables = new ArrayList<>();
+        envVars.forEach((k, v) -> environmentVariables.add(new EnvVarBuilder().withName(k).withValue(v).build()));
+        environmentVariables.add(new EnvVarBuilder().withName(ENV_VAR_JBANG_OPTIONS).withValue(jbangOptions).build());
+
         Container container = new ContainerBuilder()
                 .withName(name)
                 .withImage(projectDevmodeImage != null ? projectDevmodeImage : devmodeImage)
                 .withPorts(port)
                 .withResources(resources)
                 .withImagePullPolicy(devmodeImagePullPolicy.orElse("IfNotPresent"))
-                .withEnv(new EnvVarBuilder().withName(ENV_VAR_JBANG_OPTIONS).withValue(jbangOptions).build())
+                .withEnv(environmentVariables)
                 .withVolumeMounts(volumeMounts)
                 .build();
 
@@ -486,6 +502,20 @@ public class KubernetesService {
         }
     }
 
+    public void createConfigMap(String name, Map<String, String> data, Map<String, String> labels) {
+        try (KubernetesClient client = kubernetesClient()) {
+            ConfigMap configMap = new ConfigMapBuilder()
+                    .withNewMetadata()
+                    .withName(name)
+                    .withNamespace(getNamespace())
+                    .withLabels(labels)
+                    .endMetadata()
+                    .withData(data)
+                    .build();
+            client.resource(configMap).serverSideApply();
+        }
+    }
+
     public Secret getSecret(String name) {
         try (KubernetesClient client = kubernetesClient()) {
             return client.secrets().inNamespace(getNamespace()).withName(name).get();
@@ -521,16 +551,16 @@ public class KubernetesService {
         return null;
     }
 
-    public boolean isOpenshift() {
-        return isOpenShift.isPresent() && isOpenShift.get();
-    }
-
-    public String getCluster() {
+    public ConfigMap getConfigMap(String name) {
         try (KubernetesClient client = kubernetesClient()) {
-            return client.getMasterUrl().getHost();
+            return client.configMaps().inNamespace(getNamespace()).withName(name).get();
         }
     }
 
+    public boolean isOpenshift() {
+        return isOpenShift.isPresent() && isOpenShift.get();
+    }
+
     public String getNamespace() {
         if (namespace == null) {
             try (KubernetesClient client = kubernetesClient()) {
@@ -545,4 +575,113 @@ public class KubernetesService {
             client.resource(secret).update();
         }
     }
+
+    public void updateConfigMap(ConfigMap configMap) {
+        try (KubernetesClient client = kubernetesClient()) {
+            client.resource(configMap).update();
+        }
+    }
+
+    public String getSecretValue(String secretName, String secretKey) {
+        return getSecret(secretName).getData().get(secretKey);
+    }
+
+    public void setSecretValue(String secretName, String secretKey, String value) {
+        Secret secret = getSecret(secretName);
+        if (secret != null) {
+            secret.getData().put(secretKey, value);
+            updateSecret(secret);
+        }
+    }
+
+    public void createSecret(String secretName) {
+        Secret secret = getSecret(secretName);
+        if (secret == null) {
+            createSecret(secretName, Map.of(), Map.of());
+        }
+    }
+
+    public void deleteSecretValue(String secretName, String secretKey) {
+        Secret secret = getSecret(secretName);
+        if (secret != null) {
+            secret.getData().remove(secretKey);
+            updateSecret(secret);
+        }
+    }
+
+    public List<KubernetesSecret> getSecrets() {
+        List<KubernetesSecret> result = new ArrayList<>();
+        try (KubernetesClient client = kubernetesClient()) {
+            client.secrets().inNamespace(getNamespace()).list().getItems().forEach(secret -> {
+                Map<String, String> data = new HashMap<>(secret.getData());
+                data.replaceAll((s, s2) -> "");
+                result.add(new KubernetesSecret(secret.getMetadata().getName(), data));
+            });
+        } catch (Exception e) {
+            LOGGER.error(e);
+        }
+        return result;
+    }
+
+    public void deleteSecret(String secretName) {
+        Secret secret = getSecret(secretName);
+        if (secret != null) {
+            try (KubernetesClient client = kubernetesClient()) {
+                client.secrets().inNamespace(getNamespace()).withName(secretName).delete();
+            }
+        }
+    }
+
+    public List<KubernetesConfigMap> getConfigMaps() {
+        List<KubernetesConfigMap> result = new ArrayList<>();
+        try (KubernetesClient client = kubernetesClient()) {
+            client.configMaps().inNamespace(getNamespace()).list().getItems()
+                    .forEach(secret -> result.add(new KubernetesConfigMap(secret.getMetadata().getName(), new HashMap<>(secret.getData()))));
+        } catch (Exception e) {
+            LOGGER.error(e);
+        }
+        return result;
+    }
+
+    public void deleteConfigMap(String configMapName) {
+        ConfigMap configMap = getConfigMap(configMapName);
+        if (configMap != null) {
+            try (KubernetesClient client = kubernetesClient()) {
+                client.configMaps().inNamespace(getNamespace()).withName(configMapName).delete();
+            }
+        }
+    }
+
+    public void setConfigMapValue(String configMapName, String configMapKey, String value) {
+        ConfigMap configMap = getConfigMap(configMapName);
+        if (configMap != null) {
+            configMap.getData().put(configMapKey, value);
+            updateConfigMap(configMap);
+        }
+    }
+
+    public void createConfigMap(String configMapName) {
+        ConfigMap configMap = getConfigMap(configMapName);
+        if (configMap == null) {
+            createConfigMap(configMapName, Map.of(), Map.of());
+        }
+    }
+
+    public void deleteConfigMapValue(String configMapName, String configMapKey) {
+        ConfigMap configMap = getConfigMap(configMapName);
+        if (configMap != null) {
+            configMap.getData().remove(configMapKey);
+            updateConfigMap(configMap);
+        }
+    }
+
+    public String getCluster() {
+        try (KubernetesClient client = kubernetesClient()) {
+            return client.getMasterUrl().getHost();
+        }
+    }
+
+    public String getEnvironment() {
+        return environment;
+    }
 }
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesStatusService.java b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesStatusService.java
index 35716a87..40cf3de9 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesStatusService.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesStatusService.java
@@ -62,7 +62,7 @@ public class KubernetesStatusService implements HealthCheck {
     }
 
     @ConfigProperty(name = "karavan.environment", defaultValue = KaravanConstants.DEV)
-    public String environment;
+    private String environment;
 
     @ConfigProperty(name = "karavan.openshift")
     Optional<Boolean> isOpenShift;
@@ -169,4 +169,8 @@ public class KubernetesStatusService implements HealthCheck {
                 .addToLimits("memory", new Quantity(containerResources.get("limits.memory")))
                 .build();
     }
+
+    public String getEnvironment() {
+        return environment;
+    }
 }
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/listener/KubernetesCommandListener.java b/karavan-app/src/main/java/org/apache/camel/karavan/listener/KubernetesCommandListener.java
new file mode 100644
index 00000000..c47f91c6
--- /dev/null
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/listener/KubernetesCommandListener.java
@@ -0,0 +1,40 @@
+/*
+ * 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.listener;
+
+import io.quarkus.vertx.ConsumeEvent;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
+import org.apache.camel.karavan.kubernetes.KubernetesStatusService;
+import org.apache.camel.karavan.service.ConfigService;
+
+import static org.apache.camel.karavan.KaravanEvents.CMD_RESTART_INFORMERS;
+
+@ApplicationScoped
+public class KubernetesCommandListener {
+
+    @Inject
+    KubernetesStatusService kubernetesStatusService;
+
+    @ConsumeEvent(value = CMD_RESTART_INFORMERS, blocking = true)
+    public void restartInformers(String dummy) {
+        if (ConfigService.inKubernetes()) {
+            kubernetesStatusService.startInformers();
+        }
+    }
+}
\ No newline at end of file
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/KubernetesConfigMap.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/KubernetesConfigMap.java
new file mode 100644
index 00000000..9929ddbc
--- /dev/null
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/model/KubernetesConfigMap.java
@@ -0,0 +1,33 @@
+package org.apache.camel.karavan.model;
+
+import java.util.Map;
+
+public class KubernetesConfigMap {
+
+    private String name;
+    private Map<String, String> data;
+
+    public KubernetesConfigMap() {
+    }
+
+    public KubernetesConfigMap(String name, Map<String, String> data) {
+        this.name = name;
+        this.data = data;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Map<String, String> getData() {
+        return data;
+    }
+
+    public void setData(Map<String, String> data) {
+        this.data = data;
+    }
+}
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/KubernetesSecret.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/KubernetesSecret.java
new file mode 100644
index 00000000..9159d1b3
--- /dev/null
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/model/KubernetesSecret.java
@@ -0,0 +1,33 @@
+package org.apache.camel.karavan.model;
+
+import java.util.Map;
+
+public class KubernetesSecret {
+
+    private String name;
+    private Map<String, String> data;
+
+    public KubernetesSecret() {
+    }
+
+    public KubernetesSecret(String name, Map<String, String> data) {
+        this.name = name;
+        this.data = data;
+    }
+
+    public String getName() {
+        return name;
+    }
+
+    public void setName(String name) {
+        this.name = name;
+    }
+
+    public Map<String, String> getData() {
+        return data;
+    }
+
+    public void setData(Map<String, String> data) {
+        this.data = data;
+    }
+}


(camel-karavan) 08/09: Container Type Improvements

Posted by ma...@apache.org.
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

commit 2382e1dff571d1467351b21bfc5c8bd5a8c49215
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Thu Oct 24 09:02:17 2024 -0400

    Container Type Improvements
---
 .../karavan/kubernetes/DeploymentEventHandler.java | 18 ++++++----
 .../camel/karavan/kubernetes/PodEventHandler.java  | 12 ++++---
 .../karavan/kubernetes/ServiceEventHandler.java    |  6 ++--
 .../listener/PodContainerCommandListener.java      |  5 +--
 .../apache/camel/karavan/model/ContainerType.java  | 27 +++++++++++++++
 .../camel/karavan/model/DeploymentStatus.java      | 14 ++++++--
 .../camel/karavan/model/PodContainerStatus.java    | 40 +++++++++++++---------
 .../apache/camel/karavan/service/CodeService.java  | 22 +++++++++---
 8 files changed, 103 insertions(+), 41 deletions(-)

diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/DeploymentEventHandler.java b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/DeploymentEventHandler.java
index 73109714..8773d84c 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/DeploymentEventHandler.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/DeploymentEventHandler.java
@@ -21,9 +21,11 @@ import io.fabric8.kubernetes.api.model.apps.Deployment;
 import io.fabric8.kubernetes.client.informers.ResourceEventHandler;
 import io.vertx.core.json.JsonObject;
 import io.vertx.mutiny.core.eventbus.EventBus;
+import org.apache.camel.karavan.model.ContainerType;
 import org.apache.camel.karavan.model.DeploymentStatus;
 import org.jboss.logging.Logger;
 
+import static org.apache.camel.karavan.KaravanConstants.LABEL_TYPE;
 import static org.apache.camel.karavan.KaravanEvents.DEPLOYMENT_DELETED;
 import static org.apache.camel.karavan.KaravanEvents.DEPLOYMENT_UPDATED;
 
@@ -68,7 +70,7 @@ public class DeploymentEventHandler implements ResourceEventHandler<Deployment>
                     deployment.getMetadata().getName(),
                     deployment.getMetadata().getNamespace(),
                     kubernetesStatusService.getCluster(),
-                    kubernetesStatusService.environment);
+                    kubernetesStatusService.getEnvironment());
             eventBus.publish(DEPLOYMENT_DELETED, JsonObject.mapFrom(ds));
         } catch (Exception e){
             LOGGER.error(e.getMessage());
@@ -77,20 +79,22 @@ public class DeploymentEventHandler implements ResourceEventHandler<Deployment>
 
     public DeploymentStatus getDeploymentStatus(Deployment deployment) {
         try {
-            String dsImage = deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getImage();
-            String imageName = dsImage.startsWith("image-registry.openshift-image-registry.svc")
+            var dsImage = deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getImage();
+            var imageName = dsImage.startsWith("image-registry.openshift-image-registry.svc")
                     ? dsImage.replace("image-registry.openshift-image-registry.svc:5000/", "")
                     : dsImage;
-
+            var typeLabel = deployment.getMetadata().getLabels().get(LABEL_TYPE);
+            var type = typeLabel != null ? ContainerType.valueOf(typeLabel) : ContainerType.unknown;
             return new DeploymentStatus(
                     deployment.getMetadata().getName(),
                     deployment.getMetadata().getNamespace(),
                     kubernetesStatusService.getCluster(),
-                    kubernetesStatusService.environment,
+                    kubernetesStatusService.getEnvironment(),
                     imageName,
                     deployment.getSpec().getReplicas(),
                     deployment.getStatus().getReadyReplicas(),
-                    deployment.getStatus().getUnavailableReplicas()
+                    deployment.getStatus().getUnavailableReplicas(),
+                    type
             );
         } catch (Exception ex) {
             LOGGER.error(ex.getMessage());
@@ -98,7 +102,7 @@ public class DeploymentEventHandler implements ResourceEventHandler<Deployment>
                     deployment.getMetadata().getName(),
                     deployment.getMetadata().getNamespace(),
                     kubernetesStatusService.getCluster(),
-                    kubernetesStatusService.environment);
+                    kubernetesStatusService.getEnvironment());
         }
     }
 }
\ No newline at end of file
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java
index 5571a512..66f14503 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java
@@ -24,6 +24,7 @@ import io.fabric8.kubernetes.api.model.ResourceRequirements;
 import io.fabric8.kubernetes.client.informers.ResourceEventHandler;
 import io.vertx.core.json.JsonObject;
 import io.vertx.mutiny.core.eventbus.EventBus;
+import org.apache.camel.karavan.model.ContainerType;
 import org.apache.camel.karavan.model.PodContainerStatus;
 import org.jboss.logging.Logger;
 
@@ -92,7 +93,7 @@ public class PodEventHandler implements ResourceEventHandler<Pod> {
             PodContainerStatus cs = new PodContainerStatus();
             cs.setProjectId(projectId);
             cs.setContainerName(pod.getMetadata().getName());
-            cs.setEnv(kubernetesStatusService.environment);
+            cs.setEnv(kubernetesStatusService.getEnvironment());
 
             eventBus.publish(POD_CONTAINER_DELETED, JsonObject.mapFrom(cs));
         } catch (Exception e) {
@@ -108,9 +109,9 @@ public class PodEventHandler implements ResourceEventHandler<Pod> {
         String runtime = deployment != null ? deployment : pod.getMetadata().getLabels().get(LABEL_CAMEL_RUNTIME);
         String type = pod.getMetadata().getLabels().get(LABEL_TYPE);
         String commit = pod.getMetadata().getAnnotations().get(ANNOTATION_COMMIT);
-        PodContainerStatus.ContainerType containerType = deployment != null
-                ? PodContainerStatus.ContainerType.project
-                : (type != null ? PodContainerStatus.ContainerType.valueOf(type) : PodContainerStatus.ContainerType.unknown);
+        ContainerType containerType = deployment != null
+                ? ContainerType.project
+                : (type != null ? ContainerType.valueOf(type) : ContainerType.unknown);
         try {
             boolean ready = pod.getStatus().getConditions().stream().anyMatch(c -> c.getType().equals("Ready") && c.getStatus().equals("True"));
             boolean running = Objects.equals(pod.getStatus().getPhase(), "Running");
@@ -130,11 +131,12 @@ public class PodEventHandler implements ResourceEventHandler<Pod> {
                     pod.getMetadata().getName(),
                     List.of(PodContainerStatus.Command.delete),
                     projectId,
-                    kubernetesStatusService.environment,
+                    kubernetesStatusService.getEnvironment(),
                     containerType,
                     requestMemory + " / " + limitMemory,
                     requestCpu + " / " + limitCpu,
                     creationTimestamp);
+            status.setLabels(pod.getMetadata().getLabels());
             status.setImage(pod.getSpec().getContainers().get(0).getImage());
             status.setCommit(commit);
             status.setContainerId(pod.getMetadata().getName());
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/ServiceEventHandler.java b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/ServiceEventHandler.java
index 3a67c84a..c00c2e14 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/ServiceEventHandler.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/ServiceEventHandler.java
@@ -68,7 +68,7 @@ public class ServiceEventHandler implements ResourceEventHandler<Service> {
                     service.getMetadata().getName(),
                     service.getMetadata().getNamespace(),
                     kubernetesStatusService.getCluster(),
-                    kubernetesStatusService.environment);
+                    kubernetesStatusService.getEnvironment());
             eventBus.publish(SERVICE_DELETED, JsonObject.mapFrom(ds));
         } catch (Exception e){
             LOGGER.error(e.getMessage());
@@ -80,7 +80,7 @@ public class ServiceEventHandler implements ResourceEventHandler<Service> {
             return new ServiceStatus(
                     service.getMetadata().getName(),
                     service.getMetadata().getNamespace(),
-                    kubernetesStatusService.environment,
+                    kubernetesStatusService.getEnvironment(),
                     kubernetesStatusService.getCluster(),
                     service.getSpec().getPorts().get(0).getPort(),
                     service.getSpec().getPorts().get(0).getTargetPort().getIntVal(),
@@ -93,7 +93,7 @@ public class ServiceEventHandler implements ResourceEventHandler<Service> {
                     service.getMetadata().getName(),
                     service.getMetadata().getNamespace(),
                     kubernetesStatusService.getCluster(),
-                    kubernetesStatusService.environment);
+                    kubernetesStatusService.getEnvironment());
         }
     }
 }
\ No newline at end of file
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/listener/PodContainerCommandListener.java b/karavan-app/src/main/java/org/apache/camel/karavan/listener/PodContainerCommandListener.java
index 1c7873b9..78502210 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/listener/PodContainerCommandListener.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/listener/PodContainerCommandListener.java
@@ -26,6 +26,7 @@ import org.apache.camel.karavan.KaravanCache;
 import org.apache.camel.karavan.KaravanConstants;
 import org.apache.camel.karavan.docker.DockerService;
 import org.apache.camel.karavan.kubernetes.KubernetesService;
+import org.apache.camel.karavan.model.ContainerType;
 import org.apache.camel.karavan.model.PodContainerStatus;
 import org.apache.camel.karavan.service.ConfigService;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
@@ -53,7 +54,7 @@ public class PodContainerCommandListener {
 
     @ConsumeEvent(value = CMD_DELETE_CONTAINER, blocking = true)
     public void deletePodContainer(String projectId) {
-        setContainerStatusTransit(projectId, PodContainerStatus.ContainerType.devmode.name());
+        setContainerStatusTransit(projectId, ContainerType.devmode.name());
         if (ConfigService.inKubernetes()) {
             kubernetesService.deletePodAndService(projectId, false);
         } else {
@@ -64,7 +65,7 @@ public class PodContainerCommandListener {
     private void setContainerStatusTransit(String name, String type) {
         PodContainerStatus status = karavanCache.getPodContainerStatus(name, environment, name);
         if (status == null) {
-            status = PodContainerStatus.createByType(name, environment, PodContainerStatus.ContainerType.valueOf(type));
+            status = PodContainerStatus.createByType(name, environment, ContainerType.valueOf(type));
         }
         status.setInTransit(true);
         eventBus.publish(POD_CONTAINER_UPDATED, JsonObject.mapFrom(status));
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/ContainerType.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/ContainerType.java
new file mode 100644
index 00000000..7b315b69
--- /dev/null
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/model/ContainerType.java
@@ -0,0 +1,27 @@
+/*
+ * 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.model;
+
+public enum ContainerType {
+    internal,
+    devmode,
+    devservice,
+    project,
+    build,
+    unknown,
+}
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/DeploymentStatus.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/DeploymentStatus.java
index aaa41263..0bcf6a3c 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/DeploymentStatus.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/model/DeploymentStatus.java
@@ -27,6 +27,7 @@ public class DeploymentStatus {
     Integer replicas;
     Integer readyReplicas;
     Integer unavailableReplicas;
+    ContainerType type;
 
     public DeploymentStatus() {
     }
@@ -42,7 +43,7 @@ public class DeploymentStatus {
         this.unavailableReplicas = 0;
     }
 
-    public DeploymentStatus(String projectId, String namespace, String cluster, String env, String image, Integer replicas, Integer readyReplicas, Integer unavailableReplicas) {
+    public DeploymentStatus(String projectId, String namespace, String cluster, String env, String image, Integer replicas, Integer readyReplicas, Integer unavailableReplicas, ContainerType type) {
         this.projectId = projectId;
         this.namespace = namespace;
         this.env = env;
@@ -51,6 +52,7 @@ public class DeploymentStatus {
         this.replicas = replicas;
         this.readyReplicas = readyReplicas;
         this.unavailableReplicas = unavailableReplicas;
+        this.type = type;
     }
 
     public String getProjectId() {
@@ -117,7 +119,15 @@ public class DeploymentStatus {
         this.cluster = cluster;
     }
 
+    public ContainerType getType() {
+        return type;
+    }
+
+    public void setType(ContainerType type) {
+        this.type = type;
+    }
+
     public DeploymentStatus copy() {
-        return new DeploymentStatus(projectId, namespace, cluster, env, image, replicas, readyReplicas, unavailableReplicas);
+        return new DeploymentStatus(projectId, namespace, cluster, env, image, replicas, readyReplicas, unavailableReplicas, type);
     }
 }
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/PodContainerStatus.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/PodContainerStatus.java
index 6d5422f3..6fa8ffa4 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/PodContainerStatus.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/model/PodContainerStatus.java
@@ -18,7 +18,9 @@
 package org.apache.camel.karavan.model;
 
 import java.time.Instant;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 public class PodContainerStatus {
 
@@ -31,15 +33,6 @@ public class PodContainerStatus {
         dead
     }
 
-    public enum ContainerType {
-        internal,
-        devmode,
-        devservice,
-        project,
-        build,
-        unknown,
-    }
-
     public enum Command {
         run,
         pause,
@@ -67,8 +60,9 @@ public class PodContainerStatus {
     String podIP;
     String camelRuntime;
     String commit;
+    Map<String, String> labels;
 
-    public PodContainerStatus(String projectId, String containerName, String containerId, String image, List<ContainerPort> ports, String env, ContainerType type, String memoryInfo, String cpuInfo, String created, String finished, List<Command> commands, String state, String phase, Boolean codeLoaded, Boolean inTransit, String initDate, String podIP, String camelRuntime, String commit) {
+    public PodContainerStatus(String projectId, String containerName, String containerId, String image, List<ContainerPort> ports, String env, ContainerType type, String memoryInfo, String cpuInfo, String created, String finished, List<Command> commands, String state, String phase, Boolean codeLoaded, Boolean inTransit, String initDate, String podIP, String camelRuntime, String commit, Map<String, String> labels) {
         this.projectId = projectId;
         this.containerName = containerName;
         this.containerId = containerId;
@@ -89,6 +83,7 @@ public class PodContainerStatus {
         this.podIP = podIP;
         this.camelRuntime = camelRuntime;
         this.commit = commit;
+        this.labels = labels;
     }
 
     public PodContainerStatus(String projectId, String containerName, String containerId, String image, List<ContainerPort> ports, String env, ContainerType type, String memoryInfo, String cpuInfo, String created, String finished, List<Command> commands, String state, String phase, Boolean codeLoaded, Boolean inTransit, String initDate, String podIP, String camelRuntime) {
@@ -113,7 +108,7 @@ public class PodContainerStatus {
         this.camelRuntime = camelRuntime;
     }
 
-    public PodContainerStatus(String projectId, String containerName, String containerId, String image, List<ContainerPort> ports, String env, ContainerType type, String memoryInfo, String cpuInfo, String created, String finished, List<Command> commands, String state, String phase, Boolean codeLoaded, Boolean inTransit, String initDate) {
+    public PodContainerStatus(String projectId, String containerName, String containerId, String image, List<ContainerPort> ports, String env, ContainerType type, String memoryInfo, String cpuInfo, String created, String finished, List<Command> commands, String state, String phase, Boolean codeLoaded, Boolean inTransit, String initDate, Map<String, String> labels) {
         this.projectId = projectId;
         this.containerName = containerName;
         this.containerId = containerId;
@@ -131,9 +126,10 @@ public class PodContainerStatus {
         this.codeLoaded = codeLoaded;
         this.inTransit = inTransit;
         this.initDate = initDate;
+        this.labels = labels;
     }
 
-    public PodContainerStatus(String projectId, String containerName, String containerId, String image, List<ContainerPort> ports, String env, ContainerType type, String memoryInfo, String cpuInfo, String created, String finished, List<Command> commands, String state, Boolean codeLoaded, Boolean inTransit, String camelRuntime) {
+    public PodContainerStatus(String projectId, String containerName, String containerId, String image, List<ContainerPort> ports, String env, ContainerType type, String memoryInfo, String cpuInfo, String created, String finished, List<Command> commands, String state, Boolean codeLoaded, Boolean inTransit, String camelRuntime, Map<String, String> labels) {
         this.projectId = projectId;
         this.containerName = containerName;
         this.containerId = containerId;
@@ -151,6 +147,7 @@ public class PodContainerStatus {
         this.camelRuntime = camelRuntime;
         this.inTransit = inTransit;
         this.initDate = Instant.now().toString();
+        this.labels = labels;
     }
 
     public PodContainerStatus(String containerName, List<Command> commands, String projectId, String env, ContainerType type, String memoryInfo, String cpuInfo, String created) {
@@ -176,16 +173,16 @@ public class PodContainerStatus {
     }
 
     public static PodContainerStatus createDevMode(String projectId, String env) {
-        return new PodContainerStatus(projectId, projectId, null, null, null, env, ContainerType.devmode, null, null, null, null, List.of(Command.run), null, false, false, "");
+        return new PodContainerStatus(projectId, projectId, null, null, null, env, ContainerType.devmode, null, null, null, null, List.of(Command.run), null, false, false, "", new HashMap<>());
     }
 
     public static PodContainerStatus createByType(String name, String env, ContainerType type) {
-        return new PodContainerStatus(name, name, null, null, null, env, type, null, null, null, null, List.of(Command.run), null, false, false, "");
+        return new PodContainerStatus(name, name, null, null, null, env, type, null, null, null, null, List.of(Command.run), null, false, false, "", new HashMap<>());
     }
 
-    public static PodContainerStatus createWithId(String projectId, String containerName, String env, String containerId, String image, List<ContainerPort> ports, ContainerType type, List<Command> commands, String status, String created, String camelRuntime) {
+    public static PodContainerStatus createWithId(String projectId, String containerName, String env, String containerId, String image, List<ContainerPort> ports, ContainerType type, List<Command> commands, String status, String created, String camelRuntime, Map<String, String> labels) {
         return new PodContainerStatus(projectId, containerName, containerId, image, ports, env, type,
-                null, null, created, null,  commands, status, false, false, camelRuntime);
+                null, null, created, null,  commands, status, false, false, camelRuntime, labels);
     }
 
     public PodContainerStatus() {
@@ -193,7 +190,7 @@ public class PodContainerStatus {
 
     public PodContainerStatus copy() {
         return new PodContainerStatus(
-                projectId, containerName, containerId, image, ports, env, type, memoryInfo, cpuInfo, created, finished, commands, state, phase, codeLoaded, inTransit, initDate, podIP, camelRuntime, commit
+                projectId, containerName, containerId, image, ports, env, type, memoryInfo, cpuInfo, created, finished, commands, state, phase, codeLoaded, inTransit, initDate, podIP, camelRuntime, commit, labels
         );
     }
 
@@ -357,6 +354,14 @@ public class PodContainerStatus {
         this.commit = commit;
     }
 
+    public Map<String, String> getLabels() {
+        return labels;
+    }
+
+    public void setLabels(Map<String, String> labels) {
+        this.labels = labels;
+    }
+
     @Override
     public String toString() {
         return "ContainerStatus{" +
@@ -379,6 +384,7 @@ public class PodContainerStatus {
                 ", initDate='" + initDate + '\'' +
                 ", podIP='" + podIP + '\'' +
                 ", commit='" + commit + '\'' +
+                ", labels='" + labels + '\'' +
                 '}';
     }
 }
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java b/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java
index 5d1a5bbf..403a502b 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java
@@ -55,13 +55,14 @@ public class CodeService {
     public static final String PROPERTY_PROJECT_NAME = "camel.karavan.projectName";
     public static final String PROPERTY_PROJECT_NAME_OLD = "camel.karavan.project-name";
     public static final String BEAN_TEMPLATE_SUFFIX_FILENAME = "-bean-template.camel.yaml";
-    public static final String DEV_SERVICES_FILENAME = "devservices.docker-compose.yaml";
+    public static final String DEV_SERVICES_FILENAME = "docker-compose.yaml";
     public static final String PROJECT_COMPOSE_FILENAME = "docker-compose.yaml";
     public static final String MARKDOWN_EXTENSION = ".md";
     public static final String PROJECT_JKUBE_EXTENSION = ".jkube.yaml";
     public static final String PROJECT_DEPLOYMENT_JKUBE_FILENAME = "deployment" + PROJECT_JKUBE_EXTENSION;
     private static final String TEMPLATES_PATH = "/templates";
     private static final String CONFIGURATION_PATH = "/configuration";
+    private static final String SERVICES_PATH = "/services";
     private static final String DOCKER_FOLDER = "/docker/";
     private static final String KUBERNETES_FOLDER = "/kubernetes/";
     public static final int INTERNAL_PORT = 8080;
@@ -204,10 +205,6 @@ public class CodeService {
         return null;
     }
 
-    public List<String> getBeanTemplateNames(){
-        return beansTemplates.stream().map(name -> name + BEAN_TEMPLATE_SUFFIX_FILENAME).toList();
-    }
-
     public Map<String, String> getTemplates() {
         Map<String, String> result = new HashMap<>();
 
@@ -238,6 +235,21 @@ public class CodeService {
         return result;
     }
 
+    public Map<String, String> getDevServicesFiles() {
+        Map<String, String> result = new HashMap<>();
+
+        var path = SERVICES_PATH + (ConfigService.inKubernetes() ? KUBERNETES_FOLDER : DOCKER_FOLDER);
+
+        listResources(path).forEach(filename -> {
+            String templatePath = path + filename;
+            String templateText = getResourceFile(templatePath);
+            if (templateText != null) {
+                result.put(filename, templateText);
+            }
+        });
+        return result;
+    }
+
     public List<String> getTemplatesList() {
         var path = TEMPLATES_PATH + (ConfigService.inKubernetes() ? KUBERNETES_FOLDER : DOCKER_FOLDER);
         return listResources(path);


(camel-karavan) 01/09: Project Improvements

Posted by ma...@apache.org.
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

commit 1be80ca42f98f3ff0c3093b45683aeac3873f21f
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Thu Oct 24 09:00:02 2024 -0400

    Project Improvements
---
 .../camel/karavan/api/ProjectFileResource.java     | 24 +++++-
 .../apache/camel/karavan/api/ProjectResource.java  |  6 +-
 .../org/apache/camel/karavan/model/Project.java    |  1 +
 .../apache/camel/karavan/model/ProjectCommit.java  | 90 ++++++++++++++++++++++
 .../camel/karavan/model/ProjectFileCommitDiff.java | 52 +++++++++++++
 .../camel/karavan/service/ProjectService.java      | 16 ++--
 6 files changed, 179 insertions(+), 10 deletions(-)

diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java
index f8310f08..fc5bdf42 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.karavan.api;
 
+import io.vertx.core.json.JsonObject;
 import jakarta.inject.Inject;
 import jakarta.ws.rs.*;
 import jakarta.ws.rs.core.MediaType;
@@ -86,8 +87,8 @@ public class ProjectFileResource {
     @Produces(MediaType.APPLICATION_JSON)
     @Path("/templates/beans")
     public List<ProjectFile> getBeanTemplates() throws Exception {
-        return  codeService.getBeanTemplateNames().stream()
-                .map(s -> karavanCache.getProjectFile(Project.Type.templates.name(), s))
+        return  karavanCache.getProjectFiles(Project.Type.templates.name()).stream()
+                .filter(file -> file.getName().endsWith(CodeService.BEAN_TEMPLATE_SUFFIX_FILENAME))
                 .toList();
     }
 
@@ -125,4 +126,23 @@ public class ProjectFileResource {
                 false
         );
     }
+
+    @POST
+    @Produces(MediaType.APPLICATION_JSON)
+    @Path("/copy/{project}")
+    public Response copy(@PathParam("project") String project, JsonObject copy) throws Exception {
+        var projectId = URLDecoder.decode(project, StandardCharsets.UTF_8);
+        var from = copy.getString("from");
+        var to = copy.getString("to");
+        var tofile = karavanCache.getProjectFile(projectId, to);
+        if (tofile == null) {
+            var file = karavanCache.getProjectFile(projectId, from);
+            var copyFile = file.copy();
+            copyFile.setName(to);
+            karavanCache.saveProjectFile(copyFile, false, false);
+            return Response.ok().build();
+        } else {
+            return Response.notModified().build();
+        }
+    }
 }
\ No newline at end of file
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java
index dfba7c04..4f2babaa 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java
@@ -27,7 +27,7 @@ import org.apache.camel.karavan.docker.DockerService;
 import org.apache.camel.karavan.kubernetes.KubernetesService;
 import org.apache.camel.karavan.model.CamelStatus;
 import org.apache.camel.karavan.model.CamelStatusValue;
-import org.apache.camel.karavan.model.PodContainerStatus;
+import org.apache.camel.karavan.model.ContainerType;
 import org.apache.camel.karavan.model.Project;
 import org.apache.camel.karavan.service.ConfigService;
 import org.apache.camel.karavan.service.GitService;
@@ -99,8 +99,8 @@ public class ProjectResource extends AbstractApiResource {
         if (deleteContainers) {
             LOGGER.info("Deleting containers");
             Response res1 = devModeResource.deleteDevMode(projectId, true);
-            Response res2 = containerResource.deleteContainer(projectId, PodContainerStatus.ContainerType.devmode.name(), projectId);
-            Response res3 = containerResource.deleteContainer(projectId, PodContainerStatus.ContainerType.project.name(), projectId);
+            Response res2 = containerResource.deleteContainer(projectId, ContainerType.devmode.name(), projectId);
+            Response res3 = containerResource.deleteContainer(projectId, ContainerType.project.name(), projectId);
             LOGGER.info("Deleting deployments");
             Response res4 = infrastructureResource.deleteDeployment(null, projectId);
         }
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/Project.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/Project.java
index 3821a0c5..2bfb815b 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/model/Project.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/model/Project.java
@@ -28,6 +28,7 @@ public class Project {
         templates,
         kamelets,
         configuration,
+        services,
         normal,
     }
 
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectCommit.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectCommit.java
new file mode 100644
index 00000000..44278009
--- /dev/null
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectCommit.java
@@ -0,0 +1,90 @@
+/*
+ * 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.model;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ProjectCommit {
+    private String id;
+    private String projectId;
+    private String authorName;
+    private String authorEmail;
+    private String message;
+    private List<ProjectFileCommitDiff> diffs = new ArrayList<>();
+
+    public ProjectCommit() {
+    }
+
+    public ProjectCommit(String id, String projectId, String authorName, String authorEmail, String message, List<ProjectFileCommitDiff> diffs) {
+        this.id = id;
+        this.projectId = projectId;
+        this.authorName = authorName;
+        this.authorEmail = authorEmail;
+        this.message = message;
+        this.diffs = diffs;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getProjectId() {
+        return projectId;
+    }
+
+    public void setProjectId(String projectId) {
+        this.projectId = projectId;
+    }
+
+    public String getAuthorName() {
+        return authorName;
+    }
+
+    public void setAuthorName(String authorName) {
+        this.authorName = authorName;
+    }
+
+    public String getAuthorEmail() {
+        return authorEmail;
+    }
+
+    public void setAuthorEmail(String authorEmail) {
+        this.authorEmail = authorEmail;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public List<ProjectFileCommitDiff> getDiffs() {
+        return diffs;
+    }
+
+    public void setDiffs(List<ProjectFileCommitDiff> diffs) {
+        this.diffs = diffs;
+    }
+}
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectFileCommitDiff.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectFileCommitDiff.java
new file mode 100644
index 00000000..38c118ca
--- /dev/null
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectFileCommitDiff.java
@@ -0,0 +1,52 @@
+/*
+ * 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.model;
+
+public class ProjectFileCommitDiff {
+    private String changeType;
+    private String newPath;
+    private String oldPath;
+    private String diff;
+
+
+    public ProjectFileCommitDiff() {
+    }
+
+    public ProjectFileCommitDiff(String changeType, String newPath, String oldPath, String diff) {
+        this.changeType = changeType;
+        this.newPath = newPath;
+        this.oldPath = oldPath;
+        this.diff = diff;
+    }
+
+    public String getChangeType() {
+        return changeType;
+    }
+
+    public String getNewPath() {
+        return newPath;
+    }
+
+    public String getOldPath() {
+        return oldPath;
+    }
+
+    public String getDiff() {
+        return diff;
+    }
+}
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java b/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
index b3fa8e0d..25c07faa 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
@@ -93,7 +93,7 @@ public class ProjectService {
         }
     }
 
-    public String runProjectWithJBangOptions(Project project, String jBangOptions) throws Exception {
+    public String runProjectWithJBangOptions(Project project, String jBangOptions, Map<String, String> labels, Map<String, String> envVars) throws Exception {
         String containerName = project.getProjectId();
         PodContainerStatus status = karavanCache.getDevModePodContainerStatus(project.getProjectId(), environment);
         if (status == null) {
@@ -107,10 +107,10 @@ public class ProjectService {
             String projectDevmodeImage = codeService.getProjectDevModeImage(project.getProjectId());
             if (ConfigService.inKubernetes()) {
                 String deploymentFragment = codeService.getDeploymentFragment(project.getProjectId());
-                kubernetesService.runDevModeContainer(project, jBangOptions, files, projectDevmodeImage, deploymentFragment);
+                kubernetesService.runDevModeContainer(project, jBangOptions, files, projectDevmodeImage, deploymentFragment, labels, envVars);
             } else {
                 DockerComposeService compose = getProjectDockerComposeService(project.getProjectId());
-                dockerForKaravan.runProjectInDevMode(project.getProjectId(), jBangOptions, compose, files, projectDevmodeImage);
+                dockerForKaravan.runProjectInDevMode(project.getProjectId(), jBangOptions, compose, files, projectDevmodeImage, labels, envVars);
             }
             return containerName;
         } else {
@@ -180,12 +180,18 @@ public class ProjectService {
         }
     }
 
-    public String getDevServiceCode() {
-        List<ProjectFile> files = karavanCache.getProjectFiles(Project.Type.configuration.name());
+    public String getDockerDevServiceCode() {
+        List<ProjectFile> files = karavanCache.getProjectFiles(Project.Type.services.name());
         Optional<ProjectFile> file = files.stream().filter(f -> f.getName().equals(DEV_SERVICES_FILENAME)).findFirst();
         return file.orElse(new ProjectFile()).getCode();
     }
 
+    public String getKubernetesDevServiceCode(String name) {
+        List<ProjectFile> files = karavanCache.getProjectFiles(Project.Type.services.name());
+        Optional<ProjectFile> file = files.stream().filter(f -> f.getName().equals(name + ".yaml")).findFirst();
+        return file.orElse(new ProjectFile()).getCode();
+    }
+
     public DockerComposeService getProjectDockerComposeService(String projectId) {
         String composeTemplate = codeService.getDockerComposeFileForProject(projectId);
         String composeCode = codeService.replaceEnvWithRuntimeProperties(composeTemplate);