From f541528a95fd0a8a68c4729a577ffd04b49231ee Mon Sep 17 00:00:00 2001
From: sunty <1172534965@qq.com>
Date: 星期三, 15 四月 2020 20:18:14 +0800
Subject: [PATCH] fix peers ip array

---
 controllers/swfsControllers.go |  299 ++++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 222 insertions(+), 77 deletions(-)

diff --git a/controllers/swfsControllers.go b/controllers/swfsControllers.go
index 17d0b7b..cb6454c 100644
--- a/controllers/swfsControllers.go
+++ b/controllers/swfsControllers.go
@@ -1,12 +1,34 @@
 package controllers
 
 import (
+	"encoding/json"
 	"fmt"
 	"github.com/gin-gonic/gin"
+	"io/ioutil"
+	"net/http"
+	"strconv"
 	"strings"
-	"test/config"
-	"test/util"
+	"swfs/code"
+	"swfs/config"
+	"swfs/util"
+	"sync"
 	"time"
+)
+
+const (
+	StartServerScript = "seaweedfs_start.sh"
+	StopServerScript  = "seaweedfs_stop.sh"
+	//浣滀负 volume 鍚姩
+	StartScriptAsVolume = "1"
+	//浣滀负 master 鍚姩
+	StartScriptAsMaster = "2"
+	//浣滀负 master + volume 鍚姩
+	StartScriptAsMaVo = "3"
+	//鍚姩椤瑰弬鏁板ご
+	Option = "option="
+	//master鍒楄〃椤瑰弬鏁板ご
+	Peer = "peers="
+	//StartScriptAsFiler	= "option=4"
 )
 
 type SeaweedfsController struct{}
@@ -15,81 +37,229 @@
 	Role string `json:"role"`
 }
 
-//淇敼
 func (sc *SeaweedfsController) UpdateSWFSServiceController(c *gin.Context) {
-	oldPeers := GetOldPeers()
-	newPeers := GetNewPeers()
-	UpdatePeers(oldPeers, newPeers)
+	ReplaceLineContentBySearch(GetNewPeers(), Peer, config.Server.ScriptPath, StartServerScript)
+	util.ResponseFormat(c, code.Success, config.Server.EsServerIp+"鏇存柊鎴愬姛")
 }
 
+// @Security ApiKeyAuth
+// @Summary 鏂拌妭鐐瑰姞鍏�
+// @Description  鏂拌妭鐐瑰姞鍏�
+// @Accept  json
+// @Produce json
+// @Tags swfs
+// @Param obj body SWFSInfo true "鍔犲叆瑙掕壊鍙傛暟"
+// @Success 200 {string} json "{"code":200, msg:"", success:true}"
+// @Failure 500 {string} json "{"code":500, msg:"", success:false}"
+// @Router /node/api-v/swfs/addSWFSNode [POST]
 func (sc *SeaweedfsController) AddSWFSNodeController(c *gin.Context) {
 	var body SWFSInfo
 	c.BindJSON(&body)
 	role := body.Role
 	if role == "master" {
 		AsMaster()
+		util.ResponseFormat(c, code.AddSuccess, "鍔犲叆鑺傜偣鎴愬姛")
+		return
 	} else if role == "volume" {
-		AsVolume()
+		status := AsVolume()
+		if status == true {
+			util.ResponseFormat(c, code.AddSuccess, "鍔犲叆鑺傜偣鎴愬姛")
+			return
+		} else {
+			util.ResponseFormat(c, code.AddClusterInfoErr, "褰撳墠杩樻病鏈変富鑺傜偣")
+			return
+		}
+	} else if role == "master+volume" {
+		AsMaVo()
+		util.ResponseFormat(c, code.AddSuccess, "鍔犲叆鑺傜偣鎴愬姛")
 	} else {
-
+		util.ResponseFormat(c, code.RequestParamError, "閫夋嫨鑺傜偣绫诲瀷閿欒")
 		return
 	}
 
 }
 
