open-vault/vendor/github.com/nicolai86/scaleway-sdk/user_data.go
2020-10-13 16:26:39 -04:00

141 lines
3 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
}