From 4c7c89fe5a1fdcac09a355f054ef5d1695322459 Mon Sep 17 00:00:00 2001
From: zhangzengfei <zhangzengfei@iotlink.com>
Date: 星期一, 12 十月 2020 19:30:45 +0800
Subject: [PATCH] 完善存储集群管理功能

---
 src/pages/settings/components/ClusterManagement.vue |  247 ++++++++++++++++++++++++++++++++++---------------
 1 files changed, 171 insertions(+), 76 deletions(-)

diff --git a/src/pages/settings/components/ClusterManagement.vue b/src/pages/settings/components/ClusterManagement.vue
index cb07345..76ab639 100644
--- a/src/pages/settings/components/ClusterManagement.vue
+++ b/src/pages/settings/components/ClusterManagement.vue
@@ -15,25 +15,30 @@
                 <el-input v-model="clusterid" placeholder="涓嶅厑璁歌緭鍏�,淇濆瓨鍚庡洖鏄�" disabled size="small"></el-input>
               </el-form-item>
               <el-form-item label="闆嗙兢瀵嗙爜" prop="clusterpwd" style="width:500px">
-                <el-input v-model="ruleForm.clusterpwd" placeholder="璇疯緭鍏�6-12浣嶅瘑鐮�,鎴栫偣鍑荤敓鎴�" size="small">
+                <el-input v-model="ruleForm.clusterpwd" placeholder="璇疯緭鍏�6浣嶅瘑鐮�,鎴栫偣鍑荤敓鎴�" size="small">
                   <el-button type="text" slot="suffix" @click="generatePassword">鐢熸垚瀵嗙爜</el-button>
                 </el-input>
               </el-form-item>
 
               <!-- <el-form-item label="铏氭嫙IP" prop="virtualip">
                 <ip-input :ip="ruleForm.virtualip" :on-blur="onIpBlur"></ip-input>
-              </el-form-item> -->
+              </el-form-item>-->
               <el-form-item style="width:500px">
                 <el-button type="primary" size="small" @click="submitForm('ruleForm')">淇濆瓨</el-button>
               </el-form-item>
             </el-form>
           </el-tab-pane>
-          
+
           <!-- 鍔犲叆宸叉湁闆嗙兢 -->
-          <el-tab-pane label="鍔犲叆宸叉湁闆嗙兢" name="3" :disabled="isHasColony">
+          <el-tab-pane label="鍔犲叆宸叉湁闆嗙兢" name="2" :disabled="isHasColony">
             <el-form label-width="80px" :model="joinForm" :rules="joinRules" ref="joinForm">
               <el-form-item label="IP鍦板潃" style="width:440px">
-                <el-input v-model="joinForm.clusterip" placeholder="璇疯緭鍏ラ泦缇ゅ唴浠绘剰IP鍦板潃" size="small">
+                <el-input
+                  v-model="joinForm.clusterip"
+                  placeholder="璇疯緭鍏ラ泦缇ゅ唴浠绘剰IP鍦板潃"
+                  size="small"
+                  autocomplete="new-password"
+                >
                   <el-button
                     type="text"
                     slot="suffix"
@@ -54,6 +59,7 @@
                   placeholder="璇疯緭鍏ラ泦缇ゅ瘑鐮�"
                   show-password
                   size="small"
+                  autocomplete="new-password"
                 ></el-input>
               </el-form-item>
               <el-form-item style="width:440px">
@@ -75,14 +81,14 @@
               <el-input
                 v-model="ruleForm.clusterpwd"
                 disabled
-                placeholder="璇疯緭鍏�6-12浣嶅瘑鐮�,鎴栫偣鍑荤敓鎴�"
+                placeholder="璇疯緭鍏�6浣嶅瘑鐮�,鎴栫偣鍑荤敓鎴�"
                 size="small"
               ></el-input>
             </el-form-item>
 
             <!-- <el-form-item label="铏氭嫙IP" prop="virtualip">
               <ip-input :ip="ruleForm.virtualip" :on-blur="onIpBlur"></ip-input>
