blob: 1e19cc6d8b1ef643b12eb9c1db6e5cf493216ad3 [file] [log] [blame]
import React, {useEffect, useRef, useState} from 'react';
import {
Card,
CardBody, Flex, FlexItem, Divider, Tab, Tabs, CardFooter
} from '@patternfly/react-core';
import '../designer/karavan.css';
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";
import {RunnerInfoTrace} from "./RunnerInfoTrace";
export function isRunning(status: PodStatus): boolean {
return status.phase === 'Running' && !status.terminating;
}
interface Props {
project: Project,
config: any,
}
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({});
const [trace, setTrace] = useState({});
const [showTrace, setShowTrace] = useState(false);
const [refreshTrace, setRefreshTrace] = useState(true);
useEffect(() => {
previousValue.current = podStatus;
const sub1 = ProjectEventBus.onShowTrace()?.subscribe((result) => {
setShowTrace(result.show);
});
const sub2 = ProjectEventBus.onRefreshTrace()?.subscribe((result) => {
setRefreshTrace(result);
});
const interval = setInterval(() => {
onRefreshStatus();
}, 1000);
return () => {
sub1.unsubscribe();
sub2.unsubscribe();
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({});
}
})
if (refreshTrace) {
KaravanApi.getRunnerConsoleStatus(projectId, "trace", res => {
if (res.status === 200) {
setTrace(res.data);
} else {
setTrace({});
}
})
}
}
function showConsole(): boolean {
return podStatus.phase !== '';
}
const {project, config} = props;
return (
<Card className="project-development">
<CardBody>
<Flex direction={{default: "row"}}
justifyContent={{default: "justifyContentSpaceBetween"}}>
{!showTrace && <FlexItem flex={{default: "flex_1"}}>
<RunnerInfoPod podStatus={podStatus} config={config} showConsole={showConsole()}/>
</FlexItem>}
{showConsole() && !showTrace && <>
<Divider orientation={{default: "vertical"}}/>
<FlexItem flex={{default: "flex_1"}}>
<RunnerInfoMemory jvm={jvm} memory={memory} config={config} showConsole={showConsole()}/>
</FlexItem>
<Divider orientation={{default: "vertical"}}/>
<FlexItem flex={{default: "flex_1"}}>
<RunnerInfoContext context={context} config={config} showConsole={showConsole()}/>
</FlexItem>
</>}
{showConsole() && showTrace && <FlexItem flex={{default: "flex_1"}} style={{margin:"0"}}>
<RunnerInfoTrace trace={trace} refreshTrace={refreshTrace}/>
</FlexItem>}
<Divider orientation={{default: "vertical"}}/>
<FlexItem>
<RunnerToolbar project={project} config={config} showConsole={showConsole()}/>
</FlexItem>
</Flex>
</CardBody>
</Card>
)
}