Initial implementation of garage.AdminClient
This commit is contained in:
parent
eba9b23e61
commit
7a25e1b6e6
84
go-workspace/src/garage/admin_client.go
Normal file
84
go-workspace/src/garage/admin_client.go
Normal file
@ -0,0 +1,84 @@
|
||||
package garage
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// AdminClient is a helper type for performing actions against the garage admin
|
||||
// interface.
|
||||
type AdminClient struct {
|
||||
c *http.Client
|
||||
addr string
|
||||
adminToken string
|
||||
}
|
||||
|
||||
// NewAdminClient initializes and returns an AdminClient which will use the
|
||||
// given address and adminToken for all requests made.
|
||||
func NewAdminClient(addr, adminToken string) *AdminClient {
|
||||
return &AdminClient{
|
||||
c: &http.Client{
|
||||
Transport: http.DefaultTransport.(*http.Transport).Clone(),
|
||||
},
|
||||
addr: addr,
|
||||
adminToken: adminToken,
|
||||
}
|
||||
}
|
||||
|
||||
// Do performs an HTTP request with the given method (GET, POST) and path, and
|
||||
// using the json marshaling of the given body as the request body (unless body
|
||||
// is nil). It will JSON unmarshal the response into rcv, unless rcv is nil.
|
||||
func (c *AdminClient) Do(
|
||||
ctx context.Context, rcv interface{}, method, path string, body interface{},
|
||||
) error {
|
||||
|
||||
var bodyR io.Reader
|
||||
|
||||
if body != nil {
|
||||
bodyBuf := new(bytes.Buffer)
|
||||
bodyR = bodyBuf
|
||||
|
||||
if err := json.NewEncoder(bodyBuf).Encode(body); err != nil {
|
||||
return fmt.Errorf("json marshaling body: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
urlStr := fmt.Sprintf("http://%s%s", c.addr, path)
|
||||
|
||||
req, err := http.NewRequestWithContext(ctx, method, urlStr, bodyR)
|
||||
if err != nil {
|
||||
return fmt.Errorf("initializing request: %w", err)
|
||||
}
|
||||
|
||||
req.Header.Set("Authorization", "Bearer "+c.adminToken)
|
||||
|
||||
res, err := c.c.Do(req)
|
||||
if err != nil {
|
||||
return fmt.Errorf("performing http request: %w", err)
|
||||
}
|
||||
|
||||
defer res.Body.Close()
|
||||
|
||||
if res.StatusCode != 200 {
|
||||
return fmt.Errorf("unexpected %s response returned", res.Status)
|
||||
}
|
||||
|
||||
if rcv == nil {
|
||||
|
||||
if _, err := io.Copy(io.Discard, res.Body); err != nil {
|
||||
return fmt.Errorf("discarding response body: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
if err := json.NewDecoder(res.Body).Decode(rcv); err != nil {
|
||||
return fmt.Errorf("decoding json response body: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
Loading…
Reference in New Issue
Block a user