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 b70b00eec1df8ad985b8a072ab005b76550c8cda Author: Marat Gubaidullin <ma...@talismancloud.io> AuthorDate: Tue Sep 5 15:38:41 2023 -0400 Redesign work in Docker for #817 --- .../apache/camel/karavan/api/DevModeResource.java | 6 ++-- .../apache/camel/karavan/service/CamelService.java | 40 ++++++++++------------ .../apache/camel/karavan/service/CodeService.java | 15 ++++---- .../camel/karavan/service/ProjectService.java | 5 +++ .../camel/karavan/service/ScheduledService.java | 11 +----- .../apache/camel/karavan/shared/ConfigService.java | 20 ++++++++--- .../src/main/resources/application.properties | 2 +- .../webui/src/project/dashboard/InfoContainer.tsx | 2 +- .../karavan/infinispan/CodeReloadListener.java | 30 ---------------- 9 files changed, 53 insertions(+), 78 deletions(-) diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java index 3e2c879b..05aff589 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java @@ -87,12 +87,12 @@ public class DevModeResource { @Produces(MediaType.APPLICATION_JSON) @Path("/reload/{projectId}") public Response reload(@PathParam("projectId") String projectId) { - if (ConfigService.inKubernetes()) { + if (infinispanService.isReady()) { camelService.reloadProjectCode(projectId); + return Response.ok().build(); } else { - infinispanService.sendCodeReloadCommand(projectId); + return Response.noContent().build(); } - return Response.ok().build(); } @DELETE diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CamelService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CamelService.java index 73557d4d..44783740 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CamelService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CamelService.java @@ -56,6 +56,9 @@ public class CamelService { @Inject KubernetesService kubernetesService; + @Inject + ProjectService projectService; + @ConfigProperty(name = "karavan.environment") String environment; @@ -75,26 +78,6 @@ public class CamelService { } - public void loadCodeToDevMode(String projectId) { - LOGGER.info("DevMode reload code " + projectId); - ContainerStatus status = infinispanService.getContainerStatus(projectId, environment, projectId); - CamelStatus cs = infinispanService.getCamelStatus(projectId, environment, CamelStatus.Name.context.name()); - if (status != null - && !Objects.equals(status.getCodeLoaded(), Boolean.TRUE) - && status.getContainerId() != null - && status.getState().equals(ContainerStatus.State.running.name()) - && camelIsStarted(cs)) { - LOGGER.info("CAMEL STARTED -> SEND RELOAD"); - if (ConfigService.inKubernetes()) { - reloadProjectCode(projectId); - } else { - infinispanService.sendCodeReloadCommand(projectId); - } - } else { - - } - } - private boolean camelIsStarted(CamelStatus camelStatus) { try { String status = camelStatus.getStatus(); @@ -143,12 +126,25 @@ public class CamelService { } public String getContainerAddress(String containerName) { - return "http://" + containerName + "." + kubernetesService.getNamespace() + ".svc.cluster.local"; + if (ConfigService.inKubernetes()) { + return "http://" + containerName + "." + kubernetesService.getNamespace() + ".svc.cluster.local"; + } else if (ConfigService.inDocker()) { + Integer port = projectService.getProjectPort(containerName); + return "http://" + containerName + ":" + port; + } else { + Integer port = projectService.getProjectPort(containerName); + return "http://localhost:" + port; + } } public void collectCamelStatuses() { if (infinispanService.isReady()) { - infinispanService.getContainerStatuses(environment).forEach(pod -> { + infinispanService.getContainerStatuses(environment).stream() + .filter(cs -> + cs.getType() == ContainerStatus.ContainerType.project + || cs.getType() == ContainerStatus.ContainerType.devmode + ).forEach(pod -> { + System.out.println(pod.getProjectId()); CamelStatusRequest csr = new CamelStatusRequest(pod.getProjectId(), pod.getContainerName()); eventBus.publish(CMD_COLLECT_CAMEL_STATUS, JsonObject.mapFrom(csr)); }); diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java index 4e243bc2..e9e0893b 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java @@ -292,12 +292,8 @@ public class CodeService { List<ProjectFile> files = infinispanService.getProjectFilesByName(PROJECT_COMPOSE_FILENAME).stream() .filter(f -> !Objects.equals(f.getProjectId(), Project.Type.templates.name())).toList(); if (!files.isEmpty()) { - return files.stream().map(f -> convertToDockerComposeService(f.getCode(), f.getProjectId())) - .map(dcs -> { - Optional<Integer> port = dcs.getPortsMap().entrySet().stream() - .filter(e -> Objects.equals(e.getValue(), INTERNAL_PORT)).map(Map.Entry::getKey).findFirst(); - return port.orElse(INTERNAL_PORT); - }) + return files.stream().map(this::getProjectPort) + .filter(Objects::nonNull) .mapToInt(Integer::intValue) .max().orElse(INTERNAL_PORT); } else { @@ -305,6 +301,13 @@ public class CodeService { } } + public Integer getProjectPort(ProjectFile composeFile) { + DockerComposeService dcs = convertToDockerComposeService(composeFile.getCode(), composeFile.getProjectId()); + Optional<Integer> port = dcs.getPortsMap().entrySet().stream() + .filter(e -> Objects.equals(e.getValue(), INTERNAL_PORT)).map(Map.Entry::getKey).findFirst(); + return port.orElse(null); + } + public DockerComposeService getInternalDockerComposeService (String name) { String composeText = getResourceFile("/services/internal.yaml"); diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java index 1ec31c08..009e6ee8 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java @@ -138,6 +138,11 @@ public class ProjectService implements HealthCheck{ return project; } + public Integer getProjectPort(String projectId) { + ProjectFile composeFile = infinispanService.getProjectFile(projectId, PROJECT_COMPOSE_FILENAME); + return codeService.getProjectPort(composeFile); + } + public void pullCommits() { if (readyToPull.get()) { LOGGER.info("Pull commits..."); diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ScheduledService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ScheduledService.java index d4dad13a..b026d21d 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ScheduledService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ScheduledService.java @@ -80,20 +80,11 @@ public class ScheduledService { } } -// @Scheduled(every = "{karavan.container.infinispan.interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP) -// void checkInfinispanHealth() { -// if (!infinispanService.isReady()) { -// dockerForInfinispan.checkInfinispanHealth(); -// } -// } @Scheduled(every = "{karavan.camel.status.interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP) void collectCamelStatuses() { LOGGER.info("Collect info statuses"); - if (ConfigService.inKubernetes()) { - // collect Camel statuses - camelService.collectCamelStatuses(); - } + camelService.collectCamelStatuses(); } @Scheduled(every = "{karavan.git-pull-interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP) diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/ConfigService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/ConfigService.java index 6aa3591b..392da8a6 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/ConfigService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/ConfigService.java @@ -19,18 +19,20 @@ package org.apache.camel.karavan.shared; import io.quarkus.runtime.StartupEvent; import io.quarkus.runtime.configuration.ConfigUtils; import io.quarkus.runtime.configuration.ProfileManager; +import io.vertx.core.Vertx; +import jakarta.inject.Inject; import org.eclipse.microprofile.config.inject.ConfigProperty; import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.event.Observes; + +import java.nio.file.Paths; import java.util.List; import java.util.Objects; @ApplicationScoped public class ConfigService { - public static final String HEADLESS_MODE = "headless"; - @ConfigProperty(name = "karavan.version") String version; @@ -47,6 +49,8 @@ public class ConfigService { List<String> runtimes; private Configuration configuration; + private static Boolean inKubernetes; + private static Boolean inDocker; void onStart(@Observes StartupEvent ev) { configuration = new Configuration( @@ -64,11 +68,17 @@ public class ConfigService { } public static boolean inKubernetes() { - return Objects.nonNull(System.getenv("KUBERNETES_SERVICE_HOST")); + if (inKubernetes == null) { + inKubernetes = Objects.nonNull(System.getenv("KUBERNETES_SERVICE_HOST")); + } + return inKubernetes; } - public static boolean isHeadless() { - return ConfigUtils.isProfileActive(HEADLESS_MODE); + public static boolean inDocker() { + if (inDocker == null) { + inDocker = Vertx.vertx().fileSystem().existsBlocking(".dockerenv"); + } + return inDocker; } public static boolean isDevOrTest() { diff --git a/karavan-web/karavan-app/src/main/resources/application.properties b/karavan-web/karavan-app/src/main/resources/application.properties index 79e37e0a..d666d97c 100644 --- a/karavan-web/karavan-app/src/main/resources/application.properties +++ b/karavan-web/karavan-app/src/main/resources/application.properties @@ -3,7 +3,7 @@ karavan.environment=dev karavan.environments=dev karavan.default-runtime=camel-main karavan.runtimes=camel-main,quarkus,spring-boot -karavan.camel.status.interval=off +karavan.camel.status.interval=3s karavan.container.status.interval=3s karavan.container.infinispan.interval=5s karavan.devmode.image=ghcr.io/apache/camel-karavan-devmode:4.0.0-RC2 diff --git a/karavan-web/karavan-app/src/main/webui/src/project/dashboard/InfoContainer.tsx b/karavan-web/karavan-app/src/main/webui/src/project/dashboard/InfoContainer.tsx index 1b37998f..7b498737 100644 --- a/karavan-web/karavan-app/src/main/webui/src/project/dashboard/InfoContainer.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/project/dashboard/InfoContainer.tsx @@ -42,7 +42,7 @@ export function InfoContainer (props: Props) { return ( <DescriptionList isHorizontal> <DescriptionListGroup> - <DescriptionListTerm>Pod</DescriptionListTerm> + <DescriptionListTerm>Container</DescriptionListTerm> <DescriptionListDescription> {getPodInfoLabel(containerStatus.containerName)} </DescriptionListDescription> diff --git a/karavan-web/karavan-infinispan/src/main/java/org/apache/camel/karavan/infinispan/CodeReloadListener.java b/karavan-web/karavan-infinispan/src/main/java/org/apache/camel/karavan/infinispan/CodeReloadListener.java deleted file mode 100644 index 8c369157..00000000 --- a/karavan-web/karavan-infinispan/src/main/java/org/apache/camel/karavan/infinispan/CodeReloadListener.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.apache.camel.karavan.infinispan; - -import io.vertx.core.eventbus.EventBus; -import io.vertx.core.json.JsonObject; -import org.apache.camel.karavan.infinispan.model.GroupedKey; -import org.infinispan.client.hotrod.annotation.ClientCacheEntryCreated; -import org.infinispan.client.hotrod.annotation.ClientCacheEntryModified; -import org.infinispan.client.hotrod.annotation.ClientListener; -import org.infinispan.client.hotrod.event.ClientCacheEntryCreatedEvent; -import org.infinispan.client.hotrod.event.ClientCacheEntryModifiedEvent; - -@ClientListener -public class CodeReloadListener { - private final EventBus eventBus; - - public CodeReloadListener(EventBus eventBus) { - this.eventBus = eventBus; - } - - @ClientCacheEntryCreated - public void entryCreated(ClientCacheEntryCreatedEvent<GroupedKey> event) { - eventBus.publish(InfinispanService.CODE_RELOAD_COMMAND_INTERNAL, JsonObject.mapFrom(event.getKey())); - } - - @ClientCacheEntryModified - public void entryModified(ClientCacheEntryModifiedEvent<GroupedKey> event) { - eventBus.publish(InfinispanService.CODE_RELOAD_COMMAND_INTERNAL, JsonObject.mapFrom(event.getKey())); - } - -} \ No newline at end of file