diff --git a/consul/raft_endpoint.go b/consul/raft_endpoint.go new file mode 100644 index 000000000..96a660201 --- /dev/null +++ b/consul/raft_endpoint.go @@ -0,0 +1,35 @@ +package consul + +import ( + "net" +) + +// Raft endpoint is used to manipulate the Raft subsystem +type Raft struct { + server *Server +} + +func (r *Raft) Apply(args []byte, reply *struct{}) error { + future := r.server.raft.Apply(args, 0) + return future.Error() +} + +func (r *Raft) AddPeer(args string, reply *struct{}) error { + peer, err := net.ResolveTCPAddr("tcp", args) + if err != nil { + r.server.logger.Printf("[ERR] Failed to parse peer: %v", err) + return err + } + future := r.server.raft.AddPeer(peer) + return future.Error() +} + +func (r *Raft) RemovePeer(args string, reply *struct{}) error { + peer, err := net.ResolveTCPAddr("tcp", args) + if err != nil { + r.server.logger.Printf("[ERR] Failed to parse peer: %v", err) + return err + } + future := r.server.raft.AddPeer(peer) + return future.Error() +} diff --git a/consul/server.go b/consul/server.go index 550f6f525..027c58284 100644 --- a/consul/server.go +++ b/consul/server.go @@ -201,6 +201,9 @@ func (s *Server) setupRaft() error { // setupRPC is used to setup the RPC listener func (s *Server) setupRPC() error { + // Register the handlers + s.rpcServer.Register(&Raft{server: s}) + list, err := net.Listen("tcp", s.config.RPCAddr) if err != nil { return err