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

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


The following commit(s) were added to refs/heads/main by this push:
     new 0717688c Project build image
0717688c is described below

commit 0717688cc605035a6b3f95910d9891fab9562576
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Mon Jun 10 10:46:22 2024 -0400

    Project build image
---
 .../org/apache/camel/karavan/KaravanConstants.java     |  2 ++
 .../apache/camel/karavan/docker/DockerForKaravan.java  | 13 +++++++------
 .../camel/karavan/kubernetes/KubernetesService.java    | 18 +++++++++++-------
 .../org/apache/camel/karavan/service/CodeService.java  | 17 ++++++++++++++++-
 .../apache/camel/karavan/service/ProjectService.java   |  7 ++++---
 5 files changed, 40 insertions(+), 17 deletions(-)

diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanConstants.java 
b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanConstants.java
index cf0de596..f0a250e5 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanConstants.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanConstants.java
@@ -19,6 +19,8 @@ package org.apache.camel.karavan;
 public class KaravanConstants {
 
     public static final String DEV_ENVIRONMENT = "dev";
+    public static final String DEVMODE_IMAGE = "karavan.devmode.image";
+    public static final String DEVMODE_IMAGE_PULL_POLICY = 
"karavan.devmode.withImagePullPolicy";
     public static final String ENV_VAR_JBANG_OPTIONS = "JBANG_OPTIONS";
 
     public static final String LABEL_PART_OF = "app.kubernetes.io/part-of";
diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java
 
b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java
index 2b5f0445..1489a43c 100644
--- 
a/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java
+++ 
b/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java
@@ -39,7 +39,7 @@ public class DockerForKaravan {
 
     private static final Logger LOGGER = 
Logger.getLogger(DockerForKaravan.class.getName());
 
-    @ConfigProperty(name = "karavan.devmode.image")
+    @ConfigProperty(name = DEVMODE_IMAGE)
     String devmodeImage;
 
     @Inject
@@ -49,13 +49,14 @@ public class DockerForKaravan {
     ProjectService projectService;
 
     public void runProjectInDevMode(String projectId, String jBangOptions, 
Map<Integer, Integer> ports,
-                                    Map<String, String> files) throws 
Exception {
-        Container c = createDevmodeContainer(projectId, jBangOptions, ports, 
new HashMap<>());
+                                    Map<String, String> files, String 
projectDevmodeImage) throws Exception {
+        Container c = createDevmodeContainer(projectId, jBangOptions, ports, 
new HashMap<>(), projectDevmodeImage);
         dockerService.runContainer(projectId);
         dockerService.copyFiles(c.getId(), "/karavan/code", files, true);
     }
 
-    protected Container createDevmodeContainer(String projectId, String 
jBangOptions, Map<Integer, Integer> ports, Map<String, String> volumes) throws 
InterruptedException {
+    protected Container createDevmodeContainer(String projectId, String 
jBangOptions, Map<Integer, Integer> ports,
+                                               Map<String, String> volumes, 
String projectDevmodeImage) throws InterruptedException {
         LOGGER.infof("DevMode starting for %s with JBANG_OPTIONS=%s", 
projectId, jBangOptions);
 
         HealthCheck healthCheck = new HealthCheck().withTest(List.of("CMD", 
"curl", "-f", "http://localhost:8080/q/dev/health";))
@@ -67,7 +68,8 @@ public class DockerForKaravan {
 
         DockerComposeService composeService = 
projectService.getProjectDockerComposeService(projectId);
 
-        return dockerService.createContainer(projectId, devmodeImage,
+        return dockerService.createContainer(projectId,
+                (projectDevmodeImage != null ? projectDevmodeImage : 
devmodeImage),
                 env, ports, healthCheck,
                 Map.of(LABEL_TYPE, 
PodContainerStatus.ContainerType.devmode.name(),
                         LABEL_PROJECT_ID, projectId,
@@ -75,7 +77,6 @@ public class DockerForKaravan {
                 ),
                 volumes, null, RestartPolicy.noRestart(), false,
                 composeService.getCpus(), composeService.getCpu_percent(), 
composeService.getMem_limit(), composeService.getMem_reservation());
-
     }
 
     public void runBuildProject(Project project, String script, List<String> 
env, Map<String, String> sshFiles, String tag) throws Exception {
diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java
 
b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java
index 8c325a49..0339262f 100644
--- 
a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java
+++ 
b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java
@@ -61,9 +61,12 @@ public class KubernetesService {
     @ConfigProperty(name = "karavan.environment")
     public String environment;
 
-    @ConfigProperty(name = "karavan.devmode.image")
+    @ConfigProperty(name = DEVMODE_IMAGE)
     public String devmodeImage;
 
+    @ConfigProperty(name = DEVMODE_IMAGE_PULL_POLICY, defaultValue = 
"IfNotPresent")
+    public Optional<String> devmodeImagePullPolicy;
+
     @ConfigProperty(name = "karavan.devmode.service.account")
     public String devModeServiceAccount;
 
@@ -208,7 +211,7 @@ public class KubernetesService {
                 .withName(name)
                 .withImage(devmodeImage)
                 .withPorts(port)
-                .withImagePullPolicy("Always")
+                
.withImagePullPolicy(devmodeImagePullPolicy.orElse("IfNotPresent"))
                 .withEnv(envVars)
                 .withCommand("/bin/sh", "-c", "/karavan/builder/build.sh")
                 .withVolumeMounts(volumeMounts)
@@ -336,7 +339,7 @@ public class KubernetesService {
         return result;
     }
 
-    public void runDevModeContainer(Project project, String jBangOptions, 
Map<String, String> files) {
+    public void runDevModeContainer(Project project, String jBangOptions, 
Map<String, String> files, String projectDevmodeImage) {
         String name = project.getProjectId();
         Map<String, String> labels = getLabels(name, project, 
PodContainerStatus.ContainerType.devmode);
 
@@ -347,7 +350,7 @@ public class KubernetesService {
             Pod old = 
client.pods().inNamespace(getNamespace()).withName(name).get();
             if (old == null) {
                 Map<String, String> containerResources = 
CodeService.DEFAULT_CONTAINER_RESOURCES;
-                Pod pod = getDevModePod(name, jBangOptions, 
containerResources, labels);
+                Pod pod = getDevModePod(name, jBangOptions, 
containerResources, labels, projectDevmodeImage);
                 Pod result = client.resource(pod).createOrReplace();
                 copyFilesToContainer(result, files, "/karavan/code");
                 LOGGER.info("Created pod " + result.getMetadata().getName());
@@ -390,7 +393,8 @@ public class KubernetesService {
                 .build();
     }
 
-    private Pod getDevModePod(String name, String jbangOptions, Map<String, 
String> containerResources, Map<String, String> labels) {
+    private Pod getDevModePod(String name, String jbangOptions, Map<String, 
String> containerResources,
+                              Map<String, String> labels, String 
projectDevmodeImage) {
         ResourceRequirements resources = 
getResourceRequirements(containerResources);
 
         ObjectMeta meta = new ObjectMetaBuilder()
@@ -407,10 +411,10 @@ public class KubernetesService {
 
         Container container = new ContainerBuilder()
                 .withName(name)
-                .withImage(devmodeImage)
+                .withImage(projectDevmodeImage != null ? projectDevmodeImage : 
devmodeImage)
                 .withPorts(port)
                 .withResources(resources)
-                .withImagePullPolicy("IfNotPresent")
+                
.withImagePullPolicy(devmodeImagePullPolicy.orElse("IfNotPresent"))
                 .withEnv(new 
EnvVarBuilder().withName(ENV_VAR_JBANG_OPTIONS).withValue(jbangOptions).build())
                 .build();
 
diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java 
b/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java
index 52ed09a0..6959585d 100644
--- 
a/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java
+++ 
b/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java
@@ -41,6 +41,7 @@ import java.time.Instant;
 import java.util.*;
 import java.util.stream.Collectors;
 
+import static org.apache.camel.karavan.KaravanConstants.DEVMODE_IMAGE;
 import static org.apache.camel.karavan.KaravanConstants.DEV_ENVIRONMENT;
 
 @ApplicationScoped
@@ -80,6 +81,20 @@ public class CodeService {
             "limits.cpu", "2000m"
     );
 
+    public String getProjectDevModeImage(String projectId) {
+        try {
+            ProjectFile appProp = getApplicationProperties(projectId);
+            return getPropertyValue(appProp.getCode(), DEVMODE_IMAGE);
+        } catch (Exception e) {
+            LOGGER.error("getProjectDevModeImage " + (e.getCause() != null ? 
e.getCause().getMessage() : e.getMessage()));
+            return null;
+        }
+    }
+
+    private ProjectFile getApplicationProperties(String projectId) {
+        return karavanCache.getProjectFile(projectId, 
APPLICATION_PROPERTIES_FILENAME);
+    }
+
     public Map<String, String> getProjectFilesForDevMode(String projectId, 
Boolean withKamelets) {
         Map<String, String> files = 
karavanCache.getProjectFiles(projectId).stream()
                 .filter(f -> !f.getName().endsWith(MARKDOWN_EXTENSION))
@@ -114,7 +129,7 @@ public class CodeService {
         return result;
     }
 
-    public ProjectFile getApplicationProperties(Project project) {
+    public ProjectFile generateApplicationProperties(Project project) {
         String code = getTemplateText(APPLICATION_PROPERTIES_FILENAME);
         if (code != null) {
             code = code.replace("{projectId}", project.getProjectId());
diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
 
b/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
index bc42e4ca..1f0e7cd4 100644
--- 
a/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
+++ 
b/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java
@@ -97,11 +97,12 @@ public class ProjectService {
             eventBus.publish(POD_CONTAINER_UPDATED, 
JsonObject.mapFrom(status));
 
             Map<String, String> files = 
codeService.getProjectFilesForDevMode(project.getProjectId(), true);
+            String projectDevmodeImage = 
codeService.getProjectDevModeImage(project.getProjectId());
             if (ConfigService.inKubernetes()) {
-                kubernetesService.runDevModeContainer(project, jBangOptions, 
files);
+                kubernetesService.runDevModeContainer(project, jBangOptions, 
files, projectDevmodeImage);
             } else {
                 DockerComposeService dcs = 
codeService.getDockerComposeService(project.getProjectId());
-                dockerForKaravan.runProjectInDevMode(project.getProjectId(), 
jBangOptions, dcs.getPortsMap(), files);
+                dockerForKaravan.runProjectInDevMode(project.getProjectId(), 
jBangOptions, dcs.getPortsMap(), files, projectDevmodeImage);
             }
             return containerName;
         } else {
@@ -237,7 +238,7 @@ public class ProjectService {
             throw new Exception("Project with id " + project.getProjectId() + 
" already exists");
         } else {
             karavanCache.saveProject(project);
-            ProjectFile appProp = 
codeService.getApplicationProperties(project);
+            ProjectFile appProp = 
codeService.generateApplicationProperties(project);
             karavanCache.saveProjectFile(appProp, false);
             if (!ConfigService.inKubernetes()) {
                 ProjectFile projectCompose = 
codeService.createInitialProjectCompose(project, getMaxPortMappedInProjects() + 
1);

Reply via email to