You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ma...@apache.org on 2023/09/08 18:17:18 UTC

[camel-karavan] 02/02: Set image for #817

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 7d6280fb246acc37c4a5d478913bd0ec37c74778
Author: Marat Gubaidullin <ma...@talismancloud.io>
AuthorDate: Fri Sep 8 14:17:07 2023 -0400

    Set image for #817
---
 .../org/apache/camel/karavan/api/ImagesResource.java | 10 +++++++---
 .../camel/karavan/infinispan/model/Project.java      | 20 --------------------
 .../apache/camel/karavan/service/ProjectService.java | 13 +++++--------
 .../src/main/webui/src/api/KaravanApi.tsx            |  4 ++--
 .../src/main/webui/src/api/ProjectModels.ts          |  6 +-----
 .../src/main/webui/src/api/ProjectService.ts         |  3 +++
 .../src/main/webui/src/api/ServiceModels.ts          | 16 ++++++++--------
 .../src/main/webui/src/designer/karavan.css          |  3 ++-
 .../src/main/webui/src/project/DevModeToolbar.tsx    |  4 ++--
 .../src/main/webui/src/project/ProjectToolbar.tsx    | 11 ++---------
 .../src/main/webui/src/project/files/FilesTab.tsx    |  7 ++++---
 .../src/main/webui/src/services/ServicesPage.tsx     |  8 ++++----
 .../src/main/webui/src/services/ServicesTableRow.tsx |  4 ++--
 13 files changed, 42 insertions(+), 67 deletions(-)

diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java
index ae4ca231..9d4e0371 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/api/ImagesResource.java
@@ -26,6 +26,7 @@ import org.apache.camel.karavan.infinispan.model.Project;
 import org.apache.camel.karavan.service.ProjectService;
 import org.apache.camel.karavan.service.RegistryService;
 
+import java.util.Comparator;
 import java.util.List;
 
 @Path("/api/image")
