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();

Reply via email to