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 2382e1dff571d1467351b21bfc5c8bd5a8c49215 Author: Marat Gubaidullin <ma...@talismancloud.io> AuthorDate: Thu Oct 24 09:02:17 2024 -0400 Container Type Improvements --- .../karavan/kubernetes/DeploymentEventHandler.java | 18 ++++++---- .../camel/karavan/kubernetes/PodEventHandler.java | 12 ++++--- .../karavan/kubernetes/ServiceEventHandler.java | 6 ++-- .../listener/PodContainerCommandListener.java | 5 +-- .../apache/camel/karavan/model/ContainerType.java | 27 +++++++++++++++ .../camel/karavan/model/DeploymentStatus.java | 14 ++++++-- .../camel/karavan/model/PodContainerStatus.java | 40 +++++++++++++--------- .../apache/camel/karavan/service/CodeService.java | 22 +++++++++--- 8 files changed, 103 insertions(+), 41 deletions(-) diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/DeploymentEventHandler.java b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/DeploymentEventHandler.java index 73109714..8773d84c 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/DeploymentEventHandler.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/DeploymentEventHandler.java @@ -21,9 +21,11 @@ import io.fabric8.kubernetes.api.model.apps.Deployment; import io.fabric8.kubernetes.client.informers.ResourceEventHandler; import io.vertx.core.json.JsonObject; import io.vertx.mutiny.core.eventbus.EventBus; +import org.apache.camel.karavan.model.ContainerType; import org.apache.camel.karavan.model.DeploymentStatus; import org.jboss.logging.Logger; +import static org.apache.camel.karavan.KaravanConstants.LABEL_TYPE; import static org.apache.camel.karavan.KaravanEvents.DEPLOYMENT_DELETED; import static org.apache.camel.karavan.KaravanEvents.DEPLOYMENT_UPDATED; @@ -68,7 +70,7 @@ public class DeploymentEventHandler implements ResourceEventHandler<Deployment> deployment.getMetadata().getName(), deployment.getMetadata().getNamespace(), kubernetesStatusService.getCluster(), - kubernetesStatusService.environment); + kubernetesStatusService.getEnvironment()); eventBus.publish(DEPLOYMENT_DELETED, JsonObject.mapFrom(ds)); } catch (Exception e){ LOGGER.error(e.getMessage()); @@ -77,20 +79,22 @@ public class DeploymentEventHandler implements ResourceEventHandler<Deployment> public DeploymentStatus getDeploymentStatus(Deployment deployment) { try { - String dsImage = deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getImage(); - String imageName = dsImage.startsWith("image-registry.openshift-image-registry.svc") + var dsImage = deployment.getSpec().getTemplate().getSpec().getContainers().get(0).getImage(); + var imageName = dsImage.startsWith("image-registry.openshift-image-registry.svc") ? dsImage.replace("image-registry.openshift-image-registry.svc:5000/", "") : dsImage; - + var typeLabel = deployment.getMetadata().getLabels().get(LABEL_TYPE); + var type = typeLabel != null ? ContainerType.valueOf(typeLabel) : ContainerType.unknown; return new DeploymentStatus( deployment.getMetadata().getName(), deployment.getMetadata().getNamespace(), kubernetesStatusService.getCluster(), - kubernetesStatusService.environment, + kubernetesStatusService.getEnvironment(), imageName, deployment.getSpec().getReplicas(), deployment.getStatus().getReadyReplicas(), - deployment.getStatus().getUnavailableReplicas() + deployment.getStatus().getUnavailableReplicas(), + type ); } catch (Exception ex) { LOGGER.error(ex.getMessage()); @@ -98,7 +102,7 @@ public class DeploymentEventHandler implements ResourceEventHandler<Deployment> deployment.getMetadata().getName(), deployment.getMetadata().getNamespace(), kubernetesStatusService.getCluster(), - kubernetesStatusService.environment); + kubernetesStatusService.getEnvironment()); } } } \ No newline at end of file diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java index 5571a512..66f14503 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java @@ -24,6 +24,7 @@ import io.fabric8.kubernetes.api.model.ResourceRequirements; import io.fabric8.kubernetes.client.informers.ResourceEventHandler; import io.vertx.core.json.JsonObject; import io.vertx.mutiny.core.eventbus.EventBus; +import org.apache.camel.karavan.model.ContainerType; import org.apache.camel.karavan.model.PodContainerStatus; import org.jboss.logging.Logger; @@ -92,7 +93,7 @@ public class PodEventHandler implements ResourceEventHandler<Pod> { PodContainerStatus cs = new PodContainerStatus(); cs.setProjectId(projectId); cs.setContainerName(pod.getMetadata().getName()); - cs.setEnv(kubernetesStatusService.environment); + cs.setEnv(kubernetesStatusService.getEnvironment()); eventBus.publish(POD_CONTAINER_DELETED, JsonObject.mapFrom(cs)); } catch (Exception e) { @@ -108,9 +109,9 @@ public class PodEventHandler implements ResourceEventHandler<Pod> { String runtime = deployment != null ? deployment : pod.getMetadata().getLabels().get(LABEL_CAMEL_RUNTIME); String type = pod.getMetadata().getLabels().get(LABEL_TYPE); String commit = pod.getMetadata().getAnnotations().get(ANNOTATION_COMMIT); - PodContainerStatus.ContainerType containerType = deployment != null - ? PodContainerStatus.ContainerType.project - : (type != null ? PodContainerStatus.ContainerType.valueOf(type) : PodContainerStatus.ContainerType.unknown); + ContainerType containerType = deployment != null + ? ContainerType.project + : (type != null ? ContainerType.valueOf(type) : ContainerType.unknown); try { boolean ready = pod.getStatus().getConditions().stream().anyMatch(c -> c.getType().equals("Ready") && c.getStatus().equals("True")); boolean running = Objects.equals(pod.getStatus().getPhase(), "Running"); @@ -130,11 +131,12 @@ public class PodEventHandler implements ResourceEventHandler<Pod> { pod.getMetadata().getName(), List.of(PodContainerStatus.Command.delete), projectId, - kubernetesStatusService.environment, + kubernetesStatusService.getEnvironment(), containerType, requestMemory + " / " + limitMemory, requestCpu + " / " + limitCpu, creationTimestamp); + status.setLabels(pod.getMetadata().getLabels()); status.setImage(pod.getSpec().getContainers().get(0).getImage()); status.setCommit(commit); status.setContainerId(pod.getMetadata().getName()); diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/ServiceEventHandler.java b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/ServiceEventHandler.java index 3a67c84a..c00c2e14 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/ServiceEventHandler.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/ServiceEventHandler.java @@ -68,7 +68,7 @@ public class ServiceEventHandler implements ResourceEventHandler<Service> { service.getMetadata().getName(), service.getMetadata().getNamespace(), kubernetesStatusService.getCluster(), - kubernetesStatusService.environment); + kubernetesStatusService.getEnvironment()); eventBus.publish(SERVICE_DELETED, JsonObject.mapFrom(ds)); } catch (Exception e){ LOGGER.error(e.getMessage()); @@ -80,7 +80,7 @@ public class ServiceEventHandler implements ResourceEventHandler<Service> { return new ServiceStatus( service.getMetadata().getName(), service.getMetadata().getNamespace(), - kubernetesStatusService.environment, + kubernetesStatusService.getEnvironment(), kubernetesStatusService.getCluster(), service.getSpec().getPorts().get(0).getPort(), service.getSpec().getPorts().get(0).getTargetPort().getIntVal(), @@ -93,7 +93,7 @@ public class ServiceEventHandler implements ResourceEventHandler<Service> { service.getMetadata().getName(), service.getMetadata().getNamespace(), kubernetesStatusService.getCluster(), - kubernetesStatusService.environment); + kubernetesStatusService.getEnvironment()); } } } \ No newline at end of file diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/listener/PodContainerCommandListener.java b/karavan-app/src/main/java/org/apache/camel/karavan/listener/PodContainerCommandListener.java index 1c7873b9..78502210 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/listener/PodContainerCommandListener.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/listener/PodContainerCommandListener.java @@ -26,6 +26,7 @@ import org.apache.camel.karavan.KaravanCache; import org.apache.camel.karavan.KaravanConstants; import org.apache.camel.karavan.docker.DockerService; import org.apache.camel.karavan.kubernetes.KubernetesService; +import org.apache.camel.karavan.model.ContainerType; import org.apache.camel.karavan.model.PodContainerStatus; import org.apache.camel.karavan.service.ConfigService; import org.eclipse.microprofile.config.inject.ConfigProperty; @@ -53,7 +54,7 @@ public class PodContainerCommandListener { @ConsumeEvent(value = CMD_DELETE_CONTAINER, blocking = true) public void deletePodContainer(String projectId) { - setContainerStatusTransit(projectId, PodContainerStatus.ContainerType.devmode.name()); + setContainerStatusTransit(projectId, ContainerType.devmode.name()); if (ConfigService.inKubernetes()) { kubernetesService.deletePodAndService(projectId, false); } else { @@ -64,7 +65,7 @@ public class PodContainerCommandListener { private void setContainerStatusTransit(String name, String type) { PodContainerStatus status = karavanCache.getPodContainerStatus(name, environment, name); if (status == null) { - status = PodContainerStatus.createByType(name, environment, PodContainerStatus.ContainerType.valueOf(type)); + status = PodContainerStatus.createByType(name, environment, ContainerType.valueOf(type)); } status.setInTransit(true); eventBus.publish(POD_CONTAINER_UPDATED, JsonObject.mapFrom(status)); diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/ContainerType.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/ContainerType.java new file mode 100644 index 00000000..7b315b69 --- /dev/null +++ b/karavan-app/src/main/java/org/apache/camel/karavan/model/ContainerType.java @@ -0,0 +1,27 @@ +/* + * 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.model; + +public enum ContainerType { + internal, + devmode, + devservice, + project, + build, + unknown, +} diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/DeploymentStatus.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/DeploymentStatus.java index aaa41263..0bcf6a3c 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/model/DeploymentStatus.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/model/DeploymentStatus.java @@ -27,6 +27,7 @@ public class DeploymentStatus { Integer replicas; Integer readyReplicas; Integer unavailableReplicas; + ContainerType type; public DeploymentStatus() { } @@ -42,7 +43,7 @@ public class DeploymentStatus { this.unavailableReplicas = 0; } - public DeploymentStatus(String projectId, String namespace, String cluster, String env, String image, Integer replicas, Integer readyReplicas, Integer unavailableReplicas) { + public DeploymentStatus(String projectId, String namespace, String cluster, String env, String image, Integer replicas, Integer readyReplicas, Integer unavailableReplicas, ContainerType type) { this.projectId = projectId; this.namespace = namespace; this.env = env; @@ -51,6 +52,7 @@ public class DeploymentStatus { this.replicas = replicas; this.readyReplicas = readyReplicas; this.unavailableReplicas = unavailableReplicas; + this.type = type; } public String getProjectId() { @@ -117,7 +119,15 @@ public class DeploymentStatus { this.cluster = cluster; } + public ContainerType getType() { + return type; + } + + public void setType(ContainerType type) { + this.type = type; + } + public DeploymentStatus copy() { - return new DeploymentStatus(projectId, namespace, cluster, env, image, replicas, readyReplicas, unavailableReplicas); + return new DeploymentStatus(projectId, namespace, cluster, env, image, replicas, readyReplicas, unavailableReplicas, type); } } diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/PodContainerStatus.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/PodContainerStatus.java index 6d5422f3..6fa8ffa4 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/model/PodContainerStatus.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/model/PodContainerStatus.java @@ -18,7 +18,9 @@ package org.apache.camel.karavan.model; import java.time.Instant; +import java.util.HashMap; import java.util.List; +import java.util.Map; public class PodContainerStatus { @@ -31,15 +33,6 @@ public class PodContainerStatus { dead } - public enum ContainerType { - internal, - devmode, - devservice, - project, - build, - unknown, - } - public enum Command { run, pause, @@ -67,8 +60,9 @@ public class PodContainerStatus { String podIP; String camelRuntime; String commit; + Map<String, String> labels; - public PodContainerStatus(String projectId, String containerName, String containerId, String image, List<ContainerPort> ports, String env, ContainerType type, String memoryInfo, String cpuInfo, String created, String finished, List<Command> commands, String state, String phase, Boolean codeLoaded, Boolean inTransit, String initDate, String podIP, String camelRuntime, String commit) { + public PodContainerStatus(String projectId, String containerName, String containerId, String image, List<ContainerPort> ports, String env, ContainerType type, String memoryInfo, String cpuInfo, String created, String finished, List<Command> commands, String state, String phase, Boolean codeLoaded, Boolean inTransit, String initDate, String podIP, String camelRuntime, String commit, Map<String, String> labels) { this.projectId = projectId; this.containerName = containerName; this.containerId = containerId; @@ -89,6 +83,7 @@ public class PodContainerStatus { this.podIP = podIP; this.camelRuntime = camelRuntime; this.commit = commit; + this.labels = labels; } public PodContainerStatus(String projectId, String containerName, String containerId, String image, List<ContainerPort> ports, String env, ContainerType type, String memoryInfo, String cpuInfo, String created, String finished, List<Command> commands, String state, String phase, Boolean codeLoaded, Boolean inTransit, String initDate, String podIP, String camelRuntime) { @@ -113,7 +108,7 @@ public class PodContainerStatus { this.camelRuntime = camelRuntime; } - public PodContainerStatus(String projectId, String containerName, String containerId, String image, List<ContainerPort> ports, String env, ContainerType type, String memoryInfo, String cpuInfo, String created, String finished, List<Command> commands, String state, String phase, Boolean codeLoaded, Boolean inTransit, String initDate) { + public PodContainerStatus(String projectId, String containerName, String containerId, String image, List<ContainerPort> ports, String env, ContainerType type, String memoryInfo, String cpuInfo, String created, String finished, List<Command> commands, String state, String phase, Boolean codeLoaded, Boolean inTransit, String initDate, Map<String, String> labels) { this.projectId = projectId; this.containerName = containerName; this.containerId = containerId; @@ -131,9 +126,10 @@ public class PodContainerStatus { this.codeLoaded = codeLoaded; this.inTransit = inTransit; this.initDate = initDate; + this.labels = labels; } - public PodContainerStatus(String projectId, String containerName, String containerId, String image, List<ContainerPort> ports, String env, ContainerType type, String memoryInfo, String cpuInfo, String created, String finished, List<Command> commands, String state, Boolean codeLoaded, Boolean inTransit, String camelRuntime) { + public PodContainerStatus(String projectId, String containerName, String containerId, String image, List<ContainerPort> ports, String env, ContainerType type, String memoryInfo, String cpuInfo, String created, String finished, List<Command> commands, String state, Boolean codeLoaded, Boolean inTransit, String camelRuntime, Map<String, String> labels) { this.projectId = projectId; this.containerName = containerName; this.containerId = containerId; @@ -151,6 +147,7 @@ public class PodContainerStatus { this.camelRuntime = camelRuntime; this.inTransit = inTransit; this.initDate = Instant.now().toString(); + this.labels = labels; } public PodContainerStatus(String containerName, List<Command> commands, String projectId, String env, ContainerType type, String memoryInfo, String cpuInfo, String created) { @@ -176,16 +173,16 @@ public class PodContainerStatus { } public static PodContainerStatus createDevMode(String projectId, String env) { - return new PodContainerStatus(projectId, projectId, null, null, null, env, ContainerType.devmode, null, null, null, null, List.of(Command.run), null, false, false, ""); + return new PodContainerStatus(projectId, projectId, null, null, null, env, ContainerType.devmode, null, null, null, null, List.of(Command.run), null, false, false, "", new HashMap<>()); } public static PodContainerStatus createByType(String name, String env, ContainerType type) { - return new PodContainerStatus(name, name, null, null, null, env, type, null, null, null, null, List.of(Command.run), null, false, false, ""); + return new PodContainerStatus(name, name, null, null, null, env, type, null, null, null, null, List.of(Command.run), null, false, false, "", new HashMap<>()); } - public static PodContainerStatus createWithId(String projectId, String containerName, String env, String containerId, String image, List<ContainerPort> ports, ContainerType type, List<Command> commands, String status, String created, String camelRuntime) { + public static PodContainerStatus createWithId(String projectId, String containerName, String env, String containerId, String image, List<ContainerPort> ports, ContainerType type, List<Command> commands, String status, String created, String camelRuntime, Map<String, String> labels) { return new PodContainerStatus(projectId, containerName, containerId, image, ports, env, type, - null, null, created, null, commands, status, false, false, camelRuntime); + null, null, created, null, commands, status, false, false, camelRuntime, labels); } public PodContainerStatus() { @@ -193,7 +190,7 @@ public class PodContainerStatus { public PodContainerStatus copy() { return new PodContainerStatus( - projectId, containerName, containerId, image, ports, env, type, memoryInfo, cpuInfo, created, finished, commands, state, phase, codeLoaded, inTransit, initDate, podIP, camelRuntime, commit + projectId, containerName, containerId, image, ports, env, type, memoryInfo, cpuInfo, created, finished, commands, state, phase, codeLoaded, inTransit, initDate, podIP, camelRuntime, commit, labels ); } @@ -357,6 +354,14 @@ public class PodContainerStatus { this.commit = commit; } + public Map<String, String> getLabels() { + return labels; + } + + public void setLabels(Map<String, String> labels) { + this.labels = labels; + } + @Override public String toString() { return "ContainerStatus{" + @@ -379,6 +384,7 @@ public class PodContainerStatus { ", initDate='" + initDate + '\'' + ", podIP='" + podIP + '\'' + ", commit='" + commit + '\'' + + ", labels='" + labels + '\'' + '}'; } } 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 5d1a5bbf..403a502b 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 @@ -55,13 +55,14 @@ public class CodeService { public static final String PROPERTY_PROJECT_NAME = "camel.karavan.projectName"; public static final String PROPERTY_PROJECT_NAME_OLD = "camel.karavan.project-name"; public static final String BEAN_TEMPLATE_SUFFIX_FILENAME = "-bean-template.camel.yaml"; - public static final String DEV_SERVICES_FILENAME = "devservices.docker-compose.yaml"; + public static final String DEV_SERVICES_FILENAME = "docker-compose.yaml"; public static final String PROJECT_COMPOSE_FILENAME = "docker-compose.yaml"; public static final String MARKDOWN_EXTENSION = ".md"; public static final String PROJECT_JKUBE_EXTENSION = ".jkube.yaml"; public static final String PROJECT_DEPLOYMENT_JKUBE_FILENAME = "deployment" + PROJECT_JKUBE_EXTENSION; private static final String TEMPLATES_PATH = "/templates"; private static final String CONFIGURATION_PATH = "/configuration"; + private static final String SERVICES_PATH = "/services"; private static final String DOCKER_FOLDER = "/docker/"; private static final String KUBERNETES_FOLDER = "/kubernetes/"; public static final int INTERNAL_PORT = 8080; @@ -204,10 +205,6 @@ public class CodeService { return null; } - public List<String> getBeanTemplateNames(){ - return beansTemplates.stream().map(name -> name + BEAN_TEMPLATE_SUFFIX_FILENAME).toList(); - } - public Map<String, String> getTemplates() { Map<String, String> result = new HashMap<>(); @@ -238,6 +235,21 @@ public class CodeService { return result; } + public Map<String, String> getDevServicesFiles() { + Map<String, String> result = new HashMap<>(); + + var path = SERVICES_PATH + (ConfigService.inKubernetes() ? KUBERNETES_FOLDER : DOCKER_FOLDER); + + listResources(path).forEach(filename -> { + String templatePath = path + filename; + String templateText = getResourceFile(templatePath); + if (templateText != null) { + result.put(filename, templateText); + } + }); + return result; + } + public List<String> getTemplatesList() { var path = TEMPLATES_PATH + (ConfigService.inKubernetes() ? KUBERNETES_FOLDER : DOCKER_FOLDER); return listResources(path);