You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ma...@apache.org on 2022/10/28 00:16:56 UTC

[camel-karavan] 06/08: Get DeploymentStatus fron new API

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 72707e7c2de18d51c8fb207e4c4f253c0698e2b9
Author: Marat Gubaidullin <ma...@gmail.com>
AuthorDate: Thu Oct 27 10:29:25 2022 -0400

    Get DeploymentStatus fron new API
---
 karavan-app/src/main/webapp/src/Main.tsx           |  3 +-
 karavan-app/src/main/webapp/src/api/KaravanApi.tsx | 11 +++++
 .../src/main/webapp/src/projects/ProjectInfo.tsx   | 48 +++++++++++-----------
 .../src/main/webapp/src/projects/ProjectModels.ts  |  7 ++--
 .../src/main/webapp/src/projects/ProjectPage.tsx   |  3 +-
 .../src/main/webapp/src/projects/ProjectsPage.tsx  | 20 ++++++---
 6 files changed, 55 insertions(+), 37 deletions(-)

diff --git a/karavan-app/src/main/webapp/src/Main.tsx b/karavan-app/src/main/webapp/src/Main.tsx
index adea4ca..4d7acb5 100644
--- a/karavan-app/src/main/webapp/src/Main.tsx
+++ b/karavan-app/src/main/webapp/src/Main.tsx
@@ -32,7 +32,6 @@ import EipIcon from "@patternfly/react-icons/dist/js/icons/topology-icon";
 import ComponentsIcon from "@patternfly/react-icons/dist/js/icons/module-icon";
 import ConfigurationIcon from "@patternfly/react-icons/dist/js/icons/cogs-icon";
 import {MainLogin} from "./MainLogin";
