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 2024/06/06 16:25:55 UTC

(camel-karavan) 05/10: Refactored app

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 2ffd0a7c9628d6c456dc44ec3dacff80e39b84f4
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Thu Jun 6 12:06:51 2024 -0400

    Refactored app
---
 ...rEventListener.java => DockerEventHandler.java} |  4 +-
 .../CamelReloadListener.java}                      | 52 +++++++++---------
 .../{ => listener}/CamelStatusListener.java        | 23 ++++----
 .../DeploymentStatusListener.java                  |  0
 .../DockerStatusListener.java}                     | 59 ++++++++++++++++-----
 .../NotificationListener.java}                     |  6 +--
 .../PodContainerStatusListener.java}               | 61 ++++++----------------
 .../ServiceStatusListener.java                     |  0
 .../CamelStatusScheduler.java}                     | 21 ++++----
 .../DockerStatusScheduler.java                     | 40 +++-----------
 10 files changed, 125 insertions(+), 141 deletions(-)

diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventListener.java b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventHandler.java
similarity index 96%
rename from karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventListener.java
rename to karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventHandler.java
index 76f33446..da2a24e8 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventListener.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventHandler.java
@@ -24,7 +24,7 @@ import com.github.dockerjava.api.model.EventType;
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
 import org.apache.camel.karavan.RegistryService;
-import org.apache.camel.karavan.model.ContainerStatus;
+import org.apache.camel.karavan.model.PodContainerStatus;
 import org.jboss.logging.Logger;
 
 import java.io.Closeable;
