123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- package config
- import (
- "bufio"
- "bytes"
- "fmt"
- "os"
- "strings"
- "xg_auto_deploy/internal/models"
- )
- // var ClusterConfig1 models.ClusterConfig
- // func SetClusterFlied(cluster *models.ClusterConfig) (*models.ClusterConfig, error) {
- // }
- func GetClusterConfig(path string) (*models.ClusterConfig, error) {
- clusterConfig := models.ClusterConfig{}
- firstPart, secondPart, err := splitFileByNID(path)
- if err != nil {
- fmt.Println("GetClusterConfig Error:", err)
- return &clusterConfig, err
- }
- SetClusterConfig(firstPart, secondPart, &clusterConfig)
- return &clusterConfig, nil
- }
- // 切分cluster文件 NID上下部分
- func splitFileByNID(filename string) (string, string, error) {
- file, err := os.Open(filename)
- if err != nil {
- return "", "", err
- }
- defer file.Close()
- scanner := bufio.NewScanner(file)
- var firstPart, secondPart string
- foundNID := false
- for scanner.Scan() {
- line := scanner.Text()
- if !foundNID {
- if strings.Contains(line, "NID") && (strings.Index(line, "NID") == 0 || line[strings.Index(line, "NID")-1] == ' ') {
- foundNID = true
- } else {
- firstPart += line + "\n"
- }
- }
- if foundNID {
- secondPart += line + "\n"
- }
- }
- if err := scanner.Err(); err != nil {
- return "", "", err
- }
- return firstPart, secondPart, nil
- }
- // 根据cluster文件 NID 上下部分分别设置ClusterConfig的各个字段
- func SetClusterConfig(firstPart string, secondPart string, clusterConfig *models.ClusterConfig) {
- var clusterfirstPart models.ClusterfirstPart
- // 按空格分割字符串
- parts := strings.Split(firstPart, " ")
- // 遍历分割后的部分
- for _, part := range parts {
- // 寻找等号的下标
- eqIndex := strings.Index(part, "=")
- if eqIndex == -1 {
- continue
- }
- // 获取key和value
- key := part[:eqIndex]
- value := part[eqIndex+1:]
- setFieldValue(&clusterfirstPart, key, value)
- }
- clusterConfig.FirstPart = clusterfirstPart
- // 按行分割字符串
- lines := strings.Split(secondPart, "\n")
- // 遍历每一行
- for _, line := range lines {
- // 去除末尾的分号和空格
- line = strings.TrimSpace(strings.TrimSuffix(line, ";"))
- // 如果行为空,则停止读取
- if line == "" {
- break
- }
- // 按空格分割行
- parts := strings.Split(line, " ")
- node := models.ClustersecondPart{}
- // 遍历分割后的部分
- for _, part := range parts {
- // 寻找等号的下标
- eqIndex := strings.Index(part, "=")
- if eqIndex == -1 {
- continue
- }
- // 获取key和value
- key := part[:eqIndex]
- value := part[eqIndex+1:]
- setFieldValue(&node, key, value)
- }
- clusterConfig.SecondParts = append(clusterConfig.SecondParts, node)
- }
- }
- // 设置字段的值
- func setFieldValue(target interface{}, key string, value string) {
- switch t := target.(type) {
- case *models.ClusterfirstPart:
- switch key {
- case "#MAX_NODES":
- t.MaxNodes = value
- case "MASTER_GRPS":
- t.MasterGrps = value
- case "PROTOCOL":
- t.Protocol = strings.Trim(value, "'")
- case "MSG_PORT_NUM":
- t.MsgPortNum = value
- case "MAX_SEND_WIN":
- t.MaxSendWin = value
- case "MSG_HAVE_CRC":
- t.MsgHaveCRC = value
- case "MERGE_SMALL_MSG":
- t.MergeSmallMsg = value
- case "MSG_SIZE":
- t.MsgSize = value
- case "TIMEOUT":
- t.Timeout = value
- case "RPC_WINDOW":
- t.RPCWindow = value
- case "EJE_WINDOW":
- t.EJEWindow = value
- case "MAX_SHAKE_TIME":
- t.MaxShakeTime = value
- case "MY_NID":
- t.MyNID = value
- case "CHECK_RACK":
- t.CheckRack = value
- }
- case *models.ClustersecondPart:
- // 根据key设置对应字段的值
- switch key {
- case "NID":
- t.NID = value
- case "RACK":
- t.RACK = value
- case "PORTS":
- t.PORTS = value
- case "ROLE":
- t.ROLE = value
- case "LPU":
- t.LPU = value
- case "STORE_WEIGHT":
- t.StoreWeight = value
- case "STATE":
- t.STATE = value
- }
- }
- }
- func SaveClusterConfigBuffer(clusterConfig *models.ClusterConfig, MyNID string) *bytes.Buffer {
- str := fmt.Sprintf(`#MAX_NODES=%s MASTER_GRPS=%s PROTOCOL='%s' MSG_PORT_NUM=%s MAX_SEND_WIN=%s
- MSG_HAVE_CRC=%s MERGE_SMALL_MSG=%s MSG_SIZE=%s TIMEOUT=%s RPC_WINDOW=%s
- EJE_WINDOW=%s MAX_SHAKE_TIME=%s MY_NID=%s CHECK_RACK=%s
- `, clusterConfig.FirstPart.MaxNodes, clusterConfig.FirstPart.MasterGrps,
- clusterConfig.FirstPart.Protocol, clusterConfig.FirstPart.MsgPortNum, clusterConfig.FirstPart.MaxSendWin,
- clusterConfig.FirstPart.MsgHaveCRC, clusterConfig.FirstPart.MergeSmallMsg, clusterConfig.FirstPart.MsgSize,
- clusterConfig.FirstPart.Timeout, clusterConfig.FirstPart.RPCWindow, clusterConfig.FirstPart.EJEWindow,
- clusterConfig.FirstPart.MaxShakeTime, MyNID, clusterConfig.FirstPart.CheckRack)
- for _, v := range clusterConfig.SecondParts {
- str += fmt.Sprintf(`NID=%s RACK=%s PORTS='%s' ROLE='%s' LPU=%s STORE_WEIGHT=%s STATE=%s;
- `, v.NID, v.RACK, v.PORTS, v.ROLE, v.LPU, v.StoreWeight, v.STATE)
- }
- buffer := bytes.NewBufferString(str)
- //fmt.Println("File created successfully.")
- return buffer
- }
- // func SaveClusterConfig(clusterConfig *models.ClusterConfig, MyNID string) string {
- // str := fmt.Sprintf(`#MAX_NODES=%s MASTER_GRPS=%s PROTOCOL='%s' MSG_PORT_NUM=%s MAX_SEND_WIN=%s
- // MSG_HAVE_CRC=%s MERGE_SMALL_MSG=%s MSG_SIZE=%s TIMEOUT=%s RPC_WINDOW=%s
- // EJE_WINDOW=%s MAX_SHAKE_TIME=%s MY_NID=%s CHECK_RACK=%s
- // `, clusterConfig.MaxNodes, clusterConfig.MasterGrps,
- // clusterConfig.Protocol, clusterConfig.MsgPortNum, clusterConfig.MaxSendWin,
- // clusterConfig.MsgHaveCRC, clusterConfig.MergeSmallMsg, clusterConfig.MsgSize,
- // clusterConfig.Timeout, clusterConfig.RPCWindow, clusterConfig.EJEWindow,
- // clusterConfig.MaxShakeTime, MyNID, clusterConfig.CheckRack)
- // for _, v := range clusterConfig.Nodes {
- // str += fmt.Sprintf(`NID=%s RACK=%s PORTS='%s' ROLE='%s' LPU=%s STORE_WEIGHT=%s STATE=%s;
- // `, v.NID, v.RACK, v.PORTS, v.ROLE, v.LPU, v.StoreWeight, v.STATE)
- // }
- // // 生成随机数种子
- // rand.Seed(time.Now().UnixNano())
- // // 生成随机值作为后缀
- // randomValue := rand.Intn(10000)
- // // 检查目录是否存在
- // _, err := os.Stat("file")
- // if err != nil {
- // if os.IsNotExist(err) {
- // // 创建目录
- // err = os.MkdirAll("file", os.ModePerm)
- // if err != nil {
- // fmt.Println("Error creating folder:", err)
- // os.Exit(0)
- // }
- // fmt.Printf("Folder '%s' created successfully.\n", "logs")
- // os.Exit(0)
- // } else {
- // fmt.Println("Error checking folder:", err)
- // os.Exit(0)
- // }
- // }
- // foldername := ".clusterTemp"
- // // 构建带有随机值的文件名
- // foldername = fmt.Sprintf("./file/%s_%d", foldername, randomValue)
- // err = os.Mkdir(foldername, 0755)
- // if err != nil {
- // log.Fatal("无法创建文件夹:", err)
- // os.Exit(0)
- // }
- // filename := fmt.Sprintf("%s/cluster.ini", foldername)
- // err = os.WriteFile(filename, []byte(str), 0644)
- // if err != nil {
- // log.Fatal(err)
- // }
- // //fmt.Println("File created successfully.")
- // return filename
- // }
|