cluster.go 6.9 KB

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