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 7aedac96cdf0bfb25c783ba5b754932949437516 Author: Marat Gubaidullin <[email protected]> AuthorDate: Fri Sep 23 18:17:00 2022 -0400 Cleanup camel statuses --- .../org/apache/camel/karavan/api/GitResource.java | 2 +- .../camel/karavan/api/KubernetesResource.java | 24 ++-- .../camel/karavan/api/ProjectFileResource.java | 2 +- .../apache/camel/karavan/api/ProjectResource.java | 8 +- .../apache/camel/karavan/api/StatusResource.java | 46 +++--- .../apache/camel/karavan/model/CamelStatus.java | 92 ++++++++++++ .../camel/karavan/model/ProjectEnvStatus.java | 158 --------------------- .../camel/karavan/model/ProjectStoreSchema.java | 2 +- .../camel/karavan/service/InfinispanService.java | 17 ++- .../camel/karavan/service/StatusService.java | 126 ++++++---------- .../src/main/resources/application.properties | 2 +- karavan-app/src/main/webapp/src/api/KaravanApi.tsx | 13 +- .../src/main/webapp/src/projects/ProjectInfo.tsx | 6 +- 13 files changed, 198 insertions(+), 300 deletions(-) diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/GitResource.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/GitResource.java index 217e40e..a296ad6 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/api/GitResource.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/GitResource.java @@ -44,7 +44,7 @@ public class GitResource { @POST @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) - public Project push(@HeaderParam("username") String username, Project project) throws Exception { + public Project push(Project project) throws Exception { Project p = infinispanService.getProject(project.getProjectId()); List<ProjectFile> files = infinispanService.getProjectFiles(project.getProjectId()); String commitId = gitService.commitAndPushProject(p, files); 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 162310c..e7586a8 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 @@ -60,7 +60,7 @@ public class KubernetesResource { @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @Path("/pipeline/{environment}") - public Project createPipeline(@HeaderParam("username") String username, @PathParam("environment") String environment, Project project) throws Exception { + public Project createPipeline(@PathParam("environment") String environment, Project project) throws Exception { Project p = infinispanService.getProject(project.getProjectId()); Optional<KaravanConfiguration.Environment> env = configuration.environments().stream().filter(e -> e.name().equals(environment)).findFirst(); if (env.isPresent()) { @@ -74,7 +74,7 @@ public class KubernetesResource { @GET @Produces(MediaType.APPLICATION_JSON) @Path("/pipeline/{environment}/{name}") - public Response getPipeline(@HeaderParam("username") String username, @PathParam("environment") String environment, + public Response getPipeline(@PathParam("environment") String environment, @PathParam("name") String name) throws Exception { Optional<KaravanConfiguration.Environment> env = configuration.environments().stream().filter(e -> e.name().equals(environment)).findFirst(); if (env.isPresent()) { @@ -87,7 +87,7 @@ public class KubernetesResource { @GET @Produces(MediaType.APPLICATION_JSON) @Path("/pipeline/log/{environment}/{name}") - public Response getPipelineLog(@HeaderParam("username") String username, @PathParam("environment") String environment, + public Response getPipelineLog(@PathParam("environment") String environment, @PathParam("name") String name) throws Exception { Optional<KaravanConfiguration.Environment> env = configuration.environments().stream().filter(e -> e.name().equals(environment)).findFirst(); if (env.isPresent()) { @@ -100,7 +100,7 @@ public class KubernetesResource { @GET @Produces(MediaType.APPLICATION_JSON) @Path("/container/log/{environment}/{name}") - public Response getContainerLog(@HeaderParam("username") String username, @PathParam("environment") String environment, + public Response getContainerLog(@PathParam("environment") String environment, @PathParam("name") String name) throws Exception { Optional<KaravanConfiguration.Environment> env = configuration.environments().stream().filter(e -> e.name().equals(environment)).findFirst(); if (env.isPresent()) { @@ -114,7 +114,7 @@ public class KubernetesResource { @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @Path("/deployment/rollout/{environment}/{name}") - public Response rollout(@HeaderParam("username") String username, @PathParam("environment") String environment, @PathParam("name") String name) throws Exception { + public Response rollout(@PathParam("environment") String environment, @PathParam("name") String name) throws Exception { Optional<KaravanConfiguration.Environment> env = configuration.environments().stream().filter(e -> e.name().equals(environment)).findFirst(); if (env.isPresent()) { kubernetesService.rolloutDeployment(name, env.get().namespace()); @@ -127,7 +127,7 @@ public class KubernetesResource { @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @Path("/deployment/{environment}/{name}") - public Response deleteDeployment(@HeaderParam("username") String username, @PathParam("environment") String environment, @PathParam("name") String name) throws Exception { + public Response deleteDeployment(@PathParam("environment") String environment, @PathParam("name") String name) throws Exception { Optional<KaravanConfiguration.Environment> env = configuration.environments().stream().filter(e -> e.name().equals(environment)).findFirst(); if (env.isPresent()) { kubernetesService.deleteDeployment(name, env.get().namespace()); @@ -143,7 +143,7 @@ public class KubernetesResource { @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @Path("/pod/{environment}/{name}") - public Response deletePod(@HeaderParam("username") String username, @PathParam("environment") String environment, @PathParam("name") String name) throws Exception { + public Response deletePod(@PathParam("environment") String environment, @PathParam("name") String name) throws Exception { Optional<KaravanConfiguration.Environment> env = configuration.environments().stream().filter(e -> e.name().equals(environment)).findFirst(); if (env.isPresent()) { kubernetesService.deletePod(name, env.get().namespace()); @@ -155,7 +155,7 @@ public class KubernetesResource { @GET @Produces(MediaType.APPLICATION_JSON) @Path("/imagetag/{environment}/{projectId}") - public Response getProjectImageTags(@HeaderParam("username") String username, @PathParam("environment") String environment, @PathParam("projectId") String projectId) throws Exception { + public Response getProjectImageTags(@PathParam("environment") String environment, @PathParam("projectId") String projectId) throws Exception { Optional<KaravanConfiguration.Environment> env = configuration.environments().stream().filter(e -> e.name().equals(environment)).findFirst(); if (env.isPresent()) { return Response.ok(kubernetesService.getProjectImageTags(projectId, env.get().namespace())).build(); @@ -166,7 +166,7 @@ public class KubernetesResource { @GET @Produces(MediaType.APPLICATION_JSON) @Path("/configmap/{environment}") - public Response getConfigMaps(@HeaderParam("username") String username, @PathParam("environment") String environment) throws Exception { + public Response getConfigMaps(@PathParam("environment") String environment) throws Exception { Optional<KaravanConfiguration.Environment> env = configuration.environments().stream().filter(e -> e.name().equals(environment)).findFirst(); if (env.isPresent()) { return Response.ok(kubernetesService.getConfigMaps(env.get().namespace())).build(); @@ -177,7 +177,7 @@ public class KubernetesResource { @GET @Produces(MediaType.APPLICATION_JSON) @Path("/secret/{environment}") - public Response getSecrets(@HeaderParam("username") String username, @PathParam("environment") String environment) throws Exception { + public Response getSecrets(@PathParam("environment") String environment) throws Exception { Optional<KaravanConfiguration.Environment> env = configuration.environments().stream().filter(e -> e.name().equals(environment)).findFirst(); if (env.isPresent()) { return Response.ok(kubernetesService.getSecrets(env.get().namespace())).build(); @@ -188,7 +188,7 @@ public class KubernetesResource { @GET @Produces(MediaType.APPLICATION_JSON) @Path("/service/{environment}") - public Response getServices(@HeaderParam("username") String username, @PathParam("environment") String environment) throws Exception { + public Response getServices(@PathParam("environment") String environment) throws Exception { Optional<KaravanConfiguration.Environment> env = configuration.environments().stream().filter(e -> e.name().equals(environment)).findFirst(); if (env.isPresent()) { return Response.ok(kubernetesService.getServices(env.get().namespace())).build(); @@ -200,7 +200,7 @@ public class KubernetesResource { @GET @Path("/container/log/watch/{environment}/{name}") @Produces(MediaType.SERVER_SENT_EVENTS) - public Multi<String> getContainerLogWatch(@HeaderParam("username") String username, @PathParam("environment") String environment, @PathParam("name") String name){ + public Multi<String> getContainerLogWatch(@PathParam("environment") String environment, @PathParam("name") String name){ LOGGER.info("Start sourcing"); Optional<KaravanConfiguration.Environment> env = configuration.environments().stream().filter(e -> e.name().equals(environment)).findFirst(); if (env.isPresent()) { diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java index acd66c0..188f1a0 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java @@ -54,7 +54,7 @@ public class ProjectFileResource { @POST @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) - public ProjectFile save(@HeaderParam("username") String username, ProjectFile file) throws Exception { + public ProjectFile save(ProjectFile file) throws Exception { infinispanService.saveProjectFile(file); return file; } diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java index 253f46d..2f83fc2 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java @@ -46,7 +46,7 @@ public class ProjectResource { @GET @Produces(MediaType.APPLICATION_JSON) - public List<Project> getAll(@HeaderParam("username") String username) throws Exception { + public List<Project> getAll() throws Exception { return infinispanService.getProjects().stream() .sorted(Comparator.comparing(Project::getProjectId)) .collect(Collectors.toList()); @@ -55,14 +55,14 @@ public class ProjectResource { @GET @Produces(MediaType.APPLICATION_JSON) @Path("/{project}") - public Project get(@HeaderParam("username") String username, @PathParam("project") String project) throws Exception { + public Project get(@PathParam("project") String project) throws Exception { return infinispanService.getProject(project); } @POST @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) - public Project save(@HeaderParam("username") String username, Project project) throws Exception { + public Project save(Project project) throws Exception { infinispanService.saveProject(project); return project; } @@ -81,7 +81,7 @@ public class ProjectResource { @Produces(MediaType.APPLICATION_JSON) @Consumes(MediaType.APPLICATION_JSON) @Path("/copy/{sourceProject}") - public Project copy(@HeaderParam("username") String username, @PathParam("sourceProject") String sourceProject, Project project) throws Exception { + public Project copy(@PathParam("sourceProject") String sourceProject, Project project) throws Exception { // Save project Project s = infinispanService.getProject(sourceProject); project.setRuntime(s.getRuntime()); diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java index 9492cc2..b68aaac 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java @@ -17,10 +17,12 @@ package org.apache.camel.karavan.api; import io.vertx.core.eventbus.EventBus; +import org.apache.camel.karavan.model.CamelStatus; import org.apache.camel.karavan.model.DeploymentStatus; import org.apache.camel.karavan.model.KaravanConfiguration; import org.apache.camel.karavan.model.PipelineStatus; import org.apache.camel.karavan.service.InfinispanService; +import org.apache.camel.karavan.service.StatusService; import org.jboss.logging.Logger; import javax.inject.Inject; @@ -40,16 +42,13 @@ public class StatusResource { @Inject InfinispanService infinispanService; - @Inject - KaravanConfiguration configuration; - @Inject EventBus bus; @GET @Produces(MediaType.APPLICATION_JSON) @Path("/pipeline/{projectId}") - public Response getPipelineStatus(@HeaderParam("username") String username, @PathParam("projectId") String projectId) { + public Response getPipelineStatus(@PathParam("projectId") String projectId) { PipelineStatus status = infinispanService.getPipelineStatus(projectId); if (status != null) { return Response.ok(status).build(); @@ -61,7 +60,7 @@ public class StatusResource { @GET @Produces(MediaType.APPLICATION_JSON) @Path("/deployment/{projectId}") - public Response getDeploymentStatus(@HeaderParam("username") String username, @PathParam("projectId") String projectId) { + public Response getDeploymentStatus(@PathParam("projectId") String projectId) { DeploymentStatus status = infinispanService.getDeploymentStatus(projectId); if (status != null) { return Response.ok(status).build(); @@ -70,29 +69,16 @@ public class StatusResource { } } -// @GET -// @Produces(MediaType.APPLICATION_JSON) -// @Path("/projects") -// public Map<String, Map> getSimpleStatus(@HeaderParam("username") String username) throws Exception { -// Map<String, Map> result = new HashMap<>(); -// infinispanService.getProjects().forEach(project -> { -// ProjectStatus ps = getStatus(username, project.getProjectId()); -// Map<String, String> statuses = new HashMap<>(); -// ps.getStatuses().forEach(pes -> { -// if (pes.getLastPipelineRunResult() == null || pes.getDeploymentStatus() == null || pes.getContextStatus() == null){ -// statuses.put(pes.getEnvironment(), "N/A"); -// } else { -// boolean pipelineOK = pes.getLastPipelineRunResult().equals("Succeeded"); -// System.out.println(pes.getLastPipelineRunResult()); -// boolean deploymentOK = pes.getDeploymentStatus().getReadyReplicas() == pes.getDeploymentStatus().getReplicas() && pes.getDeploymentStatus().getUnavailableReplicas() == 0; -// boolean camelOK = pes.getContextStatus().equals(ProjectEnvStatus.Status.UP) && pes.getConsumerStatus().equals(ProjectEnvStatus.Status.UP) && pes.getRoutesStatus().equals(ProjectEnvStatus.Status.UP); -// String status = (pipelineOK && deploymentOK && camelOK) ? "UP" : "DOWN"; -// statuses.put(pes.getEnvironment(), status); -// } -// }); -// result.put(project.getProjectId(), statuses); -// }); -// -// return result; -// } + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("/camel/{projectId}") + public Response getCamelStatus(@PathParam("projectId") String projectId) { + bus.publish(StatusService.CMD_COLLECT_STATUSES, projectId); + CamelStatus status = infinispanService.getCamelStatus(projectId); + if (status != null) { + return Response.ok(status).build(); + } else { + return Response.noContent().build(); + } + } } \ No newline at end of file diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/CamelStatus.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/CamelStatus.java new file mode 100644 index 0000000..a6e0e18 --- /dev/null +++ b/karavan-app/src/main/java/org/apache/camel/karavan/model/CamelStatus.java @@ -0,0 +1,92 @@ +package org.apache.camel.karavan.model; + +import org.infinispan.protostream.annotations.ProtoEnumValue; +import org.infinispan.protostream.annotations.ProtoFactory; +import org.infinispan.protostream.annotations.ProtoField; + +public class CamelStatus { + public static final String CACHE = "camel_statuses"; + @ProtoField(number = 1) + String projectId; + @ProtoField(number = 2) + Status contextStatus; + @ProtoField(number = 3) + Status consumerStatus; + @ProtoField(number = 4) + Status routesStatus; + @ProtoField(number = 5) + Status registryStatus; + @ProtoField(number = 6) + String contextVersion; + + public enum Status { + @ProtoEnumValue(number = 0, name = "DOWN") + DOWN, + @ProtoEnumValue(number = 1, name = "UP") + UP, + @ProtoEnumValue(number = 2, name = "NA") + NA + } + + @ProtoFactory + public CamelStatus(String projectId, Status contextStatus, Status consumerStatus, Status routesStatus, Status registryStatus, String contextVersion) { + this.projectId = projectId; + this.contextStatus = contextStatus; + this.consumerStatus = consumerStatus; + this.routesStatus = routesStatus; + this.registryStatus = registryStatus; + this.contextVersion = contextVersion; + } + + public CamelStatus(String projectId) { + this.projectId = projectId; + } + + public String getProjectId() { + return projectId; + } + + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + public Status getContextStatus() { + return contextStatus; + } + + public void setContextStatus(Status contextStatus) { + this.contextStatus = contextStatus; + } + + public Status getConsumerStatus() { + return consumerStatus; + } + + public void setConsumerStatus(Status consumerStatus) { + this.consumerStatus = consumerStatus; + } + + public Status getRoutesStatus() { + return routesStatus; + } + + public void setRoutesStatus(Status routesStatus) { + this.routesStatus = routesStatus; + } + + public Status getRegistryStatus() { + return registryStatus; + } + + public void setRegistryStatus(Status registryStatus) { + this.registryStatus = registryStatus; + } + + public String getContextVersion() { + return contextVersion; + } + + public void setContextVersion(String contextVersion) { + this.contextVersion = contextVersion; + } +} diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectEnvStatus.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectEnvStatus.java deleted file mode 100644 index 99192a6..0000000 --- a/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectEnvStatus.java +++ /dev/null @@ -1,158 +0,0 @@ -package org.apache.camel.karavan.model; - -import org.infinispan.protostream.annotations.ProtoEnumValue; -import org.infinispan.protostream.annotations.ProtoFactory; -import org.infinispan.protostream.annotations.ProtoField; - -public class ProjectEnvStatus { - @ProtoField(number = 1) - String environment; - @ProtoField(number = 2) - Status status; - @ProtoField(number = 3) - Status contextStatus; - @ProtoField(number = 4) - Status consumerStatus; - @ProtoField(number = 5) - Status routesStatus; - @ProtoField(number = 6) - Status registryStatus; - @ProtoField(number = 7) - String contextVersion; - @ProtoField(number = 8) - String lastPipelineRun; - @ProtoField(number = 9) - String lastPipelineRunResult; - @ProtoField(number = 10) - Long lastPipelineRunTime; - @ProtoField(number = 11) - DeploymentStatus deploymentStatus; - @ProtoField(number = 12) - String lastPipelineRunStartTime; - - public enum Status { - @ProtoEnumValue(number = 0, name = "DOWN") - DOWN, - @ProtoEnumValue(number = 1, name = "UP") - UP, - @ProtoEnumValue(number = 2, name = "NA") - NA - } - - @ProtoFactory - public ProjectEnvStatus(String environment, Status status, Status contextStatus, Status consumerStatus, Status routesStatus, Status registryStatus, String contextVersion, - String lastPipelineRun, String lastPipelineRunResult, Long lastPipelineRunTime, DeploymentStatus deploymentStatus, String lastPipelineRunStartTime) { - this.environment = environment; - this.status = status; - this.contextStatus = contextStatus; - this.consumerStatus = consumerStatus; - this.routesStatus = routesStatus; - this.registryStatus = registryStatus; - this.contextVersion = contextVersion; - this.lastPipelineRun = lastPipelineRun; - this.lastPipelineRunResult = lastPipelineRunResult; - this.lastPipelineRunTime = lastPipelineRunTime; - this.deploymentStatus = deploymentStatus; - this.lastPipelineRunStartTime = lastPipelineRunStartTime; - } - - public ProjectEnvStatus(String environment) { - this.environment = environment; - } - - public String getEnvironment() { - return environment; - } - - public void setEnvironment(String environment) { - this.environment = environment; - } - - public Status getStatus() { - return status; - } - - public void setStatus(Status status) { - this.status = status; - } - - public Status getContextStatus() { - return contextStatus; - } - - public void setContextStatus(Status contextStatus) { - this.contextStatus = contextStatus; - } - - public Status getConsumerStatus() { - return consumerStatus; - } - - public void setConsumerStatus(Status consumerStatus) { - this.consumerStatus = consumerStatus; - } - - public Status getRoutesStatus() { - return routesStatus; - } - - public void setRoutesStatus(Status routesStatus) { - this.routesStatus = routesStatus; - } - - public Status getRegistryStatus() { - return registryStatus; - } - - public void setRegistryStatus(Status registryStatus) { - this.registryStatus = registryStatus; - } - - public String getLastPipelineRun() { - return lastPipelineRun; - } - - public void setLastPipelineRun(String lastPipelineRun) { - this.lastPipelineRun = lastPipelineRun; - } - - public String getLastPipelineRunResult() { - return lastPipelineRunResult; - } - - public void setLastPipelineRunResult(String lastPipelineRunResult) { - this.lastPipelineRunResult = lastPipelineRunResult; - } - - public DeploymentStatus getDeploymentStatus() { - return deploymentStatus; - } - - public void setDeploymentStatus(DeploymentStatus deploymentStatus) { - this.deploymentStatus = deploymentStatus; - } - - public String getContextVersion() { - return contextVersion; - } - - public void setContextVersion(String contextVersion) { - this.contextVersion = contextVersion; - } - - public Long getLastPipelineRunTime() { - return lastPipelineRunTime; - } - - public void setLastPipelineRunTime(Long lastPipelineRunTime) { - this.lastPipelineRunTime = lastPipelineRunTime; - } - - public String getLastPipelineRunStartTime() { - return lastPipelineRunStartTime; - } - - public void setLastPipelineRunStartTime(String lastPipelineRunStartTime) { - this.lastPipelineRunStartTime = lastPipelineRunStartTime; - } -} diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectStoreSchema.java b/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectStoreSchema.java index 4721887..5e8d3d5 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectStoreSchema.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/model/ProjectStoreSchema.java @@ -5,7 +5,7 @@ import org.infinispan.protostream.annotations.AutoProtoSchemaBuilder; @AutoProtoSchemaBuilder( includeClasses = { - GroupedKey.class, Project.class, ProjectFile.class, PipelineStatus.class, ProjectEnvStatus.class, DeploymentStatus.class, + GroupedKey.class, Project.class, ProjectFile.class, PipelineStatus.class, CamelStatus.class, DeploymentStatus.class, PodStatus.class }, schemaPackageName = "karavan") 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 189bed0..f1c33a5 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 @@ -18,6 +18,7 @@ package org.apache.camel.karavan.service; import io.quarkus.runtime.configuration.ProfileManager; import io.vertx.core.eventbus.EventBus; +import org.apache.camel.karavan.model.CamelStatus; import org.apache.camel.karavan.model.DeploymentStatus; import org.apache.camel.karavan.model.GroupedKey; import org.apache.camel.karavan.model.Kamelet; @@ -57,6 +58,8 @@ public class InfinispanService { BasicCache<GroupedKey, DeploymentStatus> deploymentStatus; + BasicCache<GroupedKey, CamelStatus> camelStatus; + BasicCache<String, String> kamelets; @Inject @@ -96,6 +99,7 @@ public class InfinispanService { files = cacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(ProjectFile.CACHE, builder.build()); pipelineStatuses = cacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(PipelineStatus.CACHE, builder.build()); deploymentStatus = cacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(DeploymentStatus.CACHE, builder.build()); + camelStatus = cacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(CamelStatus.CACHE, builder.build()); kamelets = cacheManager.administration().withFlags(CacheContainerAdmin.AdminFlag.VOLATILE).getOrCreateCache(Kamelet.CACHE, builder.build()); } else { LOGGER.info("InfinispanService is starting in remote mode"); @@ -103,6 +107,7 @@ public class InfinispanService { files = cacheManager.administration().getOrCreateCache(ProjectFile.CACHE, new XMLStringConfiguration(String.format(CACHE_CONFIG, ProjectFile.CACHE))); pipelineStatuses = cacheManager.administration().getOrCreateCache(ProjectFile.CACHE, new XMLStringConfiguration(String.format(CACHE_CONFIG, PipelineStatus.CACHE))); deploymentStatus = cacheManager.administration().getOrCreateCache(ProjectFile.CACHE, new XMLStringConfiguration(String.format(CACHE_CONFIG, DeploymentStatus.CACHE))); + camelStatus = cacheManager.administration().getOrCreateCache(ProjectFile.CACHE, new XMLStringConfiguration(String.format(CACHE_CONFIG, CamelStatus.CACHE))); kamelets = cacheManager.administration().getOrCreateCache(Kamelet.CACHE, new XMLStringConfiguration(String.format(CACHE_CONFIG, Kamelet.CACHE))); } if (getProjects().isEmpty()) { @@ -111,10 +116,6 @@ public class InfinispanService { } bus.publish(KaravanService.LOAD_CUSTOM_KAMELETS, ""); - - if (ProfileManager.getLaunchMode().isDevOrTest() && getProjects().isEmpty()){ -// generateDevProjects(); - } } public List<Project> getProjects() { @@ -182,6 +183,14 @@ public class InfinispanService { deploymentStatus.put(GroupedKey.create(status.getProjectId(), status.getProjectId()), status); } + public CamelStatus getCamelStatus(String projectId) { + return camelStatus.get(GroupedKey.create(projectId, projectId)); + } + + public void saveCamelStatus(CamelStatus status) { + camelStatus.put(GroupedKey.create(status.getProjectId(), status.getProjectId()), status); + } + public List<String> getKameletNames() { return kamelets.keySet().stream().collect(Collectors.toList()); } diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/StatusService.java b/karavan-app/src/main/java/org/apache/camel/karavan/service/StatusService.java index fa5329a..b6453e3 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/service/StatusService.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/service/StatusService.java @@ -16,20 +16,22 @@ */ package org.apache.camel.karavan.service; -import io.fabric8.tekton.pipeline.v1beta1.PipelineRun; +import io.quarkus.runtime.configuration.ProfileManager; import io.quarkus.vertx.ConsumeEvent; -import io.smallrye.mutiny.tuples.Tuple4; import io.vertx.core.json.JsonObject; import io.vertx.mutiny.core.Vertx; +import io.vertx.mutiny.core.buffer.Buffer; +import io.vertx.mutiny.ext.web.client.HttpResponse; import io.vertx.mutiny.ext.web.client.WebClient; +import org.apache.camel.karavan.model.CamelStatus; import org.apache.camel.karavan.model.KaravanConfiguration; -import org.apache.camel.karavan.model.ProjectEnvStatus; import org.jboss.logging.Logger; import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; -import java.time.Instant; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; @ApplicationScoped public class StatusService { @@ -64,103 +66,55 @@ public class StatusService { @ConsumeEvent(value = CMD_COLLECT_STATUSES, blocking = true, ordered = true) public void collectStatuses(String projectId) throws Exception { if ((System.currentTimeMillis() - lastCollect) > configuration.statusThreshold()) { -// collectStatusesForProject(projectId); + collectStatusesForProject(projectId); lastCollect = System.currentTimeMillis(); } } -// private void collectStatusesForProject(String projectId) { -// ProjectStatus old = infinispanService.getProjectStatus(projectId); -// ProjectStatus status = new ProjectStatus(); -// status.setProjectId(projectId); -// status.setLastUpdate(System.currentTimeMillis()); -// List<ProjectEnvStatus> statuses = new ArrayList<>(1); -// configuration.environments().stream().filter(e -> e.active()).forEach(e -> { -// String url = ProfileManager.getActiveProfile().equals("dev") -// ? String.format("http://%s-%s.%s/q/health", projectId, e.namespace(), e.cluster()) -// : String.format("http://%s.%s.%s/q/health", projectId, e.namespace(), e.cluster()); -// ProjectEnvStatus pes = getProjectEnvStatus(url, e.name()); -// DeploymentStatus ds = kubernetesService.getDeploymentStatus(projectId, e.namespace()); -// Tuple4<Boolean, String, String, Long> pipeline = getProjectPipelineStatus(projectId, e.pipeline(), e.namespace()); -// -// pes.setDeploymentStatus(ds); -// -// if (pipeline.getItem1()){ -// pes.setLastPipelineRun(pipeline.getItem2()); -// pes.setLastPipelineRunResult(pipeline.getItem3()); -// pes.setLastPipelineRunTime(pipeline.getItem4()); -// } else if (old != null){ -// Optional<ProjectEnvStatus> opes = old.getStatuses().stream().filter(x -> x.getEnvironment().equals(e.name())).findFirst(); -// if (opes.isPresent()) { -// pes.setLastPipelineRun(opes.get().getLastPipelineRun()); -// pes.setLastPipelineRunResult(opes.get().getLastPipelineRunResult()); -// } -// } -// statuses.add(pes); -// }); -// status.setStatuses(statuses); -// infinispanService.saveProjectStatus(status); -// } - - private Tuple4<Boolean, String, String, Long> getProjectPipelineStatus(String projectId, String pipelineName, String namespace) { + private void collectStatusesForProject(String projectId) { + configuration.environments().stream().filter(e -> e.active()).forEach(e -> { + String url = ProfileManager.getActiveProfile().equals("dev") + ? String.format("http://%s-%s.%s/q/health", projectId, e.namespace(), e.cluster()) + : String.format("http://%s.%s.%s/q/health", projectId, e.namespace(), e.cluster()); + CamelStatus cs = getCamelStatus(projectId, url); + infinispanService.saveCamelStatus(cs); + }); + + } + + private CamelStatus getCamelStatus(String projectId, String url) { + // TODO: make it reactive + System.out.println(url); try { - PipelineRun pipelineRun = kubernetesService.getLastPipelineRun(projectId, pipelineName, namespace); - if (pipelineRun != null) { - Instant create = Instant.parse(pipelineRun.getMetadata().getCreationTimestamp()); - Instant completion = pipelineRun.getStatus().getCompletionTime() != null - ? Instant.parse(pipelineRun.getStatus().getCompletionTime()) - : Instant.now(); - - long duration = completion.getEpochSecond() - create.getEpochSecond(); - return Tuple4.of(true, pipelineRun.getMetadata().getName(), pipelineRun.getStatus().getConditions().get(0).getReason(), duration); + HttpResponse<Buffer> result = getWebClient().getAbs(url).timeout(1000).send().subscribeAsCompletionStage().toCompletableFuture().get(); + if (result.statusCode() == 200) { + JsonObject res = result.bodyAsJsonObject(); + List<JsonObject> checks = res.getJsonArray("checks").stream().map(o -> (JsonObject)o).collect(Collectors.toList()); + + JsonObject context = checks.stream().filter(o -> Objects.equals(o.getString("name"), "context")).findFirst().get(); + return new CamelStatus( + projectId, + getStatus(checks, "context"), + getStatus(checks, "camel-consumers"), + getStatus(checks, "camel-routes"), + getStatus(checks, "camel-registry"), + context.getJsonObject("data").getString("context.version") + ); } else { - return Tuple4.of(true,"","Undefined", 0L); + return new CamelStatus(projectId); } } catch (Exception ex) { LOGGER.error(ex.getMessage()); - return Tuple4.of(false, "", "Undefined", 0L); + return new CamelStatus(projectId); } } -// private ProjectEnvStatus getProjectEnvStatus(String url, String env) { -// // TODO: make it reactive -// try { -// HttpResponse<Buffer> result = getWebClient().getAbs(url).timeout(1000).send().subscribeAsCompletionStage().toCompletableFuture().get(); -// if (result.statusCode() == 200) { -// JsonObject res = result.bodyAsJsonObject(); -// List<JsonObject> checks = res.getJsonArray("checks").stream().map(o -> (JsonObject)o).collect(Collectors.toList()); -// -// JsonObject context = checks.stream().filter(o -> Objects.equals(o.getString("name"), "context")).findFirst().get(); -// return new ProjectEnvStatus( -// env, -// res != null && res.containsKey("status") && res.getString("status").equals("UP") ? ProjectEnvStatus.Status.UP : ProjectEnvStatus.Status.DOWN, -// getStatus(checks, "context"), -// getStatus(checks, "camel-consumers"), -// getStatus(checks, "camel-routes"), -// getStatus(checks, "camel-registry"), -// context.getJsonObject("data").getString("context.version"), -// "", -// "", -// 0L, -// new DeploymentStatus() -// ); -// } else { -// return new ProjectEnvStatus(env); -// } -// } catch (Exception ex) { -// LOGGER.error(ex.getMessage()); -//// ex.printStackTrace(); -// return new ProjectEnvStatus(env); -// } -// } - - private ProjectEnvStatus.Status getStatus(List<JsonObject> checks, String name){ + private CamelStatus.Status getStatus(List<JsonObject> checks, String name){ try { JsonObject res = checks.stream().filter(o -> o.getString("name").equals(name)).findFirst().get(); - return res.getString("status").equals("UP") ? ProjectEnvStatus.Status.UP : ProjectEnvStatus.Status.DOWN; + return res.getString("status").equals("UP") ? CamelStatus.Status.UP : CamelStatus.Status.DOWN; } catch (Exception e){ - return ProjectEnvStatus.Status.NA; + return CamelStatus.Status.NA; } } - } \ No newline at end of file diff --git a/karavan-app/src/main/resources/application.properties b/karavan-app/src/main/resources/application.properties index bc96a84..0889e13 100644 --- a/karavan-app/src/main/resources/application.properties +++ b/karavan-app/src/main/resources/application.properties @@ -17,7 +17,7 @@ karavan.config.group-id=org.camel.karavan.demo karavan.config.image-group=karavan karavan.config.runtime=QUARKUS karavan.config.runtime-version=2.12.2.Final -karavan.config.status-threshold=1000 +karavan.config.status-threshold=2000 karavan.config.environments[0].name=dev karavan.config.environments[0].namespace=karavan diff --git a/karavan-app/src/main/webapp/src/api/KaravanApi.tsx b/karavan-app/src/main/webapp/src/api/KaravanApi.tsx index 4441d52..31d976b 100644 --- a/karavan-app/src/main/webapp/src/api/KaravanApi.tsx +++ b/karavan-app/src/main/webapp/src/api/KaravanApi.tsx @@ -1,5 +1,5 @@ import axios, {AxiosResponse} from "axios"; -import {DeploymentStatus, PipelineStatus, Project, ProjectFile} from "../projects/ProjectModels"; +import {CamelStatus, DeploymentStatus, PipelineStatus, Project, ProjectFile} from "../projects/ProjectModels"; import {Buffer} from 'buffer'; import {SsoApi} from "./SsoApi"; @@ -171,6 +171,17 @@ export class KaravanApi { }); } + static async getProjectCamelStatus(projectId: string, after: (status: CamelStatus) => void) { + instance.get('/api/status/camel/' + projectId) + .then(res => { + if (res.status === 200) { + after(res.data); + } + }).catch(err => { + console.log(err); + }); + } + static async getProjects(after: (projects: Project[]) => void) { instance.get('/api/project') .then(res => { diff --git a/karavan-app/src/main/webapp/src/projects/ProjectInfo.tsx b/karavan-app/src/main/webapp/src/projects/ProjectInfo.tsx index 64e089b..8ec2cdf 100644 --- a/karavan-app/src/main/webapp/src/projects/ProjectInfo.tsx +++ b/karavan-app/src/main/webapp/src/projects/ProjectInfo.tsx @@ -89,6 +89,10 @@ export class ProjectInfo extends React.Component<Props, State> { this.setState({key: Math.random().toString(), deploymentStatus: status}); // console.log(status); }); + KaravanApi.getProjectCamelStatus(this.props.project.projectId, (status: CamelStatus) => { + this.setState({key: Math.random().toString(), camelStatus: status}); + console.log(status); + }); } } @@ -353,7 +357,7 @@ export class ProjectInfo extends React.Component<Props, State> { {pipeline ? pipeline : "-"} </Button> </Label> - {showTime && <Label icon={<ClockIcon/>} color={color}>{lastPipelineRunTime + "s"}</Label>} + {showTime && lastPipelineRunTime !== undefined && <Label icon={<ClockIcon/>} color={color}>{lastPipelineRunTime + "s"}</Label>} </LabelGroup> </Tooltip> </FlexItem>
