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
|
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
Status string
Usage 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) {
response, err := client.DescribeSnapshotsWithRaw(args)
if err != nil {
return nil, nil, err
}
return response.Snapshots.Snapshot, &response.PaginationResult, nil
}
func (client *Client) DescribeSnapshotsWithRaw(args *DescribeSnapshotsArgs) (response *DescribeSnapshotsResponse, err error) {
args.Validate()
response = &DescribeSnapshotsResponse{}
err = client.Invoke("DescribeSnapshots", args, response)
if err != nil {
return nil, err
}
return response, 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
}
|