github.com/hyperion-hyn/go-ethereum@v2.4.0+incompatible/raft/api.go (about) 1 package raft 2 3 type RaftNodeInfo struct { 4 ClusterSize int `json:"clusterSize"` 5 Role string `json:"role"` 6 Address *Address `json:"address"` 7 PeerAddresses []*Address `json:"peerAddresses"` 8 RemovedPeerIds []uint16 `json:"removedPeerIds"` 9 AppliedIndex uint64 `json:"appliedIndex"` 10 SnapshotIndex uint64 `json:"snapshotIndex"` 11 } 12 13 type PublicRaftAPI struct { 14 raftService *RaftService 15 } 16 17 func NewPublicRaftAPI(raftService *RaftService) *PublicRaftAPI { 18 return &PublicRaftAPI{raftService} 19 } 20 21 func (s *PublicRaftAPI) Role() string { 22 return s.raftService.raftProtocolManager.NodeInfo().Role 23 } 24 25 func (s *PublicRaftAPI) AddPeer(enodeId string) (uint16, error) { 26 return s.raftService.raftProtocolManager.ProposeNewPeer(enodeId, false) 27 } 28 29 func (s *PublicRaftAPI) AddLearner(enodeId string) (uint16, error) { 30 return s.raftService.raftProtocolManager.ProposeNewPeer(enodeId, true) 31 } 32 33 func (s *PublicRaftAPI) PromoteToPeer(raftId uint16) (bool, error) { 34 return s.raftService.raftProtocolManager.PromoteToPeer(raftId) 35 } 36 37 func (s *PublicRaftAPI) RemovePeer(raftId uint16) error { 38 return s.raftService.raftProtocolManager.ProposePeerRemoval(raftId) 39 } 40 41 func (s *PublicRaftAPI) Leader() (string, error) { 42 43 addr, err := s.raftService.raftProtocolManager.LeaderAddress() 44 if err != nil { 45 return "", err 46 } 47 return addr.NodeId.String(), nil 48 } 49 50 func (s *PublicRaftAPI) Cluster() ([]ClusterInfo, error) { 51 nodeInfo := s.raftService.raftProtocolManager.NodeInfo() 52 if nodeInfo.Role == "" { 53 return []ClusterInfo{}, nil 54 } 55 leaderAddr, err := s.raftService.raftProtocolManager.LeaderAddress() 56 if err != nil { 57 if err == errNoLeaderElected && s.Role() == "" { 58 return []ClusterInfo{}, nil 59 } 60 return []ClusterInfo{}, err 61 } 62 peerAddresses := append(nodeInfo.PeerAddresses, nodeInfo.Address) 63 clustInfo := make([]ClusterInfo, len(peerAddresses)) 64 for i, a := range peerAddresses { 65 role := "" 66 if a.RaftId == leaderAddr.RaftId { 67 role = "minter" 68 } else if s.raftService.raftProtocolManager.isLearner(a.RaftId) { 69 role = "learner" 70 } else if s.raftService.raftProtocolManager.isVerifier(a.RaftId) { 71 role = "verifier" 72 } 73 clustInfo[i] = ClusterInfo{*a, role} 74 } 75 return clustInfo, nil 76 } 77 78 func (s *PublicRaftAPI) GetRaftId(enodeId string) (uint16, error) { 79 return s.raftService.raftProtocolManager.FetchRaftId(enodeId) 80 }