341 lines
8.4 KiB
Go
341 lines
8.4 KiB
Go
|
package ecs
|
||
|
|
||
|
import (
|
||
|
"time"
|
||
|
|
||
|
"github.com/denverdino/aliyungo/common"
|
||
|
"github.com/denverdino/aliyungo/util"
|
||
|
)
|
||
|
|
||
|
// Types of disks
|
||
|
type DiskType string
|
||
|
|
||
|
const (
|
||
|
DiskTypeAll = DiskType("all") //Default
|
||
|
DiskTypeAllSystem = DiskType("system")
|
||
|
DiskTypeAllData = DiskType("data")
|
||
|
)
|
||
|
|
||
|
// Categories of disks
|
||
|
type DiskCategory string
|
||
|
|
||
|
const (
|
||
|
DiskCategoryAll = DiskCategory("all") //Default
|
||
|
DiskCategoryCloud = DiskCategory("cloud")
|
||
|
DiskCategoryEphemeral = DiskCategory("ephemeral")
|
||
|
DiskCategoryEphemeralSSD = DiskCategory("ephemeral_ssd")
|
||
|
DiskCategoryCloudEfficiency = DiskCategory("cloud_efficiency")
|
||
|
DiskCategoryCloudSSD = DiskCategory("cloud_ssd")
|
||
|
)
|
||
|
|
||
|
// Status of disks
|
||
|
type DiskStatus string
|
||
|
|
||
|
const (
|
||
|
DiskStatusInUse = DiskStatus("In_use")
|
||
|
DiskStatusAvailable = DiskStatus("Available")
|
||
|
DiskStatusAttaching = DiskStatus("Attaching")
|
||
|
DiskStatusDetaching = DiskStatus("Detaching")
|
||
|
DiskStatusCreating = DiskStatus("Creating")
|
||
|
DiskStatusReIniting = DiskStatus("ReIniting")
|
||
|
DiskStatusAll = DiskStatus("All") //Default
|
||
|
)
|
||
|
|
||
|
// Charge type of disks
|
||
|
type DiskChargeType string
|
||
|
|
||
|
const (
|
||
|
PrePaid = DiskChargeType("PrePaid")
|
||
|
PostPaid = DiskChargeType("PostPaid")
|
||
|
)
|
||
|
|
||
|
// A DescribeDisksArgs defines the arguments to describe disks
|
||
|
type DescribeDisksArgs struct {
|
||
|
RegionId common.Region
|
||
|
ZoneId string
|
||
|
DiskIds []string
|
||
|
InstanceId string
|
||
|
DiskType DiskType //enum for all(default) | system | data
|
||
|
Category DiskCategory //enum for all(default) | cloud | ephemeral
|
||
|
Status DiskStatus //enum for In_use | Available | Attaching | Detaching | Creating | ReIniting | All(default)
|
||
|
SnapshotId string
|
||
|
Name string
|
||
|
Portable *bool //optional
|
||
|
DeleteWithInstance *bool //optional
|
||
|
DeleteAutoSnapshot *bool //optional
|
||
|
EnableAutoSnapshot *bool //optional
|
||
|
DiskChargeType DiskChargeType
|
||
|
Tag map[string]string
|
||
|
common.Pagination
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/datatype&diskitemtype
|
||
|
type DiskItemType struct {
|
||
|
DiskId string
|
||
|
RegionId common.Region
|
||
|
ZoneId string
|
||
|
DiskName string
|
||
|
Description string
|
||
|
Type DiskType
|
||
|
Category DiskCategory
|
||
|
Size int
|
||
|
ImageId string
|
||
|
SourceSnapshotId string
|
||
|
ProductCode string
|
||
|
Portable bool
|
||
|
Status DiskStatus
|
||
|
OperationLocks OperationLocksType
|
||
|
InstanceId string
|
||
|
Device string
|
||
|
DeleteWithInstance bool
|
||
|
DeleteAutoSnapshot bool
|
||
|
EnableAutoSnapshot bool
|
||
|
CreationTime util.ISO6801Time
|
||
|
AttachedTime util.ISO6801Time
|
||
|
DetachedTime util.ISO6801Time
|
||
|
DiskChargeType DiskChargeType
|
||
|
}
|
||
|
|
||
|
type DescribeDisksResponse struct {
|
||
|
common.Response
|
||
|
common.PaginationResult
|
||
|
RegionId common.Region
|
||
|
Disks struct {
|
||
|
Disk []DiskItemType
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// DescribeDisks describes Disks
|
||
|
//
|
||
|
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/disk&describedisks
|
||
|
func (client *Client) DescribeDisks(args *DescribeDisksArgs) (disks []DiskItemType, pagination *common.PaginationResult, err error) {
|
||
|
response, err := client.DescribeDisksWithRaw(args)
|
||
|
if err != nil {
|
||
|
return nil, nil, err
|
||
|
}
|
||
|
|
||
|
return response.Disks.Disk, &response.PaginationResult, err
|
||
|
}
|
||
|
|
||
|
func (client *Client) DescribeDisksWithRaw(args *DescribeDisksArgs) (response *DescribeDisksResponse, err error) {
|
||
|
response = &DescribeDisksResponse{}
|
||
|
|
||
|
err = client.Invoke("DescribeDisks", args, response)
|
||
|
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
return response, err
|
||
|
}
|
||
|
|
||
|
type CreateDiskArgs struct {
|
||
|
RegionId common.Region
|
||
|
ZoneId string
|
||
|
DiskName string
|
||
|
Description string
|
||
|
Encrypted bool
|
||
|
DiskCategory DiskCategory
|
||
|
Size int
|
||
|
SnapshotId string
|
||
|
ClientToken string
|
||
|
}
|
||
|
|
||
|
type CreateDisksResponse struct {
|
||
|
common.Response
|
||
|
DiskId string
|
||
|
}
|
||
|
|
||
|
// CreateDisk creates a new disk
|
||
|
//
|
||
|
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/disk&createdisk
|
||
|
func (client *Client) CreateDisk(args *CreateDiskArgs) (diskId string, err error) {
|
||
|
response := CreateDisksResponse{}
|
||
|
err = client.Invoke("CreateDisk", args, &response)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
return response.DiskId, err
|
||
|
}
|
||
|
|
||
|
type DeleteDiskArgs struct {
|
||
|
DiskId string
|
||
|
}
|
||
|
|
||
|
type DeleteDiskResponse struct {
|
||
|
common.Response
|
||
|
}
|
||
|
|
||
|
// DeleteDisk deletes disk
|
||
|
//
|
||
|
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/disk&deletedisk
|
||
|
func (client *Client) DeleteDisk(diskId string) error {
|
||
|
args := DeleteDiskArgs{
|
||
|
DiskId: diskId,
|
||
|
}
|
||
|
response := DeleteDiskResponse{}
|
||
|
err := client.Invoke("DeleteDisk", &args, &response)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type ReInitDiskArgs struct {
|
||
|
DiskId string
|
||
|
}
|
||
|
|
||
|
type ReInitDiskResponse struct {
|
||
|
common.Response
|
||
|
}
|
||
|
|
||
|
// ReInitDisk reinitizes disk
|
||
|
//
|
||
|
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/disk&reinitdisk
|
||
|
func (client *Client) ReInitDisk(diskId string) error {
|
||
|
args := ReInitDiskArgs{
|
||
|
DiskId: diskId,
|
||
|
}
|
||
|
response := ReInitDiskResponse{}
|
||
|
err := client.Invoke("ReInitDisk", &args, &response)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type AttachDiskArgs struct {
|
||
|
InstanceId string
|
||
|
DiskId string
|
||
|
Device string
|
||
|
DeleteWithInstance bool
|
||
|
}
|
||
|
|
||
|
type AttachDiskResponse struct {
|
||
|
common.Response
|
||
|
}
|
||
|
|
||
|
// AttachDisk attaches disk to instance
|
||
|
//
|
||
|
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/disk&attachdisk
|
||
|
func (client *Client) AttachDisk(args *AttachDiskArgs) error {
|
||
|
response := AttachDiskResponse{}
|
||
|
err := client.Invoke("AttachDisk", args, &response)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type DetachDiskArgs struct {
|
||
|
InstanceId string
|
||
|
DiskId string
|
||
|
}
|
||
|
|
||
|
type DetachDiskResponse struct {
|
||
|
common.Response
|
||
|
}
|
||
|
|
||
|
// DetachDisk detaches disk from instance
|
||
|
//
|
||
|
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/disk&detachdisk
|
||
|
func (client *Client) DetachDisk(instanceId string, diskId string) error {
|
||
|
args := DetachDiskArgs{
|
||
|
InstanceId: instanceId,
|
||
|
DiskId: diskId,
|
||
|
}
|
||
|
response := DetachDiskResponse{}
|
||
|
err := client.Invoke("DetachDisk", &args, &response)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type ResetDiskArgs struct {
|
||
|
DiskId string
|
||
|
SnapshotId string
|
||
|
}
|
||
|
|
||
|
type ResetDiskResponse struct {
|
||
|
common.Response
|
||
|
}
|
||
|
|
||
|
// ResetDisk resets disk to original status
|
||
|
//
|
||
|
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/disk&resetdisk
|
||
|
func (client *Client) ResetDisk(diskId string, snapshotId string) error {
|
||
|
args := ResetDiskArgs{
|
||
|
SnapshotId: snapshotId,
|
||
|
DiskId: diskId,
|
||
|
}
|
||
|
response := ResetDiskResponse{}
|
||
|
err := client.Invoke("ResetDisk", &args, &response)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type ModifyDiskAttributeArgs struct {
|
||
|
DiskId string
|
||
|
DiskName string
|
||
|
Description string
|
||
|
DeleteWithInstance *bool
|
||
|
DeleteAutoSnapshot *bool
|
||
|
EnableAutoSnapshot *bool
|
||
|
}
|
||
|
|
||
|
type ModifyDiskAttributeResponse struct {
|
||
|
common.Response
|
||
|
}
|
||
|
|
||
|
// ModifyDiskAttribute modifies disk attribute
|
||
|
//
|
||
|
// You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/disk&modifydiskattribute
|
||
|
func (client *Client) ModifyDiskAttribute(args *ModifyDiskAttributeArgs) error {
|
||
|
response := ModifyDiskAttributeResponse{}
|
||
|
err := client.Invoke("ModifyDiskAttribute", args, &response)
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
type ReplaceSystemDiskArgs struct {
|
||
|
InstanceId string
|
||
|
ImageId string
|
||
|
SystemDisk SystemDiskType
|
||
|
ClientToken string
|
||
|
}
|
||
|
|
||
|
type ReplaceSystemDiskResponse struct {
|
||
|
common.Response
|
||
|
DiskId string
|
||
|
}
|
||
|
|
||
|
// ReplaceSystemDisk replace system disk
|
||
|
//
|
||
|
// You can read doc at https://help.aliyun.com/document_detail/ecs/open-api/disk/replacesystemdisk.html
|
||
|
func (client *Client) ReplaceSystemDisk(args *ReplaceSystemDiskArgs) (diskId string, err error) {
|
||
|
response := ReplaceSystemDiskResponse{}
|
||
|
err = client.Invoke("ReplaceSystemDisk", args, &response)
|
||
|
if err != nil {
|
||
|
return "", err
|
||
|
}
|
||
|
return response.DiskId, nil
|
||
|
}
|
||
|
|
||
|
// WaitForDisk waits for disk to given status
|
||
|
func (client *Client) WaitForDisk(regionId common.Region, diskId string, status DiskStatus, timeout int) error {
|
||
|
if timeout <= 0 {
|
||
|
timeout = DefaultTimeout
|
||
|
}
|
||
|
args := DescribeDisksArgs{
|
||
|
RegionId: regionId,
|
||
|
DiskIds: []string{diskId},
|
||
|
}
|
||
|
|
||
|
for {
|
||
|
disks, _, err := client.DescribeDisks(&args)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if disks == nil || len(disks) == 0 {
|
||
|
return common.GetClientErrorFromString("Not found")
|
||
|
}
|
||
|
if disks[0].Status == status {
|
||
|
break
|
||
|
}
|
||
|
timeout = timeout - DefaultWaitForInterval
|
||
|
if timeout <= 0 {
|
||
|
return common.GetClientErrorFromString("Timeout")
|
||
|
}
|
||
|
time.Sleep(DefaultWaitForInterval * time.Second)
|
||
|
}
|
||
|
return nil
|
||
|
}
|