forked from TrueCloudLab/lego
172 lines
3.9 KiB
Go
172 lines
3.9 KiB
Go
package govultr
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
)
|
|
|
|
// StartupScriptService is the interface to interact with the startup script endpoints on the Vultr API
|
|
// Link: https://www.vultr.com/api/#startupscript
|
|
type StartupScriptService interface {
|
|
Create(ctx context.Context, name, script, scriptType string) (*StartupScript, error)
|
|
Delete(ctx context.Context, scriptID string) error
|
|
List(ctx context.Context) ([]StartupScript, error)
|
|
Update(ctx context.Context, script *StartupScript) error
|
|
}
|
|
|
|
// StartupScriptServiceHandler handles interaction with the startup script methods for the Vultr API
|
|
type StartupScriptServiceHandler struct {
|
|
client *Client
|
|
}
|
|
|
|
// StartupScript represents an startup script on Vultr
|
|
type StartupScript struct {
|
|
ScriptID string `json:"SCRIPTID"`
|
|
DateCreated string `json:"date_created"`
|
|
DateModified string `json:"date_modified"`
|
|
Name string `json:"name"`
|
|
Type string `json:"type"`
|
|
Script string `json:"script"`
|
|
}
|
|
|
|
// UnmarshalJSON implements json.Unmarshaller on StartupScript to handle the inconsistent types returned from the Vultr API.
|
|
func (s *StartupScript) UnmarshalJSON(data []byte) (err error) {
|
|
if s == nil {
|
|
*s = StartupScript{}
|
|
}
|
|
|
|
var v map[string]interface{}
|
|
if err := json.Unmarshal(data, &v); err != nil {
|
|
return err
|
|
}
|
|
|
|
s.ScriptID = fmt.Sprintf("%v", v["SCRIPTID"])
|
|
s.DateCreated = fmt.Sprintf("%v", v["date_created"])
|
|
s.DateModified = fmt.Sprintf("%v", v["date_modified"])
|
|
s.Name = fmt.Sprintf("%v", v["name"])
|
|
s.Type = fmt.Sprintf("%v", v["type"])
|
|
s.Script = fmt.Sprintf("%v", v["script"])
|
|
|
|
return nil
|
|
}
|
|
|
|
// Create will add the specified startup script to your Vultr account
|
|
func (s *StartupScriptServiceHandler) Create(ctx context.Context, name, script, scriptType string) (*StartupScript, error) {
|
|
|
|
uri := "/v1/startupscript/create"
|
|
|
|
values := url.Values{
|
|
"name": {name},
|
|
"script": {script},
|
|
}
|
|
|
|
if scriptType != "" {
|
|
values.Add("type", scriptType)
|
|
}
|
|
|
|
req, err := s.client.NewRequest(ctx, http.MethodPost, uri, values)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ss := new(StartupScript)
|
|
|
|
err = s.client.DoWithContext(ctx, req, ss)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
ss.DateCreated = ""
|
|
ss.DateModified = ""
|
|
ss.Name = name
|
|
ss.Type = scriptType
|
|
ss.Script = script
|
|
|
|
return ss, nil
|
|
}
|
|
|
|
// Delete will delete the specified startup script from your Vultr account
|
|
func (s *StartupScriptServiceHandler) Delete(ctx context.Context, scriptID string) error {
|
|
|
|
uri := "/v1/startupscript/destroy"
|
|
|
|
values := url.Values{
|
|
"SCRIPTID": {scriptID},
|
|
}
|
|
|
|
req, err := s.client.NewRequest(ctx, http.MethodPost, uri, values)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = s.client.DoWithContext(ctx, req, nil)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// List will list all the startup scripts associated with your Vultr account
|
|
func (s *StartupScriptServiceHandler) List(ctx context.Context) ([]StartupScript, error) {
|
|
|
|
uri := "/v1/startupscript/list"
|
|
|
|
req, err := s.client.NewRequest(ctx, http.MethodGet, uri, nil)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
scriptsMap := make(map[string]StartupScript)
|
|
err = s.client.DoWithContext(ctx, req, &scriptsMap)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var scripts []StartupScript
|
|
for _, key := range scriptsMap {
|
|
scripts = append(scripts, key)
|
|
}
|
|
|
|
return scripts, nil
|
|
}
|
|
|
|
// Update will update the given startup script. Empty strings will be ignored.
|
|
func (s *StartupScriptServiceHandler) Update(ctx context.Context, script *StartupScript) error {
|
|
|
|
uri := "/v1/startupscript/update"
|
|
|
|
values := url.Values{
|
|
"SCRIPTID": {script.ScriptID},
|
|
}
|
|
|
|
// Optional
|
|
if script.Name != "" {
|
|
values.Add("name", script.Name)
|
|
}
|
|
if script.Script != "" {
|
|
values.Add("script", script.Script)
|
|
}
|
|
|
|
req, err := s.client.NewRequest(ctx, http.MethodPost, uri, values)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = s.client.DoWithContext(ctx, req, nil)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|