ParseCluster will parse the cluster string into cluster topology.
(clusterStr string)
| 252 | |
| 253 | // ParseCluster will parse the cluster string into cluster topology. |
| 254 | func ParseCluster(clusterStr string) (*Cluster, error) { |
| 255 | if len(clusterStr) == 0 { |
| 256 | return nil, errors.New("cluster nodes string error") |
| 257 | } |
| 258 | nodeStrings := strings.Split(clusterStr, "\n") |
| 259 | if len(nodeStrings) == 0 { |
| 260 | return nil, errors.New("cluster nodes string parser error") |
| 261 | } |
| 262 | |
| 263 | var clusterVer int64 = -1 |
| 264 | var shards Shards |
| 265 | slaveNodes := make(map[string][]Node) |
| 266 | for _, nodeString := range nodeStrings { |
| 267 | fields := strings.Split(nodeString, " ") |
| 268 | if len(fields) < 7 { |
| 269 | return nil, fmt.Errorf("require at least 7 fields, node info[%s]", nodeString) |
| 270 | } |
| 271 | node := &ClusterNode{ |
| 272 | id: fields[0], |
| 273 | addr: strings.Split(fields[1], "@")[0], |
| 274 | } |
| 275 | |
| 276 | if strings.Contains(fields[2], ",") { |
| 277 | node.role = strings.Split(fields[2], ",")[1] |
| 278 | } else { |
| 279 | node.role = fields[2] |
| 280 | } |
| 281 | |
| 282 | var err error |
| 283 | clusterVer, err = strconv.ParseInt(fields[6], 10, 64) |
| 284 | if err != nil { |
| 285 | return nil, fmt.Errorf("node version error, node info[%q]", nodeString) |
| 286 | } |
| 287 | |
| 288 | if node.role == RoleMaster { |
| 289 | shard := NewShard() |
| 290 | shard.Nodes = append(shard.Nodes, node) |
| 291 | // remain fields are slot ranges |
| 292 | for i := 8; i < len(fields); i++ { |
| 293 | slotRange, err := ParseSlotRange(fields[i]) |
| 294 | if err != nil { |
| 295 | return nil, fmt.Errorf("parse slots error for node[%s]: %w", nodeString, err) |
| 296 | } |
| 297 | shard.SlotRanges = append(shard.SlotRanges, *slotRange) |
| 298 | } |
| 299 | shards = append(shards, shard) |
| 300 | } else if node.role == RoleSlave { |
| 301 | slaveNodes[fields[3]] = append(slaveNodes[fields[3]], node) |
| 302 | } else { |
| 303 | return nil, fmt.Errorf("node role error, node info[%q]", nodeString) |
| 304 | } |
| 305 | } |
| 306 | if clusterVer == -1 { |
| 307 | return nil, fmt.Errorf("no cluster version, cluster info[%q]", clusterStr) |
| 308 | } |
| 309 | sort.Sort(shards) |
| 310 | for i := 0; i < len(shards); i++ { |
| 311 | masterNode := shards[i].Nodes[0] |