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 |  236 +++++++++++++++++++++++++++++++++++++++--------------------
 1 files changed, 156 insertions(+), 80 deletions(-)

diff --git a/src/pages/settings/components/ClusterManagement.vue b/src/pages/settings/components/ClusterManagement.vue
index 77fa912..76ab639 100644
--- a/src/pages/settings/components/ClusterManagement.vue
+++ b/src/pages/settings/components/ClusterManagement.vue
@@ -4,7 +4,7 @@
       <div class="ui-top-title">瑙嗛鍒嗘瀽闆嗙兢绠$悊</div>
     </div>
     <el-row>
-      <el-col :span="12" >
+      <el-col :span="12">
         <el-tabs v-model="activeName" id="e-alaycluster" v-if="!isHasColony">
           <el-tab-pane label="鍒涘缓闆嗙兢" name="1" :disabled="isHasColony">
             <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="80px">
@@ -133,42 +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-form-item label="IP鍦板潃" style="text-align: left;width: 300px;">
                 <el-input
-                  v-model="clusterip2"
+                  v-model="esNodeIp"
                   placeholder="璇疯緭鍏ラ泦缇ゅ唴浠绘剰IP鍦板潃"
                   size="small"
                   autocomplete="off"
-                >
-                  <el-button
-                    type="text"
-                    slot="suffix"
-                    v-show="!searchDis"
-                    @click="searchColony"
-                  >鎼滅储闆嗙兢</el-button>
-                </el-input>
+                ></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>
@@ -179,7 +183,7 @@
 
 <script>
 import {
-  createColony,
+  createSerfCluster,
   randomPwd,
   search,
   getSearchNodes,
@@ -189,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";
 
@@ -199,7 +211,7 @@
     serfDiagram,
     ipInput
   },
-  data () {
+  data() {
     const checkPwd = (rule, value, callback) => {
       if (!value) {
         return callback(new Error("瀵嗙爜涓嶈兘涓虹┖"));
@@ -221,7 +233,8 @@
       activeName: "1",
       sActiveName: "s-first",
       clusterid: "",
-      clusterip2: "",
+      esNodeIp: "",
+      esNodeType: "",
       clusterpwd2: "",
       sClusterip: "",
       ruleForm: {
@@ -264,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: {},
@@ -294,15 +288,19 @@
       members: []
     };
   },
-  watch: {},
+  mounted() {
+    this.findCluster();
+    this.getVrrpInfo();
+    this.getEsClusterNodes();
+  },
   methods: {
-    cleanValue () {
+    cleanValue() {
       this.members = [];
     },
-    sHandleClick (tab, event) {
+    sHandleClick(tab, event) {
       console.log(tab, event);
     },
-    submitForm (formName) {
+    submitForm(formName) {
       this.$refs[formName].validate(valid => {
         if (valid) {
           //alert("submit!");
@@ -312,7 +310,7 @@
             password: this.ruleForm.clusterpwd,
             //virtualip: this.ruleForm.virtualip
           };
-          this.createColony(json).then(() => {
+          this.createCluster(json).then(() => {
             this.findCluster();
           });
         } else {
@@ -321,8 +319,7 @@
         }
       });
     },
-    saveForm (formName) {
-      debugger
+    saveForm(formName) {
       this.$refs[formName].validate(valid => {
         if (valid) {
           alert("submit!");
@@ -341,7 +338,7 @@
         }
       });
     },
-    join (formName) {
+    join(formName) {
       this.$refs[formName].validate(valid => {
         if (valid) {
           if (Object.keys(this.currentCluster).length === 0) {
@@ -369,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 ? "鎴愬姛" : "澶辫触",
@@ -378,13 +375,13 @@
         type: res.success ? "success" : "error"
       });
     },
-    async randomPwd () {
+    async randomPwd() {
       let res = await randomPwd();
       if (res && res.success) {
         this.ruleForm.clusterpwd = res.data;
       }
     },
-    async searchColony () {
+    async searchColony() {
       this.$refs["joinForm"].validate(valid => {
         if (valid) {
           this.members = [];
@@ -410,7 +407,7 @@
         }
       });
     },
-    async search (json) {
+    async search(json) {
       let res = await search(json);
       if (res && res.success) {
         console.log(res, "鎼滅储闆嗙兢");
@@ -422,7 +419,7 @@
         this.stopSearch();
       }, 10 * 1000);
     },
-    async getSearchNodes () {
+    async getSearchNodes() {
       let res = await getSearchNodes();
       if (res && res.success) {
         let list = res.data.map(i => {
@@ -446,12 +443,12 @@
         });
       }
     },
-    setSchedule () {
+    setSchedule() {
       this.scheduleId = window.setInterval(() => {
         this.getSearchNodes();
       }, 1000);
     },
-    async stopSearch () {
+    async stopSearch() {
       if (!this.loading) {
         return true;
       }
@@ -476,7 +473,7 @@
         // },2000)
       })
     },
-    async findCluster () {
+    async findCluster() {
       let res = await findCluster();
       if (res && res.success) {
         if (res.data && res.data.clusterId) {
@@ -506,7 +503,7 @@
         }
       }
     },
-    getVrrpInfo () {
+    getVrrpInfo() {
       getVrrp().then(res => {
         if (res.success) {
           this.vrIpForm.virtual_ip = res.data.virtual_ip;
@@ -516,7 +513,7 @@
         console.log(e)
       })
     },
-    async updateClusterName () {
+    async updateClusterName() {
       let res = await updateClusterName({
         clusterName: this.mangeForm.colonyName
       });
@@ -526,7 +523,7 @@
         type: res.success ? "success" : "error"
       });
     },
-    async joinCluster (json) {
+    async joinCluster(json) {
       let res = await joinCluster(json);
       if (res.success) {
         this.members = []
@@ -537,7 +534,7 @@
         type: res.success ? "success" : "error"
       });
     },
-    leave () {
+    leave() {
       this.$confirm(`纭畾閫�鍑洪泦缇ゅ悧?`, {
         center: true,
         cancelButtonClass: "comfirm-class-cancle",
@@ -560,8 +557,7 @@
       }).catch(() => { });
 
     },
-    joinNode (event, node) {
-      debugger
+    joinNode(event, node) {
       this.currentCluster.cluster_id = node.cluster_id;
       if (this.activeName === "3") {
         this.manageForm.clustername = node.clusterName;
@@ -605,7 +601,7 @@
         });
       }
     },
-    generatePassword () {
+    generatePassword() {
       var chars =
         "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
       var uuid = [];
@@ -616,15 +612,95 @@
 
       this.ruleForm.clusterpwd = uuid.join("");
     },
-    onIpBlur (ip) {
+    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