You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by ji...@apache.org on 2022/04/07 01:20:31 UTC

[incubator-doris-manager] branch master updated: [feature] can set agent port in frontend when creating a new cluster (#32)

This is an automated email from the ASF dual-hosted git repository.

jiafengzheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris-manager.git


The following commit(s) were added to refs/heads/master by this push:
     new 9aec458  [feature] can set agent port in frontend when creating a new cluster (#32)
9aec458 is described below

commit 9aec45819405bfcc8f7a1eef3a2022b41ddb9409
Author: zhengbowen <10...@users.noreply.github.com>
AuthorDate: Thu Apr 7 09:20:26 2022 +0800

    [feature] can set agent port in frontend when creating a new cluster (#32)
    
    can set agent port in frontend when creating a new cluster
---
 frontend/public/locales/en-us.json                 |  5 ++-
 frontend/public/locales/zh-cn.json                 |  5 ++-
 frontend/src/components/common-header/header.tsx   |  4 +--
 .../routes/space/access-cluster/access-cluster.tsx |  5 +--
 .../steps/managed-options/index.module.less        | 20 ++++++++++++
 .../steps/managed-options/managed-options.tsx      | 14 ++++++---
 .../src/routes/space/new-cluster/new-cluster.tsx   |  5 ++-
 .../steps/install-options/index.module.less        | 20 ++++++++++++
 .../steps/install-options/install-options.tsx      | 30 ++++++++----------
 frontend/src/routes/space/space.interface.ts       |  6 ++--
 frontend/src/routes/tree/index.tsx                 | 36 ++++++++++++++++++----
 frontend/src/utils/utils.ts                        |  6 +++-
 12 files changed, 118 insertions(+), 38 deletions(-)

diff --git a/frontend/public/locales/en-us.json b/frontend/public/locales/en-us.json
index 990b864..9bdb60d 100644
--- a/frontend/public/locales/en-us.json
+++ b/frontend/public/locales/en-us.json
@@ -341,5 +341,8 @@
     "TableDescription": "Table Description",
     "CreateTime": "Create Time",
     "UpdateTime": "Update Time",
-    "UpdateTimeHelper": "Records the time when the last table structure change occurred"
+    "UpdateTimeHelper": "Records the time when the last table structure change occurred",
+    
+    "Sync successfully, please refresh the page": "Sync successfully, please refresh the page",
+    "Sync failed": "Sync failed"
 }
diff --git a/frontend/public/locales/zh-cn.json b/frontend/public/locales/zh-cn.json
index 3b0d38a..2ff6881 100644
--- a/frontend/public/locales/zh-cn.json
+++ b/frontend/public/locales/zh-cn.json
@@ -354,6 +354,9 @@
     "TableDescription": "数据表描述信息",
     "CreateTime": "创建时间",
     "UpdateTime": "最近修改时间",
-    "UpdateTimeHelper": "记录该表最近发生表结构变更的时间"
+    "UpdateTimeHelper": "记录该表最近发生表结构变更的时间",
+
+    "Sync successfully, please refresh the page": "同步成功,请刷新页面" ,
+    "Sync failed": "同步失败"
 }
 
diff --git a/frontend/src/components/common-header/header.tsx b/frontend/src/components/common-header/header.tsx
index ab633d6..e68f82e 100644
--- a/frontend/src/components/common-header/header.tsx
+++ b/frontend/src/components/common-header/header.tsx
@@ -44,7 +44,7 @@ export function Header(props: HeaderProps) {
                 <span styleName="common-header-icon">{props.icon}</span>
                 <span styleName="common-header-name">{props.title}</span>
             </div>
-            <div styleName="common-header-refresh">
+            {/* <div styleName="common-header-refresh">
                 <SyncOutlined
                     spin={loading}
                     onClick={() => {
@@ -52,7 +52,7 @@ export function Header(props: HeaderProps) {
                         setLoading(true);
                     }}
                 />
-            </div>
+            </div> */}
         </div>
     );
 }
diff --git a/frontend/src/routes/space/access-cluster/access-cluster.tsx b/frontend/src/routes/space/access-cluster/access-cluster.tsx
index 2cec6c6..e8854c0 100644
--- a/frontend/src/routes/space/access-cluster/access-cluster.tsx
+++ b/frontend/src/routes/space/access-cluster/access-cluster.tsx
@@ -18,7 +18,6 @@
 import ProCard from '@ant-design/pro-card';
 import { Button, message, Row, Space, Steps } from 'antd';
 import React, { useEffect, useState } from 'react';
