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
|
|
}
|