1package api
2
3// RaftServer has information about a server in the Raft configuration.
4type RaftServer struct {
5	// ID is the unique ID for the server. These are currently the same
6	// as the address, but they will be changed to a real GUID in a future
7	// release of Consul.
8	ID string
9
10	// Node is the node name of the server, as known by Consul, or this
11	// will be set to "(unknown)" otherwise.
12	Node string
13
14	// Address is the IP:port of the server, used for Raft communications.
15	Address string
16
17	// Leader is true if this server is the current cluster leader.
18	Leader bool
19
20	// Protocol version is the raft protocol version used by the server
21	ProtocolVersion string
22
23	// Voter is true if this server has a vote in the cluster. This might
24	// be false if the server is staging and still coming online, or if
25	// it's a non-voting server, which will be added in a future release of
26	// Consul.
27	Voter bool
28}
29
30// RaftConfiguration is returned when querying for the current Raft configuration.
31type RaftConfiguration struct {
32	// Servers has the list of servers in the Raft configuration.
33	Servers []*RaftServer
34
35	// Index has the Raft index of this configuration.
36	Index uint64
37}
38
39// RaftGetConfiguration is used to query the current Raft peer set.
40func (op *Operator) RaftGetConfiguration(q *QueryOptions) (*RaftConfiguration, error) {
41	r := op.c.newRequest("GET", "/v1/operator/raft/configuration")
42	r.setQueryOptions(q)
43	_, resp, err := requireOK(op.c.doRequest(r))
44	if err != nil {
45		return nil, err
46	}
47	defer closeResponseBody(resp)
48
49	var out RaftConfiguration
50	if err := decodeBody(resp, &out); err != nil {
51		return nil, err
52	}
53	return &out, nil
54}
55
56// RaftRemovePeerByAddress is used to kick a stale peer (one that it in the Raft
57// quorum but no longer known to Serf or the catalog) by address in the form of
58// "IP:port".
59func (op *Operator) RaftRemovePeerByAddress(address string, q *WriteOptions) error {
60	r := op.c.newRequest("DELETE", "/v1/operator/raft/peer")
61	r.setWriteOptions(q)
62
63	r.params.Set("address", address)
64
65	_, resp, err := requireOK(op.c.doRequest(r))
66	if err != nil {
67		return err
68	}
69
70	closeResponseBody(resp)
71	return nil
72}
73
74// RaftRemovePeerByID is used to kick a stale peer (one that it in the Raft
75// quorum but no longer known to Serf or the catalog) by ID.
76func (op *Operator) RaftRemovePeerByID(id string, q *WriteOptions) error {
77	r := op.c.newRequest("DELETE", "/v1/operator/raft/peer")
78	r.setWriteOptions(q)
79
80	r.params.Set("id", id)
81
82	_, resp, err := requireOK(op.c.doRequest(r))
83	if err != nil {
84		return err
85	}
86
87	closeResponseBody(resp)
88	return nil
89}
90