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
|
package ecs
import (
"time"
"github.com/denverdino/aliyungo/common"
"github.com/denverdino/aliyungo/util"
)
type DescribeSnapshotsArgs struct {
RegionId common.Region
InstanceId string
DiskId string
SnapshotIds []string //["s-xxxxxxxxx", "s-yyyyyyyyy", ..."s-zzzzzzzzz"]
common.Pagination
}
//
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/datatype&snapshottype
type SnapshotType struct {
SnapshotId string
SnapshotName string
Description string
Progress string
SourceDiskId string
SourceDiskSize int
SourceDiskType string //enum for System | Data
ProductCode string
CreationTime util.ISO6801Time
}
type DescribeSnapshotsResponse struct {
common.Response
common.PaginationResult
Snapshots struct {
Snapshot []SnapshotType
}
}
// DescribeSnapshots describe snapshots
//
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/snapshot&describesnapshots
func (client *Client) DescribeSnapshots(args *DescribeSnapshotsArgs) (snapshots []SnapshotType, pagination *common.PaginationResult, err error) {
args.Validate()
response := DescribeSnapshotsResponse{}
err = client.Invoke("DescribeSnapshots", args, &response)
if err != nil {
return nil, nil, err
}
return response.Snapshots.Snapshot, &response.PaginationResult, nil
}
type DeleteSnapshotArgs struct {
SnapshotId string
}
type DeleteSnapshotResponse struct {
common.Response
}
// DeleteSnapshot deletes snapshot
//
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/snapshot&deletesnapshot
func (client *Client) DeleteSnapshot(snapshotId string) error {
args := DeleteSnapshotArgs{SnapshotId: snapshotId}
response := DeleteSnapshotResponse{}
return client.Invoke("DeleteSnapshot", &args, &response)
}
type CreateSnapshotArgs struct {
DiskId string
SnapshotName string
Description string
ClientToken string
}
type CreateSnapshotResponse struct {
common.Response
SnapshotId string
}
// CreateSnapshot creates a new snapshot
//
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/snapshot&createsnapshot
func (client *Client) CreateSnapshot(args *CreateSnapshotArgs) (snapshotId string, err error) {
response := CreateSnapshotResponse{}
err = client.Invoke("CreateSnapshot", args, &response)
if err == nil {
snapshotId = response.SnapshotId
}
return snapshotId, err
}
// Default timeout value for WaitForSnapShotReady method
const SnapshotDefaultTimeout = 120
// WaitForSnapShotReady waits for snapshot ready
func (client *Client) WaitForSnapShotReady(regionId common.Region, snapshotId string, timeout int) error {
if timeout <= 0 {
timeout = SnapshotDefaultTimeout
}
for {
args := DescribeSnapshotsArgs{
RegionId: regionId,
SnapshotIds: []string{snapshotId},
}
snapshots, _, err := client.DescribeSnapshots(&args)
if err != nil {
return err
}
if snapshots == nil || len(snapshots) == 0 {
return common.GetClientErrorFromString("Not found")
}
if snapshots[0].Progress == "100%" {
break
}
timeout = timeout - DefaultWaitForInterval
if timeout <= 0 {
return common.GetClientErrorFromString("Timeout")
}
time.Sleep(DefaultWaitForInterval * time.Second)
}
return nil
}
|