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