@@ -46,16 +47,19 @@ public class ImagesResource {
     public List<String> getImagesForProject(@HeaderParam("username") String username,
                                  @PathParam("projectId") String projectId) throws Exception {
         String pattern = registryService.getRegistryWithGroup() + "/" + projectId;
-        return dockerService.getImages().stream().filter(s -> s.startsWith(pattern)).toList();
+        return dockerService.getImages().stream().filter(s -> s.startsWith(pattern)).sorted(Comparator.reverseOrder()).toList();
     }
 
     @POST
     @Produces(MediaType.APPLICATION_JSON)
     @Consumes(MediaType.APPLICATION_JSON)
     @Path("/{projectId}")
-    public Response build(JsonObject imageName, @PathParam("projectId") String projectId) throws Exception {
+    public Response build(JsonObject data, @PathParam("projectId") String projectId) throws Exception {
         try {
-            projectService.setProjectImage(projectId, imageName.getString("imageName"));
+            String imageName = data.getString("imageName");
+            boolean commit = data.getBoolean("commit");
+            String message = data.getString("message");
+            projectService.setProjectImage(projectId, imageName, commit, message);
             return Response.ok().entity(imageName).build();
         } catch (Exception e) {
             return Response.serverError().entity(e.getMessage()).build();
diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java
index 22a7bac8..c719aa13 100644
--- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java
+++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/infinispan/model/Project.java
@@ -32,21 +32,8 @@ public class Project {
     Long lastCommitTimestamp;
     @ProtoField(number = 7)
     Type type;
-    @ProtoField(number = 8)
-    String image;
 
     @ProtoFactory
-    public Project(String projectId, String name, String description, String runtime, String lastCommit, Long lastCommitTimestamp, Type type, String image) {
-        this.projectId = projectId;
-        this.name = name;
-        this.description = description;
-        this.runtime = runtime;
-        this.lastCommit = lastCommit;
-        this.lastCommitTimestamp = lastCommitTimestamp;
-        this.type = type;
-        this.image = image;
-    }
-
     public Project(String projectId, String name, String description, String runtime, String lastCommit, Long lastCommitTimestamp, Type type) {
         this.projectId = projectId;
         this.name = name;
@@ -136,11 +123,4 @@ public class Project {
         this.type = type;
     }
 
-    public String getImage() {
-        return image;
-    }
-
-    public void setImage(String image) {
-        this.image = image;
-    }
 }
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 8d0ced7d..5ce1e34f 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
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.karavan.service;
 
+import io.smallrye.mutiny.tuples.Tuple2;
 import io.vertx.core.json.JsonObject;
 import io.vertx.mutiny.core.eventbus.EventBus;
 import org.apache.camel.karavan.code.CodeService;
@@ -166,12 +167,6 @@ public class ProjectService implements HealthCheck {
             return infinispanService.getProjects().stream()
                     .filter(p -> type == null || Objects.equals(p.getType().name(), type))
                     .sorted(Comparator.comparing(Project::getProjectId))
-                    .map(project -> {
-                        if (Objects.equals(project.getType(), Project.Type.normal)) {
-                            project.setImage(getImage(files, project.getProjectId()));
-                        }
-                        return project;
-                    })
                     .collect(Collectors.toList());
         } else {
             return List.of();
@@ -379,15 +374,17 @@ public class ProjectService implements HealthCheck {
         return file.orElse(new ProjectFile()).getCode();
     }
 
-    public void setProjectImage(String projectId, String imageName) {
+    public void setProjectImage(String projectId, String imageName, boolean commit, String message) throws Exception {
         ProjectFile file = infinispanService.getProjectFile(projectId, PROJECT_COMPOSE_FILENAME);
         if (file != null) {
             DockerComposeService service = DockerComposeConverter.fromCode(file.getCode(), projectId);
             service.setImage(imageName);
             String code = DockerComposeConverter.toCode(service);
-            System.out.println(code);
             file.setCode(code);
             infinispanService.saveProjectFile(file);
+            if (commit) {
+                commitAndPushProject(projectId, message);
+            }
         }
     }
 }
diff --git a/karavan-web/karavan-app/src/main/webui/src/api/KaravanApi.tsx b/karavan-web/karavan-app/src/main/webui/src/api/KaravanApi.tsx
index 40601212..d6bcfcd2 100644
--- a/karavan-web/karavan-app/src/main/webui/src/api/KaravanApi.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/api/KaravanApi.tsx
@@ -371,8 +371,8 @@ export class KaravanApi {
         });
     }
 
-    static async setProjectImage(projectId: string, imageName: string, after: (res: AxiosResponse<any>) => void) {
-        instance.post('/api/image/' + projectId, {imageName: imageName})
+    static async setProjectImage(projectId: string, imageName: string, commit: boolean, message: string, after: (res: AxiosResponse<any>) => void) {
+        instance.post('/api/image/' + projectId, {imageName: imageName, commit: commit, message: message})
             .then(res => {
                 after(res);
             }).catch(err => {
diff --git a/karavan-web/karavan-app/src/main/webui/src/api/ProjectModels.ts b/karavan-web/karavan-app/src/main/webui/src/api/ProjectModels.ts
index 05d76e69..460690b7 100644
--- a/karavan-web/karavan-app/src/main/webui/src/api/ProjectModels.ts
+++ b/karavan-web/karavan-app/src/main/webui/src/api/ProjectModels.ts
@@ -1,5 +1,3 @@
-import {v4 as uuidv4} from "uuid";
-
 export class AppConfig {
     version: string = '';
     infrastructure: 'kubernetes' | 'docker' | 'local' = 'local';
@@ -26,9 +24,8 @@ export class Project {
     lastCommit: string = '';
     lastCommitTimestamp: number = 0;
     type: string = ProjectType.normal;
-    image: string = '';
 
-    public constructor(projectId: string, name: string, description: string, runtime: string, lastCommit: string, type: string, image: string);
+    public constructor(projectId: string, name: string, description: string, runtime: string, lastCommit: string, type: string);
     public constructor(init?: Partial<Project>);
     public constructor(...args: any[]) {
         if (args.length === 1) {
@@ -42,7 +39,6 @@ export class Project {
             this.lastCommit = args[4];
             this.lastCommitTimestamp = args[5];
             this.type = args[6];
-            this.image = args[7];
             return;
         }
     }
diff --git a/karavan-web/karavan-app/src/main/webui/src/api/ProjectService.ts b/karavan-web/karavan-app/src/main/webui/src/api/ProjectService.ts
index 7bef52d9..6004cc97 100644
--- a/karavan-web/karavan-app/src/main/webui/src/api/ProjectService.ts
+++ b/karavan-web/karavan-app/src/main/webui/src/api/ProjectService.ts
@@ -232,5 +232,8 @@ export class ProjectService {
         KaravanApi.getServices((any: []) => {
             InfrastructureAPI.setServices(any);
         });
+        KaravanApi.getImages(projectId, (images: []) => {
+            useProjectStore.setState({images: images})
+        });
     }
 }
\ No newline at end of file
diff --git a/karavan-web/karavan-app/src/main/webui/src/api/ServiceModels.ts b/karavan-web/karavan-app/src/main/webui/src/api/ServiceModels.ts
index 506301d7..879ee0f0 100644
--- a/karavan-web/karavan-app/src/main/webui/src/api/ServiceModels.ts
+++ b/karavan-web/karavan-app/src/main/webui/src/api/ServiceModels.ts
@@ -11,7 +11,7 @@ export class Healthcheck {
     }
 }
 
-export class DevService {
+export class DockerComposeService {
     container_name: string = '';
     image: string = '';
     restart: string = '';
@@ -20,29 +20,29 @@ export class DevService {
     environment: any = {};
     healthcheck?: Healthcheck;
 
-    public constructor(init?: Partial<DevService>) {
+    public constructor(init?: Partial<DockerComposeService>) {
         Object.assign(this, init);
     }
 }
 
-export class Services {
+export class DockerCompose {
     version: string = '';
-    services: DevService[] = [];
+    services: DockerComposeService[] = [];
 
-    public constructor(init?: Partial<Services>) {
+    public constructor(init?: Partial<DockerCompose>) {
         Object.assign(this, init);
     }
 }
 
 export class ServicesYaml {
 
-    static yamlToServices(code: string): Services {
+    static yamlToServices(code: string): DockerCompose {
         const obj = yaml.load(code);
         const fromYaml = JSON.parse(JSON.stringify(obj));
-        const result: Services = new Services({version: fromYaml.version});
+        const result: DockerCompose = new DockerCompose({version: fromYaml.version});
         Object.keys(fromYaml.services).forEach(key => {
             const o = fromYaml.services[key];
-            const service = new DevService(o);
+            const service = new DockerComposeService(o);
             if (!service.container_name) {
                 service.container_name = key;
             }
diff --git a/karavan-web/karavan-app/src/main/webui/src/designer/karavan.css b/karavan-web/karavan-app/src/main/webui/src/designer/karavan.css
index 11324971..bf4d9d49 100644
--- a/karavan-web/karavan-app/src/main/webui/src/designer/karavan.css
+++ b/karavan-web/karavan-app/src/main/webui/src/designer/karavan.css
@@ -38,7 +38,8 @@
     height: 36px;
 }
 
-.karavan .pf-v5-c-switch__input:focus ~ .pf-v5-c-switch__toggle {
+.karavan .pf-v5-c-switch__input:focus ~ .pf-v5-c-switch__toggle,
+.pf-v5-c-modal-box .pf-v5-c-switch__input:focus ~ .pf-v5-c-switch__toggle {
     outline: transparent;
     outline-offset: 0;
 }
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx b/karavan-web/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx
index bcb9bbf1..a659487a 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx
@@ -45,7 +45,7 @@ export function DevModeToolbar (props: Props) {
                 </Tooltip>
             </Label>
         </FlexItem>}
-        <FlexItem>
+        {!isRunning && <FlexItem>
             <Tooltip content="Verbose" position={TooltipPosition.bottom}>
                 <Switch aria-label="verbose"
                         id="verbose"
@@ -53,7 +53,7 @@ export function DevModeToolbar (props: Props) {
                          onChange={(_, checked) => setVerbose(checked)}
                 />
             </Tooltip>
-        </FlexItem>
+        </FlexItem>}
         {!isRunning && <FlexItem>
             <Tooltip content="Run in developer mode" position={TooltipPosition.bottom}>
                 <Button size="sm"
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx b/karavan-web/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx
index c1741c72..0dd876cc 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/project/ProjectToolbar.tsx
@@ -1,7 +1,7 @@
 import React, {useEffect} from 'react';
 import {
     Button,
-    Checkbox,
+    Checkbox, Divider,
     Flex,
     FlexItem,
     ToggleGroup,
@@ -139,12 +139,5 @@ export function ProjectToolbar () {
     }
 
     const isTemplates = isTemplatesProject();
-    return  (
-         <>
-            {/*{isTemplates && getTemplatesToolbar()}*/}
-            {/*{!isTemplates && getProjectToolbar()}*/}
-             {!isFile() && getProjectToolbar()}
-             {isFile() && getFileToolbar()}
-        </>
-    )
+    return  isFile() ? getFileToolbar() : getProjectToolbar()
 }
diff --git a/karavan-web/karavan-app/src/main/webui/src/project/files/FilesTab.tsx b/karavan-web/karavan-app/src/main/webui/src/project/files/FilesTab.tsx
index 2e2d0bd8..47dc999a 100644
--- a/karavan-web/karavan-app/src/main/webui/src/project/files/FilesTab.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/project/files/FilesTab.tsx
@@ -29,12 +29,13 @@ import FileSaver from "file-saver";
 import {CreateFileModal} from "./CreateFileModal";
 import {DeleteFileModal} from "./DeleteFileModal";
 import {UploadFileModal} from "./UploadFileModal";
+import {shallow} from "zustand/shallow";
 
 export function FilesTab () {
 
-    const {files} = useFilesStore();
-    const {project} = useProjectStore();
-    const {operation} = useFileStore();
+    const [files] = useFilesStore((s) => [s.files], shallow);
+    const [project] = useProjectStore((s) => [s.project], shallow);
+    const [operation] = useFileStore((s) => [s.operation], shallow);
 
     function getDate(lastUpdate: number): string {
         if (lastUpdate) {
diff --git a/karavan-web/karavan-app/src/main/webui/src/services/ServicesPage.tsx b/karavan-web/karavan-app/src/main/webui/src/services/ServicesPage.tsx
index 1432f9ea..16fab8b8 100644
--- a/karavan-web/karavan-app/src/main/webui/src/services/ServicesPage.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/services/ServicesPage.tsx
@@ -33,14 +33,14 @@ import {useProjectStore, useStatusesStore} from "../api/ProjectStore";
 import {MainToolbar} from "../designer/MainToolbar";
 import {Project, ProjectType} from "../api/ProjectModels";
 import {KaravanApi} from "../api/KaravanApi";
-import {DevService, Services, ServicesYaml} from "../api/ServiceModels";
+import {DockerComposeService, DockerCompose, ServicesYaml} from "../api/ServiceModels";
 import {shallow} from "zustand/shallow";
 import {ProjectLogPanel} from "../project/log/ProjectLogPanel";
 
 
 export function ServicesPage () {
 
-    const [services, setServices] = useState<Services>();
+    const [services, setServices] = useState<DockerCompose>();
     const [containers] = useStatusesStore((state) => [state.containers, state.setContainers], shallow);
     const [operation] = useState<'create' | 'delete' | 'none'>('none');
     const [loading] = useState<boolean>(false);
@@ -53,7 +53,7 @@ export function ServicesPage () {
         KaravanApi.getFiles(ProjectType.services, files => {
             const file = files.at(0);
             if (file) {
-                const services: Services = ServicesYaml.yamlToServices(file.code);
+                const services: DockerCompose = ServicesYaml.yamlToServices(file.code);
                 setServices(services);
             }
         })
@@ -117,7 +117,7 @@ export function ServicesPage () {
                         <Th key='action'></Th>
                     </Tr>
                 </Thead>
-                {services?.services.map((service: DevService, index: number) => (
+                {services?.services.map((service: DockerComposeService, index: number) => (
                     <ServicesTableRow key={service.container_name} index={index} service={service} container={getContainer(service.container_name)}/>
                 ))}
                 {services?.services.length === 0 && getEmptyState()}
diff --git a/karavan-web/karavan-app/src/main/webui/src/services/ServicesTableRow.tsx b/karavan-web/karavan-app/src/main/webui/src/services/ServicesTableRow.tsx
index 86e1c367..3bfebde4 100644
--- a/karavan-web/karavan-app/src/main/webui/src/services/ServicesTableRow.tsx
+++ b/karavan-web/karavan-app/src/main/webui/src/services/ServicesTableRow.tsx
@@ -8,7 +8,7 @@ import '../designer/karavan.css';
 import {ExpandableRowContent, Tbody, Td, Tr} from "@patternfly/react-table";
 import StopIcon from "@patternfly/react-icons/dist/js/icons/stop-icon";
 import PlayIcon from "@patternfly/react-icons/dist/esm/icons/play-icon";
-import {DevService} from "../api/ServiceModels";
+import {DockerComposeService} from "../api/ServiceModels";
 import {ContainerStatus} from "../api/ProjectModels";
 import PauseIcon from "@patternfly/react-icons/dist/esm/icons/pause-icon";
 import DeleteIcon from "@patternfly/react-icons/dist/js/icons/times-icon";
@@ -20,7 +20,7 @@ import DownIcon from "@patternfly/react-icons/dist/esm/icons/error-circle-o-icon
 
 interface Props {
     index: number
-    service: DevService
+    service: DockerComposeService
     container?: ContainerStatus
 }