You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ma...@apache.org on 2023/08/10 20:35:07 UTC

[camel-karavan] branch main updated (0736930a -> 1d2d77cd)

This is an automated email from the ASF dual-hosted git repository.

marat pushed a change to branch main
in repository https://gitbox.apache.org/repos/asf/camel-karavan.git


    from 0736930a DevMode and Builder #855
     new 953941a5 fixed #796
     new 453c460c Implements #848
     new 1d2d77cd Implements in Kubernetes #839

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .github/workflows/docker-builder.yml               | 36 ----------
 karavan-web/docker/Dockerfile.builder              | 28 --------
 .../camel/karavan/kubernetes/PodEventHandler.java  | 22 +++++--
 .../apache/camel/karavan/service/CamelService.java | 14 +++-
 .../apache/camel/karavan/service/EventService.java |  2 +-
 .../apache/camel/karavan/service/GitService.java   | 18 ++---
 .../camel/karavan/service/ScheduledService.java    |  2 +-
 .../src/main/resources/application.properties      | 13 ++--
 .../camel-main-docker-application.properties       |  3 +
 .../camel-main-kubernetes-application.properties   | 14 +++-
 .../camel-main-openshift-application.properties    | 13 +++-
 .../src/main/webui/src/api/ProjectModels.ts        |  1 -
 .../src/main/webui/src/api/ProjectStore.ts         |  6 ++
 .../src/main/webui/src/dashboard/DashboardPage.tsx |  2 +-
 .../webui/src/designer/route/DslConnections.tsx    |  4 +-
 .../webui/src/designer/route/DslProperties.tsx     | 13 ++--
 .../main/webui/src/designer/route/DslSelector.tsx  |  3 +-
 .../src/main/webui/src/designer/utils/CamelUi.tsx  |  1 -
 .../src/main/webui/src/project/DevModeToolbar.tsx  | 30 +++++----
 .../src/main/webui/src/project/ProjectPage.tsx     | 12 +---
 .../src/main/webui/src/project/ProjectToolbar.tsx  | 16 ++---
 .../src/main/webui/src/project/file/FileEditor.tsx | 16 ++---
 .../webui/src/project/pipeline/ProjectStatus.tsx   |  4 +-
 .../src/main/webui/src/project/trace/TraceTab.tsx  |  1 -
 .../org/apache/camel/karavan/cli/CommandUtils.java | 68 +++++++++++++------
 .../org/apache/camel/karavan/cli/Constants.java    |  7 +-
 .../apache/camel/karavan/cli/KaravanCommand.java   |  9 +--
 .../karavan/cli/resources/KaravanDeployment.java   | 77 ++++++++++++----------
 .../camel-main-builder-script-kubernetes.sh}       | 12 ++--
 .../camel-main-builder-script-openshift.sh}        | 12 ++--
 .../karavan-cli/src/main/resources/infinispan.yaml | 65 ++----------------
 .../resources/quarkus-builder-script-kubernetes.sh |  2 +-
 .../resources/quarkus-builder-script-openshift.sh  |  2 +-
 .../spring-boot-builder-script-kubernetes.sh       |  2 +-
 .../spring-boot-builder-script-openshift.sh        |  2 +-
 35 files changed, 248 insertions(+), 284 deletions(-)
 delete mode 100644 .github/workflows/docker-builder.yml
 delete mode 100644 karavan-web/docker/Dockerfile.builder
 copy karavan-web/{karavan-operator/src/main/resources/spring-boot-builder-script-openshift.sh => karavan-cli/src/main/resources/camel-main-builder-script-kubernetes.sh} (66%)
 copy karavan-web/{karavan-operator/src/main/resources/spring-boot-builder-script-openshift.sh => karavan-cli/src/main/resources/camel-main-builder-script-openshift.sh} (67%)


[camel-karavan] 01/03: fixed #796

Posted by ma...@apache.org.
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 953941a5d5c224f8c4c9c7612661d43c31a39cc6
Author: Marat Gubaidullin <ma...@gmail.com>
AuthorDate: Thu Aug 10 16:31:26 2023 -0400

    fixed #796
---
 .github/workflows/docker-builder.yml  | 36 -----------------------------------
 karavan-web/docker/Dockerfile.builder | 28 ---------------------------
 2 files changed, 64 deletions(-)

diff --git a/.github/workflows/docker-builder.yml b/.github/workflows/docker-builder.yml
deleted file mode 100644
index 162d7364..00000000
--- a/.github/workflows/docker-builder.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-name: Builder container image
-
-on:
-  push:
-    branches: [ main ]
-    paths: ['karavan-web/docker/Dockerfile.builder']
-  workflow_dispatch:
-
-env:
-  REGISTRY: ghcr.io
-  IMAGE_NAME: ${{ github.repository }}-builder
-  TAG: 4.0.0-RC2
-
-jobs:
-  build:
-
-    runs-on: ubuntu-latest
-
-    steps:
-      - name: Checkout repository
-        uses: actions/checkout@v3
-
-      - name: Log in to the Container registry
-        uses: docker/login-action@v2
-        with:
-          registry: ${{ env.REGISTRY }}
-          username: ${{ github.actor }}
-          password: ${{ secrets.GITHUB_TOKEN }}
-
-      - name: Build and push Docker image
-        uses: docker/build-push-action@v3
-        with:
-          context: ./karavan-web/docker
-          file: karavan-web/docker/Dockerfile.builder
-          push: true
-          tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.TAG }}
diff --git a/karavan-web/docker/Dockerfile.builder b/karavan-web/docker/Dockerfile.builder
deleted file mode 100644
index 25992b73..00000000
--- a/karavan-web/docker/Dockerfile.builder
+++ /dev/null
@@ -1,28 +0,0 @@
-FROM maven:3.9.3-eclipse-temurin-17-alpine
-
-LABEL "org.opencontainers.image.title"="karavan"
-LABEL "org.opencontainers.image.description"="Apache Camel Karavan DevMode"
-LABEL "org.opencontainers.image.url"="https://camel.apache.org"
-LABEL "org.opencontainers.image.licenses"="Apache 2.0"
-LABEL "org.opencontainers.image.version"="4.0.0-RC2"
-
-ENV JBANG_VERSION=0.110.0
-ENV CAMEL_VERSION=4.0.0-RC2
-ENV KARAVAN="/karavan"
-ENV JBANG_REPO="$KARAVAN/.jbang/cache/.m2"
-ENV JBANG_DIR="$KARAVAN/.jbang"
-ENV MAVEN_SETTINGS="/karavan-config-map/maven-settings.xml"
-ENV KAMELETS_DIR="/scripts/kamelets"
-ENV CHECKOUT_DIR="/scripts"
-ENV CODE_DIR="/code"
-ENV PATH="${PATH}:$KARAVAN/.jbang/bin"
-
-RUN curl -Ls https://sh.jbang.dev | bash -s - app setup \
-    && apk update && apk add git \
-    && mkdir -p $CODE_DIR \
-    && jbang trust add  --quiet  https://github.com/apache/camel \
-    && jbang app install camel@apache/camel
-
-EXPOSE 8080
-
-ENTRYPOINT ["jbang"]
\ No newline at end of file


[camel-karavan] 03/03: Implements in Kubernetes #839

Posted by ma...@apache.org.
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 1d2d77cd1a8331fb617a84e9cbd435bca7529441
Author: Marat Gubaidullin <ma...@gmail.com>
AuthorDate: Thu Aug 10 16:33:33 2023 -0400

    Implements in Kubernetes #839
---
 .../camel/karavan/kubernetes/PodEventHandler.java  | 22 +++++++++++++---
 .../apache/camel/karavan/service/CamelService.java | 14 +++++++++-
 .../apache/camel/karavan/service/EventService.java |  2 +-
 .../apache/camel/karavan/service/GitService.java   | 18 ++++++-------
 .../camel/karavan/service/ScheduledService.java    |  2 +-
 .../camel-main-docker-application.properties       |  3 +++
 .../camel-main-kubernetes-application.properties   | 14 ++++++++--
 .../camel-main-openshift-application.properties    | 13 ++++++++--
 .../src/main/webui/src/api/ProjectModels.ts        |  1 -
 .../src/main/webui/src/api/ProjectStore.ts         |  6 +++++
 .../src/main/webui/src/dashboard/DashboardPage.tsx |  2 +-
 .../webui/src/designer/route/DslConnections.tsx    |  4 +--
 .../webui/src/designer/route/DslProperties.tsx     | 13 +++++++---
 .../main/webui/src/designer/route/DslSelector.tsx  |  3 ++-
 .../src/main/webui/src/designer/utils/CamelUi.tsx  |  1 -
 .../src/main/webui/src/project/DevModeToolbar.tsx  | 30 ++++++++++++----------
 .../src/main/webui/src/project/ProjectPage.tsx     | 12 ++-------
 .../src/main/webui/src/project/ProjectToolbar.tsx  | 16 +++++-------
 .../src/main/webui/src/project/file/FileEditor.tsx | 16 ++++--------
 .../webui/src/project/pipeline/ProjectStatus.tsx   |  4 +--
 .../src/main/webui/src/project/trace/TraceTab.tsx  |  1 -
 ....sh => camel-main-builder-script-kubernetes.sh} | 11 ++++----
 ...t.sh => camel-main-builder-script-openshift.sh} | 11 ++++----
 .../resources/quarkus-builder-script-kubernetes.sh |  2 +-
 .../resources/quarkus-builder-script-openshift.sh  |  2 +-
 .../spring-boot-builder-script-kubernetes.sh       |  2 +-
 .../spring-boot-builder-script-openshift.sh        |  2 +-
 27 files changed, 135 insertions(+), 92 deletions(-)

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 5d9417ac..3a684ef9 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
@@ -12,10 +12,14 @@ import org.apache.camel.karavan.infinispan.model.ContainerStatus;
 import org.jboss.logging.Logger;
 
 import java.util.List;