-            </el-form-item> -->
+            </el-form-item>-->
             <el-form-item style="width:440px;text-align: right;">
               <el-button size="small" type="danger" @click="leave">閫�鍑洪泦缇�</el-button>
               <el-button
@@ -95,7 +101,7 @@
           </el-form>
         </div>
       </el-col>
-      <el-col :span="14" style="height: 100%;" v-if="members.length !== 0">
+      <el-col :span="10" style="height: 100%;" v-if="members.length !== 0">
         <serfDiagram
           ref="diagram"
           :members="members"
@@ -127,37 +133,46 @@
     <el-row>
       <el-col :span="12">
         <el-tabs id="e-dbcluster" v-model="sActiveName">
-          <el-tab-pane label="鍒涘缓闆嗙兢" name="s-first">
-            <el-button type="primary" style="float: none;margin: 20px 0px;" size="small">鍒涘缓瀛樺偍闆嗙兢</el-button>
-            <p>鐐瑰嚮灏嗘湰鏈哄垱寤轰负瀛樺偍闆嗙兢</p>
+          <el-tab-pane label="鍒涘缓闆嗙兢" name="s-first" v-if="sActiveName != 's-third1'">
+            <el-button
+              type="primary"
+              style="float: left;margin: 20px 0px;"
+              size="small"
+              @click="createEsCluster()"
+            >鍒涘缓瀛樺偍闆嗙兢</el-button>
+            <!-- <p>鐐瑰嚮灏嗘湰鏈哄垱寤轰负瀛樺偍闆嗙兢</p> -->
           </el-tab-pane>
-          <el-tab-pane label="鍔犲叆宸叉湁闆嗙兢" name="s-second">
+          <el-tab-pane label="鍔犲叆宸叉湁闆嗙兢" name="s-second" v-if="sActiveName != 's-third1'">
             <el-form label-width="80px">
-              <el-form-item label="IP鍦板潃" style="text-align: left;">
-                <el-input v-model="clusterip2" placeholder="璇疯緭鍏ラ泦缇ゅ唴浠绘剰IP鍦板潃" size="small">
-                  <el-button
-                    type="text"
-                    slot="suffix"
-                    v-show="!searchDis"
-                    @click="searchColony"
-                  >鎼滅储闆嗙兢</el-button>
-                </el-input>
+              <el-form-item label="IP鍦板潃" style="text-align: left;width: 300px;">
+                <el-input
+                  v-model="esNodeIp"
+                  placeholder="璇疯緭鍏ラ泦缇ゅ唴浠绘剰IP鍦板潃"
+                  size="small"
+                  autocomplete="off"
+                ></el-input>
+                <el-checkbox
+                  label="涓昏妭鐐�"
+                  v-model="esNodeType"
+                  style="margin-left: 20px;position: absolute;"
+                ></el-checkbox>
               </el-form-item>
               <el-form-item>
-                <el-button type="primary" @click="join('joinForm')" size="small">鍔犲叆闆嗙兢</el-button>
+                <el-button
+                  type="primary"
+                  @click="joinESCluster()"
+                  size="small"
+                  style="float: left;"
+                >鍔犲叆闆嗙兢</el-button>
               </el-form-item>
             </el-form>
           </el-tab-pane>
-          <el-tab-pane label="绠$悊闆嗙兢" name="s-third">
-            <h3 style="text-align: left;margin: 10px 0px;">
-              <b>闆嗙兢鍚嶇О</b>
-              <span>xxx</span>
-            </h3>
-            <el-table :data="tableData" style="width: 100%">
+          <el-tab-pane label="闆嗙兢淇℃伅" name="s-third">
+            <el-table :data="esNodes" style="width: 100%">
               <el-table-column prop="nodeType" label="鑺傜偣绫诲瀷"></el-table-column>
-              <el-table-column prop="nodeName" label="鑺傜偣鍚嶇О"></el-table-column>
-              <el-table-column prop="nodeIp" label="鑺傜偣IP鍦板潃"></el-table-column>
-              <el-table-column prop="registerTime" label="娉ㄥ唽鏃堕棿"></el-table-column>
+              <el-table-column prop="name" label="鑺傜偣鍚嶇О"></el-table-column>
+              <el-table-column prop="ip" label="鑺傜偣IP鍦板潃" min-width="90px"></el-table-column>
+              <el-table-column prop="buildDate" label="娉ㄥ唽鏃堕棿" min-width="120px"></el-table-column>
             </el-table>
           </el-tab-pane>
         </el-tabs>
