141 lines
3.4 KiB
Go
141 lines
3.4 KiB
Go
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) {
|
|
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
|
|
}
|