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  }