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 }