-import { pathToRegexp } from 'path-to-regexp';
 import { NewSpaceInfoContext } from '@src/common/common.context';
 import { useForm } from 'antd/lib/form/Form';
 import { AccessClusterStepsEnum } from './access-cluster.data';
@@ -120,11 +119,13 @@ export function AccessCluster() {
                 sshUser: value.sshUser,
             };
             params.installInfo = value.installInfo;
+            params.agentPort = value.agentPort ? parseInt(value.agentPort) : value.agentPort;
             isParamsValid =
                 checkParam(params.authInfo.sshUser, '请填写SSH用户') &&
                 checkParam(params.authInfo.sshPort, '请填写SSH端口') &&
                 checkParam(params.authInfo.sshKey, '请填写SSH私钥') &&
-                checkParam(params.installInfo, '请填写安装路径');
+                checkParam(params.installInfo, '请填写安装路径') &&
+                checkParam(params.agentPort, '请填写Agent启动端口');
         }
         if (!isParamsValid) return;
         setLoading(true);
diff --git a/frontend/src/routes/space/access-cluster/steps/managed-options/index.module.less b/frontend/src/routes/space/access-cluster/steps/managed-options/index.module.less
new file mode 100644
index 0000000..432ccec
--- /dev/null
+++ b/frontend/src/routes/space/access-cluster/steps/managed-options/index.module.less
@@ -0,0 +1,20 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+.input {
+    width: 400px;
+}
diff --git a/frontend/src/routes/space/access-cluster/steps/managed-options/managed-options.tsx b/frontend/src/routes/space/access-cluster/steps/managed-options/managed-options.tsx
index 50ade76..879dac1 100644
--- a/frontend/src/routes/space/access-cluster/steps/managed-options/managed-options.tsx
+++ b/frontend/src/routes/space/access-cluster/steps/managed-options/managed-options.tsx
@@ -20,11 +20,12 @@ import React, { useContext, useEffect } from 'react';
 import ProCard from '@ant-design/pro-card';
 import { NewSpaceInfoContext } from '@src/common/common.context';
 import TextArea from 'antd/lib/input/TextArea';
