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 0276f037b14916f1f4693335423f63094f99a05e Author: Marat Gubaidullin <marat.gubaidul...@gmail.com> AuthorDate: Fri May 12 17:02:17 2023 -0400 One status interval poll instead of three #757 --- .../main/webui/src/projects/ProjectDevelopment.tsx | 68 ++++++++++++++++++++-- .../main/webui/src/projects/RunnerInfoContext.tsx | 48 +++++---------- .../main/webui/src/projects/RunnerInfoMemory.tsx | 51 ++++------------ .../src/main/webui/src/projects/RunnerInfoPod.tsx | 48 ++++----------- 4 files changed, 99 insertions(+), 116 deletions(-) diff --git a/karavan-app/src/main/webui/src/projects/ProjectDevelopment.tsx b/karavan-app/src/main/webui/src/projects/ProjectDevelopment.tsx index e065b315..a58b52bc 100644 --- a/karavan-app/src/main/webui/src/projects/ProjectDevelopment.tsx +++ b/karavan-app/src/main/webui/src/projects/ProjectDevelopment.tsx @@ -1,14 +1,20 @@ -import React from 'react'; +import React, {useEffect, useRef, useState} from 'react'; import { Card, CardBody, Flex, FlexItem, Divider } from '@patternfly/react-core'; import '../designer/karavan.css'; -import {Project} from "./ProjectModels"; +import {PodStatus, Project} from "./ProjectModels"; import {RunnerToolbar} from "./RunnerToolbar"; import {RunnerInfoPod} from "./RunnerInfoPod"; import {RunnerInfoContext} from "./RunnerInfoContext"; import {RunnerInfoMemory} from "./RunnerInfoMemory"; +import {KaravanApi} from "../api/KaravanApi"; +import {ProjectEventBus} from "./ProjectEventBus"; + +export function isRunning(status: PodStatus): boolean { + return status.phase === 'Running' && !status.terminating; +} interface Props { @@ -18,6 +24,58 @@ interface Props { export const ProjectDevelopment = (props: Props) => { + const [podStatus, setPodStatus] = useState(new PodStatus()); + const previousValue = useRef(new PodStatus()); + const [memory, setMemory] = useState({}); + const [jvm, setJvm] = useState({}); + const [context, setContext] = useState({}); + + + useEffect(() => { + previousValue.current = podStatus; + const interval = setInterval(() => { + onRefreshStatus(); + }, 1000); + return () => clearInterval(interval); + }, [podStatus]); + + function onRefreshStatus() { + const projectId = props.project.projectId; + const name = projectId + "-runner"; + KaravanApi.getRunnerPodStatus(projectId, name, res => { + if (res.status === 200) { + setPodStatus(res.data); + if (isRunning(res.data) && !isRunning(previousValue.current)) { + ProjectEventBus.showLog('container', res.data.name, props.config.environment); + } + } else { + ProjectEventBus.showLog('container', name, props.config.environment, false); + setPodStatus(new PodStatus({name: name})); + } + }); + KaravanApi.getRunnerConsoleStatus(projectId, "memory", res => { + if (res.status === 200) { + setMemory(res.data); + } else { + setMemory({}); + } + }) + KaravanApi.getRunnerConsoleStatus(projectId, "jvm", res => { + if (res.status === 200) { + setJvm(res.data); + } else { + setJvm({}); + } + }) + KaravanApi.getRunnerConsoleStatus(projectId, "context", res => { + if (res.status === 200) { + setContext(res.data); + } else { + setContext({}); + } + }) + } + const {project, config} = props; return ( <Card className="project-development"> @@ -25,15 +83,15 @@ export const ProjectDevelopment = (props: Props) => { <Flex direction={{default: "row"}} justifyContent={{default: "justifyContentSpaceBetween"}}> <FlexItem flex={{default: "flex_1"}}> - <RunnerInfoPod project={project} config={config} /> + <RunnerInfoPod podStatus={podStatus} config={config} /> </FlexItem> <Divider orientation={{default: "vertical"}}/> <FlexItem flex={{default: "flex_1"}}> - <RunnerInfoMemory project={project} config={config} /> + <RunnerInfoMemory jvm={jvm} memory={memory} config={config} /> </FlexItem> <Divider orientation={{default: "vertical"}}/> <FlexItem flex={{default: "flex_1"}}> - <RunnerInfoContext project={project} config={config} /> + <RunnerInfoContext context={context} config={config} /> </FlexItem> <Divider orientation={{default: "vertical"}}/> <FlexItem> diff --git a/karavan-app/src/main/webui/src/projects/RunnerInfoContext.tsx b/karavan-app/src/main/webui/src/projects/RunnerInfoContext.tsx index 9bd7e333..57ce057e 100644 --- a/karavan-app/src/main/webui/src/projects/RunnerInfoContext.tsx +++ b/karavan-app/src/main/webui/src/projects/RunnerInfoContext.tsx @@ -17,38 +17,18 @@ import UpIcon from "@patternfly/react-icons/dist/esm/icons/check-circle-icon"; interface Props { - project: Project, + context: any, config: any, } export const RunnerInfoContext = (props: Props) => { - const [context, setContext] = useState({}); - - useEffect(() => { - const interval = setInterval(() => { - onRefreshStatus(); - }, 1000); - return () => clearInterval(interval); - }, []); - - function onRefreshStatus() { - const projectId = props.project.projectId; - KaravanApi.getRunnerConsoleStatus(projectId, "context", res => { - if (res.status === 200) { - setContext(res.data); - } else { - setContext({}); - } - }) - } - function getContextInfo() { return ( <LabelGroup numLabels={3}> <Tooltip content="Name" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(context as any)?.context?.name} + {props.context?.context?.name} </Label> </Tooltip> </LabelGroup> @@ -60,7 +40,7 @@ export const RunnerInfoContext = (props: Props) => { <LabelGroup numLabels={3}> <Tooltip content="Version" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(context as any)?.context?.version} + {props.context?.context?.version} </Label> </Tooltip> </LabelGroup> @@ -72,17 +52,17 @@ export const RunnerInfoContext = (props: Props) => { <LabelGroup numLabels={3}> <Tooltip content="State" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(context as any)?.context?.state} + {props.context?.context?.state} </Label> </Tooltip> <Tooltip content="Uptime" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(context as any)?.context?.uptime} + {props.context?.context?.uptime} </Label> </Tooltip> <Tooltip content="Phase" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(context as any)?.context?.phase} + {props.context?.context?.phase} </Label> </Tooltip> </LabelGroup> @@ -94,17 +74,17 @@ export const RunnerInfoContext = (props: Props) => { <LabelGroup numLabels={3}> <Tooltip content="Total" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(context as any)?.context?.statistics?.exchangesTotal} + {props.context?.context?.statistics?.exchangesTotal} </Label> </Tooltip> <Tooltip content="Failed" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(context as any)?.context?.statistics?.exchangesFailed} + {props.context?.context?.statistics?.exchangesFailed} </Label> </Tooltip> <Tooltip content="Inflight" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(context as any)?.context?.statistics?.exchangesInflight} + {props.context?.context?.statistics?.exchangesInflight} </Label> </Tooltip> </LabelGroup> @@ -116,22 +96,22 @@ export const RunnerInfoContext = (props: Props) => { <LabelGroup numLabels={4}> <Tooltip content="Min" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(context as any)?.context?.statistics?.minProcessingTime} + {props.context?.context?.statistics?.minProcessingTime} </Label> </Tooltip> <Tooltip content="Mean" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(context as any)?.context?.statistics?.meanProcessingTime} + {props.context?.context?.statistics?.meanProcessingTime} </Label> </Tooltip> <Tooltip content="Max" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(context as any)?.context?.statistics?.maxProcessingTime} + {props.context?.context?.statistics?.maxProcessingTime} </Label> </Tooltip> <Tooltip content="Last" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(context as any)?.context?.statistics?.lastProcessingTime} + {props.context?.context?.statistics?.lastProcessingTime} </Label> </Tooltip> </LabelGroup> @@ -147,7 +127,7 @@ export const RunnerInfoContext = (props: Props) => { } function getRunning(): boolean { - return isRunning(context); + return isRunning(props.context); } diff --git a/karavan-app/src/main/webui/src/projects/RunnerInfoMemory.tsx b/karavan-app/src/main/webui/src/projects/RunnerInfoMemory.tsx index 9558dc35..1e44a4c9 100644 --- a/karavan-app/src/main/webui/src/projects/RunnerInfoMemory.tsx +++ b/karavan-app/src/main/webui/src/projects/RunnerInfoMemory.tsx @@ -17,45 +17,18 @@ import UpIcon from "@patternfly/react-icons/dist/esm/icons/check-circle-icon"; interface Props { - project: Project, + jvm: any, + memory: any, config: any, } export const RunnerInfoMemory = (props: Props) => { - const [memory, setMemory] = useState({}); - const [jvm, setJvm] = useState({}); - - useEffect(() => { - const interval = setInterval(() => { - onRefreshStatus(); - }, 1000); - return () => clearInterval(interval); - }, []); - - function onRefreshStatus() { - const projectId = props.project.projectId; - KaravanApi.getRunnerConsoleStatus(projectId, "memory", res => { - if (res.status === 200) { - setMemory(res.data); - } else { - setMemory({}); - } - }) - KaravanApi.getRunnerConsoleStatus(projectId, "jvm", res => { - if (res.status === 200) { - setJvm(res.data); - } else { - setJvm({}); - } - }) - } - function getJvmInfo() { return ( <LabelGroup numLabels={2}> <Label icon={getIcon()} color={getColor()}> - {(jvm as any)?.jvm?.vmVendor} {(jvm as any)?.jvm?.vmVersion} + {props.jvm?.jvm?.vmVendor} {props.jvm?.jvm?.vmVersion} </Label> </LabelGroup> ) @@ -66,17 +39,17 @@ export const RunnerInfoMemory = (props: Props) => { <LabelGroup numLabels={3}> <Tooltip content="Init" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(memory as any)?.memory?.heapMemoryInit} + {props.memory?.memory?.heapMemoryInit} </Label> </Tooltip> <Tooltip content="Max" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(memory as any)?.memory?.heapMemoryMax} + {props.memory?.memory?.heapMemoryMax} </Label> </Tooltip> <Tooltip content="Used" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(memory as any)?.memory?.heapMemoryUsed} + {props.memory?.memory?.heapMemoryUsed} </Label> </Tooltip> </LabelGroup> @@ -88,7 +61,7 @@ export const RunnerInfoMemory = (props: Props) => { <LabelGroup numLabels={2}> <Tooltip content="Uptime" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(jvm as any)?.jvm?.vmUptime} + {props.jvm?.jvm?.vmUptime} </Label> </Tooltip> </LabelGroup> @@ -100,7 +73,7 @@ export const RunnerInfoMemory = (props: Props) => { <LabelGroup numLabels={2}> <Tooltip content="PID" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(jvm as any)?.jvm?.pid} + {props.jvm?.jvm?.pid} </Label> </Tooltip> </LabelGroup> @@ -112,17 +85,17 @@ export const RunnerInfoMemory = (props: Props) => { <LabelGroup numLabels={3}> <Tooltip content="Init" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(memory as any)?.memory?.nonHeapMemoryInit} + {props.memory?.memory?.nonHeapMemoryInit} </Label> </Tooltip> <Tooltip content="Max" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(memory as any)?.memory?.nonHeapMemoryMax} + {props.memory?.memory?.nonHeapMemoryMax} </Label> </Tooltip> <Tooltip content="Used" position={"bottom"}> <Label icon={getIcon()} color={getColor()}> - {(memory as any)?.memory?.nonHeapMemoryUsed} + {props.memory?.memory?.nonHeapMemoryUsed} </Label> </Tooltip> </LabelGroup> @@ -138,7 +111,7 @@ export const RunnerInfoMemory = (props: Props) => { } function getRunning(): boolean { - return isRunning(jvm); + return isRunning(props.jvm); } diff --git a/karavan-app/src/main/webui/src/projects/RunnerInfoPod.tsx b/karavan-app/src/main/webui/src/projects/RunnerInfoPod.tsx index fb40b1da..5590be7c 100644 --- a/karavan-app/src/main/webui/src/projects/RunnerInfoPod.tsx +++ b/karavan-app/src/main/webui/src/projects/RunnerInfoPod.tsx @@ -1,4 +1,4 @@ -import React, {useEffect, useRef, useState} from 'react'; +import React from 'react'; import { Button, DescriptionList, @@ -9,49 +9,22 @@ import { Tooltip } from '@patternfly/react-core'; import '../designer/karavan.css'; -import {PodStatus, Project} from "./ProjectModels"; -import {KaravanApi} from "../api/KaravanApi"; +import {PodStatus} from "./ProjectModels"; import {ProjectEventBus} from "./ProjectEventBus"; import DownIcon from "@patternfly/react-icons/dist/esm/icons/error-circle-o-icon"; import UpIcon from "@patternfly/react-icons/dist/esm/icons/check-circle-icon"; - +import {isRunning} from "./ProjectDevelopment"; interface Props { - project: Project, + podStatus: PodStatus, config: any, } export const RunnerInfoPod = (props: Props) => { - const [podStatus, setPodStatus] = useState(new PodStatus()); - const previousValue = useRef(new PodStatus()); - - useEffect(() => { - previousValue.current = podStatus; - const interval = setInterval(() => { - onRefreshStatus(); - }, 1000); - return () => clearInterval(interval); - }, [podStatus]); - - function onRefreshStatus() { - const projectId = props.project.projectId; - const name = projectId + "-runner"; - KaravanApi.getRunnerPodStatus(projectId, name, res => { - if (res.status === 200) { - setPodStatus(res.data); - if (isRunning(res.data) && !isRunning(previousValue.current)) { - ProjectEventBus.showLog('container', res.data.name, props.config.environment); - } - } else { - ProjectEventBus.showLog('container', name, props.config.environment, false); - setPodStatus(new PodStatus({name: name})); - } - }) - } - function getPodInfo() { const env = props.config.environment; + const podStatus = props.podStatus; return ( <Label icon={getIcon()} color={getColor()}> <Tooltip content={`Phase: ${JSON.stringify(podStatus)}`}> @@ -65,6 +38,7 @@ export const RunnerInfoPod = (props: Props) => { } function getPodStatus() { + const podStatus = props.podStatus; const status = !podStatus.terminating ? podStatus.phase : "Terminating" return ( <Label icon={getIcon()} color={getColor()}> @@ -74,6 +48,7 @@ export const RunnerInfoPod = (props: Props) => { } function getPodRequests() { + const podStatus = props.podStatus; const text = podStatus.requestCpu !== '' ? podStatus.requestCpu + " : " + podStatus.requestMemory : "N/A"; return ( <Label icon={getIcon()} color={getColor()}> @@ -83,6 +58,7 @@ export const RunnerInfoPod = (props: Props) => { } function getPodCreation() { + const podStatus = props.podStatus; const text = podStatus.creationTimestamp !== '' ? podStatus.creationTimestamp : "N/A"; return ( <Label icon={getIcon()} color={getColor()}> @@ -92,6 +68,7 @@ export const RunnerInfoPod = (props: Props) => { } function getPodLimits() { + const podStatus = props.podStatus; const text = podStatus.limitCpu !== '' ? podStatus.limitCpu + " : " + podStatus.limitMemory : "N/A"; return ( <Label icon={getIcon()} color={getColor()}> @@ -109,12 +86,7 @@ export const RunnerInfoPod = (props: Props) => { } function getRunning(): boolean { - return isRunning(podStatus); - } - - - function isRunning(status: PodStatus): boolean { - return status.phase === 'Running' && !status.terminating; + return isRunning(props.podStatus); } return (