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 73435d86 Cleanup
73435d86 is described below

commit 73435d861adc75491f4c0fefaecb2b1a1a733dc5
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Mon Nov 27 16:40:39 2023 -0500

    Cleanup
---
 .../camel/karavan/api/ContainerResource.java       |   5 +-
 .../apache/camel/karavan/api/DevModeResource.java  |   3 +-
 .../apache/camel/karavan/api/ImagesResource.java   |   3 +-
 .../apache/camel/karavan/api/KameletResources.java |   2 -
 .../apache/camel/karavan/api/LogWatchResource.java |  14 +-
 .../camel/karavan/api/ProjectFileResource.java     |  15 +-
 .../camel/karavan/api/ProjectGitResource.java      |  11 +-
 .../apache/camel/karavan/api/ProjectResource.java  |  14 +-
 .../apache/camel/karavan/api/StatusResource.java   |  12 +-
 .../apache/camel/karavan/api/UsersResource.java    |   7 +-
 .../org/apache/camel/karavan/code/CodeService.java |   4 +-
 .../karavan/code/model/DockerComposeService.java   |   5 +-
 .../camel/karavan/docker/DockerEventListener.java  |   3 -
 .../camel/karavan/docker/DockerForGitea.java       |   4 +-
 .../camel/karavan/docker/DockerForInfinispan.java  |   2 +-
 .../camel/karavan/docker/DockerForRegistry.java    |   2 +-
 .../apache/camel/karavan/docker/DockerService.java |  14 +-
 .../camel/karavan/docker/DockerServiceUtils.java   |  12 +-
 .../org/apache/camel/karavan/git/GitService.java   |  23 +-
 .../karavan/infinispan/InfinispanService.java      |   5 +-
 .../camel/karavan/infinispan/model/Project.java    |   1 +
 .../karavan/kubernetes/KubernetesService.java      |  14 +-
 .../camel/karavan/kubernetes/PodEventHandler.java  |   3 +-
 .../apache/camel/karavan/service/AuthService.java  |   2 +-
 .../apache/camel/karavan/service/CamelService.java |   5 +-
 .../camel/karavan/service/ConfigService.java       |   5 +-
 .../karavan/service/ContainerStatusService.java    |  23 +-
 .../camel/karavan/service/KaravanService.java      |   6 +-
 .../camel/karavan/service/ProjectService.java      |  14 +-
 .../webui/src/containers/ContainerTableRow.tsx     |   4 +-
 .../main/webui/src/containers/ContainersPage.tsx   |   2 +-
 .../main/webui/src/project/build/BuildPanel.tsx    | 207 ------------------
 .../main/webui/src/project/build/ImagesPanel.tsx   | 238 ---------------------
 .../webui/src/project/build/ProjectBuildTab.tsx    |  32 ---
 34 files changed, 102 insertions(+), 614 deletions(-)

diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java
index 5eefe265..23e0d8e8 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java
@@ -32,7 +32,6 @@ import 
org.apache.camel.karavan.infinispan.model.ContainerStatus;
 import org.apache.camel.karavan.kubernetes.KubernetesService;
 import org.apache.camel.karavan.service.ConfigService;
 import org.apache.camel.karavan.service.ProjectService;
-import org.apache.camel.karavan.shared.Constants;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.jboss.logging.Logger;
 
