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 624691aa8100782b1204b43e321202febe0ba7ef Author: Marat Gubaidullin <[email protected]> AuthorDate: Fri Sep 8 19:06:46 2023 -0400 DevMode vs Run prod for #817 --- .../apache/camel/karavan/api/ImagesResource.java | 1 - .../camel/karavan/docker/DockerForKaravan.java | 8 +-- .../camel/karavan/service/ProjectService.java | 5 +- .../src/main/webui/src/api/KaravanApi.tsx | 5 +- .../src/main/webui/src/api/ProjectModels.ts | 2 +- .../src/main/webui/src/api/ProjectService.ts | 4 +- .../src/main/webui/src/project/BuildToolbar.tsx | 67 +++------------------- .../{BuildToolbar.tsx => ContainerPanel.tsx} | 2 +- .../src/main/webui/src/project/DevModeToolbar.tsx | 33 +++++------ .../main/webui/src/project/build/ImagesPanel.tsx | 4 +- 10 files changed, 38 insertions(+), 93 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 b4605110..0c172856 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 @@ -75,7 +75,6 @@ public class ImagesResource { @Path("/{imageName}") public Response deleteImage(@HeaderParam("username") String username, @PathParam("imageName") String imageName) { imageName= new String(Base64.decode(imageName)); - System.out.println(imageName); if (ConfigService.inKubernetes()) { return Response.ok().build(); } else { diff --git a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java index 41861af7..b551d547 100644 --- a/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java +++ b/karavan-web/karavan-app/src/main/java/org/apache/camel/karavan/docker/DockerForKaravan.java @@ -45,13 +45,13 @@ public class DockerForKaravan { @Inject RegistryService registryService; - public void runProjectInDevMode(String projectId, String jBangOptions, Map<Integer, Integer> ports, Map<String, String> files) throws Exception { - Container c = createDevmodeContainer(projectId, jBangOptions, ports); + public void runProjectInDevMode(String projectId, String jBangOptions, Map<Integer, Integer> ports, Map<String, String> files, Map<String, String> volumes) throws Exception { + Container c = createDevmodeContainer(projectId, jBangOptions, ports, volumes); dockerService.runContainer(projectId); dockerService.copyFiles(c.getId(), "/code", files); } - protected Container createDevmodeContainer(String projectId, String jBangOptions, Map<Integer, Integer> ports) throws InterruptedException { + protected Container createDevmodeContainer(String projectId, String jBangOptions, Map<Integer, Integer> ports, Map<String, String> volumes) throws InterruptedException { LOGGER.infof("DevMode starting for %s with JBANG_OPTIONS=%s", projectId, jBangOptions); HealthCheck healthCheck = new HealthCheck().withTest(List.of("CMD", "curl", "-f", "http://localhost:8080/q/dev/health")) @@ -64,7 +64,7 @@ public class DockerForKaravan { return dockerService.createContainer(projectId, devmodeImage, env, ports, healthCheck, Map.of(LABEL_TYPE, ContainerStatus.ContainerType.devmode.name(), LABEL_PROJECT_ID, projectId), - Map.of(), null); + volumes, null); } 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 ebd49e08..b92d8e23 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 @@ -113,7 +113,10 @@ public class ProjectService implements HealthCheck { .collect(Collectors.toMap(ProjectFile::getName, ProjectFile::getCode)); ProjectFile compose = infinispanService.getProjectFile(project.getProjectId(), PROJECT_COMPOSE_FILENAME); DockerComposeService dcs = DockerComposeConverter.fromCode(compose.getCode(), project.getProjectId()); - dockerForKaravan.runProjectInDevMode(project.getProjectId(), jBangOptions, dcs.getPortsMap(), files); + Map<String, String> volumes = mavenCache + .map(s -> Map.of(s, "/root/.m2")) + .orElseGet(Map::of); + dockerForKaravan.runProjectInDevMode(project.getProjectId(), jBangOptions, dcs.getPortsMap(), files, volumes); } return containerName; } else { 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 63573e24..05915131 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 @@ -485,7 +485,7 @@ export class KaravanApi { } static async manageContainer(environment: string, - type: 'devmove' | 'devservice' | 'project' | 'internal' | 'build' | 'unknown', + type: 'devmode' | 'devservice' | 'project' | 'internal' | 'build' | 'unknown', name: string, command: 'run' | 'pause' | 'stop' | 'delete', after: (res: AxiosResponse<any>) => void) { @@ -497,7 +497,7 @@ export class KaravanApi { }); } - static async deleteContainer(environment: string, type: 'devmove' | 'devservice' | 'project' | 'internal' | 'build' | 'unknown', name: string, after: (res: AxiosResponse<any>) => void) { + static async deleteContainer(environment: string, type: 'devmode' | 'devservice' | 'project' | 'internal' | 'build' | 'unknown', name: string, after: (res: AxiosResponse<any>) => void) { instance.delete('/api/container/' + environment + '/' + type + "/" + name) .then(res => { after(res); @@ -531,7 +531,6 @@ export class KaravanApi { static async deleteImage(imageName: string, after: () => void) { instance.delete('/api/image/' + Buffer.from(imageName).toString('base64')) .then(res => { - console.log(res.status) if (res.status === 200) { after(); } 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 8dd5e485..6ca10133 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 @@ -73,7 +73,7 @@ export class ContainerStatus { deployment: string = ''; projectId: string = ''; env: string = ''; - type: 'devmove' | 'devservice' | 'project' | 'internal' | 'build' | 'unknown' = 'unknown'; + type: 'devmode' | 'devservice' | 'project' | 'internal' | 'build' | 'unknown' = 'unknown'; memoryInfo: string = ''; cpuInfo: string = ''; created: string = ''; 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 6004cc97..34430a6b 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 @@ -43,7 +43,7 @@ export class ProjectService { public static stopDevModeContainer(project: Project) { useDevModeStore.setState({status: 'wip'}) - KaravanApi.manageContainer('dev', 'devmove', project.projectId, 'stop', res => { + KaravanApi.manageContainer('dev', 'devmode', project.projectId, 'stop', res => { useDevModeStore.setState({status: 'none'}) if (res.status === 200) { useLogStore.setState({showLog: false, type: 'container'}) @@ -55,7 +55,7 @@ export class ProjectService { public static pauseDevModeContainer(project: Project) { useDevModeStore.setState({status: 'wip'}) - KaravanApi.manageContainer('dev', 'devmove', project.projectId, 'pause', res => { + KaravanApi.manageContainer('dev', 'devmode', project.projectId, 'pause', res => { useDevModeStore.setState({status: 'none'}) if (res.status === 200) { useLogStore.setState({showLog: false, type: 'container'}) diff --git a/karavan-web/karavan-app/src/main/webui/src/project/BuildToolbar.tsx b/karavan-web/karavan-app/src/main/webui/src/project/BuildToolbar.tsx index e18284c5..dd061f75 100644 --- a/karavan-web/karavan-app/src/main/webui/src/project/BuildToolbar.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/project/BuildToolbar.tsx @@ -1,18 +1,11 @@ import React from 'react'; -import {Button, Flex, FlexItem, Label, Spinner, Tooltip, TooltipPosition} from '@patternfly/react-core'; +import {Badge, Button, Flex, FlexItem, Label, Spinner, Tooltip, TooltipPosition} from '@patternfly/react-core'; import '../designer/karavan.css'; -import DeleteIcon from "@patternfly/react-icons/dist/esm/icons/trash-icon"; import {useAppConfigStore, useDevModeStore, useLogStore, useProjectStore, useStatusesStore} from "../api/ProjectStore"; import {shallow} from "zustand/shallow"; -import UpIcon from "@patternfly/react-icons/dist/esm/icons/check-circle-icon"; +import UpIcon from "@patternfly/react-icons/dist/esm/icons/running-icon"; import DownIcon from "@patternfly/react-icons/dist/esm/icons/error-circle-o-icon"; -import RunIcon from "@patternfly/react-icons/dist/esm/icons/play-icon"; -import {ProjectService} from "../api/ProjectService"; -import ReloadIcon from "@patternfly/react-icons/dist/esm/icons/bolt-icon"; -import {KaravanApi} from "../api/KaravanApi"; -import {ProjectEventBus} from "../api/ProjectEventBus"; -import {EventBus} from "../designer/utils/EventBus"; -import StopIcon from "@patternfly/react-icons/dist/js/icons/stop-icon"; +import DeleteIcon from "@patternfly/react-icons/dist/esm/icons/trash-icon"; interface Props { reloadOnly?: boolean @@ -27,7 +20,6 @@ export function BuildToolbar (props: Props) { const [setShowLog] = useLogStore((s) => [s.setShowLog], shallow); const containerStatus = containers.filter(c => c.containerName === project.projectId).at(0); - const commands = containerStatus?.commands || ['run']; const isRunning = containerStatus?.state === 'running'; const inTransit = containerStatus?.inTransit; const isLoading = status === 'wip'; @@ -36,63 +28,20 @@ export function BuildToolbar (props: Props) { return (<Flex className="toolbar" direction={{default: "row"}} alignItems={{default: "alignItemsCenter"}}> <FlexItem> - {(inTransit || isLoading) && <Spinner size="lg" aria-label="spinner"/>} + <Button style={{visibility:"hidden"}} size="sm" variant={"control"} icon={<DeleteIcon/>} onClick={() => {}}> + </Button> </FlexItem> {containerStatus?.containerId && <FlexItem> <Label icon={icon} color={color}> <Tooltip content={"Show log"} position={TooltipPosition.bottom}> <Button className='labeled-button' variant="link" isDisabled={!isRunning} onClick={e => - setShowLog(true, 'container', containerStatus.containerName)}> + setShowLog( true, 'container', containerStatus.containerName)}> {containerStatus.containerName} </Button> </Tooltip> + <Badge isRead>{containerStatus.type}</Badge> </Label> </FlexItem>} - {!isRunning && <FlexItem> - <Tooltip content="Run container" position={TooltipPosition.bottom}> - <Button size="sm" - isDisabled={(!(commands.length === 0) && !commands.includes('run')) || inTransit} - variant={"primary"} - icon={<RunIcon/>} - onClick={() => { - KaravanApi.manageContainer('dev', 'project', project.projectId, 'run', res => { - setShowLog(false, 'container', undefined) - }); - }}> - {"Run"} - </Button> - </Tooltip> - </FlexItem>} - {config.infrastructure !== 'kubernetes' && - <FlexItem> - <Tooltip content="Stop container" position={TooltipPosition.bottom}> - <Button size="sm" - isDisabled={!commands.includes('stop') || inTransit} - variant={"control"} - icon={<StopIcon/>} - onClick={() => { - KaravanApi.manageContainer('dev', 'project', project.projectId, 'stop', res => { - setShowLog(false, 'container', undefined) - }); - }}> - </Button> - </Tooltip> - </FlexItem> - } - <FlexItem> - <Tooltip content="Delete container" position={TooltipPosition.bottom}> - <Button size="sm" - isDisabled={!commands.includes('delete') || inTransit} - variant={"control"} - icon={<DeleteIcon/>} - onClick={() => { - KaravanApi.manageContainer('dev', 'project', project.projectId, 'delete', res => { - setShowLog(false, 'container', undefined) - }); - }}> - </Button> - </Tooltip> - </FlexItem> - </Flex>); + </Flex>) } \ No newline at end of file diff --git a/karavan-web/karavan-app/src/main/webui/src/project/BuildToolbar.tsx b/karavan-web/karavan-app/src/main/webui/src/project/ContainerPanel.tsx similarity index 98% copy from karavan-web/karavan-app/src/main/webui/src/project/BuildToolbar.tsx copy to karavan-web/karavan-app/src/main/webui/src/project/ContainerPanel.tsx index e18284c5..c32fb4a7 100644 --- a/karavan-web/karavan-app/src/main/webui/src/project/BuildToolbar.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/project/ContainerPanel.tsx @@ -18,7 +18,7 @@ interface Props { reloadOnly?: boolean } -export function BuildToolbar (props: Props) { +export function ContainerPanel (props: Props) { const [config] = useAppConfigStore((state) => [state.config], shallow) const [status] = useDevModeStore((state) => [state.status], shallow) 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 a659487a..2705447b 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 @@ -1,5 +1,5 @@ import React, {useState} from 'react'; -import {Button, Flex, FlexItem, Label, Spinner, Switch, Tooltip, TooltipPosition} from '@patternfly/react-core'; +import {Badge, Button, Flex, FlexItem, Label, Spinner, Switch, Tooltip, TooltipPosition} from '@patternfly/react-core'; import '../designer/karavan.css'; import RocketIcon from "@patternfly/react-icons/dist/esm/icons/rocket-icon"; import ReloadIcon from "@patternfly/react-icons/dist/esm/icons/bolt-icon"; @@ -7,9 +7,8 @@ import DeleteIcon from "@patternfly/react-icons/dist/esm/icons/trash-icon"; import {useAppConfigStore, useDevModeStore, useLogStore, useProjectStore, useStatusesStore} from "../api/ProjectStore"; import {ProjectService} from "../api/ProjectService"; import {shallow} from "zustand/shallow"; -import UpIcon from "@patternfly/react-icons/dist/esm/icons/check-circle-icon"; +import UpIcon from "@patternfly/react-icons/dist/esm/icons/running-icon"; import DownIcon from "@patternfly/react-icons/dist/esm/icons/error-circle-o-icon"; -import StopIcon from "@patternfly/react-icons/dist/js/icons/stop-icon"; interface Props { reloadOnly?: boolean @@ -22,6 +21,7 @@ export function DevModeToolbar (props: Props) { const [project] = useProjectStore((state) => [state.project], shallow) const [containers] = useStatusesStore((state) => [state.containers], shallow); const [verbose, setVerbose] = useState(false); + const [setShowLog] = useLogStore((s) => [s.setShowLog], shallow); const containerStatus = containers.filter(c => c.containerName === project.projectId).at(0); const commands = containerStatus?.commands || ['run']; @@ -30,7 +30,13 @@ export function DevModeToolbar (props: Props) { const isLoading = status === 'wip'; const color = containerStatus?.state === 'running' ? "green" : "grey"; const icon = isRunning ? <UpIcon/> : <DownIcon/>; + const inDevMode = containerStatus?.type === 'devmode'; + return (<Flex className="toolbar" direction={{default: "row"}} alignItems={{default: "alignItemsCenter"}}> + <FlexItem> + <Button style={{visibility:"hidden"}} size="sm" variant={"control"} icon={<DeleteIcon/>} onClick={() => {}}> + </Button> + </FlexItem> <FlexItem> {(inTransit || isLoading) && <Spinner size="lg" aria-label="spinner"/>} </FlexItem> @@ -39,10 +45,11 @@ export function DevModeToolbar (props: Props) { <Tooltip content={"Show log"} position={TooltipPosition.bottom}> <Button className='labeled-button' variant="link" isDisabled={!isRunning} onClick={e => - useLogStore.setState({showLog: true, type: 'container', podName: containerStatus.containerName})}> + setShowLog( true, 'container', containerStatus.containerName)}> {containerStatus.containerName} </Button> </Tooltip> + <Badge isRead>{containerStatus.type}</Badge> </Label> </FlexItem>} {!isRunning && <FlexItem> @@ -65,7 +72,7 @@ export function DevModeToolbar (props: Props) { </Button> </Tooltip> </FlexItem>} - {isRunning && <FlexItem> + {isRunning && inDevMode && <FlexItem> <Tooltip content="Reload" position={TooltipPosition.bottom}> <Button size="sm" isDisabled={inTransit} @@ -76,19 +83,7 @@ export function DevModeToolbar (props: Props) { </Button> </Tooltip> </FlexItem>} - {/*{config.infrastructure !== 'kubernetes' &&*/} - {/* <FlexItem>*/} - {/* <Tooltip content="Stop container" position={TooltipPosition.bottom}>*/} - {/* <Button size="sm"*/} - {/* isDisabled={!commands.includes('stop') || inTransit}*/} - {/* variant={"control"}*/} - {/* icon={<StopIcon/>}*/} - {/* onClick={() => ProjectService.stopDevModeContainer(project)}>*/} - {/* </Button>*/} - {/* </Tooltip>*/} - {/* </FlexItem>*/} - {/*}*/} - <FlexItem> + {inDevMode && <FlexItem> <Tooltip content="Delete container" position={TooltipPosition.bottom}> <Button size="sm" isDisabled={!commands.includes('delete') || inTransit} @@ -97,6 +92,6 @@ export function DevModeToolbar (props: Props) { onClick={() => ProjectService.deleteDevModeContainer(project)}> </Button> </Tooltip> - </FlexItem> + </FlexItem>} </Flex>); } diff --git a/karavan-web/karavan-app/src/main/webui/src/project/build/ImagesPanel.tsx b/karavan-web/karavan-app/src/main/webui/src/project/build/ImagesPanel.tsx index 9c829267..31fc581d 100644 --- a/karavan-web/karavan-app/src/main/webui/src/project/build/ImagesPanel.tsx +++ b/karavan-web/karavan-app/src/main/webui/src/project/build/ImagesPanel.tsx @@ -149,9 +149,9 @@ export function ImagesPanel () { <Thead> <Tr> <Th key='status' width={10}></Th> - <Th key='image' width={30}>Image</Th> + <Th key='image' width={20}>Image</Th> <Th key='tag' width={10}>Tag</Th> - <Th key='actions'></Th> + <Th key='actions' width={10}></Th> </Tr> </Thead> <Tbody>