@@ -65,7 +65,7 @@ public class DockerEventListener implements ResultCallback<Event> {
 
     public void onContainerEvent(Event event, Container container) throws InterruptedException {
         if ("exited".equalsIgnoreCase(container.getState())
-                && Objects.equals(container.getLabels().get(LABEL_TYPE), ContainerStatus.ContainerType.build.name())) {
+                && Objects.equals(container.getLabels().get(LABEL_TYPE), PodContainerStatus.ContainerType.build.name())) {
             String tag = container.getLabels().get(LABEL_TAG);
             String projectId = container.getLabels().get(LABEL_PROJECT_ID);
             syncImage(projectId, tag);
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/CamelService.java b/karavan-app/src/main/java/org/apache/camel/karavan/listener/CamelReloadListener.java
similarity index 72%
rename from karavan-app/src/main/java/org/apache/camel/karavan/CamelService.java
rename to karavan-app/src/main/java/org/apache/camel/karavan/listener/CamelReloadListener.java
index 24703209..dc898a6c 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/CamelService.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/listener/CamelReloadListener.java
@@ -25,8 +25,8 @@ import io.vertx.mutiny.ext.web.client.HttpResponse;
 import io.vertx.mutiny.ext.web.client.WebClient;
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
-import org.apache.camel.karavan.kubernetes.KubernetesManager;
-import org.apache.camel.karavan.model.ContainerStatus;
+import org.apache.camel.karavan.kubernetes.KubernetesService;
+import org.apache.camel.karavan.model.PodContainerStatus;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.eclipse.microprofile.faulttolerance.CircuitBreaker;
 import org.jboss.logging.Logger;
@@ -34,12 +34,12 @@ import org.jboss.logging.Logger;
 import java.util.*;
 import java.util.concurrent.ExecutionException;
 
-import static org.apache.camel.karavan.KaravanEvents.CONTAINER_UPDATED;
+import static org.apache.camel.karavan.KaravanEvents.POD_CONTAINER_UPDATED;
 
 @ApplicationScoped
-public class CamelManager {
+public class CamelService {
 
-    private static final Logger LOGGER = Logger.getLogger(CamelManager.class.getName());
+    private static final Logger LOGGER = Logger.getLogger(CamelService.class.getName());
     public static final String RELOAD_PROJECT_CODE = "RELOAD_PROJECT_CODE";
 
     @Inject
@@ -49,7 +49,7 @@ public class CamelManager {
     CodeService codeService;
 
     @Inject
-    KubernetesManager kubernetesManager;
+    KubernetesService kubernetesService;
 
     @ConfigProperty(name = "karavan.environment")
     String environment;
@@ -73,22 +73,22 @@ public class CamelManager {
     public void reloadProjectCode(String projectId) {
         LOGGER.debug("Reload project code " + projectId);
         try {
-            ContainerStatus containerStatus = karavanCache.getDevModeContainerStatus(projectId, environment);
-            deleteRequest(containerStatus);
+            PodContainerStatus podContainerStatus = karavanCache.getDevModePodContainerStatus(projectId, environment);
+            deleteRequest(podContainerStatus);
             Map<String, String> files = codeService.getProjectFilesForDevMode(projectId, true);
-            files.forEach((name, code) -> putRequest(containerStatus, name, code, 1000));
-            reloadRequest(containerStatus);
-            containerStatus.setCodeLoaded(true);
-            eventBus.publish(CONTAINER_UPDATED, JsonObject.mapFrom(containerStatus));
+            files.forEach((name, code) -> putRequest(podContainerStatus, name, code, 1000));
+            reloadRequest(podContainerStatus);
+            podContainerStatus.setCodeLoaded(true);
+            eventBus.publish(POD_CONTAINER_UPDATED, JsonObject.mapFrom(podContainerStatus));
         } catch (Exception ex) {
             LOGGER.error("ReloadProjectCode " + (ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage()));
         }
     }
 
     @CircuitBreaker(requestVolumeThreshold = 10, failureRatio = 0.5, delay = 1000)
-    public boolean putRequest(ContainerStatus containerStatus, String fileName, String body, int timeout) {
+     boolean putRequest(PodContainerStatus podContainerStatus, String fileName, String body, int timeout) {
         try {
-            String url = getContainerAddressForReload(containerStatus) + "/q/upload/" + fileName;
+            String url = getContainerAddressForReload(podContainerStatus) + "/q/upload/" + fileName;
             HttpResponse<Buffer> result = getWebClient().putAbs(url)
                     .timeout(timeout).sendBuffer(Buffer.buffer(body)).subscribeAsCompletionStage().toCompletableFuture().get();
             return result.statusCode() == 200;
@@ -98,8 +98,8 @@ public class CamelManager {
         return false;
     }
 
-    public String deleteRequest(ContainerStatus containerStatus) throws Exception {
-        String url = getContainerAddressForReload(containerStatus) + "/q/upload/*";
+     String deleteRequest(PodContainerStatus podContainerStatus) throws Exception {
+        String url = getContainerAddressForReload(podContainerStatus) + "/q/upload/*";
         try {
             return deleteResult(url, 1000);
         } catch (InterruptedException | ExecutionException ex) {
@@ -108,8 +108,8 @@ public class CamelManager {
         return null;
     }
 
-    public String reloadRequest(ContainerStatus containerStatus) throws Exception {
-        String url = getContainerAddressForReload(containerStatus) + "/q/dev/reload?reload=true";
+     String reloadRequest(PodContainerStatus podContainerStatus) throws Exception {
+        String url = getContainerAddressForReload(podContainerStatus) + "/q/dev/reload?reload=true";
         try {
             return getResult(url, 1000);
         } catch (InterruptedException | ExecutionException ex) {
@@ -118,22 +118,22 @@ public class CamelManager {
         return null;
     }
 
-    public String getContainerAddressForReload(ContainerStatus containerStatus) throws Exception {
+     String getContainerAddressForReload(PodContainerStatus podContainerStatus) throws Exception {
         if (ConfigService.inKubernetes()) {
-            return "http://" + containerStatus.getProjectId() + "." + kubernetesManager.getNamespace();
+            return "http://" + podContainerStatus.getProjectId() + "." + kubernetesService.getNamespace();
         } else if (ConfigService.inDocker()) {
-            return "http://" + containerStatus.getProjectId() + ":8080";
-        } else if (containerStatus.getPorts() != null && !containerStatus.getPorts().isEmpty()) {
-            Integer port = containerStatus.getPorts().get(0).getPublicPort();
+            return "http://" + podContainerStatus.getProjectId() + ":8080";
+        } else if (podContainerStatus.getPorts() != null && !podContainerStatus.getPorts().isEmpty()) {
+            Integer port = podContainerStatus.getPorts().get(0).getPublicPort();
             if (port != null) {
                 return "http://localhost:" + port;
             }
         }
-        throw new Exception("No port configured for project " + containerStatus.getContainerName());
+        throw new Exception("No port configured for project " + podContainerStatus.getContainerName());
     }
 
     @CircuitBreaker(requestVolumeThreshold = 10, failureRatio = 0.5, delay = 1000)
-    public String getResult(String url, int timeout) throws InterruptedException, ExecutionException {
+     String getResult(String url, int timeout) throws InterruptedException, ExecutionException {
         try {
             HttpResponse<Buffer> result = getWebClient().getAbs(url).putHeader("Accept", "application/json")
                     .timeout(timeout).send().subscribeAsCompletionStage().toCompletableFuture().get();
@@ -148,7 +148,7 @@ public class CamelManager {
         return null;
     }
 
-    public String deleteResult(String url, int timeout) throws InterruptedException, ExecutionException {
+     String deleteResult(String url, int timeout) throws InterruptedException, ExecutionException {
         try {
             HttpResponse<Buffer> result = getWebClient().deleteAbs(url)
                     .timeout(timeout).send().subscribeAsCompletionStage().toCompletableFuture().get();
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/CamelStatusListener.java b/karavan-app/src/main/java/org/apache/camel/karavan/listener/CamelStatusListener.java
similarity index 85%
rename from karavan-app/src/main/java/org/apache/camel/karavan/CamelStatusListener.java
rename to karavan-app/src/main/java/org/apache/camel/karavan/listener/CamelStatusListener.java
index 1996b381..fda54c2e 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/CamelStatusListener.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/listener/CamelStatusListener.java
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.karavan.status;
+package org.apache.camel.karavan;
 
 import io.quarkus.vertx.ConsumeEvent;
 import io.vertx.core.json.JsonObject;
@@ -24,11 +24,10 @@ import io.vertx.mutiny.ext.web.client.HttpResponse;
 import io.vertx.mutiny.ext.web.client.WebClient;
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
-import org.apache.camel.karavan.config.ConfigService;
-import org.apache.camel.karavan.status.model.CamelStatus;
-import org.apache.camel.karavan.status.model.CamelStatusRequest;
-import org.apache.camel.karavan.status.model.CamelStatusValue;
-import org.apache.camel.karavan.status.model.ContainerStatus;
+import org.apache.camel.karavan.model.CamelStatus;
+import org.apache.camel.karavan.model.CamelStatusRequest;
+import org.apache.camel.karavan.model.CamelStatusValue;
+import org.apache.camel.karavan.model.PodContainerStatus;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.eclipse.microprofile.faulttolerance.CircuitBreaker;
 import org.jboss.logging.Logger;
@@ -37,7 +36,7 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 
-import static org.apache.camel.karavan.status.StatusEvents.CMD_COLLECT_CAMEL_STATUS;
+import static org.apache.camel.karavan.KaravanEvents.CMD_COLLECT_CAMEL_STATUS;
 
 @ApplicationScoped
 public class CamelStatusListener {
@@ -45,7 +44,7 @@ public class CamelStatusListener {
     private static final Logger LOGGER = Logger.getLogger(CamelStatusListener.class.getName());
 
     @Inject
-    StatusCache statusCache;
+    KaravanCache karavanCache;
 
     @ConfigProperty(name = "karavan.environment")
     String environment;
@@ -66,7 +65,7 @@ public class CamelStatusListener {
     public void collectCamelStatuses(JsonObject data) {
         try {
             CamelStatusRequest dms = data.getJsonObject("camelStatusRequest").mapTo(CamelStatusRequest.class);
-            ContainerStatus containerStatus = data.getJsonObject("containerStatus").mapTo(ContainerStatus.class);
+            PodContainerStatus containerStatus = data.getJsonObject("containerStatus").mapTo(PodContainerStatus.class);
             LOGGER.debug("Collect Camel Status for " + containerStatus.getContainerName());
             String projectId = dms.getProjectId();
             String containerName = dms.getContainerName();
@@ -78,13 +77,13 @@ public class CamelStatusListener {
                 }
             }
             CamelStatus cs = new CamelStatus(projectId, containerName, statuses, environment);
-            statusCache.saveCamelStatus(cs);
+            karavanCache.saveCamelStatus(cs);
         } catch (Exception ex) {
             LOGGER.error("collectCamelStatuses " + (ex.getCause() != null ? ex.getCause().getMessage() : ex.getMessage()));
         }
     }
 
-    public String getContainerAddressForStatus(ContainerStatus containerStatus) throws Exception {
+    public String getContainerAddressForStatus(PodContainerStatus containerStatus) throws Exception {
         if (ConfigService.inKubernetes()) {
             return "http://" + containerStatus.getPodIP() + ":8080";
         } else if (ConfigService.inDocker()) {
@@ -98,7 +97,7 @@ public class CamelStatusListener {
         throw new Exception("No port configured for project " + containerStatus.getContainerName());
     }
 
-    public String getCamelStatus(ContainerStatus containerStatus, CamelStatusValue.Name statusName) throws Exception {
+    public String getCamelStatus(PodContainerStatus containerStatus, CamelStatusValue.Name statusName) throws Exception {
         String url = getContainerAddressForStatus(containerStatus) + "/q/dev/" + statusName.name();
         try {
             return getResult(url, 500);
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/DeploymentStatusListener.java b/karavan-app/src/main/java/org/apache/camel/karavan/listener/DeploymentStatusListener.java
similarity index 100%
rename from karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/DeploymentStatusListener.java
rename to karavan-app/src/main/java/org/apache/camel/karavan/listener/DeploymentStatusListener.java
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerStatusScheduler.java b/karavan-app/src/main/java/org/apache/camel/karavan/listener/DockerStatusListener.java
similarity index 55%
copy from karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerStatusScheduler.java
copy to karavan-app/src/main/java/org/apache/camel/karavan/listener/DockerStatusListener.java
index 8d597f96..1c117444 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerStatusScheduler.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/listener/DockerStatusListener.java
@@ -21,15 +21,19 @@ import com.github.dockerjava.api.model.Container;
 import com.github.dockerjava.api.model.Statistics;
 import com.github.dockerjava.core.InvocationBuilder;
 import io.quarkus.scheduler.Scheduled;
+import io.quarkus.vertx.ConsumeEvent;
 import io.vertx.core.json.JsonObject;
 import io.vertx.mutiny.core.eventbus.EventBus;
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
 import org.apache.camel.karavan.ConfigService;
-import org.apache.camel.karavan.model.ContainerStatus;
+import org.apache.camel.karavan.KaravanCache;
+import org.apache.camel.karavan.model.PodContainerStatus;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 
 import java.io.IOException;
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -44,12 +48,15 @@ public class DockerStatusScheduler {
     @Inject
     DockerService dockerService;
 
+    @Inject
+    KaravanCache karavanCache;
+
     @Inject
     EventBus eventBus;
 
     @Scheduled(every = "{karavan.container.statistics.interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
     void collectContainersStatistics() {
-        List<ContainerStatus> statusesInDocker = getContainersStatuses();
+        List<PodContainerStatus> statusesInDocker = getContainersStatuses();
         statusesInDocker.forEach(containerStatus -> {
             eventBus.publish(CMD_COLLECT_CONTAINER_STATISTIC, JsonObject.mapFrom(containerStatus));
         });
@@ -58,28 +65,56 @@ public class DockerStatusScheduler {
     @Scheduled(every = "{karavan.container.status.interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
     void collectContainersStatuses() {
         if (!ConfigService.inKubernetes()) {
-            List<ContainerStatus> statusesInDocker = getContainersStatuses();
+            List<PodContainerStatus> statusesInDocker = getContainersStatuses();
             statusesInDocker.forEach(containerStatus -> {
-                eventBus.publish(CONTAINER_UPDATED, JsonObject.mapFrom(containerStatus));
+                eventBus.publish(POD_CONTAINER_UPDATED, JsonObject.mapFrom(containerStatus));
             });
             eventBus.publish(CMD_CLEAN_STATUSES, "");
         }
     }
 
-    public List<ContainerStatus> getContainersStatuses() {
-        List<ContainerStatus> result = new ArrayList<>();
+    @ConsumeEvent(value = CMD_COLLECT_CONTAINER_STATISTIC, blocking = true)
+    void collectContainersStatistics(JsonObject data) {
+        PodContainerStatus status = data.mapTo(PodContainerStatus.class);
+        PodContainerStatus newStatus = getContainerStatistics(status);
+        eventBus.publish(POD_CONTAINER_UPDATED, JsonObject.mapFrom(newStatus));
+    }
+
+    @ConsumeEvent(value = CMD_CLEAN_STATUSES, blocking = true)
+    void cleanContainersStatuses(String data) {
+        List<PodContainerStatus> statusesInDocker = getContainersStatuses();
+        List<String> namesInDocker = statusesInDocker.stream().map(PodContainerStatus::getContainerName).toList();
+        List<PodContainerStatus> statusesInCache = karavanCache.getPodContainerStatuses(environment);
+        // clean deleted
+        statusesInCache.stream()
+                .filter(cs -> !checkTransit(cs))
+                .filter(cs -> !namesInDocker.contains(cs.getContainerName()))
+                .forEach(containerStatus -> {
+                    eventBus.publish(POD_CONTAINER_DELETED, JsonObject.mapFrom(containerStatus));
+                });
+    }
+
+    private boolean checkTransit(PodContainerStatus cs) {
+        if (cs.getContainerId() == null && cs.getInTransit()) {
+            return Instant.parse(cs.getInitDate()).until(Instant.now(), ChronoUnit.SECONDS) < 10;
+        }
+        return false;
+    }
+
+    public List<PodContainerStatus> getContainersStatuses() {
+        List<PodContainerStatus> result = new ArrayList<>();
         dockerService.getAllContainers().forEach(container -> {
-            ContainerStatus containerStatus = DockerUtils.getContainerStatus(container, environment);
-            result.add(containerStatus);
+            PodContainerStatus podContainerStatus = DockerUtils.getContainerStatus(container, environment);
+            result.add(podContainerStatus);
         });
         return result;
     }
 
-    public ContainerStatus getContainerStatistics(ContainerStatus containerStatus) {
-        Container container = dockerService.getContainerByName(containerStatus.getContainerName());
+    public PodContainerStatus getContainerStatistics(PodContainerStatus podContainerStatus) {
+        Container container = dockerService.getContainerByName(podContainerStatus.getContainerName());
         Statistics stats = getContainerStats(container.getId());
-        DockerUtils.updateStatistics(containerStatus, stats);
-        return containerStatus;
+        DockerUtils.updateStatistics(podContainerStatus, stats);
+        return podContainerStatus;
     }
 
     public Statistics getContainerStats(String containerId) {
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/NotificationService.java b/karavan-app/src/main/java/org/apache/camel/karavan/listener/NotificationListener.java
similarity index 91%
rename from karavan-app/src/main/java/org/apache/camel/karavan/NotificationService.java
rename to karavan-app/src/main/java/org/apache/camel/karavan/listener/NotificationListener.java
index aba68b7d..bcccd2b9 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/NotificationService.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/listener/NotificationListener.java
@@ -29,7 +29,7 @@ import java.util.UUID;
 import static org.apache.camel.karavan.KaravanEvents.COMMIT_HAPPENED;
 
 @ApplicationScoped
-public class NotificationManager {
+public class NotificationService {
 
     public static final String NOTIFICATION_ADDRESS_SYSTEM = "karavanSystem";
     public static final String NOTIFICATION_HEADER_EVENT_ID = "id";
@@ -47,7 +47,7 @@ public class NotificationManager {
         sendSystem(eventId, "commit", Project.class.getSimpleName(), JsonObject.mapFrom(p));
     }
 
-    public void send(String userId, String eventId, String evenName, String className, JsonObject data) {
+    void send(String userId, String eventId, String evenName, String className, JsonObject data) {
         eventBus.publish(userId, data, new DeliveryOptions()
                 .addHeader(NOTIFICATION_HEADER_EVENT_ID, eventId != null ? eventId : UUID.randomUUID().toString())
                 .addHeader(NOTIFICATION_HEADER_EVENT_NAME, evenName)
@@ -55,7 +55,7 @@ public class NotificationManager {
         );
     }
 
-    public void sendSystem(String eventId, String evenName, String className, JsonObject data) {
+    void sendSystem(String eventId, String evenName, String className, JsonObject data) {
         eventBus.publish(NOTIFICATION_ADDRESS_SYSTEM, data, new DeliveryOptions()
                 .addHeader(NOTIFICATION_HEADER_EVENT_ID, eventId != null ? eventId : UUID.randomUUID().toString())
                 .addHeader(NOTIFICATION_HEADER_EVENT_NAME, evenName)
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/ContainerStatusListener.java b/karavan-app/src/main/java/org/apache/camel/karavan/listener/PodContainerStatusListener.java
similarity index 52%
rename from karavan-app/src/main/java/org/apache/camel/karavan/ContainerStatusListener.java
rename to karavan-app/src/main/java/org/apache/camel/karavan/listener/PodContainerStatusListener.java
index 301d7518..5e1e4b53 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/ContainerStatusListener.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/listener/PodContainerStatusListener.java
@@ -15,16 +15,15 @@
  * limitations under the License.
  */
 
-package org.apache.camel.karavan.status;
+package org.apache.camel.karavan;
 
 import io.quarkus.vertx.ConsumeEvent;
-import io.vertx.core.json.JsonArray;
 import io.vertx.core.json.JsonObject;
 import io.vertx.mutiny.core.eventbus.EventBus;
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
-import org.apache.camel.karavan.status.docker.DockerAPI;
-import org.apache.camel.karavan.status.model.ContainerStatus;
+import org.apache.camel.karavan.docker.DockerService;
+import org.apache.camel.karavan.model.PodContainerStatus;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.jboss.logging.Logger;
 
@@ -33,7 +32,7 @@ import java.time.temporal.ChronoUnit;
 import java.util.List;
 import java.util.Objects;
 
-import static org.apache.camel.karavan.status.StatusEvents.*;
+import static org.apache.camel.karavan.KaravanEvents.*;
 
 @ApplicationScoped
 public class ContainerStatusListener {
@@ -43,66 +42,40 @@ public class ContainerStatusListener {
     String environment;
 
     @Inject
-    StatusCache statusCache;
+    KaravanCache karavanCache;
 
     @Inject
-    DockerAPI dockerAPI;
+    DockerService dockerService;
 
     @Inject
     EventBus eventBus;
 
-    @ConsumeEvent(value = CMD_COLLECT_CONTAINER_STATISTIC, blocking = true)
-    void collectContainersStatistics(JsonObject data) {
-        ContainerStatus status = data.mapTo(ContainerStatus.class);
-        ContainerStatus newStatus = dockerAPI.collectContainerStatistics(status);
-        eventBus.publish(CONTAINER_UPDATED, JsonObject.mapFrom(newStatus));
-    }
 
-    @ConsumeEvent(value = CMD_CLEAN_STATUSES, blocking = true)
-    void cleanContainersStatuses(String data) {
-        List<ContainerStatus> statusesInDocker = dockerAPI.collectContainersStatuses();
-        List<String> namesInDocker = statusesInDocker.stream().map(ContainerStatus::getContainerName).toList();
-        List<ContainerStatus> statusesInCache = statusCache.getContainerStatuses(environment);
-        // clean deleted
-        statusesInCache.stream()
-                .filter(cs -> !checkTransit(cs))
-                .filter(cs -> !namesInDocker.contains(cs.getContainerName()))
-                .forEach(containerStatus -> {
-                    eventBus.publish(CONTAINER_DELETED, JsonObject.mapFrom(containerStatus));
-                });
-    }
 
     @ConsumeEvent(value = CONTAINER_DELETED, blocking = true, ordered = true)
     public void cleanContainersStatus(JsonObject data) {
-        ContainerStatus containerStatus = data.mapTo(ContainerStatus.class);
-        statusCache.deleteContainerStatus(containerStatus);
-        statusCache.deleteCamelStatuses(containerStatus.getProjectId(), containerStatus.getEnv());
-    }
-
-    private boolean checkTransit(ContainerStatus cs) {
-        if (cs.getContainerId() == null && cs.getInTransit()) {
-            return Instant.parse(cs.getInitDate()).until(Instant.now(), ChronoUnit.SECONDS) < 10;
-        }
-        return false;
+        PodContainerStatus containerStatus = data.mapTo(PodContainerStatus.class);
+        karavanCache.deletePodContainerStatus(containerStatus);
+        karavanCache.deleteCamelStatuses(containerStatus.getProjectId(), containerStatus.getEnv());
     }
 
     @ConsumeEvent(value = CONTAINER_UPDATED, blocking = true, ordered = true)
-    public void saveContainerStatus(JsonObject data) {
-        ContainerStatus newStatus = data.mapTo(ContainerStatus.class);
-        ContainerStatus oldStatus = statusCache.getContainerStatus(newStatus.getProjectId(), newStatus.getEnv(), newStatus.getContainerName());
+    public void savePodContainerStatus(JsonObject data) {
+        PodContainerStatus newStatus = data.mapTo(PodContainerStatus.class);
+        PodContainerStatus oldStatus = karavanCache.getPodContainerStatus(newStatus.getProjectId(), newStatus.getEnv(), newStatus.getContainerName());
 
         if (oldStatus == null) {
-            statusCache.saveContainerStatus(newStatus);
+            karavanCache.savePodContainerStatus(newStatus);
         } else if (Objects.equals(oldStatus.getInTransit(), Boolean.FALSE)) {
-            saveContainerStatus(newStatus, oldStatus);
+            savePodContainerStatus(newStatus, oldStatus);
         } else if (Objects.equals(oldStatus.getInTransit(), Boolean.TRUE)) {
             if (!Objects.equals(oldStatus.getState(), newStatus.getState()) || newStatus.getCpuInfo() == null || newStatus.getCpuInfo().isEmpty()) {
-                saveContainerStatus(newStatus, oldStatus);
+                savePodContainerStatus(newStatus, oldStatus);
             }
         }
     }
 
-    private void saveContainerStatus(ContainerStatus newStatus, ContainerStatus oldStatus) {
+    private void savePodContainerStatus(PodContainerStatus newStatus, PodContainerStatus oldStatus) {
         if (Objects.equals("exited", newStatus.getState()) || Objects.equals("dead", newStatus.getState())) {
             if (Objects.isNull(oldStatus.getFinished())) {
                 newStatus.setFinished(Instant.now().toString());
@@ -116,6 +89,6 @@ public class ContainerStatusListener {
             newStatus.setCpuInfo(oldStatus.getCpuInfo());
             newStatus.setMemoryInfo(oldStatus.getMemoryInfo());
         }
-        statusCache.saveContainerStatus(newStatus);
+        karavanCache.savePodContainerStatus(newStatus);
     }
 }
\ No newline at end of file
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/ServiceStatusListener.java b/karavan-app/src/main/java/org/apache/camel/karavan/listener/ServiceStatusListener.java
similarity index 100%
rename from karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/ServiceStatusListener.java
rename to karavan-app/src/main/java/org/apache/camel/karavan/listener/ServiceStatusListener.java
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/CamelStatusService.java b/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/CamelStatusScheduler.java
similarity index 77%
rename from karavan-app/src/main/java/org/apache/camel/karavan/CamelStatusService.java
rename to karavan-app/src/main/java/org/apache/camel/karavan/scheduler/CamelStatusScheduler.java
index 56faffb9..48234ee7 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/CamelStatusService.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/CamelStatusScheduler.java
@@ -14,21 +14,22 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.camel.karavan.status;
+package org.apache.camel.karavan;
 
 import io.quarkus.scheduler.Scheduled;
 import io.vertx.core.json.JsonObject;
 import io.vertx.mutiny.core.eventbus.EventBus;
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
-import org.apache.camel.karavan.status.model.CamelStatusRequest;
-import org.apache.camel.karavan.status.model.ContainerStatus;
+import org.apache.camel.karavan.model.CamelStatusRequest;
+import org.apache.camel.karavan.model.PodContainerStatus;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.jboss.logging.Logger;
 
-import java.util.*;
+import java.util.Map;
+import java.util.Objects;
 
-import static org.apache.camel.karavan.status.StatusEvents.CMD_COLLECT_CAMEL_STATUS;
+import static org.apache.camel.karavan.KaravanEvents.CMD_COLLECT_CAMEL_STATUS;
 
 @ApplicationScoped
 public class CamelStatusService {
@@ -36,7 +37,7 @@ public class CamelStatusService {
     private static final Logger LOGGER = Logger.getLogger(CamelStatusService.class.getName());
 
     @Inject
-    StatusCache statusCache;
+    KaravanCache karavanCache;
 
     @ConfigProperty(name = "karavan.environment")
     String environment;
@@ -47,11 +48,11 @@ public class CamelStatusService {
     @Scheduled(every = "{karavan.camel.status.interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
     public void collectCamelStatuses() {
         LOGGER.debug("Collect Camel Statuses");
-        statusCache.getContainerStatuses(environment).stream()
+        karavanCache.getPodContainerStatuses(environment).stream()
                 .filter(cs ->
-                        cs.getType() == ContainerStatus.ContainerType.project
-                                || cs.getType() == ContainerStatus.ContainerType.devmode
-                ).filter(cs -> Objects.equals(cs.getCamelRuntime(), StatusConstants.CamelRuntime.CAMEL_MAIN.getValue()))
+                        cs.getType() == PodContainerStatus.ContainerType.project
+                                || cs.getType() == PodContainerStatus.ContainerType.devmode
+                ).filter(cs -> Objects.equals(cs.getCamelRuntime(), KaravanConstants.CamelRuntime.CAMEL_MAIN.getValue()))
                 .forEach(cs -> {
                     CamelStatusRequest csr = new CamelStatusRequest(cs.getProjectId(), cs.getContainerName());
                     eventBus.publish(CMD_COLLECT_CAMEL_STATUS,
diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerStatusScheduler.java b/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/DockerStatusScheduler.java
similarity index 57%
rename from karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerStatusScheduler.java
rename to karavan-app/src/main/java/org/apache/camel/karavan/scheduler/DockerStatusScheduler.java
index 8d597f96..dea41a2c 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerStatusScheduler.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/DockerStatusScheduler.java
@@ -17,19 +17,15 @@
 
 package org.apache.camel.karavan.docker;
 
-import com.github.dockerjava.api.model.Container;
-import com.github.dockerjava.api.model.Statistics;
-import com.github.dockerjava.core.InvocationBuilder;
 import io.quarkus.scheduler.Scheduled;
 import io.vertx.core.json.JsonObject;
 import io.vertx.mutiny.core.eventbus.EventBus;
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
 import org.apache.camel.karavan.ConfigService;
-import org.apache.camel.karavan.model.ContainerStatus;
+import org.apache.camel.karavan.model.PodContainerStatus;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -49,7 +45,7 @@ public class DockerStatusScheduler {
 
     @Scheduled(every = "{karavan.container.statistics.interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
     void collectContainersStatistics() {
-        List<ContainerStatus> statusesInDocker = getContainersStatuses();
+        List<PodContainerStatus> statusesInDocker = getContainersStatuses();
         statusesInDocker.forEach(containerStatus -> {
             eventBus.publish(CMD_COLLECT_CONTAINER_STATISTIC, JsonObject.mapFrom(containerStatus));
         });
@@ -58,40 +54,20 @@ public class DockerStatusScheduler {
     @Scheduled(every = "{karavan.container.status.interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
     void collectContainersStatuses() {
         if (!ConfigService.inKubernetes()) {
-            List<ContainerStatus> statusesInDocker = getContainersStatuses();
+            List<PodContainerStatus> statusesInDocker = getContainersStatuses();
             statusesInDocker.forEach(containerStatus -> {
-                eventBus.publish(CONTAINER_UPDATED, JsonObject.mapFrom(containerStatus));
+                eventBus.publish(POD_CONTAINER_UPDATED, JsonObject.mapFrom(containerStatus));
             });
             eventBus.publish(CMD_CLEAN_STATUSES, "");
         }
     }
 
-    public List<ContainerStatus> getContainersStatuses() {
-        List<ContainerStatus> result = new ArrayList<>();
+    public List<PodContainerStatus> getContainersStatuses() {
+        List<PodContainerStatus> result = new ArrayList<>();
         dockerService.getAllContainers().forEach(container -> {
-            ContainerStatus containerStatus = DockerUtils.getContainerStatus(container, environment);
-            result.add(containerStatus);
+            PodContainerStatus podContainerStatus = DockerUtils.getContainerStatus(container, environment);
+            result.add(podContainerStatus);
         });
         return result;
     }
-
-    public ContainerStatus getContainerStatistics(ContainerStatus containerStatus) {
-        Container container = dockerService.getContainerByName(containerStatus.getContainerName());
-        Statistics stats = getContainerStats(container.getId());
-        DockerUtils.updateStatistics(containerStatus, stats);
-        return containerStatus;
-    }
-
-    public Statistics getContainerStats(String containerId) {
-        InvocationBuilder.AsyncResultCallback<Statistics> callback = new InvocationBuilder.AsyncResultCallback<>();
-        dockerService.getDockerClient().statsCmd(containerId).withContainerId(containerId).withNoStream(true).exec(callback);
-        Statistics stats = null;
-        try {
-            stats = callback.awaitResult();
-            callback.close();
-        } catch (RuntimeException | IOException e) {
-            // you may want to throw an exception here
-        }
-        return stats;
-    }
 }
\ No newline at end of file