-import {Thenable} from "monaco-editor";
 
 class ToastMessage {
     id: string = ''
@@ -125,7 +124,7 @@ export class Main extends React.Component<Props, State> {
 
     getData() {
         KaravanApi.getConfiguration((config: any) => {
-            this.setState({ config: config })
+            this.setState({ config: config });
         });
         this.updateKamelets();
         this.updateComponents();
diff --git a/karavan-app/src/main/webapp/src/api/KaravanApi.tsx b/karavan-app/src/main/webapp/src/api/KaravanApi.tsx
index 50379ba..d05e95b 100644
--- a/karavan-app/src/main/webapp/src/api/KaravanApi.tsx
+++ b/karavan-app/src/main/webapp/src/api/KaravanApi.tsx
@@ -290,6 +290,17 @@ export class KaravanApi {
         });
     }
 
+    static async getDeploymentStatuses(env: string, after: (statuses: DeploymentStatus[]) => void) {
+        instance.get('/api/kubernetes/deployment/' + env)
+            .then(res => {
+                if (res.status === 200) {
+                    after(res.data);
+                }
+            }).catch(err => {
+            console.log(err);
+        });
+    }
+
     static async rolloutDeployment(name: string, environment: string, after: (res: AxiosResponse<any>) => void) {
         instance.post('/api/kubernetes/deployment/rollout/' + environment + '/' + name, "")
             .then(res => {
diff --git a/karavan-app/src/main/webapp/src/projects/ProjectInfo.tsx b/karavan-app/src/main/webapp/src/projects/ProjectInfo.tsx
index 16ce1a3..0148cab 100644
--- a/karavan-app/src/main/webapp/src/projects/ProjectInfo.tsx
+++ b/karavan-app/src/main/webapp/src/projects/ProjectInfo.tsx
@@ -263,34 +263,34 @@ export class ProjectInfo extends React.Component<Props, State> {
     }
 
     getPodsPanel(deploymentStatus: DeploymentStatus, env: string) {
-        const podStatuses = deploymentStatus.podStatuses;
+        // const podStatuses = deploymentStatus.podStatuses;
         return (
             <Flex justifyContent={{default: "justifyContentSpaceBetween"}} alignItems={{default: "alignItemsCenter"}}>
                 <FlexItem>
                     <LabelGroup numLabels={3}>
-                        {(podStatuses === undefined || podStatuses.length === 0) && <Label icon={<DownIcon/>} color={"grey"}>No pods</Label>}
-                        {podStatuses.map(pod => {
-                                const running = pod.started && pod.ready;
-                                return (
-                                    <Tooltip key={pod.name} content={running ? "Running" : pod.reason}>
-                                        <Label icon={running ? <UpIcon/> : <DownIcon/>} color={running ? "green" : "red"}>
-                                            <Button variant="link"
-                                                    onClick={e => this.props.showLog?.call(this, 'container', pod.name, env)}>
-                                                {pod.name}
-                                            </Button>
-                                            <Tooltip content={"Delete Pod"}>
-                                                <Button icon={<DeleteIcon/>} variant="link" onClick={e => this.setState({
-                                                    showDeleteConfirmation: true,
-                                                    deleteEntity: "pod",
-                                                    deleteEntityEnv: env,
-                                                    deleteEntityName: pod.name
-                                                })}></Button>
-                                            </Tooltip>
-                                        </Label>
-                                    </Tooltip>
-                                )
-                            }
-                        )}
+                        {/*{(podStatuses === undefined || podStatuses.length === 0) && <Label icon={<DownIcon/>} color={"grey"}>No pods</Label>}*/}
+                        {/*{podStatuses.map(pod => {*/}
+                        {/*        const running = pod.started && pod.ready;*/}
+                        {/*        return (*/}
+                        {/*            <Tooltip key={pod.name} content={running ? "Running" : pod.reason}>*/}
+                        {/*                <Label icon={running ? <UpIcon/> : <DownIcon/>} color={running ? "green" : "red"}>*/}
+                        {/*                    <Button variant="link"*/}
+                        {/*                            onClick={e => this.props.showLog?.call(this, 'container', pod.name, env)}>*/}
+                        {/*                        {pod.name}*/}
+                        {/*                    </Button>*/}
+                        {/*                    <Tooltip content={"Delete Pod"}>*/}
+                        {/*                        <Button icon={<DeleteIcon/>} variant="link" onClick={e => this.setState({*/}
+                        {/*                            showDeleteConfirmation: true,*/}
+                        {/*                            deleteEntity: "pod",*/}
+                        {/*                            deleteEntityEnv: env,*/}
+                        {/*                            deleteEntityName: pod.name*/}
+                        {/*                        })}></Button>*/}
+                        {/*                    </Tooltip>*/}
+                        {/*                </Label>*/}
+                        {/*            </Tooltip>*/}
+                        {/*        )*/}
+                        {/*    }*/}
+                        {/*)}*/}
                     </LabelGroup>
                 </FlexItem>
                 <FlexItem>{env === "dev" && this.rolloutButton()}</FlexItem>
diff --git a/karavan-app/src/main/webapp/src/projects/ProjectModels.ts b/karavan-app/src/main/webapp/src/projects/ProjectModels.ts
index 16ae793..2f6eeb9 100644
--- a/karavan-app/src/main/webapp/src/projects/ProjectModels.ts
+++ b/karavan-app/src/main/webapp/src/projects/ProjectModels.ts
@@ -3,7 +3,6 @@ export class Project {
     name: string = '';
     description: string = '';
     lastCommit: string = '';
-    deployed: boolean = false;
 
     public constructor(projectId: string, name: string, description: string, lastCommit: string);
     public constructor(init?: Partial<Project>);
@@ -22,16 +21,18 @@ export class Project {
 }
 
 export class DeploymentStatus {
-    projectId: string = '';
+    name: string = '';
+    env: string = '';
+    namespace: string = '';
     image: string = '';
     replicas: number = 0;
     readyReplicas: number = 0;
     unavailableReplicas: number = 0;
-    podStatuses: PodStatus[] = []
 }
 
 export class PodStatus {
     name: string = '';
+    phase: string = '';
     started: boolean = false;
     ready: boolean = false;
     reason: string = '';
diff --git a/karavan-app/src/main/webapp/src/projects/ProjectPage.tsx b/karavan-app/src/main/webapp/src/projects/ProjectPage.tsx
index 8d2a38b..cc3a708 100644
--- a/karavan-app/src/main/webapp/src/projects/ProjectPage.tsx
+++ b/karavan-app/src/main/webapp/src/projects/ProjectPage.tsx
@@ -83,8 +83,7 @@ export class ProjectPage extends React.Component<Props, State> {
         tab: "details",
         environments: this.props.config.environments && Array.isArray(this.props.config.environments)
             ? Array.from(this.props.config.environments) : [],
-        environment: this.props.config.environments && Array.isArray(this.props.config.environments)
-            ? this.props.config.environments[0] : ''
+        environment: this.props.config.environment
     };
 
     componentDidMount() {
diff --git a/karavan-app/src/main/webapp/src/projects/ProjectsPage.tsx b/karavan-app/src/main/webapp/src/projects/ProjectsPage.tsx
index 0b290d8..744c19f 100644
--- a/karavan-app/src/main/webapp/src/projects/ProjectsPage.tsx
+++ b/karavan-app/src/main/webapp/src/projects/ProjectsPage.tsx
@@ -29,7 +29,7 @@ import '../designer/karavan.css';
 import {MainToolbar} from "../MainToolbar";
 import RefreshIcon from '@patternfly/react-icons/dist/esm/icons/sync-alt-icon';
 import PlusIcon from '@patternfly/react-icons/dist/esm/icons/plus-icon';
-import {Project} from "./ProjectModels";
+import {DeploymentStatus, Project} from "./ProjectModels";
 import {TableComposable, Tbody, Td, Th, Thead, Tr} from "@patternfly/react-table";
 import DeleteIcon from "@patternfly/react-icons/dist/js/icons/times-icon";
 import SearchIcon from '@patternfly/react-icons/dist/esm/icons/search-icon';
@@ -45,6 +45,7 @@ interface Props {
 
 interface State {
     projects: Project[],
+    deploymentStatuses: DeploymentStatus[],
     isCreateModalOpen: boolean,
     isDeleteModalOpen: boolean,
     isCopy: boolean,
@@ -60,6 +61,7 @@ export class ProjectsPage extends React.Component<Props, State> {
 
     public state: State = {
         projects: [],
+        deploymentStatuses: [],
         isCreateModalOpen: false,
         isDeleteModalOpen: false,
         isCopy: false,
@@ -71,7 +73,7 @@ export class ProjectsPage extends React.Component<Props, State> {
     interval: any;
 
     componentDidMount() {
-        this.interval = setInterval(() => this.onGetProjects(), 700);
+        this.interval = setInterval(() => this.onGetProjects(), 1300);
     }
 
     componentWillUnmount() {
@@ -112,6 +114,9 @@ export class ProjectsPage extends React.Component<Props, State> {
             KaravanApi.getProjects((projects: Project[]) => {
                 this.setState({ projects: projects })
             });
+            KaravanApi.getDeploymentStatuses(config.environment, (statuses: DeploymentStatus[]) => {
+                this.setState({ deploymentStatuses: statuses });
+            });
         });
 
     }
@@ -209,12 +214,15 @@ export class ProjectsPage extends React.Component<Props, State> {
         )
     }
 
+    isDeployed(projectId: string): boolean{
+        const ds = this.state.deploymentStatuses.find(ds => ds.name === projectId);
+        return ds ? (ds.replicas > 0 && ds.replicas === ds.readyReplicas) : false;
+    }
+
     render() {
         const runtime = this.props.config?.runtime ? this.props.config.runtime : "QUARKUS";
         const projects = this.state.projects.filter(p => p.name.toLowerCase().includes(this.state.filter) || p.description.toLowerCase().includes(this.state.filter));
-        const environments: string[] = this.props.config.environments && Array.isArray(this.props.config.environments)
-            ? Array.from(this.props.config.environments)
-            : [];
+        const environment: string = this.props.config.environment;
         return (
             <PageSection className="kamelet-section projects-page" padding={{default: 'noPadding'}}>
                 <PageSection className="tools-section" padding={{default: 'noPadding'}}>
@@ -255,7 +263,7 @@ export class ProjectsPage extends React.Component<Props, State> {
                                     </Td>
                                     <Td noPadding style={{width:"180px"}}>
                                         <Flex direction={{default: "row"}}>
-                                            <FlexItem key={"dev"}><Badge isRead={!project.deployed}>{"dev"}</Badge></FlexItem>
+                                            <FlexItem key={"dev"}><Badge isRead={!this.isDeployed(project.projectId)}>{"dev"}</Badge></FlexItem>
                                         </Flex>
                                     </Td>
                                     <Td isActionCell>