mirror of https://github.com/hashicorp/consul
141 lines
3.0 KiB
Go
141 lines
3.0 KiB
Go
|
package api
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"io/ioutil"
|
||
|
"net/http"
|
||
|
"net/url"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// Userdatas represents the response of a GET /user_data
|
||
|
type Userdatas struct {
|
||
|
UserData []string `json:"user_data"`
|
||
|
}
|
||
|
|
||
|
// Userdata represents []byte
|
||
|
type Userdata []byte
|
||
|
|
||
|
// GetUserdatas gets list of userdata for a server
|
||
|
func (s *API) GetUserdatas(serverID string, metadata bool) (*Userdatas, error) {
|
||
|
var uri, endpoint string
|
||
|
|
||
|
endpoint = s.computeAPI
|
||
|
if metadata {
|
||
|
uri = "/user_data"
|
||
|
endpoint = MetadataAPI
|
||
|
} else {
|
||
|
uri = fmt.Sprintf("servers/%s/user_data", serverID)
|
||
|
}
|
||
|
|
||
|
resp, err := s.GetResponsePaginate(endpoint, uri, url.Values{})
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
defer resp.Body.Close()
|
||
|
|
||
|
body, err := s.handleHTTPError([]int{http.StatusOK}, resp)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
var userdatas Userdatas
|
||
|
|
||
|
if err = json.Unmarshal(body, &userdatas); err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
return &userdatas, nil
|
||
|
}
|
||
|
|
||
|
func (s *Userdata) String() string {
|
||
|
return string(*s)
|
||
|
}
|
||
|
|
||
|
// GetUserdata gets a specific userdata for a server
|
||
|
func (s *API) GetUserdata(serverID, key string, metadata bool) (*Userdata, error) {
|
||
|
var uri, endpoint string
|
||
|
|
||
|
endpoint = s.computeAPI
|
||
|
if metadata {
|
||
|
uri = fmt.Sprintf("/user_data/%s", key)
|
||
|
endpoint = MetadataAPI
|
||
|
} else {
|
||
|
uri = fmt.Sprintf("servers/%s/user_data/%s", serverID, key)
|
||
|
}
|
||
|
|
||
|
var err error
|
||
|
resp, err := s.GetResponsePaginate(endpoint, uri, url.Values{})
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
defer resp.Body.Close()
|
||
|
|
||
|
if resp.StatusCode != http.StatusOK {
|
||
|
return nil, fmt.Errorf("no such user_data %q (%d)", key, resp.StatusCode)
|
||
|
}
|
||
|
var data Userdata
|
||
|
data, err = ioutil.ReadAll(resp.Body)
|
||
|
return &data, err
|
||
|
}
|
||
|
|
||
|
// PatchUserdata sets a user data
|
||
|
func (s *API) PatchUserdata(serverID, key string, value []byte, metadata bool) error {
|
||
|
var resource, endpoint string
|
||
|
|
||
|
endpoint = s.computeAPI
|
||
|
if metadata {
|
||
|
resource = fmt.Sprintf("/user_data/%s", key)
|
||
|
endpoint = MetadataAPI
|
||
|
} else {
|
||
|
resource = fmt.Sprintf("servers/%s/user_data/%s", serverID, key)
|
||
|
}
|
||
|
|
||
|
uri := fmt.Sprintf("%s/%s", strings.TrimRight(endpoint, "/"), resource)
|
||
|
payload := new(bytes.Buffer)
|
||
|
payload.Write(value)
|
||
|
|
||
|
req, err := http.NewRequest("PATCH", uri, payload)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
req.Header.Set("X-Auth-Token", s.Token)
|
||
|
req.Header.Set("Content-Type", "text/plain")
|
||
|
req.Header.Set("User-Agent", s.userAgent)
|
||
|
|
||
|
resp, err := s.Client.Do(req)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer resp.Body.Close()
|
||
|
|
||
|
if resp.StatusCode == http.StatusNoContent {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
return fmt.Errorf("cannot set user_data (%d)", resp.StatusCode)
|
||
|
}
|
||
|
|
||
|
// DeleteUserdata deletes a server user_data
|
||
|
func (s *API) DeleteUserdata(serverID, key string, metadata bool) error {
|
||
|
var url, endpoint string
|
||
|
|
||
|
endpoint = s.computeAPI
|
||
|
if metadata {
|
||
|
url = fmt.Sprintf("/user_data/%s", key)
|
||
|
endpoint = MetadataAPI
|
||
|
} else {
|
||
|
url = fmt.Sprintf("servers/%s/user_data/%s", serverID, key)
|
||
|
}
|
||
|
|
||
|
resp, err := s.DeleteResponse(endpoint, url)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer resp.Body.Close()
|
||
|
|
||
|
_, err = s.handleHTTPError([]int{http.StatusNoContent}, resp)
|
||
|
return err
|
||
|
}
|