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 7a6bb5bc96cda3b0567c2c8a45ff7e5bb4e88db2 Author: Marat Gubaidullin <marat.gubaidul...@gmail.com> AuthorDate: Thu Oct 27 10:10:49 2022 -0400 Fix #501 --- .../camel/karavan/api/KubernetesResource.java | 16 +++- .../camel/karavan/model/DeploymentStatus.java | 1 + .../org/apache/camel/karavan/model/PodStatus.java | 42 +++++++---- .../camel/karavan/service/InfinispanService.java | 40 +++++++++- .../camel/karavan/service/KaravanService.java | 9 ++- .../camel/karavan/service/KubernetesService.java | 85 +++++++++------------- ...entWatcher.java => DeploymentEventHandler.java} | 63 +++++++++------- ...unWatcher.java => PipelineRunEventHandler.java} | 65 ++++++++++++----- .../camel/karavan/watcher/PodEventHandler.java | 84 +++++++++++++++++++++ .../apache/camel/karavan/watcher/PodWatcher.java | 40 ---------- 10 files changed, 287 insertions(+), 158 deletions(-) diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/KubernetesResource.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/KubernetesResource.java index a817434..c79fc51 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/api/KubernetesResource.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/KubernetesResource.java @@ -20,6 +20,7 @@ import io.smallrye.mutiny.Multi; import io.vertx.mutiny.core.eventbus.EventBus; import io.vertx.mutiny.core.eventbus.Message; import org.apache.camel.karavan.model.DeploymentStatus; +import org.apache.camel.karavan.model.PodStatus; import org.apache.camel.karavan.model.Project; import org.apache.camel.karavan.service.InfinispanService; import org.apache.camel.karavan.service.KubernetesService; @@ -99,9 +100,9 @@ public class KubernetesResource { @GET @Produces(MediaType.APPLICATION_JSON) - @Path("/deployment/") - public List<DeploymentStatus> getAll() throws Exception { - return infinispanService.getDeploymentStatuses().stream() + @Path("/deployment/{env}") + public List<DeploymentStatus> getDeploymentStatusesByEnv(@PathParam("env") String env) throws Exception { + return infinispanService.getDeploymentStatuses(env).stream() .sorted(Comparator.comparing(DeploymentStatus::getName)) .collect(Collectors.toList()); } @@ -127,6 +128,15 @@ public class KubernetesResource { return Response.ok().build(); } + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("/pod/{env}") + public List<PodStatus> getPodStatusesByEnv(@PathParam("env") String env) throws Exception { + return infinispanService.getPodStatuses(env).stream() + .sorted(Comparator.comparing(PodStatus::getName)) + .collect(Collectors.toList()); + } + @DELETE @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) 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 c366be1..f0baa9e 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 @@ -1,5 +1,6 @@ package org.apache.camel.karavan.model; +import org.infinispan.protostream.annotations.ProtoDoc; import org.infinispan.protostream.annotations.ProtoFactory; import org.infinispan.protostream.annotations.ProtoField; diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/PodStatus.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/PodStatus.java index 8c70909..e24f9ea 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/model/PodStatus.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/model/PodStatus.java @@ -8,29 +8,33 @@ public class PodStatus { @ProtoField(number = 1) String name; @ProtoField(number = 2) - Boolean started; + String phase; @ProtoField(number = 3) - Boolean ready; + Boolean initialized; @ProtoField(number = 4) - String reason; + Boolean ready; @ProtoField(number = 5) - String deployment; + String reason; @ProtoField(number = 6) + String deployment; + @ProtoField(number = 7) String env; - public PodStatus(String env) { - this.name = ""; - this.started = false; + public PodStatus(String name, String deployment, String env) { + this.name = name; + this.phase = ""; + this.initialized = false; this.ready = false; this.reason = ""; - this.deployment = ""; - this.env = ""; + this.deployment = deployment; + this.env = env; } @ProtoFactory - public PodStatus(String name, Boolean started, Boolean ready, String reason, String deployment, String env) { + public PodStatus(String name, String phase, Boolean initialized, Boolean ready, String reason, String deployment, String env) { this.name = name; - this.started = started; + this.phase = phase; + this.initialized = initialized; this.ready = ready; this.reason = reason; this.deployment = deployment; @@ -45,12 +49,20 @@ public class PodStatus { this.name = name; } - public Boolean getStarted() { - return started; + public String getPhase() { + return phase; + } + + public void setPhase(String phase) { + this.phase = phase; + } + + public Boolean getInitialized() { + return initialized; } - public void setStarted(Boolean started) { - this.started = started; + public void setInitialized(Boolean initialized) { + this.initialized = initialized; } public Boolean getReady() { diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/InfinispanService.java b/karavan-app/src/main/java/org/apache/camel/karavan/service/InfinispanService.java index 9a0fd03..3fddb8f 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/service/InfinispanService.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/service/InfinispanService.java @@ -97,6 +97,8 @@ public class InfinispanService { podStatuses = cacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(PodStatus.CACHE, builder.build()); camelStatuses = cacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(CamelStatus.CACHE, builder.build()); kamelets = cacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(Kamelet.CACHE, builder.build()); + + cleanStatuses(); } else { LOGGER.info("InfinispanService is starting in remote mode"); environments = cacheManager.administration().getOrCreateCache(Environment.CACHE, new XMLStringConfiguration(String.format(CACHE_CONFIG, Environment.CACHE))); @@ -110,6 +112,13 @@ public class InfinispanService { } } + private void cleanStatuses() { + deploymentStatuses.clear(); + podStatuses.clear(); + pipelineStatuses.clear(); + } + + public List<Project> getProjects() { return projects.values().stream().collect(Collectors.toList()); } @@ -167,6 +176,10 @@ public class InfinispanService { pipelineStatuses.put(GroupedKey.create(status.getProjectId(), status.getEnv()), status); } + public void deletePipelineStatus(PipelineStatus status) { + pipelineStatuses.remove(GroupedKey.create(status.getProjectId(), status.getEnv())); + } + public DeploymentStatus getDeploymentStatus(String name, String env) { return deploymentStatuses.get(GroupedKey.create(name, env)); } @@ -185,12 +198,12 @@ public class InfinispanService { public List<DeploymentStatus> getDeploymentStatuses(String env) { if (cacheManager == null) { - QueryFactory queryFactory = org.infinispan.query.Search.getQueryFactory((Cache<?, ?>) files); + QueryFactory queryFactory = org.infinispan.query.Search.getQueryFactory((Cache<?, ?>) deploymentStatuses); return queryFactory.<DeploymentStatus>create("FROM org.apache.camel.karavan.model.DeploymentStatus WHERE env = :env") .setParameter("env", env) .execute().list(); } else { - QueryFactory queryFactory = Search.getQueryFactory((RemoteCache<?, ?>) files); + QueryFactory queryFactory = Search.getQueryFactory((RemoteCache<?, ?>) deploymentStatuses); return queryFactory.<DeploymentStatus>create("FROM karavan.DeploymentStatus WHERE env = :env") .setParameter("env", env) .execute().list(); @@ -199,13 +212,13 @@ public class InfinispanService { public List<PodStatus> getPodStatuses(String projectId, String env) { if (cacheManager == null) { - QueryFactory queryFactory = org.infinispan.query.Search.getQueryFactory((Cache<?, ?>) files); + QueryFactory queryFactory = org.infinispan.query.Search.getQueryFactory((Cache<?, ?>) podStatuses); return queryFactory.<PodStatus>create("FROM org.apache.camel.karavan.model.PodStatus WHERE deployment = :deployment AND env = :env") .setParameter("deployment", projectId) .setParameter("env", env) .execute().list(); } else { - QueryFactory queryFactory = Search.getQueryFactory((RemoteCache<?, ?>) files); + QueryFactory queryFactory = Search.getQueryFactory((RemoteCache<?, ?>) podStatuses); return queryFactory.<PodStatus>create("FROM karavan.PodStatus WHERE deployment = :deployment AND env = :env") .setParameter("deployment", projectId) .setParameter("env", env) @@ -213,9 +226,28 @@ public class InfinispanService { } } + public List<PodStatus> getPodStatuses(String env) { + if (cacheManager == null) { + QueryFactory queryFactory = org.infinispan.query.Search.getQueryFactory((Cache<?, ?>) podStatuses); + return queryFactory.<PodStatus>create("FROM org.apache.camel.karavan.model.PodStatus WHERE env = :env") + .setParameter("env", env) + .execute().list(); + } else { + QueryFactory queryFactory = Search.getQueryFactory((RemoteCache<?, ?>) podStatuses); + return queryFactory.<PodStatus>create("FROM karavan.PodStatus WHERE env = :env") + .setParameter("env", env) + .execute().list(); + } + } + public void savePodStatus(PodStatus status) { podStatuses.put(GroupedKey.create(status.getDeployment(), status.getName()), status); } + + public void deletePodStatus(PodStatus status) { + podStatuses.remove(GroupedKey.create(status.getDeployment(), status.getName())); + } + public CamelStatus getCamelStatus(String projectId) { return camelStatuses.get(GroupedKey.create(projectId, projectId)); } diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java b/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java index 717e7c5..f5d2451 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java @@ -16,6 +16,7 @@ */ package org.apache.camel.karavan.service; +import io.quarkus.runtime.ShutdownEvent; import io.quarkus.runtime.StartupEvent; import io.vertx.core.eventbus.EventBus; import org.apache.camel.karavan.model.Environment; @@ -47,12 +48,18 @@ public class KaravanService { String pipeline; void onStart(@Observes StartupEvent ev) { + LOGGER.info("Start Karavan"); infinispanService.start(); setEnvironment(); initialImport(); startInformers(); } + void onStop(@Observes ShutdownEvent ev) { + LOGGER.info("Stop Karavan"); + bus.publish(KubernetesService.STOP_INFORMERS, ""); + } + void setEnvironment() { String cluster = kubernetesService.getCluster(); String namespace = kubernetesService.getNamespace(); @@ -68,6 +75,6 @@ public class KaravanService { } void startInformers() { - bus.publish(KubernetesService.START_WATCHERS, ""); + bus.publish(KubernetesService.START_INFORMERS, ""); } } diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/KubernetesService.java b/karavan-app/src/main/java/org/apache/camel/karavan/service/KubernetesService.java index 735b47e..b896013 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/service/KubernetesService.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/service/KubernetesService.java @@ -24,7 +24,11 @@ import io.fabric8.kubernetes.api.model.apps.Deployment; import io.fabric8.kubernetes.client.DefaultKubernetesClient; import io.fabric8.kubernetes.client.KubernetesClient; import io.fabric8.kubernetes.client.Watch; +import io.fabric8.kubernetes.client.dsl.Informable; import io.fabric8.kubernetes.client.dsl.LogWatch; +import io.fabric8.kubernetes.client.informers.SharedIndexInformer; +import io.fabric8.kubernetes.client.informers.SharedInformerEventListener; +import io.fabric8.kubernetes.client.informers.SharedInformerFactory; import io.fabric8.openshift.api.model.ImageStream; import io.fabric8.openshift.client.OpenShiftClient; import io.fabric8.tekton.client.DefaultTektonClient; @@ -41,9 +45,9 @@ import io.quarkus.vertx.ConsumeEvent; import io.vertx.mutiny.core.eventbus.EventBus; import org.apache.camel.karavan.model.PipelineRunLog; import org.apache.camel.karavan.model.Project; -import org.apache.camel.karavan.watcher.DeploymentWatcher; -import org.apache.camel.karavan.watcher.PipelineRunWatcher; -import org.apache.camel.karavan.watcher.PodWatcher; +import org.apache.camel.karavan.watcher.DeploymentEventHandler; +import org.apache.camel.karavan.watcher.PipelineRunEventHandler; +import org.apache.camel.karavan.watcher.PodEventHandler; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.jboss.logging.Logger; @@ -65,7 +69,8 @@ import java.util.stream.Collectors; public class KubernetesService { private static final Logger LOGGER = Logger.getLogger(KubernetesService.class.getName()); - public static final String START_WATCHERS = "start-watchers"; + public static final String START_INFORMERS = "start-informers"; + public static final String STOP_INFORMERS = "stop-informers"; @Inject EventBus eventBus; @@ -92,35 +97,36 @@ public class KubernetesService { public String environment; - private List<Watch> watches = new ArrayList<>(); + List<SharedIndexInformer> informers = new ArrayList<>(3); - @ConsumeEvent(value = START_WATCHERS, blocking = true) - void start(String data) { - LOGGER.info("Start KubernetesService"); - String labelName = getRuntimeLabel(); + @ConsumeEvent(value = START_INFORMERS, blocking = true) + void startInformers(String data) { + LOGGER.info("Start Kubernetes Informers"); try { - watches.add(kubernetesClient().apps().deployments().inNamespace(getNamespace()).withLabel(labelName, "camel") - .watch(new DeploymentWatcher(infinispanService, this))); - } catch (Exception e) { - LOGGER.error(e.getMessage()); - } - try { - watches.add(kubernetesClient().pods().inNamespace(getNamespace()).withLabel(labelName, "camel") - .watch(new PodWatcher(infinispanService, this))); - } catch (Exception e){ - LOGGER.error(e.getMessage()); - } - try { - watches.add(tektonClient().v1beta1().pipelineRuns().inNamespace(getNamespace()) - .watch(new PipelineRunWatcher(infinispanService, this))); + stopInformers(null); + String runtimeLabel = getRuntimeLabel(); + + SharedIndexInformer<Deployment> deploymentInformer = kubernetesClient().apps().deployments().inNamespace(getNamespace()).withLabel(runtimeLabel, "camel").inform(); + deploymentInformer.addEventHandlerWithResyncPeriod(new DeploymentEventHandler(infinispanService, this),30 * 1000L); + informers.add(deploymentInformer); + + SharedIndexInformer<PipelineRun> pipelineRunInformer = tektonClient().v1beta1().pipelineRuns().inNamespace(getNamespace()).withLabel(runtimeLabel, "camel").inform(); + pipelineRunInformer.addEventHandlerWithResyncPeriod(new PipelineRunEventHandler(infinispanService, this),30 * 1000L); + informers.add(pipelineRunInformer); + + SharedIndexInformer<Pod> podRunInformer = kubernetesClient().pods().inNamespace(getNamespace()).withLabel(runtimeLabel, "camel").inform(); + podRunInformer.addEventHandlerWithResyncPeriod(new PodEventHandler(infinispanService, this),30 * 1000L); + informers.add(podRunInformer); + } catch (Exception e) { - LOGGER.error(e.getMessage()); + LOGGER.error("Error starting informers: " + e.getMessage()); } } - void onStop(@Observes ShutdownEvent ev) { - LOGGER.info("Stop KubernetesService"); - watches.forEach(watch -> watch.close()); + @ConsumeEvent(value = STOP_INFORMERS, blocking = true) + void stopInformers(String data) { + LOGGER.info("Stop Kubernetes Informers"); + informers.forEach(informer -> informer.close()); } public String createPipelineRun(Project project, String pipelineName, String namespace) throws Exception { @@ -128,7 +134,8 @@ public class KubernetesService { Map<String, String> labels = Map.of( "karavan-project-id", project.getProjectId(), - "tekton.dev/pipeline", pipelineName + "tekton.dev/pipeline", pipelineName, + getRuntimeLabel(), "camel" ); ObjectMeta meta = new ObjectMetaBuilder() @@ -231,28 +238,6 @@ public class KubernetesService { } } - -// public List<PodStatus> getDeploymentPodsStatuses(String name, String namespace) { -// try { -// String labelName = getRuntimeLabel(); -// List<Pod> pods = kubernetesClient().pods().inNamespace(namespace) -// .withLabel("app.kubernetes.io/name", name) -// .withLabel(labelName, "camel") -// .list().getItems(); -// -// return pods.stream().map(pod -> new PodStatus( -// pod.getMetadata().getName(), -// pod.getStatus().getContainerStatuses().get(0).getStarted(), -// pod.getStatus().getContainerStatuses().get(0).getReady(), -// getPodReason(pod), -// pod.getMetadata().getLabels().get("app.kubernetes.io/name") -// )).collect(Collectors.toList()); -// } catch (Exception ex) { -// LOGGER.error(ex.getMessage()); -// return List.of(); -// } -// } - public Deployment getDeployment(String name, String namespace) { try { return kubernetesClient().apps().deployments().inNamespace(namespace).withName(name).get(); diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/watcher/DeploymentWatcher.java b/karavan-app/src/main/java/org/apache/camel/karavan/watcher/DeploymentEventHandler.java similarity index 53% rename from karavan-app/src/main/java/org/apache/camel/karavan/watcher/DeploymentWatcher.java rename to karavan-app/src/main/java/org/apache/camel/karavan/watcher/DeploymentEventHandler.java index 3177e1e..b4f4323 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/watcher/DeploymentWatcher.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/watcher/DeploymentEventHandler.java @@ -1,42 +1,56 @@ package org.apache.camel.karavan.watcher; -import io.fabric8.kubernetes.client.Watcher; import io.fabric8.kubernetes.api.model.apps.Deployment; -import io.fabric8.kubernetes.client.WatcherException; +import io.fabric8.kubernetes.client.informers.ResourceEventHandler; import org.apache.camel.karavan.model.DeploymentStatus; -import org.apache.camel.karavan.model.PodStatus; -import org.apache.camel.karavan.model.Project; import org.apache.camel.karavan.service.InfinispanService; import org.apache.camel.karavan.service.KubernetesService; import org.jboss.logging.Logger; -import java.util.List; +public class DeploymentEventHandler implements ResourceEventHandler<Deployment> { -public class DeploymentWatcher implements Watcher<Deployment> { - - private static final Logger LOGGER = Logger.getLogger(DeploymentWatcher.class.getName()); + private static final Logger LOGGER = Logger.getLogger(DeploymentEventHandler.class.getName()); private InfinispanService infinispanService; private KubernetesService kubernetesService; - public DeploymentWatcher(InfinispanService infinispanService, KubernetesService kubernetesService) { + public DeploymentEventHandler(InfinispanService infinispanService, KubernetesService kubernetesService) { this.infinispanService = infinispanService; this.kubernetesService = kubernetesService; } @Override - public void eventReceived(Watcher.Action action, Deployment deployment) { - LOGGER.info(action.name() + " " + deployment.getMetadata().getName()); - DeploymentStatus ds = getDeploymentStatus(deployment); - switch (action.name()) { - case "ADDED": - infinispanService.saveDeploymentStatus(ds); - break; - case "MODIFIED": - infinispanService.saveDeploymentStatus(ds); - break; - case "DELETED": - infinispanService.deleteDeploymentStatus(ds); - break; + public void onAdd(Deployment deployment) { + try { + LOGGER.info("onAdd " + deployment.getMetadata().getName()); + DeploymentStatus ds = getDeploymentStatus(deployment); + infinispanService.saveDeploymentStatus(ds); + } catch (Exception e){ + LOGGER.error(e.getMessage()); + } + } + + @Override + public void onUpdate(Deployment oldDeployment, Deployment newDeployment) { + try { + LOGGER.info("onUpdate " + newDeployment.getMetadata().getName()); + DeploymentStatus ds = getDeploymentStatus(newDeployment); + infinispanService.saveDeploymentStatus(ds); + } catch (Exception e){ + LOGGER.error(e.getMessage()); + } + } + + @Override + public void onDelete(Deployment deployment, boolean deletedFinalStateUnknown) { + try { + LOGGER.info("onDelete " + deployment.getMetadata().getName()); + DeploymentStatus ds = new DeploymentStatus( + deployment.getMetadata().getName(), + deployment.getMetadata().getNamespace(), + kubernetesService.environment); + infinispanService.deleteDeploymentStatus(ds); + } catch (Exception e){ + LOGGER.error(e.getMessage()); } } @@ -64,9 +78,4 @@ public class DeploymentWatcher implements Watcher<Deployment> { kubernetesService.environment); } } - - @Override - public void onClose(WatcherException cause) { - - } } \ No newline at end of file diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/watcher/PipelineRunWatcher.java b/karavan-app/src/main/java/org/apache/camel/karavan/watcher/PipelineRunEventHandler.java similarity index 56% rename from karavan-app/src/main/java/org/apache/camel/karavan/watcher/PipelineRunWatcher.java rename to karavan-app/src/main/java/org/apache/camel/karavan/watcher/PipelineRunEventHandler.java index 1e1ba3a..b5d59e9 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/watcher/PipelineRunWatcher.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/watcher/PipelineRunEventHandler.java @@ -1,7 +1,6 @@ package org.apache.camel.karavan.watcher; -import io.fabric8.kubernetes.client.Watcher; -import io.fabric8.kubernetes.client.WatcherException; +import io.fabric8.kubernetes.client.informers.ResourceEventHandler; import io.fabric8.tekton.pipeline.v1beta1.PipelineRun; import org.apache.camel.karavan.model.PipelineStatus; import org.apache.camel.karavan.model.Project; @@ -10,31 +9,65 @@ import org.apache.camel.karavan.service.KubernetesService; import org.jboss.logging.Logger; import java.time.Instant; -import java.util.List; -public class PipelineRunWatcher implements Watcher<PipelineRun> { +public class PipelineRunEventHandler implements ResourceEventHandler<PipelineRun> { - private static final Logger LOGGER = Logger.getLogger(PipelineRunWatcher.class.getName()); + private static final Logger LOGGER = Logger.getLogger(PipelineRunEventHandler.class.getName()); private InfinispanService infinispanService; private KubernetesService kubernetesService; - public PipelineRunWatcher(InfinispanService infinispanService, KubernetesService kubernetesService) { + public PipelineRunEventHandler(InfinispanService infinispanService, KubernetesService kubernetesService) { this.infinispanService = infinispanService; this.kubernetesService = kubernetesService; } @Override - public void eventReceived(Action action, PipelineRun pipelineRun) { - LOGGER.info(action.name() + " " + pipelineRun.getMetadata().getName()); + public void onAdd(PipelineRun pipelineRun) { + try { + LOGGER.info("onAdd " + pipelineRun.getMetadata().getName()); + PipelineStatus ps = getPipelineStatus(pipelineRun); + if (ps != null) infinispanService.savePipelineStatus(ps); + } catch (Exception e){ + LOGGER.error(e.getMessage()); + } + } + + @Override + public void onUpdate(PipelineRun oldPipelineRun, PipelineRun newPipelineRun) { + try { + LOGGER.info("onUpdate " + newPipelineRun.getMetadata().getName()); + PipelineStatus ps = getPipelineStatus(newPipelineRun); + if (ps != null) infinispanService.savePipelineStatus(ps); + } catch (Exception e){ + LOGGER.error(e.getMessage()); + } + } + + @Override + public void onDelete(PipelineRun pipelineRun, boolean deletedFinalStateUnknown) { + try { + LOGGER.info("onDelete " + pipelineRun.getMetadata().getName()); + String projectId = pipelineRun.getMetadata().getLabels().get("karavan-project-id"); + if (projectId != null) { + Project project = infinispanService.getProject(projectId); + if (project != null) { + PipelineStatus ps = new PipelineStatus(project.getProjectId(), kubernetesService.environment); + infinispanService.deletePipelineStatus(ps); + } + } + } catch (Exception e){ + LOGGER.error(e.getMessage()); + } + } + + public PipelineStatus getPipelineStatus( PipelineRun pipelineRun) { String projectId = pipelineRun.getMetadata().getLabels().get("karavan-project-id"); if (projectId != null) { Project project = infinispanService.getProject(projectId); - if (project != null && List.of("MODIFIED", "ADDED").contains(action.name())) { - PipelineStatus pipelineStatus = infinispanService.getPipelineStatus(projectId); - if (pipelineStatus == null) pipelineStatus = new PipelineStatus(project.getProjectId(), kubernetesService.environment); + if (project != null) { + PipelineStatus pipelineStatus = new PipelineStatus(project.getProjectId(), kubernetesService.environment); if (pipelineRun.getStatus() != null) { - LOGGER.info(action.name()+ " " + pipelineRun.getMetadata().getName() + " " + pipelineRun.getStatus().getConditions().get(0).getReason()); Instant runStartTime = Instant.parse(pipelineRun.getStatus().getStartTime()); Instant savedStartTime = pipelineStatus.getStartTime() != null ? Instant.parse(pipelineStatus.getStartTime()) @@ -52,9 +85,10 @@ public class PipelineRunWatcher implements Watcher<PipelineRun> { pipelineStatus.setStartTime(null); pipelineStatus.setCompletionTime(null); } - infinispanService.savePipelineStatus(pipelineStatus); + return pipelineStatus; } } + return null; } private Long getPipelineRunDuration(PipelineRun pipelineRun) { @@ -69,9 +103,4 @@ public class PipelineRunWatcher implements Watcher<PipelineRun> { return 0L; } } - - @Override - public void onClose(WatcherException cause) { - - } } \ No newline at end of file diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/watcher/PodEventHandler.java b/karavan-app/src/main/java/org/apache/camel/karavan/watcher/PodEventHandler.java new file mode 100644 index 0000000..8d3af7c --- /dev/null +++ b/karavan-app/src/main/java/org/apache/camel/karavan/watcher/PodEventHandler.java @@ -0,0 +1,84 @@ +package org.apache.camel.karavan.watcher; + +import io.fabric8.kubernetes.api.model.Pod; +import io.fabric8.kubernetes.api.model.PodCondition; +import io.fabric8.kubernetes.client.informers.ResourceEventHandler; +import org.apache.camel.karavan.model.PodStatus; +import org.apache.camel.karavan.service.InfinispanService; +import org.apache.camel.karavan.service.KubernetesService; +import org.jboss.logging.Logger; + +import java.util.Optional; + +public class PodEventHandler implements ResourceEventHandler<Pod> { + + private static final Logger LOGGER = Logger.getLogger(PodEventHandler.class.getName()); + private InfinispanService infinispanService; + private KubernetesService kubernetesService; + + public PodEventHandler(InfinispanService infinispanService, KubernetesService kubernetesService) { + this.infinispanService = infinispanService; + this.kubernetesService = kubernetesService; + } + + @Override + public void onAdd(Pod pod) { + try { + LOGGER.info("onAdd " + pod.getMetadata().getName()); + PodStatus ps = getPodStatus(pod); + infinispanService.savePodStatus(ps); + } catch (Exception e){ + LOGGER.error(e.getMessage()); + } + } + + @Override + public void onUpdate(Pod oldPod, Pod newPod) { + try { + LOGGER.info("onUpdate " + newPod.getMetadata().getName()); + PodStatus ps = getPodStatus(newPod); + infinispanService.savePodStatus(ps); + } catch (Exception e){ + LOGGER.error(e.getMessage()); + } + } + + @Override + public void onDelete(Pod pod, boolean deletedFinalStateUnknown) { + try { + LOGGER.info("onDelete " + pod.getMetadata().getName()); + String deployment = pod.getMetadata().getLabels().get("app.kubernetes.io/name"); + PodStatus ps = new PodStatus( + pod.getMetadata().getName(), + deployment, + kubernetesService.environment); + infinispanService.deletePodStatus(ps); + } catch (Exception e){ + LOGGER.error(e.getMessage()); + } + } + + + public PodStatus getPodStatus(Pod pod) { + String deployment = pod.getMetadata().getLabels().get("app.kubernetes.io/name"); + try { + Optional<PodCondition> initialized = pod.getStatus().getConditions().stream().filter(c -> c.getType().equals("Initialized")).findFirst(); + Optional<PodCondition> ready = pod.getStatus().getConditions().stream().filter(c -> c.getType().equals("Initialized")).findFirst(); + return new PodStatus( + pod.getMetadata().getName(), + pod.getStatus().getPhase(), + initialized.isEmpty() ? false : initialized.get().getStatus().equals("True"), + ready.isEmpty() ? false : ready.get().getStatus().equals("True"), + pod.getStatus().getReason(), + deployment, + kubernetesService.environment + ); + } catch (Exception ex) { + LOGGER.error(ex.getMessage()); + return new PodStatus( + pod.getMetadata().getName(), + deployment, + kubernetesService.environment); + } + } +} \ No newline at end of file diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/watcher/PodWatcher.java b/karavan-app/src/main/java/org/apache/camel/karavan/watcher/PodWatcher.java deleted file mode 100644 index 99e0982..0000000 --- a/karavan-app/src/main/java/org/apache/camel/karavan/watcher/PodWatcher.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.apache.camel.karavan.watcher; - -import io.fabric8.kubernetes.api.model.Pod; -import io.fabric8.kubernetes.api.model.apps.Deployment; -import io.fabric8.kubernetes.client.Watcher; -import io.fabric8.kubernetes.client.WatcherException; -import org.apache.camel.karavan.model.DeploymentStatus; -import org.apache.camel.karavan.model.Project; -import org.apache.camel.karavan.service.InfinispanService; -import org.apache.camel.karavan.service.KubernetesService; -import org.jboss.logging.Logger; - -public class PodWatcher implements Watcher<Pod> { - - private static final Logger LOGGER = Logger.getLogger(PodWatcher.class.getName()); - private InfinispanService infinispanService; - private KubernetesService kubernetesService; - - public PodWatcher(InfinispanService infinispanService, KubernetesService kubernetesService) { - this.infinispanService = infinispanService; - this.kubernetesService = kubernetesService; - } - - @Override - public void eventReceived(Action action, Pod pod) { - LOGGER.info(action.name() + " " + pod.getMetadata().getName()); - String name = pod.getMetadata().getLabels().get("app.kubernetes.io/name"); -// Project project = infinispanService.getProject(name); -// Deployment deployment = kubernetesService.getDeployment(name, pod.getMetadata().getNamespace()); -// if (project != null && deployment != null) { -// DeploymentStatus s = kubernetesService.getDeploymentStatus(project.getProjectId(), deployment); -// infinispanService.saveDeploymentStatus(s); -// } - } - - @Override - public void onClose(WatcherException cause) { - - } -} \ No newline at end of file