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 aa7f4df7e04755c76e86bbfd48bdd23de66ab35b Author: Marat Gubaidullin <ma...@talismancloud.io> AuthorDate: Thu Feb 8 13:47:18 2024 -0500 First try for #1115 --- karavan-web/karavan-app/pom.xml | 4 +- .../org/apache/camel/karavan/api/AuthResource.java | 5 +- .../apache/camel/karavan/api/BuildResource.java | 6 +- .../camel/karavan/api/ContainerResource.java | 20 +- .../apache/camel/karavan/api/DevModeResource.java | 16 +- .../camel/karavan/api/InfrastructureResource.java | 24 +- .../apache/camel/karavan/api/KameletResources.java | 16 +- .../camel/karavan/api/ProjectFileResource.java | 22 +- .../camel/karavan/api/ProjectGitResource.java | 2 +- .../apache/camel/karavan/api/ProjectResource.java | 24 +- .../apache/camel/karavan/api/StatusResource.java | 32 +- .../camel/karavan/cache/KaravanCacheService.java | 322 +++++++++++++++++ .../{infinispan => cache}/model/CamelStatus.java | 11 +- .../model/CamelStatusValue.java | 25 +- .../{infinispan => cache}/model/ContainerPort.java | 9 +- .../model/ContainerStatus.java | 47 +-- .../model/DeploymentStatus.java | 13 +- .../{infinispan => cache}/model/GroupedKey.java | 10 +- .../{infinispan => cache}/model/Project.java | 22 +- .../{infinispan => cache}/model/ProjectFile.java | 12 +- .../{infinispan => cache}/model/ServiceStatus.java | 14 +- .../org/apache/camel/karavan/code/CodeService.java | 26 +- .../camel/karavan/docker/DockerEventListener.java | 18 +- .../camel/karavan/docker/DockerForGitea.java | 2 +- .../camel/karavan/docker/DockerForInfinispan.java | 57 --- .../camel/karavan/docker/DockerForKaravan.java | 4 +- .../camel/karavan/docker/DockerForRegistry.java | 2 +- .../apache/camel/karavan/docker/DockerService.java | 2 +- .../camel/karavan/docker/DockerServiceUtils.java | 4 +- .../org/apache/camel/karavan/git/GitService.java | 4 +- .../karavan/infinispan/InfinispanService.java | 401 --------------------- .../karavan/infinispan/model/KaravanSchema.java | 45 --- .../karavan/kubernetes/DeploymentEventHandler.java | 18 +- .../karavan/kubernetes/KubernetesService.java | 14 +- .../camel/karavan/kubernetes/PodEventHandler.java | 14 +- .../karavan/kubernetes/ServiceEventHandler.java | 16 +- .../apache/camel/karavan/service/CamelService.java | 18 +- .../karavan/service/ContainerStatusService.java | 26 +- .../camel/karavan/service/KaravanService.java | 10 +- .../camel/karavan/service/ProjectService.java | 78 ++-- .../project/ProjectFileCreateValidator.java | 12 +- .../validation/project/ProjectModifyValidator.java | 12 +- .../src/main/resources/application.properties | 8 - .../src/main/resources/cache/data-cache-config.xml | 23 -- .../karavan-app/src/main/resources/hazelcast.xml | 21 ++ .../src/main/resources/services/internal.yaml | 6 - 46 files changed, 596 insertions(+), 901 deletions(-) diff --git a/karavan-web/karavan-app/pom.xml b/karavan-web/karavan-app/pom.xml index 4481d289..589669b6 100644 --- a/karavan-web/karavan-app/pom.xml +++ b/karavan-web/karavan-app/pom.xml @@ -90,8 +90,8 @@ <artifactId>smallrye-mutiny-vertx-web-client</artifactId> </dependency> <dependency> - <groupId>io.quarkus</groupId> - <artifactId>quarkus-infinispan-client</artifactId> + <groupId>com.hazelcast</groupId> + <artifactId>quarkus-hazelcast-client</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/AuthResource.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/AuthResource.java index 2c2ca0f7..fa44e8eb 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/AuthResource.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/AuthResource.java @@ -22,7 +22,7 @@ import jakarta.ws.rs.Path; 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.cache.KaravanCacheService; import org.apache.camel.karavan.kubernetes.KubernetesService; import org.apache.camel.karavan.service.AuthService; import org.apache.camel.karavan.service.ProjectService; @@ -45,7 +45,7 @@ public class AuthResource { KubernetesService kubernetesService; @Inject - InfinispanService infinispanService; + KaravanCacheService karavanCacheService; @GET @Path("/auth") @@ -66,7 +66,6 @@ public class AuthResource { @Produces(MediaType.APPLICATION_JSON) public Response getConfiguration() throws Exception { List<HealthCheckResponse> list = List.of( - infinispanService.call(), kubernetesService.call(), projectService.call() ); diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/BuildResource.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/BuildResource.java index ace9fa8c..17ce3ad9 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/BuildResource.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/BuildResource.java @@ -23,15 +23,15 @@ import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; +import org.apache.camel.karavan.cache.KaravanCacheService; import org.apache.camel.karavan.code.CodeService; -import org.apache.camel.karavan.infinispan.InfinispanService; import org.apache.camel.karavan.kubernetes.KubernetesService; @Path("/api/build") public class BuildResource { @Inject - InfinispanService infinispanService; + KaravanCacheService karavanCacheService; @Inject KubernetesService kubernetesService; @@ -44,7 +44,7 @@ public class BuildResource { @Consumes(MediaType.APPLICATION_JSON) @Path("/update-config-map") public Response updateConfigMaps() { - if (infinispanService.isReady()) { + if (karavanCacheService.isReady()) { String script = codeService.getBuilderScript(); kubernetesService.createBuildScriptConfigmap(script, true); return Response.ok().build(); 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 bfcae002..1ad6fd5b 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 @@ -24,11 +24,11 @@ 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.cache.KaravanCacheService; +import org.apache.camel.karavan.cache.model.ContainerStatus; import org.apache.camel.karavan.code.DockerComposeConverter; import org.apache.camel.karavan.code.model.DockerComposeService; 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.kubernetes.KubernetesService; import org.apache.camel.karavan.service.ConfigService; import org.apache.camel.karavan.service.ProjectService; @@ -48,7 +48,7 @@ public class ContainerResource { EventBus eventBus; @Inject - InfinispanService infinispanService; + KaravanCacheService karavanCacheService; @Inject KubernetesService kubernetesService; @@ -67,8 +67,8 @@ public class ContainerResource { @GET @Produces(MediaType.APPLICATION_JSON) public List<ContainerStatus> getAllContainerStatuses() throws Exception { - if (infinispanService.isReady()) { - return infinispanService.getContainerStatuses().stream() + if (karavanCacheService.isReady()) { + return karavanCacheService.getContainerStatuses().stream() .sorted(Comparator.comparing(ContainerStatus::getProjectId)) .collect(Collectors.toList()); } else { @@ -82,7 +82,7 @@ public class ContainerResource { @Path("/{projectId}/{type}/{name}") public Response manageContainer(@PathParam("projectId") String projectId, @PathParam("type") String type, @PathParam("name") String name, JsonObject command) { try { - if (infinispanService.isReady()) { + if (karavanCacheService.isReady()) { if (ConfigService.inKubernetes()) { if (command.getString("command").equalsIgnoreCase("delete")) { kubernetesService.deletePod(name); @@ -151,7 +151,7 @@ public class ContainerResource { } private void setContainerStatusTransit(String projectId, String name, String type) { - ContainerStatus status = infinispanService.getContainerStatus(projectId, environment, name); + ContainerStatus status = karavanCacheService.getContainerStatus(projectId, environment, name); if (status == null) { status = ContainerStatus.createByType(projectId, environment, ContainerStatus.ContainerType.valueOf(type)); } @@ -163,7 +163,7 @@ public class ContainerResource { @Produces(MediaType.APPLICATION_JSON) @Path("/{env}") public List<ContainerStatus> getContainerStatusesByEnv(@PathParam("env") String env) throws Exception { - return infinispanService.getContainerStatuses(env).stream() + return karavanCacheService.getContainerStatuses(env).stream() .sorted(Comparator.comparing(ContainerStatus::getProjectId)) .collect(Collectors.toList()); } @@ -172,7 +172,7 @@ public class ContainerResource { @Produces(MediaType.APPLICATION_JSON) @Path("/{projectId}/{env}") public List<ContainerStatus> getContainerStatusesByProjectAndEnv(@PathParam("projectId") String projectId, @PathParam("env") String env) throws Exception { - return infinispanService.getContainerStatuses(projectId, env).stream() + return karavanCacheService.getContainerStatuses(projectId, env).stream() .filter(podStatus -> Objects.equals(podStatus.getType(), ContainerStatus.ContainerType.project)) .sorted(Comparator.comparing(ContainerStatus::getContainerName)) .collect(Collectors.toList()); @@ -183,7 +183,7 @@ public class ContainerResource { @Consumes(MediaType.APPLICATION_JSON) @Path("/{projectId}/{type}/{name}") public Response deleteContainer(@PathParam("projectId") String projectId, @PathParam("type") String type, @PathParam("name") String name) { - if (infinispanService.isReady()) { + if (karavanCacheService.isReady()) { // set container statuses setContainerStatusTransit(projectId, name, type); try { 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 09fb6c49..226cc894 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 @@ -22,10 +22,10 @@ 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.cache.KaravanCacheService; +import org.apache.camel.karavan.cache.model.ContainerStatus; +import org.apache.camel.karavan.cache.model.Project; 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.apache.camel.karavan.kubernetes.KubernetesService; import org.apache.camel.karavan.service.CamelService; import org.apache.camel.karavan.service.ConfigService; @@ -47,7 +47,7 @@ public class DevModeResource { CamelService camelService; @Inject - InfinispanService infinispanService; + KaravanCacheService karavanCacheService; @Inject KubernetesService kubernetesService; @@ -90,7 +90,7 @@ public class DevModeResource { @Produces(MediaType.APPLICATION_JSON) @Path("/reload/{projectId}") public Response reload(@PathParam("projectId") String projectId) { - if (infinispanService.isReady()) { + if (karavanCacheService.isReady()) { camelService.reloadProjectCode(projectId); return Response.ok().build(); } else { @@ -113,7 +113,7 @@ public class DevModeResource { } private void setContainerStatusTransit(String name, String type) { - ContainerStatus status = infinispanService.getContainerStatus(name, environment, name); + ContainerStatus status = karavanCacheService.getContainerStatus(name, environment, name); if (status == null) { status = ContainerStatus.createByType(name, environment, ContainerStatus.ContainerType.valueOf(type)); } @@ -125,8 +125,8 @@ public class DevModeResource { @Produces(MediaType.APPLICATION_JSON) @Path("/container/{projectId}") public Response getPodStatus(@PathParam("projectId") String projectId) throws RuntimeException { - if (infinispanService.isReady()) { - ContainerStatus cs = infinispanService.getDevModeContainerStatus(projectId, environment); + if (karavanCacheService.isReady()) { + ContainerStatus cs = karavanCacheService.getDevModeContainerStatus(projectId, environment); if (cs != null) { return Response.ok(cs).build(); } else { diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/InfrastructureResource.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/InfrastructureResource.java index dd78fd78..d8b407f4 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/InfrastructureResource.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/InfrastructureResource.java @@ -20,9 +20,9 @@ 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.infinispan.InfinispanService; -import org.apache.camel.karavan.infinispan.model.DeploymentStatus; -import org.apache.camel.karavan.infinispan.model.ServiceStatus; +import org.apache.camel.karavan.cache.KaravanCacheService; +import org.apache.camel.karavan.cache.model.DeploymentStatus; +import org.apache.camel.karavan.cache.model.ServiceStatus; import org.apache.camel.karavan.kubernetes.KubernetesService; import org.apache.camel.karavan.service.ConfigService; import org.eclipse.microprofile.config.inject.ConfigProperty; @@ -36,7 +36,7 @@ import java.util.stream.Collectors; public class InfrastructureResource { @Inject - InfinispanService infinispanService; + KaravanCacheService karavanCacheService; @Inject KubernetesService kubernetesService; @@ -50,8 +50,8 @@ public class InfrastructureResource { @Produces(MediaType.APPLICATION_JSON) @Path("/deployment") public List<DeploymentStatus> getAllDeploymentStatuses() throws Exception { - if (infinispanService.isReady()) { - return infinispanService.getDeploymentStatuses().stream() + if (karavanCacheService.isReady()) { + return karavanCacheService.getDeploymentStatuses().stream() .sorted(Comparator.comparing(DeploymentStatus::getProjectId)) .collect(Collectors.toList()); } else { @@ -63,8 +63,8 @@ public class InfrastructureResource { @Produces(MediaType.APPLICATION_JSON) @Path("/deployment/{env}") public List<DeploymentStatus> getDeploymentStatusesByEnv(@PathParam("env") String env) throws Exception { - if (infinispanService.isReady()) { - return infinispanService.getDeploymentStatuses(env).stream() + if (karavanCacheService.isReady()) { + return karavanCacheService.getDeploymentStatuses(env).stream() .sorted(Comparator.comparing(DeploymentStatus::getProjectId)) .collect(Collectors.toList()); } else { @@ -93,8 +93,8 @@ public class InfrastructureResource { @Produces(MediaType.APPLICATION_JSON) @Path("/service") public List<ServiceStatus> getAllServiceStatuses() throws Exception { - if (infinispanService.isReady()) { - return infinispanService.getServiceStatuses().stream() + if (karavanCacheService.isReady()) { + return karavanCacheService.getServiceStatuses().stream() .sorted(Comparator.comparing(ServiceStatus::getProjectId)) .collect(Collectors.toList()); } else { @@ -135,11 +135,11 @@ public class InfrastructureResource { @Produces(MediaType.APPLICATION_JSON) @Path("/services") public Response getServices() throws Exception { - if (infinispanService.isReady()) { + if (karavanCacheService.isReady()) { if (ConfigService.inKubernetes()) { return Response.ok(kubernetesService.getServices(kubernetesService.getNamespace())).build(); } else { - List<String> list = infinispanService.getContainerStatuses(environment).stream() + List<String> list = karavanCacheService.getContainerStatuses(environment).stream() .filter(ci -> !ci.getPorts().isEmpty()) .map(ci -> ci.getPorts().stream().map(i -> ci.getContainerName() + "|" + ci.getContainerName() + ":" + i.getPrivatePort()).collect(Collectors.toList())) .flatMap(List::stream).collect(Collectors.toList()); 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 6ae78b87..39552860 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 @@ -21,10 +21,10 @@ import jakarta.ws.rs.GET; import jakarta.ws.rs.Path; import jakarta.ws.rs.Produces; import jakarta.ws.rs.core.MediaType; +import org.apache.camel.karavan.cache.KaravanCacheService; +import org.apache.camel.karavan.cache.model.Project; +import org.apache.camel.karavan.cache.model.ProjectFile; import org.apache.camel.karavan.code.CodeService; -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.yaml.snakeyaml.Yaml; import java.util.List; @@ -34,7 +34,7 @@ import java.util.stream.Collectors; public class KameletResources { @Inject - InfinispanService infinispanService; + KaravanCacheService karavanCacheService; @Inject CodeService codeService; @@ -43,8 +43,8 @@ public class KameletResources { @Produces(MediaType.TEXT_PLAIN) public String getKamelets() { StringBuilder kamelets = new StringBuilder(codeService.getResourceFile("/kamelets/kamelets.yaml")); - if (infinispanService.isReady()) { - List<ProjectFile> custom = infinispanService.getProjectFiles(Project.Type.kamelets.name()); + if (karavanCacheService.isReady()) { + List<ProjectFile> custom = karavanCacheService.getProjectFiles(Project.Type.kamelets.name()); if (!custom.isEmpty()) { kamelets.append("\n---\n"); kamelets.append(custom.stream() @@ -59,9 +59,9 @@ public class KameletResources { @Produces(MediaType.APPLICATION_JSON) @Path("/names") public List<String> getCustomNames() { - if (infinispanService.isReady()) { + if (karavanCacheService.isReady()) { Yaml yaml = new Yaml(); - return infinispanService.getProjectFiles(Project.Type.kamelets.name()).stream() + return karavanCacheService.getProjectFiles(Project.Type.kamelets.name()).stream() .map(projectFile -> projectFile.getName().replace(".kamelet.yaml", "")) .collect(Collectors.toList()); } else { 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 41b78850..8f5b5322 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 @@ -20,9 +20,9 @@ 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.Project; -import org.apache.camel.karavan.infinispan.model.ProjectFile; +import org.apache.camel.karavan.cache.KaravanCacheService; +import org.apache.camel.karavan.cache.model.Project; +import org.apache.camel.karavan.cache.model.ProjectFile; import org.apache.camel.karavan.validation.project.ProjectFileCreateValidator; import java.net.URLDecoder; @@ -36,7 +36,7 @@ import java.util.stream.Collectors; public class ProjectFileResource { @Inject - InfinispanService infinispanService; + KaravanCacheService karavanCacheService; @Inject CodeService codeService; @@ -48,7 +48,7 @@ public class ProjectFileResource { @Produces(MediaType.APPLICATION_JSON) @Path("/{projectId}") public List<ProjectFile> get(@PathParam("projectId") String projectId) throws Exception { - return infinispanService.getProjectFiles(projectId).stream() + return karavanCacheService.getProjectFiles(projectId).stream() .sorted(Comparator.comparing(ProjectFile::getName)) .collect(Collectors.toList()); } @@ -58,7 +58,7 @@ public class ProjectFileResource { @Path("/templates/beans") public List<ProjectFile> getBeanTemplates() throws Exception { return codeService.getBeanTemplateNames().stream() - .map(s -> infinispanService.getProjectFile(Project.Type.templates.name(), s)) + .map(s -> karavanCacheService.getProjectFile(Project.Type.templates.name(), s)) .toList(); } @@ -68,7 +68,7 @@ public class ProjectFileResource { public ProjectFile create(ProjectFile file) throws Exception { file.setLastUpdate(Instant.now().toEpochMilli()); projectFileCreateValidator.validate(file).failOnError(); - infinispanService.saveProjectFile(file); + karavanCacheService.saveProjectFile(file); return file; } @@ -77,7 +77,7 @@ public class ProjectFileResource { @Consumes(MediaType.APPLICATION_JSON) public ProjectFile update(ProjectFile file) throws Exception { file.setLastUpdate(Instant.now().toEpochMilli()); - infinispanService.saveProjectFile(file); + karavanCacheService.saveProjectFile(file); return file; } @@ -87,7 +87,7 @@ public class ProjectFileResource { public void delete(@HeaderParam("username") String username, @PathParam("project") String project, @PathParam("filename") String filename) throws Exception { - infinispanService.deleteProjectFile( + karavanCacheService.deleteProjectFile( URLDecoder.decode(project, StandardCharsets.UTF_8.toString()), URLDecoder.decode(filename, StandardCharsets.UTF_8.toString()) ); @@ -101,11 +101,11 @@ public class ProjectFileResource { @PathParam("integrationName") String integrationName, @PathParam("generateRest") boolean generateRest, @PathParam("generateRoutes") boolean generateRoutes, ProjectFile file) throws Exception { - infinispanService.saveProjectFile(file); + karavanCacheService.saveProjectFile(file); if (generateRest) { String yaml = codeService.generate(file.getName(), file.getCode(), generateRoutes); ProjectFile integration = new ProjectFile(integrationName, yaml, file.getProjectId(), Instant.now().toEpochMilli()); - infinispanService.saveProjectFile(integration); + karavanCacheService.saveProjectFile(integration); return file; } return file; 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 efcdfbff..aea987ea 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 @@ -20,7 +20,7 @@ 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.infinispan.model.Project; +import org.apache.camel.karavan.cache.model.Project; import org.apache.camel.karavan.service.ProjectService; import org.jboss.logging.Logger; 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 d9d95f66..08ab2132 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 @@ -22,11 +22,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.git.GitService; -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.ContainerStatus; -import org.apache.camel.karavan.infinispan.model.Project; +import org.apache.camel.karavan.cache.KaravanCacheService; +import org.apache.camel.karavan.cache.model.CamelStatus; +import org.apache.camel.karavan.cache.model.CamelStatusValue; +import org.apache.camel.karavan.cache.model.ContainerStatus; +import org.apache.camel.karavan.cache.model.Project; import org.apache.camel.karavan.kubernetes.KubernetesService; import org.apache.camel.karavan.service.ConfigService; import org.apache.camel.karavan.service.ProjectService; @@ -42,7 +42,7 @@ public class ProjectResource { private static final Logger LOGGER = Logger.getLogger(ProjectResource.class.getName()); @Inject - InfinispanService infinispanService; + KaravanCacheService karavanCacheService; @Inject KubernetesService kubernetesService; @@ -75,7 +75,7 @@ public class ProjectResource { @Produces(MediaType.APPLICATION_JSON) @Path("/{project}") public Project get(@PathParam("project") String project) throws Exception { - return infinispanService.getProject(project); + return karavanCacheService.getProject(project); } @POST @@ -98,9 +98,9 @@ public class ProjectResource { LOGGER.info("Deleting deployments"); Response res4 = infrastructureResource.deleteDeployment(null, projectId); } - gitService.deleteProject(projectId, infinispanService.getProjectFiles(projectId)); - infinispanService.getProjectFiles(projectId).forEach(file -> infinispanService.deleteProjectFile(projectId, file.getName())); - infinispanService.deleteProject(projectId); + gitService.deleteProject(projectId, karavanCacheService.getProjectFiles(projectId)); + karavanCacheService.getProjectFiles(projectId).forEach(file -> karavanCacheService.deleteProjectFile(projectId, file.getName())); + karavanCacheService.deleteProject(projectId); LOGGER.info("Project deleted"); } @@ -136,7 +136,7 @@ public class ProjectResource { @Produces(MediaType.APPLICATION_JSON) @Path("/status/camel/{projectId}/{env}") public Response getCamelStatusForProjectAndEnv(@PathParam("projectId") String projectId, @PathParam("env") String env) { - List<CamelStatus> statuses = infinispanService.getCamelStatusesByProjectAndEnv(projectId, env) + List<CamelStatus> statuses = karavanCacheService.getCamelStatusesByProjectAndEnv(projectId, env) .stream().map(camelStatus -> { var stats = camelStatus.getStatuses().stream().filter(s -> !Objects.equals(s.getName(), CamelStatusValue.Name.trace)).toList(); camelStatus.setStatuses(stats); @@ -153,7 +153,7 @@ public class ProjectResource { @Produces(MediaType.APPLICATION_JSON) @Path("/traces/{projectId}/{env}") public Response getCamelTracesForProjectAndEnv(@PathParam("projectId") String projectId, @PathParam("env") String env) { - List<CamelStatus> statuses = infinispanService.getCamelStatusesByProjectAndEnv(projectId, env) + List<CamelStatus> statuses = karavanCacheService.getCamelStatusesByProjectAndEnv(projectId, env) .stream().map(camelStatus -> { var stats = camelStatus.getStatuses().stream().filter(s -> Objects.equals(s.getName(), CamelStatusValue.Name.trace)).toList(); camelStatus.setStatuses(stats); 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 ce779e13..a7b5867c 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 @@ -20,10 +20,10 @@ 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.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.apache.camel.karavan.cache.KaravanCacheService; +import org.apache.camel.karavan.cache.model.CamelStatus; +import org.apache.camel.karavan.cache.model.CamelStatusValue; +import org.apache.camel.karavan.cache.model.DeploymentStatus; import org.jboss.logging.Logger; import java.util.List; @@ -34,13 +34,13 @@ public class StatusResource { private static final Logger LOGGER = Logger.getLogger(StatusResource.class.getName()); @Inject - InfinispanService infinispanService; + KaravanCacheService karavanCacheService; @GET @Produces(MediaType.APPLICATION_JSON) @Path("/deployment/{name}/{env}") public Response getDeploymentStatus(@PathParam("name") String name, @PathParam("env") String env) { - DeploymentStatus status = infinispanService.getDeploymentStatus(name, env); + DeploymentStatus status = karavanCacheService.getDeploymentStatus(name, env); if (status != null) { return Response.ok(status).build(); } @@ -51,8 +51,8 @@ public class StatusResource { @Produces(MediaType.APPLICATION_JSON) @Path("/camel/context") public List<CamelStatus> getCamelContextStatusByEnv() { - if (infinispanService.isReady()) { - return infinispanService.getCamelStatusesByEnv(CamelStatusValue.Name.context); + if (karavanCacheService.isReady()) { + return karavanCacheService.getCamelStatusesByEnv(CamelStatusValue.Name.context); } else { return List.of(); } @@ -62,8 +62,8 @@ public class StatusResource { @Produces(MediaType.APPLICATION_JSON) @Path("/deployment") public Response deleteDeploymentStatuses() { - if (infinispanService.isReady()) { - infinispanService.deleteAllDeploymentsStatuses(); + if (karavanCacheService.isReady()) { + karavanCacheService.deleteAllDeploymentsStatuses(); return Response.ok().build(); } else { return Response.noContent().build(); @@ -74,8 +74,8 @@ public class StatusResource { @Produces(MediaType.APPLICATION_JSON) @Path("/container") public Response deleteContainerStatuses() { - if (infinispanService.isReady()) { - infinispanService.deleteAllContainersStatuses(); + if (karavanCacheService.isReady()) { + karavanCacheService.deleteAllContainersStatuses(); return Response.ok().build(); } else { return Response.noContent().build(); @@ -86,8 +86,8 @@ public class StatusResource { @Produces(MediaType.APPLICATION_JSON) @Path("/camel") public Response deleteCamelStatuses() { - if (infinispanService.isReady()) { - infinispanService.deleteAllCamelStatuses(); + if (karavanCacheService.isReady()) { + karavanCacheService.deleteAllCamelStatuses(); return Response.ok().build(); } else { return Response.noContent().build(); @@ -98,8 +98,8 @@ public class StatusResource { @Produces(MediaType.APPLICATION_JSON) @Path("/all") public Response deleteAllStatuses() { - if (infinispanService.isReady()) { - infinispanService.clearAllStatuses(); + if (karavanCacheService.isReady()) { + karavanCacheService.clearAllStatuses(); return Response.ok().build(); } else { return Response.noContent().build(); diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/KaravanCacheService.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/KaravanCacheService.java new file mode 100644 index 00000000..6e62ba11 --- /dev/null +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/KaravanCacheService.java @@ -0,0 +1,322 @@ +/* + * 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. + */ +package org.apache.camel.karavan.cache; + +import com.hazelcast.config.ClasspathXmlConfig; +import com.hazelcast.config.Config; +import com.hazelcast.core.Hazelcast; +import com.hazelcast.core.HazelcastInstance; +import com.hazelcast.map.IMap; +import com.hazelcast.query.Predicate; +import com.hazelcast.query.Predicates; +import io.quarkus.runtime.ShutdownEvent; +import io.quarkus.runtime.StartupEvent; +import jakarta.enterprise.event.Observes; +import jakarta.enterprise.inject.Default; +import jakarta.inject.Singleton; +import org.apache.camel.karavan.cache.model.*; +import org.eclipse.microprofile.health.Readiness; +import org.jboss.logging.Logger; + +import java.io.BufferedReader; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.time.Instant; +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + +@Default +@Readiness +@Singleton +public class KaravanCacheService { + + Config config = new ClasspathXmlConfig("hazelcast.xml"); + HazelcastInstance hz = Hazelcast.getOrCreateHazelcastInstance(config); + + private final IMap<GroupedKey, Project> projects = hz.getMap(Project.CACHE); + private final IMap<GroupedKey, ProjectFile> files = hz.getMap(ProjectFile.CACHE); + private final IMap<GroupedKey, DeploymentStatus> deploymentStatuses = hz.getMap(DeploymentStatus.CACHE); + private final IMap<GroupedKey, ContainerStatus> containerStatuses = hz.getMap(ContainerStatus.CACHE); + private final IMap<GroupedKey, Boolean> transits = hz.getMap("transits"); + private final IMap<GroupedKey, ServiceStatus> serviceStatuses = hz.getMap(ServiceStatus.CACHE); + private final IMap<GroupedKey, CamelStatus> camelStatuses = hz.getMap(CamelStatus.CACHE); + + private final AtomicBoolean ready = new AtomicBoolean(false); + private static final Logger LOGGER = Logger.getLogger(KaravanCacheService.class.getName()); + + private static final String DEFAULT_ENVIRONMENT = "dev"; + + void onStart(@Observes StartupEvent ev) { + LOGGER.info("The application is starting..."); + ready.set(true); + } + + void onStop(@Observes ShutdownEvent ev) { + LOGGER.info("The application is stopping..."); + ready.set(false); + } + + public List<Project> getProjects() { + return projects.values().stream().collect(Collectors.toList()); + } + + public void saveProject(Project project) { + GroupedKey key = GroupedKey.create(project.getProjectId(), DEFAULT_ENVIRONMENT, project.getProjectId()); + projects.put(key, project); + projects.put(key, project); + } + + public List<ProjectFile> getProjectFiles(String projectId) { + Predicate<GroupedKey, ProjectFile> predicate = Predicates.equal("projectId", projectId); + return files.values(predicate).stream().toList(); + } + + public Map<GroupedKey, ProjectFile> getProjectFilesMap(String projectId) { + Predicate<GroupedKey, ProjectFile> predicate = Predicates.equal("projectId", projectId); + return files.entrySet(predicate).stream() + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } + + public ProjectFile getProjectFile(String projectId, String filename) { + Predicate<GroupedKey, ProjectFile> predicate = Predicates.and( + Predicates.equal("name", filename), + Predicates.equal("projectId", projectId) + ); + List<ProjectFile> list = files.values(predicate).stream().toList(); + return !list.isEmpty() ? list.get(0) : null; + } + + public List<ProjectFile> getProjectFilesByName(String filename) { + Predicate<GroupedKey, ProjectFile> predicate = Predicates.equal("name", filename); + return files.values(predicate).stream().toList(); + } + + public void saveProjectFile(ProjectFile file) { + files.put(GroupedKey.create(file.getProjectId(), DEFAULT_ENVIRONMENT, file.getName()), file); + } + + public void saveProjectFiles(Map<GroupedKey, ProjectFile> filesToSave) { + long lastUpdate = Instant.now().toEpochMilli(); + filesToSave.forEach((groupedKey, projectFile) -> projectFile.setLastUpdate(lastUpdate)); + files.putAll(filesToSave); + } + + public void deleteProject(String projectId) { + projects.remove(GroupedKey.create(projectId, DEFAULT_ENVIRONMENT, projectId)); + } + + public void deleteProjectFile(String projectId, String filename) { + files.remove(GroupedKey.create(projectId, DEFAULT_ENVIRONMENT, filename)); + } + + public Project getProject(String projectId) { + return projects.get(GroupedKey.create(projectId, DEFAULT_ENVIRONMENT, projectId)); + } + + public DeploymentStatus getDeploymentStatus(String projectId, String environment) { + return deploymentStatuses.get(GroupedKey.create(projectId, environment, projectId)); + } + + public void saveDeploymentStatus(DeploymentStatus status) { + deploymentStatuses.put(GroupedKey.create(status.getProjectId(), status.getEnv(), status.getProjectId()), status); + } + + public void deleteDeploymentStatus(DeploymentStatus status) { + deploymentStatuses.remove(GroupedKey.create(status.getProjectId(), status.getEnv(), status.getProjectId())); + } + + public List<DeploymentStatus> getDeploymentStatuses() { + return new ArrayList<>(deploymentStatuses.values()); + } + + public List<DeploymentStatus> getDeploymentStatuses(String env) { + Predicate<GroupedKey, DeploymentStatus> predicate = Predicates.equal("env", env); + return deploymentStatuses.values(predicate).stream().toList(); + } + + public void deleteAllDeploymentsStatuses() { + deploymentStatuses.clear(); + } + + public void saveServiceStatus(ServiceStatus status) { + serviceStatuses.put(GroupedKey.create(status.getProjectId(), status.getEnv(), status.getProjectId()), status); + } + + public void deleteServiceStatus(ServiceStatus status) { + serviceStatuses.remove(GroupedKey.create(status.getProjectId(), status.getEnv(), status.getProjectId())); + } + + public List<ServiceStatus> getServiceStatuses() { + return new ArrayList<>(serviceStatuses.values()); + } + + public List<Boolean> getTransits() { + return new ArrayList<>(transits.values()); + } + + public Boolean getTransit(String projectId, String env, String containerName) { + return transits.get(GroupedKey.create(projectId, env, containerName)); + } + + public void setTransit(String projectId, String env, String containerName) { + transits.put(GroupedKey.create(projectId, env, containerName), true); + } + + public List<ContainerStatus> getContainerStatuses() { + return new ArrayList<>(containerStatuses.values()); + } + + public List<ContainerStatus> getContainerStatuses(String projectId, String env) { + Predicate<GroupedKey, ContainerStatus> predicate = Predicates.and( + Predicates.equal("projectId", projectId), + Predicates.equal("env", env) + ); + return containerStatuses.values(predicate).stream().toList(); + } + + public ContainerStatus getContainerStatus(String projectId, String env, String containerName) { + return getContainerStatus(GroupedKey.create(projectId, env, containerName)); + } + + public ContainerStatus getContainerStatus(GroupedKey key) { + return containerStatuses.get(key); + } + + public ContainerStatus getDevModeContainerStatus(String projectId, String env) { + return containerStatuses.get(GroupedKey.create(projectId, env, projectId)); + } + + public List<ContainerStatus> getContainerStatuses(String env) { + Predicate<GroupedKey, ContainerStatus> predicate = Predicates.and( + Predicates.equal("env", env) + ); + return containerStatuses.values(predicate).stream().toList(); + } + + public List<ContainerStatus> getAllContainerStatuses() { + return new ArrayList<>(containerStatuses.values()); + } + + public void saveContainerStatus(ContainerStatus status) { + containerStatuses.put(GroupedKey.create(status.getProjectId(), status.getEnv(), status.getContainerName()), status); + } + + public void deleteContainerStatus(ContainerStatus status) { + containerStatuses.remove(GroupedKey.create(status.getProjectId(), status.getEnv(), status.getContainerName())); + } + + public void deleteAllContainersStatuses() { + containerStatuses.clear(); + } + + public void deleteContainerStatus(String projectId, String env, String containerName) { + containerStatuses.remove(GroupedKey.create(projectId, env, containerName)); + } + + public CamelStatus getCamelStatus(String projectId, String env, String containerName) { + GroupedKey key = GroupedKey.create(projectId, env, containerName); + return camelStatuses.get(key); + } + + public CamelStatus getCamelStatus(GroupedKey key) { + return camelStatuses.get(key); + } + + public List<CamelStatus> getCamelStatusesByEnv(CamelStatusValue.Name name) { + return camelStatuses.values().stream().map(cs -> { + var values = cs.getStatuses(); + cs.setStatuses(values.stream().filter(v -> Objects.equals(v.getName(), name)).toList()); + return cs; + }).toList(); + } + + public List<CamelStatus> getCamelStatusesByProjectAndEnv(String projectId, String env) { + Predicate<GroupedKey, CamelStatus> predicate = Predicates.and( + Predicates.equal("projectId", projectId), + Predicates.equal("env", env) + ); + return camelStatuses.values(predicate).stream().toList(); + } + + public void saveCamelStatus(CamelStatus status) { + GroupedKey key = GroupedKey.create(status.getProjectId(), status.getEnv(), status.getContainerName()); + camelStatuses.put(key, status); + } + + public void deleteCamelStatus(String projectId, String name, String env) { + GroupedKey key = GroupedKey.create(projectId, env, name); + camelStatuses.remove(key); + } + + public void deleteCamelStatuses(String projectId, String env) { + Predicate<GroupedKey, CamelStatus> predicate = Predicates.and( + Predicates.equal("projectId", projectId), + Predicates.equal("env", env) + ); + camelStatuses.values(predicate).forEach(s -> { + GroupedKey key = GroupedKey.create(projectId, env, s.getContainerName()); + camelStatuses.remove(key); + }); + } + + public void deleteAllCamelStatuses() { + camelStatuses.clear(); + } + + public List<ContainerStatus> getLoadedDevModeStatuses() { + Predicate<GroupedKey, ContainerStatus> predicate = Predicates.and( + Predicates.equal("type", ContainerStatus.ContainerType.devmode), + Predicates.equal("codeLoaded", true) + ); + return containerStatuses.values(predicate).stream().toList(); + } + + public List<ContainerStatus> getDevModeStatuses() { + Predicate<GroupedKey, ContainerStatus> predicate = Predicates.and( + Predicates.equal("type", ContainerStatus.ContainerType.devmode) + ); + return containerStatuses.values(predicate).stream().toList(); + } + + public List<ContainerStatus> getContainerStatusByEnv(String env) { + Predicate<GroupedKey, ContainerStatus> predicate = Predicates.and( + Predicates.equal("env", env) + ); + return containerStatuses.values(predicate).stream().toList(); + } + + public void clearAllStatuses() { + deploymentStatuses.clear(); + containerStatuses.clear(); + camelStatuses.clear(); + } + + private String getResourceFile(String path) { + try { + InputStream inputStream = KaravanCacheService.class.getResourceAsStream(path); + return new BufferedReader(new InputStreamReader(inputStream)) + .lines().collect(Collectors.joining(System.getProperty("line.separator"))); + } catch (Exception e) { + return null; + } + } + + public boolean isReady() { + return ready.get(); + } +} diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/CamelStatus.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/CamelStatus.java similarity index 83% rename from karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/CamelStatus.java rename to karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/CamelStatus.java index db7cf54b..de2e1b96 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/CamelStatus.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/CamelStatus.java @@ -15,27 +15,18 @@ * limitations under the License. */ -package org.apache.camel.karavan.infinispan.model; +package org.apache.camel.karavan.cache.model; -import org.infinispan.protostream.annotations.ProtoFactory; -import org.infinispan.protostream.annotations.ProtoField; - -import java.util.ArrayList; import java.util.List; public class CamelStatus { public static final String CACHE = "camel_statuses"; - @ProtoField(number = 1) String projectId; - @ProtoField(number = 2) String containerName; - @ProtoField(number = 3, collectionImplementation = ArrayList.class) List<CamelStatusValue> statuses; - @ProtoField(number = 4) String env; - @ProtoFactory public CamelStatus(String projectId, String containerName, List<CamelStatusValue> statuses, String env) { this.projectId = projectId; this.containerName = containerName; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/CamelStatusValue.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/CamelStatusValue.java similarity index 61% rename from karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/CamelStatusValue.java rename to karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/CamelStatusValue.java index 1a60dfbd..59cf946f 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/CamelStatusValue.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/CamelStatusValue.java @@ -15,32 +15,25 @@ * limitations under the License. */ -package org.apache.camel.karavan.infinispan.model; - -import org.infinispan.protostream.annotations.ProtoEnumValue; -import org.infinispan.protostream.annotations.ProtoFactory; -import org.infinispan.protostream.annotations.ProtoField; +package org.apache.camel.karavan.cache.model; public class CamelStatusValue { public enum Name { - @ProtoEnumValue(number = 0, name = "context") context, - @ProtoEnumValue (number = 1, name = "inflight") inflight, - @ProtoEnumValue (number = 2, name = "memory") memory, - @ProtoEnumValue (number = 3, name = "properties") properties, - @ProtoEnumValue (number = 4, name = "route") route, - @ProtoEnumValue (number = 5, name = "trace") trace, - @ProtoEnumValue (number = 6, name = "jvm") jvm, - @ProtoEnumValue (number = 7, name = "source") source + context, + inflight, + memory, + properties, + route, + trace, + jvm, + source } - @ProtoField(number = 1) Name name; - @ProtoField(number = 2) String status; - @ProtoFactory public CamelStatusValue(Name name, String status) { this.name = name; this.status = status; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ContainerPort.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/ContainerPort.java similarity index 85% rename from karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ContainerPort.java rename to karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/ContainerPort.java index af8cebf9..c9e97589 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ContainerPort.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/ContainerPort.java @@ -15,21 +15,14 @@ * limitations under the License. */ -package org.apache.camel.karavan.infinispan.model; - -import org.infinispan.protostream.annotations.ProtoFactory; -import org.infinispan.protostream.annotations.ProtoField; +package org.apache.camel.karavan.cache.model; public class ContainerPort { - @ProtoField(number = 1) Integer privatePort; - @ProtoField(number = 2) Integer publicPort; - @ProtoField(number = 3) String type; - @ProtoFactory public ContainerPort(Integer privatePort, Integer publicPort, String type) { this.privatePort = privatePort; this.publicPort = publicPort; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ContainerStatus.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/ContainerStatus.java similarity index 87% rename from karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ContainerStatus.java rename to karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/ContainerStatus.java index 441d78d1..94eed978 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ContainerStatus.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/ContainerStatus.java @@ -15,14 +15,9 @@ * limitations under the License. */ -package org.apache.camel.karavan.infinispan.model; - -import org.infinispan.protostream.annotations.ProtoEnumValue; -import org.infinispan.protostream.annotations.ProtoFactory; -import org.infinispan.protostream.annotations.ProtoField; +package org.apache.camel.karavan.cache.model; import java.time.Instant; -import java.util.ArrayList; import java.util.List; public class ContainerStatus { @@ -37,62 +32,42 @@ public class ContainerStatus { } public enum ContainerType { - @ProtoEnumValue(number = 0, name = "internal") internal, - @ProtoEnumValue(number = 1, name = "devmode") devmode, - @ProtoEnumValue(number = 2, name = "devservice") devservice, - @ProtoEnumValue(number = 4, name = "project") project, - @ProtoEnumValue(number = 5, name = "build") build, - @ProtoEnumValue(number = 6, name = "unknown") unknown, + internal, + devmode, + devservice, + project, + build, + unknown, } public enum Command { - @ProtoEnumValue(number = 0, name = "run") run, - @ProtoEnumValue(number = 1, name = "pause") pause, - @ProtoEnumValue(number = 2, name = "stop") stop, - @ProtoEnumValue(number = 3, name = "delete") delete, + run, + pause, + stop, + delete, } public static final String CACHE = "container_statuses"; - @ProtoField(number = 1) String projectId; - @ProtoField(number = 2) String containerName; - @ProtoField(number = 3) String containerId; - @ProtoField(number = 4) String image; - @ProtoField(number = 5, collectionImplementation = ArrayList.class) List<ContainerPort> ports; - @ProtoField(number = 6) String env; - @ProtoField(number = 7) ContainerType type; - @ProtoField(number = 8) String memoryInfo; - @ProtoField(number = 9) String cpuInfo; - @ProtoField(number = 10) String created; - @ProtoField(number = 11) String finished; - @ProtoField(number = 12) List<Command> commands; - @ProtoField(number = 13) String state; - @ProtoField(number = 14) String phase; - @ProtoField(number = 15) Boolean codeLoaded; - @ProtoField(number = 16) Boolean inTransit = false; - @ProtoField(number = 17) String initDate; - @ProtoField(number = 18) String podIP; - @ProtoField(number = 19) String camelRuntime; - @ProtoFactory public ContainerStatus(String projectId, String containerName, String containerId, String image, List<ContainerPort> ports, String env, ContainerType type, String memoryInfo, String cpuInfo, String created, String finished, List<Command> commands, String state, String phase, Boolean codeLoaded, Boolean inTransit, String initDate, String podIP, String camelRuntime) { this.projectId = projectId; this.containerName = containerName; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/DeploymentStatus.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/DeploymentStatus.java similarity index 88% rename from karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/DeploymentStatus.java rename to karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/DeploymentStatus.java index 22a0a393..c67c4525 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/DeploymentStatus.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/DeploymentStatus.java @@ -15,28 +15,18 @@ * limitations under the License. */ -package org.apache.camel.karavan.infinispan.model; +package org.apache.camel.karavan.cache.model; -import org.infinispan.protostream.annotations.ProtoFactory; -import org.infinispan.protostream.annotations.ProtoField; public class DeploymentStatus { public static final String CACHE = "deployment_statuses"; - @ProtoField(number = 1) String projectId; - @ProtoField(number = 2) String namespace; - @ProtoField(number = 3) String env; - @ProtoField(number = 4) String cluster; - @ProtoField(number = 5) String image; - @ProtoField(number = 6) Integer replicas; - @ProtoField(number = 7) Integer readyReplicas; - @ProtoField(number = 8) Integer unavailableReplicas; public DeploymentStatus(String projectId, String namespace, String cluster, String env) { @@ -50,7 +40,6 @@ public class DeploymentStatus { this.unavailableReplicas = 0; } - @ProtoFactory public DeploymentStatus(String projectId, String namespace, String cluster, String env, String image, Integer replicas, Integer readyReplicas, Integer unavailableReplicas) { this.projectId = projectId; this.namespace = namespace; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/GroupedKey.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/GroupedKey.java similarity index 89% rename from karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/GroupedKey.java rename to karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/GroupedKey.java index 6d619d90..7fb1b0be 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/GroupedKey.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/GroupedKey.java @@ -15,22 +15,14 @@ * limitations under the License. */ -package org.apache.camel.karavan.infinispan.model; - -import org.infinispan.protostream.annotations.ProtoFactory; -import org.infinispan.protostream.annotations.ProtoField; - +package org.apache.camel.karavan.cache.model; public class GroupedKey { - @ProtoField(number = 1) String projectId; - @ProtoField(number = 2) String env; - @ProtoField(number = 3) String key; - @ProtoFactory public GroupedKey(String projectId, String env, String key) { this.projectId = projectId; this.env = env; 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/cache/model/Project.java similarity index 82% rename from karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java rename to karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/Project.java index 23684717..df865970 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/cache/model/Project.java @@ -15,12 +15,9 @@ * limitations under the License. */ -package org.apache.camel.karavan.infinispan.model; +package org.apache.camel.karavan.cache.model; import jakarta.validation.constraints.NotBlank; -import org.infinispan.protostream.annotations.ProtoEnumValue; -import org.infinispan.protostream.annotations.ProtoFactory; -import org.infinispan.protostream.annotations.ProtoField; import java.time.Instant; import java.util.Arrays; @@ -30,30 +27,23 @@ public class Project { public enum Type { - @ProtoEnumValue(number = 0, name = "templates") templates, - @ProtoEnumValue (number = 1, name = "kamelets") kamelets, - @ProtoEnumValue (number = 2, name = "services") services, - @ProtoEnumValue (number = 3, name = "normal") normal, - @ProtoEnumValue (number = 4, name = "ephemeral") ephemeral, + templates, + kamelets, + services, + normal, + ephemeral, } - @ProtoField(number = 1) @NotBlank String projectId; - @ProtoField(number = 2) @NotBlank String name; - @ProtoField(number = 3) @NotBlank String description; - @ProtoField(number = 4) String lastCommit; - @ProtoField(number = 5) Long lastCommitTimestamp; - @ProtoField(number = 6) Type type; - @ProtoFactory public Project(String projectId, String name, String description, String lastCommit, Long lastCommitTimestamp, Type type) { this.projectId = projectId; this.name = name; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ProjectFile.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/ProjectFile.java similarity index 82% rename from karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ProjectFile.java rename to karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/ProjectFile.java index bf6e196d..1c0a5a4e 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ProjectFile.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/ProjectFile.java @@ -15,25 +15,15 @@ * limitations under the License. */ -package org.apache.camel.karavan.infinispan.model; - -import org.infinispan.protostream.annotations.ProtoDoc; -import org.infinispan.protostream.annotations.ProtoFactory; -import org.infinispan.protostream.annotations.ProtoField; +package org.apache.camel.karavan.cache.model; public class ProjectFile { public static final String CACHE = "project_files"; - @ProtoField(number = 1) String name; - @ProtoField(number = 2) String code; - @ProtoField(number = 3) - @ProtoDoc("@Field(index=Index.YES, analyze = Analyze.YES, store = Store.NO)") String projectId; - @ProtoField(number = 4) Long lastUpdate; - @ProtoFactory public ProjectFile(String name, String code, String projectId, Long lastUpdate) { this.name = name; this.code = code; diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ServiceStatus.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/ServiceStatus.java similarity index 87% rename from karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ServiceStatus.java rename to karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/ServiceStatus.java index 8973cd6e..59ee19a9 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/ServiceStatus.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/cache/model/ServiceStatus.java @@ -15,31 +15,19 @@ * limitations under the License. */ -package org.apache.camel.karavan.infinispan.model; - -import org.infinispan.protostream.annotations.ProtoFactory; -import org.infinispan.protostream.annotations.ProtoField; +package org.apache.camel.karavan.cache.model; public class ServiceStatus { public static final String CACHE = "service_statuses"; - @ProtoField(number = 1) String projectId; - @ProtoField(number = 2) String namespace; - @ProtoField(number = 3) String env; - @ProtoField(number = 4) String cluster; - @ProtoField(number = 5) Integer port; - @ProtoField(number = 6) Integer targetPort; - @ProtoField(number = 7) String clusterIP; - @ProtoField(number = 8) String type; - @ProtoFactory public ServiceStatus(String projectId, String namespace, String env, String cluster, Integer port, Integer targetPort, String clusterIP, String type) { this.projectId = projectId; this.namespace = namespace; 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 12644148..e7962262 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 @@ -36,9 +36,9 @@ import org.apache.camel.karavan.code.model.DockerComposeService; 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.cache.KaravanCacheService; +import org.apache.camel.karavan.cache.model.Project; +import org.apache.camel.karavan.cache.model.ProjectFile; import org.apache.camel.karavan.kubernetes.KubernetesService; import org.apache.camel.karavan.service.ConfigService; import org.eclipse.microprofile.config.inject.ConfigProperty; @@ -79,7 +79,7 @@ public class CodeService { DockerService dockerService; @Inject - InfinispanService infinispanService; + KaravanCacheService karavanCacheService; @Inject Engine engine; @@ -99,14 +99,14 @@ public class CodeService { ); public Map<String, String> getProjectFilesForDevMode(String projectId, Boolean withKamelets) { - Map<String, String> files = infinispanService.getProjectFiles(projectId).stream() + Map<String, String> files = karavanCacheService.getProjectFiles(projectId).stream() .filter(f -> !f.getName().endsWith(MARKDOWN_EXTENSION)) .filter(f -> !Objects.equals(f.getName(), PROJECT_COMPOSE_FILENAME)) .filter(f -> !f.getName().endsWith(PROJECT_JKUBE_EXTENSION)) .collect(Collectors.toMap(ProjectFile::getName, ProjectFile::getCode)); if (withKamelets) { - infinispanService.getProjectFiles(Project.Type.kamelets.name()) + karavanCacheService.getProjectFiles(Project.Type.kamelets.name()) .forEach(file -> files.put(file.getName(), file.getCode())); } return files; @@ -114,7 +114,7 @@ public class CodeService { public List<Tuple3<String, String, String>> getBuilderEnvMapping() { List<Tuple3<String, String, String>> result = new ArrayList<>(); - ProjectFile projectFile = infinispanService.getProjectFile(Project.Type.templates.name(), BUILDER_ENV_MAPPING_FILENAME); + ProjectFile projectFile = karavanCacheService.getProjectFile(Project.Type.templates.name(), BUILDER_ENV_MAPPING_FILENAME); if (projectFile != null) { String text = projectFile.getCode(); text.lines().forEach(line -> { @@ -178,7 +178,7 @@ public class CodeService { public String getTemplateText(String fileName) { try { - List<ProjectFile> files = infinispanService.getProjectFiles(Project.Type.templates.name()); + List<ProjectFile> files = karavanCacheService.getProjectFiles(Project.Type.templates.name()); return files.stream().filter(f -> f.getName().equalsIgnoreCase(fileName)) .map(ProjectFile::getCode).findFirst().orElse(null); } catch (Exception e) { @@ -314,7 +314,7 @@ public class CodeService { private int getMaxPortMappedInProjects() { - List<ProjectFile> files = infinispanService.getProjectFilesByName(PROJECT_COMPOSE_FILENAME).stream() + List<ProjectFile> files = karavanCacheService.getProjectFilesByName(PROJECT_COMPOSE_FILENAME).stream() .filter(f -> !Objects.equals(f.getProjectId(), Project.Type.templates.name())).toList(); if (!files.isEmpty()) { return files.stream().map(this::getProjectPort) @@ -334,7 +334,7 @@ public class CodeService { } public Integer getProjectPort(String projectId) { - ProjectFile composeFile = infinispanService.getProjectFile(projectId, PROJECT_COMPOSE_FILENAME); + ProjectFile composeFile = karavanCacheService.getProjectFile(projectId, PROJECT_COMPOSE_FILENAME); return getProjectPort(composeFile); } @@ -345,7 +345,7 @@ public class CodeService { } public DockerComposeService getDockerComposeService(String projectId) { - ProjectFile compose = infinispanService.getProjectFile(projectId, PROJECT_COMPOSE_FILENAME); + ProjectFile compose = karavanCacheService.getProjectFile(projectId, PROJECT_COMPOSE_FILENAME); if (compose != null) { return DockerComposeConverter.fromCode(compose.getCode(), projectId); } @@ -353,13 +353,13 @@ public class CodeService { } public void updateDockerComposeImage(String projectId, String imageName) { - ProjectFile compose = infinispanService.getProjectFile(projectId, PROJECT_COMPOSE_FILENAME); + ProjectFile compose = karavanCacheService.getProjectFile(projectId, PROJECT_COMPOSE_FILENAME); if (compose != null) { DockerComposeService service = DockerComposeConverter.fromCode(compose.getCode(), projectId); service.setImage(imageName); String code = DockerComposeConverter.toCode(service); compose.setCode(code); - infinispanService.saveProjectFile(compose); + karavanCacheService.saveProjectFile(compose); } } 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 31e589e3..ceb205d8 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 @@ -23,8 +23,8 @@ import com.github.dockerjava.api.model.Event; import com.github.dockerjava.api.model.EventType; 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.apache.camel.karavan.cache.KaravanCacheService; +import org.apache.camel.karavan.cache.model.ContainerStatus; import org.apache.camel.karavan.registry.RegistryService; import org.jboss.logging.Logger; @@ -44,7 +44,7 @@ public class DockerEventListener implements ResultCallback<Event> { RegistryService registryService; @Inject - InfinispanService infinispanService; + KaravanCacheService karavanCacheService; private static final Logger LOGGER = Logger.getLogger(DockerEventListener.class.getName()); @@ -68,13 +68,11 @@ public class DockerEventListener implements ResultCallback<Event> { } public void onContainerEvent(Event event, Container container) throws InterruptedException { - if (infinispanService.isReady()) { - if ("exited".equalsIgnoreCase(container.getState()) - && Objects.equals(container.getLabels().get(LABEL_TYPE), ContainerStatus.ContainerType.build.name())) { - String tag = container.getLabels().get(LABEL_TAG); - String projectId = container.getLabels().get(LABEL_PROJECT_ID); - syncImage(projectId, tag); - } + if ("exited".equalsIgnoreCase(container.getState()) + && Objects.equals(container.getLabels().get(LABEL_TYPE), ContainerStatus.ContainerType.build.name())) { + String tag = container.getLabels().get(LABEL_TAG); + String projectId = container.getLabels().get(LABEL_PROJECT_ID); + syncImage(projectId, tag); } } 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 7fec9e0d..12d57409 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 @@ -23,7 +23,7 @@ import jakarta.inject.Inject; import org.apache.camel.karavan.code.CodeService; import org.apache.camel.karavan.git.GitService; import org.apache.camel.karavan.git.model.GitConfig; -import org.apache.camel.karavan.infinispan.model.ContainerStatus; +import org.apache.camel.karavan.cache.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 deleted file mode 100644 index 5c594513..00000000 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForInfinispan.java +++ /dev/null @@ -1,57 +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. - */ -package org.apache.camel.karavan.docker; - -import jakarta.enterprise.context.ApplicationScoped; -import jakarta.inject.Inject; -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; - -@ApplicationScoped -public class DockerForInfinispan { - - private static final Logger LOGGER = Logger.getLogger(DockerForInfinispan.class.getName()); - - protected static final String INFINISPAN_CONTAINER_NAME = "infinispan"; - - @ConfigProperty(name = "karavan.infinispan.username") - String infinispanUsername; - @ConfigProperty(name = "karavan.infinispan.password") - String infinispanPassword; - - @Inject - DockerService dockerService; - - @Inject - CodeService codeService; - - public void startInfinispan() { - try { - LOGGER.info("Infinispan is starting..."); - var compose = codeService.getInternalDockerComposeService(INFINISPAN_CONTAINER_NAME); - compose.addEnvironment("USER", infinispanUsername); - compose.addEnvironment("PASS", infinispanPassword); - dockerService.createContainerFromCompose(compose, ContainerStatus.ContainerType.internal, false); - dockerService.runContainer(INFINISPAN_CONTAINER_NAME); - LOGGER.info("Infinispan is started"); - } catch (Exception e) { - LOGGER.error(e.getMessage()); - } - } -} diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java index 68269ecf..b681b6a2 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java @@ -21,8 +21,8 @@ import com.github.dockerjava.api.model.HealthCheck; import com.github.dockerjava.api.model.RestartPolicy; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; -import org.apache.camel.karavan.infinispan.model.ContainerStatus; -import org.apache.camel.karavan.infinispan.model.Project; +import org.apache.camel.karavan.cache.model.ContainerStatus; +import org.apache.camel.karavan.cache.model.Project; 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 4638fe82..db1a0718 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 @@ -19,7 +19,7 @@ package org.apache.camel.karavan.docker; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; import org.apache.camel.karavan.code.CodeService; -import org.apache.camel.karavan.infinispan.model.ContainerStatus; +import org.apache.camel.karavan.cache.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 b87e945d..776e5f58 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 @@ -32,7 +32,7 @@ import jakarta.enterprise.context.ApplicationScoped; 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.cache.model.ContainerStatus; import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; import org.apache.commons.io.IOUtils; 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 049a9f62..b4e4db51 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 @@ -20,8 +20,8 @@ import com.github.dockerjava.api.model.*; import io.smallrye.mutiny.tuples.Tuple2; import org.apache.camel.karavan.api.KameletResources; import org.apache.camel.karavan.code.model.DockerComposeHealthCheck; -import org.apache.camel.karavan.infinispan.model.ContainerPort; -import org.apache.camel.karavan.infinispan.model.ContainerStatus; +import org.apache.camel.karavan.cache.model.ContainerPort; +import org.apache.camel.karavan.cache.model.ContainerStatus; import java.io.BufferedReader; import java.io.InputStream; 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 25e37750..08df0a7c 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 @@ -27,8 +27,8 @@ 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.Project; -import org.apache.camel.karavan.infinispan.model.ProjectFile; +import org.apache.camel.karavan.cache.model.Project; +import org.apache.camel.karavan.cache.model.ProjectFile; import org.apache.camel.karavan.service.ConfigService; import org.eclipse.jgit.api.*; import org.eclipse.jgit.api.errors.GitAPIException; 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 deleted file mode 100644 index fca6c20e..00000000 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/InfinispanService.java +++ /dev/null @@ -1,401 +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. - */ -package org.apache.camel.karavan.infinispan; - -import jakarta.enterprise.inject.Default; -import jakarta.inject.Singleton; -import org.apache.camel.karavan.infinispan.model.*; -import org.eclipse.microprofile.config.inject.ConfigProperty; -import org.eclipse.microprofile.faulttolerance.Retry; -import org.eclipse.microprofile.health.HealthCheck; -import org.eclipse.microprofile.health.HealthCheckResponse; -import org.eclipse.microprofile.health.Readiness; -import org.infinispan.client.hotrod.RemoteCache; -import org.infinispan.client.hotrod.RemoteCacheManager; -import org.infinispan.client.hotrod.Search; -import org.infinispan.client.hotrod.configuration.ClientIntelligence; -import org.infinispan.client.hotrod.configuration.ConfigurationBuilder; -import org.infinispan.commons.configuration.StringConfiguration; -import org.infinispan.commons.marshall.ProtoStreamMarshaller; -import org.infinispan.protostream.ProtobufUtil; -import org.infinispan.protostream.SerializationContext; -import org.infinispan.protostream.config.Configuration; -import org.infinispan.query.dsl.QueryFactory; -import org.jboss.logging.Logger; - -import java.io.BufferedReader; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.time.Instant; -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; - -import static org.infinispan.query.remote.client.ProtobufMetadataManagerConstants.PROTOBUF_METADATA_CACHE_NAME; - -@Default -@Readiness -@Singleton -public class InfinispanService implements HealthCheck { - - @ConfigProperty(name = "karavan.infinispan.hosts") - String infinispanHosts; - @ConfigProperty(name = "karavan.infinispan.username") - String infinispanUsername; - @ConfigProperty(name = "karavan.infinispan.password") - String infinispanPassword; - - private RemoteCache<GroupedKey, Project> projects; - private RemoteCache<GroupedKey, ProjectFile> files; - private RemoteCache<GroupedKey, DeploymentStatus> deploymentStatuses; - private RemoteCache<GroupedKey, ContainerStatus> containerStatuses; - private RemoteCache<GroupedKey, Boolean> transits; - private RemoteCache<GroupedKey, ServiceStatus> serviceStatuses; - private RemoteCache<GroupedKey, CamelStatus> camelStatuses; - private final AtomicBoolean ready = new AtomicBoolean(false); - - private RemoteCacheManager cacheManager; - - private static final Logger LOGGER = Logger.getLogger(InfinispanService.class.getName()); - - private static final String DEFAULT_ENVIRONMENT = "dev"; - - @Retry(maxRetries = 100, delay = 2000) - public void tryStart() throws Exception { - start(); - } - - void start() throws Exception { - LOGGER.info("InfinispanService is starting in remote mode"); - - Configuration.Builder cfgBuilder = Configuration.builder().setLogOutOfSequenceWrites(false); - SerializationContext ctx = ProtobufUtil.newSerializationContext(cfgBuilder.build()); - - ProtoStreamMarshaller marshaller = new ProtoStreamMarshaller(ctx); - marshaller.register(new KaravanSchemaImpl()); - - ConfigurationBuilder builder = new ConfigurationBuilder(); - builder.addServers(infinispanHosts) - .security() - .authentication().enable() - .username(infinispanUsername) - .password(infinispanPassword) - .clientIntelligence(ClientIntelligence.BASIC) - .marshaller(marshaller); - - cacheManager = new RemoteCacheManager(builder.build()); - - if (cacheManager.getConnectionCount() > 0 ) { - - projects = getOrCreateCache(Project.CACHE); - files = getOrCreateCache(ProjectFile.CACHE); - containerStatuses = getOrCreateCache(ContainerStatus.CACHE); - deploymentStatuses = getOrCreateCache(DeploymentStatus.CACHE); - serviceStatuses = getOrCreateCache(ServiceStatus.CACHE); - camelStatuses = getOrCreateCache(CamelStatus.CACHE); - transits = getOrCreateCache("transits"); - deploymentStatuses = getOrCreateCache(DeploymentStatus.CACHE); - - cacheManager.getCache(PROTOBUF_METADATA_CACHE_NAME).put("karavan.proto", getResourceFile("/proto/karavan.proto")); - - ready.set(true); - LOGGER.info("InfinispanService is started in remote mode"); - } else { - throw new Exception("Not connected..."); - } - } - - private <K, V> RemoteCache<K, V> getOrCreateCache(String name) { - String config = getResourceFile("/cache/data-cache-config.xml"); - return cacheManager.administration().getOrCreateCache(name, new StringConfiguration(String.format(config, name))); - } - - public boolean isReady() { - return ready.get(); - } - - public List<Project> getProjects() { - return projects.values().stream().collect(Collectors.toList()); - } - - public void saveProject(Project project) { - GroupedKey key = GroupedKey.create(project.getProjectId(), DEFAULT_ENVIRONMENT, project.getProjectId()); - projects.put(key, project); - projects.put(key, project); - } - - public List<ProjectFile> getProjectFiles(String projectId) { - QueryFactory queryFactory = Search.getQueryFactory(files); - return queryFactory.<ProjectFile>create("FROM karavan.ProjectFile WHERE projectId = :projectId") - .setParameter("projectId", projectId) - .execute().list(); - } - - public Map<GroupedKey, ProjectFile> getProjectFilesMap(String projectId) { - QueryFactory queryFactory = Search.getQueryFactory(files); - return queryFactory.<ProjectFile>create("FROM karavan.ProjectFile WHERE projectId = :projectId") - .setParameter("projectId", projectId) - .execute().list().stream() - .collect(Collectors.toMap(f -> new GroupedKey(f.getProjectId(), DEFAULT_ENVIRONMENT, f.getName()), f -> f)); - } - - public ProjectFile getProjectFile(String projectId, String filename) { - QueryFactory queryFactory = Search.getQueryFactory(files); - List<ProjectFile> list = queryFactory.<ProjectFile>create("FROM karavan.ProjectFile WHERE name = :name AND projectId = :projectId") - .setParameter("name", filename) - .setParameter("projectId", projectId) - .execute().list(); - return !list.isEmpty() ? list.get(0) : null; - } - - public List<ProjectFile> getProjectFilesByName(String filename) { - QueryFactory queryFactory = Search.getQueryFactory(files); - return queryFactory.<ProjectFile>create("FROM karavan.ProjectFile WHERE name = :name") - .setParameter("name", filename) - .execute().list(); - } - - public void saveProjectFile(ProjectFile file) { - files.put(GroupedKey.create(file.getProjectId(), DEFAULT_ENVIRONMENT, file.getName()), file); - } - - public void saveProjectFiles(Map<GroupedKey, ProjectFile> filesToSave) { - long lastUpdate = Instant.now().toEpochMilli(); - filesToSave.forEach((groupedKey, projectFile) -> projectFile.setLastUpdate(lastUpdate)); - files.putAll(filesToSave); - } - - public void deleteProject(String projectId) { - projects.remove(GroupedKey.create(projectId, DEFAULT_ENVIRONMENT, projectId)); - } - - public void deleteProjectFile(String projectId, String filename) { - files.remove(GroupedKey.create(projectId, DEFAULT_ENVIRONMENT, filename)); - } - - public Project getProject(String projectId) { - return projects.get(GroupedKey.create(projectId, DEFAULT_ENVIRONMENT, projectId)); - } - - public DeploymentStatus getDeploymentStatus(String projectId, String environment) { - return deploymentStatuses.get(GroupedKey.create(projectId, environment, projectId)); - } - - public void saveDeploymentStatus(DeploymentStatus status) { - deploymentStatuses.put(GroupedKey.create(status.getProjectId(), status.getEnv(), status.getProjectId()), status); - } - - public void deleteDeploymentStatus(DeploymentStatus status) { - deploymentStatuses.remove(GroupedKey.create(status.getProjectId(), status.getEnv(), status.getProjectId())); - } - - public List<DeploymentStatus> getDeploymentStatuses() { - return new ArrayList<>(deploymentStatuses.values()); - } - - public List<DeploymentStatus> getDeploymentStatuses(String env) { - QueryFactory queryFactory = Search.getQueryFactory((RemoteCache<?, ?>) deploymentStatuses); - return queryFactory.<DeploymentStatus>create("FROM karavan.DeploymentStatus WHERE env = :env") - .setParameter("env", env) - .execute().list(); - } - - public void deleteAllDeploymentsStatuses() { - deploymentStatuses.clearAsync(); - } - - public void saveServiceStatus(ServiceStatus status) { - serviceStatuses.put(GroupedKey.create(status.getProjectId(), status.getEnv(), status.getProjectId()), status); - } - - public void deleteServiceStatus(ServiceStatus status) { - serviceStatuses.remove(GroupedKey.create(status.getProjectId(), status.getEnv(), status.getProjectId())); - } - - public List<ServiceStatus> getServiceStatuses() { - return new ArrayList<>(serviceStatuses.values()); - } - - public List<Boolean> getTransits() { - return new ArrayList<>(transits.values()); - } - - public Boolean getTransit(String projectId, String env, String containerName) { - return transits.get(GroupedKey.create(projectId, env, containerName)); - } - - public void setTransit(String projectId, String env, String containerName) { - transits.put(GroupedKey.create(projectId, env, containerName), true); - } - - public List<ContainerStatus> getContainerStatuses() { - return new ArrayList<>(containerStatuses.values()); - } - - public List<ContainerStatus> getContainerStatuses(String projectId, String env) { - QueryFactory queryFactory = Search.getQueryFactory(containerStatuses); - return queryFactory.<ContainerStatus>create("FROM karavan.ContainerStatus WHERE projectId = :projectId AND env = :env") - .setParameter("projectId", projectId) - .setParameter("env", env) - .execute().list(); - } - - public ContainerStatus getContainerStatus(String projectId, String env, String containerName) { - return getContainerStatus(GroupedKey.create(projectId, env, containerName)); - } - - public ContainerStatus getContainerStatus(GroupedKey key) { - return containerStatuses.get(key); - } - - public ContainerStatus getDevModeContainerStatus(String projectId, String env) { - return containerStatuses.get(GroupedKey.create(projectId, env, projectId)); - } - - public List<ContainerStatus> getContainerStatuses(String env) { - QueryFactory queryFactory = Search.getQueryFactory(containerStatuses); - return queryFactory.<ContainerStatus>create("FROM karavan.ContainerStatus WHERE env = :env") - .setParameter("env", env) - .execute().list(); - } - - public List<ContainerStatus> getAllContainerStatuses() { - return new ArrayList<>(containerStatuses.values()); - } - - public void saveContainerStatus(ContainerStatus status) { - containerStatuses.put(GroupedKey.create(status.getProjectId(), status.getEnv(), status.getContainerName()), status); - } - - public void deleteContainerStatus(ContainerStatus status) { - containerStatuses.remove(GroupedKey.create(status.getProjectId(), status.getEnv(), status.getContainerName())); - } - - public void deleteAllContainersStatuses() { - containerStatuses.clearAsync(); - } - - public void deleteContainerStatus(String projectId, String env, String containerName) { - containerStatuses.remove(GroupedKey.create(projectId, env, containerName)); - } - - public CamelStatus getCamelStatus(String projectId, String env, String containerName) { - GroupedKey key = GroupedKey.create(projectId, env, containerName); - return camelStatuses.get(key); - } - - public CamelStatus getCamelStatus(GroupedKey key) { - return camelStatuses.get(key); - } - - public List<CamelStatus> getCamelStatusesByEnv(CamelStatusValue.Name name) { - QueryFactory queryFactory = Search.getQueryFactory(camelStatuses); - List<CamelStatus> statuses = queryFactory.<CamelStatus>create("FROM karavan.CamelStatus") - .execute().list(); - return statuses.stream().map(cs -> { - var values = cs.getStatuses(); - cs.setStatuses(values.stream().filter(v -> Objects.equals(v.getName(), name)).toList()); - return cs; - }).toList(); - } - - public List<CamelStatus> getCamelStatusesByProjectAndEnv(String projectId, String env) { - QueryFactory queryFactory = Search.getQueryFactory(camelStatuses); - return queryFactory.<CamelStatus>create("FROM karavan.CamelStatus WHERE projectId = :projectId AND env = :env") - .setParameter("projectId", projectId) - .setParameter("env", env) - .execute().list(); - } - - public void saveCamelStatus(CamelStatus status) { - GroupedKey key = GroupedKey.create(status.getProjectId(), status.getEnv(), status.getContainerName()); - camelStatuses.put(key, status); - } - - public void deleteCamelStatus(String projectId, String name, String env) { - GroupedKey key = GroupedKey.create(projectId, env, name); - camelStatuses.remove(key); - } - - public void deleteCamelStatuses(String projectId, String env) { - QueryFactory queryFactory = Search.getQueryFactory(camelStatuses); - List<CamelStatus> statuses = queryFactory.<CamelStatus>create("FROM karavan.CamelStatus WHERE projectId = :projectId AND env = :env") - .setParameter("projectId", projectId) - .setParameter("env", env) - .execute().list(); - statuses.forEach(s -> { - GroupedKey key = GroupedKey.create(projectId, env, s.getContainerName()); - camelStatuses.remove(key); - }); - } - - public void deleteAllCamelStatuses() { - camelStatuses.clearAsync(); - } - - public List<ContainerStatus> getLoadedDevModeStatuses() { - QueryFactory queryFactory = Search.getQueryFactory(containerStatuses); - return queryFactory.<ContainerStatus>create("FROM karavan.ContainerStatus WHERE type = :type AND codeLoaded = true") - .setParameter("type", ContainerStatus.ContainerType.devmode) - .execute().list(); - } - - public List<ContainerStatus> getDevModeStatuses() { - QueryFactory queryFactory = Search.getQueryFactory(containerStatuses); - return queryFactory.<ContainerStatus>create("FROM karavan.ContainerStatus WHERE type = :type") - .setParameter("type", ContainerStatus.ContainerType.devmode) - .execute().list(); - } - - public List<ContainerStatus> getContainerStatusByEnv(String env) { - QueryFactory queryFactory = Search.getQueryFactory(containerStatuses); - return queryFactory.<ContainerStatus>create("FROM karavan.ContainerStatus WHERE env = :env") - .setParameter("env", env) - .execute().list(); - } - - public void clearAllStatuses() { - CompletableFuture.allOf( - deploymentStatuses.clearAsync(), - containerStatuses.clearAsync(), - camelStatuses.clearAsync() - ).join(); - } - - private String getResourceFile(String path) { - try { - InputStream inputStream = InfinispanService.class.getResourceAsStream(path); - return new BufferedReader(new InputStreamReader(inputStream)) - .lines().collect(Collectors.joining(System.getProperty("line.separator"))); - } catch (Exception e) { - return null; - } - } - - @Override - public HealthCheckResponse call() { - if (isReady()) { - return HealthCheckResponse.named("Infinispan").up().build(); - } else { - return HealthCheckResponse.named("Infinispan").down().build(); - } - } -} diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/KaravanSchema.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/KaravanSchema.java deleted file mode 100644 index 79d5eea3..00000000 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/KaravanSchema.java +++ /dev/null @@ -1,45 +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. - */ - -package org.apache.camel.karavan.infinispan.model; - -import org.infinispan.protostream.GeneratedSchema; -import org.infinispan.protostream.annotations.AutoProtoSchemaBuilder; - -@AutoProtoSchemaBuilder( - includeClasses = { - GroupedKey.class, - Project.class, - Project.Type.class, - ProjectFile.class, - CamelStatus.class, - CamelStatusValue.class, - CamelStatusValue.Name.class, - DeploymentStatus.class, - ContainerStatus.class, - ContainerPort.class, - ContainerStatus.ContainerType.class, - ContainerStatus.Command.class, - ServiceStatus.class - }, - schemaFileName = "karavan.proto", - schemaFilePath = "proto/", - schemaPackageName = "karavan") -public interface KaravanSchema extends GeneratedSchema { -} - - diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/DeploymentEventHandler.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/DeploymentEventHandler.java index 260fcda5..5d35a153 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/DeploymentEventHandler.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/DeploymentEventHandler.java @@ -19,18 +19,18 @@ package org.apache.camel.karavan.kubernetes; import io.fabric8.kubernetes.api.model.apps.Deployment; import io.fabric8.kubernetes.client.informers.ResourceEventHandler; -import org.apache.camel.karavan.infinispan.InfinispanService; -import org.apache.camel.karavan.infinispan.model.DeploymentStatus; +import org.apache.camel.karavan.cache.KaravanCacheService; +import org.apache.camel.karavan.cache.model.DeploymentStatus; import org.jboss.logging.Logger; public class DeploymentEventHandler implements ResourceEventHandler<Deployment> { private static final Logger LOGGER = Logger.getLogger(DeploymentEventHandler.class.getName()); - private final InfinispanService infinispanService; + private final KaravanCacheService karavanCacheService; private final KubernetesService kubernetesService; - public DeploymentEventHandler(InfinispanService infinispanService, KubernetesService kubernetesService) { - this.infinispanService = infinispanService; + public DeploymentEventHandler(KaravanCacheService karavanCacheService, KubernetesService kubernetesService) { + this.karavanCacheService = karavanCacheService; this.kubernetesService = kubernetesService; } @@ -39,7 +39,7 @@ public class DeploymentEventHandler implements ResourceEventHandler<Deployment> try { LOGGER.info("onAdd " + deployment.getMetadata().getName()); DeploymentStatus ds = getDeploymentStatus(deployment); - infinispanService.saveDeploymentStatus(ds); + karavanCacheService.saveDeploymentStatus(ds); } catch (Exception e){ LOGGER.error(e.getMessage()); } @@ -50,7 +50,7 @@ public class DeploymentEventHandler implements ResourceEventHandler<Deployment> try { LOGGER.info("onUpdate " + newDeployment.getMetadata().getName()); DeploymentStatus ds = getDeploymentStatus(newDeployment); - infinispanService.saveDeploymentStatus(ds); + karavanCacheService.saveDeploymentStatus(ds); } catch (Exception e){ LOGGER.error(e.getMessage()); } @@ -65,8 +65,8 @@ public class DeploymentEventHandler implements ResourceEventHandler<Deployment> deployment.getMetadata().getNamespace(), kubernetesService.getCluster(), kubernetesService.environment); - infinispanService.deleteDeploymentStatus(ds); - infinispanService.deleteCamelStatuses(deployment.getMetadata().getName(), ds.getEnv()); + karavanCacheService.deleteDeploymentStatus(ds); + karavanCacheService.deleteCamelStatuses(deployment.getMetadata().getName(), ds.getEnv()); } catch (Exception e){ LOGGER.error(e.getMessage()); } 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 8ca835c6..88f2ea1c 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 @@ -33,9 +33,9 @@ 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.cache.KaravanCacheService; +import org.apache.camel.karavan.cache.model.ContainerStatus; +import org.apache.camel.karavan.cache.model.Project; import org.apache.camel.karavan.service.ConfigService; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.eclipse.microprofile.health.HealthCheck; @@ -62,7 +62,7 @@ public class KubernetesService implements HealthCheck { EventBus eventBus; @Inject - InfinispanService infinispanService; + KaravanCacheService karavanCacheService; @Inject CodeService codeService; @@ -112,17 +112,17 @@ public class KubernetesService implements HealthCheck { SharedIndexInformer<Deployment> deploymentInformer = client.apps().deployments().inNamespace(getNamespace()) .withLabels(labels).inform(); - deploymentInformer.addEventHandlerWithResyncPeriod(new DeploymentEventHandler(infinispanService, this), 30 * 1000L); + deploymentInformer.addEventHandlerWithResyncPeriod(new DeploymentEventHandler(karavanCacheService, this), 30 * 1000L); informers.add(deploymentInformer); SharedIndexInformer<Service> serviceInformer = client.services().inNamespace(getNamespace()) .withLabels(labels).inform(); - serviceInformer.addEventHandlerWithResyncPeriod(new ServiceEventHandler(infinispanService, this), 30 * 1000L); + serviceInformer.addEventHandlerWithResyncPeriod(new ServiceEventHandler(karavanCacheService, this), 30 * 1000L); informers.add(serviceInformer); SharedIndexInformer<Pod> podRunInformer = client.pods().inNamespace(getNamespace()) .withLabels(labels).inform(); - podRunInformer.addEventHandlerWithResyncPeriod(new PodEventHandler(infinispanService, this, eventBus), 30 * 1000L); + podRunInformer.addEventHandlerWithResyncPeriod(new PodEventHandler(karavanCacheService, this, eventBus), 30 * 1000L); informers.add(podRunInformer); LOGGER.info("Started Kubernetes Informers"); 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 937cb2f2..5dbf274d 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 @@ -24,8 +24,8 @@ import io.fabric8.kubernetes.api.model.ResourceRequirements; import io.fabric8.kubernetes.client.informers.ResourceEventHandler; 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.cache.KaravanCacheService; +import org.apache.camel.karavan.cache.model.ContainerStatus; import org.jboss.logging.Logger; import java.util.List; @@ -38,12 +38,12 @@ import static org.apache.camel.karavan.shared.Constants.*; public class PodEventHandler implements ResourceEventHandler<Pod> { private static final Logger LOGGER = Logger.getLogger(PodEventHandler.class.getName()); - private final InfinispanService infinispanService; + private final KaravanCacheService karavanCacheService; private final KubernetesService kubernetesService; private final EventBus eventBus; - public PodEventHandler(InfinispanService infinispanService, KubernetesService kubernetesService, EventBus eventBus) { - this.infinispanService = infinispanService; + public PodEventHandler(KaravanCacheService karavanCacheService, KubernetesService kubernetesService, EventBus eventBus) { + this.karavanCacheService = karavanCacheService; this.kubernetesService = kubernetesService; this.eventBus = eventBus; } @@ -82,8 +82,8 @@ public class PodEventHandler implements ResourceEventHandler<Pod> { LOGGER.info("onDelete " + pod.getMetadata().getName()); String deployment = pod.getMetadata().getLabels().get("app"); String projectId = deployment != null ? deployment : pod.getMetadata().getLabels().get(LABEL_PROJECT_ID); - infinispanService.deleteContainerStatus(projectId, kubernetesService.environment, pod.getMetadata().getName()); - infinispanService.deleteCamelStatuses(projectId, kubernetesService.environment); + karavanCacheService.deleteContainerStatus(projectId, kubernetesService.environment, pod.getMetadata().getName()); + karavanCacheService.deleteCamelStatuses(projectId, kubernetesService.environment); } catch (Exception e) { LOGGER.error(e.getMessage(), e.getCause()); } diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/ServiceEventHandler.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/ServiceEventHandler.java index 5612d5b7..4e7b0f19 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/ServiceEventHandler.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/ServiceEventHandler.java @@ -19,18 +19,18 @@ package org.apache.camel.karavan.kubernetes; import io.fabric8.kubernetes.api.model.Service; import io.fabric8.kubernetes.client.informers.ResourceEventHandler; -import org.apache.camel.karavan.infinispan.InfinispanService; -import org.apache.camel.karavan.infinispan.model.ServiceStatus; +import org.apache.camel.karavan.cache.KaravanCacheService; +import org.apache.camel.karavan.cache.model.ServiceStatus; import org.jboss.logging.Logger; public class ServiceEventHandler implements ResourceEventHandler<Service> { private static final Logger LOGGER = Logger.getLogger(ServiceEventHandler.class.getName()); - private InfinispanService infinispanService; + private KaravanCacheService karavanCacheService; private KubernetesService kubernetesService; - public ServiceEventHandler(InfinispanService infinispanService, KubernetesService kubernetesService) { - this.infinispanService = infinispanService; + public ServiceEventHandler(KaravanCacheService karavanCacheService, KubernetesService kubernetesService) { + this.karavanCacheService = karavanCacheService; this.kubernetesService = kubernetesService; } @@ -39,7 +39,7 @@ public class ServiceEventHandler implements ResourceEventHandler<Service> { try { LOGGER.info("onAdd " + service.getMetadata().getName()); ServiceStatus ds = getServiceStatus(service); - infinispanService.saveServiceStatus(ds); + karavanCacheService.saveServiceStatus(ds); } catch (Exception e){ LOGGER.error(e.getMessage()); } @@ -50,7 +50,7 @@ public class ServiceEventHandler implements ResourceEventHandler<Service> { try { LOGGER.info("onUpdate " + newService.getMetadata().getName()); ServiceStatus ds = getServiceStatus(newService); - infinispanService.saveServiceStatus(ds); + karavanCacheService.saveServiceStatus(ds); } catch (Exception e){ LOGGER.error(e.getMessage()); } @@ -65,7 +65,7 @@ public class ServiceEventHandler implements ResourceEventHandler<Service> { service.getMetadata().getNamespace(), kubernetesService.getCluster(), kubernetesService.environment); - infinispanService.deleteServiceStatus(ds); + karavanCacheService.deleteServiceStatus(ds); } catch (Exception e){ LOGGER.error(e.getMessage()); } 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 55c5f5c6..3e3c98c2 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 @@ -26,11 +26,11 @@ 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.cache.KaravanCacheService; +import org.apache.camel.karavan.cache.model.CamelStatus; +import org.apache.camel.karavan.cache.model.CamelStatusValue; +import org.apache.camel.karavan.cache.model.ContainerStatus; import org.apache.camel.karavan.code.CodeService; -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.ContainerStatus; import org.apache.camel.karavan.kubernetes.KubernetesService; import org.apache.camel.karavan.shared.Constants; import org.eclipse.microprofile.config.inject.ConfigProperty; @@ -48,7 +48,7 @@ public class CamelService { public static final String RELOAD_PROJECT_CODE = "RELOAD_PROJECT_CODE"; @Inject - InfinispanService infinispanService; + KaravanCacheService karavanCacheService; @Inject CodeService codeService; @@ -80,8 +80,8 @@ public class CamelService { @Scheduled(every = "{karavan.camel.status.interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP) public void collectCamelStatuses() { LOGGER.debug("Collect Camel Statuses"); - if (infinispanService.isReady()) { - infinispanService.getContainerStatuses(environment).stream() + if (karavanCacheService.isReady()) { + karavanCacheService.getContainerStatuses(environment).stream() .filter(cs -> cs.getType() == ContainerStatus.ContainerType.project || cs.getType() == ContainerStatus.ContainerType.devmode @@ -103,7 +103,7 @@ public class CamelService { Map<String, String> files = codeService.getProjectFilesForDevMode(projectId, true); files.forEach((name, code) -> putRequest(projectId, name, code, 1000)); reloadRequest(projectId); - ContainerStatus containerStatus = infinispanService.getDevModeContainerStatus(projectId, environment); + ContainerStatus containerStatus = karavanCacheService.getDevModeContainerStatus(projectId, environment); containerStatus.setCodeLoaded(true); eventBus.publish(ContainerStatusService.CONTAINER_STATUS, JsonObject.mapFrom(containerStatus)); } catch (Exception ex) { @@ -191,7 +191,7 @@ public class CamelService { } }); CamelStatus cs = new CamelStatus(projectId, containerName, statuses, environment); - infinispanService.saveCamelStatus(cs); + karavanCacheService.saveCamelStatus(cs); } @CircuitBreaker(requestVolumeThreshold = 10, failureRatio = 0.5, delay = 1000) 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 712eb638..b5458262 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 @@ -23,9 +23,9 @@ import io.vertx.core.eventbus.EventBus; import io.vertx.core.json.JsonObject; import jakarta.enterprise.context.ApplicationScoped; import jakarta.inject.Inject; +import org.apache.camel.karavan.cache.KaravanCacheService; +import org.apache.camel.karavan.cache.model.ContainerStatus; import org.apache.camel.karavan.docker.DockerService; -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; @@ -44,7 +44,7 @@ public class ContainerStatusService { String environment; @Inject - InfinispanService infinispanService; + KaravanCacheService karavanCacheService; @Inject DockerService dockerService; @@ -54,7 +54,7 @@ public class ContainerStatusService { @Scheduled(every = "{karavan.container.statistics.interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP) void collectContainersStatistics() { - if (infinispanService.isReady() && !ConfigService.inKubernetes()) { + if (karavanCacheService.isReady() && !ConfigService.inKubernetes()) { List<ContainerStatus> statusesInDocker = dockerService.collectContainersStatistics(); statusesInDocker.forEach(containerStatus -> { eventBus.publish(ContainerStatusService.CONTAINER_STATUS, JsonObject.mapFrom(containerStatus)); @@ -64,7 +64,7 @@ public class ContainerStatusService { @Scheduled(every = "{karavan.container.status.interval}", concurrentExecution = Scheduled.ConcurrentExecution.SKIP) void collectContainersStatuses() { - if (infinispanService.isReady() && !ConfigService.inKubernetes()) { + if (karavanCacheService.isReady() && !ConfigService.inKubernetes()) { if (!ConfigService.inKubernetes()) { List<ContainerStatus> statusesInDocker = dockerService.collectContainersStatuses(); statusesInDocker.forEach(containerStatus -> { @@ -76,17 +76,17 @@ public class ContainerStatusService { } void cleanContainersStatuses(List<ContainerStatus> statusesInDocker) { - if (infinispanService.isReady() && !ConfigService.inKubernetes()) { + if (karavanCacheService.isReady() && !ConfigService.inKubernetes()) { List<String> namesInDocker = statusesInDocker.stream().map(ContainerStatus::getContainerName).toList(); - List<ContainerStatus> statusesInInfinispan = infinispanService.getContainerStatuses(environment); + List<ContainerStatus> statusesInInfinispan = karavanCacheService.getContainerStatuses(environment); // clean deleted statusesInInfinispan.stream() .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()); + karavanCacheService.deleteContainerStatus(containerStatus); + karavanCacheService.deleteCamelStatuses(containerStatus.getProjectId(), containerStatus.getEnv()); }); } } @@ -100,12 +100,12 @@ public class ContainerStatusService { @ConsumeEvent(value = CONTAINER_STATUS, blocking = true, ordered = true) public void saveContainerStatus(JsonObject data) { - if (infinispanService.isReady()) { + if (karavanCacheService.isReady()) { ContainerStatus newStatus = data.mapTo(ContainerStatus.class); - ContainerStatus oldStatus = infinispanService.getContainerStatus(newStatus.getProjectId(), newStatus.getEnv(), newStatus.getContainerName()); + ContainerStatus oldStatus = karavanCacheService.getContainerStatus(newStatus.getProjectId(), newStatus.getEnv(), newStatus.getContainerName()); if (oldStatus == null) { - infinispanService.saveContainerStatus(newStatus); + karavanCacheService.saveContainerStatus(newStatus); } else if (Objects.equals(oldStatus.getInTransit(), Boolean.FALSE)) { saveContainerStatus(newStatus, oldStatus); } else if (Objects.equals(oldStatus.getInTransit(), Boolean.TRUE)) { @@ -130,6 +130,6 @@ public class ContainerStatusService { newStatus.setCpuInfo(oldStatus.getCpuInfo()); newStatus.setMemoryInfo(oldStatus.getMemoryInfo()); } - infinispanService.saveContainerStatus(newStatus); + karavanCacheService.saveContainerStatus(newStatus); } } \ No newline at end of file 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 d799806d..9d22d1c1 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 @@ -25,12 +25,11 @@ import io.vertx.core.eventbus.EventBus; import jakarta.enterprise.event.Observes; import jakarta.inject.Inject; import jakarta.inject.Singleton; +import org.apache.camel.karavan.cache.KaravanCacheService; import org.apache.camel.karavan.docker.DockerForGitea; -import org.apache.camel.karavan.docker.DockerForInfinispan; import org.apache.camel.karavan.docker.DockerForRegistry; import org.apache.camel.karavan.docker.DockerService; import org.apache.camel.karavan.git.GiteaService; -import org.apache.camel.karavan.infinispan.InfinispanService; import org.apache.camel.karavan.kubernetes.KubernetesService; import org.eclipse.microprofile.config.inject.ConfigProperty; import org.eclipse.microprofile.health.HealthCheck; @@ -66,10 +65,7 @@ public class KaravanService implements HealthCheck { DockerForRegistry dockerForRegistry; @Inject - DockerForInfinispan dockerForInfinispan; - - @Inject - InfinispanService infinispanService; + KaravanCacheService karavanCacheService; @Inject EventBus eventBus; @@ -107,7 +103,6 @@ public class KaravanService implements HealthCheck { dockerService.createNetwork(); dockerService.startListeners(); - dockerForInfinispan.startInfinispan(); if (giteaInstall) { dockerForGitea.startGitea(); giteaService.install(); @@ -131,7 +126,6 @@ public class KaravanService implements HealthCheck { @ConsumeEvent(value = START_SERVICES, blocking = true) void startServices(String data) throws Exception { - infinispanService.tryStart(); projectService.tryStart(); } 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 aaebf8ae..528d54fd 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 @@ -22,17 +22,17 @@ 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.cache.KaravanCacheService; +import org.apache.camel.karavan.cache.model.ContainerStatus; +import org.apache.camel.karavan.cache.model.GroupedKey; +import org.apache.camel.karavan.cache.model.Project; +import org.apache.camel.karavan.cache.model.ProjectFile; import org.apache.camel.karavan.code.CodeService; import org.apache.camel.karavan.code.DockerComposeConverter; 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.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.Constants; @@ -68,7 +68,7 @@ public class ProjectService implements HealthCheck { ProjectModifyValidator projectModifyValidator; @Inject - InfinispanService infinispanService; + KaravanCacheService karavanCacheService; @Inject KubernetesService kubernetesService; @@ -101,7 +101,7 @@ public class ProjectService implements HealthCheck { public String runProjectWithJBangOptions(Project project, String jBangOptions) throws Exception { String containerName = project.getProjectId(); - ContainerStatus status = infinispanService.getDevModeContainerStatus(project.getProjectId(), environment); + ContainerStatus status = karavanCacheService.getDevModeContainerStatus(project.getProjectId(), environment); if (status == null) { status = ContainerStatus.createDevMode(project.getProjectId(), environment); } @@ -164,8 +164,8 @@ public class ProjectService implements HealthCheck { } public List<Project> getAllProjects(String type) { - if (infinispanService.isReady()) { - return infinispanService.getProjects().stream() + if (karavanCacheService.isReady()) { + return karavanCacheService.getProjects().stream() .filter(p -> type == null || Objects.equals(p.getType().name(), type)) .sorted(Comparator.comparing(Project::getProjectId)) .collect(Collectors.toList()); @@ -188,16 +188,16 @@ public class ProjectService implements HealthCheck { public Project save(Project project) { projectModifyValidator.validate(project).failOnError(); - infinispanService.saveProject(project); + karavanCacheService.saveProject(project); ProjectFile appProp = codeService.getApplicationProperties(project); - infinispanService.saveProjectFile(appProp); + karavanCacheService.saveProjectFile(appProp); if (!ConfigService.inKubernetes()) { ProjectFile projectCompose = codeService.createInitialProjectCompose(project); - infinispanService.saveProjectFile(projectCompose); + karavanCacheService.saveProjectFile(projectCompose); } else if (kubernetesService.isOpenshift()){ ProjectFile projectCompose = codeService.createInitialDeployment(project); - infinispanService.saveProjectFile(projectCompose); + karavanCacheService.saveProjectFile(projectCompose); } return project; @@ -206,13 +206,13 @@ public class ProjectService implements HealthCheck { public Project copy(String sourceProjectId, Project project) { projectModifyValidator.validate(project).failOnError(); - Project sourceProject = infinispanService.getProject(sourceProjectId); + Project sourceProject = karavanCacheService.getProject(sourceProjectId); // Save project - infinispanService.saveProject(project); + karavanCacheService.saveProject(project); // Copy files from the source and make necessary modifications - Map<GroupedKey, ProjectFile> filesMap = infinispanService.getProjectFilesMap(sourceProjectId).entrySet().stream() + Map<GroupedKey, ProjectFile> filesMap = karavanCacheService.getProjectFilesMap(sourceProjectId).entrySet().stream() .filter(e -> !Objects.equals(e.getValue().getName(), PROJECT_COMPOSE_FILENAME) && !Objects.equals(e.getValue().getName(), PROJECT_DEPLOYMENT_JKUBE_FILENAME) ) @@ -227,14 +227,14 @@ public class ProjectService implements HealthCheck { return file; }) ); - infinispanService.saveProjectFiles(filesMap); + karavanCacheService.saveProjectFiles(filesMap); if (!ConfigService.inKubernetes()) { ProjectFile projectCompose = codeService.createInitialProjectCompose(project); - infinispanService.saveProjectFile(projectCompose); + karavanCacheService.saveProjectFile(projectCompose); } else if (kubernetesService.isOpenshift()) { ProjectFile projectCompose = codeService.createInitialDeployment(project); - infinispanService.saveProjectFile(projectCompose); + karavanCacheService.saveProjectFile(projectCompose); } return project; @@ -268,8 +268,8 @@ public class ProjectService implements HealthCheck { // @Retry(maxRetries = 100, delay = 2000) public void tryStart() throws Exception { - if (infinispanService.isReady() && gitService.checkGit()) { - if (infinispanService.getProjects().isEmpty()) { + if (karavanCacheService.isReady() && gitService.checkGit()) { + if (karavanCacheService.getProjects().isEmpty()) { importAllProjects(); } if (Objects.equals(environment, Constants.DEV_ENV)) { @@ -300,11 +300,11 @@ public class ProjectService implements HealthCheck { } else { project = getProjectFromRepo(repo); } - infinispanService.saveProject(project); + karavanCacheService.saveProject(project); repo.getFiles().forEach(repoFile -> { ProjectFile file = new ProjectFile(repoFile.getName(), repoFile.getBody(), folderName, repoFile.getLastCommitTimestamp()); - infinispanService.saveProjectFile(file); + karavanCacheService.saveProjectFile(file); }); }); } catch (Exception e) { @@ -322,10 +322,10 @@ public class ProjectService implements HealthCheck { LOGGER.info("Import project from GitRepo " + repo.getName()); try { Project project = getProjectFromRepo(repo); - infinispanService.saveProject(project); + karavanCacheService.saveProject(project); repo.getFiles().forEach(repoFile -> { ProjectFile file = new ProjectFile(repoFile.getName(), repoFile.getBody(), repo.getName(), repoFile.getLastCommitTimestamp()); - infinispanService.saveProjectFile(file); + karavanCacheService.saveProjectFile(file); }); return project; } catch (Exception e) { @@ -348,24 +348,24 @@ public class ProjectService implements HealthCheck { } public Project commitAndPushProject(String projectId, String message) throws Exception { - Project p = infinispanService.getProject(projectId); - List<ProjectFile> files = infinispanService.getProjectFiles(projectId); + Project p = karavanCacheService.getProject(projectId); + List<ProjectFile> files = karavanCacheService.getProjectFiles(projectId); RevCommit commit = gitService.commitAndPushProject(p, files, message); String commitId = commit.getId().getName(); Long lastUpdate = commit.getCommitTime() * 1000L; p.setLastCommit(commitId); p.setLastCommitTimestamp(lastUpdate); - infinispanService.saveProject(p); + karavanCacheService.saveProject(p); return p; } void addKameletsProject() { LOGGER.info("Add custom kamelets project if not exists"); try { - Project kamelets = infinispanService.getProject(Project.Type.kamelets.name()); + Project kamelets = karavanCacheService.getProject(Project.Type.kamelets.name()); if (kamelets == null) { kamelets = new Project(Project.Type.kamelets.name(), "Custom Kamelets", "Custom Kamelets", "", Instant.now().toEpochMilli(), Project.Type.kamelets); - infinispanService.saveProject(kamelets); + karavanCacheService.saveProject(kamelets); commitAndPushProject(Project.Type.kamelets.name(), "Add custom kamelets"); } } catch (Exception e) { @@ -376,23 +376,23 @@ public class ProjectService implements HealthCheck { void addTemplatesProject() { LOGGER.info("Add templates project if not exists"); try { - Project templates = infinispanService.getProject(Project.Type.templates.name()); + Project templates = karavanCacheService.getProject(Project.Type.templates.name()); if (templates == null) { templates = new Project(Project.Type.templates.name(), "Templates", "Templates", "", Instant.now().toEpochMilli(), Project.Type.templates); - infinispanService.saveProject(templates); + karavanCacheService.saveProject(templates); codeService.getTemplates().forEach((name, value) -> { ProjectFile file = new ProjectFile(name, value, Project.Type.templates.name(), Instant.now().toEpochMilli()); - infinispanService.saveProjectFile(file); + karavanCacheService.saveProjectFile(file); }); commitAndPushProject(Project.Type.templates.name(), "Add default templates"); } else { LOGGER.info("Add new templates if any"); codeService.getTemplates().forEach((name, value) -> { - ProjectFile f = infinispanService.getProjectFile(Project.Type.templates.name(), name); + ProjectFile f = karavanCacheService.getProjectFile(Project.Type.templates.name(), name); if (f == null) { ProjectFile file = new ProjectFile(name, value, Project.Type.templates.name(), Instant.now().toEpochMilli()); - infinispanService.saveProjectFile(file); + karavanCacheService.saveProjectFile(file); } }); } @@ -404,14 +404,14 @@ public class ProjectService implements HealthCheck { void addServicesProject() { LOGGER.info("Add services project if not exists"); try { - Project services = infinispanService.getProject(Project.Type.services.name()); + Project services = karavanCacheService.getProject(Project.Type.services.name()); if (services == null) { services = new Project(Project.Type.services.name(), "Services", "Development Services", "", Instant.now().toEpochMilli(), Project.Type.services); - infinispanService.saveProject(services); + karavanCacheService.saveProject(services); codeService.getServices().forEach((name, value) -> { ProjectFile file = new ProjectFile(name, value, Project.Type.services.name(), Instant.now().toEpochMilli()); - infinispanService.saveProjectFile(file); + karavanCacheService.saveProjectFile(file); }); commitAndPushProject(Project.Type.services.name(), "Add services"); } @@ -421,7 +421,7 @@ public class ProjectService implements HealthCheck { } public String getDevServiceCode() { - List<ProjectFile> files = infinispanService.getProjectFiles(Project.Type.services.name()); + List<ProjectFile> files = karavanCacheService.getProjectFiles(Project.Type.services.name()); Optional<ProjectFile> file = files.stream().filter(f -> f.getName().equals(DEV_SERVICES_FILENAME)).findFirst(); return file.orElse(new ProjectFile()).getCode(); } diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/validation/project/ProjectFileCreateValidator.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/validation/project/ProjectFileCreateValidator.java index f6f71265..f753e74e 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/validation/project/ProjectFileCreateValidator.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/validation/project/ProjectFileCreateValidator.java @@ -2,8 +2,8 @@ package org.apache.camel.karavan.validation.project; import java.util.List; -import org.apache.camel.karavan.infinispan.InfinispanService; -import org.apache.camel.karavan.infinispan.model.ProjectFile; +import org.apache.camel.karavan.cache.KaravanCacheService; +import org.apache.camel.karavan.cache.model.ProjectFile; import org.apache.camel.karavan.shared.validation.SimpleValidator; import org.apache.camel.karavan.shared.validation.ValidationError; import org.apache.camel.karavan.shared.validation.Validator; @@ -14,18 +14,18 @@ import jakarta.enterprise.context.ApplicationScoped; public class ProjectFileCreateValidator extends Validator<ProjectFile> { private final SimpleValidator simpleValidator; - private final InfinispanService infinispanService; + private final KaravanCacheService karavanCacheService; - public ProjectFileCreateValidator(SimpleValidator simpleValidator, InfinispanService infinispanService) { + public ProjectFileCreateValidator(SimpleValidator simpleValidator, KaravanCacheService karavanCacheService) { this.simpleValidator = simpleValidator; - this.infinispanService = infinispanService; + this.karavanCacheService = karavanCacheService; } @Override protected void validationRules(ProjectFile value, List<ValidationError> errors) { simpleValidator.validate(value, errors); - boolean projectFileExists = infinispanService.getProjectFile(value.getProjectId(), value.getName()) != null; + boolean projectFileExists = karavanCacheService.getProjectFile(value.getProjectId(), value.getName()) != null; if (projectFileExists) { errors.add(new ValidationError("name", "File with given name already exists")); diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/validation/project/ProjectModifyValidator.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/validation/project/ProjectModifyValidator.java index 3ba08dac..a59d9cc6 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/validation/project/ProjectModifyValidator.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/validation/project/ProjectModifyValidator.java @@ -2,8 +2,8 @@ package org.apache.camel.karavan.validation.project; import java.util.List; -import org.apache.camel.karavan.infinispan.InfinispanService; -import org.apache.camel.karavan.infinispan.model.Project; +import org.apache.camel.karavan.cache.KaravanCacheService; +import org.apache.camel.karavan.cache.model.Project; import org.apache.camel.karavan.shared.validation.SimpleValidator; import org.apache.camel.karavan.shared.validation.ValidationError; import org.apache.camel.karavan.shared.validation.Validator; @@ -15,11 +15,11 @@ public class ProjectModifyValidator extends Validator<Project> { private static final List<String> FORBIDDEN_PROJECT_ID_VALUES = List.of("templates", "kamelets"); private final SimpleValidator simpleValidator; - private final InfinispanService infinispanService; + private final KaravanCacheService karavanCacheService; - public ProjectModifyValidator(SimpleValidator simpleValidator, InfinispanService infinispanService) { + public ProjectModifyValidator(SimpleValidator simpleValidator, KaravanCacheService karavanCacheService) { this.simpleValidator = simpleValidator; - this.infinispanService = infinispanService; + this.karavanCacheService = karavanCacheService; } @@ -27,7 +27,7 @@ public class ProjectModifyValidator extends Validator<Project> { protected void validationRules(Project value, List<ValidationError> errors) { simpleValidator.validate(value, errors); - boolean projectIdExists = infinispanService.getProject(value.getProjectId()) != null; + boolean projectIdExists = karavanCacheService.getProject(value.getProjectId()) != null; if(projectIdExists) { errors.add(new ValidationError("projectId", "Project ID already exists")); diff --git a/karavan-web/karavan-app/src/main/resources/application.properties b/karavan-web/karavan-app/src/main/resources/application.properties index 2efec5fd..b03e514e 100644 --- a/karavan-web/karavan-app/src/main/resources/application.properties +++ b/karavan-web/karavan-app/src/main/resources/application.properties @@ -59,14 +59,6 @@ karavan.image-registry-username= karavan.image-registry-password= karavan.image-registry-install=false -# Infinispan connection config -karavan.infinispan.username=admin -karavan.infinispan.password=karavan -karavan.infinispan.hosts=infinispan:11222 - -quarkus.infinispan-client.devservices.enabled=false -quarkus.infinispan-client.health.enabled=false - # Public Dev %dev.karavan.auth=public %dev.quarkus.oidc.enabled=false diff --git a/karavan-web/karavan-app/src/main/resources/cache/data-cache-config.xml b/karavan-web/karavan-app/src/main/resources/cache/data-cache-config.xml deleted file mode 100644 index 59d2b404..00000000 --- a/karavan-web/karavan-app/src/main/resources/cache/data-cache-config.xml +++ /dev/null @@ -1,23 +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. - --> - -<distributed-cache name="%s" mode="SYNC"> - <encoding media-type="application/x-protostream"/> - <locking isolation="REPEATABLE_READ"/> - <groups enabled="true"/> - <memory max-count="1000000" when-full="REMOVE"/> -</distributed-cache> \ No newline at end of file diff --git a/karavan-web/karavan-app/src/main/resources/hazelcast.xml b/karavan-web/karavan-app/src/main/resources/hazelcast.xml new file mode 100644 index 00000000..37836362 --- /dev/null +++ b/karavan-web/karavan-app/src/main/resources/hazelcast.xml @@ -0,0 +1,21 @@ +<hazelcast xmlns="http://www.hazelcast.com/schema/config" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.hazelcast.com/schema/config + http://www.hazelcast.com/schema/config/hazelcast-config-5.3.xsd"> + <cluster-name>karavan</cluster-name> + <instance-name>karavan</instance-name> + <jet enabled="false" resource-upload-enabled="false"/> + <integrity-checker enabled="false"/> + <network> + <port auto-increment="true">5900</port> + <outbound-ports> + <ports>0</ports> + </outbound-ports> + <join> + <auto-detection enabled="false"/> + <multicast enabled="false"/> + <tcp-ip enabled="false"/> + </join> + </network> + <metrics enabled="false"/> +</hazelcast> diff --git a/karavan-web/karavan-app/src/main/resources/services/internal.yaml b/karavan-web/karavan-app/src/main/resources/services/internal.yaml index 630f498d..9f01ef32 100644 --- a/karavan-web/karavan-app/src/main/resources/services/internal.yaml +++ b/karavan-web/karavan-app/src/main/resources/services/internal.yaml @@ -2,12 +2,6 @@ version: '3.8' services: - infinispan: - image: quay.io/infinispan/server:14.0.21.Final - restart: always - ports: - - "11222:11222" - gitea: image: gitea/gitea:1.20.2-rootless restart: always