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;

Reply via email to