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);