disks.go 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. package ecs
  2. import (
  3. "time"
  4. "github.com/denverdino/aliyungo/common"
  5. "github.com/denverdino/aliyungo/util"
  6. )
  7. // Types of disks
  8. type DiskType string
  9. const (
  10. DiskTypeAll = DiskType("all") //Default
  11. DiskTypeAllSystem = DiskType("system")
  12. DiskTypeAllData = DiskType("data")
  13. )
  14. // Categories of disks
  15. type DiskCategory string
  16. const (
  17. DiskCategoryAll = DiskCategory("all") //Default
  18. DiskCategoryCloud = DiskCategory("cloud")
  19. DiskCategoryEphemeral = DiskCategory("ephemeral")
  20. DiskCategoryEphemeralSSD = DiskCategory("ephemeral_ssd")
  21. DiskCategoryCloudEfficiency = DiskCategory("cloud_efficiency")
  22. DiskCategoryCloudSSD = DiskCategory("cloud_ssd")
  23. )
  24. // Status of disks
  25. type DiskStatus string
  26. const (
  27. DiskStatusInUse = DiskStatus("In_use")
  28. DiskStatusAvailable = DiskStatus("Available")
  29. DiskStatusAttaching = DiskStatus("Attaching")
  30. DiskStatusDetaching = DiskStatus("Detaching")
  31. DiskStatusCreating = DiskStatus("Creating")
  32. DiskStatusReIniting = DiskStatus("ReIniting")
  33. DiskStatusAll = DiskStatus("All") //Default
  34. )
  35. // Charge type of disks
  36. type DiskChargeType string
  37. const (
  38. PrePaid = DiskChargeType("PrePaid")
  39. PostPaid = DiskChargeType("PostPaid")
  40. )
  41. // A DescribeDisksArgs defines the arguments to describe disks
  42. type DescribeDisksArgs struct {
  43. RegionId common.Region
  44. ZoneId string
  45. DiskIds []string
  46. InstanceId string
  47. DiskType DiskType //enum for all(default) | system | data
  48. Category DiskCategory //enum for all(default) | cloud | ephemeral
  49. Status DiskStatus //enum for In_use | Available | Attaching | Detaching | Creating | ReIniting | All(default)
  50. SnapshotId string
  51. Name string
  52. Portable *bool //optional
  53. DeleteWithInstance *bool //optional
  54. DeleteAutoSnapshot *bool //optional
  55. EnableAutoSnapshot *bool //optional
  56. DiskChargeType DiskChargeType
  57. Tag map[string]string
  58. common.Pagination
  59. }
  60. //
  61. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/datatype&diskitemtype
  62. type DiskItemType struct {
  63. DiskId string
  64. RegionId common.Region
  65. ZoneId string
  66. DiskName string
  67. Description string
  68. Type DiskType
  69. Category DiskCategory
  70. Size int
  71. ImageId string
  72. SourceSnapshotId string
  73. ProductCode string
  74. Portable bool
  75. Status DiskStatus
  76. OperationLocks OperationLocksType
  77. InstanceId string
  78. Device string
  79. DeleteWithInstance bool
  80. DeleteAutoSnapshot bool
  81. EnableAutoSnapshot bool
  82. CreationTime util.ISO6801Time
  83. AttachedTime util.ISO6801Time
  84. DetachedTime util.ISO6801Time
  85. DiskChargeType DiskChargeType
  86. }
  87. type DescribeDisksResponse struct {
  88. common.Response
  89. common.PaginationResult
  90. RegionId common.Region
  91. Disks struct {
  92. Disk []DiskItemType
  93. }
  94. }
  95. // DescribeDisks describes Disks
  96. //
  97. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/disk&describedisks
  98. func (client *Client) DescribeDisks(args *DescribeDisksArgs) (disks []DiskItemType, pagination *common.PaginationResult, err error) {
  99. response := DescribeDisksResponse{}
  100. err = client.Invoke("DescribeDisks", args, &response)
  101. if err != nil {
  102. return nil, nil, err
  103. }
  104. return response.Disks.Disk, &response.PaginationResult, err
  105. }
  106. type CreateDiskArgs struct {
  107. RegionId common.Region
  108. ZoneId string
  109. DiskName string
  110. Description string
  111. DiskCategory DiskCategory
  112. Size int
  113. SnapshotId string
  114. ClientToken string
  115. }
  116. type CreateDisksResponse struct {
  117. common.Response
  118. DiskId string
  119. }
  120. // CreateDisk creates a new disk
  121. //
  122. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/disk&createdisk
  123. func (client *Client) CreateDisk(args *CreateDiskArgs) (diskId string, err error) {
  124. response := CreateDisksResponse{}
  125. err = client.Invoke("CreateDisk", args, &response)
  126. if err != nil {
  127. return "", err
  128. }
  129. return response.DiskId, err
  130. }
  131. type DeleteDiskArgs struct {
  132. DiskId string
  133. }
  134. type DeleteDiskResponse struct {
  135. common.Response
  136. }
  137. // DeleteDisk deletes disk
  138. //
  139. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/disk&deletedisk
  140. func (client *Client) DeleteDisk(diskId string) error {
  141. args := DeleteDiskArgs{
  142. DiskId: diskId,
  143. }
  144. response := DeleteDiskResponse{}
  145. err := client.Invoke("DeleteDisk", &args, &response)
  146. return err
  147. }
  148. type ReInitDiskArgs struct {
  149. DiskId string
  150. }
  151. type ReInitDiskResponse struct {
  152. common.Response
  153. }
  154. // ReInitDisk reinitizes disk
  155. //
  156. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/disk&reinitdisk
  157. func (client *Client) ReInitDisk(diskId string) error {
  158. args := ReInitDiskArgs{
  159. DiskId: diskId,
  160. }
  161. response := ReInitDiskResponse{}
  162. err := client.Invoke("ReInitDisk", &args, &response)
  163. return err
  164. }
  165. type AttachDiskArgs struct {
  166. InstanceId string
  167. DiskId string
  168. Device string
  169. DeleteWithInstance bool
  170. }
  171. type AttachDiskResponse struct {
  172. common.Response
  173. }
  174. // AttachDisk attaches disk to instance
  175. //
  176. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/disk&attachdisk
  177. func (client *Client) AttachDisk(args *AttachDiskArgs) error {
  178. response := AttachDiskResponse{}
  179. err := client.Invoke("AttachDisk", args, &response)
  180. return err
  181. }
  182. type DetachDiskArgs struct {
  183. InstanceId string
  184. DiskId string
  185. }
  186. type DetachDiskResponse struct {
  187. common.Response
  188. }
  189. // DetachDisk detaches disk from instance
  190. //
  191. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/disk&detachdisk
  192. func (client *Client) DetachDisk(instanceId string, diskId string) error {
  193. args := DetachDiskArgs{
  194. InstanceId: instanceId,
  195. DiskId: diskId,
  196. }
  197. response := DetachDiskResponse{}
  198. err := client.Invoke("DetachDisk", &args, &response)
  199. return err
  200. }
  201. type ResetDiskArgs struct {
  202. DiskId string
  203. SnapshotId string
  204. }
  205. type ResetDiskResponse struct {
  206. common.Response
  207. }
  208. // ResetDisk resets disk to original status
  209. //
  210. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/disk&resetdisk
  211. func (client *Client) ResetDisk(diskId string, snapshotId string) error {
  212. args := ResetDiskArgs{
  213. SnapshotId: snapshotId,
  214. DiskId: diskId,
  215. }
  216. response := ResetDiskResponse{}
  217. err := client.Invoke("ResetDisk", &args, &response)
  218. return err
  219. }
  220. type ModifyDiskAttributeArgs struct {
  221. DiskId string
  222. DiskName string
  223. Description string
  224. DeleteWithInstance *bool
  225. DeleteAutoSnapshot *bool
  226. EnableAutoSnapshot *bool
  227. }
  228. type ModifyDiskAttributeResponse struct {
  229. common.Response
  230. }
  231. // ModifyDiskAttribute modifies disk attribute
  232. //
  233. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/disk&modifydiskattribute
  234. func (client *Client) ModifyDiskAttribute(args *ModifyDiskAttributeArgs) error {
  235. response := ModifyDiskAttributeResponse{}
  236. err := client.Invoke("ModifyDiskAttribute", &args, &response)
  237. return err
  238. }
  239. type ReplaceSystemDiskArgs struct {
  240. InstanceId string
  241. ImageId string
  242. SystemDisk SystemDiskType
  243. ClientToken string
  244. }
  245. type ReplaceSystemDiskResponse struct {
  246. common.Response
  247. DiskId string
  248. }
  249. // ReplaceSystemDisk replace system disk
  250. //
  251. // You can read doc at https://help.aliyun.com/document_detail/ecs/open-api/disk/replacesystemdisk.html
  252. func (client *Client) ReplaceSystemDisk(args *ReplaceSystemDiskArgs) (diskId string, err error) {
  253. response := ReplaceSystemDiskResponse{}
  254. err = client.Invoke("ReplaceSystemDisk", args, &response)
  255. if err != nil {
  256. return "", err
  257. }
  258. return response.DiskId, nil
  259. }
  260. // WaitForDisk waits for disk to given status
  261. func (client *Client) WaitForDisk(regionId common.Region, diskId string, status DiskStatus, timeout int) error {
  262. if timeout <= 0 {
  263. timeout = DefaultTimeout
  264. }
  265. args := DescribeDisksArgs{
  266. RegionId: regionId,
  267. DiskIds: []string{diskId},
  268. }
  269. for {
  270. disks, _, err := client.DescribeDisks(&args)
  271. if err != nil {
  272. return err
  273. }
  274. if disks == nil || len(disks) == 0 {
  275. return common.GetClientErrorFromString("Not found")
  276. }
  277. if disks[0].Status == status {
  278. break
  279. }
  280. timeout = timeout - DefaultWaitForInterval
  281. if timeout <= 0 {
  282. return common.GetClientErrorFromString("Timeout")
  283. }
  284. time.Sleep(DefaultWaitForInterval * time.Second)
  285. }
  286. return nil
  287. }