@@ -168,7 +183,7 @@
 
 <script>
 import {
-  createColony,
+  createSerfCluster,
   randomPwd,
   search,
   getSearchNodes,
@@ -178,8 +193,16 @@
   joinCluster,
   leave,
   getVrrp,
-  setVrrp
+  setVrrp,
+  createESNode,
+  addESNode,
+  getEsClusterInfo
 } from "@/api/clusterManage";
+
+import {
+  getDevInfo
+} from "@/api/system";
+
 import serfDiagram from "@/components/serfDiagram";
 import ipInput from "@/components/subComponents/IPInput";
 
@@ -194,8 +217,13 @@
         return callback(new Error("瀵嗙爜涓嶈兘涓虹┖"));
       }
       setTimeout(() => {
-        if (value.length > 16 || value.length < 6) {
-          callback(new Error("瀵嗙爜搴斾负6-16浣�!"));
+        // if (value.length > 16 || value.length < 6) {
+        //   callback(new Error("瀵嗙爜搴斾负6-16浣�!"));
+        // } else {
+        //   callback();
+        // }
+        if (value.length != 6) {
+          callback(new Error("瀵嗙爜搴斾负6浣�!"));
         } else {
           callback();
         }
@@ -205,7 +233,8 @@
       activeName: "1",
       sActiveName: "s-first",
       clusterid: "",
-      clusterip2: "",
+      esNodeIp: "",
+      esNodeType: "",
       clusterpwd2: "",
       sClusterip: "",
       ruleForm: {
@@ -248,26 +277,7 @@
           { validator: checkPwd, trigger: "change" }
         ]
       },
-      tableData: [
-        {
-          nodeType: "涓昏妭鐐�",
-          nodeName: "xxxx",
-          nodeIp: "192.168.12.102",
-          registerTime: "2016-04-04"
-        },
-        {
-          nodeType: "涓昏妭鐐�",
-          nodeName: "xxxx",
-          nodeIp: "192.168.14.122",
-          registerTime: "2016-05-04"
-        },
-        {
-          nodeType: "涓昏妭鐐�",
-          nodeName: "xxxx",
-          nodeIp: "192.168.10.132",
-          registerTime: "2016-02-12"
-        }
-      ],
+      esNodes: [],
       scheduleId: "",
       isHasColony: false,
       currentCluster: {},
@@ -278,7 +288,11 @@
       members: []
     };
   },
