cluster.go 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. package config
  2. import (
  3. "bufio"
  4. "bytes"
  5. "fmt"
  6. "os"
  7. "strings"
  8. "xg_auto_deploy/internal/models"
  9. )
  10. // var ClusterConfig1 models.ClusterConfig
  11. // func SetClusterFlied(cluster *models.ClusterConfig) (*models.ClusterConfig, error) {
  12. // }
  13. func GetClusterConfig(path string) (*models.ClusterConfig, error) {
  14. clusterConfig := models.ClusterConfig{}
  15. firstPart, secondPart, err := splitFileByNID(path)
  16. if err != nil {
  17. fmt.Println("GetClusterConfig Error:", err)
  18. return &clusterConfig, err
  19. }
  20. SetClusterConfig(firstPart, secondPart, &clusterConfig)
  21. return &clusterConfig, nil
  22. }
  23. // 切分cluster文件 NID上下部分
  24. func splitFileByNID(filename string) (string, string, error) {
  25. file, err := os.Open(filename)
  26. if err != nil {
  27. return "", "", err
  28. }
  29. defer file.Close()
  30. scanner := bufio.NewScanner(file)
  31. var firstPart, secondPart string
  32. foundNID := false
  33. for scanner.Scan() {
  34. line := scanner.Text()
  35. if !foundNID {
  36. if strings.Contains(line, "NID") && (strings.Index(line, "NID") == 0 || line[strings.Index(line, "NID")-1] == ' ') {
  37. foundNID = true
  38. } else {
  39. firstPart += line + "\n"
  40. }
  41. }
  42. if foundNID {
  43. secondPart += line + "\n"
  44. }
  45. }
  46. if err := scanner.Err(); err != nil {
  47. return "", "", err
  48. }
  49. return firstPart, secondPart, nil
  50. }
  51. // 根据cluster文件 NID 上下部分分别设置ClusterConfig的各个字段
  52. func SetClusterConfig(firstPart string, secondPart string, clusterConfig *models.ClusterConfig) {
  53. var clusterfirstPart models.ClusterfirstPart
  54. // 按空格分割字符串
  55. parts := strings.Split(firstPart, " ")
  56. // 遍历分割后的部分
  57. for _, part := range parts {
  58. // 寻找等号的下标
  59. eqIndex := strings.Index(part, "=")
  60. if eqIndex == -1 {
  61. continue
  62. }
  63. // 获取key和value
  64. key := part[:eqIndex]
  65. value := part[eqIndex+1:]
  66. setFieldValue(&clusterfirstPart, key, value)
  67. }
  68. clusterConfig.FirstPart = clusterfirstPart
  69. // 按行分割字符串
  70. lines := strings.Split(secondPart, "\n")
  71. // 遍历每一行
  72. for _, line := range lines {
  73. // 去除末尾的分号和空格
  74. line = strings.TrimSpace(strings.TrimSuffix(line, ";"))
  75. // 如果行为空,则停止读取
  76. if line == "" {
  77. break
  78. }
  79. // 按空格分割行
  80. parts := strings.Split(line, " ")
  81. node := models.ClustersecondPart{}
  82. // 遍历分割后的部分
  83. for _, part := range parts {
  84. // 寻找等号的下标
  85. eqIndex := strings.Index(part, "=")
  86. if eqIndex == -1 {
  87. continue
  88. }
  89. // 获取key和value
  90. key := part[:eqIndex]
  91. value := part[eqIndex+1:]
  92. setFieldValue(&node, key, value)
  93. }
  94. clusterConfig.SecondParts = append(clusterConfig.SecondParts, node)
  95. }
  96. }
  97. // 设置字段的值
  98. func setFieldValue(target interface{}, key string, value string) {
  99. switch t := target.(type) {
  100. case *models.ClusterfirstPart:
  101. switch key {
  102. case "#MAX_NODES":
  103. t.MaxNodes = value
  104. case "MASTER_GRPS":
  105. t.MasterGrps = value
  106. case "PROTOCOL":
  107. t.Protocol = strings.Trim(value, "'")
  108. case "MSG_PORT_NUM":
  109. t.MsgPortNum = value
  110. case "MAX_SEND_WIN":
  111. t.MaxSendWin = value
  112. case "MSG_HAVE_CRC":
  113. t.MsgHaveCRC = value
  114. case "MERGE_SMALL_MSG":
  115. t.MergeSmallMsg = value
  116. case "MSG_SIZE":
  117. t.MsgSize = value
  118. case "TIMEOUT":
  119. t.Timeout = value
  120. case "RPC_WINDOW":
  121. t.RPCWindow = value
  122. case "EJE_WINDOW":
  123. t.EJEWindow = value
  124. case "MAX_SHAKE_TIME":
  125. t.MaxShakeTime = value
  126. case "MY_NID":
  127. t.MyNID = value
  128. case "CHECK_RACK":
  129. t.CheckRack = value
  130. }
  131. case *models.ClustersecondPart:
  132. // 根据key设置对应字段的值
  133. switch key {
  134. case "NID":
  135. t.NID = value
  136. case "RACK":
  137. t.RACK = value
  138. case "PORTS":
  139. t.PORTS = value
  140. case "ROLE":
  141. t.ROLE = value
  142. case "LPU":
  143. t.LPU = value
  144. case "STORE_WEIGHT":
  145. t.StoreWeight = value
  146. case "STATE":
  147. t.STATE = value
  148. }
  149. }
  150. }
  151. func SaveClusterConfigBuffer(clusterConfig *models.ClusterConfig, MyNID string) *bytes.Buffer {
  152. str := fmt.Sprintf(`#MAX_NODES=%s MASTER_GRPS=%s PROTOCOL='%s' MSG_PORT_NUM=%s MAX_SEND_WIN=%s
  153. MSG_HAVE_CRC=%s MERGE_SMALL_MSG=%s MSG_SIZE=%s TIMEOUT=%s RPC_WINDOW=%s
  154. EJE_WINDOW=%s MAX_SHAKE_TIME=%s MY_NID=%s CHECK_RACK=%s
  155. `, clusterConfig.FirstPart.MaxNodes, clusterConfig.FirstPart.MasterGrps,
  156. clusterConfig.FirstPart.Protocol, clusterConfig.FirstPart.MsgPortNum, clusterConfig.FirstPart.MaxSendWin,
  157. clusterConfig.FirstPart.MsgHaveCRC, clusterConfig.FirstPart.MergeSmallMsg, clusterConfig.FirstPart.MsgSize,
  158. clusterConfig.FirstPart.Timeout, clusterConfig.FirstPart.RPCWindow, clusterConfig.FirstPart.EJEWindow,
  159. clusterConfig.FirstPart.MaxShakeTime, MyNID, clusterConfig.FirstPart.CheckRack)
  160. for _, v := range clusterConfig.SecondParts {
  161. str += fmt.Sprintf(`NID=%s RACK=%s PORTS='%s' ROLE='%s' LPU=%s STORE_WEIGHT=%s STATE=%s;
  162. `, v.NID, v.RACK, v.PORTS, v.ROLE, v.LPU, v.StoreWeight, v.STATE)
  163. }
  164. buffer := bytes.NewBufferString(str)
  165. //fmt.Println("File created successfully.")
  166. return buffer
  167. }
  168. // func SaveClusterConfig(clusterConfig *models.ClusterConfig, MyNID string) string {
  169. // str := fmt.Sprintf(`#MAX_NODES=%s MASTER_GRPS=%s PROTOCOL='%s' MSG_PORT_NUM=%s MAX_SEND_WIN=%s
  170. // MSG_HAVE_CRC=%s MERGE_SMALL_MSG=%s MSG_SIZE=%s TIMEOUT=%s RPC_WINDOW=%s
  171. // EJE_WINDOW=%s MAX_SHAKE_TIME=%s MY_NID=%s CHECK_RACK=%s
  172. // `, clusterConfig.MaxNodes, clusterConfig.MasterGrps,
  173. // clusterConfig.Protocol, clusterConfig.MsgPortNum, clusterConfig.MaxSendWin,
  174. // clusterConfig.MsgHaveCRC, clusterConfig.MergeSmallMsg, clusterConfig.MsgSize,
  175. // clusterConfig.Timeout, clusterConfig.RPCWindow, clusterConfig.EJEWindow,
  176. // clusterConfig.MaxShakeTime, MyNID, clusterConfig.CheckRack)
  177. // for _, v := range clusterConfig.Nodes {
  178. // str += fmt.Sprintf(`NID=%s RACK=%s PORTS='%s' ROLE='%s' LPU=%s STORE_WEIGHT=%s STATE=%s;
  179. // `, v.NID, v.RACK, v.PORTS, v.ROLE, v.LPU, v.StoreWeight, v.STATE)
  180. // }
  181. // // 生成随机数种子
  182. // rand.Seed(time.Now().UnixNano())
  183. // // 生成随机值作为后缀
  184. // randomValue := rand.Intn(10000)
  185. // // 检查目录是否存在
  186. // _, err := os.Stat("file")
  187. // if err != nil {
  188. // if os.IsNotExist(err) {
  189. // // 创建目录
  190. // err = os.MkdirAll("file", os.ModePerm)
  191. // if err != nil {
  192. // fmt.Println("Error creating folder:", err)
  193. // os.Exit(0)
  194. // }
  195. // fmt.Printf("Folder '%s' created successfully.\n", "logs")
  196. // os.Exit(0)
  197. // } else {
  198. // fmt.Println("Error checking folder:", err)
  199. // os.Exit(0)
  200. // }
  201. // }
  202. // foldername := ".clusterTemp"
  203. // // 构建带有随机值的文件名
  204. // foldername = fmt.Sprintf("./file/%s_%d", foldername, randomValue)
  205. // err = os.Mkdir(foldername, 0755)
  206. // if err != nil {
  207. // log.Fatal("无法创建文件夹:", err)
  208. // os.Exit(0)
  209. // }
  210. // filename := fmt.Sprintf("%s/cluster.ini", foldername)
  211. // err = os.WriteFile(filename, []byte(str), 0644)
  212. // if err != nil {
  213. // log.Fatal(err)
  214. // }
  215. // //fmt.Println("File created successfully.")
  216. // return filename
  217. // }