@@ -100,7 +99,7 @@ public class ContainerResource {
                             if (dockerComposeService != null) {
                                 Map<String,String> labels = new HashMap<>();
                                 labels.put(LABEL_TYPE, 
ContainerStatus.ContainerType.devservice.name());
-                                labels.put(LABEL_CAMEL_RUNTIME, 
Constants.CamelRuntime.CAMEL_MAIN.getValue());
+                                labels.put(LABEL_CAMEL_RUNTIME, 
CamelRuntime.CAMEL_MAIN.getValue());
                                 labels.put(LABEL_PROJECT_ID, name);
                                 
dockerService.createContainerFromCompose(dockerComposeService, labels);
                                 
dockerService.runContainer(dockerComposeService.getContainer_name());
@@ -110,7 +109,7 @@ public class ContainerResource {
                             if (dockerComposeService != null) {
                                 Map<String,String> labels = new HashMap<>();
                                 labels.put(LABEL_TYPE, 
ContainerStatus.ContainerType.project.name());
-                                labels.put(LABEL_CAMEL_RUNTIME, 
Constants.CamelRuntime.CAMEL_MAIN.getValue());
+                                labels.put(LABEL_CAMEL_RUNTIME, 
CamelRuntime.CAMEL_MAIN.getValue());
                                 labels.put(LABEL_PROJECT_ID, name);
                                 
dockerService.createContainerFromCompose(dockerComposeService, labels);
                                 
dockerService.runContainer(dockerComposeService.getContainer_name());
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java
index 2b73642a..1a8fe8ad 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java
@@ -24,13 +24,12 @@ import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 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.infinispan.model.Project;
 import org.apache.camel.karavan.kubernetes.KubernetesService;
 import org.apache.camel.karavan.service.CamelService;
-import org.apache.camel.karavan.service.ProjectService;
 import org.apache.camel.karavan.service.ConfigService;
+import org.apache.camel.karavan.service.ProjectService;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 
 import static 
org.apache.camel.karavan.service.ContainerStatusService.CONTAINER_STATUS;
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 21b0d6ba..6bbe60f5 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
@@ -23,12 +23,11 @@ import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import org.apache.camel.karavan.docker.DockerService;
 import org.apache.camel.karavan.registry.RegistryConfig;
+import org.apache.camel.karavan.registry.RegistryService;
 import org.apache.camel.karavan.service.ConfigService;
 import org.apache.camel.karavan.service.ProjectService;
-import org.apache.camel.karavan.registry.RegistryService;
 import org.jose4j.base64url.Base64;
 
-import java.io.IOException;
 import java.util.Comparator;
 import java.util.List;
 
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java
index 3c771080..6c419e88 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java
@@ -27,9 +27,7 @@ import jakarta.ws.rs.GET;
 import jakarta.ws.rs.Path;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.MediaType;
-import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
 import java.util.stream.Collectors;
 
 @Path("/api/kamelet")
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/LogWatchResource.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/LogWatchResource.java
index e640b583..f0d71eb0 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/LogWatchResource.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/LogWatchResource.java
@@ -21,13 +21,6 @@ import io.fabric8.kubernetes.client.dsl.LogWatch;
 import io.smallrye.context.api.ManagedExecutorConfig;
 import io.smallrye.context.api.NamedInstance;
 import io.smallrye.mutiny.tuples.Tuple2;
-import org.apache.camel.karavan.docker.DockerService;
-import org.apache.camel.karavan.docker.LogCallback;
-import org.apache.camel.karavan.kubernetes.KubernetesService;
-import org.apache.camel.karavan.service.ConfigService;
-import org.eclipse.microprofile.context.ManagedExecutor;
-import org.jboss.logging.Logger;
-
 import jakarta.inject.Inject;
 import jakarta.ws.rs.GET;
 import jakarta.ws.rs.Path;
@@ -38,6 +31,13 @@ import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.SecurityContext;
 import jakarta.ws.rs.sse.Sse;
 import jakarta.ws.rs.sse.SseEventSink;
+import org.apache.camel.karavan.docker.DockerService;
+import org.apache.camel.karavan.docker.LogCallback;
+import org.apache.camel.karavan.kubernetes.KubernetesService;
+import org.apache.camel.karavan.service.ConfigService;
+import org.eclipse.microprofile.context.ManagedExecutor;
+import org.jboss.logging.Logger;
+
 import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStreamReader;
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java
index ae8e50f0..bf00fa8a 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java
@@ -16,20 +16,13 @@
  */
 package org.apache.camel.karavan.api;
 
+import jakarta.inject.Inject;
+import jakarta.ws.rs.*;
+import jakarta.ws.rs.core.MediaType;
+import org.apache.camel.karavan.code.CodeService;
 import org.apache.camel.karavan.infinispan.InfinispanService;
 import org.apache.camel.karavan.infinispan.model.ProjectFile;
-import org.apache.camel.karavan.code.CodeService;
 
-import jakarta.inject.Inject;
-import jakarta.ws.rs.Consumes;
-import jakarta.ws.rs.DELETE;
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.HeaderParam;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.PathParam;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.core.MediaType;
 import java.net.URLDecoder;
 import java.nio.charset.StandardCharsets;
 import java.time.Instant;
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectGitResource.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectGitResource.java
index 99588861..948b88a2 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectGitResource.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectGitResource.java
@@ -16,17 +16,12 @@
  */
 package org.apache.camel.karavan.api;
 
+import jakarta.inject.Inject;
+import jakarta.ws.rs.*;
+import jakarta.ws.rs.core.MediaType;
 import org.apache.camel.karavan.infinispan.model.Project;
 import org.apache.camel.karavan.service.ProjectService;
 
-import jakarta.inject.Inject;
-import jakarta.ws.rs.Consumes;
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.POST;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.PathParam;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.core.MediaType;
 import java.util.HashMap;
 
 @Path("/api/git")
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java
index ab2042e2..52cfe36e 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java
@@ -16,17 +16,19 @@
  */
 package org.apache.camel.karavan.api;
 
+import jakarta.inject.Inject;
+import jakarta.ws.rs.*;
+import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
 import org.apache.camel.karavan.docker.DockerService;
+import org.apache.camel.karavan.git.GitService;
 import org.apache.camel.karavan.infinispan.InfinispanService;
-import org.apache.camel.karavan.infinispan.model.*;
+import org.apache.camel.karavan.infinispan.model.CamelStatus;
+import org.apache.camel.karavan.infinispan.model.CamelStatusValue;
+import org.apache.camel.karavan.infinispan.model.Project;
 import org.apache.camel.karavan.kubernetes.KubernetesService;
-import org.apache.camel.karavan.git.GitService;
-import jakarta.inject.Inject;
-import jakarta.ws.rs.*;
-import jakarta.ws.rs.core.MediaType;
-import org.apache.camel.karavan.service.ProjectService;
 import org.apache.camel.karavan.service.ConfigService;
+import org.apache.camel.karavan.service.ProjectService;
 import org.jboss.logging.Logger;
 
 import java.net.URLDecoder;
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java
index 5faabe0d..e62924e7 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java
@@ -16,11 +16,6 @@
  */
 package org.apache.camel.karavan.api;
 
-import io.vertx.core.eventbus.EventBus;
-import org.apache.camel.karavan.infinispan.InfinispanService;
-import org.apache.camel.karavan.infinispan.model.*;
-import org.jboss.logging.Logger;
-
 import jakarta.inject.Inject;
 import jakarta.ws.rs.GET;
 import jakarta.ws.rs.Path;
@@ -28,8 +23,13 @@ import jakarta.ws.rs.PathParam;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.MediaType;
 import jakarta.ws.rs.core.Response;
+import org.apache.camel.karavan.infinispan.InfinispanService;
+import org.apache.camel.karavan.infinispan.model.CamelStatus;
+import org.apache.camel.karavan.infinispan.model.CamelStatusValue;
+import org.apache.camel.karavan.infinispan.model.DeploymentStatus;
+import org.jboss.logging.Logger;
+
 import java.util.List;
-import java.util.Optional;
 
 @Path("/api/status")
 public class StatusResource {
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/UsersResource.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/UsersResource.java
index 0d03c133..fbf6e61e 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/UsersResource.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/UsersResource.java
@@ -17,16 +17,13 @@
 
 package org.apache.camel.karavan.api;
 
+import io.quarkus.security.identity.SecurityIdentity;
 import jakarta.inject.Inject;
 import jakarta.ws.rs.GET;
 import jakarta.ws.rs.Path;
 import jakarta.ws.rs.Produces;
 import jakarta.ws.rs.core.MediaType;
-
-import io.quarkus.oidc.IdToken;
-import org.eclipse.microprofile.jwt.JsonWebToken;
 import org.jboss.resteasy.reactive.NoCache;
-import io.quarkus.security.identity.SecurityIdentity;
 
 import java.util.Set;
 
@@ -47,7 +44,7 @@ public class UsersResource {
     public static class User {
 
         private final String userName;
-        private final java.util.Set<java.lang.String> roles;
+        private final Set<String> roles;
 
         User(SecurityIdentity securityIdentity) {
             this.userName = securityIdentity.getPrincipal().getName();
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 0877c3a2..18e44f57 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
@@ -31,11 +31,11 @@ import org.apache.camel.CamelContext;
 import org.apache.camel.generator.openapi.RestDslGenerator;
 import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.karavan.api.KameletResources;
-import org.apache.camel.karavan.docker.DockerService;
 import org.apache.camel.karavan.code.model.DockerComposeService;
-import org.apache.camel.karavan.infinispan.InfinispanService;
+import org.apache.camel.karavan.docker.DockerService;
 import org.apache.camel.karavan.git.model.GitRepo;
 import org.apache.camel.karavan.git.model.GitRepoFile;
+import org.apache.camel.karavan.infinispan.InfinispanService;
 import org.apache.camel.karavan.infinispan.model.Project;
 import org.apache.camel.karavan.infinispan.model.ProjectFile;
 import org.apache.camel.karavan.kubernetes.KubernetesService;
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/model/DockerComposeService.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/model/DockerComposeService.java
index 98f6ed2a..0370faae 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/model/DockerComposeService.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/model/DockerComposeService.java
@@ -17,7 +17,10 @@
 
 package org.apache.camel.karavan.code.model;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 public class DockerComposeService {
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 6555ff3d..d3ed22a3 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
@@ -21,18 +21,15 @@ import com.github.dockerjava.api.async.ResultCallback;
 import com.github.dockerjava.api.model.Container;
 import com.github.dockerjava.api.model.Event;
 import com.github.dockerjava.api.model.EventType;
-import io.vertx.core.eventbus.EventBus;
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
 import org.apache.camel.karavan.infinispan.InfinispanService;
 import org.apache.camel.karavan.infinispan.model.ContainerStatus;
-import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.jboss.logging.Logger;
 
 import java.io.Closeable;
 import java.io.IOException;
 import java.util.Objects;
-import java.util.Optional;
 
 import static org.apache.camel.karavan.shared.Constants.*;
 
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 ab7bf72d..407e0baa 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
@@ -20,11 +20,11 @@ import 
com.github.dockerjava.api.command.ExecCreateCmdResponse;
 import com.github.dockerjava.api.model.Container;
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
-import org.apache.camel.karavan.infinispan.model.ContainerStatus;
-import org.apache.camel.karavan.git.model.GitConfig;
 import org.apache.camel.karavan.code.CodeService;
 import org.apache.camel.karavan.git.GitService;
 import org.apache.camel.karavan.git.GiteaService;
+import org.apache.camel.karavan.git.model.GitConfig;
+import org.apache.camel.karavan.infinispan.model.ContainerStatus;
 import org.jboss.logging.Logger;
 
 @ApplicationScoped
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForInfinispan.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForInfinispan.java
index 7af32ff3..29874102 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForInfinispan.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForInfinispan.java
@@ -18,8 +18,8 @@ package org.apache.camel.karavan.docker;
 
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
-import org.apache.camel.karavan.infinispan.model.ContainerStatus;
 import org.apache.camel.karavan.code.CodeService;
+import org.apache.camel.karavan.infinispan.model.ContainerStatus;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.jboss.logging.Logger;
 
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForRegistry.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForRegistry.java
index f3fee4c7..0bd9c6d0 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForRegistry.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForRegistry.java
@@ -18,8 +18,8 @@ package org.apache.camel.karavan.docker;
 
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
-import org.apache.camel.karavan.infinispan.model.ContainerStatus;
 import org.apache.camel.karavan.code.CodeService;
+import org.apache.camel.karavan.infinispan.model.ContainerStatus;
 import org.jboss.logging.Logger;
 
 @ApplicationScoped
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 6ffb3d1b..3941a4bc 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
@@ -33,20 +33,23 @@ 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.camel.karavan.shared.Constants;
 import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
 import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream;
 import org.apache.commons.io.IOUtils;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.jboss.logging.Logger;
 
-import java.io.*;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.*;
 import java.util.stream.Collectors;
 
-import static org.apache.camel.karavan.shared.Constants.*;
+import static org.apache.camel.karavan.shared.Constants.LABEL_PROJECT_ID;
+import static org.apache.camel.karavan.shared.Constants.LABEL_TYPE;
 
 @ApplicationScoped
 public class DockerService extends DockerServiceUtils {
@@ -280,7 +283,6 @@ public class DockerService extends DockerServiceUtils {
 
     public void copyFiles(String containerId, String containerPath, 
Map<String, String> files) throws IOException {
         String temp = codeService.saveProjectFilesInTemp(files);
-        System.out.println(temp);
         
dockerClient.copyArchiveToContainerCmd(containerId).withRemotePath(containerPath)
                 .withDirChildrenOnly(true).withHostResource(temp).exec();
     }
@@ -321,7 +323,7 @@ public class DockerService extends DockerServiceUtils {
                         .withStdErr(true)
                         .withTimestamps(false)
                         .withFollowStream(true)
-                        .withTailAll()
+                        .withTail(100)
                         .exec(callback);
                 callback.awaitCompletion();
             }
@@ -395,7 +397,7 @@ public class DockerService extends DockerServiceUtils {
     public int getMaxPortMapped(int port) {
         return 
getDockerClient().listContainersCmd().withShowAll(true).exec().stream()
                 .map(c -> List.of(c.ports))
-                .flatMap(java.util.List::stream)
+                .flatMap(List::stream)
                 .filter(p -> Objects.equals(p.getPrivatePort(), port))
                 .map(ContainerPort::getPublicPort).filter(Objects::nonNull)
                 .mapToInt(Integer::intValue)
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerServiceUtils.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerServiceUtils.java
index 79cb561d..049a9f62 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerServiceUtils.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerServiceUtils.java
@@ -18,11 +18,10 @@ package org.apache.camel.karavan.docker;
 
 import com.github.dockerjava.api.model.*;
 import io.smallrye.mutiny.tuples.Tuple2;
-import io.vertx.core.json.JsonArray;
 import org.apache.camel.karavan.api.KameletResources;
 import org.apache.camel.karavan.code.model.DockerComposeHealthCheck;
-import org.apache.camel.karavan.infinispan.model.ContainerStatus;
 import org.apache.camel.karavan.infinispan.model.ContainerPort;
+import org.apache.camel.karavan.infinispan.model.ContainerStatus;
 
 import java.io.BufferedReader;
 import java.io.InputStream;
@@ -59,10 +58,13 @@ public class DockerServiceUtils {
 
     protected void updateStatistics(ContainerStatus containerStatus, 
Statistics stats) {
         if (stats != null && stats.getMemoryStats() != null) {
-            String memoryUsage = 
formatMemory(stats.getMemoryStats().getUsage());
-            String memoryLimit = 
formatMemory(stats.getMemoryStats().getLimit());
-            containerStatus.setMemoryInfo(memoryUsage + " / " + memoryLimit);
+            String memoryUsageString = 
formatMemory(stats.getMemoryStats().getUsage());
+            String memoryLimitString = 
formatMemory(stats.getMemoryStats().getLimit());
+            containerStatus.setMemoryInfo(memoryUsageString + " / " + 
memoryLimitString);
             
containerStatus.setCpuInfo(formatCpu(containerStatus.getContainerName(), 
stats));
+        } else {
+            containerStatus.setMemoryInfo("0MiB/0MiB");
+            containerStatus.setCpuInfo("0%");
         }
     }
 
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 99cb38ff..098b79bd 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
@@ -19,43 +19,32 @@ package org.apache.camel.karavan.git;
 import io.fabric8.kubernetes.api.model.Secret;
 import io.smallrye.mutiny.tuples.Tuple2;
 import io.vertx.core.Vertx;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.inject.Inject;
 import org.apache.camel.karavan.git.model.GitConfig;
 import org.apache.camel.karavan.git.model.GitRepo;
 import org.apache.camel.karavan.git.model.GitRepoFile;
-import org.apache.camel.karavan.infinispan.model.*;
+import org.apache.camel.karavan.infinispan.model.Project;
+import org.apache.camel.karavan.infinispan.model.ProjectFile;
 import org.apache.camel.karavan.kubernetes.KubernetesService;
-import org.apache.camel.karavan.registry.RegistryConfig;
 import org.apache.camel.karavan.service.ConfigService;
-import org.eclipse.jgit.api.CheckoutCommand;
-import org.eclipse.jgit.api.CloneCommand;
-import org.eclipse.jgit.api.FetchCommand;
-import org.eclipse.jgit.api.Git;
-import org.eclipse.jgit.api.PullCommand;
-import org.eclipse.jgit.api.PullResult;
-import org.eclipse.jgit.api.RemoteAddCommand;
+import org.eclipse.jgit.api.*;
 import org.eclipse.jgit.api.errors.GitAPIException;
 import org.eclipse.jgit.api.errors.RefNotFoundException;
 import org.eclipse.jgit.api.errors.TransportException;
 import org.eclipse.jgit.diff.DiffEntry;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.transport.CredentialsProvider;
-import org.eclipse.jgit.transport.FetchResult;
-import org.eclipse.jgit.transport.PushResult;
-import org.eclipse.jgit.transport.URIish;
-import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider;
+import org.eclipse.jgit.transport.*;
 import org.eclipse.jgit.treewalk.TreeWalk;
 import org.eclipse.jgit.treewalk.filter.TreeFilter;
 import org.eclipse.microprofile.config.ConfigProvider;
 import org.eclipse.microprofile.faulttolerance.Retry;
 import org.jboss.logging.Logger;
 
-import jakarta.enterprise.context.ApplicationScoped;
-import jakarta.inject.Inject;
 import java.io.File;
 import java.io.IOException;
 import java.net.URISyntaxException;
-import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/InfinispanService.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/InfinispanService.java
index 27492c57..109781e3 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/InfinispanService.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/InfinispanService.java
@@ -41,7 +41,10 @@ import java.io.BufferedReader;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.time.Instant;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java
index 562b8b30..6c4beac4 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java
@@ -32,6 +32,7 @@ public class Project {
         @ProtoEnumValue (number = 1, name = "kamelets") kamelets,
         @ProtoEnumValue (number = 2, name = "services") services,
         @ProtoEnumValue (number = 3, name = "normal") normal,
+        @ProtoEnumValue (number = 4, name = "ephemeral") ephemeral,
     }
 
     @ProtoField(number = 1)
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 14a6d6a0..5b2459ab 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
@@ -27,29 +27,25 @@ import io.fabric8.openshift.client.OpenShiftClient;
 import io.quarkus.runtime.configuration.ProfileManager;
 import io.smallrye.mutiny.tuples.Tuple2;
 import io.vertx.mutiny.core.eventbus.EventBus;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.inject.Default;
+import jakarta.enterprise.inject.Produces;
+import jakarta.inject.Inject;
+import org.apache.camel.karavan.code.CodeService;
 import org.apache.camel.karavan.infinispan.InfinispanService;
 import org.apache.camel.karavan.infinispan.model.ContainerStatus;
 import org.apache.camel.karavan.infinispan.model.Project;
-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.ConfigProvider;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.eclipse.microprofile.health.HealthCheck;
 import org.eclipse.microprofile.health.HealthCheckResponse;
 import org.eclipse.microprofile.health.Readiness;
 import org.jboss.logging.Logger;
 
-import jakarta.enterprise.context.ApplicationScoped;
-import jakarta.enterprise.inject.Default;
-import jakarta.enterprise.inject.Produces;
-import jakarta.inject.Inject;
-
 import java.nio.charset.StandardCharsets;
 import java.util.*;
 import java.util.stream.Collectors;
 
-import static 
org.apache.camel.karavan.code.CodeService.APPLICATION_PROPERTIES_FILENAME;
 import static org.apache.camel.karavan.shared.Constants.*;
 
 @Default
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 c137a560..0af91999 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
@@ -26,15 +26,14 @@ 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.shared.Constants.LABEL_PROJECT_ID;
 import static 
org.apache.camel.karavan.service.ContainerStatusService.CONTAINER_STATUS;
+import static org.apache.camel.karavan.shared.Constants.LABEL_PROJECT_ID;
 import static org.apache.camel.karavan.shared.Constants.LABEL_TYPE;
 
 public class PodEventHandler implements ResourceEventHandler<Pod> {
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/AuthService.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/AuthService.java
index ae56f23f..099c2571 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/AuthService.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/AuthService.java
@@ -16,10 +16,10 @@
  */
 package org.apache.camel.karavan.service;
 
+import jakarta.enterprise.context.ApplicationScoped;
 import org.eclipse.microprofile.config.ConfigProvider;
 import org.jboss.logging.Logger;
 
-import jakarta.enterprise.context.ApplicationScoped;
 import java.net.MalformedURLException;
 import java.util.Map;
 
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 a945bcc0..134b41fe 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
@@ -24,6 +24,8 @@ import io.vertx.mutiny.core.buffer.Buffer;
 import io.vertx.mutiny.core.eventbus.EventBus;
 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.code.CodeService;
 import org.apache.camel.karavan.infinispan.InfinispanService;
 import org.apache.camel.karavan.infinispan.model.CamelStatus;
@@ -35,9 +37,6 @@ import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.eclipse.microprofile.faulttolerance.CircuitBreaker;
 import org.jboss.logging.Logger;
 
-import jakarta.enterprise.context.ApplicationScoped;
-import jakarta.inject.Inject;
-
 import java.util.*;
 import java.util.concurrent.ExecutionException;
 
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 4dc2dd5a..fca69c3b 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
@@ -17,11 +17,10 @@
 package org.apache.camel.karavan.service;
 
 import io.quarkus.runtime.StartupEvent;
-import org.apache.camel.karavan.shared.Configuration;
-import org.eclipse.microprofile.config.inject.ConfigProperty;
-
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.enterprise.event.Observes;
+import org.apache.camel.karavan.shared.Configuration;
+import org.eclipse.microprofile.config.inject.ConfigProperty;
 
 import java.nio.file.Files;
 import java.nio.file.Paths;
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 b9cca03c..9909b20b 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
@@ -26,7 +26,6 @@ import jakarta.inject.Inject;
 import org.apache.camel.karavan.docker.DockerService;
 import org.apache.camel.karavan.infinispan.InfinispanService;
 import org.apache.camel.karavan.infinispan.model.ContainerStatus;
-import org.apache.camel.karavan.infinispan.model.Project;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.jboss.logging.Logger;
 
@@ -39,6 +38,7 @@ import java.util.Objects;
 public class ContainerStatusService {
 
     public static final String CONTAINER_STATUS = "CONTAINER_STATUS";
+    public static final String CONTAINER_DELETED = "CONTAINER_DELETED";
     private static final Logger LOGGER = 
Logger.getLogger(ContainerStatusService.class.getName());
     @ConfigProperty(name = "karavan.environment")
     String environment;
@@ -57,7 +57,7 @@ public class ContainerStatusService {
         if (infinispanService.isReady() && !ConfigService.inKubernetes()) {
             List<ContainerStatus> statusesInDocker = 
dockerService.collectContainersStatistics();
             statusesInDocker.forEach(containerStatus -> {
-                eventBus.send(ContainerStatusService.CONTAINER_STATUS, 
JsonObject.mapFrom(containerStatus));
+                eventBus.publish(ContainerStatusService.CONTAINER_STATUS, 
JsonObject.mapFrom(containerStatus));
             });
         }
     }
@@ -68,7 +68,7 @@ public class ContainerStatusService {
             if (!ConfigService.inKubernetes()) {
                 List<ContainerStatus> statusesInDocker = 
dockerService.collectContainersStatuses();
                 statusesInDocker.forEach(containerStatus -> {
-                    eventBus.send(ContainerStatusService.CONTAINER_STATUS, 
JsonObject.mapFrom(containerStatus));
+                    eventBus.publish(ContainerStatusService.CONTAINER_STATUS, 
JsonObject.mapFrom(containerStatus));
                 });
                 cleanContainersStatuses(statusesInDocker);
             }
@@ -84,6 +84,7 @@ public class ContainerStatusService {
                     .filter(cs -> !checkTransit(cs))
                     .filter(cs -> 
!namesInDocker.contains(cs.getContainerName()))
                     .forEach(containerStatus -> {
+                        
eventBus.publish(ContainerStatusService.CONTAINER_DELETED, 
JsonObject.mapFrom(containerStatus));
                         
infinispanService.deleteContainerStatus(containerStatus);
                         
infinispanService.deleteCamelStatuses(containerStatus.getProjectId(), 
containerStatus.getEnv());
                     });
@@ -114,24 +115,12 @@ public class ContainerStatusService {
         }
     }
 
-    @ConsumeEvent(value = CONTAINER_STATUS, blocking = true, ordered = true)
-    public void checkProjectExists(JsonObject data) {
-        if (infinispanService.isReady()) {
-            ContainerStatus status = data.mapTo(ContainerStatus.class);
-            if 
(status.getType().equals(ContainerStatus.ContainerType.project)) {
-                Project project = 
infinispanService.getProject(status.getProjectId());
-                if (project == null) {
-                    project = new Project(status.getProjectId(), 
status.getProjectId(), status.getProjectId());
-                    infinispanService.saveProject(project);
-                }
-            }
-        }
-    }
-
     private void saveContainerStatus(ContainerStatus newStatus, 
ContainerStatus oldStatus) {
         if (Objects.equals("exited", newStatus.getState()) || 
Objects.equals("dead", newStatus.getState())) {
             if (Objects.isNull(oldStatus.getFinished())) {
                 newStatus.setFinished(Instant.now().toString());
+                newStatus.setMemoryInfo("0MiB/0MiB");
+                newStatus.setCpuInfo("0%");
             } else if (Objects.nonNull(oldStatus.getFinished())) {
                 return;
             }
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 582f3a98..3748e4d3 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
@@ -22,6 +22,8 @@ import io.quarkus.runtime.Startup;
 import io.quarkus.runtime.StartupEvent;
 import io.quarkus.vertx.ConsumeEvent;
 import io.vertx.core.eventbus.EventBus;
+import jakarta.enterprise.event.Observes;
+import jakarta.inject.Inject;
 import jakarta.inject.Singleton;
 import org.apache.camel.karavan.docker.DockerForGitea;
 import org.apache.camel.karavan.docker.DockerForInfinispan;
@@ -36,8 +38,6 @@ import org.eclipse.microprofile.health.HealthCheckResponse;
 import org.eclipse.microprofile.health.Liveness;
 import org.jboss.logging.Logger;
 
-import jakarta.enterprise.event.Observes;
-import jakarta.inject.Inject;
 import java.io.IOException;
 
 @Startup
@@ -82,7 +82,7 @@ public class KaravanService implements HealthCheck {
 
     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";
+    public static final String START_SERVICES = "START_SERVICES";
 
     @Override
     public HealthCheckResponse call() {
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 b163dbd8..37e71092 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
@@ -18,14 +18,20 @@ package org.apache.camel.karavan.service;
 
 import io.vertx.core.json.JsonObject;
 import io.vertx.mutiny.core.eventbus.EventBus;
+import jakarta.enterprise.context.ApplicationScoped;
+import jakarta.enterprise.inject.Default;
+import jakarta.inject.Inject;
 import org.apache.camel.karavan.code.CodeService;
 import org.apache.camel.karavan.code.DockerComposeConverter;
-import org.apache.camel.karavan.docker.DockerForKaravan;
 import org.apache.camel.karavan.code.model.DockerComposeService;
+import org.apache.camel.karavan.docker.DockerForKaravan;
 import org.apache.camel.karavan.git.GitService;
 import org.apache.camel.karavan.git.model.GitRepo;
 import org.apache.camel.karavan.infinispan.InfinispanService;
-import org.apache.camel.karavan.infinispan.model.*;
+import org.apache.camel.karavan.infinispan.model.ContainerStatus;
+import org.apache.camel.karavan.infinispan.model.GroupedKey;
+import org.apache.camel.karavan.infinispan.model.Project;
+import org.apache.camel.karavan.infinispan.model.ProjectFile;
 import org.apache.camel.karavan.kubernetes.KubernetesService;
 import org.apache.camel.karavan.registry.RegistryService;
 import org.apache.camel.karavan.shared.Property;
@@ -37,10 +43,6 @@ import org.eclipse.microprofile.health.HealthCheckResponse;
 import org.eclipse.microprofile.health.Readiness;
 import org.jboss.logging.Logger;
 
-import jakarta.enterprise.context.ApplicationScoped;
-import jakarta.enterprise.inject.Default;
-import jakarta.inject.Inject;
-
 import java.time.Instant;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
diff --git 
a/karavan-web/karavan-app/src/main/webui/src/containers/ContainerTableRow.tsx 
b/karavan-web/karavan-app/src/main/webui/src/containers/ContainerTableRow.tsx
index 5a751f48..edc74604 100644
--- 
a/karavan-web/karavan-app/src/main/webui/src/containers/ContainerTableRow.tsx
+++ 
b/karavan-web/karavan-app/src/main/webui/src/containers/ContainerTableRow.tsx
@@ -98,7 +98,9 @@ export function ContainerTableRow(props: Props) {
                 <Td>
                     <Label color={color}>{container.containerName}</Label>
                 </Td>
-                <Td>{image}</Td>
+                <Td>
+                    <p style={{wordWrap:"break-word"}}>{image}</p>
+                </Td>
                 <Td>
                     {isRunning && container.cpuInfo && <Label 
color={color}>{container.cpuInfo}</Label>}
                 </Td>
diff --git 
a/karavan-web/karavan-app/src/main/webui/src/containers/ContainersPage.tsx 
b/karavan-web/karavan-app/src/main/webui/src/containers/ContainersPage.tsx
index 5fe8adc4..d8523b6f 100644
--- a/karavan-web/karavan-app/src/main/webui/src/containers/ContainersPage.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/containers/ContainersPage.tsx
@@ -137,7 +137,7 @@ export function ContainersPage () {
 
     const conts = containers.filter(d => 
d.containerName.toLowerCase().includes(filter));
     return (
-        <PageSection className="kamelet-section dashboard-page" 
padding={{default: 'noPadding'}}>
+        <PageSection className="kamelet-section" padding={{default: 
'noPadding'}}>
             <PageSection className="tools-section" padding={{default: 
'noPadding'}}>
                 <MainToolbar title={title()} tools={tools()}/>
             </PageSection>
diff --git 
a/karavan-web/karavan-app/src/main/webui/src/project/build/BuildPanel.tsx 
b/karavan-web/karavan-app/src/main/webui/src/project/build/BuildPanel.tsx
deleted file mode 100644
index f1dedba6..00000000
--- a/karavan-web/karavan-app/src/main/webui/src/project/build/BuildPanel.tsx
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import React, {useEffect, useState} from 'react';
-import {
-    Button,
-    DescriptionList,
-    DescriptionListTerm,
-    DescriptionListGroup,
-    DescriptionListDescription, Spinner, Tooltip, Flex, FlexItem, LabelGroup, 
Label, Modal, Badge, CardBody, Card
-} from '@patternfly/react-core';
-import '../../designer/karavan.css';
-import {KaravanApi} from "../../api/KaravanApi";
-import BuildIcon from "@patternfly/react-icons/dist/esm/icons/build-icon";
-import UpIcon from "@patternfly/react-icons/dist/esm/icons/check-circle-icon";
-import DownIcon from 
"@patternfly/react-icons/dist/esm/icons/error-circle-o-icon";
-import ClockIcon from "@patternfly/react-icons/dist/esm/icons/clock-icon";
-import TagIcon from "@patternfly/react-icons/dist/esm/icons/tag-icon";
-import DeleteIcon from 
"@patternfly/react-icons/dist/esm/icons/times-circle-icon";
-import {useAppConfigStore, useLogStore, useProjectStore, useStatusesStore} 
from "../../api/ProjectStore";
-import {shallow} from "zustand/shallow";
-import {EventBus} from "../../designer/utils/EventBus";
-import {ProjectService} from "../../api/ProjectService";
-
-export function BuildPanel () {
-
-    const [config] = useAppConfigStore((state) => [state.config], shallow)
-    const [project] = useProjectStore((s) => [s.project], shallow);
-    const [setShowLog] = useLogStore((s) => [s.setShowLog], shallow);
-    const [containers, deployments, camels] =
-        useStatusesStore((s) => [s.containers, s.deployments, s.camels], 
shallow);
-    const [isPushing, setIsPushing] = useState<boolean>(false);
-    const [isBuilding, setIsBuilding] = useState<boolean>(false);
-    const [showDeleteConfirmation, setShowDeleteConfirmation] = 
useState<boolean>(false);
-    const [deleteEntityName, setDeleteEntityName] = useState<string>();
-    const [tag, setTag] = useState<string>(
-        new Date().toISOString().substring(0,19).replaceAll(':', 
'').replaceAll('-', '')
-    );
-
-    function deleteEntity() {
-        const buildName = getBuildName();
-        if (buildName) {
-            KaravanApi.manageContainer(config.environment, 'build', buildName, 
'delete', res => {
-                EventBus.sendAlert("Container deleted", "Container " + 
buildName + " deleted", 'info')
-                setShowLog(false, 'container', undefined)
-            });
-        }
-    }
-
-    function build() {
-        setIsBuilding(true);
-        setShowLog(false,'none')
-        KaravanApi.buildProject(project, tag, res => {
-            if (res.status === 200 || res.status === 201) {
-                setIsBuilding(false);
-            } else {
-                console.log(res);
-                EventBus.sendAlert("Error", (res as any)?.response?.data, 
'danger')
-            }
-        });
-    }
-
-    function buildButton() {
-        const status = containers.filter(c => c.projectId === 
project.projectId && c.type === 'build').at(0);
-        const isRunning = status?.state === 'running';
-        return (<Tooltip content="Start build" position={"left"}>
-            <Button isLoading={isBuilding ? true : undefined}
-                    isDisabled={isBuilding || isRunning || isPushing}
-                    size="sm"
-                    variant="secondary"
-                    className="project-button"
-                    icon={!isBuilding ? <BuildIcon/> : <div></div>}
-                    onClick={e => build()}>
-                {isBuilding ? "..." : "Build"}
-            </Button>
-        </Tooltip>)
-    }
-
-    function getContainerStatus() {
-        return containers.filter(c => c.projectId === project.projectId && 
c.type === 'build').at(0);
-    }
-
-    function getBuildName() {
-        const status = getContainerStatus();
-        return status?.containerName;
-    }
-
-    function getBuildState() {
-        const status = getContainerStatus();
-        const buildName = getBuildName();
-        const state = status?.state;
-        let buildTime = 0;
-        if (status?.created) {
-            const start: Date = new Date(status.created);
-            const finish: Date = status.finished !== undefined && 
status.finished !== null ? new Date(status.finished) : new Date();
-            buildTime = Math.round((finish.getTime() - start.getTime()) / 
1000);
-        }
-        const showTime = buildTime && buildTime > 0;
-        const isRunning = state === 'running';
-        const isExited = state === 'exited';
-        const isFailed = state === 'failed';
-        const color = (isRunning ? "blue" : (isFailed ? "red" : "grey"));
-        const icon = isExited ? <UpIcon className="not-spinner"/> : <DownIcon 
className="not-spinner"/>
-        return (
-            <Flex justifyContent={{default: "justifyContentSpaceBetween"}} 
alignItems={{default: "alignItemsCenter"}}>
-                <FlexItem>
-                    <LabelGroup numLabels={3}>
-                        <Label icon={isRunning ? <Spinner diameter="16px" 
className="spinner"/> : icon}
-                               color={color}>
-                            {buildName
-                                ? <Button className='labeled-button' 
variant="link" onClick={e =>
-                                    useLogStore.setState({showLog: true, type: 
'build', podName: buildName})
-                                }>
-                                    {buildName}
-                                </Button>
-                                : "No builder"}
-                            {status !== undefined && <Tooltip content={"Delete 
build"}>
-                                <Button
-                                    icon={<DeleteIcon/>}
-                                    className="labeled-button"
-                                    variant="link" onClick={e => {
-                                    setShowDeleteConfirmation(true);
-                                    setDeleteEntityName(buildName);
-                                }}></Button>
-                            </Tooltip>}
-                        </Label>
-                        {buildName !== undefined && showTime === true && 
buildTime !== undefined &&
-                            <Label icon={<ClockIcon className="not-spinner"/>}
-                                   color={color}>{buildTime + "s"}</Label>}
-                    </LabelGroup>
-                </FlexItem>
-                <FlexItem>{buildButton()}</FlexItem>
-            </Flex>
-        )
-    }
-
-    function getBuildTag() {
-        const status = containers.filter(c => c.projectId === 
project.projectId && c.type === 'build').at(0);
-        const state = status?.state;
-        const isRunning = state === 'running';
-        const isExited = state === 'exited';
-        const color = isExited ? "grey" : (isRunning ? "blue" : "grey");
-        return (
-            <Label isEditable={!isRunning} onEditComplete={(_, v) => setTag(v)}
-                   icon={<TagIcon className="not-spinner"/>}
-                   color={color}>{tag}</Label>
-        )
-    }
-
-    function getDeleteConfirmation() {
-        return (<Modal
-            className="modal-delete"
-            title="Confirmation"
-            isOpen={showDeleteConfirmation}
-            onClose={() => setShowDeleteConfirmation(false)}
-            actions={[
-                <Button key="confirm" variant="primary" onClick={e => {
-                    if (deleteEntityName && deleteEntity) {
-                        deleteEntity();
-                        setShowDeleteConfirmation(false);
-                    }
-                }}>Delete
-                </Button>,
-                <Button key="cancel" variant="link"
-                        onClick={e => 
setShowDeleteConfirmation(false)}>Cancel</Button>
-            ]}
-            onEscapePress={e => setShowDeleteConfirmation(false)}>
-            <div>{"Delete build " + deleteEntityName + "?"}</div>
-        </Modal>)
-    }
-
-    return (
-        <Card className="project-status">
-            <CardBody>
-                <DescriptionList isHorizontal 
horizontalTermWidthModifier={{default: '20ch'}}>
-                    <DescriptionListGroup>
-                        <DescriptionListTerm>Tag</DescriptionListTerm>
-                        <DescriptionListDescription>
-                            {getBuildTag()}
-                        </DescriptionListDescription>
-                    </DescriptionListGroup>
-                    <DescriptionListGroup>
-                        <DescriptionListTerm>Build 
container</DescriptionListTerm>
-                        <DescriptionListDescription>
-                            {getBuildState()}
-                        </DescriptionListDescription>
-                    </DescriptionListGroup>
-                </DescriptionList>
-            </CardBody>
-            {showDeleteConfirmation && getDeleteConfirmation()}
-        </Card>
-    )
-}
diff --git 
a/karavan-web/karavan-app/src/main/webui/src/project/build/ImagesPanel.tsx 
b/karavan-web/karavan-app/src/main/webui/src/project/build/ImagesPanel.tsx
deleted file mode 100644
index 22c22a93..00000000
--- a/karavan-web/karavan-app/src/main/webui/src/project/build/ImagesPanel.tsx
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import React, {useState} from 'react';
-import {
-    Button,
-    Tooltip,
-    Flex,
-    FlexItem,
-    Modal,
-    Panel,
-    PanelHeader,
-    TextContent,
-    Text,
-    TextVariants,
-    Bullseye, EmptyState, EmptyStateVariant, EmptyStateHeader, EmptyStateIcon, 
PageSection, Switch, TextInput
-} from '@patternfly/react-core';
-import '../../designer/karavan.css';
-import {useFilesStore, useProjectStore} from "../../api/ProjectStore";
-import {shallow} from "zustand/shallow";
-import {Table} from "@patternfly/react-table/deprecated";
-import {Tbody, Td, Th, Thead, Tr} from "@patternfly/react-table";
-import SearchIcon from "@patternfly/react-icons/dist/esm/icons/search-icon";
-import SetIcon from "@patternfly/react-icons/dist/esm/icons/check-icon";
-import {KaravanApi} from "../../api/KaravanApi";
-import {ProjectService} from "../../api/ProjectService";
-import {ServicesYaml} from "../../api/ServiceModels";
-import DeleteIcon from "@patternfly/react-icons/dist/js/icons/times-icon";
-import {EventBus} from "../../designer/utils/EventBus";
-
-export function ImagesPanel () {
-
-    const [project, images] = useProjectStore((s) => [s.project, s.images], 
shallow);
-    const [files] = useFilesStore((s) => [s.files], shallow);
-    const [showSetConfirmation, setShowSetConfirmation] = 
useState<boolean>(false);
-    const [showDeleteConfirmation, setShowDeleteConfirmation] = 
useState<boolean>(false);
-    const [imageName, setImageName] = useState<string>();
-    const [commitChanges, setCommitChanges] = useState<boolean>(false);
-    const [commitMessage, setCommitMessage] = useState('');
-
-    function setProjectImage() {
-        if (imageName) {
-            KaravanApi.setProjectImage(project.projectId, imageName, 
commitChanges, commitMessage, (res: any) => {
-                ProjectService.refreshProjectData(project.projectId);
-            });
-        }
-    }
-
-    function getProjectImage(): string | undefined {
-        const file = files.filter(f => f.name === 'docker-compose.yaml').at(0);
-        if (file) {
-            const dc = ServicesYaml.yamlToServices(file.code);
-            const dcs = dc.services.filter(s => s.container_name === 
project.projectId).at(0);
-            return dcs?.image;
-        }
-        return undefined;
-    }
-
-    function getSetConfirmation() {
-        const index = imageName?.lastIndexOf(":");
-        const name = imageName?.substring(0, index);
-        const tag = index ? imageName?.substring(index+1) : "";
-        return (<Modal
-            className="modal-delete"
-            title="Confirmation"
-            isOpen={showSetConfirmation}
-            onClose={() => setShowSetConfirmation(false)}
-            actions={[
-                <Button key="confirm" variant="primary" onClick={e => {
-                    if (imageName) {
-                        setProjectImage();
-                        setShowSetConfirmation(false);
-                        setCommitChanges(false);
-                    }
-                }}>Set
-                </Button>,
-                <Button key="cancel" variant="link"
-                        onClick={e => {
-                            setShowSetConfirmation(false);
-                            setCommitChanges(false);
-                        }}>Cancel</Button>
-            ]}
-            onEscapePress={e => setShowSetConfirmation(false)}>
-            <Flex direction={{default:"column"}} 
justifyContent={{default:"justifyContentFlexStart"}}>
-                <FlexItem>
-                    <div>{"Set image for project " + project.projectId + 
":"}</div>
-                    <div>{"Name: " + name}</div>
-                    <div>{"Tag: " + tag}</div>
-                </FlexItem>
-                <FlexItem>
-                    <Switch
-                        id="commit-switch"
-                        label="Commit changes"
-                        isChecked={commitChanges}
-                        onChange={(event, checked) => 
setCommitChanges(checked)}
-                        isReversed
-                    />
-                </FlexItem>
-                {commitChanges && <FlexItem>
-                    <TextInput value={commitMessage} type="text"
-                               onChange={(_, value) => setCommitMessage(value)}
-                               aria-label="commit message"/>
-                </FlexItem>}
-            </Flex>
-        </Modal>)
-    }
-
-    function getDeleteConfirmation() {
-        return (<Modal
-            className="modal-delete"
-            title="Confirmation"
-            isOpen={showDeleteConfirmation}
-            onClose={() => setShowDeleteConfirmation(false)}
-            actions={[
-                <Button key="confirm" variant="primary" onClick={e => {
-                    if (imageName) {
-                        KaravanApi.deleteImage(imageName, () => {
-                            EventBus.sendAlert("Image deleted", "Image " + 
imageName + " deleted", 'info');
-                            setShowDeleteConfirmation(false);
-                        });
-                    }
-                }}>Delete
-                </Button>,
-                <Button key="cancel" variant="link"
-                        onClick={e => 
setShowDeleteConfirmation(false)}>Cancel</Button>
-            ]}
-            onEscapePress={e => setShowDeleteConfirmation(false)}>
-            <div>{"Delete image:"}</div>
-            <div>{imageName}</div>
-        </Modal>)
-    }
-
-    const projectImage = getProjectImage();
-    return (
-        <PageSection className="project-tab-panel project-images-panel" 
padding={{default: "padding"}}>
-            <Panel>
-                <PanelHeader>
-                    <Flex direction={{default: "row"}} 
justifyContent={{default:"justifyContentFlexStart"}}>
-                        <FlexItem>
-                            <TextContent>
-                                <Text component={TextVariants.h6}>Images</Text>
-                            </TextContent>
-                        </FlexItem>
-                        <FlexItem>
-
-                        </FlexItem>
-                    </Flex>
-                </PanelHeader>
-            </Panel>
-            <Table aria-label="Images" variant={"compact"} className={"table"}>
-                <Thead>
-                    <Tr>
-                        <Th key='status' width={10}></Th>
-                        <Th key='image' width={20}>Image</Th>
-                        <Th key='tag' width={10}>Tag</Th>
-                        <Th key='actions' width={10}></Th>
-                    </Tr>
-                </Thead>
-                <Tbody>
-                    {images.map(image => {
-                        const index = image.lastIndexOf(":");
-                        const name = image.substring(0, index);
-                        const tag = image.substring(index+1);
-                        return <Tr key={image}>
-                            <Td modifier={"fitContent"} >
-                                {image === projectImage ? <SetIcon/> : <div/>}
-                            </Td>
-                            <Td>
-                                {name}
-                            </Td>
-                            <Td>
-                                {tag}
-                            </Td>
-                            <Td modifier={"fitContent"} isActionCell>
-                                <Flex direction={{default: "row"}} 
justifyContent={{default: "justifyContentFlexEnd"}}
-                                      spaceItems={{default: 'spaceItemsNone'}}>
-                                    <FlexItem>
-                                        <Tooltip content={"Delete image"} 
position={"bottom"}>
-                                            <Button variant={"plain"}
-                                                    icon={<DeleteIcon/>}
-                                                    isDisabled={image === 
projectImage}
-                                                    onClick={e => {
-                                                        setImageName(image);
-                                                        
setShowDeleteConfirmation(true);
-                                                    }}>
-                                            </Button>
-                                        </Tooltip>
-                                    </FlexItem>
-                                    <FlexItem>
-                                        <Tooltip content="Set project image" 
position={"bottom"}>
-                                            <Button style={{padding: '0'}}
-                                                    variant={"plain"}
-                                                    isDisabled={image === 
projectImage}
-                                                    onClick={e => {
-                                                        setImageName(image);
-                                                        
setCommitMessage(commitMessage === '' ? new Date().toLocaleString() : 
commitMessage);
-                                                        
setShowSetConfirmation(true);
-                                                    }}>
-                                                <SetIcon/>
-                                            </Button>
-                                        </Tooltip>
-                                    </FlexItem>
-                                </Flex>
-                            </Td>
-                        </Tr>
-                    })}
-                    {images.length === 0 &&
-                        <Tr>
-                            <Td colSpan={8}>
-                                <Bullseye>
-                                    <EmptyState variant={EmptyStateVariant.sm}>
-                                        <EmptyStateHeader titleText="No 
results found" icon={<EmptyStateIcon icon={SearchIcon}/>} headingLevel="h2" />
-                                    </EmptyState>
-                                </Bullseye>
-                            </Td>
-                        </Tr>
-                    }
-                </Tbody>
-            </Table>
-            {showSetConfirmation && getSetConfirmation()}
-            {showDeleteConfirmation && getDeleteConfirmation()}
-        </PageSection>
-    )
-}
diff --git 
a/karavan-web/karavan-app/src/main/webui/src/project/build/ProjectBuildTab.tsx 
b/karavan-web/karavan-app/src/main/webui/src/project/build/ProjectBuildTab.tsx
deleted file mode 100644
index 31e6b19a..00000000
--- 
a/karavan-web/karavan-app/src/main/webui/src/project/build/ProjectBuildTab.tsx
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-import React from 'react';
-import '../../designer/karavan.css';
-import {BuildPanel} from "./BuildPanel";
-import {PageSection} from "@patternfly/react-core";
-
-export function ProjectBuildTab () {
-
-    return (
-        <PageSection className="project-tab-panel project-build-panel" 
padding={{default: "padding"}}>
-            <div>
-                <BuildPanel/>
-            </div>
-        </PageSection>
-    )
-}

Reply via email to