-  watch: {},
+  mounted() {
+    this.findCluster();
+    this.getVrrpInfo();
+    this.getEsClusterNodes();
+  },
   methods: {
     cleanValue() {
       this.members = [];
@@ -289,14 +303,14 @@
     submitForm(formName) {
       this.$refs[formName].validate(valid => {
         if (valid) {
-          alert("submit!");
+          //alert("submit!");
           let json = {
             clusterId: this.clusterid,
             clusterName: this.ruleForm.clustername,
             password: this.ruleForm.clusterpwd,
             //virtualip: this.ruleForm.virtualip
           };
-          this.createColony(json).then(() => {
+          this.createCluster(json).then(() => {
             this.findCluster();
           });
         } else {
@@ -306,7 +320,6 @@
       });
     },
     saveForm(formName) {
-      debugger
       this.$refs[formName].validate(valid => {
         if (valid) {
           alert("submit!");
@@ -314,7 +327,7 @@
             enable: this.vrIpForm.enable,
             serve_port: this.vrIpForm.serve_port,
             virtual_ip: this.vrIpForm.virtual_ip,
-            
+
           };
           setVrrp(json).then(() => {
             this.getVrrpInfo();
@@ -353,8 +366,8 @@
         }
       });
     },
-    async createColony(json) {
-      let res = await createColony(json);
+    async createCluster(json) {
+      let res = await createSerfCluster(json);
       console.log(res, "鍒涘缓闆嗙兢");
       this.$notify({
         title: res.success ? "鎴愬姛" : "澶辫触",
@@ -371,6 +384,7 @@
     async searchColony() {
       this.$refs["joinForm"].validate(valid => {
         if (valid) {
+          this.members = [];
           let json = {
             password: this.joinForm.clusterpwd,
             ip: this.joinForm.clusterip
@@ -489,13 +503,13 @@
         }
       }
     },
-    getVrrpInfo(){
-      getVrrp().then(res=>{
-        if(res.success){
+    getVrrpInfo() {
+      getVrrp().then(res => {
+        if (res.success) {
           this.vrIpForm.virtual_ip = res.data.virtual_ip;
           this.vrIpForm.enable = res.data.enable;
         }
-      }).catch(e=>{
+      }).catch(e => {
         console.log(e)
       })
     },
@@ -537,10 +551,11 @@
           this.ruleForm.clusterpwd = ""
           this.clusterid = "";
           this.isHasColony = false;
-          this.activeName = "1"
+          this.activeName = "1";
+          this.members = [];
         }
       }).catch(() => { });
-      
+
     },
     joinNode(event, node) {
       this.currentCluster.cluster_id = node.cluster_id;
@@ -591,7 +606,7 @@
         "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
       var uuid = [];
 
-      for (let i = 0; i < 16; i++) {
+      for (let i = 0; i < 6; i++) {
         uuid[i] = chars[0 | (Math.random() * 50)];
       }
 
@@ -599,13 +614,93 @@
     },
     onIpBlur(ip) {
       this.vrIpForm.virtual_ip = ip;
+    },
+    async getEsClusterNodes() {
+      let rsp = await getDevInfo();
+      let hostIpAddr = "";
+      if (rsp && rsp.success) {
+        hostIpAddr = rsp.data.ip;
+      }
+
+      if (hostIpAddr.length) {
+        rsp = await getEsClusterInfo({ ip: hostIpAddr });
+        if (rsp && rsp.success) {
+          this.esNodes = rsp.data.map(el => {
+            return {
+              // buildDate: "2018-06-11T23:38:03.357887Z",
+              buildDate: el.buildDate.split("T")[0] + " " + el.buildDate.split("T")[1].slice(0, 8),
+              ip: el.ip,
+              name: el.name,
+              nodeType: el.nodeType,
+            }
+          })
+
+          if (this.esNodes.length) {
+            this.sActiveName = 's-third';
+          }
+        }
+      }
+    },
+    createEsCluster() {
+      createESNode().then(rsp => {
+        if (rsp && rsp.success) {
+          this.$message({
+            type: "success",
+            duration: 2000,
+            message: "鍒涘缓鎴愬姛"
+          });
+
+          this.getSearchNodes();
+        } else {
+          this.$message({
+            type: "error",
+            duration: 2000,
+            message: rsp.msg
+          });
+        }
+      }).catch(rsp => {
+        this.$message({
+          type: "error",
+          duration: 2000,
+          message: rsp.msg
+        });
+      })
+    },
+    joinESCluster() {
+      if (!this.esNodeIp.length) {
+        this.$message({
+          type: "error",
+          duration: 2000,
+          message: "璇疯緭鍏ユ纭殑ip鍦板潃"
+        });
+        return;
+      }
+
+      addESNode({ ip: this.esNodeIp, option: this.esNodeType ? "1" : "2" }).then(rsp => {
+        if (rsp && rsp.success) {
+          this.$message({
+            type: "success",
+            duration: 2000,
+            message: "鍔犲叆鎴愬姛"
+          });
+
+          this.getSearchNodes();
+        } else {
+          this.$message({
+            type: "error",
+            duration: 2000,
+            message: rsp.msg
+          });
+        }
+      }).catch(rsp => {
+        this.$message({
+          type: "error",
+          duration: 2000,
+          message: rsp.msg
+        });
+      })
     }
-  },
-  mounted() {
-    this.findCluster();
-    this.getVrrpInfo();
-  },
-  created() { }
+  }
 };
 </script>
 <style lang="scss">

--
Gitblit v1.8.0