-func (sc *SeaweedfsController) RestartMaster(c *gin.Context) {
-	end := "sh /opt/vasystem/script/seaweedfs_stop.sh"
-	start := "sh /opt/vasystem/script/seaweedfs_start.sh"
-	util.RunScript(end)
-	util.RunScript(start)
+func AsMaVo() {
+	AsMaster()
+	ReplaceLineContentBySearch(Option+StartScriptAsMaVo, Option, config.Server.ScriptPath, StartServerScript)
 }
 
-func RequestMasterNodesOperation() {
-	nowPeers := GetNowPeersList()
-	coreThread := len(nowPeers)/100 + 1
-	masterIp := make([]string, 0)
-	for i, val := range nowPeers {
-		ip := val.(string)
-		if (i+1)%coreThread == 0 {
-			masterIp = append(masterIp, strings.Split(ip, ":")[0])
-			for _, val := range masterIp {
-				RestartOrtherMaster(val)
-				masterIp = append(masterIp[:0], masterIp[1:]...)
-			}
-			time.Sleep(time.Second * 2)
-		} else {
-			masterIp = append(masterIp, strings.Split(ip, ":")[0])
-			if len(nowPeers) == i+1 {
-				for _, val := range masterIp {
-					RestartOrtherMaster(val)
-				}
-				break
-			}
-			continue
-		}
+func (sc *SeaweedfsController) RoleOfVolumeToMasterController(c *gin.Context) {
+	AsMaster()
+	ReplaceLineContentBySearch(Option+StartScriptAsMaVo, Option, config.Server.ScriptPath, StartServerScript)
+}
+
+func (sc *SeaweedfsController) RestartServerController(c *gin.Context) {
+	StopServer(config.Server.ScriptPath)
+	time.Sleep(time.Second * 1)
+	StartServer(config.Server.ScriptPath)
+	//fmt.Println("GetLocalStartupItem: ", GetLocalStartupItem(config.Server.ScriptPath, StartServerScript))
+	result := strings.Split(GetLocalStartupItem(config.Server.ScriptPath, StartServerScript), "=")[1]
+	fmt.Println("result: ", result)
+	util.ResponseFormat(c, code.Success, result)
+}
+
+//鍚姩鏈嶅姟
+func StartServer(scriptPath string) {
+	util.RunScript("sh " + scriptPath + StartServerScript)
+}
+
+//鍋滄鏈嶅姟
+func StopServer(scriptPath string) {
+	util.RunScript("sh " + scriptPath + StopServerScript)
+}
+
+//鏍规嵁鎼滅储鍐呭鏇挎崲鏁磋鍐呭
+func ReplaceLineContentBySearch(replaceContent string, searchContent string, scriptPath string, scriptFile string) {
+	resSearchContent := GetNowLineContent(scriptPath+"/"+scriptFile, searchContent)
+	replaceStr := "sed -ie 's/" + resSearchContent + "/" + replaceContent + "/g' " + scriptPath + "/" + scriptFile
+	util.RunScript(replaceStr)
+}
+
+//鏇存柊鎵�鏈夎妭鐐圭殑鑴氭湰鍙傛暟
+func UpdateAllNodesScriptArgument(peersIp []string) {
+	for _, ip := range peersIp {
+		fmt.Println("ip: ", ip)
+		url := "http://" + ip + ":7020/node/api-v/swfs/updateSWFSService"
+		fmt.Println("url", url)
+		http.Get(url)
 	}
 }
 
-func GetOldPeers() string {
-	str := "cat /opt/vasystem/seaweedfs_start.sh | grep peers="
-	peers := strings.Split(util.RunScript(str), "\n")[0]
-	return peers
+//璇锋眰浣滀负涓昏妭鐐规搷浣滄祦绋�
+func RequestMasterNodesOperation(nowPeers []interface{}) {
+	peersIp := make([]string, 0)
+	for _, val := range nowPeers {
+		peersIp = append(peersIp, strings.Split(val.(string), ":")[0])
+	}
+	coreBaseUnit, _ := strconv.Atoi(config.Server.CoreBaseUnit)
+	UpdateAllNodesScriptArgument(peersIp)
+	RestartAllServer(peersIp, coreBaseUnit)
 }
 
-func AsVolume() {
+//閲嶅惎鎵�鏈夎妭鐐规湇鍔″苟楠岃瘉
+func Restart(ip string, timeOut int) {
+	url := "http://" + ip + ":7020/node/api-v/swfs/restartServer"
+	var info interface{}
+	httpRes, _ := http.Get(url)
+	defer httpRes.Body.Close()
+	body, _ := ioutil.ReadAll(httpRes.Body)
+	json.Unmarshal(body, &info)
+	res, ok := info.(map[string]interface{})
+	if !ok {
+		fmt.Println("http response interface can not change map[string]interface{}")
+	}
+	startupItem := res["data"].(string)
+	if httpRes.StatusCode == 200 {
+		startupItem = string(body)
+	}
+	tick := time.Tick(1 * time.Second)
+	for countdown := timeOut; countdown > 0; countdown-- {
+		result := Verification(startupItem, ip)
+		if result == true {
+			break
+		}
+		<-tick
+	}
+}
+
+//楠岃瘉鏈嶅姟鐘舵��
+func Verification(startupItem string, ip string) bool {
+	resStatu := false
+	switch startupItem {
+	case StartScriptAsVolume:
+		verificationVolumeUrl := "http://" + ip + ":6700"
+		_, volume1Err := http.Get(verificationVolumeUrl)
+		if volume1Err == nil {
+			resStatu = true
+		}
+	case StartScriptAsMaster:
+		verificationMasterUrl := "http://" + ip + ":6333"
+		_, masterErr := http.Get(verificationMasterUrl)
+		if masterErr == nil {
+			resStatu = true
+		}
+	case StartScriptAsMaVo:
+		verificationMasterUrl := "http://" + ip + ":6333"
+		verificationVolumeUrl := "http://" + ip + ":6700"
+		_, masterErr := http.Get(verificationMasterUrl)
+		_, volume1Err := http.Get(verificationVolumeUrl)
+		if masterErr == nil && volume1Err == nil {
+			resStatu = true
+		}
+	}
+	return resStatu
+}
+
+//鑾峰彇鏈湴鍚姩椤�
+func GetLocalStartupItem(scriptPath string, scriptFile string) string {
+	startupItem := GetNowLineContent(scriptPath+"/"+scriptFile, Option)
+	fmt.Println("startupItem: ", startupItem)
+	return startupItem
+}
+
+//鏋勫缓閲嶅惎娴佺▼
+func RestartAllServer(peersIp []string, coreBaseUnit int) {
+	coreThread := len(peersIp)/coreBaseUnit + 1
+	masterIp := make([]string, 0)
+	timeOut, _ := strconv.Atoi(config.Server.TimeOut)
+	var waitGroup sync.WaitGroup
+	for i, ip := range peersIp {
+		if (i+1)%coreThread == 0 {
+			masterIp = append(masterIp, strings.Split(ip, ":")[0])
+			for i := 0; i < len(masterIp); i++ {
+				go Restart(masterIp[i], timeOut)
+				waitGroup.Add(1) //姣忓垱寤轰竴涓猤oroutine锛屽氨鎶婁换鍔¢槦鍒椾腑浠诲姟鐨勬暟閲�+1
+			}
+			waitGroup.Wait() //.Wait()杩欓噷浼氬彂鐢熼樆濉烇紝鐩村埌闃熷垪涓墍鏈夌殑浠诲姟缁撴潫灏变細瑙i櫎闃诲
+			masterIp = make([]string, 0)
+		} else {
+			masterIp = append(masterIp, strings.Split(ip, ":")[0])
+			if len(peersIp) == i+1 {
+				var waitGroup sync.WaitGroup
+				for i := 0; i < len(masterIp); i++ {
+					go Restart(masterIp[i], timeOut)
+					waitGroup.Add(1) //姣忓垱寤轰竴涓猤oroutine锛屽氨鎶婁换鍔¢槦鍒椾腑浠诲姟鐨勬暟閲�+1
+				}
+				waitGroup.Wait() //.Wait()杩欓噷浼氬彂鐢熼樆濉烇紝鐩村埌闃熷垪涓墍鏈夌殑浠诲姟缁撴潫灏变細瑙i櫎闃诲
+				masterIp = make([]string, 0)
+				break
+			}
+		}
+		continue
+	}
+}
+
+//鑾峰彇鏌ユ壘鍐呭褰撳墠琛屽唴瀹�
+func GetNowLineContent(filePath string, searchContent string) string {
+	scriptStr := "cat " + filePath + "| grep " + searchContent
+	fmt.Println("scriptStr: ", scriptStr)
+	return strings.Split(util.RunScript(scriptStr), "\n")[0]
+}
+
+//浣滀负鏁版嵁鑺傜偣鍔犲叆
+func AsVolume() bool {
 	nowPeers := GetNowPeersList()
-	fmt.Println(nowPeers)
+	if nowPeers == nil || len(nowPeers) == 0 {
+		return false
+	}
+	ReplaceLineContentBySearch(Option+StartScriptAsVolume, Option, config.Server.ScriptPath, StartServerScript)
+	ReplaceLineContentBySearch(GetNewPeers(), Peer, config.Server.ScriptPath, StartServerScript)
+	StartServer(config.Server.ScriptPath)
+	return true
 }
 
-func AsMaster() {
+//浣滀负涓昏妭鐐瑰姞鍏ワ紙榛樿鍖呭惈鏁版嵁鑺傜偣锛�
+func AsMaster() bool {
+	AddNewMasterToPeers()
 	nowPeers := GetNowPeersList()
-	coreThread := len(nowPeers) / 100
-	fmt.Println(coreThread)
-
+	fmt.Println("nowPeers: ", nowPeers)
+	RequestMasterNodesOperation(nowPeers)
+	return true
 }
 
+//鑾峰彇褰撳墠闆嗙兢鍒楄〃
 func GetNowPeersList() []interface{} {
-
 	getUrl := "http://" + config.Server.EsServerIp + ":" + config.Server.EsServerPort + "/" + config.BasicFS.IndexName + "/_search"
 	getJson := `{
     "query": {
@@ -108,46 +278,21 @@
 
 	buf, _ := util.EsReq("POST", getUrl, []byte(getJson))
 	source, _ := util.Sourcelist(buf)
-	//fmt.Println(source)
 	peers := source[0]["peers"].([]interface{})
 	return peers
 }
 
+//鑾峰彇褰撳墠闆嗙兢鍒楄〃鏍煎紡鍖栦俊鎭�
 func GetNewPeers() string {
-
-	getUrl := "http://" + config.Server.EsServerIp + ":" + config.Server.EsServerPort + "/" + config.BasicFS.IndexName + "/_search"
-	getJson := `{
-    "query": {
-        "bool": {
-            "filter": [
-                {
-                    "term": {
-						"application":"nodeOperation"
-					}
-                }
-            ]
-        }
-    },
-    "size": 1
-}`
-
-	buf, _ := util.EsReq("POST", getUrl, []byte(getJson))
-	source, _ := util.Sourcelist(buf)
-	//fmt.Println(source)
-	peers := source[0]["peers"].([]interface{})
-	fmt.Println(peers)
-	p := "peers=" + strings.Replace(strings.Trim(fmt.Sprint(peers), "[]"), " ", ",", -1)
+	peers := GetNowPeersList()
+	p := Peer + strings.Replace(strings.Trim(fmt.Sprint(peers), "[]"), " ", ",", -1)
 	return p
 }
 
-func UpdatePeers(oldPeers string, newPeers string) {
-	str := "sed -ie 's/" + oldPeers + "/" + newPeers + "/g' /opt/vasystem/seaweedfs_start.sh"
-	util.RunScript(str)
-}
-
+//鍚戦泦缇ゅ姞鍏ユ柊鐨刴aster
 func AddNewMasterToPeers() (result bool) {
 	peer := config.Server.EsServerIp + ":6333"
-	addUrl := "http://" + config.Server.EsServerIp + ":" + config.Server.EsServerPort + "/" + config.BasicFS.IndexName + "/_update_by_query"
+	addUrl := "http://" + config.Server.EsServerIp + ":" + config.Server.EsServerPort + "/" + config.BasicFS.IndexName + "/_update_by_query?refresh=true"
 	addJson := `{
     "script": {
         "lang": "painless",

--
Gitblit v1.8.0