(c *gin.Context)
| 68 | } |
| 69 | |
| 70 | func (handler *RaftHandler) UpdatePeer(c *gin.Context) { |
| 71 | var req MemberRequest |
| 72 | if err := c.BindJSON(&req); err != nil { |
| 73 | helper.ResponseBadRequest(c, err) |
| 74 | return |
| 75 | } |
| 76 | if err := req.validate(); err != nil { |
| 77 | helper.ResponseBadRequest(c, err) |
| 78 | return |
| 79 | } |
| 80 | |
| 81 | raftNode, _ := c.MustGet(consts.ContextKeyRaftNode).(*raft.Node) |
| 82 | peers := raftNode.ListPeers() |
| 83 | |
| 84 | var err error |
| 85 | if req.Operation == OperationAdd { |
| 86 | for _, peer := range peers { |
| 87 | if peer == req.Peer { |
| 88 | helper.ResponseError(c, fmt.Errorf("peer '%s' already exists", req.Peer)) |
| 89 | return |
| 90 | } |
| 91 | } |
| 92 | err = raftNode.AddPeer(c, req.ID, req.Peer) |
| 93 | } else { |
| 94 | if _, ok := peers[req.ID]; !ok { |
| 95 | helper.ResponseBadRequest(c, errors.New("peer not exists")) |
| 96 | return |
| 97 | } |
| 98 | if len(peers) == 1 { |
| 99 | helper.ResponseBadRequest(c, errors.New("can't remove the last peer")) |
| 100 | return |
| 101 | } |
| 102 | err = raftNode.RemovePeer(c, req.ID) |
| 103 | } |
| 104 | if err != nil { |
| 105 | helper.ResponseError(c, err) |
| 106 | } else { |
| 107 | logger.Get().With(zap.Any("request", req)).Info("Update peer success") |
| 108 | helper.ResponseOK(c, nil) |
| 109 | } |
| 110 | } |
no test coverage detected