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 b8ac47a41a185e8fe7f9eae1559203d42af7e5bf
Author: Marat Gubaidullin <marat.gubaidul...@gmail.com>
AuthorDate: Fri Jul 21 21:19:51 2023 -0400

    karavan-app #817
---
 karavan-web/karavan-app/pom.xml                    | 60 +++-------------------
 .../apache/camel/karavan/api/DevModeResource.java  |  4 +-
 .../camel/karavan/docker/DockerEventListener.java  |  5 +-
 .../apache/camel/karavan/docker/DockerService.java | 57 ++++++++++++++++----
 .../karavan/kubernetes/KubernetesService.java      |  2 +-
 .../camel/karavan/kubernetes/PodEventHandler.java  |  3 +-
 .../apache/camel/karavan/service/CamelService.java | 42 +++++----------
 .../apache/camel/karavan/service/EventService.java | 25 ++++++---
 .../camel/karavan/service/ScheduledService.java    | 17 +++---
 .../apache/camel/karavan/shared/ConfigService.java |  7 +++
 .../org/apache/camel/karavan/shared/EventType.java |  2 +-
 .../src/main/resources/application.properties      | 15 ++----
 karavan-web/pom.xml                                |  8 +--
 13 files changed, 110 insertions(+), 137 deletions(-)

diff --git a/karavan-web/karavan-app/pom.xml b/karavan-web/karavan-app/pom.xml
index 620584ec..f38269f9 100644
--- a/karavan-web/karavan-app/pom.xml
+++ b/karavan-web/karavan-app/pom.xml
@@ -20,12 +20,17 @@
     <artifactId>karavan</artifactId>
     <parent>
         <groupId>org.apache.camel.karavan</groupId>
-        <artifactId>karavan-cloud</artifactId>
+        <artifactId>karavan-web</artifactId>
         <version>3.21.1-SNAPSHOT</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
 
     <dependencies>
+        <dependency>
+            <groupId>org.apache.camel.karavan</groupId>
+            <artifactId>karavan-infinispan</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         <dependency>
             <groupId>io.quarkus</groupId>
             <artifactId>quarkus-smallrye-reactive-messaging</artifactId>
@@ -104,11 +109,6 @@
             <groupId>com.google.guava</groupId>
             <artifactId>guava</artifactId>
         </dependency>
-        <!-- Infinispan -->
-        <dependency>
-            <groupId>io.quarkus</groupId>
-            <artifactId>quarkus-infinispan-client</artifactId>
-        </dependency>
         <!-- Docker -->
         <dependency>
             <groupId>com.github.docker-java</groupId>
@@ -144,11 +144,6 @@
             <artifactId>rest-assured</artifactId>
             <scope>test</scope>
         </dependency>
-        <dependency>
-            <groupId>io.quarkiverse.quinoa</groupId>
-            <artifactId>quarkus-quinoa</artifactId>
-            <version>${quinoa.version}</version>
-        </dependency>
     </dependencies>
     <build>
         <resources>
