You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ma...@apache.org on 2023/09/11 15:13:41 UTC
[camel-karavan] 01/02: Fix Kubernetess mode for #817
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 f12ed08d8694789c4020105534e3ece5a1485d8c
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Sun Sep 10 17:46:18 2023 -0400
Fix Kubernetess mode for #817
---
.../apache/camel/karavan/api/ImagesResource.java | 8 +++--
.../org/apache/camel/karavan/code/CodeService.java | 25 ++++++++++++---
.../camel/karavan/docker/DockerForGitea.java | 1 -
.../apache/camel/karavan/docker/DockerService.java | 16 +++-------
.../org/apache/camel/karavan/git/GitService.java | 3 +-
.../org/apache/camel/karavan/git/GiteaService.java | 21 +++++++++++--
.../karavan/kubernetes/KubernetesService.java | 28 +++++++++++------
.../camel/karavan/kubernetes/PodEventHandler.java | 20 ++++++------
.../apache/camel/karavan/service/CamelService.java | 36 +++++++++++++++++-----
.../camel/karavan/service/ConfigService.java | 3 +-
.../karavan/service/ContainerStatusService.java | 20 +++++++-----
.../camel/karavan/service/KaravanService.java | 12 +++++---
.../camel/karavan/service/ProjectService.java | 3 +-
.../src/main/resources/application.properties | 7 ++++-
14 files changed, 138 insertions(+), 65 deletions(-)
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java
index 0c172856..9f5e64b0 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java
@@ -49,9 +49,13 @@ public class ImagesResource {
@Produces(MediaType.APPLICATION_JSON)
@Path("/{projectId}")
public List<String> getImagesForProject(@HeaderParam("username") String username,
- @PathParam("projectId") String projectId) throws Exception {
+ @PathParam("projectId") String projectId) {
String pattern = registryService.getRegistryWithGroup() + "/" + projectId;
- return dockerService.getImages().stream().filter(s -> s.startsWith(pattern)).sorted(Comparator.reverseOrder()).toList();
+ if (ConfigService.inKubernetes()) {
+ return List.of();
+ } else {
+ return dockerService.getImages().stream().filter(s -> s.startsWith(pattern)).sorted(Comparator.reverseOrder()).toList();
+ }
}
@POST
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/CodeService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/CodeService.java
index c86eefc6..b0ea0b9a 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/CodeService.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/CodeService.java
@@ -23,6 +23,8 @@ import io.apicurio.datamodels.openapi.models.OasDocument;
import io.quarkus.qute.Engine;
import io.quarkus.qute.Template;
import io.quarkus.qute.TemplateInstance;
+import io.vertx.core.Vertx;
+import io.vertx.core.buffer.Buffer;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.apache.camel.CamelContext;
@@ -43,10 +45,7 @@ import org.yaml.snakeyaml.LoaderOptions;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.SafeConstructor;
-import java.io.BufferedReader;
-import java.io.FileNotFoundException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
+import java.io.*;
import java.time.Instant;
import java.util.*;
import java.util.stream.Collectors;
@@ -76,6 +75,9 @@ public class CodeService {
@Inject
Engine engine;
+ @Inject
+ Vertx vertx;
+
List<String> runtimes = List.of("quarkus", "spring-boot", "camel-main");
List<String> targets = List.of("openshift", "kubernetes", "docker");
List<String> interfaces = List.of("org.apache.camel.AggregationStrategy.java", "org.apache.camel.Processor.java");
@@ -106,6 +108,21 @@ public class CodeService {
return new ProjectFile(APPLICATION_PROPERTIES_FILENAME, code, project.getProjectId(), Instant.now().toEpochMilli());
}
+ public String saveProjectFilesInTemp(Map<String, String> files) {
+ String temp = vertx.fileSystem().createTempDirectoryBlocking("temp");
+ files.forEach((fileName, code) -> addFile(temp, fileName, code));
+ return temp;
+ }
+
+ private void addFile(String temp, String fileName, String code) {
+ try {
+ String path = temp + File.separator + fileName;
+ vertx.fileSystem().writeFileBlocking(path, Buffer.buffer(code));
+ } catch (Exception e) {
+ LOGGER.error(e.getMessage());
+ }
+ }
+
public String getTemplateText(String fileName) {
try {
List<ProjectFile> files = infinispanService.getProjectFiles(Project.Type.templates.name());
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForGitea.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForGitea.java
index d1dd236f..ab7bf72d 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForGitea.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForGitea.java
@@ -72,7 +72,6 @@ public class DockerForGitea {
"--admin");
dockerService.execStart(user.getId(), new LoggerCallback());
LOGGER.info("Created Gitea User");
- giteaService.createRepository();
} catch (Exception e) {
LOGGER.error(e.getMessage());
}
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java
index f15d5b4e..a3e35ee0 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java
@@ -30,6 +30,7 @@ import io.vertx.core.Vertx;
import io.vertx.core.buffer.Buffer;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
+import org.apache.camel.karavan.code.CodeService;
import org.apache.camel.karavan.code.model.DockerComposeService;
import org.apache.camel.karavan.infinispan.model.ContainerStatus;
import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
@@ -60,6 +61,9 @@ public class DockerService extends DockerServiceUtils {
@Inject
DockerEventListener dockerEventListener;
+ @Inject
+ CodeService codeService;
+
@Inject
Vertx vertx;
@@ -256,8 +260,7 @@ public class DockerService extends DockerServiceUtils {
}
public void copyFiles(String containerId, String containerPath, Map<String, String> files) {
- String temp = vertx.fileSystem().createTempDirectoryBlocking(containerId);
- files.forEach((fileName, code) -> addFile(temp, fileName, code));
+ String temp = codeService.saveProjectFilesInTemp(files);
dockerClient.copyArchiveToContainerCmd(containerId).withRemotePath(containerPath)
.withDirChildrenOnly(true).withHostResource(temp).exec();
}
@@ -289,15 +292,6 @@ public class DockerService extends DockerServiceUtils {
}
}
- private void addFile(String temp, String fileName, String code) {
- try {
- String path = temp + File.separator + fileName;
- vertx.fileSystem().writeFileBlocking(path, Buffer.buffer(code));
- } catch (Exception e) {
- LOGGER.error(e.getMessage());
- }
- }
-
public void logContainer(String containerName, LogCallback callback) {
try {
Container container = getContainerByName(containerName);
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/git/GitService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/git/GitService.java
index 534781e6..71a2f363 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/git/GitService.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/git/GitService.java
@@ -88,7 +88,6 @@ public class GitService {
String propertiesPrefix = "karavan.";
String branch = ConfigProvider.getConfig().getValue(propertiesPrefix + "git-branch", String.class);
if (ConfigService.inKubernetes()) {
- LOGGER.info("inKubernetes " + kubernetesService.getNamespace());
Secret secret = kubernetesService.getKaravanSecret();
String uri = new String(Base64.getDecoder().decode(secret.getData().get("git-repository").getBytes(StandardCharsets.UTF_8)));
String username = new String(Base64.getDecoder().decode(secret.getData().get("git-username").getBytes(StandardCharsets.UTF_8)));
@@ -443,7 +442,7 @@ public class GitService {
return files;
}
- @Retry(maxRetries = 100, delay = 2000)
+// @Retry(maxRetries = 100, delay = 2000)
public boolean checkGit() throws Exception {
LOGGER.info("Check git");
GitConfig gitConfig = getGitConfig();
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/git/GiteaService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/git/GiteaService.java
index 7ad208e7..8c7b281a 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/git/GiteaService.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/git/GiteaService.java
@@ -28,6 +28,8 @@ import org.apache.camel.karavan.service.ConfigService;
import org.eclipse.microprofile.faulttolerance.Retry;
import org.jboss.logging.Logger;
+import java.net.MalformedURLException;
+import java.net.URL;
import java.util.List;
import java.util.Map;
@@ -110,7 +112,8 @@ public class GiteaService {
}
LOGGER.info("Creating Gitea User Token");
GitConfig config = gitService.getGitConfig();
- HttpResponse<Buffer> result = getWebClient().postAbs(getGiteaBaseUrl() + "/api/v1/users/" + config.getUsername() + "/tokens").timeout(500)
+ String uri = getGiteaBaseUrl() + "/api/v1/users/" + config.getUsername() + "/tokens";
+ HttpResponse<Buffer> result = getWebClient().postAbs(uri).timeout(500)
.putHeader("Content-Type", "application/json")
.putHeader("accept", "application/json")
.basicAuthentication(config.getUsername(), config.getPassword())
@@ -123,6 +126,7 @@ public class GiteaService {
} else if (result.statusCode() == 201) {
JsonObject res = result.bodyAsJsonObject();
token = res.getString("sha1");
+ LOGGER.info("Gitea User Token received");
return token;
} else {
LOGGER.info("Error getting token");
@@ -145,7 +149,18 @@ public class GiteaService {
}
}
- private String getGiteaBaseUrl(){
- return ConfigService.inDocker() ? "http://gitea:3000" : "http://localhost:3000";
+ private String getGiteaBaseUrl() throws MalformedURLException {
+ if (ConfigService.inDocker()) {
+ return "http://gitea:3000";
+ } else if (ConfigService.inKubernetes()) {
+ String uri = gitService.getGitConfig().getUri();
+ URL url = new URL(uri);
+ String protocol = url.getProtocol();
+ String host = url.getHost();
+ int port = url.getPort();
+ return protocol + "://" + host + (port > 0 ? ":" + port : "");
+ } else {
+ return "http://localhost:3000";
+ }
}
}
\ No newline at end of file
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java
index 4c84c03d..f04949e2 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java
@@ -35,6 +35,7 @@ import org.apache.camel.karavan.infinispan.model.ProjectFile;
import org.apache.camel.karavan.code.CodeService;
import org.apache.camel.karavan.service.ConfigService;
import org.eclipse.microprofile.config.inject.ConfigProperty;
+import org.eclipse.microprofile.faulttolerance.Retry;
import org.eclipse.microprofile.health.HealthCheck;
import org.eclipse.microprofile.health.HealthCheckResponse;
import org.eclipse.microprofile.health.Readiness;
@@ -44,6 +45,10 @@ import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.inject.Default;
import jakarta.enterprise.inject.Produces;
import jakarta.inject.Inject;
+
+import java.io.ByteArrayInputStream;
+import java.nio.file.Path;
+import java.nio.file.Paths;
import java.util.*;
import java.util.stream.Collectors;
@@ -56,7 +61,7 @@ import static org.apache.camel.karavan.shared.Constants.*;
public class KubernetesService implements HealthCheck {
private static final Logger LOGGER = Logger.getLogger(KubernetesService.class.getName());
- protected static final int INFORMERS = 4;
+ protected static final int INFORMERS = 3;
private static final String CAMEL_PREFIX = "camel";
private static final String KARAVAN_PREFIX = "karavan";
private static final String JBANG_CACHE_SUFFIX = "jbang-cache";
@@ -69,6 +74,9 @@ public class KubernetesService implements HealthCheck {
@Inject
InfinispanService infinispanService;
+ @Inject
+ CodeService codeService;
+
@Produces
public KubernetesClient kubernetesClient() {
return new DefaultKubernetesClient();
@@ -107,10 +115,10 @@ public class KubernetesService implements HealthCheck {
serviceInformer.addEventHandlerWithResyncPeriod(new ServiceEventHandler(infinispanService, this), 30 * 1000L);
informers.add(serviceInformer);
- SharedIndexInformer<PipelineRun> pipelineRunInformer = tektonClient().v1beta1().pipelineRuns().inNamespace(getNamespace())
- .withLabels(getRuntimeLabels()).inform();
- pipelineRunInformer.addEventHandlerWithResyncPeriod(new PipelineRunEventHandler(infinispanService, this), 30 * 1000L);
- informers.add(pipelineRunInformer);
+// SharedIndexInformer<PipelineRun> pipelineRunInformer = tektonClient().v1beta1().pipelineRuns().inNamespace(getNamespace())
+// .withLabels(getRuntimeLabels()).inform();
+// pipelineRunInformer.addEventHandlerWithResyncPeriod(new PipelineRunEventHandler(infinispanService, this), 30 * 1000L);
+// informers.add(pipelineRunInformer);
SharedIndexInformer<Pod> podRunInformer = kubernetesClient().pods().inNamespace(getNamespace())
.withLabels(getRuntimeLabels()).inform();
@@ -426,6 +434,7 @@ public class KubernetesService implements HealthCheck {
labels.putAll(getRuntimeLabels());
labels.putAll(getKaravanRunnerLabels(name));
labels.put(LABEL_PROJECT_ID, projectId);
+ labels.put(LABEL_TYPE, ContainerStatus.ContainerType.devmode.name());
ResourceRequirements resources = getResourceRequirements(containerResources);
@@ -448,10 +457,11 @@ public class KubernetesService implements HealthCheck {
.withResources(resources)
.withImagePullPolicy("Always")
.withEnv(new EnvVarBuilder().withName(ENV_VAR_JBANG_OPTIONS).withValue(jbangOptions).build())
- .withVolumeMounts(
- new VolumeMountBuilder().withName(name).withMountPath("/karavan/.jbang/cache").build(),
- new VolumeMountBuilder().withName("maven-settings").withSubPath("maven-settings.xml")
- .withMountPath("/karavan-config-map/maven-settings.xml").build())
+// .withVolumeMounts(
+// new VolumeMountBuilder().withName(name).withMountPath("/karavan/.jbang/cache").build()
+// new VolumeMountBuilder().withName("maven-settings").withSubPath("maven-settings.xml")
+// .withMountPath("/karavan-config-map/maven-settings.xml").build()
+// )
.build();
PodSpec spec = new PodSpecBuilder()
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java
index a783df7c..1eaf01b8 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java
@@ -9,14 +9,17 @@ import io.vertx.core.json.JsonObject;
import io.vertx.mutiny.core.eventbus.EventBus;
import org.apache.camel.karavan.infinispan.InfinispanService;
import org.apache.camel.karavan.infinispan.model.ContainerStatus;
+import org.apache.camel.karavan.infinispan.model.ProjectFile;
import org.jboss.logging.Logger;
import java.util.List;
import java.util.Objects;
import static org.apache.camel.karavan.code.CodeService.DEFAULT_CONTAINER_RESOURCES;
+import static org.apache.camel.karavan.service.CamelService.RELOAD_PROJECT_CODE;
import static org.apache.camel.karavan.shared.Constants.LABEL_PROJECT_ID;
import static org.apache.camel.karavan.service.ContainerStatusService.CONTAINER_STATUS;
+import static org.apache.camel.karavan.shared.Constants.LABEL_TYPE;
public class PodEventHandler implements ResourceEventHandler<Pod> {
@@ -39,7 +42,7 @@ public class PodEventHandler implements ResourceEventHandler<Pod> {
if (ps != null) {
eventBus.send(CONTAINER_STATUS, JsonObject.mapFrom(ps));
}
- } catch (Exception e){
+ } catch (Exception e) {
LOGGER.error(e.getMessage(), e.getCause());
}
}
@@ -52,16 +55,9 @@ public class PodEventHandler implements ResourceEventHandler<Pod> {
ContainerStatus ps = getPodStatus(newPod);
if (ps != null) {
eventBus.send(CONTAINER_STATUS, JsonObject.mapFrom(ps));
- if (Objects.equals(ps.getState(), ContainerStatus.State.running.name())) {
-// Map<String, Object> message = Map.of(
-// LABEL_PROJECT_ID, ps.getProjectId(),
-// RELOAD_TRY_COUNT, 1
-// );
-// eventBus.publish(DEVMODE_CONTAINER_READY, JsonObject.mapFrom(message));
- }
}
}
- } catch (Exception e){
+ } catch (Exception e) {
LOGGER.error(e.getMessage(), e.getCause());
}
}
@@ -74,7 +70,7 @@ public class PodEventHandler implements ResourceEventHandler<Pod> {
String projectId = deployment != null ? deployment : pod.getMetadata().getLabels().get(LABEL_PROJECT_ID);
infinispanService.deleteContainerStatus(projectId, kubernetesService.environment, pod.getMetadata().getName());
infinispanService.deleteCamelStatuses(projectId, kubernetesService.environment);
- } catch (Exception e){
+ } catch (Exception e) {
LOGGER.error(e.getMessage(), e.getCause());
}
}
@@ -83,6 +79,8 @@ public class PodEventHandler implements ResourceEventHandler<Pod> {
public ContainerStatus getPodStatus(Pod pod) {
String deployment = pod.getMetadata().getLabels().get("app");
String projectId = deployment != null ? deployment : pod.getMetadata().getLabels().get(LABEL_PROJECT_ID);
+ String type = deployment != null ? deployment : pod.getMetadata().getLabels().get(LABEL_TYPE);
+ ContainerStatus.ContainerType containerType = type != null ? ContainerStatus.ContainerType.valueOf(type) : ContainerStatus.ContainerType.unknown;
try {
boolean ready = pod.getStatus().getConditions().stream().anyMatch(c -> c.getType().equals("Ready"));
String creationTimestamp = pod.getMetadata().getCreationTimestamp();
@@ -100,7 +98,7 @@ public class PodEventHandler implements ResourceEventHandler<Pod> {
List.of(ContainerStatus.Command.delete),
projectId,
kubernetesService.environment,
- pod.getMetadata().getName().equals(projectId) ? ContainerStatus.ContainerType.devmode : ContainerStatus.ContainerType.project,
+ containerType,
requestMemory + " / " + limitMemory,
requestCpu + " / " + limitCpu,
creationTimestamp);
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 8bc62635..d9ca389a 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
@@ -27,14 +27,18 @@ import io.vertx.mutiny.ext.web.client.WebClient;
import org.apache.camel.karavan.infinispan.InfinispanService;
import org.apache.camel.karavan.infinispan.model.CamelStatus;
import org.apache.camel.karavan.infinispan.model.ContainerStatus;
+import org.apache.camel.karavan.infinispan.model.ProjectFile;
import org.apache.camel.karavan.kubernetes.KubernetesService;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.eclipse.microprofile.faulttolerance.CircuitBreaker;
+import org.eclipse.microprofile.faulttolerance.Retry;
import org.jboss.logging.Logger;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
import java.util.Objects;
import java.util.concurrent.ExecutionException;
@@ -43,6 +47,7 @@ public class CamelService {
private static final Logger LOGGER = Logger.getLogger(CamelService.class.getName());
public static final String CMD_COLLECT_CAMEL_STATUS = "collect-camel-status";
+ public static final String RELOAD_PROJECT_CODE = "RELOAD_PROJECT_CODE";
@Inject
InfinispanService infinispanService;
@@ -78,9 +83,11 @@ public class CamelService {
.filter(cs ->
cs.getType() == ContainerStatus.ContainerType.project
|| cs.getType() == ContainerStatus.ContainerType.devmode
- ).forEach(pod -> {
- CamelStatusRequest csr = new CamelStatusRequest(pod.getProjectId(), pod.getContainerName());
- eventBus.publish(CMD_COLLECT_CAMEL_STATUS, JsonObject.mapFrom(csr));
+ ).forEach(cs -> {
+ CamelStatusRequest csr = new CamelStatusRequest(cs.getProjectId(), cs.getContainerName());
+ eventBus.publish(CMD_COLLECT_CAMEL_STATUS,
+ JsonObject.mapFrom(Map.of("containerStatus", cs, "camelStatusRequest", csr))
+ );
});
}
}
@@ -95,11 +102,12 @@ public class CamelService {
}
}
+ @ConsumeEvent(value = RELOAD_PROJECT_CODE, blocking = true, ordered = true)
public void reloadProjectCode(String projectId) {
LOGGER.info("Reload project code " + projectId);
try {
- infinispanService.getProjectFiles(projectId).forEach(projectFile ->
- putRequest(projectId, projectFile.getName(), projectFile.getCode(), 1000));
+ List<ProjectFile> files = infinispanService.getProjectFiles(projectId);
+ files.forEach(projectFile -> putRequest(projectId, projectFile.getName(), projectFile.getCode(), 1000));
reloadRequest(projectId);
ContainerStatus containerStatus = infinispanService.getDevModeContainerStatus(projectId, environment);
containerStatus.setCodeLoaded(true);
@@ -134,7 +142,7 @@ public class CamelService {
public String getContainerAddress(String containerName) {
if (ConfigService.inKubernetes()) {
- return "http://" + containerName + "." + kubernetesService.getNamespace() + ".svc.cluster.local";
+ return "http://" + containerName + "." + kubernetesService.getNamespace();
} else if (ConfigService.inDocker()) {
return "http://" + containerName + ":8080";
} else {
@@ -145,7 +153,8 @@ public class CamelService {
@ConsumeEvent(value = CMD_COLLECT_CAMEL_STATUS, blocking = true, ordered = true)
public void collectCamelStatuses(JsonObject data) {
- CamelStatusRequest dms = data.mapTo(CamelStatusRequest.class);
+ CamelStatusRequest dms = data.getJsonObject("camelStatusRequest").mapTo(CamelStatusRequest.class);
+ ContainerStatus containerStatus = data.getJsonObject("containerStatus").mapTo(ContainerStatus.class);
String projectId = dms.getProjectId();
Arrays.stream(CamelStatus.Name.values()).forEach(statusName -> {
String containerName = dms.getContainerName();
@@ -153,10 +162,23 @@ public class CamelService {
if (status != null) {
CamelStatus cs = new CamelStatus(projectId, containerName, statusName, status, environment);
infinispanService.saveCamelStatus(cs);
+ if (ConfigService.inKubernetes() && Objects.equals(statusName, CamelStatus.Name.context)) {
+ checkReloadRequired(containerStatus);
+ }
}
});
}
+ private void checkReloadRequired(ContainerStatus cs) {
+ if (ConfigService.inKubernetes()) {
+ if (!Objects.equals(cs.getCodeLoaded(), true)
+ && Objects.equals(cs.getState(), ContainerStatus.State.running.name())
+ && Objects.equals(cs.getType(), ContainerStatus.ContainerType.devmode)) {
+ eventBus.publish(RELOAD_PROJECT_CODE, cs.getProjectId());
+ }
+ }
+ }
+
public String getCamelStatus(String podName, CamelStatus.Name statusName) {
String url = getContainerAddress(podName) + "/q/dev/" + statusName.name();
try {
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java
index a1e24955..349a41e2 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java
@@ -27,6 +27,7 @@ import org.eclipse.microprofile.config.inject.ConfigProperty;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.enterprise.event.Observes;
+import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;
import java.util.Objects;
@@ -77,7 +78,7 @@ public class ConfigService {
public static boolean inDocker() {
if (inDocker == null) {
- inDocker = Vertx.vertx().fileSystem().existsBlocking(".dockerenv");
+ inDocker = !inKubernetes() && Files.exists(Paths.get(".dockerenv"));
}
return inDocker;
}
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ContainerStatusService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ContainerStatusService.java
index c3b310bc..f6dbec9d 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ContainerStatusService.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ContainerStatusService.java
@@ -17,6 +17,8 @@ import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.Objects;
+import static org.apache.camel.karavan.service.CamelService.RELOAD_PROJECT_CODE;
+
@ApplicationScoped
public class ContainerStatusService {
@@ -36,7 +38,7 @@ public class ContainerStatusService {
@Scheduled(every = "{karavan.container.statistics.interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
void collectContainersStatistics() {
- if (infinispanService.isReady()) {
+ if (infinispanService.isReady() && !ConfigService.inKubernetes()) {
List<ContainerStatus> statusesInDocker = dockerService.collectContainersStatistics();
statusesInDocker.forEach(containerStatus -> {
eventBus.send(ContainerStatusService.CONTAINER_STATUS, JsonObject.mapFrom(containerStatus));
@@ -46,17 +48,19 @@ public class ContainerStatusService {
@Scheduled(every = "{karavan.container.status.interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
void collectContainersStatuses() {
- if (infinispanService.isReady()) {
- List<ContainerStatus> statusesInDocker = dockerService.collectContainersStatuses();
- statusesInDocker.forEach(containerStatus -> {
- eventBus.send(ContainerStatusService.CONTAINER_STATUS, JsonObject.mapFrom(containerStatus));
- });
- cleanContainersStatuses(statusesInDocker);
+ if (infinispanService.isReady() && !ConfigService.inKubernetes()) {
+ if (!ConfigService.inKubernetes()) {
+ List<ContainerStatus> statusesInDocker = dockerService.collectContainersStatuses();
+ statusesInDocker.forEach(containerStatus -> {
+ eventBus.send(ContainerStatusService.CONTAINER_STATUS, JsonObject.mapFrom(containerStatus));
+ });
+ cleanContainersStatuses(statusesInDocker);
+ }
}
}
void cleanContainersStatuses(List<ContainerStatus> statusesInDocker) {
- if (infinispanService.isReady()) {
+ if (infinispanService.isReady() && !ConfigService.inKubernetes()) {
List<String> namesInDocker = statusesInDocker.stream().map(ContainerStatus::getContainerName).toList();
List<ContainerStatus> statusesInInfinispan = infinispanService.getContainerStatuses(environment);
// clean deleted
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java
index 77f536d0..1b58d660 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java
@@ -80,7 +80,7 @@ public class KaravanService implements HealthCheck {
@Inject
ProjectService projectService;
- private static final String START_KUBERNETES_LISTENERS = "START_KUBERNETES_LISTENERS";
+ private static final String START_KUBERNETES_SERVICES = "START_KUBERNETES_LISTENERS";
private static final String START_INTERNAL_DOCKER_SERVICES = "START_INTERNAL_DOCKER_SERVICES";
private static final String START_SERVICES = "START_SERVICES";
@@ -93,7 +93,7 @@ public class KaravanService implements HealthCheck {
if (!ConfigService.inKubernetes()) {
eventBus.publish(START_INTERNAL_DOCKER_SERVICES, null);
} else {
- eventBus.publish(START_KUBERNETES_LISTENERS, null);
+ eventBus.publish(START_KUBERNETES_SERVICES, null);
}
eventBus.publish(START_SERVICES, null);
}
@@ -112,6 +112,7 @@ public class KaravanService implements HealthCheck {
dockerForGitea.startGitea();
giteaService.install();
dockerForGitea.createGiteaUser();
+ giteaService.createRepository();
}
if (registryInstall) {
dockerForRegistry.startRegistry();
@@ -119,9 +120,12 @@ public class KaravanService implements HealthCheck {
}
}
- @ConsumeEvent(value = START_KUBERNETES_LISTENERS, blocking = true)
- void startKubernetesListeners(String data) throws Exception {
+ @ConsumeEvent(value = START_KUBERNETES_SERVICES, blocking = true)
+ void startKubernetesServices(String data) throws Exception {
LOGGER.info("Starting Karavan in Kubernetes");
+ if (giteaInstall) {
+ giteaService.createRepository();
+ }
kubernetesService.startInformers(null);
}
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 b92d8e23..6f3cac08 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
@@ -111,6 +111,7 @@ public class ProjectService implements HealthCheck {
Map<String, String> files = infinispanService.getProjectFiles(project.getProjectId()).stream()
.filter(f -> !Objects.equals(f.getName(), PROJECT_COMPOSE_FILENAME))
.collect(Collectors.toMap(ProjectFile::getName, ProjectFile::getCode));
+
ProjectFile compose = infinispanService.getProjectFile(project.getProjectId(), PROJECT_COMPOSE_FILENAME);
DockerComposeService dcs = DockerComposeConverter.fromCode(compose.getCode(), project.getProjectId());
Map<String, String> volumes = mavenCache
@@ -206,7 +207,7 @@ public class ProjectService implements HealthCheck {
return codeService.getProjectPort(composeFile);
}
- @Retry(maxRetries = 100, delay = 2000)
+// @Retry(maxRetries = 100, delay = 2000)
public void tryStart() throws Exception {
if (infinispanService.isReady() && gitService.checkGit()) {
if (infinispanService.getProjects().isEmpty()) {
diff --git a/karavan-web/karavan-app/src/main/resources/application.properties b/karavan-web/karavan-app/src/main/resources/application.properties
index 4575a8b0..0b3dc433 100644
--- a/karavan-web/karavan-app/src/main/resources/application.properties
+++ b/karavan-web/karavan-app/src/main/resources/application.properties
@@ -3,11 +3,16 @@ karavan.environment=dev
karavan.environments=dev
karavan.default-runtime=camel-main
karavan.runtimes=camel-main,quarkus,spring-boot
+
karavan.camel.status.interval=2s
karavan.container.status.interval=2s
+# karavan.container.status.interval should be off in kubernetes
+
karavan.container.statistics.interval=10s
+# karavan.container.statistics.interval should be off in kubernetes
+
karavan.devmode.image=ghcr.io/apache/camel-karavan-devmode:4.0.0-RC2
-karavan.maven.cach
+karavan.maven.cache=
# Git repository Configuration
karavan.git-repository=http://gitea:3000/karavan/karavan.git