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 <marat.gubaidul...@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>