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>