+import styles from './index.module.less';
 
 export function ManagedOptions(props: any) {
     const { form, reqInfo } = useContext(NewSpaceInfoContext);
     useEffect(() => {
-        form.setFieldsValue({...reqInfo.authInfo});
+        form.setFieldsValue({ ...reqInfo.authInfo });
     }, [reqInfo.cluster_id]);
     return (
         <ProCard title={<h2>托管选项</h2>} headerBordered>
@@ -62,15 +63,20 @@ export function ManagedOptions(props: any) {
             <Form
                 form={form}
                 name="basic"
-                labelCol={{ span: 2 }}
-                wrapperCol={{ span: 10 }}
                 initialValues={{
                     installInfo: reqInfo.installInfo,
                 }}
                 autoComplete="off"
             >
                 <Form.Item label="安装路径" name="installInfo" rules={[{ required: true, message: '请输入安装路径' }]}>
-                    <Input />
+                    <Input className={styles.input} />
+                </Form.Item>
+                <Form.Item
+                    label="Agent启动端口"
+                    name="agentPort"
+                    rules={[{ required: true, message: '请输入Agent启动端口' }]}
+                >
+                    <Input className={styles.input} />
                 </Form.Item>
             </Form>
         </ProCard>
diff --git a/frontend/src/routes/space/new-cluster/new-cluster.tsx b/frontend/src/routes/space/new-cluster/new-cluster.tsx
index 6654991..a8894f2 100644
--- a/frontend/src/routes/space/new-cluster/new-cluster.tsx
+++ b/frontend/src/routes/space/new-cluster/new-cluster.tsx
@@ -115,8 +115,11 @@ export function NewCluster() {
         if (value && step === NewClusterStepsEnum['install-options']) {
             params.installInfo = value.installDir;
             params.packageInfo = value.packageUrl;
+            params.agentPort = value.agentPort ? parseInt(value.agentPort) : value.agentPort;
             isParamsValid =
-                checkParam(params.installInfo, '请填写代码包路径') && checkParam(params.packageInfo, '请填写安装路径');
+                checkParam(params.installInfo, '请填写代码包路径') &&
+                checkParam(params.packageInfo, '请填写安装路径') &&
+                checkParam(params.agentPort, '请填写Agent启动端口');
         }
         if (value && step === NewClusterStepsEnum['cluster-plan']) {
             params.nodeConfig = value.nodeConfig;
diff --git a/frontend/src/routes/space/new-cluster/steps/install-options/index.module.less b/frontend/src/routes/space/new-cluster/steps/install-options/index.module.less
new file mode 100644
index 0000000..432ccec
--- /dev/null
+++ b/frontend/src/routes/space/new-cluster/steps/install-options/index.module.less
@@ -0,0 +1,20 @@
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+.input {
+    width: 400px;
+}
diff --git a/frontend/src/routes/space/new-cluster/steps/install-options/install-options.tsx b/frontend/src/routes/space/new-cluster/steps/install-options/install-options.tsx
index 962b1a8..f27578d 100644
--- a/frontend/src/routes/space/new-cluster/steps/install-options/install-options.tsx
+++ b/frontend/src/routes/space/new-cluster/steps/install-options/install-options.tsx
@@ -19,9 +19,10 @@ import { Form, Input, PageHeader } from 'antd';
 import React, { useContext } from 'react';
 import ProCard from '@ant-design/pro-card';
 import { NewSpaceInfoContext } from '@src/common/common.context';
+import styles from './index.module.less';
 
 export function InstallOptions(props: any) {
-    const {form} = useContext(NewSpaceInfoContext);
+    const { form } = useContext(NewSpaceInfoContext);
     return (
         <ProCard title={<h2>安装选项</h2>} headerBordered>
             <PageHeader className="site-page-header" title="获取安装包" style={{ paddingLeft: 0 }} />
@@ -31,30 +32,25 @@ export function InstallOptions(props: any) {
                     若Manager节点可访问公网,推荐直接使用预编译安装包地址;若Manager节点不可访问公网,推荐自行搭建http服务提供安装包。
                 </div>
             </p>
-            <Form
-                form={form}
-                name="basic"
-                labelCol={{ span: 2 }}
-                wrapperCol={{ span: 10 }}
-                autoComplete="off"
-            >
+            <Form form={form} name="basic" autoComplete="off">
                 <Form.Item label="代码包路径" name="packageUrl" rules={[{ required: true, message: '请输入安装路径' }]}>
-                    <Input />
+                    <Input className={styles.input} />
                 </Form.Item>
             </Form>
             <PageHeader className="site-page-header" title="指定安装路径" style={{ paddingLeft: 0 }} />
             <div>
                 <p>Doris与Doris Manager Agent将安装至该目录下。请确保该目录为Doris及相关组件专用。</p>
             </div>
-            <Form
-                form={form}
-                name="basic"
-                labelCol={{ span: 2 }}
-                wrapperCol={{ span: 10 }}
-                autoComplete="off"
-            >
+            <Form form={form} name="basic" autoComplete="off">
                 <Form.Item label="安装路径" name="installDir" rules={[{ required: true, message: '请输入安装路径' }]}>
-                    <Input />
+                    <Input className={styles.input} />
+                </Form.Item>
+                <Form.Item
+                    label="Agent启动端口"
+                    name="agentPort"
+                    rules={[{ required: true, message: '请输入Agent启动端口' }]}
+                >
+                    <Input className={styles.input} />
                 </Form.Item>
             </Form>
         </ProCard>
diff --git a/frontend/src/routes/space/space.interface.ts b/frontend/src/routes/space/space.interface.ts
index fad39f7..c96c54f 100644
--- a/frontend/src/routes/space/space.interface.ts
+++ b/frontend/src/routes/space/space.interface.ts
@@ -40,12 +40,11 @@ export interface ISpaceParam {
     spaceAdminUsers: number[];
 }
 
-
 export interface ISpaceUser {
     name: string;
     email: string;
     id: number;
-    is_active: boolean
+    is_active: boolean;
 }
 export type IRequiredMark = boolean | 'optional';
 
@@ -88,4 +87,5 @@ export interface ClusterAccessParams {
     clusterAccessInfo?: ClusterAccessInfo;
     installInfo?: string;
     spaceInfo?: SpaceInfo;
-}
\ No newline at end of file
+    agentPort?: number;
+}
diff --git a/frontend/src/routes/tree/index.tsx b/frontend/src/routes/tree/index.tsx
index dd986bb..5fdb4e5 100644
--- a/frontend/src/routes/tree/index.tsx
+++ b/frontend/src/routes/tree/index.tsx
@@ -19,22 +19,28 @@
 
 import { useState, useEffect } from 'react';
 import { Tree, message } from 'antd';
-import { TableOutlined, HddOutlined, HomeOutlined } from '@ant-design/icons';
+import { TableOutlined, HddOutlined, HomeOutlined, SyncOutlined } from '@ant-design/icons';
+import { useTranslation } from 'react-i18next';
 import { TreeAPI } from './tree.api';
 import { DataNode } from './tree.interface';
 import { updateTreeData } from './tree.service';
 import { ContentRouteKeyEnum } from './tree.data';
-import styles from './tree.module.less';
 import EventEmitter from '@src/utils/event-emitter';
-import { useTranslation } from 'react-i18next';
 import { useNavigate } from 'react-router';
 
+import { HeaderAPI } from '@src/components/common-header/header.api';
+import styles from './tree.module.less';
+import { delay } from '@src/utils/utils';
+import { isSuccess } from '@src/utils/http';
+
+// import { LoadingWrapper } from '@src/components/loadingwrapper/loadingwrapper';
 const initTreeDate: DataNode[] = [];
 export function MetaBaseTree() {
     const [treeData, setTreeData] = useState(initTreeDate);
     const [loading, setLoading] = useState(true);
     const { t } = useTranslation();
     const navigate = useNavigate();
+    const [syncLoading, setSyncLoading] = useState(false);
     useEffect(() => {
         initTreeData();
         EventEmitter.on('refreshData', initTreeData);
@@ -47,7 +53,7 @@ export function MetaBaseTree() {
                 const num = Math.random();
                 const database = res.data;
                 const treeData: Array<DataNode> = [];
-                database.forEach((item, index) => {
+                database.forEach(item => {
                     treeData.push({
                         title: `${item.name}`,
                         key: `1¥${num}¥name¥${item.id}¥${item.name}`,
@@ -116,11 +122,29 @@ export function MetaBaseTree() {
     function goHome() {
         navigate(`/meta`);
     }
+
+    function syncData() {
+        setSyncLoading(true);
+        Promise.all([delay(500), HeaderAPI.refreshData()])
+            .then(res => {
+                if (isSuccess(res[1])) {
+                    message.success(t`Sync successfully, please refresh the page`);
+                    return;
+                }
+                message.error(res[1].msg);
+            })
+            .catch(() => {
+                message.error(t`Sync Failed`);
+            })
+            .finally(() => setSyncLoading(false));
+    }
+
     return (
         <div className={styles['palo-tree-container']}>
             <h2 className={styles['palo-tree-title']}>
                 <HomeOutlined onClick={goHome} />
-                {t`DataTree`}
+                <span>{t`DataTree`}</span>
+                <SyncOutlined spin={syncLoading} style={{ color: '#1890ff', padding: 0 }} onClick={syncData} />
             </h2>
             <div className={styles['palo-tree-wrapper']}>
                 <Tree
@@ -128,7 +152,7 @@ export function MetaBaseTree() {
                     loadData={onLoadData}
                     treeData={treeData}
                     className={styles['palo-side-tree']}
-                    onSelect={(selectedKeys, info) => handleTreeSelect(selectedKeys, info)}
+                    onSelect={selectedKeys => handleTreeSelect(selectedKeys)}
                 />
             </div>
         </div>
diff --git a/frontend/src/utils/utils.ts b/frontend/src/utils/utils.ts
index 5ff0322..e411301 100644
--- a/frontend/src/utils/utils.ts
+++ b/frontend/src/utils/utils.ts
@@ -75,4 +75,8 @@ export function showName(name: string): string {
         return '空间成员';
     }
     return name;
-}
\ No newline at end of file
+}
+
+export function delay(ms: number) {
+    return new Promise(resolve => setTimeout(resolve, ms));
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org