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 dc22814ac4f4c8ae9174b075d3f88d57ce1977a8 Author: Marat Gubaidullin <ma...@talismancloud.io> AuthorDate: Fri Aug 9 15:25:37 2024 -0400 Fix #1355 --- .../org/apache/camel/karavan/KaravanCache.java | 13 ++++++++--- .../org/apache/camel/karavan/KaravanConstants.java | 1 + .../camel/karavan/api/InfrastructureResource.java | 26 +++++++++++++++++---- .../karavan/kubernetes/KubernetesService.java | 27 ++++++++++++++++++++-- .../camel/karavan/service/ProjectService.java | 4 ++-- 5 files changed, 60 insertions(+), 11 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 b1d29405..c3e149b8 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 @@ -58,6 +58,12 @@ public class KaravanCache { return copy; } + private Map<String, ProjectFile> getCopyProjectFilesMap() { + Map<String, ProjectFile> copy = new ConcurrentHashMap<>(files.size()); + files.forEach((key, value) -> copy.put(key, value.copy())); + return copy; + } + private List<ProjectFile> getCopyProjectFilesCommited() { List<ProjectFile> copy = new ArrayList<>(filesCommited.size()); filesCommited.values().forEach(e -> copy.add(e.copy())); @@ -97,8 +103,9 @@ public class KaravanCache { } public Map<String, ProjectFile> getProjectFilesMap(String projectId) { - return getCopyProjectFiles().stream().filter(pf -> !Objects.isNull(pf) && Objects.equals(pf.getProjectId(), projectId)) - .collect(Collectors.toMap(ProjectFile::getName, ProjectFile::copy)); + return getCopyProjectFilesMap().entrySet().stream() + .filter(es -> !Objects.isNull(es.getValue()) && Objects.equals(es.getValue().getProjectId(), projectId)) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); } public ProjectFile getProjectFile(String projectId, String filename) { @@ -311,4 +318,4 @@ public class KaravanCache { podContainerStatuses.clear(); camelStatuses.clear(); } -} +} \ No newline at end of file diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanConstants.java b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanConstants.java index 756a558a..561a3e81 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/KaravanConstants.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/KaravanConstants.java @@ -38,6 +38,7 @@ public class KaravanConstants { public static final String BUILD_DOCKER_CONFIG_SECRET = "dockerconfigjson"; public static final String PRIVATE_KEY_SECRET_KEY = "private-key"; public static final String KNOWN_HOSTS_SECRET_KEY = "known-hosts"; + public static final String KUBERNETES_YAML_FILENAME = "kubernetes.yaml"; public static final String LABEL_KUBERNETES_RUNTIME = "app.kubernetes.io/runtime"; public static final String ANNOTATION_COMMIT = "jkube.eclipse.org/git-commit"; diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/api/InfrastructureResource.java b/karavan-app/src/main/java/org/apache/camel/karavan/api/InfrastructureResource.java index c75c52c5..f15dbaee 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/api/InfrastructureResource.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/api/InfrastructureResource.java @@ -21,9 +21,11 @@ import jakarta.ws.rs.*; import jakarta.ws.rs.core.MediaType; import jakarta.ws.rs.core.Response; import org.apache.camel.karavan.KaravanCache; +import org.apache.camel.karavan.KaravanConstants; import org.apache.camel.karavan.kubernetes.KubernetesService; import org.apache.camel.karavan.kubernetes.KubernetesStatusService; import org.apache.camel.karavan.model.DeploymentStatus; +import org.apache.camel.karavan.model.ProjectFile; import org.apache.camel.karavan.model.ServiceStatus; import org.apache.camel.karavan.service.ConfigService; import org.eclipse.microprofile.config.inject.ConfigProperty; @@ -31,8 +33,11 @@ import org.jboss.logging.Logger; import java.util.Comparator; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; +import static org.apache.camel.karavan.KaravanConstants.KUBERNETES_YAML_FILENAME; + @Path("/ui/infrastructure") public class InfrastructureResource { @@ -70,9 +75,22 @@ public class InfrastructureResource { @POST @Produces(MediaType.APPLICATION_JSON) - @Path("/deployment/rollout/{env}/{name}") - public Response rollout(@PathParam("env") String env, @PathParam("name") String name) throws Exception { - kubernetesService.rolloutDeployment(name, kubernetesService.getNamespace()); + @Path("/deployment/rollout/{env}/{projectId}") + public Response rollout(@PathParam("env") String env, @PathParam("projectId") String projectId) throws Exception { + kubernetesService.rolloutDeployment(projectId); + return Response.ok().build(); + } + + @POST + @Produces(MediaType.APPLICATION_JSON) + @Path("/deployment/start/{env}/{projectId}") + public Response start(@PathParam("env") String env, @PathParam("projectId") String projectId) throws Exception { + var name = Objects.equals(environment, KaravanConstants.DEV_ENVIRONMENT) ? KUBERNETES_YAML_FILENAME : environment + "." + KUBERNETES_YAML_FILENAME; + ProjectFile resources = karavanCache.getProjectFile(projectId, name); + if (resources == null) { + return Response.status(Response.Status.NOT_FOUND).entity("Resource file " + KUBERNETES_YAML_FILENAME + " not found").build(); + } + kubernetesService.startDeployment(resources.getCode()); return Response.ok().build(); } @@ -81,7 +99,7 @@ public class InfrastructureResource { @Consumes(MediaType.APPLICATION_JSON) @Path("/deployment/{env}/{name}") public Response deleteDeployment(@PathParam("env") String env, @PathParam("name") String name) throws Exception { - kubernetesService.deleteDeployment(name, kubernetesService.getNamespace()); + kubernetesService.deleteDeployment(name); return Response.ok().build(); } diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java index 75327b14..5dc18c87 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/kubernetes/KubernetesService.java @@ -242,7 +242,7 @@ public class KubernetesService { return Tuple2.of(logWatch, client); } - public void rolloutDeployment(String name, String namespace) { + public void rolloutDeployment(String name) { try (KubernetesClient client = kubernetesClient()) { client.apps().deployments().inNamespace(namespace).withName(name).rolling().restart(); } catch (Exception ex) { @@ -250,7 +250,16 @@ public class KubernetesService { } } - public void deleteDeployment(String name, String namespace) { + public void startDeployment(String resources) { + try (KubernetesClient client = kubernetesClient()) { + KubernetesList list = Serialization.unmarshal(resources, KubernetesList.class); + list.getItems().forEach(item -> client.resource(item).serverSideApply()); + } catch (Exception ex) { + LOGGER.error(ex.getMessage()); + } + } + + public void deleteDeployment(String name) { try (KubernetesClient client = kubernetesClient()) { LOGGER.info("Delete deployment: " + name + " in the namespace: " + namespace); client.apps().deployments().inNamespace(namespace).withName(name).delete(); @@ -497,6 +506,14 @@ public class KubernetesService { } } + public String getSecret(String name, String key) { + try (KubernetesClient client = kubernetesClient()) { + Secret secret = client.secrets().inNamespace(getNamespace()).withName(name).get(); + Map<String, String> data = secret.getData(); + return decodeSecret(data.get(key)); + } + } + private String decodeSecret(String data) { if (data != null) { return new String(Base64.getDecoder().decode(data.getBytes(StandardCharsets.UTF_8))); @@ -522,4 +539,10 @@ public class KubernetesService { } return namespace; } + + public void updateSecret(Secret secret) { + try (KubernetesClient client = kubernetesClient()) { + client.resource(secret).update(); + } + } } 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 bd2b3916..2890eabd 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 @@ -230,8 +230,8 @@ public class ProjectService { ProjectFile projectCompose = codeService.createInitialProjectCompose(project, getMaxPortMappedInProjects() + 1); karavanCache.saveProjectFile(projectCompose, false); } else { - ProjectFile projectCompose = codeService.createInitialDeployment(project); - karavanCache.saveProjectFile(projectCompose, false); + ProjectFile projectDeployment = codeService.createInitialDeployment(project); + karavanCache.saveProjectFile(projectDeployment, false); } } return project;