instances.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. package ecs
  2. import (
  3. "encoding/base64"
  4. "encoding/json"
  5. "strconv"
  6. "time"
  7. "github.com/denverdino/aliyungo/common"
  8. "github.com/denverdino/aliyungo/util"
  9. )
  10. // InstanceStatus represents instance status
  11. type InstanceStatus string
  12. // Constants of InstanceStatus
  13. const (
  14. Creating = InstanceStatus("Creating")
  15. Running = InstanceStatus("Running")
  16. Starting = InstanceStatus("Starting")
  17. Stopped = InstanceStatus("Stopped")
  18. Stopping = InstanceStatus("Stopping")
  19. )
  20. type LockReason string
  21. const (
  22. LockReasonFinancial = LockReason("financial")
  23. LockReasonSecurity = LockReason("security")
  24. )
  25. type LockReasonType struct {
  26. LockReason LockReason
  27. }
  28. type DescribeInstanceStatusArgs struct {
  29. RegionId common.Region
  30. ZoneId string
  31. common.Pagination
  32. }
  33. //
  34. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/datatype&instancestatusitemtype
  35. type InstanceStatusItemType struct {
  36. InstanceId string
  37. Status InstanceStatus
  38. }
  39. type DescribeInstanceStatusResponse struct {
  40. common.Response
  41. common.PaginationResult
  42. InstanceStatuses struct {
  43. InstanceStatus []InstanceStatusItemType
  44. }
  45. }
  46. // DescribeInstanceStatus describes instance status
  47. //
  48. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/instance&describeinstancestatus
  49. func (client *Client) DescribeInstanceStatus(args *DescribeInstanceStatusArgs) (instanceStatuses []InstanceStatusItemType, pagination *common.PaginationResult, err error) {
  50. args.Validate()
  51. response := DescribeInstanceStatusResponse{}
  52. err = client.Invoke("DescribeInstanceStatus", args, &response)
  53. if err == nil {
  54. return response.InstanceStatuses.InstanceStatus, &response.PaginationResult, nil
  55. }
  56. return nil, nil, err
  57. }
  58. type StopInstanceArgs struct {
  59. InstanceId string
  60. ForceStop bool
  61. }
  62. type StopInstanceResponse struct {
  63. common.Response
  64. }
  65. // StopInstance stops instance
  66. //
  67. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/instance&stopinstance
  68. func (client *Client) StopInstance(instanceId string, forceStop bool) error {
  69. args := StopInstanceArgs{
  70. InstanceId: instanceId,
  71. ForceStop: forceStop,
  72. }
  73. response := StopInstanceResponse{}
  74. err := client.Invoke("StopInstance", &args, &response)
  75. return err
  76. }
  77. type StartInstanceArgs struct {
  78. InstanceId string
  79. }
  80. type StartInstanceResponse struct {
  81. common.Response
  82. }
  83. // StartInstance starts instance
  84. //
  85. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/instance&startinstance
  86. func (client *Client) StartInstance(instanceId string) error {
  87. args := StartInstanceArgs{InstanceId: instanceId}
  88. response := StartInstanceResponse{}
  89. err := client.Invoke("StartInstance", &args, &response)
  90. return err
  91. }
  92. type RebootInstanceArgs struct {
  93. InstanceId string
  94. ForceStop bool
  95. }
  96. type RebootInstanceResponse struct {
  97. common.Response
  98. }
  99. // RebootInstance reboot instance
  100. //
  101. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/instance&rebootinstance
  102. func (client *Client) RebootInstance(instanceId string, forceStop bool) error {
  103. request := RebootInstanceArgs{
  104. InstanceId: instanceId,
  105. ForceStop: forceStop,
  106. }
  107. response := RebootInstanceResponse{}
  108. err := client.Invoke("RebootInstance", &request, &response)
  109. return err
  110. }
  111. type DescribeInstanceAttributeArgs struct {
  112. InstanceId string
  113. }
  114. //
  115. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/datatype&operationlockstype
  116. type OperationLocksType struct {
  117. LockReason []LockReasonType //enum for financial, security
  118. }
  119. //
  120. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/datatype&securitygroupidsettype
  121. type SecurityGroupIdSetType struct {
  122. SecurityGroupId string
  123. }
  124. //
  125. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/datatype&ipaddresssettype
  126. type IpAddressSetType struct {
  127. IpAddress []string
  128. }
  129. //
  130. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/datatype&vpcattributestype
  131. type VpcAttributesType struct {
  132. VpcId string
  133. VSwitchId string
  134. PrivateIpAddress IpAddressSetType
  135. NatIpAddress string
  136. }
  137. //
  138. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/datatype&eipaddressassociatetype
  139. type EipAddressAssociateType struct {
  140. AllocationId string
  141. IpAddress string
  142. Bandwidth int
  143. InternetChargeType common.InternetChargeType
  144. }
  145. //
  146. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/datatype&instanceattributestype
  147. type InstanceAttributesType struct {
  148. InstanceId string
  149. InstanceName string
  150. Description string
  151. ImageId string
  152. RegionId common.Region
  153. ZoneId string
  154. CPU int
  155. Memory int
  156. ClusterId string
  157. InstanceType string
  158. InstanceTypeFamily string
  159. HostName string
  160. SerialNumber string
  161. Status InstanceStatus
  162. OperationLocks OperationLocksType
  163. SecurityGroupIds struct {
  164. SecurityGroupId []string
  165. }
  166. PublicIpAddress IpAddressSetType
  167. InnerIpAddress IpAddressSetType
  168. InstanceNetworkType string //enum Classic | Vpc
  169. InternetMaxBandwidthIn int
  170. InternetMaxBandwidthOut int
  171. InternetChargeType common.InternetChargeType
  172. CreationTime util.ISO6801Time //time.Time
  173. VpcAttributes VpcAttributesType
  174. EipAddress EipAddressAssociateType
  175. IoOptimized StringOrBool
  176. InstanceChargeType common.InstanceChargeType
  177. ExpiredTime util.ISO6801Time
  178. Tags struct {
  179. Tag []TagItemType
  180. }
  181. }
  182. type DescribeInstanceAttributeResponse struct {
  183. common.Response
  184. InstanceAttributesType
  185. }
  186. // DescribeInstanceAttribute describes instance attribute
  187. //
  188. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/instance&describeinstanceattribute
  189. func (client *Client) DescribeInstanceAttribute(instanceId string) (instance *InstanceAttributesType, err error) {
  190. args := DescribeInstanceAttributeArgs{InstanceId: instanceId}
  191. response := DescribeInstanceAttributeResponse{}
  192. err = client.Invoke("DescribeInstanceAttribute", &args, &response)
  193. if err != nil {
  194. return nil, err
  195. }
  196. return &response.InstanceAttributesType, err
  197. }
  198. type ModifyInstanceAttributeArgs struct {
  199. InstanceId string
  200. InstanceName string
  201. Description string
  202. Password string
  203. HostName string
  204. }
  205. type ModifyInstanceAttributeResponse struct {
  206. common.Response
  207. }
  208. //ModifyInstanceAttribute modify instance attrbute
  209. //
  210. // You can read doc at https://help.aliyun.com/document_detail/ecs/open-api/instance/modifyinstanceattribute.html
  211. func (client *Client) ModifyInstanceAttribute(args *ModifyInstanceAttributeArgs) error {
  212. response := ModifyInstanceAttributeResponse{}
  213. err := client.Invoke("ModifyInstanceAttribute", args, &response)
  214. return err
  215. }
  216. // Default timeout value for WaitForInstance method
  217. const InstanceDefaultTimeout = 120
  218. // WaitForInstance waits for instance to given status
  219. func (client *Client) WaitForInstance(instanceId string, status InstanceStatus, timeout int) error {
  220. if timeout <= 0 {
  221. timeout = InstanceDefaultTimeout
  222. }
  223. for {
  224. instance, err := client.DescribeInstanceAttribute(instanceId)
  225. if err != nil {
  226. return err
  227. }
  228. if instance.Status == status {
  229. //TODO
  230. //Sleep one more time for timing issues
  231. time.Sleep(DefaultWaitForInterval * time.Second)
  232. break
  233. }
  234. timeout = timeout - DefaultWaitForInterval
  235. if timeout <= 0 {
  236. return common.GetClientErrorFromString("Timeout")
  237. }
  238. time.Sleep(DefaultWaitForInterval * time.Second)
  239. }
  240. return nil
  241. }
  242. type DescribeInstanceVncUrlArgs struct {
  243. RegionId common.Region
  244. InstanceId string
  245. }
  246. type DescribeInstanceVncUrlResponse struct {
  247. common.Response
  248. VncUrl string
  249. }
  250. //
  251. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/instance&describeinstancevncurl
  252. func (client *Client) DescribeInstanceVncUrl(args *DescribeInstanceVncUrlArgs) (string, error) {
  253. response := DescribeInstanceVncUrlResponse{}
  254. err := client.Invoke("DescribeInstanceVncUrl", args, &response)
  255. if err == nil {
  256. return response.VncUrl, nil
  257. }
  258. return "", err
  259. }
  260. type DescribeInstancesArgs struct {
  261. RegionId common.Region
  262. VpcId string
  263. VSwitchId string
  264. ZoneId string
  265. InstanceIds string
  266. InstanceNetworkType string
  267. InstanceName string
  268. Status InstanceStatus
  269. PrivateIpAddresses string
  270. InnerIpAddresses string
  271. PublicIpAddresses string
  272. SecurityGroupId string
  273. Tag map[string]string
  274. common.Pagination
  275. }
  276. type DescribeInstancesResponse struct {
  277. common.Response
  278. common.PaginationResult
  279. Instances struct {
  280. Instance []InstanceAttributesType
  281. }
  282. }
  283. // DescribeInstances describes instances
  284. //
  285. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/instance&describeinstances
  286. func (client *Client) DescribeInstances(args *DescribeInstancesArgs) (instances []InstanceAttributesType, pagination *common.PaginationResult, err error) {
  287. args.Validate()
  288. response := DescribeInstancesResponse{}
  289. err = client.Invoke("DescribeInstances", args, &response)
  290. if err == nil {
  291. return response.Instances.Instance, &response.PaginationResult, nil
  292. }
  293. return nil, nil, err
  294. }
  295. type DeleteInstanceArgs struct {
  296. InstanceId string
  297. }
  298. type DeleteInstanceResponse struct {
  299. common.Response
  300. }
  301. // DeleteInstance deletes instance
  302. //
  303. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/instance&deleteinstance
  304. func (client *Client) DeleteInstance(instanceId string) error {
  305. args := DeleteInstanceArgs{InstanceId: instanceId}
  306. response := DeleteInstanceResponse{}
  307. err := client.Invoke("DeleteInstance", &args, &response)
  308. return err
  309. }
  310. type DataDiskType struct {
  311. Size int
  312. Category DiskCategory //Enum cloud, ephemeral, ephemeral_ssd
  313. SnapshotId string
  314. DiskName string
  315. Description string
  316. Device string
  317. DeleteWithInstance bool
  318. }
  319. type SystemDiskType struct {
  320. Size int
  321. Category DiskCategory //Enum cloud, ephemeral, ephemeral_ssd
  322. DiskName string
  323. Description string
  324. }
  325. type IoOptimized string
  326. type StringOrBool struct {
  327. Value bool
  328. }
  329. // UnmarshalJSON implements the json.Unmarshaller interface.
  330. func (io *StringOrBool) UnmarshalJSON(value []byte) error {
  331. if value[0] == '"' {
  332. var str string
  333. err := json.Unmarshal(value, &str)
  334. if err == nil {
  335. io.Value = (str == "true" || str == "optimized")
  336. }
  337. return err
  338. }
  339. var boolVal bool
  340. err := json.Unmarshal(value, &boolVal)
  341. if err == nil {
  342. io.Value = boolVal
  343. }
  344. return err
  345. }
  346. func (io StringOrBool) Bool() bool {
  347. return io.Value
  348. }
  349. func (io StringOrBool) String() string {
  350. return strconv.FormatBool(io.Value)
  351. }
  352. var (
  353. IoOptimizedNone = IoOptimized("none")
  354. IoOptimizedOptimized = IoOptimized("optimized")
  355. )
  356. type CreateInstanceArgs struct {
  357. RegionId common.Region
  358. ZoneId string
  359. ImageId string
  360. InstanceType string
  361. SecurityGroupId string
  362. InstanceName string
  363. Description string
  364. InternetChargeType common.InternetChargeType
  365. InternetMaxBandwidthIn int
  366. InternetMaxBandwidthOut int
  367. HostName string
  368. Password string
  369. IoOptimized IoOptimized
  370. SystemDisk SystemDiskType
  371. DataDisk []DataDiskType
  372. VSwitchId string
  373. PrivateIpAddress string
  374. ClientToken string
  375. InstanceChargeType common.InstanceChargeType
  376. Period int
  377. UserData string
  378. }
  379. type CreateInstanceResponse struct {
  380. common.Response
  381. InstanceId string
  382. }
  383. // CreateInstance creates instance
  384. //
  385. // You can read doc at http://docs.aliyun.com/#/pub/ecs/open-api/instance&createinstance
  386. func (client *Client) CreateInstance(args *CreateInstanceArgs) (instanceId string, err error) {
  387. if args.UserData != "" {
  388. // Encode to base64 string
  389. args.UserData = base64.StdEncoding.EncodeToString([]byte(args.UserData))
  390. }
  391. response := CreateInstanceResponse{}
  392. err = client.Invoke("CreateInstance", args, &response)
  393. if err != nil {
  394. return "", err
  395. }
  396. return response.InstanceId, err
  397. }
  398. type SecurityGroupArgs struct {
  399. InstanceId string
  400. SecurityGroupId string
  401. }
  402. type SecurityGroupResponse struct {
  403. common.Response
  404. }
  405. //JoinSecurityGroup
  406. //
  407. //You can read doc at https://help.aliyun.com/document_detail/ecs/open-api/instance/joinsecuritygroup.html
  408. func (client *Client) JoinSecurityGroup(instanceId string, securityGroupId string) error {
  409. args := SecurityGroupArgs{InstanceId: instanceId, SecurityGroupId: securityGroupId}
  410. response := SecurityGroupResponse{}
  411. err := client.Invoke("JoinSecurityGroup", &args, &response)
  412. return err
  413. }
  414. //LeaveSecurityGroup
  415. //
  416. //You can read doc at https://help.aliyun.com/document_detail/ecs/open-api/instance/leavesecuritygroup.html
  417. func (client *Client) LeaveSecurityGroup(instanceId string, securityGroupId string) error {
  418. args := SecurityGroupArgs{InstanceId: instanceId, SecurityGroupId: securityGroupId}
  419. response := SecurityGroupResponse{}
  420. err := client.Invoke("LeaveSecurityGroup", &args, &response)
  421. return err
  422. }