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
The following commit(s) were added to refs/heads/main by this push: new 9534b0a1 Fixes 9534b0a1 is described below commit 9534b0a12a51d8663bb920b7fc923f58b466861a Author: Marat Gubaidullin <ma...@talismancloud.io> AuthorDate: Mon Jul 22 09:51:49 2024 -0400 Fixes --- .../org/apache/camel/karavan/KaravanConstants.java | 1 + .../karavan/kubernetes/KubernetesService.java | 4 +- .../apache/camel/karavan/service/CodeService.java | 2 +- .../camel/karavan/service/ProjectService.java | 5 ++- .../src/main/webui/src/api/NotificationService.ts | 4 +- .../src/main/webui/src/api/ProjectService.ts | 3 +- .../webui/src/designer/route/DslConnections.tsx | 44 +++++++++++----------- .../src/knowledgebase/components/ComponentCard.tsx | 25 +++++++----- .../src/main/webui/src/project/DevModeToolbar.tsx | 18 +-------- .../src/main/webui/src/project/ProjectPage.tsx | 25 +++++++----- .../src/main/webui/src/project/ProjectPanel.tsx | 2 +- .../webui/src/project/dashboard/DashboardTab.tsx | 7 ++-- .../src/main/webui/src/project/trace/TraceTab.tsx | 4 +- .../src/main/webui/src/projects/ProjectsPage.tsx | 6 ++- karavan-app/src/main/webui/src/util/CodeUtils.ts | 2 +- 15 files changed, 79 insertions(+), 73 deletions(-) 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 68e6f031..756a558a 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 @@ -33,6 +33,7 @@ public class KaravanConstants { public static final String CAMEL_PREFIX = "camel"; + public static final String BUILD_SCRIPT_VOLUME_NAME = "build-script"; public static final String BUILD_SCRIPT_CONFIG_MAP = "build.sh"; public static final String BUILD_DOCKER_CONFIG_SECRET = "dockerconfigjson"; public static final String PRIVATE_KEY_SECRET_KEY = "private-key"; 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 25702ff5..75327b14 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 @@ -171,7 +171,7 @@ public class KubernetesService { List<VolumeMount> volumeMounts = new ArrayList<>(); - volumeMounts.add(new VolumeMountBuilder().withName(BUILD_SCRIPT_CONFIG_MAP).withMountPath("/karavan/builder").withReadOnly(true).build()); + volumeMounts.add(new VolumeMountBuilder().withName(BUILD_SCRIPT_VOLUME_NAME).withMountPath("/karavan/builder").withReadOnly(true).build()); if (hasDockerConfigSecret) { volumeMounts.add(new VolumeMountBuilder().withName(BUILD_DOCKER_CONFIG_SECRET).withMountPath("/karavan/.docker").withReadOnly(true).build()); } @@ -192,7 +192,7 @@ public class KubernetesService { .build(); List<Volume> volumes = new ArrayList<>(); - volumes.add(new VolumeBuilder().withName(BUILD_SCRIPT_CONFIG_MAP) + volumes.add(new VolumeBuilder().withName(BUILD_SCRIPT_VOLUME_NAME) .withConfigMap(new ConfigMapVolumeSourceBuilder().withName(BUILD_SCRIPT_CONFIG_MAP).withItems( new KeyToPathBuilder().withKey(BUILD_SCRIPT_FILENAME).withPath(BUILD_SCRIPT_FILENAME).build() ).withDefaultMode(511).build()).build()); diff --git a/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java b/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java index 9bd89a45..f4fd13f7 100644 --- a/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java +++ b/karavan-app/src/main/java/org/apache/camel/karavan/service/CodeService.java @@ -239,7 +239,7 @@ public class CodeService { public String getResourceFile(String path) { try (InputStream inputStream = CodeService.class.getResourceAsStream(path); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { - return reader.lines().collect(Collectors.joining(System.lineSeparator())); + return reader.lines().collect(Collectors.joining(System.lineSeparator())); } catch (Exception e) { return null; } 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 18a6b2f2..bd2b3916 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 @@ -292,7 +292,10 @@ public class ProjectService { private int getMaxPortMappedInProjects() { try { List<ProjectFile> files = karavanCache.getProjectFilesByName(PROJECT_COMPOSE_FILENAME).stream() - .filter(f -> !Objects.equals(f.getProjectId(), Project.Type.templates.name())).toList(); + .filter(f -> !Objects.equals(f.getProjectId(), Project.Type.templates.name())) + .filter(f -> !Objects.equals(f.getProjectId(), Project.Type.kamelets.name())) + .filter(f -> !Objects.equals(f.getProjectId(), Project.Type.configuration.name())) + .toList(); if (!files.isEmpty()) { return files.stream().map(this::getProjectPort) .filter(Objects::nonNull) diff --git a/karavan-app/src/main/webui/src/api/NotificationService.ts b/karavan-app/src/main/webui/src/api/NotificationService.ts index 75fe5553..ccb31750 100644 --- a/karavan-app/src/main/webui/src/api/NotificationService.ts +++ b/karavan-app/src/main/webui/src/api/NotificationService.ts @@ -55,7 +55,9 @@ const sub = NotificationEventBus.onEvent()?.subscribe((event: KaravanEvent) => { } } else if (event.event === 'imagesLoaded') { const projectId = event.data?.projectId; - EventBus.sendAlert('Success', 'Image loaded for ' + projectId); + unstable_batchedUpdates(() => { + ProjectService.refreshImages(projectId); + }); } else if (event.event === 'error') { const error = event.data?.error; EventBus.sendAlert('Error', error, "danger"); diff --git a/karavan-app/src/main/webui/src/api/ProjectService.ts b/karavan-app/src/main/webui/src/api/ProjectService.ts index f936e578..97a33b3d 100644 --- a/karavan-app/src/main/webui/src/api/ProjectService.ts +++ b/karavan-app/src/main/webui/src/api/ProjectService.ts @@ -42,7 +42,6 @@ export class ProjectService { ProjectEventBus.sendLog('set', ''); useLogStore.setState({showLog: true, type: 'container', podName: res.data}) } else { - console.log(res); // EventBus.sendAlert('Error Starting DevMode container', res.statusText, 'warning') } }); @@ -187,7 +186,7 @@ export class ProjectService { public static refreshContainerStatus(projectId: string, env: string) { KaravanApi.getContainerStatus(projectId, env, (res) => { if (res.status === 200) { - const oldContainers = useStatusesStore.getState().containers; + const oldContainers = [...useStatusesStore.getState().containers]; const newContainers = res.data; const newMap = new Map<string, ContainerStatus>( newContainers.map(container => [container.containerName, container]) diff --git a/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx b/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx index 2d08cb58..596a7d0c 100644 --- a/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx +++ b/karavan-app/src/main/webui/src/designer/route/DslConnections.tsx @@ -239,13 +239,13 @@ export function DslConnections() { const isInternal = data[2] === 'internal'; const isNav = data[2] === 'nav'; return (!isInternal - ? <g key={pos.step.uuid + "-outgoing"}> - <circle cx={outgoingX} cy={outgoingY} r={r} className="circle-outgoing"/> - <path - d={`M ${lineX1},${lineY1} C ${lineXi - 20}, ${lineY1} ${lineX1 - RADIUS},${lineYi} ${lineXi},${lineYi} L ${lineX2},${lineY2}`} - className={isNav ? 'path-incoming-nav' : 'path-incoming'} markerEnd="url(#arrowhead)"/> - </g> - : <></> + ? <g key={pos.step.uuid + "-outgoing"}> + <circle cx={outgoingX} cy={outgoingY} r={r} className="circle-outgoing"/> + <path + d={`M ${lineX1},${lineY1} C ${lineXi - 20}, ${lineY1} ${lineX1 - RADIUS},${lineYi} ${lineXi},${lineYi} L ${lineX2},${lineY2}`} + className={isNav ? 'path-incoming-nav' : 'path-incoming'} markerEnd="url(#arrowhead)"/> + </g> + : <></> ) } } @@ -265,21 +265,21 @@ export function DslConnections() { const imageX = outgoingX - r + 6; const imageY = outgoingY - r + 6; return (!isInternal - ? <div key={pos.step.uuid + "-icon"} - style={{display: "block", position: "absolute", top: imageY, left: imageX}}> - {CamelUi.getConnectionIcon(pos.step)} - {name !== undefined && - <Tooltip content={`Go to ${uri}:${name}`} position={"left"}> - <Button style={{position: 'absolute', right: 27, top: -12, whiteSpace: 'nowrap', zIndex: 300, padding: 0}} - variant={'link'} - aria-label="Goto" - onClick={_ => InfrastructureAPI.onInternalConsumerClick(uri, name, undefined)}> - {name} - </Button> - </Tooltip> - } - </div> - : <></> + ? <div key={pos.step.uuid + "-icon"} + style={{display: "block", position: "absolute", top: imageY, left: imageX}}> + {CamelUi.getConnectionIcon(pos.step)} + {name !== undefined && + <Tooltip content={`Go to ${uri}:${name}`} position={"left"}> + <Button style={{position: 'absolute', right: 27, top: -12, whiteSpace: 'nowrap', zIndex: 300, padding: 0}} + variant={'link'} + aria-label="Goto" + onClick={_ => InfrastructureAPI.onInternalConsumerClick(uri, name, undefined)}> + {name} + </Button> + </Tooltip> + } + </div> + : <></> ) } } diff --git a/karavan-app/src/main/webui/src/knowledgebase/components/ComponentCard.tsx b/karavan-app/src/main/webui/src/knowledgebase/components/ComponentCard.tsx index 8794ef1e..c9f39d04 100644 --- a/karavan-app/src/main/webui/src/knowledgebase/components/ComponentCard.tsx +++ b/karavan-app/src/main/webui/src/knowledgebase/components/ComponentCard.tsx @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React, { useEffect, useState } from 'react'; +import React, {useEffect, useState} from 'react'; import { CardHeader, Card, CardTitle, CardBody, CardFooter, Badge, Checkbox, Flex } from '@patternfly/react-core'; @@ -23,7 +23,7 @@ import {CamelUi} from "../../designer/utils/CamelUi"; import {Component} from "karavan-core/lib/model/ComponentModels"; import {useKnowledgebaseStore} from "../KnowledgebaseStore"; import {shallow} from "zustand/shallow"; -import { ComponentApi } from 'karavan-core/lib/api/ComponentApi'; +import {ComponentApi} from 'karavan-core/lib/api/ComponentApi'; interface Props { component: Component, @@ -39,32 +39,39 @@ export function ComponentCard(props: Props) { useEffect(() => { setBlockedComponents(ComponentApi.getBlockedComponentNames()); }, []); - + function click(event: React.MouseEvent) { - const { target } = event; + const {target} = event; if (!(target as HTMLElement).parentElement?.className.includes("block-checkbox")) { setComponent(component) setModalOpen(true); } } + function selectComponent(event: React.FormEvent, checked: boolean) { props.onChange(component.component.name, checked); - setBlockedComponents([...ComponentApi.getBlockedComponentNames()]); + setBlockedComponents([...ComponentApi.getBlockedComponentNames()]); } + const isBlockedComponent = blockedComponents ? blockedComponents.findIndex(r => r === component.component.name) > -1 : false; - const isRemote = component.component.remote; + const isRemote = component.component.remote; return ( <Card isCompact key={component.component.name} className="kamelet-card" onClick={event => click(event)} > <CardHeader className="header-labels"> - <Flex style={{width:'100%'}} gap={{default:'gapSm'}} justifyContent={{default: 'justifyContentSpaceBetween'}}> + <Flex style={{width: '100%'}} gap={{default: 'gapSm'}} justifyContent={{default: 'justifyContentSpaceBetween'}}> <Badge isRead className="support-level labels">{component.component.supportLevel}</Badge> <Badge isRead className="version labels">{component.component.version}</Badge> </Flex> - {showBlockCheckbox && <Checkbox id={component.component.name} className="block-checkbox labels" - isChecked={!isBlockedComponent} onChange={(_, checked) => selectComponent(_, checked)}/>} + {showBlockCheckbox && + <Checkbox id={component.component.name} + className="block-checkbox labels" + isChecked={!isBlockedComponent} + onChange={(_, checked) => selectComponent(_, checked)} + /> + } </CardHeader> <CardHeader> {CamelUi.getIconForComponent(component.component.title, component.component.label)} diff --git a/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx b/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx index 84f3eff4..f98fda4a 100644 --- a/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx +++ b/karavan-app/src/main/webui/src/project/DevModeToolbar.tsx @@ -67,27 +67,11 @@ export function DevModeToolbar(props: Props) { const icon = (isRunning || allRunning) ? <UpIcon/> : <DownIcon/>; const inDevMode = containerDevMode?.type === 'devmode'; - useEffect(() => { - const interval = setInterval(() => { - refreshContainer(); - }, 1300) - return () => clearInterval(interval); - }, [currentContainerStatus, containers]); - useEffect(() => { if (showSpinner && currentContainerStatus === undefined && containerDevMode === undefined) { setShowSpinner(false); } - }, [currentContainerStatus]); - - function refreshContainer(){ - ProjectService.refreshContainerStatus(project.projectId, config.environment); - ProjectService.refreshCamelStatus(project.projectId, config.environment); - if (refreshTrace) { - ProjectService.refreshCamelTraces(project.projectId, config.environment); - } - setCurrentContainerStatus(containerDevMode); - } + }, [currentContainerStatus, refreshTrace]); return (<Flex className="toolbar" direction={{default: "row"}} alignItems={{default: "alignItemsCenter"}}> {showSpinner && inDevMode && <FlexItem className="dev-action-button-place refresher"> diff --git a/karavan-app/src/main/webui/src/project/ProjectPage.tsx b/karavan-app/src/main/webui/src/project/ProjectPage.tsx index 46795370..ac757f40 100644 --- a/karavan-app/src/main/webui/src/project/ProjectPage.tsx +++ b/karavan-app/src/main/webui/src/project/ProjectPage.tsx @@ -42,8 +42,8 @@ export function ProjectPage() { const {file, operation} = useFileStore(); const [files] = useFilesStore((s) => [s.files], shallow); const [projects] = useProjectsStore((state) => [state.projects], shallow) - const [project, setProject, tabIndex, setTabIndex] = - useProjectStore((s) => [s.project, s.setProject, s.tabIndex, s.setTabIndex], shallow); + const [project, setProject, tabIndex, setTabIndex, refreshTrace] = + useProjectStore((s) => [s.project, s.setProject, s.tabIndex, s.setTabIndex, s.refreshTrace], shallow); let {projectId} = useParams(); @@ -60,14 +60,21 @@ export function ProjectPage() { }, []); useEffect(() => { - const interval = setInterval(() => { - if (tabIndex === 'build' || tabIndex === 'container') { - ProjectService.refreshAllDeploymentStatuses(); - ProjectService.refreshImages(project.projectId); - } - }, 2000) + const interval = setInterval(() => refreshData(), 1300) return () => clearInterval(interval); - }, [tabIndex]); + }, [tabIndex, refreshTrace, project]); + + function refreshData(){ + ProjectService.refreshAllContainerStatuses(); + if (tabIndex === 'build' || tabIndex === 'container') { + ProjectService.refreshAllDeploymentStatuses(); + ProjectService.refreshImages(project.projectId); + } else if (tabIndex === 'dashboard') { + ProjectService.refreshCamelStatus(project.projectId, config.environment); + } else if (tabIndex === 'trace' && refreshTrace) { + ProjectService.refreshCamelTraces(project.projectId, config.environment); + } + } function isBuildIn(): boolean { return BUILD_IN_PROJECTS.includes(project.projectId); diff --git a/karavan-app/src/main/webui/src/project/ProjectPanel.tsx b/karavan-app/src/main/webui/src/project/ProjectPanel.tsx index d87c6d9c..5f9d1d73 100644 --- a/karavan-app/src/main/webui/src/project/ProjectPanel.tsx +++ b/karavan-app/src/main/webui/src/project/ProjectPanel.tsx @@ -99,7 +99,7 @@ export function ProjectPanel() { <Flex direction={{default: "column"}} spaceItems={{default: "spaceItemsNone"}}> {tab === 'files' && <FlexItem><FilesTab/></FlexItem>} {!buildIn && tab === 'dashboard' && project && <FlexItem><DashboardTab/></FlexItem>} - {!buildIn && tab === 'trace' && project && <FlexItem><TraceTab/></FlexItem>} + {!buildIn && tab === 'trace' && project && <TraceTab/>} {!buildIn && tab === 'build' && <FlexItem><ProjectBuildTab/></FlexItem>} {!buildIn && tab === 'build' && config.infrastructure !== 'kubernetes' && <FlexItem><ImagesPanel/></FlexItem>} diff --git a/karavan-app/src/main/webui/src/project/dashboard/DashboardTab.tsx b/karavan-app/src/main/webui/src/project/dashboard/DashboardTab.tsx index e05795d8..3bdffead 100644 --- a/karavan-app/src/main/webui/src/project/dashboard/DashboardTab.tsx +++ b/karavan-app/src/main/webui/src/project/dashboard/DashboardTab.tsx @@ -14,7 +14,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import React from 'react'; +import React, {useEffect} from 'react'; import { Card, CardBody, @@ -26,7 +26,7 @@ import { EmptyStateVariant, EmptyStateHeader, EmptyStateIcon, - Bullseye, Panel + Bullseye } from '@patternfly/react-core'; import '../../designer/karavan.css'; import {InfoContainer} from "./InfoContainer"; @@ -38,8 +38,7 @@ import SearchIcon from "@patternfly/react-icons/dist/esm/icons/search-icon"; export function DashboardTab() { - const [project, camelStatuses] = useProjectStore((state) => - [state.project, state.camelStatuses], shallow); + const [project] = useProjectStore((state) => [state.project], shallow); const [containers] = useStatusesStore((state) => [state.containers], shallow); const camelContainers = containers diff --git a/karavan-app/src/main/webui/src/project/trace/TraceTab.tsx b/karavan-app/src/main/webui/src/project/trace/TraceTab.tsx index 2736df4d..6bdf8489 100644 --- a/karavan-app/src/main/webui/src/project/trace/TraceTab.tsx +++ b/karavan-app/src/main/webui/src/project/trace/TraceTab.tsx @@ -34,8 +34,8 @@ import {TraceTable} from "./TraceTable"; export function TraceTab() { - const [project, refreshTrace, setRefreshTrace, camelStatuses] = useProjectStore((state) => - [state.project, state.refreshTrace, state.setRefreshTrace, state.camelStatuses], shallow); + const [project, refreshTrace, setRefreshTrace] = useProjectStore((state) => + [state.project, state.refreshTrace, state.setRefreshTrace], shallow); const [containers] = useStatusesStore((state) => [state.containers], shallow); const [containerName, setContainerName] = useState<string>(); diff --git a/karavan-app/src/main/webui/src/projects/ProjectsPage.tsx b/karavan-app/src/main/webui/src/projects/ProjectsPage.tsx index 33b2a74b..c7abfbe0 100644 --- a/karavan-app/src/main/webui/src/projects/ProjectsPage.tsx +++ b/karavan-app/src/main/webui/src/projects/ProjectsPage.tsx @@ -46,6 +46,7 @@ import {Project, ProjectType} from "../api/ProjectModels"; import {shallow} from "zustand/shallow"; import {KaravanApi} from "../api/KaravanApi"; import {ProjectsToolbar} from "./ProjectsToolbar"; +import {ProjectService} from "../api/ProjectService"; interface Props { tools?: React.ReactNode @@ -62,9 +63,12 @@ export function ProjectsPage (props: Props) { setProjects(projects); setFilter(''); }); + const interval = setInterval(() => { + ProjectService.refreshAllContainerStatuses(); + }, 2000) + return () => clearInterval(interval); }, []); - function title() { return <TextContent> <Text component="h2">Projects</Text> diff --git a/karavan-app/src/main/webui/src/util/CodeUtils.ts b/karavan-app/src/main/webui/src/util/CodeUtils.ts index 33f5a68e..a54d766c 100644 --- a/karavan-app/src/main/webui/src/util/CodeUtils.ts +++ b/karavan-app/src/main/webui/src/util/CodeUtils.ts @@ -51,9 +51,9 @@ export class CodeUtils { return CamelDefinitionYaml.integrationToYaml(Integration.createNew(fileName, 'plain')); } else if (type === 'KAMELET') { const filenameParts = fileName.replace('.kamelet.yaml', '').split('-'); + const name = filenameParts.join('-'); const type: string | undefined = filenameParts.slice(-1)[0] const kameletType: KameletTypes | undefined = (type === "sink" || type === "source" || type === "action") ? type : undefined; - const name = filenameParts.slice(0, -1).join('-'); const integration = Integration.createNew(name, 'kamelet'); const meta: MetadataLabels = new MetadataLabels({"camel.apache.org/kamelet.type": kameletType}); integration.metadata.labels = meta;