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 f797c4dbfbd0d94cf74a51f54741c39aef861e74 Author: Marat Gubaidullin <ma...@talismancloud.io> AuthorDate: Sun Aug 25 12:44:52 2024 -0400 Project and File events --- .../org/apache/camel/karavan/KaravanCache.java | 38 ++++++++++++++++++---- .../org/apache/camel/karavan/KaravanEvents.java | 6 ++++ .../apache/camel/karavan/KaravanStartupLoader.java | 18 +++++----- .../camel/karavan/api/ProjectFileResource.java | 7 ++-- .../apache/camel/karavan/service/CodeService.java | 14 +++++++- .../camel/karavan/service/ConfigService.java | 2 +- .../camel/karavan/service/ProjectService.java | 22 ++++++------- 7 files changed, 75 insertions(+), 32 deletions(-) diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanCache.java b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanCache.java index f60877d5..5d1ead6d 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanCache.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanCache.java @@ -16,7 +16,10 @@ */ package org.apache.camel.karavan; +import io.vertx.core.eventbus.EventBus; +import io.vertx.core.json.JsonObject; import jakarta.enterprise.inject.Default; +import jakarta.inject.Inject; import jakarta.inject.Singleton; import org.apache.camel.karavan.model.*; @@ -29,6 +32,7 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import static org.apache.camel.karavan.KaravanConstants.DEV; +import static org.apache.camel.karavan.KaravanEvents.*; @Default @Singleton @@ -44,6 +48,9 @@ public class KaravanCache { private final Map<String, ServiceStatus> serviceStatuses = new ConcurrentHashMap<>(); private final Map<String, CamelStatus> camelStatuses = new ConcurrentHashMap<>(); + @Inject + EventBus eventBus; + // lists of copies private List<Project> getCopyProjects() { @@ -93,9 +100,12 @@ public class KaravanCache { return new ArrayList<>(getCopyProjects()); } - public void saveProject(Project project) { + public void saveProject(Project project, boolean startup) { var key = GroupedKey.create(project.getProjectId(), DEV, project.getProjectId()); projects.put(key, project); + if (!startup) { + eventBus.publish(PROJECT_SAVED, JsonObject.mapFrom(project)); + } } public List<ProjectFile> getProjectFiles(String projectId) { @@ -117,8 +127,11 @@ public class KaravanCache { return getCopyProjectFiles().stream().filter(pf -> Objects.equals(pf.getName(), filename)).toList(); } - public void saveProjectFile(ProjectFile file, boolean commited) { + public void saveProjectFile(ProjectFile file, boolean commited, boolean startup) { files.put(GroupedKey.create(file.getProjectId(), DEV, file.getName()), file); + if (!startup) { + eventBus.publish(PROJECT_FILE_SAVED, JsonObject.mapFrom(file)); + } if (commited) { filesCommited.put(GroupedKey.create(file.getProjectId(), DEV, file.getName()), file); } @@ -136,14 +149,21 @@ public class KaravanCache { .forEach(es -> filesCommited.put(es.getKey(), es.getValue().copy())); } - public void saveProjectFiles(Map<String, ProjectFile> filesToSave) { + public void saveProjectFiles(Map<String, ProjectFile> filesToSave, boolean startup) { long lastUpdate = Instant.now().toEpochMilli(); filesToSave.forEach((groupedKey, projectFile) -> projectFile.setLastUpdate(lastUpdate)); files.putAll(filesToSave); + if (!startup) { + files.forEach((s, file) -> eventBus.publish(PROJECT_FILE_SAVED, JsonObject.mapFrom(file))); + } } - public void deleteProjectFile(String projectId, String filename) { - files.remove(GroupedKey.create(projectId, DEV, filename)); + public void deleteProjectFile(String projectId, String filename, boolean startup) { + var key = new GroupedKey(projectId, DEV, filename); + files.remove(key.getCacheKey()); + if (!startup) { + eventBus.publish(PROJECT_FILE_DELETED, JsonObject.mapFrom(key)); + } } public List<ProjectFile> getProjectFilesCommited(String projectId) { @@ -159,8 +179,12 @@ public class KaravanCache { filesCommited.remove(GroupedKey.create(projectId, DEV, filename)); } - public void deleteProject(String projectId) { - projects.remove(GroupedKey.create(projectId, DEV, projectId)); + public void deleteProject(String projectId, boolean startup) { + var key = new GroupedKey(projectId, DEV, projectId); + projects.remove(key.getCacheKey()); + if (!startup) { + eventBus.publish(PROJECT_DELETED, JsonObject.mapFrom(key)); + } } public Project getProject(String projectId) { diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanEvents.java b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanEvents.java index b4f806bd..f2fa16d7 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanEvents.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanEvents.java @@ -18,7 +18,13 @@ package org.apache.camel.karavan; public class KaravanEvents { + public static final String PROJECT_SAVED = "PROJECT_SAVED"; + public static final String PROJECT_DELETED = "PROJECT_DELETED"; + public static final String PROJECT_FILE_SAVED = "PROJECT_FILE_SAVED"; + public static final String PROJECT_FILE_DELETED = "PROJECT_FILE_DELETED"; + public static final String CMD_PUSH_PROJECT = "CMD_PUSH_PROJECT"; + public static final String NOTIFICATION_PROJECTS_STARTED = "NOTIFICATION_PROJECTS_STARTED"; public static final String COMMIT_HAPPENED = "COMMIT_HAPPENED"; public static final String NOTIFICATION_IMAGES_LOADED = "NOTIFICATION_IMAGES_LOADED"; diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanStartupLoader.java b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanStartupLoader.java index 7e38894b..5b760eff 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanStartupLoader.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanStartupLoader.java @@ -131,11 +131,11 @@ public class KaravanStartupLoader implements HealthCheck { } else { project = projectService.getProjectFromRepo(repo); } - karavanCache.saveProject(project); + karavanCache.saveProject(project, true); repo.getFiles().forEach(repoFile -> { ProjectFile file = new ProjectFile(repoFile.getName(), repoFile.getBody(), folderName, repoFile.getLastCommitTimestamp()); - karavanCache.saveProjectFile(file, true); + karavanCache.saveProjectFile(file, true, true); }); }); } catch (Exception e) { @@ -149,7 +149,7 @@ public class KaravanStartupLoader implements HealthCheck { if (kamelets == null) { LOGGER.info("Add custom kamelets project"); kamelets = new Project(Project.Type.kamelets.name(), "Custom Kamelets", "", Instant.now().toEpochMilli(), Project.Type.kamelets); - karavanCache.saveProject(kamelets); + karavanCache.saveProject(kamelets, true); } } catch (Exception e) { LOGGER.error("Error during custom kamelets project creation", e); @@ -162,11 +162,11 @@ public class KaravanStartupLoader implements HealthCheck { if (templates == null) { LOGGER.info("Add templates project"); templates = new Project(Project.Type.templates.name(), "Templates", "", Instant.now().toEpochMilli(), Project.Type.templates); - karavanCache.saveProject(templates); + karavanCache.saveProject(templates, true); codeService.getTemplates().forEach((name, value) -> { ProjectFile file = new ProjectFile(name, value, Project.Type.templates.name(), Instant.now().toEpochMilli()); - karavanCache.saveProjectFile(file, false); + karavanCache.saveProjectFile(file, false, true); }); } else { codeService.getTemplates().forEach((name, value) -> { @@ -174,7 +174,7 @@ public class KaravanStartupLoader implements HealthCheck { if (f == null) { LOGGER.info("Add new template " + name); ProjectFile file = new ProjectFile(name, value, Project.Type.templates.name(), Instant.now().toEpochMilli()); - karavanCache.saveProjectFile(file, false); + karavanCache.saveProjectFile(file, false, true); } }); } @@ -189,11 +189,11 @@ public class KaravanStartupLoader implements HealthCheck { if (configuration == null) { LOGGER.info("Add configuration project"); configuration = new Project(Project.Type.configuration.name(), "Configuration", "", Instant.now().toEpochMilli(), Project.Type.configuration); - karavanCache.saveProject(configuration); + karavanCache.saveProject(configuration, true); codeService.getConfigurationFiles().forEach((name, value) -> { ProjectFile file = new ProjectFile(name, value, Project.Type.configuration.name(), Instant.now().toEpochMilli()); - karavanCache.saveProjectFile(file, false); + karavanCache.saveProjectFile(file, false, true); }); } else { codeService.getConfigurationFiles().forEach((name, value) -> { @@ -201,7 +201,7 @@ public class KaravanStartupLoader implements HealthCheck { if (f == null) { LOGGER.info("Add new configuration " + name); ProjectFile file = new ProjectFile(name, value, Project.Type.configuration.name(), Instant.now().toEpochMilli()); - karavanCache.saveProjectFile(file, false); + karavanCache.saveProjectFile(file, false, true); } }); } diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java index 8085037b..f8310f08 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/ProjectFileResource.java @@ -100,7 +100,7 @@ public class ProjectFileResource { if (projectFileExists) { return Response.serverError().entity("File with given name already exists").build(); } else { - karavanCache.saveProjectFile(file, false); + karavanCache.saveProjectFile(file, false, false); return Response.ok(file).build(); } } @@ -110,7 +110,7 @@ public class ProjectFileResource { @Consumes(MediaType.APPLICATION_JSON) public ProjectFile update(ProjectFile file) throws Exception { file.setLastUpdate(Instant.now().toEpochMilli()); - karavanCache.saveProjectFile(file, false); + karavanCache.saveProjectFile(file, false, false); return file; } @@ -121,7 +121,8 @@ public class ProjectFileResource { @PathParam("filename") String filename) throws Exception { karavanCache.deleteProjectFile( URLDecoder.decode(project, StandardCharsets.UTF_8), - URLDecoder.decode(filename, StandardCharsets.UTF_8) + URLDecoder.decode(filename, StandardCharsets.UTF_8), + false ); } } \ No newline at end of file diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java b/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java index 75539cf1..5d1a5bbf 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java @@ -75,6 +75,9 @@ public class CodeService { @ConfigProperty(name = "karavan.gav") Optional<String> gav; + @Inject + ConfigService configService; + @Inject KaravanCache karavanCache; @@ -109,6 +112,7 @@ public class CodeService { .filter(f -> !f.getName().endsWith(MARKDOWN_EXTENSION)) .filter(f -> !Objects.equals(f.getName(), PROJECT_COMPOSE_FILENAME)) .filter(f -> !f.getName().endsWith(PROJECT_JKUBE_EXTENSION)) + .filter(this::isDevFile) .collect(Collectors.toMap(ProjectFile::getName, ProjectFile::getCode)); if (withKamelets) { @@ -118,6 +122,13 @@ public class CodeService { return files; } + private boolean isDevFile(ProjectFile f) { + var filename = f.getName(); + var parts = filename.split("\\."); + var prefix = parts[0]; + return !configService.getEnvs().contains(prefix); + } + public String getBuilderPodFragment() { ProjectFile projectFile = karavanCache.getProjectFile(Project.Type.configuration.name(), BUILDER_POD_FRAGMENT_FILENAME); return projectFile != null ? projectFile.getCode() : null; @@ -357,7 +368,7 @@ public class CodeService { service.setImage(imageName); String code = DockerComposeConverter.toCode(service); compose.setCode(code); - karavanCache.saveProjectFile(compose, false); + karavanCache.saveProjectFile(compose, false, false); } } @@ -382,6 +393,7 @@ public class CodeService { private static String toEnvFormat(String input) { return input.replaceAll("[^a-zA-Z0-9]", "_").toUpperCase(); } + private static Set<String> findVariables(String template) { Set<String> variables = new HashSet<>(); diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java b/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java index 165c0728..0ee504e2 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/service/ConfigService.java @@ -157,7 +157,7 @@ public class ConfigService { } } - private List<String> getEnvs() { + protected List<String> getEnvs() { return environments.orElse(List.of(DEV)); } diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java b/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java index e1340087..1c2f6995 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/service/ProjectService.java @@ -86,7 +86,7 @@ public class ProjectService { Long lastUpdate = commit.getCommitTime() * 1000L; p.setLastCommit(commitId); p.setLastCommitTimestamp(lastUpdate); - karavanCache.saveProject(p); + karavanCache.saveProject(p, false); return p; } else { throw new RuntimeException("Unsupported environment: " + environment); @@ -158,10 +158,10 @@ public class ProjectService { LOGGER.info("Import project from GitRepo " + repo.getName()); try { Project project = getProjectFromRepo(repo); - karavanCache.saveProject(project); + karavanCache.saveProject(project, false); repo.getFiles().forEach(repoFile -> { ProjectFile file = new ProjectFile(repoFile.getName(), repoFile.getBody(), repo.getName(), repoFile.getLastCommitTimestamp()); - karavanCache.saveProjectFile(file, true); + karavanCache.saveProjectFile(file, true, false); }); } catch (Exception e) { LOGGER.error("Error during project import", e); @@ -234,15 +234,15 @@ public class ProjectService { if (projectIdExists) { throw new Exception("Project with id " + project.getProjectId() + " already exists"); } else { - karavanCache.saveProject(project); + karavanCache.saveProject(project, false); ProjectFile appProp = codeService.generateApplicationProperties(project); - karavanCache.saveProjectFile(appProp, false); + karavanCache.saveProjectFile(appProp, false, false); if (!ConfigService.inKubernetes()) { ProjectFile projectCompose = codeService.createInitialProjectCompose(project, getMaxPortMappedInProjects() + 1); - karavanCache.saveProjectFile(projectCompose, false); + karavanCache.saveProjectFile(projectCompose, false, false); } else { ProjectFile projectDeployment = codeService.createInitialDeployment(project); - karavanCache.saveProjectFile(projectDeployment, false); + karavanCache.saveProjectFile(projectDeployment, false, false); } } return project; @@ -258,7 +258,7 @@ public class ProjectService { Project sourceProject = karavanCache.getProject(sourceProjectId); // Save project - karavanCache.saveProject(project); + karavanCache.saveProject(project, false); // Copy files from the source and make necessary modifications Map<String, ProjectFile> filesMap = karavanCache.getProjectFilesMap(sourceProjectId).entrySet().stream() @@ -276,14 +276,14 @@ public class ProjectService { return file; }) ); - karavanCache.saveProjectFiles(filesMap); + karavanCache.saveProjectFiles(filesMap, false); if (!ConfigService.inKubernetes()) { ProjectFile projectCompose = codeService.createInitialProjectCompose(project, getMaxPortMappedInProjects() + 1); - karavanCache.saveProjectFile(projectCompose, false); + karavanCache.saveProjectFile(projectCompose, false, false); } else { ProjectFile projectCompose = codeService.createInitialDeployment(project); - karavanCache.saveProjectFile(projectCompose, false); + karavanCache.saveProjectFile(projectCompose, false, false); } return project;