blob: e902377dd5cac6d98aba5c5acdaa0edcef2e23f7 [file] [log] [blame]
divyadesai81bb7ba2020-03-11 11:45:23 +00001package api
2
3import (
4 "io"
5)
6
7// Snapshot can be used to query the /v1/snapshot endpoint to take snapshots of
8// Consul's internal state and restore snapshots for disaster recovery.
9type Snapshot struct {
10 c *Client
11}
12
13// Snapshot returns a handle that exposes the snapshot endpoints.
14func (c *Client) Snapshot() *Snapshot {
15 return &Snapshot{c}
16}
17
18// Save requests a new snapshot and provides an io.ReadCloser with the snapshot
19// data to save. If this doesn't return an error, then it's the responsibility
20// of the caller to close it. Only a subset of the QueryOptions are supported:
21// Datacenter, AllowStale, and Token.
22func (s *Snapshot) Save(q *QueryOptions) (io.ReadCloser, *QueryMeta, error) {
23 r := s.c.newRequest("GET", "/v1/snapshot")
24 r.setQueryOptions(q)
25
26 rtt, resp, err := requireOK(s.c.doRequest(r))
27 if err != nil {
28 return nil, nil, err
29 }
30
31 qm := &QueryMeta{}
32 parseQueryMeta(resp, qm)
33 qm.RequestTime = rtt
34 return resp.Body, qm, nil
35}
36
37// Restore streams in an existing snapshot and attempts to restore it.
38func (s *Snapshot) Restore(q *WriteOptions, in io.Reader) error {
39 r := s.c.newRequest("PUT", "/v1/snapshot")
40 r.body = in
41 r.setWriteOptions(q)
42 _, _, err := requireOK(s.c.doRequest(r))
43 if err != nil {
44 return err
45 }
46 return nil
47}