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 b290b0a3 Fix Kubernetes listeners
b290b0a3 is described below

commit b290b0a3bae365ed283b8f1e07f52cd895317b65
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Tue Nov 5 11:45:21 2024 -0500

    Fix Kubernetes listeners
---
 .../org/apache/camel/karavan/KaravanCache.java     |  4 +++
 .../camel/karavan/api/ContainerResource.java       |  2 +-
 .../karavan/kubernetes/KubernetesService.java      |  4 ++-
 .../kubernetes/KubernetesStatusService.java        | 32 ++++++++---------
 .../camel/karavan/kubernetes/PodEventHandler.java  | 21 ++++++++----
 .../karavan/scheduler/CamelStatusScheduler.java    | 40 +++++++++++-----------
 6 files changed, 57 insertions(+), 46 deletions(-)

diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanCache.java 
b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanCache.java
index 94d60d9d..66e49570 100644
--- a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanCache.java
+++ b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanCache.java
@@ -253,6 +253,10 @@ public class KaravanCache {
         return getPodContainerStatus(GroupedKey.create(projectId, env, 
containerName));
     }
 
+    public PodContainerStatus getPodContainerStatus(String containerName, 
String env) {
+        return getPodContainerStatuses(env).stream().filter(el -> 
Objects.equals(el.getContainerName(), containerName)).findFirst().orElse(null);
+    }
+
     public PodContainerStatus getPodContainerStatus(String key) {
         return podContainerStatuses.get(key);
     }
diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java 
b/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java
index 84b45ea4..aeef850a 100644
--- 
a/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java
+++ 
b/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java
@@ -70,7 +70,7 @@ public class ContainerResource {
     @Produces(MediaType.APPLICATION_JSON)
     public List<PodContainerStatus> getAllContainerStatuses() throws Exception 
{
         return karavanCache.getPodContainerStatuses().stream()
-                .sorted(Comparator.comparing(PodContainerStatus::getProjectId))
+                .sorted(Comparator.comparing(PodContainerStatus::getProjectId, 
Comparator.nullsLast(String::compareTo)))
                 .collect(Collectors.toList());
     }
 
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 8e5b5967..dd1e27df 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
@@ -175,7 +175,6 @@ public class KubernetesService {
                 .withProtocol("TCP")
                 .build();
 
-
         List<VolumeMount> volumeMounts = new ArrayList<>();
         volumeMounts.add(new 
VolumeMountBuilder().withName(BUILD_SCRIPT_VOLUME_NAME).withMountPath("/karavan/builder").withReadOnly(true).build());
         if (hasDockerConfigSecret) {
@@ -262,6 +261,9 @@ public class KubernetesService {
             list.getItems().forEach(item -> {
                 if (labels != null ) {
                     item.getMetadata().getLabels().putAll(labels);
+                    if (item instanceof Deployment deployment) {
+                        
deployment.getSpec().getTemplate().getMetadata().getLabels().putAll(labels);
+                    }
                 }
                 
client.resource(item).inNamespace(getNamespace()).serverSideApply();
             });
diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesStatusService.java
 
b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesStatusService.java
index 40cf3de9..8ed733d5 100644
--- 
a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesStatusService.java
+++ 
b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesStatusService.java
@@ -31,6 +31,7 @@ import jakarta.enterprise.inject.Default;
 import jakarta.enterprise.inject.Produces;
 import jakarta.inject.Inject;
 import org.apache.camel.karavan.KaravanConstants;
+import org.apache.camel.karavan.model.ContainerType;
 import org.apache.camel.karavan.service.ConfigService;
 import org.eclipse.microprofile.config.inject.ConfigProperty;
 import org.eclipse.microprofile.health.HealthCheck;
@@ -39,9 +40,12 @@ import org.eclipse.microprofile.health.Readiness;
 import org.jboss.logging.Logger;
 
 import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
 
-import static org.apache.camel.karavan.KaravanConstants.CAMEL_PREFIX;
+import static org.apache.camel.karavan.KaravanConstants.LABEL_TYPE;
 
 @Default
 @Readiness
@@ -91,21 +95,19 @@ public class KubernetesStatusService implements HealthCheck 
{
             stopInformers();
             LOGGER.info("Starting Kubernetes Informers");
 
-            Map<String, String> labels = getRuntimeLabels();
             KubernetesClient client = kubernetesClient();
 
-            SharedIndexInformer<Deployment> deploymentInformer = 
client.apps().deployments().inNamespace(getNamespace())
-                    .withLabels(labels).inform();
+            String[] values = new String[]{ContainerType.project.name(), 
ContainerType.build.name(), ContainerType.devmode.name(), 
ContainerType.devservice.name(), ContainerType.internal.name(),};
+
+            SharedIndexInformer<Deployment> deploymentInformer = 
client.apps().deployments().inNamespace(getNamespace()).withLabelIn(LABEL_TYPE, 
values).inform();
             deploymentInformer.addEventHandlerWithResyncPeriod(new 
DeploymentEventHandler(this, eventBus), 30 * 1000L);
             informers.add(deploymentInformer);
 
-            SharedIndexInformer<Service> serviceInformer = 
client.services().inNamespace(getNamespace())
-                    .withLabels(labels).inform();
+            SharedIndexInformer<Service> serviceInformer = 
client.services().inNamespace(getNamespace()).withLabelIn(LABEL_TYPE, 
values).inform();
             serviceInformer.addEventHandlerWithResyncPeriod(new 
ServiceEventHandler(this, eventBus), 30 * 1000L);
             informers.add(serviceInformer);
 
-            SharedIndexInformer<Pod> podRunInformer = 
client.pods().inNamespace(getNamespace())
-                    .withLabels(labels).inform();
+            SharedIndexInformer<Pod> podRunInformer = 
client.pods().inNamespace(getNamespace()).withLabelIn(LABEL_TYPE, 
values).inform();
             podRunInformer.addEventHandlerWithResyncPeriod(new 
PodEventHandler( this, eventBus), 30 * 1000L);
             informers.add(podRunInformer);
 
@@ -145,14 +147,10 @@ public class KubernetesStatusService implements 
HealthCheck {
         return namespace;
     }
 
-    private Map<String, String> getRuntimeLabels() {
-        Map<String, String> labels = new HashMap<>();
-        labels.put(isOpenshift() ? "app.openshift.io/runtime" : 
"app.kubernetes.io/runtime", CAMEL_PREFIX);
-        return labels;
-    }
-
-    public boolean isOpenshift() {
-        return isOpenShift.isPresent() && isOpenShift.get();
+    public Deployment getDeployment(String name) {
+        try (KubernetesClient client = kubernetesClient()) {
+            return 
client.apps().deployments().inNamespace(getNamespace()).withName(name).get();
+        }
     }
 
     public String getCluster() {
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 66f14503..a983b932 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
@@ -21,6 +21,7 @@ import io.fabric8.kubernetes.api.model.ContainerBuilder;
 import io.fabric8.kubernetes.api.model.Pod;
 import io.fabric8.kubernetes.api.model.Quantity;
 import io.fabric8.kubernetes.api.model.ResourceRequirements;
+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;
@@ -103,15 +104,21 @@ public class PodEventHandler implements 
ResourceEventHandler<Pod> {
 
 
     public PodContainerStatus getPodStatus(Pod pod) {
-        String deployment = pod.getMetadata().getLabels().get("app");
-        String projectId = deployment != null ? deployment : 
pod.getMetadata().getLabels().get(LABEL_PROJECT_ID);
-        String camel = deployment != null ? deployment : 
pod.getMetadata().getLabels().get(LABEL_KUBERNETES_RUNTIME);
-        String runtime = deployment != null ? deployment : 
pod.getMetadata().getLabels().get(LABEL_CAMEL_RUNTIME);
+        String appName = pod.getMetadata().getLabels().get("app");
+        String projectId = pod.getMetadata().getLabels().get(LABEL_PROJECT_ID);
+        String camel = 
pod.getMetadata().getLabels().get(LABEL_KUBERNETES_RUNTIME);
+        String runtime = 
pod.getMetadata().getLabels().get(LABEL_CAMEL_RUNTIME);
         String type = pod.getMetadata().getLabels().get(LABEL_TYPE);
         String commit = 
pod.getMetadata().getAnnotations().get(ANNOTATION_COMMIT);
-        ContainerType containerType = deployment != null
-                ? ContainerType.project
-                : (type != null ? ContainerType.valueOf(type) : 
ContainerType.unknown);
+        if (appName != null) {
+            Deployment deployment = 
kubernetesStatusService.getDeployment(appName);
+             projectId = deployment.getMetadata().getName();
+             camel = 
deployment.getMetadata().getLabels().get(LABEL_KUBERNETES_RUNTIME);
+             runtime = 
deployment.getMetadata().getLabels().get(LABEL_CAMEL_RUNTIME);
+             type = deployment.getMetadata().getLabels().get(LABEL_TYPE);
+             commit = 
deployment.getMetadata().getAnnotations().get(ANNOTATION_COMMIT);
+        }
+        ContainerType containerType = 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");
diff --git 
a/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/CamelStatusScheduler.java
 
b/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/CamelStatusScheduler.java
index 5853867f..0ab8985f 100644
--- 
a/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/CamelStatusScheduler.java
+++ 
b/karavan-app/src/main/java/org/apache/camel/karavan/scheduler/CamelStatusScheduler.java
@@ -52,25 +52,25 @@ public class CamelStatusScheduler {
     @Scheduled(every = "{karavan.camel.status.interval}", concurrentExecution 
= Scheduled.ConcurrentExecution.SKIP)
     public void collectCamelStatuses() {
         LOGGER.debug("Collect Camel Statuses");
-        if (ConfigService.inKubernetes()) {
-            karavanCache.getPodContainerStatuses(environment).stream()
-                    .filter(cs -> 
Objects.equals(cs.getLabels().get(LABEL_KUBERNETES_RUNTIME), CAMEL_PREFIX))
-                    .filter(cs -> Objects.equals(cs.getCamelRuntime(), 
KaravanConstants.CamelRuntime.CAMEL_MAIN.getValue()))
-                    .forEach(cs -> {
-                        CamelStatusRequest csr = new 
CamelStatusRequest(cs.getProjectId(), cs.getContainerName());
-                        eventBus.publish(CMD_COLLECT_CAMEL_STATUS,
-                                JsonObject.mapFrom(Map.of("containerStatus", 
cs, "camelStatusRequest", csr))
-                        );
-                    });
-        } else {
-            karavanCache.getPodContainerStatuses(environment).stream()
-                    .filter(cs -> Objects.equals(cs.getCamelRuntime(), 
KaravanConstants.CamelRuntime.CAMEL_MAIN.getValue()))
-                    .forEach(cs -> {
-                        CamelStatusRequest csr = new 
CamelStatusRequest(cs.getProjectId(), cs.getContainerName());
-                        eventBus.publish(CMD_COLLECT_CAMEL_STATUS,
-                                JsonObject.mapFrom(Map.of("containerStatus", 
cs, "camelStatusRequest", csr))
-                        );
-                    });
-        }
+         if (ConfigService.inKubernetes()) {
+             karavanCache.getPodContainerStatuses(environment).stream()
+                     .filter(cs -> 
Objects.equals(cs.getLabels().get(LABEL_KUBERNETES_RUNTIME), CAMEL_PREFIX))
+                     .filter(cs -> Objects.equals(cs.getCamelRuntime(), 
KaravanConstants.CamelRuntime.CAMEL_MAIN.getValue()))
+                     .forEach(cs -> {
+                         CamelStatusRequest csr = new 
CamelStatusRequest(cs.getProjectId(), cs.getContainerName());
+                         eventBus.publish(CMD_COLLECT_CAMEL_STATUS,
+                                 JsonObject.mapFrom(Map.of("containerStatus", 
cs, "camelStatusRequest", csr))
+                         );
+                     });
+         } else {
+             karavanCache.getPodContainerStatuses(environment).stream()
+                     .filter(cs -> Objects.equals(cs.getCamelRuntime(), 
KaravanConstants.CamelRuntime.CAMEL_MAIN.getValue()))
+                     .forEach(cs -> {
+                         CamelStatusRequest csr = new 
CamelStatusRequest(cs.getProjectId(), cs.getContainerName());
+                         eventBus.publish(CMD_COLLECT_CAMEL_STATUS,
+                                 JsonObject.mapFrom(Map.of("containerStatus", 
cs, "camelStatusRequest", csr))
+                         );
+                     });
+         }
     }
 }
\ No newline at end of file

Reply via email to