@@ -164,13 +159,6 @@
                     <include>**/**.xml</include>
                 </includes>
             </resource>
-            <resource>
-                <directory>target/classes/proto</directory>
-                <filtering>true</filtering>
-                <includes>
-                    <include>karavan.proto</include>
-                </includes>
-            </resource>
         </resources>
         <plugins>
             <plugin>
@@ -224,42 +212,6 @@
             </plugin>
         </plugins>
     </build>
-    <profiles>
-        <profile>
-            <id>native</id>
-            <activation>
-                <property>
-                    <name>native</name>
-                </property>
-            </activation>
-            <build>
-                <plugins>
-                    <plugin>
-                        <artifactId>maven-failsafe-plugin</artifactId>
-                        <version>${surefire-plugin.version}</version>
-                        <executions>
-                            <execution>
-                                <goals>
-                                    <goal>integration-test</goal>
-                                    <goal>verify</goal>
-                                </goals>
-                                <configuration>
-                                    <systemPropertyVariables>
-                                        
<native.image.path>${project.build.directory}/${project.build.finalName}-runner</native.image.path>
-                                        
<java.util.logging.manager>org.jboss.logmanager.LogManager</java.util.logging.manager>
-                                        <maven.home>${maven.home}</maven.home>
-                                    </systemPropertyVariables>
-                                </configuration>
-                            </execution>
-                        </executions>
-                    </plugin>
-                </plugins>
-            </build>
-            <properties>
-                <quarkus.package.type>native</quarkus.package.type>
-            </properties>
-        </profile>
-    </profiles>
     <repositories>
         <repository>
             <id>apache.snapshots</id>
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 4170abd8..a5372ed9 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
@@ -63,9 +63,9 @@ public class DevModeResource {
         if (status == null) {
             infinispanService.saveDevModeStatus(new 
DevModeStatus(project.getProjectId(), null, null, false));
             if (ConfigService.inKubernetes()) {
-                kubernetesService.createRunner(project, runnerName, "");
+                kubernetesService.runDevModeContainer(project, runnerName, "");
             } else {
-                dockerService.createRunner(project, runnerName, "");
+                dockerService.runDevmodeContainer(project, runnerName, "");
             }
             return Response.ok(runnerName).build();
         }
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 64816aea..40c2b858 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
@@ -97,6 +97,7 @@ public class DockerEventListener implements 
ResultCallback<Event> {
                 String name = container.getNames()[0].replace("/", "");
                 if (Arrays.asList("stop", "die", "kill", "pause", 
"destroy").contains(event.getStatus())) {
                     String projectId = name.replace(DEVMODE_SUFFIX, "");
+                    infinispanService.deleteDevModeStatus(projectId);
                     infinispanService.deleteContainerStatus(projectId, 
environment, name);
                     infinispanService.deleteCamelStatuses(projectId, 
environment);
                 } else if (Arrays.asList("start", 
"unpause").contains(event.getStatus())) {
@@ -127,9 +128,7 @@ public class DockerEventListener implements 
ResultCallback<Event> {
         if (infinispanService.isReady()) {
             ContainerStatus ps = 
infinispanService.getDevModeContainerStatuses(projectId, environment);
             if (ps == null) {
-                ps = new ContainerStatus(name, true, projectId, environment, 
getCtype(container.getLabels()), 
Instant.ofEpochSecond(container.getCreated()).toString(), exposedPort);
-            } else {
-                ps.setExposedPort(exposedPort);
+                ps = new ContainerStatus(name, true, projectId, environment, 
getCtype(container.getLabels()), 
Instant.ofEpochSecond(container.getCreated()).toString());
             }
             infinispanService.saveContainerStatus(ps);
         }
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 40c1d714..f2a8bd8e 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
@@ -36,6 +36,9 @@ public class DockerService {
 
     private static final Logger LOGGER = 
Logger.getLogger(DockerService.class.getName());
 
+    public static final String INFINISPAN_CONTAINER_NAME = "infinispan";
+    public static final String KARAVAN_CONTAINER_NAME = "karavan-headless";
+
     public static final String NETWORK_NAME = "karavan";
     public static final String LABEL_TYPE = "type";
     public static final String LABEL_PROJECT_ID = "projectId";
@@ -44,11 +47,16 @@ public class DockerService {
     private static final DecimalFormat formatGiB = new DecimalFormat("0.00");
     private static final Map<String, Tuple2<Long, Long>> previousStats = new 
ConcurrentHashMap<>();
 
-    @ConfigProperty(name = "runner.image")
-    String runnerImage;
+    @ConfigProperty(name = "karavan.devmode.image")
+    String devmodeImage;
+
+    @ConfigProperty(name = "karavan.headless.image")
+    String headlessImage;
 
     @ConfigProperty(name = "infinispan.image")
     String infinispanImage;
+    @ConfigProperty(name = "infinispan.hosts")
+    String infinispanHosts;
     @ConfigProperty(name = "infinispan.port")
     String infinispanPort;
     @ConfigProperty(name = "infinispan.username")
@@ -62,20 +70,18 @@ public class DockerService {
     @Inject
     EventBus eventBus;
 
-    public void createRunner(Project project, String runnerName, String 
jBangOptions) throws InterruptedException {
+    public void runDevmodeContainer(Project project, String runnerName, String 
jBangOptions) throws InterruptedException {
         String projectId = project.getProjectId();
         LOGGER.infof("DevMode starting for %s", projectId);
         HealthCheck healthCheck = new HealthCheck().withTest(List.of("CMD", 
"curl", "-f", "http://localhost:8080/q/dev/health";))
                 
.withInterval(10000000000L).withTimeout(10000000000L).withStartPeriod(10000000000L).withRetries(30);
-        createContainer(runnerName, runnerImage,
-                List.of(), "8080:8080", true,true, healthCheck,
+        createContainer(runnerName, devmodeImage,
+                List.of(), null, false, false, healthCheck,
                 Map.of(LABEL_TYPE, ContainerStatus.CType.devmode.name(), 
LABEL_PROJECT_ID, projectId));
         startContainer(runnerName);
         LOGGER.infof("DevMode started for %s", projectId);
     }
 
-    public static final String INFINISPAN_CONTAINER_NAME = "infinispan";
-
     public void startInfinispan() {
         try {
             LOGGER.info("Infinispan is starting...");
@@ -94,6 +100,32 @@ public class DockerService {
         }
     }
 
+    public void startKaravanHeadlessContainer() {
+        try {
+            LOGGER.info("Karavan headless is starting...");
+
+            createContainer(KARAVAN_CONTAINER_NAME, headlessImage,
+                    List.of(
+                            "INFINISPAN_HOSTS=infinispan:11222",
+                            "INFINISPAN_USERNAME=" + infinispanUsername,
+                            "INFINISPAN_PASSWORD=" + infinispanPassword
+                    ),
+                    null, false, false, new HealthCheck(), Map.of());
+            startContainer(KARAVAN_CONTAINER_NAME);
+            LOGGER.info("Karavan headless is started");
+        } catch (Exception e) {
+            LOGGER.error(e.getMessage());
+        }
+    }
+
+    public void deleteKaravanHeadlessContainer() {
+        try {
+            deleteContainer(KARAVAN_CONTAINER_NAME);
+        } catch (Exception e) {
+            LOGGER.error(e.getMessage());
+        }
+    }
+
     public void collectContainersStats() {
         getDockerClient().listContainersCmd().exec().forEach(container -> {
             Statistics stats = getContainerStats(container.getId());
@@ -107,7 +139,7 @@ public class DockerService {
                     "memory", memoryUsage + " / " + memoryLimit,
                     "cpu", formatCpu(name, stats)
             );
-            eventBus.publish(CONTAINER_STATS, data);
+            eventBus.publish(CONTAINER_STATISTICS, data);
         });
     }
 
@@ -259,7 +291,12 @@ public class DockerService {
 
     public void pullImage(String image) throws InterruptedException {
         List<Image> images = 
getDockerClient().listImagesCmd().withShowAll(true).exec();
-        if (!images.stream().filter(i -> 
Arrays.asList(i.getRepoTags()).contains(image)).findFirst().isPresent()) {
+        List<String> tags = images.stream()
+                .map(i -> 
Arrays.stream(i.getRepoTags()).collect(Collectors.toList()))
+                .flatMap(Collection::stream)
+                .collect(Collectors.toList());
+
+        if (!images.stream().filter(i -> 
tags.contains(image)).findFirst().isPresent()) {
             ResultCallback.Adapter<PullResponseItem> pull = 
getDockerClient().pullImageCmd(image).start().awaitCompletion();
         }
     }
@@ -280,7 +317,7 @@ public class DockerService {
 
     private Map<Integer, Integer> getPortsFromString(String ports) {
         Map<Integer, Integer> p = new HashMap<>();
-        if (!ports.isEmpty()) {
+        if (ports != null && !ports.isEmpty()) {
             Arrays.stream(ports.split(",")).forEach(s -> {
                 String[] values = s.split(":");
                 p.put(Integer.parseInt(values[0]), 
Integer.parseInt(values[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 dc6fb90f..f10a38b6 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
@@ -385,7 +385,7 @@ public class KubernetesService implements HealthCheck {
         return result;
     }
 
-    public void createRunner(Project project, String runnerName, String 
jBangOptions) {
+    public void runDevModeContainer(Project project, String runnerName, String 
jBangOptions) {
         createPVC(runnerName);
         Pod old = 
kubernetesClient().pods().inNamespace(getNamespace()).withName(runnerName).get();
         if (old == null) {
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 47378b95..791d6bfc 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
@@ -92,8 +92,7 @@ public class PodEventHandler implements 
ResourceEventHandler<Pod> {
                     project,
                     kubernetesService.environment,
                     ContainerStatus.CType.pod,
-                    "",
-                    null);
+                    "");
         }
     }
 }
\ No newline at end of file
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 bb675585..38570b9c 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
@@ -76,10 +76,8 @@ public class CamelService {
         LOGGER.info("Reload project code " + projectId);
         String containerName = projectId + DEVMODE_SUFFIX;
         try {
-            ContainerStatus containerStatus = 
infinispanService.getDevModeContainerStatuses(projectId, environment);
-            Integer exposedPort = containerStatus.getExposedPort();
-            infinispanService.getProjectFiles(projectId).forEach(projectFile 
-> putRequest(containerName,exposedPort, projectFile.getName(), 
projectFile.getCode(), 1000));
-            reloadRequest(containerName, exposedPort);
+            infinispanService.getProjectFiles(projectId).forEach(projectFile 
-> putRequest(containerName, projectFile.getName(), projectFile.getCode(), 
1000));
+            reloadRequest(containerName);
             DevModeStatus dms = infinispanService.getDevModeStatus(projectId);
             dms.setCodeLoaded(true);
             infinispanService.saveDevModeStatus(dms);
@@ -89,9 +87,9 @@ public class CamelService {
     }
 
     @CircuitBreaker(requestVolumeThreshold = 10, failureRatio = 0.5, delay = 
1000)
-    public boolean putRequest(String containerName, Integer exposedPort, 
String fileName, String body, int timeout) {
+    public boolean putRequest(String containerName, String fileName, String 
body, int timeout) {
         try {
-            String url = getContainerAddress(containerName, exposedPort) + 
"/q/upload/" + fileName;
+            String url = getContainerAddress(containerName) + "/q/upload/" + 
fileName;
             HttpResponse<Buffer> result = getWebClient().putAbs(url)
                     
.timeout(timeout).sendBuffer(Buffer.buffer(body)).subscribeAsCompletionStage().toCompletableFuture().get();
             return result.statusCode() == 200;
@@ -101,8 +99,8 @@ public class CamelService {
         return false;
     }
 
-    public String reloadRequest(String containerName, Integer exposedPort) {
-        String url = getContainerAddress(containerName, exposedPort) + 
"/q/dev/reload?reload=true";
+    public String reloadRequest(String containerName) {
+        String url = getContainerAddress(containerName) + 
"/q/dev/reload?reload=true";
         try {
             return result(url, 1000);
         } catch (InterruptedException | ExecutionException e) {
@@ -111,18 +109,14 @@ public class CamelService {
         return null;
     }
 
-    public String getContainerAddress(String containerName, Integer 
exposedPort) {
-        if (ConfigService.inKubernetes()) {
-            return "http://"; + containerName + "." + 
kubernetesService.getNamespace() + ".svc.cluster.local";
-        } else {
-            return "http://localhost:"; + exposedPort;
-        }
+    public String getContainerAddress(String containerName) {
+        return "http://"; + containerName + "." + 
kubernetesService.getNamespace() + ".svc.cluster.local";
     }
 
     public void collectCamelStatuses() {
         if (infinispanService.isReady()) {
             infinispanService.getContainerStatuses(environment).forEach(pod -> 
{
-                CamelStatusRequest csr = new 
CamelStatusRequest(pod.getProjectId(), pod.getName(), pod.getExposedPort());
+                CamelStatusRequest csr = new 
CamelStatusRequest(pod.getProjectId(), pod.getName());
                 eventBus.publish(CMD_COLLECT_CAMEL_STATUS, 
JsonObject.mapFrom(csr));
             });
         }
@@ -133,8 +127,7 @@ public class CamelService {
         CamelStatusRequest dms = data.mapTo(CamelStatusRequest.class);
         Arrays.stream(CamelStatus.Name.values()).forEach(statusName -> {
             String containerName = dms.getContainerName();
-            Integer exposedPort = dms.getExposedPort();
-            String status = getCamelStatus(containerName, exposedPort, 
statusName);
+            String status = getCamelStatus(containerName, statusName);
             if (status != null) {
                 CamelStatus cs = new CamelStatus(dms.getProjectId(), 
containerName, statusName, status, environment);
                 infinispanService.saveCamelStatus(cs);
@@ -179,8 +172,8 @@ public class CamelService {
         }
     }
 
-    public String getCamelStatus(String podName, Integer exposedPort, 
CamelStatus.Name statusName) {
-        String url = getContainerAddress(podName, exposedPort) + "/q/dev/" + 
statusName.name();
+    public String getCamelStatus(String podName, CamelStatus.Name statusName) {
+        String url = getContainerAddress(podName) + "/q/dev/" + 
statusName.name();
         try {
             return result(url, 500);
         } catch (InterruptedException | ExecutionException e) {
@@ -207,15 +200,13 @@ public class CamelService {
     public static class CamelStatusRequest {
         private String projectId;
         private String containerName;
-        private Integer exposedPort;
 
         public CamelStatusRequest() {
         }
 
-        public CamelStatusRequest(String projectId, String containerName, 
Integer exposedPort) {
+        public CamelStatusRequest(String projectId, String containerName) {
             this.projectId = projectId;
             this.containerName = containerName;
-            this.exposedPort = exposedPort;
         }
 
         public String getProjectId() {
@@ -234,12 +225,5 @@ public class CamelService {
             this.containerName = containerName;
         }
 
-        public Integer getExposedPort() {
-            return exposedPort;
-        }
-
-        public void setExposedPort(Integer exposedPort) {
-            this.exposedPort = exposedPort;
-        }
     }
 }
\ No newline at end of file
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/EventService.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/EventService.java
index 0d0a9759..cc4277a8 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/EventService.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/EventService.java
@@ -48,11 +48,16 @@ public class EventService {
     @ConsumeEvent(value = START_KARAVAN, blocking = true, ordered = true)
     void startKaravan(String data) {
         if (!ConfigService.inKubernetes()) {
-            LOGGER.info("Starting Karavan with Docker");
-            dockerService.createNetwork();
-            dockerService.startListeners();
-            dockerService.startInfinispan();
-            dockerService.checkInfinispanHealth();
+            if (ConfigService.isHeadless()) {
+                LOGGER.info("Starting Karavan Headless in Docker");
+            } else {
+                LOGGER.info("Starting Karavan with Docker");
+                dockerService.createNetwork();
+                dockerService.startListeners();
+                dockerService.startInfinispan();
+                dockerService.checkInfinispanHealth();
+                dockerService.collectContainersStatuses();
+            }
         } else {
             LOGGER.info("Starting Karavan in " + 
(kubernetesService.isOpenshift() ? "OpenShift" : "Kubernetes"));
             startServices(HEALTHY);
@@ -60,9 +65,13 @@ public class EventService {
     }
 
     @ConsumeEvent(value = INFINISPAN_STARTED, blocking = true, ordered = true)
-    void startServices(String infinispanHealth){
+    void startServices(String infinispanHealth) {
         if (infinispanHealth.equals(HEALTHY)) {
-            infinispanService.start();
+            if (!ConfigService.inKubernetes()) {
+                dockerService.deleteKaravanHeadlessContainer();
+                dockerService.startKaravanHeadlessContainer();
+            }
+            infinispanService.start(false);
             infinispanService.clearAllStatuses();
             bus.publish(EventType.IMPORT_PROJECTS, "");
             bus.publish(EventType.START_INFRASTRUCTURE_LISTENERS, "");
@@ -103,7 +112,7 @@ public class EventService {
         }
     }
 
-    @ConsumeEvent(value = CONTAINER_STATS, blocking = true, ordered = true)
+    @ConsumeEvent(value = CONTAINER_STATISTICS, blocking = true, ordered = 
true)
     public void saveStats(JsonObject data) {
         String projectId = data.getString("projectId");
         String memory = data.getString("memory");
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ScheduledService.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ScheduledService.java
index 953b660d..ae586bbb 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ScheduledService.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ScheduledService.java
@@ -18,6 +18,7 @@ package org.apache.camel.karavan.service;
 
 import io.quarkus.scheduler.Scheduled;
 import org.apache.camel.karavan.docker.DockerService;
+import org.jboss.logging.Logger;
 
 import javax.enterprise.context.ApplicationScoped;
 import javax.inject.Inject;
@@ -25,6 +26,8 @@ import javax.inject.Inject;
 @ApplicationScoped
 public class ScheduledService {
 
+    private static final Logger LOGGER = 
Logger.getLogger(ScheduledService.class.getName());
+
     @Inject
     DockerService dockerService;
 
@@ -34,23 +37,17 @@ public class ScheduledService {
     @Inject
     CamelService camelService;
 
-    @Scheduled(every = "{karavan.container.status.pull-interval}", 
concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
-    void collectContainersStatuses() {
-        dockerService.collectContainersStatuses();
-    }
-
-    @Scheduled(every = "{karavan.container.stats.container}", 
concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
+    @Scheduled(every = "{karavan.container.statistics.container}", 
concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
     void collectContainersStats() {
         dockerService.collectContainersStats();
     }
 
     @Scheduled(every = "{karavan.camel.status.pull-interval}", 
concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
     void collectCamelStatuses() {
+        LOGGER.info("Collect info statuses");
+        // collect Camel statuses
         camelService.collectCamelStatuses();
-    }
-
-    @Scheduled(every = "{karavan.camel.status.pull-interval}", 
concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
-    void cleanupDevModeStatuses() {
+        // clean DevMode statuses if container deleted
         camelService.cleanupDevModeStatuses();
     }
 
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/ConfigService.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/ConfigService.java
index c8efcdb8..233c035d 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/ConfigService.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/ConfigService.java
@@ -17,6 +17,8 @@
 package org.apache.camel.karavan.shared;
 
 import io.quarkus.runtime.StartupEvent;
+import io.quarkus.runtime.configuration.ConfigUtils;
+import io.quarkus.runtime.configuration.ProfileManager;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 
 import javax.enterprise.context.ApplicationScoped;
@@ -28,6 +30,7 @@ import java.util.Objects;
 public class ConfigService {
 
     public static final String DEVMODE_SUFFIX = "-devmode";
+    public static final String HEADLESS_MODE = "headless";
 
     @ConfigProperty(name = "karavan.version")
     String version;
@@ -64,4 +67,8 @@ public class ConfigService {
     public static boolean inKubernetes() {
         return Objects.nonNull(System.getenv("KUBERNETES_SERVICE_HOST"));
     }
+
+    public static boolean isHeadless() {
+        return ConfigUtils.isProfileActive(HEADLESS_MODE);
+    }
 }
\ No newline at end of file
diff --git 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/EventType.java
 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/EventType.java
index f2036913..08bc7fdb 100644
--- 
a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/EventType.java
+++ 
b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/shared/EventType.java
@@ -13,7 +13,7 @@ public class EventType {
 
     public static final String INFINISPAN_STARTED = "INFINISPAN_STARTED";
 
-    public static final String CONTAINER_STATS = "CONTAINER_STATS";
+    public static final String CONTAINER_STATISTICS = "CONTAINER_STATISTICS";
     public static final String DEVMODE_STATUS = "DEVMODE_STATUS";
 
 }
diff --git a/karavan-web/karavan-app/src/main/resources/application.properties 
b/karavan-web/karavan-app/src/main/resources/application.properties
index 0cb2e699..b0bfda46 100644
--- a/karavan-web/karavan-app/src/main/resources/application.properties
+++ b/karavan-web/karavan-app/src/main/resources/application.properties
@@ -3,11 +3,10 @@ karavan.environment=dev
 karavan.environments=dev,test,prod
 karavan.default-runtime=quarkus
 karavan.runtimes=quarkus,spring-boot
-karavan.camel.status.pull-interval=3s
-karavan.container.status.pull-interval=5s
-karavan.container.stats.container=5s
-quarkus.scheduler.enabled=true
-runner.image=ghcr.io/apache/camel-karavan-runner:3.21.1-snapshot
+karavan.camel.status.pull-interval=off
+karavan.container.statistics.container=3s
+karavan.devmode.image=ghcr.io/apache/camel-karavan-runner:3.21.1-snapshot
+karavan.headless.image=marat/karavan-headless:3.21.1-SNAPSHOT
 
 # Git repository Configuration
 karavan.git.repository=${GIT_REPOSITORY}
@@ -24,9 +23,6 @@ infinispan.password=karavan
 infinispan.hosts=localhost:11222
 
 quarkus.infinispan-client.devservices.enabled=false
-
-# Infinispan client intelligence
-# Use BASIC as a Docker for Mac workaround
 quarkus.infinispan-client.client-intelligence=BASIC
 
 # Public Dev
@@ -92,7 +88,6 @@ quarkus.log.level=INFO
 quarkus.banner.enabled=false
 quarkus.package.type=uber-jar
 quarkus.docker.dockerfile-jvm-path=src/main/docker/Dockerfile.distroless
-#quarkus.docker.dockerfile-jvm-path=src/main/docker/Dockerfile.legacy-jar
 quarkus.container-image.builder=docker
 
 quarkus.qute.strict-rendering=false
@@ -105,7 +100,7 @@ quarkus.kubernetes-client.connection-timeout=2000
 quarkus.kubernetes-client.request-timeout=10000
 quarkus.kubernetes-client.devservices.enabled=false
 
-quarkus.swagger-ui.always-include=true
+%dev.quarkus.swagger-ui.always-include=true
 
 quarkus.quinoa.frozen-lockfile=false
 quarkus.quinoa.package-manager-install=false
diff --git a/karavan-web/pom.xml b/karavan-web/pom.xml
index a16e9e97..54d6d283 100644
--- a/karavan-web/pom.xml
+++ b/karavan-web/pom.xml
@@ -5,7 +5,7 @@
     <modelVersion>4.0.0</modelVersion>
 
     <groupId>org.apache.camel.karavan</groupId>
-    <artifactId>karavan-cloud</artifactId>
+    <artifactId>karavan-web</artifactId>
     <version>3.21.1-SNAPSHOT</version>
     <packaging>pom</packaging>
 
@@ -43,12 +43,6 @@
         <quarkus.version>2.16.7.Final</quarkus.version>
     </properties>
 
-    <modules>
-        <module>karavan-cli</module>
-        <module>karavan-app</module>
-        <module>karavan-operator</module>
-    </modules>
-
     <dependencyManagement>
         <dependencies>
             <dependency>

Reply via email to