5e33428b22
* Always set the Content-Type header when a body is present Closes https://github.com/hashicorp/consul/issues/10011 * Add Changelog entry * Add more Content-Type exceptions * Fix tests
49 lines
1.3 KiB
Go
49 lines
1.3 KiB
Go
package api
|
|
|
|
import (
|
|
"io"
|
|
)
|
|
|
|
// Snapshot can be used to query the /v1/snapshot endpoint to take snapshots of
|
|
// Consul's internal state and restore snapshots for disaster recovery.
|
|
type Snapshot struct {
|
|
c *Client
|
|
}
|
|
|
|
// Snapshot returns a handle that exposes the snapshot endpoints.
|
|
func (c *Client) Snapshot() *Snapshot {
|
|
return &Snapshot{c}
|
|
}
|
|
|
|
// Save requests a new snapshot and provides an io.ReadCloser with the snapshot
|
|
// data to save. If this doesn't return an error, then it's the responsibility
|
|
// of the caller to close it. Only a subset of the QueryOptions are supported:
|
|
// Datacenter, AllowStale, and Token.
|
|
func (s *Snapshot) Save(q *QueryOptions) (io.ReadCloser, *QueryMeta, error) {
|
|
r := s.c.newRequest("GET", "/v1/snapshot")
|
|
r.setQueryOptions(q)
|
|
|
|
rtt, resp, err := requireOK(s.c.doRequest(r))
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
|
|
qm := &QueryMeta{}
|
|
parseQueryMeta(resp, qm)
|
|
qm.RequestTime = rtt
|
|
return resp.Body, qm, nil
|
|
}
|
|
|
|
// Restore streams in an existing snapshot and attempts to restore it.
|
|
func (s *Snapshot) Restore(q *WriteOptions, in io.Reader) error {
|
|
r := s.c.newRequest("PUT", "/v1/snapshot")
|
|
r.body = in
|
|
r.header.Set("Content-Type", "application/octet-stream")
|
|
r.setWriteOptions(q)
|
|
_, _, err := requireOK(s.c.doRequest(r))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|