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 <[email protected]>
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