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/07/28 23:12:56 UTC
[camel-karavan] branch main updated: first reload fix #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
The following commit(s) were added to refs/heads/main by this push:
new e72950c4 first reload fix #817
e72950c4 is described below
commit e72950c4a2dfc939a5b0b4b2ebaaa238099fbd9d
Author: Marat Gubaidullin <ma...@gmail.com>
AuthorDate: Fri Jul 28 19:12:40 2023 -0400
first reload fix #817
---
karavan-web/karavan-app/pom.xml | 13 ++++++
.../camel/karavan/docker/DockerEventListener.java | 10 +++--
.../apache/camel/karavan/docker/DockerService.java | 9 +----
.../apache/camel/karavan/service/CodeService.java | 2 +-
.../apache/camel/karavan/service/DelayRoute.java | 16 ++++++++
.../apache/camel/karavan/service/EventService.java | 46 ++++++++++++++++++----
.../org/apache/camel/karavan/shared/Constants.java | 1 +
.../org/apache/camel/karavan/shared/EventType.java | 1 +
.../{dev-services.yaml => devservices.yaml} | 0
.../karavan/infinispan/InfinispanService.java | 10 +++--
karavan-web/pom.xml | 7 ++++
11 files changed, 92 insertions(+), 23 deletions(-)
diff --git a/karavan-web/karavan-app/pom.xml b/karavan-web/karavan-app/pom.xml
index 4cfebe81..848d8da2 100644
--- a/karavan-web/karavan-app/pom.xml
+++ b/karavan-web/karavan-app/pom.xml
@@ -126,6 +126,19 @@
<artifactId>camel-openapi-rest-dsl-generator</artifactId>
<version>${camel.version}</version>
</dependency>
+ <dependency>
+ <groupId>org.apache.camel.quarkus</groupId>
+ <artifactId>camel-quarkus-core</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel.quarkus</groupId>
+ <artifactId>camel-quarkus-vertx</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-endpointdsl</artifactId>
+ <version>${camel.version}</version>
+ </dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-container-image-docker</artifactId>
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventListener.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventListener.java
index 34a2905f..06fcae8a 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventListener.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventListener.java
@@ -6,6 +6,7 @@ import com.github.dockerjava.api.model.ContainerPort;
import com.github.dockerjava.api.model.Event;
import com.github.dockerjava.api.model.EventType;
import io.vertx.core.eventbus.EventBus;
+import io.vertx.core.json.JsonObject;
import org.apache.camel.karavan.infinispan.InfinispanService;
import org.apache.camel.karavan.infinispan.model.ContainerStatus;
import org.eclipse.microprofile.config.inject.ConfigProperty;
@@ -19,8 +20,7 @@ import java.time.Instant;
import java.util.*;
import java.util.stream.Collectors;
-import static org.apache.camel.karavan.shared.Constants.LABEL_PROJECT_ID;
-import static org.apache.camel.karavan.shared.Constants.LABEL_TYPE;
+import static org.apache.camel.karavan.shared.Constants.*;
import static org.apache.camel.karavan.shared.EventType.DEVMODE_CONTAINER_READY;
import static org.apache.camel.karavan.shared.EventType.INFINISPAN_STARTED;
@@ -117,7 +117,11 @@ public class DockerEventListener implements ResultCallback<Event> {
String status = event.getStatus();
String health = status.replace("health_status: ", "");
LOGGER.infof("Container %s health status: %s", container.getNames()[0], health);
- eventBus.publish(DEVMODE_CONTAINER_READY, container.getLabels().get(LABEL_PROJECT_ID));
+ Map<String, Object> message = Map.of(
+ LABEL_PROJECT_ID, container.getLabels().get(LABEL_PROJECT_ID),
+ RELOAD_TRY_COUNT, 1
+ );
+ eventBus.publish(DEVMODE_CONTAINER_READY, JsonObject.mapFrom(message));
}
private boolean inDevMode(Container container) {
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 03e8b378..d8940e4c 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
@@ -29,28 +29,21 @@ import com.github.dockerjava.core.DockerClientImpl;
import com.github.dockerjava.core.InvocationBuilder;
import com.github.dockerjava.httpclient5.ApacheDockerHttpClient;
import com.github.dockerjava.transport.DockerHttpClient;
-import io.smallrye.mutiny.tuples.Tuple2;
import io.vertx.core.eventbus.EventBus;
-import io.vertx.core.json.JsonObject;
import org.apache.camel.karavan.docker.model.DevService;
import org.apache.camel.karavan.infinispan.model.ContainerStatus;
-import org.apache.camel.karavan.infinispan.model.Project;
-import org.apache.camel.karavan.service.CodeService;
import org.eclipse.microprofile.config.inject.ConfigProperty;
import org.jboss.logging.Logger;
-import org.yaml.snakeyaml.Yaml;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import java.io.IOException;
-import java.text.DecimalFormat;
import java.time.Instant;
import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
import static org.apache.camel.karavan.shared.Constants.*;
-import static org.apache.camel.karavan.shared.EventType.*;
+import static org.apache.camel.karavan.shared.EventType.INFINISPAN_STARTED;
@ApplicationScoped
public class DockerService extends DockerServiceUtils {
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 73505065..b16c402d 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
@@ -51,7 +51,7 @@ public class CodeService {
private static final Logger LOGGER = Logger.getLogger(CodeService.class.getName());
public static final String APPLICATION_PROPERTIES_FILENAME = "application.properties";
- public static final String DEV_SERVICES_FILENAME = "dev-services.yaml";
+ public static final String DEV_SERVICES_FILENAME = "devservices.yaml";
@Inject
KubernetesService kubernetesService;
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/DelayRoute.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/DelayRoute.java
new file mode 100644
index 00000000..ba6f4794
--- /dev/null
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/DelayRoute.java
@@ -0,0 +1,16 @@
+package org.apache.camel.karavan.service;
+
+import org.apache.camel.builder.endpoint.EndpointRouteBuilder;
+
+import static org.apache.camel.karavan.shared.EventType.DELAY_MESSAGE;
+import static org.apache.camel.karavan.shared.EventType.DEVMODE_CONTAINER_READY;
+
+public class DelayRoute extends EndpointRouteBuilder {
+
+ @Override
+ public void configure() throws Exception {
+ from(vertx(DELAY_MESSAGE))
+ .delay(500)
+ .to(vertx(DEVMODE_CONTAINER_READY));
+ }
+}
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/EventService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/EventService.java
index 073f6dbd..dad190c6 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/EventService.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/EventService.java
@@ -1,10 +1,12 @@
package org.apache.camel.karavan.service;
import io.quarkus.vertx.ConsumeEvent;
+import io.vertx.core.eventbus.DeliveryOptions;
import io.vertx.core.eventbus.EventBus;
import io.vertx.core.json.JsonObject;
import org.apache.camel.karavan.docker.DockerService;
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.kubernetes.KubernetesService;
import org.apache.camel.karavan.shared.ConfigService;
@@ -14,9 +16,11 @@ import org.jboss.logging.Logger;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
-import java.io.IOException;
+import java.util.Map;
import java.util.Objects;
+import static org.apache.camel.karavan.shared.Constants.LABEL_PROJECT_ID;
+import static org.apache.camel.karavan.shared.Constants.RELOAD_TRY_COUNT;
import static org.apache.camel.karavan.shared.EventType.*;
@ApplicationScoped
@@ -43,7 +47,7 @@ public class EventService {
ProjectService projectService;
@Inject
- EventBus bus;
+ EventBus eventBus;
@ConsumeEvent(value = INFINISPAN_STARTED, blocking = true, ordered = true)
void startServices(String infinispanHealth) {
@@ -54,8 +58,8 @@ public class EventService {
dockerService.startKaravanHeadlessContainer();
dockerService.collectContainersStatuses();
}
- bus.publish(EventType.IMPORT_PROJECTS, "");
- bus.publish(EventType.START_INFRASTRUCTURE_LISTENERS, "");
+ eventBus.publish(EventType.IMPORT_PROJECTS, "");
+ eventBus.publish(EventType.START_INFRASTRUCTURE_LISTENERS, "");
}
}
@@ -75,15 +79,41 @@ public class EventService {
}
@ConsumeEvent(value = DEVMODE_CONTAINER_READY, blocking = true, ordered = true)
- void receiveCommand(String projectId) {
- LOGGER.info("DEVMODE_CONTAINER_READY " + projectId);
+ void receiveCommand(JsonObject json) {
+ String projectId = json.getString(LABEL_PROJECT_ID);
+ Integer reloadCount = json.getInteger(RELOAD_TRY_COUNT);
+ LOGGER.info("DEVMODE_CONTAINER_READY " + projectId + " : " + reloadCount);
ContainerStatus status = infinispanService.getContainerStatus(projectId, environment, projectId);
- if (status != null && !status.getCodeLoaded() && status.getContainerId() != null && status.getState().equals(ContainerStatus.State.running.name())) {
+ CamelStatus cs = infinispanService.getCamelStatus(projectId, environment, CamelStatus.Name.context.name());
+ if (status != null
+ && !status.getCodeLoaded()
+ && status.getContainerId() != null
+ && status.getState().equals(ContainerStatus.State.running.name())
+ && camelIsStarted(cs)) {
+ LOGGER.info("CAMEL STARTED -> SEND RELOAD");
if (ConfigService.inKubernetes()) {
camelService.reloadProjectCode(projectId);
} else {
infinispanService.sendCodeReloadCommand(projectId);
}
+ } else if (reloadCount < 30) {
+ LOGGER.info("CAMEL NOT STARTED -> SEND DEVMODE_CONTAINER_READY");
+ // retry again
+ Map<String, Object> message = Map.of(
+ LABEL_PROJECT_ID, projectId,
+ RELOAD_TRY_COUNT, ++reloadCount
+ );
+ eventBus.publish(DELAY_MESSAGE, JsonObject.mapFrom(message));
+ }
+ }
+
+ private boolean camelIsStarted(CamelStatus camelStatus) {
+ try {
+ String status = camelStatus.getStatus();
+ JsonObject obj = new JsonObject(status);
+ return Objects.equals("Started", obj.getJsonObject("context").getString("state"));
+ } catch (Exception e) {
+ return false;
}
}
@@ -94,7 +124,7 @@ public class EventService {
ContainerStatus oldStatus = infinispanService.getContainerStatus(newStatus.getProjectId(), newStatus.getEnv(), newStatus.getContainerName());
if (oldStatus == null || Objects.equals(oldStatus.getInTransit(), Boolean.FALSE)) {
infinispanService.saveContainerStatus(newStatus);
- } else if (Objects.equals(oldStatus.getInTransit(), Boolean.TRUE)){
+ } else if (Objects.equals(oldStatus.getInTransit(), Boolean.TRUE)) {
if (!Objects.equals(oldStatus.getState(), newStatus.getState())) {
infinispanService.saveContainerStatus(newStatus);
}
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/Constants.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/Constants.java
index 07834b3b..1d7467fc 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/Constants.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/Constants.java
@@ -23,4 +23,5 @@ public class Constants {
public static final String LABEL_TYPE = "org.apache.camel.karavan/type";
public static final String LABEL_PROJECT_ID = "org.apache.camel.karavan/projectId";
+ public static final String RELOAD_TRY_COUNT = "reloadTryCount";
}
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/EventType.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/EventType.java
index 3a375e41..112cea18 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/EventType.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/EventType.java
@@ -28,5 +28,6 @@ public class EventType {
public static final String CONTAINER_STATUS = "CONTAINER_STATUS";
public static final String DEVMODE_CONTAINER_READY = "DEVMODE_STATUS";
+ public static final String DELAY_MESSAGE = "DELAY_MESSAGE";
}
diff --git a/karavan-web/karavan-app/src/main/resources/services/dev-services.yaml b/karavan-web/karavan-app/src/main/resources/services/devservices.yaml
similarity index 100%
rename from karavan-web/karavan-app/src/main/resources/services/dev-services.yaml
rename to karavan-web/karavan-app/src/main/resources/services/devservices.yaml
diff --git a/karavan-web/karavan-infinispan/src/main/java/org/apache/camel/karavan/infinispan/InfinispanService.java b/karavan-web/karavan-infinispan/src/main/java/org/apache/camel/karavan/infinispan/InfinispanService.java
index 839de24c..a52ada10 100644
--- a/karavan-web/karavan-infinispan/src/main/java/org/apache/camel/karavan/infinispan/InfinispanService.java
+++ b/karavan-web/karavan-infinispan/src/main/java/org/apache/camel/karavan/infinispan/InfinispanService.java
@@ -81,9 +81,9 @@ public class InfinispanService {
private static final String DEFAULT_ENVIRONMENT = "dev";
public static final String CODE_RELOAD_COMMAND = "CODE_RELOAD_COMMAND";
- public static final String CODE_RELOAD_COMMAND_INTERNAL = "CODE_RELOAD_COMMAND_INTERNAL";
+ protected static final String CODE_RELOAD_COMMAND_INTERNAL = "CODE_RELOAD_COMMAND_INTERNAL";
- public void start(boolean startCodeReloadListeners) {
+ public void start(boolean startCodeReloadListener) {
LOGGER.info("InfinispanService is starting in remote mode");
ProtoStreamMarshaller marshaller = new ProtoStreamMarshaller();
@@ -114,7 +114,7 @@ public class InfinispanService {
cacheManager.getCache(PROTOBUF_METADATA_CACHE_NAME).put("karavan.proto", getResourceFile("/proto/karavan.proto"));
- if (startCodeReloadListeners) {
+ if (startCodeReloadListener) {
cacheManager.getCache("code_reload_commands").addClientListener(new CodeReloadListener(eventBus));
}
@@ -312,6 +312,10 @@ public class InfinispanService {
return camelStatuses.get(key);
}
+ public CamelStatus getCamelStatus(GroupedKey key) {
+ return camelStatuses.get(key);
+ }
+
public List<CamelStatus> getCamelStatusesByEnv(String env, CamelStatus.Name name) {
QueryFactory queryFactory = Search.getQueryFactory(camelStatuses);
return queryFactory.<CamelStatus>create("FROM karavan.CamelStatus WHERE env = :env AND name = :name")
diff --git a/karavan-web/pom.xml b/karavan-web/pom.xml
index 124eb8c5..c83d60c9 100644
--- a/karavan-web/pom.xml
+++ b/karavan-web/pom.xml
@@ -52,6 +52,13 @@
<type>pom</type>
<scope>import</scope>
</dependency>
+ <dependency>
+ <groupId>${quarkus.platform.group-id}</groupId>
+ <artifactId>quarkus-camel-bom</artifactId>
+ <version>${quarkus.platform.version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
</dependencies>
</dependencyManagement>