+import java.util.Map;
+import java.util.Objects;
 
 import static org.apache.camel.karavan.service.CodeService.DEFAULT_CONTAINER_RESOURCES;
 import static org.apache.camel.karavan.shared.Constants.LABEL_PROJECT_ID;
+import static org.apache.camel.karavan.shared.Constants.RELOAD_TRY_COUNT;
 import static org.apache.camel.karavan.shared.EventType.CONTAINER_STATUS;
+import static org.apache.camel.karavan.shared.EventType.DEVMODE_CONTAINER_READY;
 
 public class PodEventHandler implements ResourceEventHandler<Pod> {
 
@@ -47,9 +51,18 @@ public class PodEventHandler implements ResourceEventHandler<Pod> {
     public void onUpdate(Pod oldPod, Pod newPod) {
         try {
             LOGGER.info("onUpdate " + newPod.getMetadata().getName());
-            ContainerStatus ps = getPodStatus(newPod);
-            if (ps != null) {
-                eventBus.send(CONTAINER_STATUS, JsonObject.mapFrom(ps));
+            if (!newPod.isMarkedForDeletion() && newPod.getMetadata().getDeletionTimestamp() == null) {
+                ContainerStatus ps = getPodStatus(newPod);
+                if (ps != null) {
+                    eventBus.send(CONTAINER_STATUS, JsonObject.mapFrom(ps));
+                    if (Objects.equals(ps.getState(), ContainerStatus.State.running.name())) {
+                        Map<String, Object> message = Map.of(
+                                LABEL_PROJECT_ID, ps.getProjectId(),
+                                RELOAD_TRY_COUNT, 1
+                        );
+                        eventBus.publish(DEVMODE_CONTAINER_READY, JsonObject.mapFrom(message));
+                    }
+                }
             }
         } catch (Exception e){
             LOGGER.error(e.getMessage(), e.getCause());
@@ -63,6 +76,7 @@ public class PodEventHandler implements ResourceEventHandler<Pod> {
             String deployment = pod.getMetadata().getLabels().get("app");
             String projectId = deployment != null ? deployment : pod.getMetadata().getLabels().get(LABEL_PROJECT_ID);
             infinispanService.deleteContainerStatus(projectId, kubernetesService.environment, pod.getMetadata().getName());
+            infinispanService.deleteCamelStatuses(projectId, kubernetesService.environment);
         } catch (Exception e){
             LOGGER.error(e.getMessage(), e.getCause());
         }
@@ -93,7 +107,7 @@ public class PodEventHandler implements ResourceEventHandler<Pod> {
                     requestMemory + " / " + limitMemory,
                     requestCpu + " / " + limitCpu,
                     creationTimestamp);
-
+            status.setContainerId(pod.getMetadata().getName());
             if (ready) {
                 status.setState(ContainerStatus.State.running.name());
             } else {
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 d3f06f5d..e76fcb30 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
@@ -34,10 +34,14 @@ import org.jboss.logging.Logger;
 import jakarta.enterprise.context.ApplicationScoped;
 import jakarta.inject.Inject;
 import java.util.Arrays;
+import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.ExecutionException;
 
+import static org.apache.camel.karavan.shared.Constants.LABEL_PROJECT_ID;
+import static org.apache.camel.karavan.shared.Constants.RELOAD_TRY_COUNT;
 import static org.apache.camel.karavan.shared.EventType.CONTAINER_STATUS;
+import static org.apache.camel.karavan.shared.EventType.DEVMODE_CONTAINER_READY;
 
 @ApplicationScoped
 public class CamelService {
@@ -123,11 +127,19 @@ public class CamelService {
     @ConsumeEvent(value = CMD_COLLECT_CAMEL_STATUS, blocking = true, ordered = true)
     public void collectCamelStatuses(JsonObject data) {
         CamelStatusRequest dms = data.mapTo(CamelStatusRequest.class);
+        String projectId = dms.getProjectId();
+        if (infinispanService.getCamelStatus(projectId, environment, CamelStatus.Name.context.name()) == null) {
+            Map<String, Object> message = Map.of(
+                    LABEL_PROJECT_ID, projectId,
+                    RELOAD_TRY_COUNT, 1
+            );
+            eventBus.publish(DEVMODE_CONTAINER_READY, JsonObject.mapFrom(message));
+        }
         Arrays.stream(CamelStatus.Name.values()).forEach(statusName -> {
             String containerName = dms.getContainerName();
             String status = getCamelStatus(containerName, statusName);
             if (status != null) {
-                CamelStatus cs = new CamelStatus(dms.getProjectId(), containerName, statusName, status, environment);
+                CamelStatus cs = new CamelStatus(projectId, containerName, statusName, status, environment);
                 infinispanService.saveCamelStatus(cs);
             }
         });
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 26fabfb2..03da9dce 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
@@ -86,7 +86,7 @@ public class EventService {
         ContainerStatus status = infinispanService.getContainerStatus(projectId, environment, projectId);
         CamelStatus cs = infinispanService.getCamelStatus(projectId, environment, CamelStatus.Name.context.name());
         if (status != null
-                && !status.getCodeLoaded()
+                && !Objects.equals(status.getCodeLoaded(), Boolean.TRUE)
                 && status.getContainerId() != null
                 && status.getState().equals(ContainerStatus.State.running.name())
                 && camelIsStarted(cs)) {
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java
index d7d85a13..2ce35d23 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/GitService.java
@@ -132,21 +132,21 @@ public class GitService {
 
     public GitConfig getGitConfig() {
         String propertiesPrefix = "karavan.";
-        String branch = ConfigProvider.getConfig().getValue(propertiesPrefix + "git.branch", String.class);
+        String branch = ConfigProvider.getConfig().getValue(propertiesPrefix + "git-branch", String.class);
         if (ConfigService.inKubernetes()) {
             LOGGER.info("inKubernetes " + kubernetesService.getNamespace());
             Secret secret = kubernetesService.getKaravanSecret();
-            String uri = new String(Base64.getDecoder().decode(secret.getData().get("git.repository").getBytes(StandardCharsets.UTF_8)));
-            String username = new String(Base64.getDecoder().decode(secret.getData().get("git.username").getBytes(StandardCharsets.UTF_8)));
-            String password = new String(Base64.getDecoder().decode(secret.getData().get("git.password").getBytes(StandardCharsets.UTF_8)));
-            if (secret.getData().containsKey("git.branch")) {
-                branch = new String(Base64.getDecoder().decode(secret.getData().get("git.branch").getBytes(StandardCharsets.UTF_8)));
+            String uri = new String(Base64.getDecoder().decode(secret.getData().get("git-repository").getBytes(StandardCharsets.UTF_8)));
+            String username = new String(Base64.getDecoder().decode(secret.getData().get("git-username").getBytes(StandardCharsets.UTF_8)));
+            String password = new String(Base64.getDecoder().decode(secret.getData().get("git-password").getBytes(StandardCharsets.UTF_8)));
+            if (secret.getData().containsKey("git-branch")) {
+                branch = new String(Base64.getDecoder().decode(secret.getData().get("git-branch").getBytes(StandardCharsets.UTF_8)));
             }
             return new GitConfig(uri, username, password, branch);
         } else {
-            String uri = ConfigProvider.getConfig().getValue(propertiesPrefix + "git.repository", String.class);
-            String username = ConfigProvider.getConfig().getValue(propertiesPrefix + "git.username", String.class);
-            String password = ConfigProvider.getConfig().getValue(propertiesPrefix + "git.password", String.class);
+            String uri = ConfigProvider.getConfig().getValue(propertiesPrefix + "git-repository", String.class);
+            String username = ConfigProvider.getConfig().getValue(propertiesPrefix + "git-username", String.class);
+            String password = ConfigProvider.getConfig().getValue(propertiesPrefix + "git-password", String.class);
             return new GitConfig(uri, username, password, branch);
         }
     }
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 296f9fbe..10108b2d 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
@@ -92,7 +92,7 @@ public class ScheduledService {
         }
     }
 
-    @Scheduled(every = "{karavan.git.pull.interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
+    @Scheduled(every = "{karavan.git-pull-interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP)
     void pullCommitsFromGit() {
         projectService.pullCommits();
     }
diff --git a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-docker-application.properties b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-docker-application.properties
index c446e92d..acceb597 100644
--- a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-docker-application.properties
+++ b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-docker-application.properties
@@ -7,3 +7,6 @@ camel.jbang.version=4.0.0-RC2
 camel.jbang.dependencies=camel-console,camel-platform-http-main
 camel.health.enabled=true
 camel.health.exposure-level=full
+camel.server.enabled=true
+camel.server.healthCheckEnabled=true
+camel.server.devConsoleEnabled=true
diff --git a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-kubernetes-application.properties b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-kubernetes-application.properties
index 26fff7c6..6f6a9a91 100644
--- a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-kubernetes-application.properties
+++ b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-kubernetes-application.properties
@@ -7,8 +7,18 @@ camel.jbang.version=4.0.0-RC2
 camel.jbang.dependencies=camel-console,camel-platform-http-main
 camel.health.enabled=true
 camel.health.exposure-level=full
+camel.server.enabled=true
+camel.server.healthCheckEnabled=true
+camel.server.devConsoleEnabled=true
+label.runtime=app.kubernetes.io/runtime
+jib.from.image=gcr.io/distroless/java17@sha256:3a4ea21bd7b412b8b6ae61313b39337d8f03bb6844013810e8e4625d8c765edb
 jkube.version=1.13.1
-jkube.build.strategy=jib
+jkube.skip.build=true
+jkube.namespace=default
 jkube.imagePullPolicy=IfNotPresent
+jkube.enricher.jkube-controller.type=Deployment
 jkube.enricher.jkube-controller.replicaCount=1
-jkube.enricher.jkube-service.port=80
\ No newline at end of file
+jkube.enricher.jkube-service.port=80
+jkube.enricher.jkube-project-label.group=karavan
+jkube.enricher.jkube-project-label.provider=karavan
+jkube.recreate=true
\ No newline at end of file
diff --git a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-openshift-application.properties b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-openshift-application.properties
index 6997a260..6f6a9a91 100644
--- a/karavan-web/karavan-app/src/main/resources/snippets/camel-main-openshift-application.properties
+++ b/karavan-web/karavan-app/src/main/resources/snippets/camel-main-openshift-application.properties
@@ -7,9 +7,18 @@ camel.jbang.version=4.0.0-RC2
 camel.jbang.dependencies=camel-console,camel-platform-http-main
 camel.health.enabled=true
 camel.health.exposure-level=full
+camel.server.enabled=true
+camel.server.healthCheckEnabled=true
+camel.server.devConsoleEnabled=true
+label.runtime=app.kubernetes.io/runtime
+jib.from.image=gcr.io/distroless/java17@sha256:3a4ea21bd7b412b8b6ae61313b39337d8f03bb6844013810e8e4625d8c765edb
 jkube.version=1.13.1
-jkube.build.strategy=jib
+jkube.skip.build=true
+jkube.namespace=default
 jkube.imagePullPolicy=IfNotPresent
 jkube.enricher.jkube-controller.type=Deployment
 jkube.enricher.jkube-controller.replicaCount=1
-jkube.enricher.jkube-service.port=80
\ No newline at end of file
+jkube.enricher.jkube-service.port=80
+jkube.enricher.jkube-project-label.group=karavan
+jkube.enricher.jkube-project-label.provider=karavan
+jkube.recreate=true
\ No newline at end of file
diff --git a/karavan-web/karavan-app/src/main/webui/src/api/ProjectModels.ts b/karavan-web/karavan-app/src/main/webui/src/api/ProjectModels.ts
index 82a89413..0c8893b5 100644
--- a/karavan-web/karavan-app/src/main/webui/src/api/ProjectModels.ts
+++ b/karavan-web/karavan-app/src/main/webui/src/api/ProjectModels.ts
@@ -70,7 +70,6 @@ export class ServiceStatus {
 export class ContainerStatus {
     containerName: string = '';
     containerId: string = '';
-    lifeCycle: string = '';
     state: string = '';
     deployment: string = '';
     projectId: string = '';
diff --git a/karavan-web/karavan-app/src/main/webui/src/api/ProjectStore.ts b/karavan-web/karavan-app/src/main/webui/src/api/ProjectStore.ts
index deebf7ee..eba4c0c4 100644
--- a/karavan-web/karavan-app/src/main/webui/src/api/ProjectStore.ts
+++ b/karavan-web/karavan-app/src/main/webui/src/api/ProjectStore.ts
@@ -118,6 +118,8 @@ interface FileState {
     setEditAdvancedProperties: (editAdvancedProperties: boolean) => void;
     addProperty: string;
     setAddProperty: (addProperty: string) => void;
+    mode: "design" | "code",
+    setMode: (mode: "design" | "code") => void;
 }
 
 export const useFileStore = create<FileState>((set) => ({
@@ -125,6 +127,10 @@ export const useFileStore = create<FileState>((set) => ({
     operation: "none",
     editAdvancedProperties: false,
     addProperty: '',
+    mode: "design",
+    setMode: (mode: "design" | "code") => {
+        set(() => ({mode: mode}));
+    },
     setFile: (operation:  "create" | "select" | "delete"| "none" | "copy" | "upload", file?: ProjectFile) => {
         set((state: FileState) => ({
             file: file,
diff --git a/karavan-web/karavan-app/src/main/webui/src/dashboard/DashboardPage.tsx b/karavan-web/karavan-app/src/main/webui/src/dashboard/DashboardPage.tsx
index b338b3bc..30dad19e 100644
--- a/karavan-web/karavan-app/src/main/webui/src/dashboard/DashboardPage.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/dashboard/DashboardPage.tsx
@@ -325,7 +325,7 @@ export const DashboardPage = () => {
                                 <Badge className="badge">{container.type}</Badge>
                             </Td>
                             <Td style={{verticalAlign: "middle"}}>
-                                <Label color={container.lifeCycle === 'ready' ? "green" : 'grey'}>
+                                <Label color={container.state === 'running' ? "green" : 'grey'}>
                                     {container.containerName}
                                 </Label>
                             </Td>
diff --git a/karavan-web/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx b/karavan-web/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx
index 5280bc12..938042d4 100644
--- a/karavan-web/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx
@@ -126,7 +126,7 @@ export class DslConnections extends React.Component<Props, State> {
             const imageX = incomingX - r + 5;
             const imageY = fromY - r + 5;
             return (
-                <div style={{display: "block", position: "absolute", top: imageY, left: imageX}}>
+                <div key={pos.step.uuid + "-icon"} style={{display: "block", position: "absolute", top: imageY, left: imageX}}>
                     {CamelUi.getConnectionIcon(pos.step)}
                 </div>
             )
@@ -212,7 +212,7 @@ export class DslConnections extends React.Component<Props, State> {
             const imageX = outgoingX - r + 5;
             const imageY = outgoingY - r + 5;
             return (
-                <div style={{display: "block", position: "absolute", top: imageY, left: imageX}}>
+                <div key={pos.step.uuid + "-icon"} style={{display: "block", position: "absolute", top: imageY, left: imageX}}>
                     {CamelUi.getConnectionIcon(pos.step)}
                 </div>
             )
diff --git a/karavan-web/karavan-app/src/main/webui/src/designer/route/DslProperties.tsx b/karavan-web/karavan-app/src/main/webui/src/designer/route/DslProperties.tsx
index 435480de..f10a0eec 100644
--- a/karavan-web/karavan-app/src/main/webui/src/designer/route/DslProperties.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/designer/route/DslProperties.tsx
@@ -33,7 +33,7 @@ import {Integration, CamelElement} from "karavan-core/lib/model/IntegrationDefin
 import {CamelDefinitionApiExt} from "karavan-core/lib/api/CamelDefinitionApiExt";
 import {CamelUtil} from "karavan-core/lib/api/CamelUtil";
 import {CamelUi, RouteToCreate} from "../utils/CamelUi";
-import {CamelMetadataApi, PropertyMeta} from "karavan-core/lib/model/CamelMetadata";
+import {CamelMetadataApi, DataFormats, PropertyMeta} from "karavan-core/lib/model/CamelMetadata";
 import {IntegrationHeader} from "../utils/KaravanComponents";
 import CloneIcon from "@patternfly/react-icons/dist/esm/icons/clone-icon";
 
@@ -170,7 +170,7 @@ export class DslProperties extends React.Component<Props, State> {
 
     getPropertyFields = (properties: PropertyMeta[]) => {
         return (<>
-            {this.state.step && !['MarshalDefinition', 'UnmarshalDefinition'].includes(this.state.step.dslName) && properties.map((property: PropertyMeta) =>
+            {properties.map((property: PropertyMeta) =>
                 <DslPropertyField key={property.name}
                                   integration={this.props.integration}
                                   property={property}
@@ -186,7 +186,11 @@ export class DslProperties extends React.Component<Props, State> {
     }
 
     render() {
-        const properties = this.getProperties();
+        const dataFormats = DataFormats.map(value => value[0]);
+        const dataFormatElement = this.state.step !== undefined && ['MarshalDefinition', 'UnmarshalDefinition'].includes(this.state.step.dslName);
+        const properties = !dataFormatElement
+                    ? this.getProperties()
+                    : this.getProperties().filter(p => !dataFormats.includes(p.name));
         const propertiesMain = properties.filter(p => !p.label.includes("advanced"));
         const propertiesAdvanced = properties.filter(p => p.label.includes("advanced"));
         return (
@@ -196,7 +200,8 @@ export class DslProperties extends React.Component<Props, State> {
                     {this.state.step === undefined && <IntegrationHeader integration={this.props.integration}/>}
                     {this.state.step && this.getComponentHeader()}
                     {this.getPropertyFields(propertiesMain)}
-                    {propertiesAdvanced.length > 0 &&
+                    {this.state.step && !['MarshalDefinition', 'UnmarshalDefinition'].includes(this.state.step.dslName)
+                        && propertiesAdvanced.length > 0 &&
                         <ExpandableSection
                             toggleText={'Advanced properties'}
                             onToggle={isExpanded => this.setState({isShowAdvanced: !this.state.isShowAdvanced})}
diff --git a/karavan-web/karavan-app/src/main/webui/src/designer/route/DslSelector.tsx b/karavan-web/karavan-app/src/main/webui/src/designer/route/DslSelector.tsx
index 3baca8d8..eb66e7ec 100644
--- a/karavan-web/karavan-app/src/main/webui/src/designer/route/DslSelector.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/designer/route/DslSelector.tsx
@@ -99,7 +99,7 @@ export class DslSelector extends React.Component<Props, State> {
                 </CardBody>
                 <CardFooter className="footer-labels">
                     <div style={{display: "flex", flexDirection: "row", justifyContent: "start"}}>
-                        {labels.map(label => <Badge isRead className="labels">{label}</Badge>)}
+                        {labels.map(label => <Badge key={label} isRead className="labels">{label}</Badge>)}
                     </div>
 
                 </CardFooter>
@@ -179,6 +179,7 @@ export class DslSelector extends React.Component<Props, State> {
                 <PageSection variant={this.props.dark ? "darker" : "light"}>
                     {isEip && <ToggleGroup aria-label="Labels" isCompact>
                         {eipLabels.map(eipLabel => <ToggleGroupItem
+                            key={eipLabel}
                             text={eipLabel}
                             buttonId={eipLabel}
                             isSelected={this.state.selectedLabels.includes(eipLabel)}
diff --git a/karavan-web/karavan-app/src/main/webui/src/designer/utils/CamelUi.tsx b/karavan-web/karavan-app/src/main/webui/src/designer/utils/CamelUi.tsx
index a94ed0ac..8d4157c4 100644
--- a/karavan-web/karavan-app/src/main/webui/src/designer/utils/CamelUi.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/designer/utils/CamelUi.tsx
@@ -88,7 +88,6 @@ import {
     WorkflowIcon
 } from "./KaravanIcons";
 import React from "react";
-import {Icon} from "@patternfly/react-core";
 
 const StepElements: string[] = [
     "AggregateDefinition",
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx b/karavan-web/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx
index 9401aeb0..e8462d90 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx
@@ -4,22 +4,22 @@ import '../designer/karavan.css';
 import RocketIcon from "@patternfly/react-icons/dist/esm/icons/rocket-icon";
 import ReloadIcon from "@patternfly/react-icons/dist/esm/icons/bolt-icon";
 import DeleteIcon from "@patternfly/react-icons/dist/esm/icons/trash-icon";
-import {useDevModeStore, useLogStore, useProjectStore, useStatusesStore} from "../api/ProjectStore";
+import {useAppConfigStore, useDevModeStore, useLogStore, useProjectStore, useStatusesStore} from "../api/ProjectStore";
 import {ProjectService} from "../api/ProjectService";
 import {shallow} from "zustand/shallow";
 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 StopIcon from "@patternfly/react-icons/dist/js/icons/stop-icon";
 
-
 interface Props {
     reloadOnly?: boolean
 }
 
 export const DevModeToolbar = (props: Props) => {
 
+    const [config] = useAppConfigStore((state) => [state.config], shallow)
     const [status] = useDevModeStore((state) => [state.status], shallow)
-    const [project ] = useProjectStore((state) => [state.project], shallow)
+    const [project] = useProjectStore((state) => [state.project], shallow)
     const [containers] = useStatusesStore((state) => [state.containers], shallow);
     const [verbose, setVerbose] = useState(false);
 
@@ -27,7 +27,7 @@ export const DevModeToolbar = (props: Props) => {
     const commands = containerStatus?.commands || ['run'];
     const isRunning = containerStatus?.state === 'running';
     const inTransit = containerStatus?.inTransit;
-    const isLoading= status === 'wip';
+    const isLoading = status === 'wip';
     const color = containerStatus?.state === 'running' ? "green" : "grey";
     const icon = isRunning ? <UpIcon/> : <DownIcon/>;
     return (<Flex className="toolbar" direction={{default: "row"}} alignItems={{default: "alignItemsCenter"}}>
@@ -76,16 +76,18 @@ export const DevModeToolbar = (props: Props) => {
                 </Button>
             </Tooltip>
         </FlexItem>}
-        <FlexItem>
-            <Tooltip content="Stop container" position={TooltipPosition.bottom}>
-                <Button isSmall
-                        isDisabled={!commands.includes('stop') || inTransit}
-                        variant={"control"}
-                        icon={<StopIcon/>}
-                        onClick={() => ProjectService.stopDevModeContainer(project)}>
-                </Button>
-            </Tooltip>
-        </FlexItem>
+        {config.infrastructure !== 'kubernetes' &&
+            <FlexItem>
+                <Tooltip content="Stop container" position={TooltipPosition.bottom}>
+                    <Button isSmall
+                            isDisabled={!commands.includes('stop') || inTransit}
+                            variant={"control"}
+                            icon={<StopIcon/>}
+                            onClick={() => ProjectService.stopDevModeContainer(project)}>
+                    </Button>
+                </Tooltip>
+            </FlexItem>
+        }
         <FlexItem>
             <Tooltip content="Delete container" position={TooltipPosition.bottom}>
                 <Button isSmall
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/ProjectPage.tsx b/karavan-web/karavan-app/src/main/webui/src/project/ProjectPage.tsx
index 976123ef..a71af8cd 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/ProjectPage.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/project/ProjectPage.tsx
@@ -1,4 +1,4 @@
-import React, {useEffect, useState} from 'react';
+import React, {useState} from 'react';
 import {
     PageSection,
 } from '@patternfly/react-core';
@@ -64,14 +64,6 @@ export const ProjectPage = () => {
         }
     }
 
-
-    function tools () {
-        return <ProjectToolbar
-                               mode={mode}
-                               setMode={mode => setMode(mode)}
-        />
-    }
-
     function isBuildIn(): boolean {
         return ['kamelets', 'templates'].includes(project.projectId);
     }
@@ -87,7 +79,7 @@ export const ProjectPage = () => {
     return (
         <PageSection key={key} className="kamelet-section project-page" padding={{default: 'noPadding'}}>
             <PageSection className="tools-section" padding={{default: 'noPadding'}}>
-                <MainToolbar title={<ProjectTitle/>} tools={tools()}/>
+                <MainToolbar title={<ProjectTitle/>} tools={<ProjectToolbar/>}/>
             </PageSection>
             {showFilePanel && <FileEditor/>}
             {!showFilePanel && <ProjectPanel/>}
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx b/karavan-web/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx
index daed745b..748a1594 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx
@@ -22,16 +22,13 @@ import {shallow} from "zustand/shallow";
 import {ProjectModelApi} from "karavan-core/lib/api/ProjectModelApi";
 import {ProjectModel, ProjectProperty} from "karavan-core/lib/model/ProjectModel";
 
-interface Props {
-    mode: "design" | "code",
-    setMode: (mode: "design" | "code") => void,
-}
 
-export const ProjectToolbar = (props: Props) => {
+export const ProjectToolbar = () => {
 
     const [project, isPushing] = useProjectStore((state) => [state.project, state.isPushing], shallow )
-    const [file, editAdvancedProperties, setEditAdvancedProperties, setAddProperty] = useFileStore((state) =>
-        [state.file, state.editAdvancedProperties, state.setEditAdvancedProperties, state.setAddProperty], shallow )
+    const [file, editAdvancedProperties, setEditAdvancedProperties, setAddProperty, mode, setMode]
+        = useFileStore((state) =>
+        [state.file, state.editAdvancedProperties, state.setEditAdvancedProperties, state.setAddProperty, state.mode, state.setMode], shallow )
 
     useEffect(() => {
     }, [project, file]);
@@ -72,7 +69,6 @@ export const ProjectToolbar = (props: Props) => {
     }
 
     function getFileToolbar() {
-        const { mode} = props;
         return <Toolbar id="toolbar-group-types">
             <ToolbarContent>
                 <Flex className="toolbar" direction={{default: "row"}} alignItems={{default: "alignItemsCenter"}}>
@@ -80,9 +76,9 @@ export const ProjectToolbar = (props: Props) => {
                     {isYaml() && <FlexItem>
                         <ToggleGroup>
                             <ToggleGroupItem text="Design" buttonId="design" isSelected={mode === "design"}
-                                             onChange={s => props.setMode("design")}/>
+                                             onChange={s => setMode("design")}/>
                             <ToggleGroupItem text="Code" buttonId="code" isSelected={mode === "code"}
-                                             onChange={s => props.setMode("code")}/>
+                                             onChange={s => setMode("code")}/>
                         </ToggleGroup>
                     </FlexItem>}
 
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/file/FileEditor.tsx b/karavan-web/karavan-app/src/main/webui/src/project/file/FileEditor.tsx
index fce383d6..0f2fe9e2 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/file/FileEditor.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/project/file/FileEditor.tsx
@@ -14,28 +14,22 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import React, {useState} from 'react';
-import {
-    CodeBlockCode,
-    CodeBlock, Skeleton
-} from '@patternfly/react-core';
+import React from 'react';
 import '../../designer/karavan.css';
 import Editor from "@monaco-editor/react";
 import {CamelDefinitionYaml} from "karavan-core/lib/api/CamelDefinitionYaml";
 import {ProjectFile, ProjectFileTypes} from "../../api/ProjectModels";
-import {useAppConfigStore, useFilesStore, useFileStore, useProjectStore} from "../../api/ProjectStore";
+import {useFilesStore, useFileStore, useProjectStore} from "../../api/ProjectStore";
 import {KaravanDesigner} from "../../designer/KaravanDesigner";
 import {ProjectService} from "../../api/ProjectService";
 import {PropertiesTable} from "./PropertiesTable";
+import {shallow} from "zustand/shallow";
 
 export const FileEditor = () => {
 
-    const [editAdvancedProperties] = useState<boolean>(false);
-    const {file, operation} = useFileStore();
-    const [mode, setMode] = useState<"design" | "code">("design");
-    const [key, setKey] = useState<string>('');
+    const [file, operation, mode] = useFileStore((state) =>
+        [state.file, state.operation, state.mode, state.setMode], shallow )
     const {project} = useProjectStore();
-    const {config} = useAppConfigStore();
 
     function save (name: string, code: string) {
         if (file) {
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/pipeline/ProjectStatus.tsx b/karavan-web/karavan-app/src/main/webui/src/project/pipeline/ProjectStatus.tsx
index ba26da23..b59ac766 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/pipeline/ProjectStatus.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/project/pipeline/ProjectStatus.tsx
@@ -198,9 +198,9 @@ export class ProjectStatus extends React.Component<Props, State> {
                     {podStatuses.length === 0 && <Label icon={<DownIcon/>} color={"grey"}>No pods</Label>}
                     <LabelGroup numLabels={2} isVertical>
                         {podStatuses.map(pod => {
-                                const ready = pod.lifeCycle === 'ready';
+                                const ready = pod.state === 'running';
                                 return (
-                                    <Tooltip key={pod.containerName} content={pod.lifeCycle}>
+                                    <Tooltip key={pod.containerName} content={pod.state}>
                                         <Label icon={ready ? <UpIcon/> : <DownIcon/>} color={ready ? "green" : "red"}>
                                             <Button variant="link"
                                                     onClick={e => {
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/trace/TraceTab.tsx b/karavan-web/karavan-app/src/main/webui/src/project/trace/TraceTab.tsx
index 7363832a..f10bf0ab 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/trace/TraceTab.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/project/trace/TraceTab.tsx
@@ -57,7 +57,6 @@ export const TraceTab = () => {
         if (refreshTrace) {
             KaravanApi.getDevModeStatus(projectId, "trace", res => {
                 if (res.status === 200) {
-                    console.log(JSON.parse(res.data.status))
                     setTrace(JSON.parse(res.data.status));
                 } else {
                     setTrace({});
diff --git a/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh b/karavan-web/karavan-cli/src/main/resources/camel-main-builder-script-kubernetes.sh
similarity index 63%
copy from karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh
copy to karavan-web/karavan-cli/src/main/resources/camel-main-builder-script-kubernetes.sh
index 8b81f918..fb3a074f 100644
--- a/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh
+++ b/karavan-web/karavan-cli/src/main/resources/camel-main-builder-script-kubernetes.sh
@@ -14,16 +14,17 @@ fi
 
 cd ${CHECKOUT_DIR}/$(inputs.params.project)
 
-entrypoint -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR}
+jbang -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR}
 
 export LAST_COMMIT=$(git rev-parse --short HEAD)
 export DATE=$(date '+%Y%m%d%H%M%S')
 export TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
 export NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)
 
-mvn package package oc:build oc:push oc:resource oc:apply \
-  -Popenshift \
+mvn package jib:build k8s:resource k8s:apply \
   -Djkube.namespace=${NAMESPACE} \
-  -Djkube.docker.push.registry=${IMAGE_REGISTRY} \
-  -Djkube.generator.name=${IMAGE_REGISTRY}/${NAMESPACE}/$(inputs.params.project):${DATE} \
+  -Djib.allowInsecureRegistries=true \
+  -Djib.to.image=${IMAGE_REGISTRY}/${IMAGE_GROUP}/$(inputs.params.project):${DATE} \
+  -Djib.to.auth.username=${IMAGE_REGISTRY_USERNAME} \
+  -Djib.to.auth.password=${IMAGE_REGISTRY_PASSWORD}  \
   --settings=$MAVEN_SETTINGS
\ No newline at end of file
diff --git a/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh b/karavan-web/karavan-cli/src/main/resources/camel-main-builder-script-openshift.sh
similarity index 63%
copy from karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh
copy to karavan-web/karavan-cli/src/main/resources/camel-main-builder-script-openshift.sh
index 8b81f918..ebad0494 100644
--- a/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh
+++ b/karavan-web/karavan-cli/src/main/resources/camel-main-builder-script-openshift.sh
@@ -14,16 +14,17 @@ fi
 
 cd ${CHECKOUT_DIR}/$(inputs.params.project)
 
-entrypoint -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR}
+jbang -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR}
 
 export LAST_COMMIT=$(git rev-parse --short HEAD)
 export DATE=$(date '+%Y%m%d%H%M%S')
 export TOKEN=$(cat /var/run/secrets/kubernetes.io/serviceaccount/token)
 export NAMESPACE=$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace)
 
-mvn package package oc:build oc:push oc:resource oc:apply \
-  -Popenshift \
+mvn package jib:build oc:resource oc:apply \
   -Djkube.namespace=${NAMESPACE} \
-  -Djkube.docker.push.registry=${IMAGE_REGISTRY} \
-  -Djkube.generator.name=${IMAGE_REGISTRY}/${NAMESPACE}/$(inputs.params.project):${DATE} \
+  -Djib.allowInsecureRegistries=true \
+  -Djib.to.image=${IMAGE_REGISTRY}/${IMAGE_GROUP}/$(inputs.params.project):${DATE} \
+  -Djib.to.auth.username=${IMAGE_REGISTRY_USERNAME} \
+  -Djib.to.auth.password=${IMAGE_REGISTRY_PASSWORD}  \
   --settings=$MAVEN_SETTINGS
\ No newline at end of file
diff --git a/karavan-web/karavan-cli/src/main/resources/quarkus-builder-script-kubernetes.sh b/karavan-web/karavan-cli/src/main/resources/quarkus-builder-script-kubernetes.sh
index bcbd3630..b62a8981 100644
--- a/karavan-web/karavan-cli/src/main/resources/quarkus-builder-script-kubernetes.sh
+++ b/karavan-web/karavan-cli/src/main/resources/quarkus-builder-script-kubernetes.sh
@@ -14,7 +14,7 @@ fi
 
 cd ${CHECKOUT_DIR}/$(inputs.params.project)
 
-entrypoint -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR}
+jbang -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR}
 
 export LAST_COMMIT=$(git rev-parse --short HEAD)
 export DATE=$(date '+%Y%m%d%H%M%S')
diff --git a/karavan-web/karavan-cli/src/main/resources/quarkus-builder-script-openshift.sh b/karavan-web/karavan-cli/src/main/resources/quarkus-builder-script-openshift.sh
index 8cfc517c..17669aae 100644
--- a/karavan-web/karavan-cli/src/main/resources/quarkus-builder-script-openshift.sh
+++ b/karavan-web/karavan-cli/src/main/resources/quarkus-builder-script-openshift.sh
@@ -14,7 +14,7 @@ fi
 
 cd ${CHECKOUT_DIR}/$(inputs.params.project)
 
-entrypoint -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR}
+jbang -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR}
 
 export LAST_COMMIT=$(git rev-parse --short HEAD)
 export DATE=$(date '+%Y%m%d%H%M%S')
diff --git a/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-kubernetes.sh b/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-kubernetes.sh
index 2e175498..51f4ccc4 100644
--- a/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-kubernetes.sh
+++ b/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-kubernetes.sh
@@ -14,7 +14,7 @@ fi
 
 cd ${CHECKOUT_DIR}/$(inputs.params.project)
 
-entrypoint -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR}
+jbang -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR}
 
 export LAST_COMMIT=$(git rev-parse --short HEAD)
 export DATE=$(date '+%Y%m%d%H%M%S')
diff --git a/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh b/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh
index 8b81f918..236abc22 100644
--- a/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh
+++ b/karavan-web/karavan-cli/src/main/resources/spring-boot-builder-script-openshift.sh
@@ -14,7 +14,7 @@ fi
 
 cd ${CHECKOUT_DIR}/$(inputs.params.project)
 
-entrypoint -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR}
+jbang -Dcamel.jbang.version=$CAMEL_VERSION camel@apache/camel export --local-kamelet-dir=${KAMELETS_DIR}
 
 export LAST_COMMIT=$(git rev-parse --short HEAD)
 export DATE=$(date '+%Y%m%d%H%M%S')


[camel-karavan] 02/03: Implements #848

Posted by ma...@apache.org.
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 453c460c05b71388944fc0110e7635b9cb46c0ba
Author: Marat Gubaidullin <ma...@gmail.com>
AuthorDate: Thu Aug 10 16:32:58 2023 -0400

    Implements #848
---
 .../src/main/resources/application.properties      | 13 ++--
 .../org/apache/camel/karavan/cli/CommandUtils.java | 68 +++++++++++++------
 .../org/apache/camel/karavan/cli/Constants.java    |  7 +-
 .../apache/camel/karavan/cli/KaravanCommand.java   |  9 +--
 .../karavan/cli/resources/KaravanDeployment.java   | 77 ++++++++++++----------
 .../karavan-cli/src/main/resources/infinispan.yaml | 65 ++----------------
 6 files changed, 111 insertions(+), 128 deletions(-)

diff --git a/karavan-web/karavan-app/src/main/resources/application.properties b/karavan-web/karavan-app/src/main/resources/application.properties
index 002a0682..7b921f94 100644
--- a/karavan-web/karavan-app/src/main/resources/application.properties
+++ b/karavan-web/karavan-app/src/main/resources/application.properties
@@ -6,19 +6,20 @@ karavan.runtimes=camel-main,quarkus,spring-boot
 karavan.camel.status.interval=off
 karavan.container.status.interval=3s
 karavan.container.infinispan.interval=5s
-karavan.devmode.image=ghcr.io/apache/camel-karavan-runner:4.0.0-RC2
+karavan.devmode.image=ghcr.io/apache/camel-karavan-devmode:4.0.0-RC2
 karavan.headless.image=entropy1/karavan-headless:4.0.0-RC2
 
 # Git repository Configuration
-karavan.git.repository=${GIT_REPOSITORY}
-karavan.git.username=${GIT_USERNAME}
-karavan.git.password=${GIT_TOKEN}
-karavan.git.branch=main
-karavan.git.pull.interval=disabled
+karavan.git-repository=${GIT_REPOSITORY}
+karavan.git-username=${GIT_USERNAME}
+karavan.git-password=${GIT_TOKEN}
+karavan.git-branch=main
+karavan.git-pull-interval=disabled
 
 # Infinispan container config in Docker
 infinispan.image=quay.io/infinispan/server:14.0.6.Final
 infinispan.port=11222:11222
+# Infinispan connection config
 infinispan.username=admin
 infinispan.password=karavan
 infinispan.hosts=localhost:11222
diff --git a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/CommandUtils.java b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/CommandUtils.java
index 4b170f69..4c770ac4 100644
--- a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/CommandUtils.java
+++ b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/CommandUtils.java
@@ -29,6 +29,7 @@ import io.fabric8.tekton.pipeline.v1beta1.Task;
 import org.apache.camel.karavan.cli.resources.*;
 
 import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.util.Arrays;
@@ -48,7 +49,7 @@ public class CommandUtils {
                 System.out.println("⭕ Installing Karavan to OpenShift");
                 config.setOpenShift(true);
             } else {
-                System.out.println("\u2388 Installing Karavan to Kubernetes");
+                System.out.println("⭕ Installing Karavan to Kubernetes");
                 config.setOpenShift(false);
             }
             install(config, client);
@@ -58,7 +59,7 @@ public class CommandUtils {
     private static void install(KaravanCommand config, KubernetesClient client) {
         // Check and install Tekton
         if (!isTektonInstalled(client)) {
-            log("Tekton is not installed");
+            logError("Tekton is not installed");
             if (isOpenShift(client)) {
                 logPoint("Please install Tekton Operator first");
                 System.exit(0);
@@ -79,14 +80,13 @@ public class CommandUtils {
 
         // Check and install Infinispan
         if (!isInfinispanInstalled(client)) {
-            log("Infinispan is not installed");
+            logError("Infinispan is not installed");
             if (isOpenShift(client)) {
                 logPoint("Please install Infinispan first");
                 System.exit(0);
             }
             installInfinispan(config, client);
         }
-        log("Infinispan is installed");
 
         // Check secrets
         if (!checkKaravanSecrets(config, client)) {
@@ -137,9 +137,9 @@ public class CommandUtils {
         }
         log("Karavan is installed");
         System.out.print("\uD83D\uDC2B Karavan is starting ");
-        while (!checkReady(config, client)) {
+        while (!checkKaravanReady(config, client)) {
             try {
-                Thread.sleep(1000);
+                Thread.sleep(2000);
             } catch (Exception e) {
 
             }
@@ -162,7 +162,12 @@ public class CommandUtils {
                     config.setImageRegistry(Constants.DEFAULT_IMAGE_REGISTRY_OPENSHIFT);
                 } else {
                     Service registryService = client.services().inNamespace("kube-system").withName("registry").get();
-                    config.setImageRegistry(registryService.getSpec().getClusterIP());
+                    if (registryService != null) {
+                        config.setImageRegistry(registryService.getSpec().getClusterIP());
+                    } else {
+                        logError("Set Image Registry parameters");
+                        System.exit(0);
+                    }
                 }
             }
             if ((config.isAuthOidc() && config.oidcConfigured())
@@ -177,7 +182,7 @@ public class CommandUtils {
         return false;
     }
 
-    public static boolean checkReady(KaravanCommand config, KubernetesClient client) {
+    public static boolean checkKaravanReady(KaravanCommand config, KubernetesClient client) {
         Deployment deployment = client.apps().deployments().inNamespace(config.getNamespace()).withName(Constants.NAME).get();
         Integer replicas = deployment.getStatus().getReplicas();
         Integer ready = deployment.getStatus().getReadyReplicas();
@@ -190,6 +195,16 @@ public class CommandUtils {
                 && condition.isPresent();
     }
 
+    public static boolean checkInfinispanReady(KaravanCommand config, KubernetesClient client) {
+        StatefulSet statefulSet = client.apps().statefulSets().inNamespace(config.getNamespace()).withName(Constants.INFINISPAN_NAME).get();
+        Integer replicas = statefulSet.getStatus().getReplicas();
+        Integer ready = statefulSet.getStatus().getReadyReplicas();
+        Integer available = statefulSet.getStatus().getAvailableReplicas();
+        return statefulSet.getStatus() != null
+                && Objects.equals(replicas, ready)
+                && Objects.equals(replicas, available);
+    }
+
     private static <T extends HasMetadata> void createOrReplace(T is, KubernetesClient client) {
         try {
             T result = client.resource(is).createOrReplace();
@@ -200,27 +215,38 @@ public class CommandUtils {
     }
 
     private static void installInfinispan(KaravanCommand config, KubernetesClient client) {
-        System.out.print("⏳ Installing Infinispan");
+        System.out.print("⏳ Installing Infinispan ");
         String yaml = getResourceFile("/infinispan.yaml");
-//
-//        client.load(CommandUtils.class.getResourceAsStream("/pipelines.yaml")).create().forEach(hasMetadata -> {
-//            System.out.print(".");
-//        });
-//        client.load(CommandUtils.class.getResourceAsStream("/dashboard.yaml")).create().forEach(hasMetadata -> {
-//            System.out.print(".");
-//        });
-        System.out.println(yaml);
-        System.exit(0);
+        String resource = yaml
+                .replace("$INFINISPAN_PASSWORD", config.getInfinispanPassword())
+                .replace("$INFINISPAN_IMAGE", config.getInfinispanImage());
+
+        client.load(new ByteArrayInputStream(resource.getBytes())).inNamespace(config.getNamespace())
+                .create().forEach(hasMetadata -> System.out.print("\uD83D\uDC2B "));
+        System.out.println();
         log("Infinispan is installed");
+        System.out.print("⏳ Infinispan is starting ");
+        while (!checkInfinispanReady(config, client)) {
+            try {
+                Thread.sleep(2000);
+            } catch (Exception e) {
+
+            }
+            System.out.print("\uD83D\uDC2B ");
+        }
+        System.out.println();
+        log("Infinispan is started");
     }
 
     private static void installTekton(KaravanCommand config, KubernetesClient client) {
-        System.out.print("⏳ Installing Tekton");
+        System.out.print("⏳ Installing Tekton ");
         client.load(CommandUtils.class.getResourceAsStream("/pipelines.yaml")).create().forEach(hasMetadata -> {
-            System.out.print(".");
+            System.out.print("\uD83D\uDC2B ");
         });
+        System.out.println();
+        System.out.print("⏳ Installing Tekton Dashboard ");
         client.load(CommandUtils.class.getResourceAsStream("/dashboard.yaml")).create().forEach(hasMetadata -> {
-            System.out.print(".");
+            System.out.print("\uD83D\uDC2B ");
         });
         System.out.println();
         log("Tekton is installed");
diff --git a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/Constants.java b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/Constants.java
index 53558b88..eef4be08 100644
--- a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/Constants.java
+++ b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/Constants.java
@@ -19,14 +19,14 @@ package org.apache.camel.karavan.cli;
 public final class Constants {
     public static final String DEFAULT_NAMESPACE = "karavan";
     public static final String DEFAULT_ENVIRONMENT = "dev";
-    public static final String DEFAULT_RUNTIMES = "quarkus,spring-boot";
+    public static final String DEFAULT_RUNTIMES = "camel-main,quarkus,spring-boot";
     public static final String DEFAULT_AUTH = "public";
     public static final String DEFAULT_GIT_PULL_INTERVAL = "off";
     public static final String DEFAULT_IMAGE_REGISTRY_OPENSHIFT = "image-registry.openshift-image-registry.svc:5000";
     public static final String DEFAULT_IMAGE_REGISTRY_MINIKUBE = "registry.kube-system.svc.cluster.local";
     public static final int DEFAULT_NODE_PORT = 0;
     public static final int DEFAULT_INSTANCES = 1;
-    public static final String DEFAULT_BUILD_IMAGE = "ghcr.io/apache/camel-karavan-builder";
+    public static final String DEFAULT_BUILD_IMAGE = "ghcr.io/apache/camel-karavan-devmode";
 
     public static final String KARAVAN_IMAGE = "ghcr.io/apache/camel-karavan";
 
@@ -49,6 +49,9 @@ public final class Constants {
     public static final String PVC_M2_CACHE = "karavan-m2-cache";
     public static final String PVC_JBANG_CACHE = "karavan-jbang-cache";
 
+    public static final String INFINISPAN_NAME = "infinispan";
+    public static final String INFINISPAN_SECRET_NAME = "infinispan-secret";
+
     public static final String PIPELINE_DEV = "karavan-pipeline-dev-";
     public static final String TASK_DEV = "karavan-task-dev-";
 
diff --git a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanCommand.java b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanCommand.java
index 82d0e3ec..b1ed1399 100644
--- a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanCommand.java
+++ b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanCommand.java
@@ -4,6 +4,7 @@ import picocli.CommandLine;
 
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
 import java.util.concurrent.Callable;
@@ -19,7 +20,7 @@ public class KaravanCommand implements Callable<Integer> {
     private String namespace;
     @CommandLine.Option(names = {"-e", "--environment"}, description = "Environment", defaultValue = Constants.DEFAULT_ENVIRONMENT)
     private String environment;
-    @CommandLine.Option(names = {"-r", "--runtimes"}, description = "Runtimes: quarkus, spring-boot", defaultValue = Constants.DEFAULT_RUNTIMES)
+    @CommandLine.Option(names = {"-r", "--runtimes"}, description = "Runtimes: camel-main, quarkus, spring-boot", defaultValue = Constants.DEFAULT_RUNTIMES)
     private String runtimes;
     @CommandLine.Option(names = {"--auth"}, description = "Authentication: public, basic, oidc", defaultValue = Constants.DEFAULT_AUTH)
     private String auth;
@@ -27,9 +28,9 @@ public class KaravanCommand implements Callable<Integer> {
     private int nodePort;
     @CommandLine.Option(names = {"--instances"}, description = "Instances. Default: 1", defaultValue = "1")
     private int instances;
-    @CommandLine.Option(names = {"--base-image"}, description = "Base Image", defaultValue = Constants.KARAVAN_IMAGE)
+    @CommandLine.Option(names = {"--image"}, description = "Karavan Base Image", defaultValue = Constants.KARAVAN_IMAGE)
     private String baseImage;
-    @CommandLine.Option(names = {"--base-builder-image"}, description = "Base Builder Image", defaultValue = Constants.DEFAULT_BUILD_IMAGE)
+    @CommandLine.Option(names = {"--builder-image"}, description = "Karavan Base Builder Image", defaultValue = Constants.DEFAULT_BUILD_IMAGE)
     private String baseBuilderImage;
     @CommandLine.Option(names = {"--file"}, description = "YAML file name", defaultValue = "karavan.yaml")
     private String file;
@@ -78,7 +79,7 @@ public class KaravanCommand implements Callable<Integer> {
     @CommandLine.Option(names = { "-h", "--help" }, usageHelp = true, description = "Display help")
     private boolean helpRequested;
 
-    private Map<String,String> labels;
+    private Map<String,String> labels = new HashMap<>();
 
     public static void main(String... args) {
         CommandLine commandLine = new CommandLine(new KaravanCommand());
diff --git a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanDeployment.java b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanDeployment.java
index ccf6cd41..b73e7c97 100644
--- a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanDeployment.java
+++ b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanDeployment.java
@@ -16,16 +16,7 @@
  */
 package org.apache.camel.karavan.cli.resources;
 
-import io.fabric8.kubernetes.api.model.EmptyDirVolumeSource;
-import io.fabric8.kubernetes.api.model.EnvVar;
-import io.fabric8.kubernetes.api.model.EnvVarSourceBuilder;
-import io.fabric8.kubernetes.api.model.ObjectFieldSelector;
-import io.fabric8.kubernetes.api.model.PersistentVolumeClaimVolumeSource;
-import io.fabric8.kubernetes.api.model.Quantity;
-import io.fabric8.kubernetes.api.model.ResourceRequirementsBuilder;
-import io.fabric8.kubernetes.api.model.SecretKeySelector;
-import io.fabric8.kubernetes.api.model.VolumeBuilder;
-import io.fabric8.kubernetes.api.model.VolumeMountBuilder;
+import io.fabric8.kubernetes.api.model.*;
 import io.fabric8.kubernetes.api.model.apps.Deployment;
 import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;
 import org.apache.camel.karavan.cli.Constants;
@@ -36,9 +27,12 @@ import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 
+import static org.apache.camel.karavan.cli.Constants.INFINISPAN_SECRET_NAME;
+import static org.apache.camel.karavan.cli.Constants.NAME;
+
 public class KaravanDeployment {
 
-    public static Deployment getDeployment (KaravanCommand config) {
+    public static Deployment getDeployment(KaravanCommand config) {
 
         String baseImage = config.getBaseImage();
 
@@ -46,30 +40,45 @@ public class KaravanDeployment {
         List<EnvVar> envVarList = new ArrayList<>();
 
         envVarList.add(
-                new EnvVar("KARAVAN_ENVIRONMENT",config.getEnvironment(), null)
+                new EnvVar("KARAVAN_ENVIRONMENT", config.getEnvironment(), null)
         );
         envVarList.add(
                 new EnvVar("KARAVAN_RUNTIMES", config.getRuntimes(), null)
         );
         envVarList.add(
-                new EnvVar("KUBERNETES_NAMESPACE", null, new EnvVarSourceBuilder().withFieldRef(new ObjectFieldSelector("","metadata.namespace")).build())
+                new EnvVar("KARAVAN_CONTAINER_STATUS_INTERVAL", "disabled", null)
+        );
+        envVarList.add(
+                new EnvVar("KARAVAN_CONTAINER_INFINISPAN_INTERVAL", "disabled", null)
+        );
+        envVarList.add(
+                new EnvVar("KARAVAN_CAMEL_STATUS_INTERVAL", "3s", null)
+        );
+        envVarList.add(
+                new EnvVar("INFINISPAN_HOSTS", "infinispan." + config.getNamespace() + ":11222", null)
+        );
+        envVarList.add(
+                new EnvVar("INFINISPAN_PASSWORD", null, new EnvVarSourceBuilder().withSecretKeyRef(new SecretKeySelector("password", INFINISPAN_SECRET_NAME, false)).build())
+        );
+        envVarList.add(
+                new EnvVar("KUBERNETES_NAMESPACE", null, new EnvVarSourceBuilder().withFieldRef(new ObjectFieldSelector("", "metadata.namespace")).build())
         );
         String auth = config.getAuth();
         if (Objects.equals(auth, "basic")) {
             image = baseImage + "-basic:" + config.getVersion();
             envVarList.add(
-                    new EnvVar("MASTER_PASSWORD", null, new EnvVarSourceBuilder().withSecretKeyRef(new SecretKeySelector("master-password","karavan", false)).build())
+                    new EnvVar("MASTER_PASSWORD", null, new EnvVarSourceBuilder().withSecretKeyRef(new SecretKeySelector("master-password", NAME, false)).build())
             );
-        } else if (Objects.equals(auth,"oidc")) {
+        } else if (Objects.equals(auth, "oidc")) {
             image = baseImage + "-oidc:" + config.getVersion();
             envVarList.add(
-                    new EnvVar("OIDC_FRONTEND_URL", null, new EnvVarSourceBuilder().withSecretKeyRef(new SecretKeySelector("oidc-frontend-url","karavan", false)).build())
+                    new EnvVar("OIDC_FRONTEND_URL", null, new EnvVarSourceBuilder().withSecretKeyRef(new SecretKeySelector("oidc-frontend-url", "karavan", false)).build())
             );
             envVarList.add(
-                    new EnvVar("OIDC_SERVER_URL", null, new EnvVarSourceBuilder().withSecretKeyRef(new SecretKeySelector("oidc-server-url","karavan", false)).build())
+                    new EnvVar("OIDC_SERVER_URL", null, new EnvVarSourceBuilder().withSecretKeyRef(new SecretKeySelector("oidc-server-url", "karavan", false)).build())
             );
             envVarList.add(
-                    new EnvVar("OIDC_SECRET", null, new EnvVarSourceBuilder().withSecretKeyRef(new SecretKeySelector("oidc-secret","karavan", false)).build())
+                    new EnvVar("OIDC_SECRET", null, new EnvVarSourceBuilder().withSecretKeyRef(new SecretKeySelector("oidc-secret", "karavan", false)).build())
             );
         }
         String gitPullInterval = config.getGitPullInterval();
@@ -108,22 +117,22 @@ public class KaravanDeployment {
                 .endMetadata()
 
                 .withNewSpec()
-                    .addNewContainer()
-                        .withName(Constants.NAME)
-                        .withImage(image)
-                        .withImagePullPolicy("Always")
-                        .withEnv(envVarList)
-                        .addNewPort()
-                            .withContainerPort(8080)
-                            .withName(Constants.NAME)
-                        .endPort()
-                        .withResources(new ResourceRequirementsBuilder().withRequests(
-                                Map.of("memory", new Quantity("512Mi"))).build())
-                        .withVolumeMounts(
-                                new VolumeMountBuilder().withName("karavan-data").withMountPath("/deployments/karavan-data").build(),
-                                new VolumeMountBuilder().withName("ephemeral").withMountPath("/tmp").build()
-                        )
-                    .endContainer()
+                .addNewContainer()
+                .withName(Constants.NAME)
+                .withImage(image)
+                .withImagePullPolicy("Always")
+                .withEnv(envVarList)
+                .addNewPort()
+                .withContainerPort(8080)
+                .withName(Constants.NAME)
+                .endPort()
+                .withResources(new ResourceRequirementsBuilder().withRequests(
+                        Map.of("memory", new Quantity("512Mi"))).build())
+                .withVolumeMounts(
+                        new VolumeMountBuilder().withName("karavan-data").withMountPath("/deployments/karavan-data").build(),
+                        new VolumeMountBuilder().withName("ephemeral").withMountPath("/tmp").build()
+                )
+                .endContainer()
                 .withServiceAccount(Constants.NAME)
                 .withVolumes(
                         new VolumeBuilder().withName("karavan-data").withPersistentVolumeClaim(new PersistentVolumeClaimVolumeSource("karavan-data", false)).build(),
diff --git a/karavan-web/karavan-cli/src/main/resources/infinispan.yaml b/karavan-web/karavan-cli/src/main/resources/infinispan.yaml
index 42fff892..bcb322ba 100644
--- a/karavan-web/karavan-cli/src/main/resources/infinispan.yaml
+++ b/karavan-web/karavan-cli/src/main/resources/infinispan.yaml
@@ -3,7 +3,7 @@
 apiVersion: v1
 kind: Secret
 metadata:
-  name: infinispan-generated-secret
+  name: infinispan-secret
   labels:
     app: infinispan-secret-identities
     clusterName: infinispan
@@ -18,8 +18,8 @@ metadata:
     "helm.sh/resource-policy": keep
 type: Opaque
 stringData:
-  username: monitor
-  password: $INFINISPAN_PASSWORD
+  username: 'monitor'
+  password: '$INFINISPAN_PASSWORD'
   identities-batch: |-
     user create admin -p $INFINISPAN_PASSWORD
     user create monitor -p $INFINISPAN_PASSWORD --users-file metrics-users.properties --groups-file metrics-groups.properties
@@ -201,63 +201,6 @@ data:
         </Loggers>
     </Configuration>
 ---
-# Source: infinispan/templates/metrics-service.yaml
-apiVersion: v1
-kind: Service
-metadata:
-  name: infinispan-metrics
-  annotations:
-    meta.helm.sh/release-name: infinispan
-    meta.helm.sh/release-namespace: default
-  labels:
-    app: infinispan-service-metrics
-    clusterName: infinispan
-    helm.sh/chart: infinispan-0.3.1
-    meta.helm.sh/release-name: infinispan
-    meta.helm.sh/release-namespace: default
-    app.kubernetes.io/version: "14.0"
-    app.kubernetes.io/managed-by: Helm
-
-spec:
-  type: ClusterIP
-  clusterIP: None
-  ports:
-    - port: 11223
-      protocol: TCP
-      name: infinispan-met
-  selector:
-    clusterName: infinispan
-    app: infinispan-pod
----
-# Source: infinispan/templates/ping-service.yaml
-apiVersion: v1
-kind: Service
-metadata:
-  name: infinispan-ping
-  annotations:
-    meta.helm.sh/release-name: infinispan
-    meta.helm.sh/release-namespace: default
-  labels:
-    app: infinispan-service-ping
-    clusterName: infinispan
-    helm.sh/chart: infinispan-0.3.1
-    meta.helm.sh/release-name: infinispan
-    meta.helm.sh/release-namespace: default
-    app.kubernetes.io/version: "14.0"
-    app.kubernetes.io/managed-by: Helm
-
-spec:
-  publishNotReadyAddresses: true
-  type: ClusterIP
-  clusterIP: None
-  ports:
-    - port: 8888
-      protocol: TCP
-      name: infinispan
-  selector:
-    clusterName: infinispan
-    app: infinispan-pod
----
 # Source: infinispan/templates/service.yaml
 apiVersion: v1
 kind: Service
@@ -407,7 +350,7 @@ spec:
           name: config-volume
         - name: identities-volume
           secret:
-            secretName: infinispan-generated-secret
+            secretName: infinispan-secret
         - name: data-volume
           emptyDir: { }
   updateStrategy: