forked from TrueCloudLab/lego
168 lines
3.7 KiB
Go
168 lines
3.7 KiB
Go
package govultr
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"net/url"
|
|
)
|
|
|
|
// SnapshotService is the interface to interact with Snapshot endpoints on the Vultr API
|
|
// Link: https://www.vultr.com/api/#snapshot
|
|
type SnapshotService interface {
|
|
Create(ctx context.Context, InstanceID, description string) (*Snapshot, error)
|
|
CreateFromURL(ctx context.Context, snapshotURL string) (*Snapshot, error)
|
|
Delete(ctx context.Context, snapshotID string) error
|
|
List(ctx context.Context) ([]Snapshot, error)
|
|
Get(ctx context.Context, snapshotID string) (*Snapshot, error)
|
|
}
|
|
|
|
// SnapshotServiceHandler handles interaction with the snapshot methods for the Vultr API
|
|
type SnapshotServiceHandler struct {
|
|
Client *Client
|
|
}
|
|
|
|
// Snapshot represents a Vultr snapshot
|
|
type Snapshot struct {
|
|
SnapshotID string `json:"SNAPSHOTID"`
|
|
DateCreated string `json:"date_created"`
|
|
Description string `json:"description"`
|
|
Size string `json:"size"`
|
|
Status string `json:"status"`
|
|
OsID string `json:"OSID"`
|
|
AppID string `json:"APPID"`
|
|
}
|
|
|
|
// Snapshots represent a collection of snapshots
|
|
type Snapshots []Snapshot
|
|
|
|
// Create makes a snapshot of a provided server
|
|
func (s *SnapshotServiceHandler) Create(ctx context.Context, InstanceID, description string) (*Snapshot, error) {
|
|
|
|
uri := "/v1/snapshot/create"
|
|
|
|
values := url.Values{
|
|
"SUBID": {InstanceID},
|
|
"description": {description},
|
|
}
|
|
|
|
req, err := s.Client.NewRequest(ctx, http.MethodPost, uri, values)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
snapshot := new(Snapshot)
|
|
err = s.Client.DoWithContext(ctx, req, snapshot)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
snapshot.Description = description
|
|
return snapshot, nil
|
|
}
|
|
|
|
// CreateFromURL will create a snapshot based on an image iso from a URL you provide
|
|
func (s *SnapshotServiceHandler) CreateFromURL(ctx context.Context, snapshotURL string) (*Snapshot, error) {
|
|
uri := "/v1/snapshot/create_from_url"
|
|
|
|
values := url.Values{
|
|
"url": {snapshotURL},
|
|
}
|
|
|
|
req, err := s.Client.NewRequest(ctx, http.MethodPost, uri, values)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
snapshot := new(Snapshot)
|
|
err = s.Client.DoWithContext(ctx, req, snapshot)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return snapshot, nil
|
|
}
|
|
|
|
// Delete a snapshot based on snapshotID
|
|
func (s *SnapshotServiceHandler) Delete(ctx context.Context, snapshotID string) error {
|
|
uri := "/v1/snapshot/destroy"
|
|
|
|
values := url.Values{
|
|
"SNAPSHOTID": {snapshotID},
|
|
}
|
|
|
|
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 of snapshots details
|
|
func (s *SnapshotServiceHandler) List(ctx context.Context) ([]Snapshot, error) {
|
|
uri := "/v1/snapshot/list"
|
|
|
|
req, err := s.Client.NewRequest(ctx, http.MethodGet, uri, nil)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
snapshotMap := make(map[string]Snapshot)
|
|
err = s.Client.DoWithContext(ctx, req, &snapshotMap)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var snapshots []Snapshot
|
|
|
|
for _, s := range snapshotMap {
|
|
snapshots = append(snapshots, s)
|
|
}
|
|
|
|
return snapshots, nil
|
|
}
|
|
|
|
// Get individual details of a snapshot based on snapshotID
|
|
func (s *SnapshotServiceHandler) Get(ctx context.Context, snapshotID string) (*Snapshot, error) {
|
|
uri := "/v1/snapshot/list"
|
|
|
|
req, err := s.Client.NewRequest(ctx, http.MethodGet, uri, nil)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if snapshotID != "" {
|
|
q := req.URL.Query()
|
|
q.Add("SNAPSHOTID", snapshotID)
|
|
req.URL.RawQuery = q.Encode()
|
|
}
|
|
|
|
snapshotMap := make(map[string]Snapshot)
|
|
err = s.Client.DoWithContext(ctx, req, &snapshotMap)
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
snapshot := new(Snapshot)
|
|
|
|
for _, s := range snapshotMap {
|
|
snapshot = &s
|
|
}
|
|
|
|
return snapshot, nil
|
|
}
|