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 73435d86 Cleanup 73435d86 is described below commit 73435d861adc75491f4c0fefaecb2b1a1a733dc5 Author: Marat Gubaidullin <ma...@talismancloud.io> AuthorDate: Mon Nov 27 16:40:39 2023 -0500 Cleanup --- .../camel/karavan/api/ContainerResource.java | 5 +- .../apache/camel/karavan/api/DevModeResource.java | 3 +- .../apache/camel/karavan/api/ImagesResource.java | 3 +- .../apache/camel/karavan/api/KameletResources.java | 2 - .../apache/camel/karavan/api/LogWatchResource.java | 14 +- .../camel/karavan/api/ProjectFileResource.java | 15 +- .../camel/karavan/api/ProjectGitResource.java | 11 +- .../apache/camel/karavan/api/ProjectResource.java | 14 +- .../apache/camel/karavan/api/StatusResource.java | 12 +- .../apache/camel/karavan/api/UsersResource.java | 7 +- .../org/apache/camel/karavan/code/CodeService.java | 4 +- .../karavan/code/model/DockerComposeService.java | 5 +- .../camel/karavan/docker/DockerEventListener.java | 3 - .../camel/karavan/docker/DockerForGitea.java | 4 +- .../camel/karavan/docker/DockerForInfinispan.java | 2 +- .../camel/karavan/docker/DockerForRegistry.java | 2 +- .../apache/camel/karavan/docker/DockerService.java | 14 +- .../camel/karavan/docker/DockerServiceUtils.java | 12 +- .../org/apache/camel/karavan/git/GitService.java | 23 +- .../karavan/infinispan/InfinispanService.java | 5 +- .../camel/karavan/infinispan/model/Project.java | 1 + .../karavan/kubernetes/KubernetesService.java | 14 +- .../camel/karavan/kubernetes/PodEventHandler.java | 3 +- .../apache/camel/karavan/service/AuthService.java | 2 +- .../apache/camel/karavan/service/CamelService.java | 5 +- .../camel/karavan/service/ConfigService.java | 5 +- .../karavan/service/ContainerStatusService.java | 23 +- .../camel/karavan/service/KaravanService.java | 6 +- .../camel/karavan/service/ProjectService.java | 14 +- .../webui/src/containers/ContainerTableRow.tsx | 4 +- .../main/webui/src/containers/ContainersPage.tsx | 2 +- .../main/webui/src/project/build/BuildPanel.tsx | 207 ------------------ .../main/webui/src/project/build/ImagesPanel.tsx | 238 --------------------- .../webui/src/project/build/ProjectBuildTab.tsx | 32 --- 34 files changed, 102 insertions(+), 614 deletions(-) diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java index 5eefe265..23e0d8e8 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ContainerResource.java @@ -32,7 +32,6 @@ import org.apache.camel.karavan.infinispan.model.ContainerStatus; import org.apache.camel.karavan.kubernetes.KubernetesService; import org.apache.camel.karavan.service.ConfigService; import org.apache.camel.karavan.service.ProjectService; -import org.apache.camel.karavan.shared.Constants; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.jboss.logging.Logger; @@ -100,7 +99,7 @@ public class ContainerResource { if (dockerComposeService != null) { Map<String,String> labels = new HashMap<>(); labels.put(LABEL_TYPE, ContainerStatus.ContainerType.devservice.name()); - labels.put(LABEL_CAMEL_RUNTIME, Constants.CamelRuntime.CAMEL_MAIN.getValue()); + labels.put(LABEL_CAMEL_RUNTIME, CamelRuntime.CAMEL_MAIN.getValue()); labels.put(LABEL_PROJECT_ID, name); dockerService.createContainerFromCompose(dockerComposeService, labels); dockerService.runContainer(dockerComposeService.getContainer_name()); @@ -110,7 +109,7 @@ public class ContainerResource { if (dockerComposeService != null) { Map<String,String> labels = new HashMap<>(); labels.put(LABEL_TYPE, ContainerStatus.ContainerType.project.name()); - labels.put(LABEL_CAMEL_RUNTIME, Constants.CamelRuntime.CAMEL_MAIN.getValue()); + labels.put(LABEL_CAMEL_RUNTIME, CamelRuntime.CAMEL_MAIN.getValue()); labels.put(LABEL_PROJECT_ID, name); dockerService.createContainerFromCompose(dockerComposeService, labels); dockerService.runContainer(dockerComposeService.getContainer_name()); diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java index 2b73642a..1a8fe8ad 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/DevModeResource.java @@ -24,13 +24,12 @@ import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import org.apache.camel.karavan.docker.DockerService; import org.apache.camel.karavan.infinispan.InfinispanService; -import org.apache.camel.karavan.infinispan.model.CamelStatus; import org.apache.camel.karavan.infinispan.model.ContainerStatus; import org.apache.camel.karavan.infinispan.model.Project; import org.apache.camel.karavan.kubernetes.KubernetesService; import org.apache.camel.karavan.service.CamelService; -import org.apache.camel.karavan.service.ProjectService; import org.apache.camel.karavan.service.ConfigService; +import org.apache.camel.karavan.service.ProjectService; import org.eclipse.microprofile.config.inject.ConfigProperty; import static org.apache.camel.karavan.service.ContainerStatusService.CONTAINER_STATUS; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java index 21b0d6ba..6bbe60f5 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java @@ -23,12 +23,11 @@ import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import org.apache.camel.karavan.docker.DockerService; import org.apache.camel.karavan.registry.RegistryConfig; +import org.apache.camel.karavan.registry.RegistryService; import org.apache.camel.karavan.service.ConfigService; import org.apache.camel.karavan.service.ProjectService; -import org.apache.camel.karavan.registry.RegistryService; import org.jose4j.base64url.Base64; -import java.io.IOException; import java.util.Comparator; import java.util.List; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java index 3c771080..6c419e88 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/KameletResources.java @@ -27,9 +27,7 @@ import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; -import java.util.LinkedHashMap; import java.util.List; -import java.util.Map; import java.util.stream.Collectors; @Path("/api/kamelet") diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/LogWatchResource.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/LogWatchResource.java index e640b583..f0d71eb0 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/LogWatchResource.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/LogWatchResource.java @@ -21,13 +21,6 @@ import io.fabric8.kubernetes.client.dsl.LogWatch; import io.smallrye.context.api.ManagedExecutorConfig; import io.smallrye.context.api.NamedInstance; import io.smallrye.mutiny.tuples.Tuple2; -import org.apache.camel.karavan.docker.DockerService; -import org.apache.camel.karavan.docker.LogCallback; -import org.apache.camel.karavan.kubernetes.KubernetesService; -import org.apache.camel.karavan.service.ConfigService; -import org.eclipse.microprofile.context.ManagedExecutor; -import org.jboss.logging.Logger; - import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; @@ -38,6 +31,13 @@ import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.SecurityContext; import jakarta.ws.rs.sse.Sse; import jakarta.ws.rs.sse.SseEventSink; +import org.apache.camel.karavan.docker.DockerService; +import org.apache.camel.karavan.docker.LogCallback; +import org.apache.camel.karavan.kubernetes.KubernetesService; +import org.apache.camel.karavan.service.ConfigService; +import org.eclipse.microprofile.context.ManagedExecutor; +import org.jboss.logging.Logger; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java index ae8e50f0..bf00fa8a 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java @@ -16,20 +16,13 @@ */ package org.apache.camel.karavan.api; +import jakarta.inject.Inject; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; +import org.apache.camel.karavan.code.CodeService; import org.apache.camel.karavan.infinispan.InfinispanService; import org.apache.camel.karavan.infinispan.model.ProjectFile; -import org.apache.camel.karavan.code.CodeService; -import jakarta.inject.Inject; -import jakarta.ws.rs.Consumes; -import jakarta.ws.rs.DELETE; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.HeaderParam; -import jakarta.ws.rs.POST; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.PathParam; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; import java.time.Instant; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectGitResource.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectGitResource.java index 99588861..948b88a2 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectGitResource.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectGitResource.java @@ -16,17 +16,12 @@ */ package org.apache.camel.karavan.api; +import jakarta.inject.Inject; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; import org.apache.camel.karavan.infinispan.model.Project; import org.apache.camel.karavan.service.ProjectService; -import jakarta.inject.Inject; -import jakarta.ws.rs.Consumes; -import jakarta.ws.rs.GET; -import jakarta.ws.rs.POST; -import jakarta.ws.rs.Path; -import jakarta.ws.rs.PathParam; -import jakarta.ws.rs.Produces; -import jakarta.ws.rs.core.MediaType; import java.util.HashMap; @Path("/api/git") diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java index ab2042e2..52cfe36e 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectResource.java @@ -16,17 +16,19 @@ */ package org.apache.camel.karavan.api; +import jakarta.inject.Inject; +import jakarta.ws.rs.*; +import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import org.apache.camel.karavan.docker.DockerService; +import org.apache.camel.karavan.git.GitService; import org.apache.camel.karavan.infinispan.InfinispanService; -import org.apache.camel.karavan.infinispan.model.*; +import org.apache.camel.karavan.infinispan.model.CamelStatus; +import org.apache.camel.karavan.infinispan.model.CamelStatusValue; +import org.apache.camel.karavan.infinispan.model.Project; import org.apache.camel.karavan.kubernetes.KubernetesService; -import org.apache.camel.karavan.git.GitService; -import jakarta.inject.Inject; -import jakarta.ws.rs.*; -import jakarta.ws.rs.core.MediaType; -import org.apache.camel.karavan.service.ProjectService; import org.apache.camel.karavan.service.ConfigService; +import org.apache.camel.karavan.service.ProjectService; import org.jboss.logging.Logger; import java.net.URLDecoder; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java index 5faabe0d..e62924e7 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/StatusResource.java @@ -16,11 +16,6 @@ */ package org.apache.camel.karavan.api; -import io.vertx.core.eventbus.EventBus; -import org.apache.camel.karavan.infinispan.InfinispanService; -import org.apache.camel.karavan.infinispan.model.*; -import org.jboss.logging.Logger; - import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; @@ -28,8 +23,13 @@ import jakarta.ws.rs.PathParam; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; +import org.apache.camel.karavan.infinispan.InfinispanService; +import org.apache.camel.karavan.infinispan.model.CamelStatus; +import org.apache.camel.karavan.infinispan.model.CamelStatusValue; +import org.apache.camel.karavan.infinispan.model.DeploymentStatus; +import org.jboss.logging.Logger; + import java.util.List; -import java.util.Optional; @Path("/api/status") public class StatusResource { diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/UsersResource.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/UsersResource.java index 0d03c133..fbf6e61e 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/UsersResource.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/UsersResource.java @@ -17,16 +17,13 @@ package org.apache.camel.karavan.api; +import io.quarkus.security.identity.SecurityIdentity; import jakarta.inject.Inject; import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; - -import io.quarkus.oidc.IdToken; -import org.eclipse.microprofile.jwt.JsonWebToken; import org.jboss.resteasy.reactive.NoCache; -import io.quarkus.security.identity.SecurityIdentity; import java.util.Set; @@ -47,7 +44,7 @@ public class UsersResource { public static class User { private final String userName; - private final java.util.Set<java.lang.String> roles; + private final Set<String> roles; User(SecurityIdentity securityIdentity) { this.userName = securityIdentity.getPrincipal().getName(); diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/CodeService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/CodeService.java index 0877c3a2..18e44f57 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/CodeService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/CodeService.java @@ -31,11 +31,11 @@ import org.apache.camel.CamelContext; import org.apache.camel.generator.openapi.RestDslGenerator; import org.apache.camel.impl.DefaultCamelContext; import org.apache.camel.karavan.api.KameletResources; -import org.apache.camel.karavan.docker.DockerService; import org.apache.camel.karavan.code.model.DockerComposeService; -import org.apache.camel.karavan.infinispan.InfinispanService; +import org.apache.camel.karavan.docker.DockerService; import org.apache.camel.karavan.git.model.GitRepo; import org.apache.camel.karavan.git.model.GitRepoFile; +import org.apache.camel.karavan.infinispan.InfinispanService; import org.apache.camel.karavan.infinispan.model.Project; import org.apache.camel.karavan.infinispan.model.ProjectFile; import org.apache.camel.karavan.kubernetes.KubernetesService; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/model/DockerComposeService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/model/DockerComposeService.java index 98f6ed2a..0370faae 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/model/DockerComposeService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/code/model/DockerComposeService.java @@ -17,7 +17,10 @@ package org.apache.camel.karavan.code.model; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; public class DockerComposeService { diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventListener.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventListener.java index 6555ff3d..d3ed22a3 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventListener.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerEventListener.java @@ -21,18 +21,15 @@ import com.github.dockerjava.api.async.ResultCallback; import com.github.dockerjava.api.model.Container; import com.github.dockerjava.api.model.Event; import com.github.dockerjava.api.model.EventType; -import io.vertx.core.eventbus.EventBus; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import org.apache.camel.karavan.infinispan.InfinispanService; import org.apache.camel.karavan.infinispan.model.ContainerStatus; -import org.eclipse.microprofile.config.inject.ConfigProperty; import org.jboss.logging.Logger; import java.io.Closeable; import java.io.IOException; import java.util.Objects; -import java.util.Optional; import static org.apache.camel.karavan.shared.Constants.*; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForGitea.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForGitea.java index ab7bf72d..407e0baa 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForGitea.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForGitea.java @@ -20,11 +20,11 @@ import com.github.dockerjava.api.command.ExecCreateCmdResponse; import com.github.dockerjava.api.model.Container; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; -import org.apache.camel.karavan.infinispan.model.ContainerStatus; -import org.apache.camel.karavan.git.model.GitConfig; import org.apache.camel.karavan.code.CodeService; import org.apache.camel.karavan.git.GitService; import org.apache.camel.karavan.git.GiteaService; +import org.apache.camel.karavan.git.model.GitConfig; +import org.apache.camel.karavan.infinispan.model.ContainerStatus; import org.jboss.logging.Logger; @ApplicationScoped diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForInfinispan.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForInfinispan.java index 7af32ff3..29874102 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForInfinispan.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForInfinispan.java @@ -18,8 +18,8 @@ package org.apache.camel.karavan.docker; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; -import org.apache.camel.karavan.infinispan.model.ContainerStatus; import org.apache.camel.karavan.code.CodeService; +import org.apache.camel.karavan.infinispan.model.ContainerStatus; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.jboss.logging.Logger; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForRegistry.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForRegistry.java index f3fee4c7..0bd9c6d0 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForRegistry.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForRegistry.java @@ -18,8 +18,8 @@ package org.apache.camel.karavan.docker; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; -import org.apache.camel.karavan.infinispan.model.ContainerStatus; import org.apache.camel.karavan.code.CodeService; +import org.apache.camel.karavan.infinispan.model.ContainerStatus; import org.jboss.logging.Logger; @ApplicationScoped diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java index 6ffb3d1b..3941a4bc 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerService.java @@ -33,20 +33,23 @@ import jakarta.inject.Inject; import org.apache.camel.karavan.code.CodeService; import org.apache.camel.karavan.code.model.DockerComposeService; import org.apache.camel.karavan.infinispan.model.ContainerStatus; -import org.apache.camel.karavan.shared.Constants; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; import org.apache.commons.io.IOUtils; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.jboss.logging.Logger; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.util.*; import java.util.stream.Collectors; -import static org.apache.camel.karavan.shared.Constants.*; +import static org.apache.camel.karavan.shared.Constants.LABEL_PROJECT_ID; +import static org.apache.camel.karavan.shared.Constants.LABEL_TYPE; @ApplicationScoped public class DockerService extends DockerServiceUtils { @@ -280,7 +283,6 @@ public class DockerService extends DockerServiceUtils { public void copyFiles(String containerId, String containerPath, Map<String, String> files) throws IOException { String temp = codeService.saveProjectFilesInTemp(files); - System.out.println(temp); dockerClient.copyArchiveToContainerCmd(containerId).withRemotePath(containerPath) .withDirChildrenOnly(true).withHostResource(temp).exec(); } @@ -321,7 +323,7 @@ public class DockerService extends DockerServiceUtils { .withStdErr(true) .withTimestamps(false) .withFollowStream(true) - .withTailAll() + .withTail(100) .exec(callback); callback.awaitCompletion(); } @@ -395,7 +397,7 @@ public class DockerService extends DockerServiceUtils { public int getMaxPortMapped(int port) { return getDockerClient().listContainersCmd().withShowAll(true).exec().stream() .map(c -> List.of(c.ports)) - .flatMap(java.util.List::stream) + .flatMap(List::stream) .filter(p -> Objects.equals(p.getPrivatePort(), port)) .map(ContainerPort::getPublicPort).filter(Objects::nonNull) .mapToInt(Integer::intValue) diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerServiceUtils.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerServiceUtils.java index 79cb561d..049a9f62 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerServiceUtils.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerServiceUtils.java @@ -18,11 +18,10 @@ package org.apache.camel.karavan.docker; import com.github.dockerjava.api.model.*; import io.smallrye.mutiny.tuples.Tuple2; -import io.vertx.core.json.JsonArray; import org.apache.camel.karavan.api.KameletResources; import org.apache.camel.karavan.code.model.DockerComposeHealthCheck; -import org.apache.camel.karavan.infinispan.model.ContainerStatus; import org.apache.camel.karavan.infinispan.model.ContainerPort; +import org.apache.camel.karavan.infinispan.model.ContainerStatus; import java.io.BufferedReader; import java.io.InputStream; @@ -59,10 +58,13 @@ public class DockerServiceUtils { protected void updateStatistics(ContainerStatus containerStatus, Statistics stats) { if (stats != null && stats.getMemoryStats() != null) { - String memoryUsage = formatMemory(stats.getMemoryStats().getUsage()); - String memoryLimit = formatMemory(stats.getMemoryStats().getLimit()); - containerStatus.setMemoryInfo(memoryUsage + " / " + memoryLimit); + String memoryUsageString = formatMemory(stats.getMemoryStats().getUsage()); + String memoryLimitString = formatMemory(stats.getMemoryStats().getLimit()); + containerStatus.setMemoryInfo(memoryUsageString + " / " + memoryLimitString); containerStatus.setCpuInfo(formatCpu(containerStatus.getContainerName(), stats)); + } else { + containerStatus.setMemoryInfo("0MiB/0MiB"); + containerStatus.setCpuInfo("0%"); } } diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/git/GitService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/git/GitService.java index 99cb38ff..098b79bd 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/git/GitService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/git/GitService.java @@ -19,43 +19,32 @@ package org.apache.camel.karavan.git; import io.fabric8.kubernetes.api.model.Secret; import io.smallrye.mutiny.tuples.Tuple2; import io.vertx.core.Vertx; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; import org.apache.camel.karavan.git.model.GitConfig; import org.apache.camel.karavan.git.model.GitRepo; import org.apache.camel.karavan.git.model.GitRepoFile; -import org.apache.camel.karavan.infinispan.model.*; +import org.apache.camel.karavan.infinispan.model.Project; +import org.apache.camel.karavan.infinispan.model.ProjectFile; import org.apache.camel.karavan.kubernetes.KubernetesService; -import org.apache.camel.karavan.registry.RegistryConfig; import org.apache.camel.karavan.service.ConfigService; -import org.eclipse.jgit.api.CheckoutCommand; -import org.eclipse.jgit.api.CloneCommand; -import org.eclipse.jgit.api.FetchCommand; -import org.eclipse.jgit.api.Git; -import org.eclipse.jgit.api.PullCommand; -import org.eclipse.jgit.api.PullResult; -import org.eclipse.jgit.api.RemoteAddCommand; +import org.eclipse.jgit.api.*; import org.eclipse.jgit.api.errors.GitAPIException; import org.eclipse.jgit.api.errors.RefNotFoundException; import org.eclipse.jgit.api.errors.TransportException; import org.eclipse.jgit.diff.DiffEntry; import org.eclipse.jgit.lib.ObjectId; import org.eclipse.jgit.revwalk.RevCommit; -import org.eclipse.jgit.transport.CredentialsProvider; -import org.eclipse.jgit.transport.FetchResult; -import org.eclipse.jgit.transport.PushResult; -import org.eclipse.jgit.transport.URIish; -import org.eclipse.jgit.transport.UsernamePasswordCredentialsProvider; +import org.eclipse.jgit.transport.*; import org.eclipse.jgit.treewalk.TreeWalk; import org.eclipse.jgit.treewalk.filter.TreeFilter; import org.eclipse.microprofile.config.ConfigProvider; import org.eclipse.microprofile.faulttolerance.Retry; import org.jboss.logging.Logger; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.inject.Inject; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; -import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/InfinispanService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/InfinispanService.java index 27492c57..109781e3 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/InfinispanService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/InfinispanService.java @@ -41,7 +41,10 @@ import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.time.Instant; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.concurrent.CompletableFuture; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java index 562b8b30..6c4beac4 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java @@ -32,6 +32,7 @@ public class Project { @ProtoEnumValue (number = 1, name = "kamelets") kamelets, @ProtoEnumValue (number = 2, name = "services") services, @ProtoEnumValue (number = 3, name = "normal") normal, + @ProtoEnumValue (number = 4, name = "ephemeral") ephemeral, } @ProtoField(number = 1) diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java index 14a6d6a0..5b2459ab 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java @@ -27,29 +27,25 @@ import io.fabric8.openshift.client.OpenShiftClient; import io.quarkus.runtime.configuration.ProfileManager; import io.smallrye.mutiny.tuples.Tuple2; import io.vertx.mutiny.core.eventbus.EventBus; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Default; +import jakarta.enterprise.inject.Produces; +import jakarta.inject.Inject; +import org.apache.camel.karavan.code.CodeService; import org.apache.camel.karavan.infinispan.InfinispanService; import org.apache.camel.karavan.infinispan.model.ContainerStatus; import org.apache.camel.karavan.infinispan.model.Project; -import org.apache.camel.karavan.infinispan.model.ProjectFile; -import org.apache.camel.karavan.code.CodeService; import org.apache.camel.karavan.service.ConfigService; -import org.eclipse.microprofile.config.ConfigProvider; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.eclipse.microprofile.health.HealthCheck; import org.eclipse.microprofile.health.HealthCheckResponse; import org.eclipse.microprofile.health.Readiness; import org.jboss.logging.Logger; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.enterprise.inject.Default; -import jakarta.enterprise.inject.Produces; -import jakarta.inject.Inject; - import java.nio.charset.StandardCharsets; import java.util.*; import java.util.stream.Collectors; -import static org.apache.camel.karavan.code.CodeService.APPLICATION_PROPERTIES_FILENAME; import static org.apache.camel.karavan.shared.Constants.*; @Default diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java index c137a560..0af91999 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/PodEventHandler.java @@ -26,15 +26,14 @@ import io.vertx.core.json.JsonObject; import io.vertx.mutiny.core.eventbus.EventBus; import org.apache.camel.karavan.infinispan.InfinispanService; import org.apache.camel.karavan.infinispan.model.ContainerStatus; -import org.apache.camel.karavan.infinispan.model.ProjectFile; import org.jboss.logging.Logger; import java.util.List; import java.util.Objects; import static org.apache.camel.karavan.code.CodeService.DEFAULT_CONTAINER_RESOURCES; -import static org.apache.camel.karavan.shared.Constants.LABEL_PROJECT_ID; import static org.apache.camel.karavan.service.ContainerStatusService.CONTAINER_STATUS; +import static org.apache.camel.karavan.shared.Constants.LABEL_PROJECT_ID; import static org.apache.camel.karavan.shared.Constants.LABEL_TYPE; public class PodEventHandler implements ResourceEventHandler<Pod> { diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/AuthService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/AuthService.java index ae56f23f..099c2571 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/AuthService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/AuthService.java @@ -16,10 +16,10 @@ */ package org.apache.camel.karavan.service; +import jakarta.enterprise.context.ApplicationScoped; import org.eclipse.microprofile.config.ConfigProvider; import org.jboss.logging.Logger; -import jakarta.enterprise.context.ApplicationScoped; import java.net.MalformedURLException; import java.util.Map; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CamelService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CamelService.java index a945bcc0..134b41fe 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CamelService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/CamelService.java @@ -24,6 +24,8 @@ import io.vertx.mutiny.core.buffer.Buffer; import io.vertx.mutiny.core.eventbus.EventBus; import io.vertx.mutiny.ext.web.client.HttpResponse; import io.vertx.mutiny.ext.web.client.WebClient; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.inject.Inject; import org.apache.camel.karavan.code.CodeService; import org.apache.camel.karavan.infinispan.InfinispanService; import org.apache.camel.karavan.infinispan.model.CamelStatus; @@ -35,9 +37,6 @@ import org.eclipse.microprofile.config.inject.ConfigProperty; import org.eclipse.microprofile.faulttolerance.CircuitBreaker; import org.jboss.logging.Logger; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.inject.Inject; - import java.util.*; import java.util.concurrent.ExecutionException; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java index 4dc2dd5a..fca69c3b 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java @@ -17,11 +17,10 @@ package org.apache.camel.karavan.service; import io.quarkus.runtime.StartupEvent; -import org.apache.camel.karavan.shared.Configuration; -import org.eclipse.microprofile.config.inject.ConfigProperty; - import jakarta.enterprise.context.ApplicationScoped; import jakarta.enterprise.event.Observes; +import org.apache.camel.karavan.shared.Configuration; +import org.eclipse.microprofile.config.inject.ConfigProperty; import java.nio.file.Files; import java.nio.file.Paths; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ContainerStatusService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ContainerStatusService.java index b9cca03c..9909b20b 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ContainerStatusService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ContainerStatusService.java @@ -26,7 +26,6 @@ import jakarta.inject.Inject; import org.apache.camel.karavan.docker.DockerService; import org.apache.camel.karavan.infinispan.InfinispanService; import org.apache.camel.karavan.infinispan.model.ContainerStatus; -import org.apache.camel.karavan.infinispan.model.Project; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.jboss.logging.Logger; @@ -39,6 +38,7 @@ import java.util.Objects; public class ContainerStatusService { public static final String CONTAINER_STATUS = "CONTAINER_STATUS"; + public static final String CONTAINER_DELETED = "CONTAINER_DELETED"; private static final Logger LOGGER = Logger.getLogger(ContainerStatusService.class.getName()); @ConfigProperty(name = "karavan.environment") String environment; @@ -57,7 +57,7 @@ public class ContainerStatusService { if (infinispanService.isReady() && !ConfigService.inKubernetes()) { List<ContainerStatus> statusesInDocker = dockerService.collectContainersStatistics(); statusesInDocker.forEach(containerStatus -> { - eventBus.send(ContainerStatusService.CONTAINER_STATUS, JsonObject.mapFrom(containerStatus)); + eventBus.publish(ContainerStatusService.CONTAINER_STATUS, JsonObject.mapFrom(containerStatus)); }); } } @@ -68,7 +68,7 @@ public class ContainerStatusService { if (!ConfigService.inKubernetes()) { List<ContainerStatus> statusesInDocker = dockerService.collectContainersStatuses(); statusesInDocker.forEach(containerStatus -> { - eventBus.send(ContainerStatusService.CONTAINER_STATUS, JsonObject.mapFrom(containerStatus)); + eventBus.publish(ContainerStatusService.CONTAINER_STATUS, JsonObject.mapFrom(containerStatus)); }); cleanContainersStatuses(statusesInDocker); } @@ -84,6 +84,7 @@ public class ContainerStatusService { .filter(cs -> !checkTransit(cs)) .filter(cs -> !namesInDocker.contains(cs.getContainerName())) .forEach(containerStatus -> { + eventBus.publish(ContainerStatusService.CONTAINER_DELETED, JsonObject.mapFrom(containerStatus)); infinispanService.deleteContainerStatus(containerStatus); infinispanService.deleteCamelStatuses(containerStatus.getProjectId(), containerStatus.getEnv()); }); @@ -114,24 +115,12 @@ public class ContainerStatusService { } } - @ConsumeEvent(value = CONTAINER_STATUS, blocking = true, ordered = true) - public void checkProjectExists(JsonObject data) { - if (infinispanService.isReady()) { - ContainerStatus status = data.mapTo(ContainerStatus.class); - if (status.getType().equals(ContainerStatus.ContainerType.project)) { - Project project = infinispanService.getProject(status.getProjectId()); - if (project == null) { - project = new Project(status.getProjectId(), status.getProjectId(), status.getProjectId()); - infinispanService.saveProject(project); - } - } - } - } - private void saveContainerStatus(ContainerStatus newStatus, ContainerStatus oldStatus) { if (Objects.equals("exited", newStatus.getState()) || Objects.equals("dead", newStatus.getState())) { if (Objects.isNull(oldStatus.getFinished())) { newStatus.setFinished(Instant.now().toString()); + newStatus.setMemoryInfo("0MiB/0MiB"); + newStatus.setCpuInfo("0%"); } else if (Objects.nonNull(oldStatus.getFinished())) { return; } diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java index 582f3a98..3748e4d3 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/KaravanService.java @@ -22,6 +22,8 @@ import io.quarkus.runtime.Startup; import io.quarkus.runtime.StartupEvent; import io.quarkus.vertx.ConsumeEvent; import io.vertx.core.eventbus.EventBus; +import jakarta.enterprise.event.Observes; +import jakarta.inject.Inject; import jakarta.inject.Singleton; import org.apache.camel.karavan.docker.DockerForGitea; import org.apache.camel.karavan.docker.DockerForInfinispan; @@ -36,8 +38,6 @@ import org.eclipse.microprofile.health.HealthCheckResponse; import org.eclipse.microprofile.health.Liveness; import org.jboss.logging.Logger; -import jakarta.enterprise.event.Observes; -import jakarta.inject.Inject; import java.io.IOException; @Startup @@ -82,7 +82,7 @@ public class KaravanService implements HealthCheck { private static final String START_KUBERNETES_SERVICES = "START_KUBERNETES_LISTENERS"; private static final String START_INTERNAL_DOCKER_SERVICES = "START_INTERNAL_DOCKER_SERVICES"; - private static final String START_SERVICES = "START_SERVICES"; + public static final String START_SERVICES = "START_SERVICES"; @Override public HealthCheckResponse call() { diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java index b163dbd8..37e71092 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java @@ -18,14 +18,20 @@ package org.apache.camel.karavan.service; import io.vertx.core.json.JsonObject; import io.vertx.mutiny.core.eventbus.EventBus; +import jakarta.enterprise.context.ApplicationScoped; +import jakarta.enterprise.inject.Default; +import jakarta.inject.Inject; import org.apache.camel.karavan.code.CodeService; import org.apache.camel.karavan.code.DockerComposeConverter; -import org.apache.camel.karavan.docker.DockerForKaravan; import org.apache.camel.karavan.code.model.DockerComposeService; +import org.apache.camel.karavan.docker.DockerForKaravan; import org.apache.camel.karavan.git.GitService; import org.apache.camel.karavan.git.model.GitRepo; import org.apache.camel.karavan.infinispan.InfinispanService; -import org.apache.camel.karavan.infinispan.model.*; +import org.apache.camel.karavan.infinispan.model.ContainerStatus; +import org.apache.camel.karavan.infinispan.model.GroupedKey; +import org.apache.camel.karavan.infinispan.model.Project; +import org.apache.camel.karavan.infinispan.model.ProjectFile; import org.apache.camel.karavan.kubernetes.KubernetesService; import org.apache.camel.karavan.registry.RegistryService; import org.apache.camel.karavan.shared.Property; @@ -37,10 +43,6 @@ import org.eclipse.microprofile.health.HealthCheckResponse; import org.eclipse.microprofile.health.Readiness; import org.jboss.logging.Logger; -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.enterprise.inject.Default; -import jakarta.inject.Inject; - import java.time.Instant; import java.util.*; import java.util.concurrent.atomic.AtomicBoolean; diff --git a/karavan-web/karavan-app/src/main/webui/src/containers/ContainerTableRow.tsx b/karavan-web/karavan-app/src/main/webui/src/containers/ContainerTableRow.tsx index 5a751f48..edc74604 100644 --- a/karavan-web/karavan-app/src/main/webui/src/containers/ContainerTableRow.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/containers/ContainerTableRow.tsx @@ -98,7 +98,9 @@ export function ContainerTableRow(props: Props) { <Td> <Label color={color}>{container.containerName}</Label> </Td> - <Td>{image}</Td> + <Td> + <p style={{wordWrap:"break-word"}}>{image}</p> + </Td> <Td> {isRunning && container.cpuInfo && <Label color={color}>{container.cpuInfo}</Label>} </Td> diff --git a/karavan-web/karavan-app/src/main/webui/src/containers/ContainersPage.tsx b/karavan-web/karavan-app/src/main/webui/src/containers/ContainersPage.tsx index 5fe8adc4..d8523b6f 100644 --- a/karavan-web/karavan-app/src/main/webui/src/containers/ContainersPage.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/containers/ContainersPage.tsx @@ -137,7 +137,7 @@ export function ContainersPage () { const conts = containers.filter(d => d.containerName.toLowerCase().includes(filter)); return ( - <PageSection className="kamelet-section dashboard-page" padding={{default: 'noPadding'}}> + <PageSection className="kamelet-section" padding={{default: 'noPadding'}}> <PageSection className="tools-section" padding={{default: 'noPadding'}}> <MainToolbar title={title()} tools={tools()}/> </PageSection> diff --git a/karavan-web/karavan-app/src/main/webui/src/project/build/BuildPanel.tsx b/karavan-web/karavan-app/src/main/webui/src/project/build/BuildPanel.tsx deleted file mode 100644 index f1dedba6..00000000 --- a/karavan-web/karavan-app/src/main/webui/src/project/build/BuildPanel.tsx +++ /dev/null @@ -1,207 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import React, {useEffect, useState} from 'react'; -import { - Button, - DescriptionList, - DescriptionListTerm, - DescriptionListGroup, - DescriptionListDescription, Spinner, Tooltip, Flex, FlexItem, LabelGroup, Label, Modal, Badge, CardBody, Card -} from '@patternfly/react-core'; -import '../../designer/karavan.css'; -import {KaravanApi} from "../../api/KaravanApi"; -import BuildIcon from "@patternfly/react-icons/dist/esm/icons/build-icon"; -import UpIcon from "@patternfly/react-icons/dist/esm/icons/check-circle-icon"; -import DownIcon from "@patternfly/react-icons/dist/esm/icons/error-circle-o-icon"; -import ClockIcon from "@patternfly/react-icons/dist/esm/icons/clock-icon"; -import TagIcon from "@patternfly/react-icons/dist/esm/icons/tag-icon"; -import DeleteIcon from "@patternfly/react-icons/dist/esm/icons/times-circle-icon"; -import {useAppConfigStore, useLogStore, useProjectStore, useStatusesStore} from "../../api/ProjectStore"; -import {shallow} from "zustand/shallow"; -import {EventBus} from "../../designer/utils/EventBus"; -import {ProjectService} from "../../api/ProjectService"; - -export function BuildPanel () { - - const [config] = useAppConfigStore((state) => [state.config], shallow) - const [project] = useProjectStore((s) => [s.project], shallow); - const [setShowLog] = useLogStore((s) => [s.setShowLog], shallow); - const [containers, deployments, camels] = - useStatusesStore((s) => [s.containers, s.deployments, s.camels], shallow); - const [isPushing, setIsPushing] = useState<boolean>(false); - const [isBuilding, setIsBuilding] = useState<boolean>(false); - const [showDeleteConfirmation, setShowDeleteConfirmation] = useState<boolean>(false); - const [deleteEntityName, setDeleteEntityName] = useState<string>(); - const [tag, setTag] = useState<string>( - new Date().toISOString().substring(0,19).replaceAll(':', '').replaceAll('-', '') - ); - - function deleteEntity() { - const buildName = getBuildName(); - if (buildName) { - KaravanApi.manageContainer(config.environment, 'build', buildName, 'delete', res => { - EventBus.sendAlert("Container deleted", "Container " + buildName + " deleted", 'info') - setShowLog(false, 'container', undefined) - }); - } - } - - function build() { - setIsBuilding(true); - setShowLog(false,'none') - KaravanApi.buildProject(project, tag, res => { - if (res.status === 200 || res.status === 201) { - setIsBuilding(false); - } else { - console.log(res); - EventBus.sendAlert("Error", (res as any)?.response?.data, 'danger') - } - }); - } - - function buildButton() { - const status = containers.filter(c => c.projectId === project.projectId && c.type === 'build').at(0); - const isRunning = status?.state === 'running'; - return (<Tooltip content="Start build" position={"left"}> - <Button isLoading={isBuilding ? true : undefined} - isDisabled={isBuilding || isRunning || isPushing} - size="sm" - variant="secondary" - className="project-button" - icon={!isBuilding ? <BuildIcon/> : <div></div>} - onClick={e => build()}> - {isBuilding ? "..." : "Build"} - </Button> - </Tooltip>) - } - - function getContainerStatus() { - return containers.filter(c => c.projectId === project.projectId && c.type === 'build').at(0); - } - - function getBuildName() { - const status = getContainerStatus(); - return status?.containerName; - } - - function getBuildState() { - const status = getContainerStatus(); - const buildName = getBuildName(); - const state = status?.state; - let buildTime = 0; - if (status?.created) { - const start: Date = new Date(status.created); - const finish: Date = status.finished !== undefined && status.finished !== null ? new Date(status.finished) : new Date(); - buildTime = Math.round((finish.getTime() - start.getTime()) / 1000); - } - const showTime = buildTime && buildTime > 0; - const isRunning = state === 'running'; - const isExited = state === 'exited'; - const isFailed = state === 'failed'; - const color = (isRunning ? "blue" : (isFailed ? "red" : "grey")); - const icon = isExited ? <UpIcon className="not-spinner"/> : <DownIcon className="not-spinner"/> - return ( - <Flex justifyContent={{default: "justifyContentSpaceBetween"}} alignItems={{default: "alignItemsCenter"}}> - <FlexItem> - <LabelGroup numLabels={3}> - <Label icon={isRunning ? <Spinner diameter="16px" className="spinner"/> : icon} - color={color}> - {buildName - ? <Button className='labeled-button' variant="link" onClick={e => - useLogStore.setState({showLog: true, type: 'build', podName: buildName}) - }> - {buildName} - </Button> - : "No builder"} - {status !== undefined && <Tooltip content={"Delete build"}> - <Button - icon={<DeleteIcon/>} - className="labeled-button" - variant="link" onClick={e => { - setShowDeleteConfirmation(true); - setDeleteEntityName(buildName); - }}></Button> - </Tooltip>} - </Label> - {buildName !== undefined && showTime === true && buildTime !== undefined && - <Label icon={<ClockIcon className="not-spinner"/>} - color={color}>{buildTime + "s"}</Label>} - </LabelGroup> - </FlexItem> - <FlexItem>{buildButton()}</FlexItem> - </Flex> - ) - } - - function getBuildTag() { - const status = containers.filter(c => c.projectId === project.projectId && c.type === 'build').at(0); - const state = status?.state; - const isRunning = state === 'running'; - const isExited = state === 'exited'; - const color = isExited ? "grey" : (isRunning ? "blue" : "grey"); - return ( - <Label isEditable={!isRunning} onEditComplete={(_, v) => setTag(v)} - icon={<TagIcon className="not-spinner"/>} - color={color}>{tag}</Label> - ) - } - - function getDeleteConfirmation() { - return (<Modal - className="modal-delete" - title="Confirmation" - isOpen={showDeleteConfirmation} - onClose={() => setShowDeleteConfirmation(false)} - actions={[ - <Button key="confirm" variant="primary" onClick={e => { - if (deleteEntityName && deleteEntity) { - deleteEntity(); - setShowDeleteConfirmation(false); - } - }}>Delete - </Button>, - <Button key="cancel" variant="link" - onClick={e => setShowDeleteConfirmation(false)}>Cancel</Button> - ]} - onEscapePress={e => setShowDeleteConfirmation(false)}> - <div>{"Delete build " + deleteEntityName + "?"}</div> - </Modal>) - } - - return ( - <Card className="project-status"> - <CardBody> - <DescriptionList isHorizontal horizontalTermWidthModifier={{default: '20ch'}}> - <DescriptionListGroup> - <DescriptionListTerm>Tag</DescriptionListTerm> - <DescriptionListDescription> - {getBuildTag()} - </DescriptionListDescription> - </DescriptionListGroup> - <DescriptionListGroup> - <DescriptionListTerm>Build container</DescriptionListTerm> - <DescriptionListDescription> - {getBuildState()} - </DescriptionListDescription> - </DescriptionListGroup> - </DescriptionList> - </CardBody> - {showDeleteConfirmation && getDeleteConfirmation()} - </Card> - ) -} diff --git a/karavan-web/karavan-app/src/main/webui/src/project/build/ImagesPanel.tsx b/karavan-web/karavan-app/src/main/webui/src/project/build/ImagesPanel.tsx deleted file mode 100644 index 22c22a93..00000000 --- a/karavan-web/karavan-app/src/main/webui/src/project/build/ImagesPanel.tsx +++ /dev/null @@ -1,238 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import React, {useState} from 'react'; -import { - Button, - Tooltip, - Flex, - FlexItem, - Modal, - Panel, - PanelHeader, - TextContent, - Text, - TextVariants, - Bullseye, EmptyState, EmptyStateVariant, EmptyStateHeader, EmptyStateIcon, PageSection, Switch, TextInput -} from '@patternfly/react-core'; -import '../../designer/karavan.css'; -import {useFilesStore, useProjectStore} from "../../api/ProjectStore"; -import {shallow} from "zustand/shallow"; -import {Table} from "@patternfly/react-table/deprecated"; -import {Tbody, Td, Th, Thead, Tr} from "@patternfly/react-table"; -import SearchIcon from "@patternfly/react-icons/dist/esm/icons/search-icon"; -import SetIcon from "@patternfly/react-icons/dist/esm/icons/check-icon"; -import {KaravanApi} from "../../api/KaravanApi"; -import {ProjectService} from "../../api/ProjectService"; -import {ServicesYaml} from "../../api/ServiceModels"; -import DeleteIcon from "@patternfly/react-icons/dist/js/icons/times-icon"; -import {EventBus} from "../../designer/utils/EventBus"; - -export function ImagesPanel () { - - const [project, images] = useProjectStore((s) => [s.project, s.images], shallow); - const [files] = useFilesStore((s) => [s.files], shallow); - const [showSetConfirmation, setShowSetConfirmation] = useState<boolean>(false); - const [showDeleteConfirmation, setShowDeleteConfirmation] = useState<boolean>(false); - const [imageName, setImageName] = useState<string>(); - const [commitChanges, setCommitChanges] = useState<boolean>(false); - const [commitMessage, setCommitMessage] = useState(''); - - function setProjectImage() { - if (imageName) { - KaravanApi.setProjectImage(project.projectId, imageName, commitChanges, commitMessage, (res: any) => { - ProjectService.refreshProjectData(project.projectId); - }); - } - } - - function getProjectImage(): string | undefined { - const file = files.filter(f => f.name === 'docker-compose.yaml').at(0); - if (file) { - const dc = ServicesYaml.yamlToServices(file.code); - const dcs = dc.services.filter(s => s.container_name === project.projectId).at(0); - return dcs?.image; - } - return undefined; - } - - function getSetConfirmation() { - const index = imageName?.lastIndexOf(":"); - const name = imageName?.substring(0, index); - const tag = index ? imageName?.substring(index+1) : ""; - return (<Modal - className="modal-delete" - title="Confirmation" - isOpen={showSetConfirmation} - onClose={() => setShowSetConfirmation(false)} - actions={[ - <Button key="confirm" variant="primary" onClick={e => { - if (imageName) { - setProjectImage(); - setShowSetConfirmation(false); - setCommitChanges(false); - } - }}>Set - </Button>, - <Button key="cancel" variant="link" - onClick={e => { - setShowSetConfirmation(false); - setCommitChanges(false); - }}>Cancel</Button> - ]} - onEscapePress={e => setShowSetConfirmation(false)}> - <Flex direction={{default:"column"}} justifyContent={{default:"justifyContentFlexStart"}}> - <FlexItem> - <div>{"Set image for project " + project.projectId + ":"}</div> - <div>{"Name: " + name}</div> - <div>{"Tag: " + tag}</div> - </FlexItem> - <FlexItem> - <Switch - id="commit-switch" - label="Commit changes" - isChecked={commitChanges} - onChange={(event, checked) => setCommitChanges(checked)} - isReversed - /> - </FlexItem> - {commitChanges && <FlexItem> - <TextInput value={commitMessage} type="text" - onChange={(_, value) => setCommitMessage(value)} - aria-label="commit message"/> - </FlexItem>} - </Flex> - </Modal>) - } - - function getDeleteConfirmation() { - return (<Modal - className="modal-delete" - title="Confirmation" - isOpen={showDeleteConfirmation} - onClose={() => setShowDeleteConfirmation(false)} - actions={[ - <Button key="confirm" variant="primary" onClick={e => { - if (imageName) { - KaravanApi.deleteImage(imageName, () => { - EventBus.sendAlert("Image deleted", "Image " + imageName + " deleted", 'info'); - setShowDeleteConfirmation(false); - }); - } - }}>Delete - </Button>, - <Button key="cancel" variant="link" - onClick={e => setShowDeleteConfirmation(false)}>Cancel</Button> - ]} - onEscapePress={e => setShowDeleteConfirmation(false)}> - <div>{"Delete image:"}</div> - <div>{imageName}</div> - </Modal>) - } - - const projectImage = getProjectImage(); - return ( - <PageSection className="project-tab-panel project-images-panel" padding={{default: "padding"}}> - <Panel> - <PanelHeader> - <Flex direction={{default: "row"}} justifyContent={{default:"justifyContentFlexStart"}}> - <FlexItem> - <TextContent> - <Text component={TextVariants.h6}>Images</Text> - </TextContent> - </FlexItem> - <FlexItem> - - </FlexItem> - </Flex> - </PanelHeader> - </Panel> - <Table aria-label="Images" variant={"compact"} className={"table"}> - <Thead> - <Tr> - <Th key='status' width={10}></Th> - <Th key='image' width={20}>Image</Th> - <Th key='tag' width={10}>Tag</Th> - <Th key='actions' width={10}></Th> - </Tr> - </Thead> - <Tbody> - {images.map(image => { - const index = image.lastIndexOf(":"); - const name = image.substring(0, index); - const tag = image.substring(index+1); - return <Tr key={image}> - <Td modifier={"fitContent"} > - {image === projectImage ? <SetIcon/> : <div/>} - </Td> - <Td> - {name} - </Td> - <Td> - {tag} - </Td> - <Td modifier={"fitContent"} isActionCell> - <Flex direction={{default: "row"}} justifyContent={{default: "justifyContentFlexEnd"}} - spaceItems={{default: 'spaceItemsNone'}}> - <FlexItem> - <Tooltip content={"Delete image"} position={"bottom"}> - <Button variant={"plain"} - icon={<DeleteIcon/>} - isDisabled={image === projectImage} - onClick={e => { - setImageName(image); - setShowDeleteConfirmation(true); - }}> - </Button> - </Tooltip> - </FlexItem> - <FlexItem> - <Tooltip content="Set project image" position={"bottom"}> - <Button style={{padding: '0'}} - variant={"plain"} - isDisabled={image === projectImage} - onClick={e => { - setImageName(image); - setCommitMessage(commitMessage === '' ? new Date().toLocaleString() : commitMessage); - setShowSetConfirmation(true); - }}> - <SetIcon/> - </Button> - </Tooltip> - </FlexItem> - </Flex> - </Td> - </Tr> - })} - {images.length === 0 && - <Tr> - <Td colSpan={8}> - <Bullseye> - <EmptyState variant={EmptyStateVariant.sm}> - <EmptyStateHeader titleText="No results found" icon={<EmptyStateIcon icon={SearchIcon}/>} headingLevel="h2" /> - </EmptyState> - </Bullseye> - </Td> - </Tr> - } - </Tbody> - </Table> - {showSetConfirmation && getSetConfirmation()} - {showDeleteConfirmation && getDeleteConfirmation()} - </PageSection> - ) -} diff --git a/karavan-web/karavan-app/src/main/webui/src/project/build/ProjectBuildTab.tsx b/karavan-web/karavan-app/src/main/webui/src/project/build/ProjectBuildTab.tsx deleted file mode 100644 index 31e6b19a..00000000 --- a/karavan-web/karavan-app/src/main/webui/src/project/build/ProjectBuildTab.tsx +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to You under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import React from 'react'; -import '../../designer/karavan.css'; -import {BuildPanel} from "./BuildPanel"; -import {PageSection} from "@patternfly/react-core"; - -export function ProjectBuildTab () { - - return ( - <PageSection className="project-tab-panel project-build-panel" padding={{default: "padding"}}> - <div> - <BuildPanel/> - </div> - </PageSection> - ) -}