in server/api/raft.go [70:110]
func (handler *RaftHandler) UpdatePeer(c *gin.Context) {
var req MemberRequest
if err := c.BindJSON(&req); err != nil {
helper.ResponseBadRequest(c, err)
return
}
if err := req.validate(); err != nil {
helper.ResponseBadRequest(c, err)
return
}
raftNode, _ := c.MustGet(consts.ContextKeyRaftNode).(*raft.Node)
peers := raftNode.ListPeers()
var err error
if req.Operation == OperationAdd {
for _, peer := range peers {
if peer == req.Peer {
helper.ResponseError(c, fmt.Errorf("peer '%s' already exists", req.Peer))
return
}
}
err = raftNode.AddPeer(c, req.ID, req.Peer)
} else {
if _, ok := peers[req.ID]; !ok {
helper.ResponseBadRequest(c, errors.New("peer not exists"))
return
}
if len(peers) == 1 {
helper.ResponseBadRequest(c, errors.New("can't remove the last peer"))
return
}
err = raftNode.RemovePeer(c, req.ID)
}
if err != nil {
helper.ResponseError(c, err)
} else {
logger.Get().With(zap.Any("request", req)).Info("Update peer success")
helper.ResponseOK(c, nil)
}
}