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/08 14:27:23 UTC

[camel-karavan] 03/03: First attempt for #484

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 7144594f250ba6c6e70d179f58c832c12b30ffe9
Author: Marat Gubaidullin <ma...@gmail.com>
AuthorDate: Tue Aug 8 10:27:08 2023 -0400

    First attempt for #484
---
 .../org/apache/camel/karavan/cli/CommandUtils.java |  59 ++-
 .../org/apache/camel/karavan/cli/Constants.java    |   4 +
 .../apache/camel/karavan/cli/InstallCommand.java   | 109 ------
 .../apache/camel/karavan/cli/KaravanCommand.java   | 357 +++++++++++++++++-
 .../apache/camel/karavan/cli/KaravanConfig.java    | 304 ---------------
 .../apache/camel/karavan/cli/ResourceUtils.java    |   4 +-
 .../apache/camel/karavan/cli/UpgradeCommand.java   |  20 -
 .../karavan/cli/resources/KaravanConfigMap.java    |   6 +-
 .../karavan/cli/resources/KaravanDeployment.java   |   4 +-
 .../camel/karavan/cli/resources/KaravanPvc.java    |   8 +-
 .../camel/karavan/cli/resources/KaravanRole.java   |  12 +-
 .../camel/karavan/cli/resources/KaravanSecret.java |   4 +-
 .../karavan/cli/resources/KaravanService.java      |   6 +-
 .../cli/resources/KaravanServiceAccount.java       |   6 +-
 .../camel/karavan/cli/resources/KaravanTekton.java |   8 +-
 .../apache/camel/karavan/cli/resources/Nexus.java  |   6 +-
 .../src/main/resources/infinispan-secrets.yaml     |  11 -
 .../src/main/resources/infinispan-values.yaml      |  14 -
 .../karavan-cli/src/main/resources/infinispan.yaml | 414 +++++++++++++++++++++
 19 files changed, 858 insertions(+), 498 deletions(-)

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 53b10eef..4b170f69 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
@@ -19,6 +19,7 @@ package org.apache.camel.karavan.cli;
 import io.fabric8.kubernetes.api.model.*;
 import io.fabric8.kubernetes.api.model.apps.Deployment;
 import io.fabric8.kubernetes.api.model.apps.DeploymentCondition;
+import io.fabric8.kubernetes.api.model.apps.StatefulSet;
 import io.fabric8.kubernetes.client.KubernetesClient;
 import io.fabric8.kubernetes.client.KubernetesClientBuilder;
 import io.fabric8.openshift.api.model.operatorhub.v1.Operator;
@@ -27,16 +28,20 @@ import io.fabric8.tekton.pipeline.v1beta1.Pipeline;
 import io.fabric8.tekton.pipeline.v1beta1.Task;
 import org.apache.camel.karavan.cli.resources.*;
 
