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