-
Notifications
You must be signed in to change notification settings - Fork 56
/
snapshot.go
148 lines (119 loc) · 4.16 KB
/
snapshot.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
package govultr
import (
"context"
"fmt"
"net/http"
"github.com/google/go-querystring/query"
)
// SnapshotService is the interface to interact with Snapshot endpoints on the Vultr API
// Link : https://www.vultr.com/api/#tag/snapshot
type SnapshotService interface {
Create(ctx context.Context, snapshotReq *SnapshotReq) (*Snapshot, *http.Response, error)
CreateFromURL(ctx context.Context, snapshotURLReq *SnapshotURLReq) (*Snapshot, *http.Response, error)
Get(ctx context.Context, snapshotID string) (*Snapshot, *http.Response, error)
Delete(ctx context.Context, snapshotID string) error
List(ctx context.Context, options *ListOptions) ([]Snapshot, *Meta, *http.Response, 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 {
ID string `json:"id"`
DateCreated string `json:"date_created"`
Description string `json:"description"`
Size int `json:"size"`
CompressedSize int `json:"compressed_size"`
Status string `json:"status"`
OsID int `json:"os_id"`
AppID int `json:"app_id"`
}
// SnapshotReq struct is used to create snapshots.
type SnapshotReq struct {
InstanceID string `json:"instance_id,omitempty"`
Description string `json:"description,omitempty"`
}
// SnapshotURLReq struct is used to create snapshots from a URL.
type SnapshotURLReq struct {
URL string `json:"url"`
Description string `json:"description,omitempty"`
}
type snapshotsBase struct {
Snapshots []Snapshot `json:"snapshots"`
Meta *Meta `json:"meta"`
}
type snapshotBase struct {
Snapshot *Snapshot `json:"snapshot"`
}
// Create makes a snapshot of a provided server
func (s *SnapshotServiceHandler) Create(ctx context.Context, snapshotReq *SnapshotReq) (*Snapshot, *http.Response, error) {
uri := "/v2/snapshots"
req, err := s.client.NewRequest(ctx, http.MethodPost, uri, snapshotReq)
if err != nil {
return nil, nil, err
}
snapshot := new(snapshotBase)
resp, err := s.client.DoWithContext(ctx, req, snapshot)
if err != nil {
return nil, resp, err
}
return snapshot.Snapshot, resp, nil
}
// CreateFromURL will create a snapshot based on an image iso from a URL you provide
func (s *SnapshotServiceHandler) CreateFromURL(ctx context.Context, snapshotURLReq *SnapshotURLReq) (*Snapshot, *http.Response, error) {
uri := "/v2/snapshots/create-from-url"
req, err := s.client.NewRequest(ctx, http.MethodPost, uri, snapshotURLReq)
if err != nil {
return nil, nil, err
}
snapshot := new(snapshotBase)
resp, err := s.client.DoWithContext(ctx, req, snapshot)
if err != nil {
return nil, resp, err
}
return snapshot.Snapshot, resp, nil
}
// Get a specific snapshot
func (s *SnapshotServiceHandler) Get(ctx context.Context, snapshotID string) (*Snapshot, *http.Response, error) {
uri := fmt.Sprintf("/v2/snapshots/%s", snapshotID)
req, err := s.client.NewRequest(ctx, http.MethodGet, uri, nil)
if err != nil {
return nil, nil, err
}
snapshot := new(snapshotBase)
resp, err := s.client.DoWithContext(ctx, req, snapshot)
if err != nil {
return nil, resp, err
}
return snapshot.Snapshot, resp, nil
}
// Delete a snapshot.
func (s *SnapshotServiceHandler) Delete(ctx context.Context, snapshotID string) error {
uri := fmt.Sprintf("/v2/snapshots/%s", snapshotID)
req, err := s.client.NewRequest(ctx, http.MethodDelete, uri, nil)
if err != nil {
return err
}
_, err = s.client.DoWithContext(ctx, req, nil)
return err
}
// List all available snapshots.
func (s *SnapshotServiceHandler) List(ctx context.Context, options *ListOptions) ([]Snapshot, *Meta, *http.Response, error) { //nolint:dupl
uri := "/v2/snapshots"
req, err := s.client.NewRequest(ctx, http.MethodGet, uri, nil)
if err != nil {
return nil, nil, nil, err
}
newValues, err := query.Values(options)
if err != nil {
return nil, nil, nil, err
}
req.URL.RawQuery = newValues.Encode()
snapshots := new(snapshotsBase)
resp, err := s.client.DoWithContext(ctx, req, snapshots)
if err != nil {
return nil, nil, resp, err
}
return snapshots.Snapshots, snapshots.Meta, resp, nil
}