1package 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.header.Set("Content-Type", "application/octet-stream") 42 r.setWriteOptions(q) 43 _, _, err := requireOK(s.c.doRequest(r)) 44 if err != nil { 45 return err 46 } 47 return nil 48} 49