+import java.io.BufferedReader;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.util.Arrays;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.stream.Collectors;
 
 public class CommandUtils {
     private static final Pipeline pipeline = new Pipeline();
     private static final Task task = new Task();
 
-    public static void installKaravan(KaravanConfig config) {
+    public static void installKaravan(KaravanCommand config) {
         try (KubernetesClient client = new KubernetesClientBuilder().build()) {
             OpenShiftClient oClient = client.adapt(OpenShiftClient.class);
             if (oClient.isSupported()) {
@@ -50,7 +55,7 @@ public class CommandUtils {
         }
     }
 
-    private static void install(KaravanConfig config, KubernetesClient client) {
+    private static void install(KaravanCommand config, KubernetesClient client) {
         // Check and install Tekton
         if (!isTektonInstalled(client)) {
             log("Tekton is not installed");
@@ -72,6 +77,17 @@ public class CommandUtils {
             log("Namespace " + config.getNamespace() + " already exists");
         }
 
+        // Check and install Infinispan
+        if (!isInfinispanInstalled(client)) {
+            log("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)) {
             logError("Karavan secrets not found");
@@ -134,12 +150,12 @@ public class CommandUtils {
         log("Karavan is ready");
     }
 
-    public static boolean checkKaravanSecrets(KaravanConfig config, KubernetesClient client) {
+    public static boolean checkKaravanSecrets(KaravanCommand config, KubernetesClient client) {
         Secret secret = client.secrets().inNamespace(config.getNamespace()).withName(Constants.NAME).get();
         return secret != null;
     }
 
-    public static boolean tryToCreateKaravanSecrets(KaravanConfig config, KubernetesClient client) {
+    public static boolean tryToCreateKaravanSecrets(KaravanCommand config, KubernetesClient client) {
         if (config.gitConfigured()) {
             if (config.getImageRegistry() == null) {
                 if (config.isOpenShift()) {
@@ -161,7 +177,7 @@ public class CommandUtils {
         return false;
     }
 
-    public static boolean checkReady(KaravanConfig config, KubernetesClient client) {
+    public static boolean checkReady(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();
@@ -183,7 +199,22 @@ public class CommandUtils {
         }
     }
 
-    private static void installTekton(KaravanConfig config, KubernetesClient client) {
+    private static void installInfinispan(KaravanCommand config, KubernetesClient client) {
+        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);
+        log("Infinispan is installed");
+    }
+
+    private static void installTekton(KaravanCommand config, KubernetesClient client) {
         System.out.print("⏳ Installing Tekton");
         client.load(CommandUtils.class.getResourceAsStream("/pipelines.yaml")).create().forEach(hasMetadata -> {
             System.out.print(".");
@@ -219,6 +250,12 @@ public class CommandUtils {
         return false;
     }
 
+    private static boolean isInfinispanInstalled(KubernetesClient client) {
+        Service service = client.services().withName("infinispan").get();
+        StatefulSet set = client.apps().statefulSets().withName("infinispan").get();
+        return service != null && set != null;
+    }
+
     public static void log(String emoji, String message) {
         System.out.println(emoji + " " + message);
     }
@@ -250,4 +287,14 @@ public class CommandUtils {
     private static boolean isOpenShift(KubernetesClient client) {
         return client.adapt(OpenShiftClient.class).isSupported();
     }
+
+    private static String getResourceFile(String path) {
+        try {
+            InputStream inputStream = CommandUtils.class.getResourceAsStream(path);
+            return new BufferedReader(new InputStreamReader(inputStream))
+                    .lines().collect(Collectors.joining(System.getProperty("line.separator")));
+        } catch (Exception e) {
+            return null;
+        }
+    }
 }
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 061105d2..53558b88 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
@@ -30,6 +30,10 @@ public final class Constants {
 
     public static final String KARAVAN_IMAGE = "ghcr.io/apache/camel-karavan";
 
+    public static final String INFINISPAN_IMAGE = "quay.io/infinispan/server:14.0.6.Final";
+    public static final String INFINISPAN_USERNAME = "admin";
+    public static final String INFINISPAN_PASSWORD = "karavan";
+
     public static final String CRD_GROUP = "camel.apache.org";
     public static final String CRD_VERSION = "v1";
     public static final String SHORT_NAME = "karavan";
diff --git a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/InstallCommand.java b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/InstallCommand.java
deleted file mode 100644
index 7ea78b73..00000000
--- a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/InstallCommand.java
+++ /dev/null
@@ -1,109 +0,0 @@
-package org.apache.camel.karavan.cli;
-
-import picocli.CommandLine;
-
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.HashMap;
-import java.util.concurrent.Callable;
-
-@CommandLine.Command(name = "install",
-        mixinStandardHelpOptions = true,
-        description = "Install Karavan")
-public class InstallCommand implements Callable<Integer> {
-
-    @CommandLine.Option(names = {"-v", "--version"}, required = true, description = "Karavan version", defaultValue = "4.0.0-RC2")
-    private String version;
-    @CommandLine.Option(names = {"-n", "--namespace"}, description = "Namespace", defaultValue = Constants.DEFAULT_NAMESPACE)
-    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)
-    private String runtimes;
-    @CommandLine.Option(names = {"--auth"}, description = "Authentication: public, basic, oidc", defaultValue = Constants.DEFAULT_AUTH)
-    private String auth;
-    @CommandLine.Option(names = {"--node-port"}, description = "Node port", defaultValue = "0")
-    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)
-    private String baseImage;
-    @CommandLine.Option(names = {"--base-builder-image"}, description = "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;
-    @CommandLine.Option(names = {"--yaml"}, description = "Create YAML file. Do not apply")
-    private boolean yaml;
-    @CommandLine.Option(names = {"--openshift"}, description = "Create files for OpenShift")
-    private boolean isOpenShift;
-
-    @CommandLine.Option(names = {"--master-password"}, description = "Master password", defaultValue = "karavan")
-    private String masterPassword;
-    @CommandLine.Option(names = {"--oidc-secret"}, description = "OIDC secret")
-    private String oidcSecret;
-    @CommandLine.Option(names = {"--oidc-server-url"}, description = "OIDC server URL")
-    private String oidcServerUrl;
-    @CommandLine.Option(names = {"--oidc-frontend-url"}, description = "OIDC frontend URL")
-    private String oidcFrontendUrl;
-    @CommandLine.Option(names = {"--git-repository"}, description = "Git repository")
-    private String gitRepository;
-    @CommandLine.Option(names = {"--git-username"}, description = "Git username")
-    private String gitUsername;
-    @CommandLine.Option(names = {"--git-password"}, description = "Git password")
-    private String gitPassword;
-    @CommandLine.Option(names = {"--git-branch"}, description = "Git branch", defaultValue = "main")
-    private String gitBranch;
-    @CommandLine.Option(names = {"--git-pull"}, description = "Git pull interval. Default: off", defaultValue = "off")
-    private String gitPullInterval;
-    @CommandLine.Option(names = {"--image-registry"}, description = "Image registry")
-    private String imageRegistry;
-    @CommandLine.Option(names = {"--image-group"}, description = "Image group", defaultValue = "karavan")
-    private String imageGroup;
-    @CommandLine.Option(names = {"--image-registry-username"}, description = "Image registry username")
-    private String imageRegistryUsername;
-    @CommandLine.Option(names = {"--image-registry-password"}, description = "Image registry password")
-    private String imageRegistryPassword;
-
-    @CommandLine.Option(names = {"--nexus-proxy"}, description = "Deploy nexus proxy")
-    private boolean nexusProxy;
-
-    @CommandLine.Option(names = { "-h", "--help" }, usageHelp = true, description = "Display help")
-    private boolean helpRequested;
-
-    @Override
-    public Integer call() throws Exception {
-        KaravanConfig config = new KaravanConfig (
-                version,
-                namespace,
-                environment,
-                runtimes,
-                auth,
-                nodePort,
-                instances,
-                baseImage,
-                baseBuilderImage,
-                isOpenShift,
-                new HashMap<>(),
-                masterPassword,
-                oidcSecret,
-                oidcServerUrl,
-                oidcFrontendUrl,
-                gitRepository,
-                gitUsername,
-                gitPassword,
-                gitBranch,
-                gitPullInterval,
-                imageRegistry,
-                imageGroup,
-                imageRegistryUsername,
-                imageRegistryPassword,
-                nexusProxy
-        );
-        if (yaml) {
-            Files.writeString(Path.of(file), ResourceUtils.generateResources(config));
-        } else {
-            CommandUtils.installKaravan(config);
-        }
-        return 0;
-    }
-}
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 5963ae6f..82d0e3ec 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
@@ -2,9 +2,83 @@ package org.apache.camel.karavan.cli;
 
 import picocli.CommandLine;
 
-@CommandLine.Command(mixinStandardHelpOptions = true, subcommands = {InstallCommand.class, UpgradeCommand.class})
-public class KaravanCommand {
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.Callable;
 
+@CommandLine.Command(name = "install",
+        mixinStandardHelpOptions = true,
+        description = "Karavan CLI")
+public class KaravanCommand implements Callable<Integer> {
+
+    @CommandLine.Option(names = {"-v", "--version"}, required = true, description = "Karavan version", defaultValue = "4.0.0-RC2")
+    private String version;
+    @CommandLine.Option(names = {"-n", "--namespace"}, description = "Namespace", defaultValue = Constants.DEFAULT_NAMESPACE)
+    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)
+    private String runtimes;
+    @CommandLine.Option(names = {"--auth"}, description = "Authentication: public, basic, oidc", defaultValue = Constants.DEFAULT_AUTH)
+    private String auth;
+    @CommandLine.Option(names = {"--node-port"}, description = "Node port", defaultValue = "0")
+    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)
+    private String baseImage;
+    @CommandLine.Option(names = {"--base-builder-image"}, description = "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;
+    @CommandLine.Option(names = {"--yaml"}, description = "Create YAML file. Do not apply")
+    private boolean yaml;
+    @CommandLine.Option(names = {"--openshift"}, description = "Create files for OpenShift")
+    private boolean isOpenShift;
+
+    @CommandLine.Option(names = {"--master-password"}, description = "Master password", defaultValue = "karavan")
+    private String masterPassword;
+    @CommandLine.Option(names = {"--oidc-secret"}, description = "OIDC secret")
+    private String oidcSecret;
+    @CommandLine.Option(names = {"--oidc-server-url"}, description = "OIDC server URL")
+    private String oidcServerUrl;
+    @CommandLine.Option(names = {"--oidc-frontend-url"}, description = "OIDC frontend URL")
+    private String oidcFrontendUrl;
+    @CommandLine.Option(names = {"--git-repository"}, description = "Git repository")
+    private String gitRepository;
+    @CommandLine.Option(names = {"--git-username"}, description = "Git username")
+    private String gitUsername;
+    @CommandLine.Option(names = {"--git-password"}, description = "Git password")
+    private String gitPassword;
+    @CommandLine.Option(names = {"--git-branch"}, description = "Git branch", defaultValue = "main")
+    private String gitBranch;
+    @CommandLine.Option(names = {"--git-pull"}, description = "Git pull interval. Default: off", defaultValue = "off")
+    private String gitPullInterval;
+    @CommandLine.Option(names = {"--image-registry"}, description = "Image registry")
+    private String imageRegistry;
+    @CommandLine.Option(names = {"--image-group"}, description = "Image group", defaultValue = "karavan")
+    private String imageGroup;
+    @CommandLine.Option(names = {"--image-registry-username"}, description = "Image registry username")
+    private String imageRegistryUsername;
+    @CommandLine.Option(names = {"--image-registry-password"}, description = "Image registry password")
+    private String imageRegistryPassword;
+
+    @CommandLine.Option(names = {"--infinispan-image"}, description = "Infinispan Image", defaultValue = Constants.INFINISPAN_IMAGE)
+    private String infinispanImage;
+    @CommandLine.Option(names = {"--infinispan-username"}, description = "Infinispan Username", defaultValue = Constants.INFINISPAN_USERNAME)
+    private String infinispanUsername;
+    @CommandLine.Option(names = {"--infinispan-password"}, description = "Infinispan Password", defaultValue = Constants.INFINISPAN_PASSWORD)
+    private String infinispanPassword;
+
+    @CommandLine.Option(names = {"--nexus-proxy"}, description = "Deploy nexus proxy")
+    private boolean nexusProxy;
+
+    @CommandLine.Option(names = { "-h", "--help" }, usageHelp = true, description = "Display help")
+    private boolean helpRequested;
+
+    private Map<String,String> labels;
 
     public static void main(String... args) {
         CommandLine commandLine = new CommandLine(new KaravanCommand());
@@ -16,4 +90,283 @@ public class KaravanCommand {
         int exitCode = commandLine.execute(args);
         System.exit(exitCode);
     }
+
+    @Override
+    public Integer call() throws Exception {
+        if (yaml) {
+            Files.writeString(Path.of(file), ResourceUtils.generateResources(this));
+        } else {
+            CommandUtils.installKaravan(this);
+        }
+        return 0;
+    }
+
+    public boolean gitConfigured() {
+        return gitRepository != null
+                && gitUsername != null
+                && gitPassword != null
+                && gitBranch != null;
+    }
+
+    public boolean oidcConfigured() {
+        return oidcSecret != null
+                && oidcServerUrl != null
+                && oidcFrontendUrl != null;
+    }
+
+    public boolean isAuthOidc() {
+        return Objects.equals(this.auth, "oidc");
+    }
+
+    public boolean isAuthBasic() {
+        return Objects.equals(this.auth, "basic");
+    }
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+    public String getNamespace() {
+        return namespace;
+    }
+
+    public void setNamespace(String namespace) {
+        this.namespace = namespace;
+    }
+
+    public String getEnvironment() {
+        return environment;
+    }
+
+    public void setEnvironment(String environment) {
+        this.environment = environment;
+    }
+
+    public String getRuntimes() {
+        return runtimes;
+    }
+
+    public void setRuntimes(String runtimes) {
+        this.runtimes = runtimes;
+    }
+
+    public String getAuth() {
+        return auth;
+    }
+
+    public void setAuth(String auth) {
+        this.auth = auth;
+    }
+
+    public int getNodePort() {
+        return nodePort;
+    }
+
+    public void setNodePort(int nodePort) {
+        this.nodePort = nodePort;
+    }
+
+    public int getInstances() {
+        return instances;
+    }
+
+    public void setInstances(int instances) {
+        this.instances = instances;
+    }
+
+    public String getBaseImage() {
+        return baseImage;
+    }
+
+    public void setBaseImage(String baseImage) {
+        this.baseImage = baseImage;
+    }
+
+    public String getBaseBuilderImage() {
+        return baseBuilderImage;
+    }
+
+    public void setBaseBuilderImage(String baseBuilderImage) {
+        this.baseBuilderImage = baseBuilderImage;
+    }
+
+    public String getFile() {
+        return file;
+    }
+
+    public void setFile(String file) {
+        this.file = file;
+    }
+
+    public boolean isYaml() {
+        return yaml;
+    }
+
+    public void setYaml(boolean yaml) {
+        this.yaml = yaml;
+    }
+
+    public boolean isOpenShift() {
+        return isOpenShift;
+    }
+
+    public void setOpenShift(boolean openShift) {
+        isOpenShift = openShift;
+    }
+
+    public String getMasterPassword() {
+        return masterPassword;
+    }
+
+    public void setMasterPassword(String masterPassword) {
+        this.masterPassword = masterPassword;
+    }
+
+    public String getOidcSecret() {
+        return oidcSecret;
+    }
+
+    public void setOidcSecret(String oidcSecret) {
+        this.oidcSecret = oidcSecret;
+    }
+
+    public String getOidcServerUrl() {
+        return oidcServerUrl;
+    }
+
+    public void setOidcServerUrl(String oidcServerUrl) {
+        this.oidcServerUrl = oidcServerUrl;
+    }
+
+    public String getOidcFrontendUrl() {
+        return oidcFrontendUrl;
+    }
+
+    public void setOidcFrontendUrl(String oidcFrontendUrl) {
+        this.oidcFrontendUrl = oidcFrontendUrl;
+    }
+
+    public String getGitRepository() {
+        return gitRepository;
+    }
+
+    public void setGitRepository(String gitRepository) {
+        this.gitRepository = gitRepository;
+    }
+
+    public String getGitUsername() {
+        return gitUsername;
+    }
+
+    public void setGitUsername(String gitUsername) {
+        this.gitUsername = gitUsername;
+    }
+
+    public String getGitPassword() {
+        return gitPassword;
+    }
+
+    public void setGitPassword(String gitPassword) {
+        this.gitPassword = gitPassword;
+    }
+
+    public String getGitBranch() {
+        return gitBranch;
+    }
+
+    public void setGitBranch(String gitBranch) {
+        this.gitBranch = gitBranch;
+    }
+
+    public String getGitPullInterval() {
+        return gitPullInterval;
+    }
+
+    public void setGitPullInterval(String gitPullInterval) {
+        this.gitPullInterval = gitPullInterval;
+    }
+
+    public String getImageRegistry() {
+        return imageRegistry;
+    }
+
+    public void setImageRegistry(String imageRegistry) {
+        this.imageRegistry = imageRegistry;
+    }
+
+    public String getImageGroup() {
+        return imageGroup;
+    }
+
+    public void setImageGroup(String imageGroup) {
+        this.imageGroup = imageGroup;
+    }
+
+    public String getImageRegistryUsername() {
+        return imageRegistryUsername;
+    }
+
+    public void setImageRegistryUsername(String imageRegistryUsername) {
+        this.imageRegistryUsername = imageRegistryUsername;
+    }
+
+    public String getImageRegistryPassword() {
+        return imageRegistryPassword;
+    }
+
+    public void setImageRegistryPassword(String imageRegistryPassword) {
+        this.imageRegistryPassword = imageRegistryPassword;
+    }
+
+    public String getInfinispanImage() {
+        return infinispanImage;
+    }
+
+    public void setInfinispanImage(String infinispanImage) {
+        this.infinispanImage = infinispanImage;
+    }
+
+    public String getInfinispanUsername() {
+        return infinispanUsername;
+    }
+
+    public void setInfinispanUsername(String infinispanUsername) {
+        this.infinispanUsername = infinispanUsername;
+    }
+
+    public String getInfinispanPassword() {
+        return infinispanPassword;
+    }
+
+    public void setInfinispanPassword(String infinispanPassword) {
+        this.infinispanPassword = infinispanPassword;
+    }
+
+    public boolean isNexusProxy() {
+        return nexusProxy;
+    }
+
+    public void setNexusProxy(boolean nexusProxy) {
+        this.nexusProxy = nexusProxy;
+    }
+
+    public boolean isHelpRequested() {
+        return helpRequested;
+    }
+
+    public void setHelpRequested(boolean helpRequested) {
+        this.helpRequested = helpRequested;
+    }
+
+    public Map<String, String> getLabels() {
+        return labels;
+    }
+
+    public void setLabels(Map<String, String> labels) {
+        this.labels = labels;
+    }
 }
diff --git a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanConfig.java b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanConfig.java
deleted file mode 100644
index 476acf1e..00000000
--- a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/KaravanConfig.java
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.karavan.cli;
-
-import java.util.Map;
-import java.util.Objects;
-
-public class KaravanConfig {
-
-    private String version;
-    private String namespace;
-    private String environment;
-    private String runtimes;
-    private String auth;
-    private int nodePort;
-    private int instances;
-    private String baseImage;
-    private String baseBuilderImage;
-    private boolean isOpenShift;
-    private Map<String,String> labels;
-
-    private String masterPassword;
-    private String oidcSecret;
-    private String oidcServerUrl;
-    private String oidcFrontendUrl;
-    private String gitRepository;
-    private String gitUsername;
-    private String gitPassword;
-    private String gitBranch;
-    private String gitPullInterval;
-    private String imageRegistry;
-    private String imageGroup;
-    private String imageRegistryUsername;
-    private String imageRegistryPassword;
-    private boolean nexusProxy;
-
-    public KaravanConfig(String version, String namespace, String environment, String runtimes, String auth,
-                         int nodePort, int instances, String baseImage, String baseBuilderImage, boolean isOpenShift,
-                         Map<String, String> labels, String masterPassword, String oidcSecret, String oidcServerUrl,
-                         String oidcFrontendUrl, String gitRepository, String gitUsername, String gitPassword,
-                         String gitBranch, String gitPullInterval, String imageRegistry, String imageGroup,
-                         String imageRegistryUsername, String imageRegistryPassword, boolean nexusProxy) {
-        this.version = version;
-        this.namespace = namespace;
-        this.environment = environment;
-        this.runtimes = runtimes;
-        this.auth = auth;
-        this.nodePort = nodePort;
-        this.instances = instances;
-        this.baseImage = baseImage;
-        this.baseBuilderImage = baseBuilderImage;
-        this.isOpenShift = isOpenShift;
-        this.labels = labels;
-        this.masterPassword = masterPassword;
-        this.oidcSecret = oidcSecret;
-        this.oidcServerUrl = oidcServerUrl;
-        this.oidcFrontendUrl = oidcFrontendUrl;
-        this.gitRepository = gitRepository;
-        this.gitUsername = gitUsername;
-        this.gitPassword = gitPassword;
-        this.gitBranch = gitBranch;
-        this.gitPullInterval = gitPullInterval;
-        this.imageRegistry = imageRegistry;
-        this.imageGroup = imageGroup;
-        this.imageRegistryUsername = imageRegistryUsername;
-        this.imageRegistryPassword = imageRegistryPassword;
-        this.nexusProxy = nexusProxy;
-    }
-
-    public boolean gitConfigured() {
-        return gitRepository != null
-                && gitUsername != null
-                && gitPassword != null
-                && gitBranch != null;
-    }
-
-    public boolean oidcConfigured() {
-        return oidcSecret != null
-                && oidcServerUrl != null
-                && oidcFrontendUrl != null;
-    }
-
-    public boolean isAuthOidc() {
-        return Objects.equals(this.auth, "oidc");
-    }
-
-    public boolean isAuthBasic() {
-        return Objects.equals(this.auth, "basic");
-    }
-
-    public String getVersion() {
-        return version;
-    }
-
-    public void setVersion(String version) {
-        this.version = version;
-    }
-
-    public String getNamespace() {
-        return namespace;
-    }
-
-    public void setNamespace(String namespace) {
-        this.namespace = namespace;
-    }
-
-    public String getEnvironment() {
-        return environment;
-    }
-
-    public void setEnvironment(String environment) {
-        this.environment = environment;
-    }
-
-    public String getRuntimes() {
-        return runtimes;
-    }
-
-    public void setRuntimes(String runtimes) {
-        this.runtimes = runtimes;
-    }
-
-    public String getAuth() {
-        return auth;
-    }
-
-    public void setAuth(String auth) {
-        this.auth = auth;
-    }
-
-    public int getNodePort() {
-        return nodePort;
-    }
-
-    public void setNodePort(int nodePort) {
-        this.nodePort = nodePort;
-    }
-
-    public String getGitPullInterval() {
-        return gitPullInterval;
-    }
-
-    public void setGitPullInterval(String gitPullInterval) {
-        this.gitPullInterval = gitPullInterval;
-    }
-
-    public int getInstances() {
-        return instances;
-    }
-
-    public void setInstances(int instances) {
-        this.instances = instances;
-    }
-
-    public String getImageRegistry() {
-        return imageRegistry;
-    }
-
-    public void setImageRegistry(String imageRegistry) {
-        this.imageRegistry = imageRegistry;
-    }
-
-    public String getBaseImage() {
-        return baseImage;
-    }
-
-    public void setBaseImage(String baseImage) {
-        this.baseImage = baseImage;
-    }
-
-    public String getBaseBuilderImage() {
-        return baseBuilderImage;
-    }
-
-    public void setBaseBuilderImage(String baseBuilderImage) {
-        this.baseBuilderImage = baseBuilderImage;
-    }
-
-    public boolean isOpenShift() {
-        return isOpenShift;
-    }
-
-    public void setOpenShift(boolean openShift) {
-        isOpenShift = openShift;
-    }
-
-    public Map<String, String> getLabels() {
-        return labels;
-    }
-
-    public void setLabels(Map<String, String> labels) {
-        this.labels = labels;
-    }
-
-    public String getMasterPassword() {
-        return masterPassword;
-    }
-
-    public void setMasterPassword(String masterPassword) {
-        this.masterPassword = masterPassword;
-    }
-
-    public String getOidcSecret() {
-        return oidcSecret;
-    }
-
-    public void setOidcSecret(String oidcSecret) {
-        this.oidcSecret = oidcSecret;
-    }
-
-    public String getOidcServerUrl() {
-        return oidcServerUrl;
-    }
-
-    public void setOidcServerUrl(String oidcServerUrl) {
-        this.oidcServerUrl = oidcServerUrl;
-    }
-
-    public String getOidcFrontendUrl() {
-        return oidcFrontendUrl;
-    }
-
-    public void setOidcFrontendUrl(String oidcFrontendUrl) {
-        this.oidcFrontendUrl = oidcFrontendUrl;
-    }
-
-    public String getGitRepository() {
-        return gitRepository;
-    }
-
-    public void setGitRepository(String gitRepository) {
-        this.gitRepository = gitRepository;
-    }
-
-    public String getGitUsername() {
-        return gitUsername;
-    }
-
-    public void setGitUsername(String gitUsername) {
-        this.gitUsername = gitUsername;
-    }
-
-    public String getGitPassword() {
-        return gitPassword;
-    }
-
-    public void setGitPassword(String gitPassword) {
-        this.gitPassword = gitPassword;
-    }
-
-    public String getGitBranch() {
-        return gitBranch;
-    }
-
-    public void setGitBranch(String gitBranch) {
-        this.gitBranch = gitBranch;
-    }
-
-    public String getImageRegistryUsername() {
-        return imageRegistryUsername;
-    }
-
-    public void setImageRegistryUsername(String imageRegistryUsername) {
-        this.imageRegistryUsername = imageRegistryUsername;
-    }
-
-    public String getImageRegistryPassword() {
-        return imageRegistryPassword;
-    }
-
-    public void setImageRegistryPassword(String imageRegistryPassword) {
-        this.imageRegistryPassword = imageRegistryPassword;
-    }
-
-    public String getImageGroup() {
-        return imageGroup;
-    }
-
-    public void setImageGroup(String imageGroup) {
-        this.imageGroup = imageGroup;
-    }
-
-    public boolean isNexusProxy() {
-        return nexusProxy;
-    }
-
-    public void setNexusProxy(boolean nexusProxy) {
-        this.nexusProxy = nexusProxy;
-    }
-}
diff --git a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/ResourceUtils.java b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/ResourceUtils.java
index d5ddd333..b8352b25 100644
--- a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/ResourceUtils.java
+++ b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/ResourceUtils.java
@@ -23,11 +23,11 @@ import java.util.*;
 
 public class ResourceUtils {
 
-    public static String generateResources(KaravanConfig config) {
+    public static String generateResources(KaravanCommand config) {
         return String.join("", generateResourcesMap(config).values());
     }
 
-    public static Map<String, String> generateResourcesMap(KaravanConfig config) {
+    public static Map<String, String> generateResourcesMap(KaravanCommand config) {
         Map<String, String> result = new HashMap<>();
 
         result.put("sa-karavan", toYAML(KaravanServiceAccount.getServiceAccount(config)));
diff --git a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/UpgradeCommand.java b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/UpgradeCommand.java
deleted file mode 100644
index 8a05a100..00000000
--- a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/UpgradeCommand.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.apache.camel.karavan.cli;
-
-import picocli.CommandLine;
-
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.HashMap;
-import java.util.concurrent.Callable;
-
-@CommandLine.Command(name = "upgrade",
-        mixinStandardHelpOptions = true,
-        description = "Upgrade Karavan")
-public class UpgradeCommand implements Callable<Integer> {
-
-    @Override
-    public Integer call() throws Exception {
-        System.out.println("Not implemented yet");
-        return 0;
-    }
-}
diff --git a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanConfigMap.java b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanConfigMap.java
index 2fbc1316..36f20c21 100644
--- a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanConfigMap.java
+++ b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanConfigMap.java
@@ -19,7 +19,7 @@ package org.apache.camel.karavan.cli.resources;
 import io.fabric8.kubernetes.api.model.ConfigMap;
 import io.fabric8.kubernetes.api.model.ConfigMapBuilder;
 import org.apache.camel.karavan.cli.Constants;
-import org.apache.camel.karavan.cli.KaravanConfig;
+import org.apache.camel.karavan.cli.KaravanCommand;
 import org.apache.camel.karavan.cli.ResourceUtils;
 
 import java.io.BufferedReader;
@@ -32,7 +32,7 @@ public class KaravanConfigMap {
 
     private static final String MAVEN_URL = "<url>https://repo.maven.apache.org/maven2/</url>";
 
-    public static ConfigMap getConfigMap(KaravanConfig config) {
+    public static ConfigMap getConfigMap(KaravanCommand config) {
 
         String xml = getXml(config);
 
@@ -46,7 +46,7 @@ public class KaravanConfigMap {
                 .build();
     }
 
-    private static String getXml(KaravanConfig config) {
+    private static String getXml(KaravanCommand config) {
         try {
             InputStream inputStream = KaravanConfigMap.class.getResourceAsStream("/settings.xml");
             return new BufferedReader(new InputStreamReader(inputStream))
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 8c3529a1..ccf6cd41 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
@@ -29,7 +29,7 @@ import io.fabric8.kubernetes.api.model.VolumeMountBuilder;
 import io.fabric8.kubernetes.api.model.apps.Deployment;
 import io.fabric8.kubernetes.api.model.apps.DeploymentBuilder;
 import org.apache.camel.karavan.cli.Constants;
-import org.apache.camel.karavan.cli.KaravanConfig;
+import org.apache.camel.karavan.cli.KaravanCommand;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -38,7 +38,7 @@ import java.util.Objects;
 
 public class KaravanDeployment {
 
-    public static Deployment getDeployment (KaravanConfig config) {
+    public static Deployment getDeployment (KaravanCommand config) {
 
         String baseImage = config.getBaseImage();
 
diff --git a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanPvc.java b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanPvc.java
index 889cae15..b22bf7b9 100644
--- a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanPvc.java
+++ b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanPvc.java
@@ -21,14 +21,14 @@ import io.fabric8.kubernetes.api.model.PersistentVolumeClaimBuilder;
 import io.fabric8.kubernetes.api.model.Quantity;
 import io.fabric8.kubernetes.api.model.ResourceRequirementsBuilder;
 import org.apache.camel.karavan.cli.Constants;
-import org.apache.camel.karavan.cli.KaravanConfig;
+import org.apache.camel.karavan.cli.KaravanCommand;
 import org.apache.camel.karavan.cli.ResourceUtils;
 
 import java.util.Map;
 
 public class KaravanPvc {
 
-    public static PersistentVolumeClaim getPvcData (KaravanConfig config) {
+    public static PersistentVolumeClaim getPvcData (KaravanCommand config) {
         return new PersistentVolumeClaimBuilder()
                 .withNewMetadata()
                 .withName(Constants.PVC_DATA)
@@ -43,7 +43,7 @@ public class KaravanPvc {
                 .build();
     }
 
-    public static PersistentVolumeClaim getPvcM2Cache(KaravanConfig config) {
+    public static PersistentVolumeClaim getPvcM2Cache(KaravanCommand config) {
         return new PersistentVolumeClaimBuilder()
                 .withNewMetadata()
                 .withName(Constants.PVC_M2_CACHE)
@@ -58,7 +58,7 @@ public class KaravanPvc {
                 .build();
     }
 
-    public static PersistentVolumeClaim getPvcJbangCache(KaravanConfig config) {
+    public static PersistentVolumeClaim getPvcJbangCache(KaravanCommand config) {
         return new PersistentVolumeClaimBuilder()
                 .withNewMetadata()
                 .withName(Constants.PVC_JBANG_CACHE)
diff --git a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanRole.java b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanRole.java
index e93b72eb..f2d88d51 100644
--- a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanRole.java
+++ b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanRole.java
@@ -18,11 +18,11 @@ package org.apache.camel.karavan.cli.resources;
 
 import io.fabric8.kubernetes.api.model.rbac.*;
 import org.apache.camel.karavan.cli.Constants;
-import org.apache.camel.karavan.cli.KaravanConfig;
+import org.apache.camel.karavan.cli.KaravanCommand;
 
 public class KaravanRole {
 
-    public static Role getRole(KaravanConfig config) {
+    public static Role getRole(KaravanCommand config) {
         return new RoleBuilder()
                 .withNewMetadata()
                 .withName(Constants.ROLE_KARAVAN)
@@ -39,7 +39,7 @@ public class KaravanRole {
                 .build();
     }
 
-    public static RoleBinding getRoleBinding(KaravanConfig config) {
+    public static RoleBinding getRoleBinding(KaravanCommand config) {
         return new RoleBindingBuilder()
                 .withNewMetadata()
                 .withName(Constants.ROLEBINDING_KARAVAN)
@@ -50,7 +50,7 @@ public class KaravanRole {
                 .build();
     }
 
-    public static RoleBinding getRoleBindingView(KaravanConfig config) {
+    public static RoleBinding getRoleBindingView(KaravanCommand config) {
         return new RoleBindingBuilder()
                 .withNewMetadata()
                 .withName(Constants.ROLEBINDING_KARAVAN_VIEW)
@@ -63,7 +63,7 @@ public class KaravanRole {
 
 //    Pipeline roles
 
-    public static Role getRoleDeployer(KaravanConfig config) {
+    public static Role getRoleDeployer(KaravanCommand config) {
         return new RoleBuilder()
                 .withNewMetadata()
                 .withName(Constants.ROLE_PIPELINE_DEPLOYER)
@@ -78,7 +78,7 @@ public class KaravanRole {
                 .build();
     }
 
-    public static RoleBinding getRoleBindingPipeline(KaravanConfig config) {
+    public static RoleBinding getRoleBindingPipeline(KaravanCommand config) {
         return new RoleBindingBuilder()
                 .withNewMetadata()
                 .withName(Constants.ROLEBINDING_PIPELINE_DEPLOYER)
diff --git a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanSecret.java b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanSecret.java
index aba82ead..5544f456 100644
--- a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanSecret.java
+++ b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanSecret.java
@@ -18,7 +18,7 @@ package org.apache.camel.karavan.cli.resources;
 
 import io.fabric8.kubernetes.api.model.*;
 import org.apache.camel.karavan.cli.Constants;
-import org.apache.camel.karavan.cli.KaravanConfig;
+import org.apache.camel.karavan.cli.KaravanCommand;
 import org.apache.camel.karavan.cli.ResourceUtils;
 
 import java.util.HashMap;
@@ -26,7 +26,7 @@ import java.util.Map;
 
 public class KaravanSecret {
 
-    public static Secret getSecret(KaravanConfig config) {
+    public static Secret getSecret(KaravanCommand config) {
 
         Map<String, String> secretData = new HashMap<>();
         secretData.put("master-password", (config.isAuthBasic() ? config.getMasterPassword() : "karavan"));
diff --git a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanService.java b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanService.java
index 4d012458..eb14741f 100644
--- a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanService.java
+++ b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanService.java
@@ -25,14 +25,14 @@ import io.fabric8.openshift.api.model.RouteBuilder;
 import io.fabric8.openshift.api.model.RoutePort;
 import io.fabric8.openshift.api.model.RouteTargetReferenceBuilder;
 import org.apache.camel.karavan.cli.Constants;
-import org.apache.camel.karavan.cli.KaravanConfig;
+import org.apache.camel.karavan.cli.KaravanCommand;
 import org.apache.camel.karavan.cli.ResourceUtils;
 
 import java.util.Map;
 
 public class KaravanService {
 
-    public static Service getService(KaravanConfig config) {
+    public static Service getService(KaravanCommand config) {
 
         ServicePortBuilder portBuilder = new ServicePortBuilder()
                 .withName("http").withPort(80).withProtocol("TCP").withTargetPort(new IntOrString(8080));
@@ -54,7 +54,7 @@ public class KaravanService {
                 .build();
     }
 
-    public static Route getRoute(KaravanConfig config) {
+    public static Route getRoute(KaravanCommand config) {
         return new RouteBuilder()
                 .withNewMetadata()
                 .withName(Constants.NAME)
diff --git a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanServiceAccount.java b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanServiceAccount.java
index 1c07d93b..e1642041 100644
--- a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanServiceAccount.java
+++ b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanServiceAccount.java
@@ -19,14 +19,14 @@ package org.apache.camel.karavan.cli.resources;
 import io.fabric8.kubernetes.api.model.ServiceAccount;
 import io.fabric8.kubernetes.api.model.ServiceAccountBuilder;
 import org.apache.camel.karavan.cli.Constants;
-import org.apache.camel.karavan.cli.KaravanConfig;
+import org.apache.camel.karavan.cli.KaravanCommand;
 import org.apache.camel.karavan.cli.ResourceUtils;
 
 import java.util.Map;
 
 public class KaravanServiceAccount {
 
-    public static ServiceAccount getServiceAccount(KaravanConfig config) {
+    public static ServiceAccount getServiceAccount(KaravanCommand config) {
         return new ServiceAccountBuilder()
                 .withNewMetadata()
                 .withName(Constants.SERVICEACCOUNT_KARAVAN)
@@ -36,7 +36,7 @@ public class KaravanServiceAccount {
                 .build();
     }
 
-    public static ServiceAccount getServiceAccountPipeline(KaravanConfig config) {
+    public static ServiceAccount getServiceAccountPipeline(KaravanCommand config) {
         return new ServiceAccountBuilder()
                 .withNewMetadata()
                 .withName(Constants.SERVICEACCOUNT_PIPELINE)
diff --git a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanTekton.java b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanTekton.java
index 66e8caf5..88087892 100644
--- a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanTekton.java
+++ b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/KaravanTekton.java
@@ -20,7 +20,7 @@ import io.fabric8.kubernetes.api.model.EnvVarBuilder;
 import io.fabric8.kubernetes.api.model.EnvVarSourceBuilder;
 import io.fabric8.tekton.pipeline.v1beta1.*;
 import org.apache.camel.karavan.cli.Constants;
-import org.apache.camel.karavan.cli.KaravanConfig;
+import org.apache.camel.karavan.cli.KaravanCommand;
 import org.apache.camel.karavan.cli.ResourceUtils;
 
 import java.io.BufferedReader;
@@ -31,7 +31,7 @@ import java.util.stream.Collectors;
 
 public class KaravanTekton {
 
-    public static Task getTask(KaravanConfig config, String runtime) {
+    public static Task getTask(KaravanCommand config, String runtime) {
         String taskName = Constants.TASK_DEV + runtime;
         String buildImage = config.getBaseBuilderImage();
         String script = getScript(config, runtime);
@@ -78,7 +78,7 @@ public class KaravanTekton {
                 .build();
     }
 
-    private static String getScript(KaravanConfig config, String runtime) {
+    private static String getScript(KaravanCommand config, String runtime) {
         try {
             InputStream inputStream = config.isOpenShift()
                     ? KaravanTekton.class.getResourceAsStream("/" + runtime + "-builder-script-openshift.sh")
@@ -99,7 +99,7 @@ public class KaravanTekton {
         }
     }
 
-    public static Pipeline getPipeline(KaravanConfig config, String runtime) {
+    public static Pipeline getPipeline(KaravanCommand config, String runtime) {
         String taskName = Constants.TASK_DEV + runtime;
         String pipelineName = Constants.PIPELINE_DEV + runtime;
 
diff --git a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/Nexus.java b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/Nexus.java
index cb4aaecb..45c18fc4 100644
--- a/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/Nexus.java
+++ b/karavan-web/karavan-cli/src/main/java/org/apache/camel/karavan/cli/resources/Nexus.java
@@ -20,7 +20,7 @@ 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;
-import org.apache.camel.karavan.cli.KaravanConfig;
+import org.apache.camel.karavan.cli.KaravanCommand;
 
 import java.util.Map;
 
@@ -31,7 +31,7 @@ public class Nexus {
     public static final String NEXUS_DATA = "nexus-data";
     public static final int NEXUS_PORT = 8081;
 
-    public static Service getService(KaravanConfig config) {
+    public static Service getService(KaravanCommand config) {
 
         ServicePortBuilder portBuilder = new ServicePortBuilder()
                 .withPort(80)
@@ -50,7 +50,7 @@ public class Nexus {
                 .build();
     }
 
-    public static Deployment getDeployment (KaravanConfig config) {
+    public static Deployment getDeployment (KaravanCommand config) {
         return new DeploymentBuilder()
                 .withNewMetadata()
                 .withName(NEXUS_NAME)
diff --git a/karavan-web/karavan-cli/src/main/resources/infinispan-secrets.yaml b/karavan-web/karavan-cli/src/main/resources/infinispan-secrets.yaml
deleted file mode 100644
index e2c15bac..00000000
--- a/karavan-web/karavan-cli/src/main/resources/infinispan-secrets.yaml
+++ /dev/null
@@ -1,11 +0,0 @@
-apiVersion: v1
-kind: Secret
-metadata:
-  name: karavan-infinispan
-type: Opaque
-stringData:
-  username: monitor
-  password: password
-  identities-batch: |-
-    user create admin -p admin -g admin
-    user create monitor -p password --users-file metrics-users.properties --groups-file metrics-groups.properties
diff --git a/karavan-web/karavan-cli/src/main/resources/infinispan-values.yaml b/karavan-web/karavan-cli/src/main/resources/infinispan-values.yaml
deleted file mode 100644
index a59f9635..00000000
--- a/karavan-web/karavan-cli/src/main/resources/infinispan-values.yaml
+++ /dev/null
@@ -1,14 +0,0 @@
-images:
-  server: quay.io/infinispan/server:latest
-  initContainer: registry.access.redhat.com/ubi8-micro
-deploy:
-  security:
-    authentication: true
-    secretName: karavan-infinispan
-  replicas: 1
-  container:
-    storage:
-      ephemeral: true
-  expose:
-    type: NodePort
-    nodePort: 32666
\ No newline at end of file
diff --git a/karavan-web/karavan-cli/src/main/resources/infinispan.yaml b/karavan-web/karavan-cli/src/main/resources/infinispan.yaml
new file mode 100644
index 00000000..42fff892
--- /dev/null
+++ b/karavan-web/karavan-cli/src/main/resources/infinispan.yaml
@@ -0,0 +1,414 @@
+---
+# Source: infinispan/templates/secret.yaml
+apiVersion: v1
+kind: Secret
+metadata:
+  name: infinispan-generated-secret
+  labels:
+    app: infinispan-secret-identities
+    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
+  annotations:
+    meta.helm.sh/release-name: infinispan
+    meta.helm.sh/release-namespace: default
+    "helm.sh/resource-policy": keep
+type: Opaque
+stringData:
+  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
+---
+# Source: infinispan/templates/configmap.yaml
+apiVersion: v1
+kind: ConfigMap
+metadata:
+  name: infinispan-configuration
+  annotations:
+    meta.helm.sh/release-name: infinispan
+    meta.helm.sh/release-namespace: default
+  labels:
+    app: infinispan-configmap-configuration
+    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
+data:
+  infinispan.yml: |-
+    infinispan:
+      cacheContainer:
+        name: default
+        security:
+          authorization: {}
+        transport:
+          cluster: ${infinispan.cluster.name:cluster}
+          node-name: ${infinispan.node.name:}
+          stack: kubernetes
+      server:
+        endpoints:
+          - connectors:
+              hotrod:
+                hotrodConnector: null
+              rest:
+                restConnector: null
+            securityRealm: default
+            socketBinding: default
+          - connectors:
+              rest:
+                restConnector:
+                  authentication:
+                    mechanisms: BASIC
+            securityRealm: metrics
+            socketBinding: metrics
+        interfaces:
+          - inetAddress:
+              value: ${infinispan.bind.address:127.0.0.1}
+            name: public
+        security:
+          credentialStores:
+            - clearTextCredential:
+                clearText: secret
+              name: credentials
+              path: credentials.pfx
+          securityRealms:
+            - name: default
+              propertiesRealm:
+                groupProperties:
+                  path: groups.properties
+                groupsAttribute: Roles
+                userProperties:
+                  path: users.properties
+            - name: metrics
+              propertiesRealm:
+                groupProperties:
+                  path: metrics-groups.properties
+                  relativeTo: infinispan.server.config.path
+                groupsAttribute: Roles
+                userProperties:
+                  path: metrics-users.properties
+                  relativeTo: infinispan.server.config.path
+        socketBindings:
+          defaultInterface: public
+          portOffset: ${infinispan.socket.binding.port-offset:0}
+          socketBinding:
+            - name: default
+              port: 11222
+            - name: metrics
+              port: 11223
+  log4j2.xml: |-
+    <Configuration name="InfinispanServerConfig" monitorInterval="60" shutdownHook="disable">
+        <Properties>
+            <Property name="path">${sys:infinispan.server.log.path}</Property>
+            <Property name="accessLogPattern">%X{address} %X{user} [%d{dd/MMM/yyyy:HH:mm:ss Z}] &quot;%X{method} %m %X{protocol}&quot; %X{status} %X{requestSize} %X{responseSize} %X{duration}%n</Property>
+        </Properties>
+        <Appenders>
+            <!-- Colored output on the console -->
+            <Console name="STDOUT">
+                <PatternLayout pattern="%highlight{%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p (%t) [%c] %m%throwable}{INFO=normal, DEBUG=normal, TRACE=normal}%n"/>
+            </Console>
+            
+            <!-- Rolling file -->
+            <RollingFile name="FILE" createOnDemand="true"
+                         fileName="${path}/server.log"
+                         filePattern="${path}/server.log.%d{yyyy-MM-dd}-%i">
+                <Policies>
+                    <OnStartupTriggeringPolicy />
+                    <SizeBasedTriggeringPolicy size="100 MB" />
+                    <TimeBasedTriggeringPolicy />
+                </Policies>
+                <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %-5p (%t) [%c] %m%throwable%n"/>
+            </RollingFile>
+            
+            <!-- Rolling file -->
+            <RollingFile name="AUDIT-FILE" createOnDemand="true"
+                         fileName="${path}/audit.log"
+                         filePattern="${path}/audit.log.%d{yyyy-MM-dd}-%i">
+                <Policies>
+                    <OnStartupTriggeringPolicy />
+                    <SizeBasedTriggeringPolicy size="100 MB" />
+                    <TimeBasedTriggeringPolicy />
+                </Policies>
+                <PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss,SSS} %m%n"/>
+            </RollingFile>
+            
+            <!-- Rolling JSON file, disabled by default -->
+            <RollingFile name="JSON-FILE" createOnDemand="true"
+                         fileName="${path}/server.log.json"
+                         filePattern="${path}/server.log.json.%d{yyyy-MM-dd}-%i">
+                <Policies>
+                    <OnStartupTriggeringPolicy />
+                    <SizeBasedTriggeringPolicy size="100 MB" />
+                    <TimeBasedTriggeringPolicy />
+                </Policies>
+                <JsonLayout compact="true" eventEol="true" stacktraceAsString="true">
+                    <KeyValuePair key="time" value="$${date:yyyy-MM-dd'T'HH:mm:ss.SSSZ}" />
+                </JsonLayout>
+            </RollingFile>
+            
+            <!-- Rolling HotRod access log, disabled by default -->
+            <RollingFile name="HR-ACCESS-FILE" createOnDemand="true"
+                         fileName="${path}/hotrod-access.log"
+                         filePattern="${path}/hotrod-access.log.%i">
+                <Policies>
+                    <SizeBasedTriggeringPolicy size="100 MB" />
+                </Policies>
+                <PatternLayout pattern="${accessLogPattern}"/>
+            </RollingFile>
+            <!-- Rolling REST access log, disabled by default -->
+            <RollingFile name="REST-ACCESS-FILE" createOnDemand="true"
+                         fileName="${path}/rest-access.log"
+                         filePattern="${path}/rest-access.log.%i">
+                <Policies>
+                    <SizeBasedTriggeringPolicy size="100 MB" />
+                </Policies>
+                <PatternLayout pattern="${accessLogPattern}"/>
+            </RollingFile>
+        </Appenders>
+        
+        <Loggers>
+            <Root level="INFO">
+                <AppenderRef ref="STDOUT"/>
+                
+                <!-- Uncomment just one of the two lines bellow to use alternatively JSON logging or plain-text logging to file-->
+                <AppenderRef ref="FILE"/>
+                <!--      <AppenderRef ref="JSON-FILE"/>-->
+            </Root>
+            
+            <!-- Set to INFO to enable audit logging -->
+            <Logger name="org.infinispan.AUDIT" additivity="false" level="ERROR">
+                <AppenderRef ref="AUDIT-FILE"/>
+            </Logger>
+            
+            <!-- Set to TRACE to enable access logging for Hot Rod requests -->
+            <Logger name="org.infinispan.HOTROD_ACCESS_LOG" additivity="false" level="INFO">
+                <AppenderRef ref="HR-ACCESS-FILE"/>
+            </Logger>
+            
+            <!-- Set to TRACE to enable access logging for REST requests -->
+            <Logger name="org.infinispan.REST_ACCESS_LOG" additivity="false" level="INFO">
+                <AppenderRef ref="REST-ACCESS-FILE"/>
+            </Logger>
+            <Logger name="com.arjuna" level="WARN" />
+            <Logger name="io.netty.handler.ssl.ApplicationProtocolNegotiationHandler" level="ERROR" />
+        
+        </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
+metadata:
+  name: infinispan
+  annotations:
+    meta.helm.sh/release-name: infinispan
+    meta.helm.sh/release-namespace: default
+  labels:
+    app: infinispan-service
+    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
+  ports:
+    - port: 11222
+      protocol: TCP
+      name: infinispan
+  selector:
+    clusterName: infinispan
+    app: infinispan-pod
+---
+# Source: infinispan/templates/statefulset.yaml
+apiVersion: apps/v1
+kind: StatefulSet
+metadata:
+  name: infinispan
+  labels:
+    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
+  annotations:
+    meta.helm.sh/release-name: infinispan
+    meta.helm.sh/release-namespace: default
+    "openshift.io/display-name": "Infinispan Cluster"
+    "openshift.io/documentation-url": "http://infinispan.org/documentation/"
+spec:
+  serviceName: ""
+  replicas: 1
+  selector:
+    matchLabels:
+      app: infinispan-pod
+      clusterName: infinispan
+  template:
+    metadata:
+      annotations:
+        checksum/config: ca538163e78ecc00edba4e1673737254437fed9ada3bb7baf487e5c0802b3d15
+        checksum/identities: fb28be4f4f777fd60bbc48733fd8087787ba577efcb9616a64f83d1617f6106c
+      labels:
+        app: infinispan-pod
+        clusterName: infinispan
+
+    spec:
+      affinity:
+        podAntiAffinity:
+          preferredDuringSchedulingIgnoredDuringExecution:
+            - podAffinityTerm:
+                labelSelector:
+                  matchLabels:
+                    clusterName: infinispan
+                    app: infinispan-pod
+                topologyKey: kubernetes.io/hostname
+              weight: 100
+
+      containers:
+        - env:
+            - name: JAVA_OPTIONS
+              value:
+            - name: IDENTITIES_BATCH
+              value: /etc/security/identities-batch
+            - name: SERVER_LIBS
+              value:
+          image: $INFINISPAN_IMAGE
+          imagePullPolicy: Always
+          args:
+            - --cluster-name=infinispan
+            - --server-config=/etc/config/infinispan.yml
+            - --logging-config=/etc/config/log4j2.xml
+            - --bind-address=0.0.0.0
+            - -Djgroups.dns.query=infinispan-ping.default.svc.cluster.local
+          ports:
+            - containerPort: 8888
+              name: ping
+              protocol: TCP
+            - containerPort: 11222
+              name: infinispan
+              protocol: TCP
+            - containerPort: 11223
+              name: infinispan-met
+              protocol: TCP
+          livenessProbe:
+            failureThreshold: 5
+            httpGet:
+              path: rest/v2/cache-managers/default/health/status
+              port: 11222
+              scheme: HTTP
+            initialDelaySeconds: 10
+            periodSeconds: 10
+            successThreshold: 1
+            timeoutSeconds: 80
+          name: infinispan
+          readinessProbe:
+            failureThreshold: 5
+            httpGet:
+              path: rest/v2/cache-managers/default/health/status
+              port: 11222
+              scheme: HTTP
+            initialDelaySeconds: 10
+            periodSeconds: 10
+            successThreshold: 1
+            timeoutSeconds: 80
+          startupProbe:
+            failureThreshold: 60
+            httpGet:
+              path: rest/v2/cache-managers/default/health/status
+              port: 11222
+              scheme: HTTP
+            initialDelaySeconds: 10
+            periodSeconds: 10
+            successThreshold: 1
+            timeoutSeconds: 80
+          resources:
+            limits:
+              cpu: 1000m
+              memory: 1Gi
+            requests:
+              cpu: 500m
+              memory: 512Mi
+          volumeMounts:
+            - mountPath: /etc/config
+              name: config-volume
+            - mountPath: /opt/infinispan/server/data
+              name: data-volume
+            - mountPath: /etc/security
+              name: identities-volume
+      volumes:
+        - configMap:
+            name: infinispan-configuration
+          name: config-volume
+        - name: identities-volume
+          secret:
+            secretName: infinispan-generated-secret
+        - name: data-volume
+          emptyDir: { }
+  updateStrategy:
+    type: RollingUpdate