ecs_test.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package integration
  2. import (
  3. "fmt"
  4. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/requests"
  5. "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
  6. "github.com/stretchr/testify/assert"
  7. "strconv"
  8. "strings"
  9. "testing"
  10. "time"
  11. )
  12. const (
  13. EcsInstanceDefaultTimeout = 120
  14. EcsDefaultWaitForInterval = 20
  15. EcsInstanceStatusRunning = "Running"
  16. EcsInstanceStatusStopped = "Stopped"
  17. EcsInstanceStatusDeleted = "Deleted"
  18. )
  19. // create -> start -> stop -> delete
  20. func TestEcsInstance(t *testing.T) {
  21. // init client
  22. config := getConfigFromEnv()
  23. ecsClient, err := ecs.NewClientWithAccessKey("cn-hangzhou", config.AccessKeyId, config.AccessKeySecret)
  24. assertErrorNil(t, err, "Failed to init client")
  25. fmt.Printf("Init client success\n")
  26. // get demo instance attributes
  27. param := getDemoEcsInstanceAttributes(t, ecsClient)
  28. // create
  29. instanceId := createEcsInstance(t, ecsClient, param)
  30. // defer wait for deleted
  31. defer waitForEcsInstance(t, ecsClient, instanceId, EcsInstanceStatusDeleted, 120)
  32. // defer delete
  33. defer deleteEcsInstance(t, ecsClient, instanceId)
  34. // wait
  35. waitForEcsInstance(t, ecsClient, instanceId, EcsInstanceStatusStopped, 60)
  36. // start
  37. startEcsInstance(t, ecsClient, instanceId)
  38. // wait
  39. waitForEcsInstance(t, ecsClient, instanceId, EcsInstanceStatusRunning, 120)
  40. // stop
  41. stopEcsInstance(t, ecsClient, instanceId)
  42. // wait
  43. waitForEcsInstance(t, ecsClient, instanceId, EcsInstanceStatusStopped, 600)
  44. //delete all test instance
  45. deleteAllTestEcsInstance(t, ecsClient)
  46. }
  47. func getDemoEcsInstanceAttributes(t *testing.T, client *ecs.Client) *ecs.DescribeInstanceAttributeResponse {
  48. fmt.Print("trying to get demo ecs instance...")
  49. request := ecs.CreateDescribeInstanceAttributeRequest()
  50. request.InstanceId = getEcsDemoInstanceId()
  51. response, err := client.DescribeInstanceAttribute(request)
  52. assertErrorNil(t, err, "Failed to get demo ecs instance attributes")
  53. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  54. fmt.Println("success!")
  55. return response
  56. }
  57. func createEcsInstance(t *testing.T, client *ecs.Client, param *ecs.DescribeInstanceAttributeResponse) (instanceId string) {
  58. fmt.Print("creating ecs instance...")
  59. request := ecs.CreateCreateInstanceRequest()
  60. request.ImageId = param.ImageId
  61. request.InstanceName = InstanceNamePrefix + strconv.FormatInt(time.Now().Unix(), 10)
  62. request.SecurityGroupId = param.SecurityGroupIds.SecurityGroupId[0]
  63. request.InstanceType = "ecs.t1.small"
  64. response, err := client.CreateInstance(request)
  65. assertErrorNil(t, err, "Failed to create ecs instance")
  66. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  67. instanceId = response.InstanceId
  68. fmt.Printf("success(%d)! instanceId = %s\n", response.GetHttpStatus(), instanceId)
  69. return
  70. }
  71. func startEcsInstance(t *testing.T, client *ecs.Client, instanceId string) {
  72. fmt.Printf("starting ecs instance(%s)...", instanceId)
  73. request := ecs.CreateStartInstanceRequest()
  74. request.InstanceId = instanceId
  75. response, err := client.StartInstance(request)
  76. assertErrorNil(t, err, "Failed to start ecs instance "+instanceId)
  77. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  78. fmt.Println("success!")
  79. }
  80. func stopEcsInstance(t *testing.T, client *ecs.Client, instanceId string) {
  81. fmt.Printf("stopping ecs instance(%s)...", instanceId)
  82. request := ecs.CreateStopInstanceRequest()
  83. request.InstanceId = instanceId
  84. response, err := client.StopInstance(request)
  85. assertErrorNil(t, err, "Failed to stop ecs instance "+instanceId)
  86. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  87. fmt.Println("success!")
  88. }
  89. func deleteEcsInstance(t *testing.T, client *ecs.Client, instanceId string) {
  90. fmt.Printf("deleting ecs instance(%s)...", instanceId)
  91. request := ecs.CreateDeleteInstanceRequest()
  92. request.InstanceId = instanceId
  93. response, err := client.DeleteInstance(request)
  94. assertErrorNil(t, err, "Failed to delete ecs instance "+instanceId)
  95. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  96. fmt.Println("success!")
  97. }
  98. func deleteAllTestEcsInstance(t *testing.T, client *ecs.Client) {
  99. fmt.Print("list all ecs instances...")
  100. request := ecs.CreateDescribeInstancesRequest()
  101. request.PageSize = requests.NewInteger(10)
  102. request.PageNumber = requests.NewInteger(1)
  103. response, err := client.DescribeInstances(request)
  104. assertErrorNil(t, err, "Failed to list all ecs instances ")
  105. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  106. fmt.Printf("success! TotalCount = %s\n", strconv.Itoa(response.TotalCount))
  107. for _, instanceInfo := range response.Instances.Instance {
  108. if strings.HasPrefix(instanceInfo.InstanceName, InstanceNamePrefix) {
  109. createTime, err := strconv.ParseInt(instanceInfo.InstanceName[26:len(instanceInfo.InstanceName)], 10, 64)
  110. assertErrorNil(t, err, "Parse instance create time failed: "+instanceInfo.InstanceName)
  111. if (time.Now().Unix() - createTime) < (5 * 60) {
  112. fmt.Printf("found undeleted ecs instance(%s) but created in 5 minutes, try to delete next time\n",instanceInfo.InstanceName)
  113. return
  114. }else{
  115. fmt.Printf("found undeleted ecs instance(%s), status=%s, try to delete it.\n",
  116. instanceInfo.Status, instanceInfo.InstanceId)
  117. if instanceInfo.Status == EcsInstanceStatusRunning {
  118. // stop
  119. stopEcsInstance(t, client, instanceInfo.InstanceId)
  120. } else if instanceInfo.Status == EcsInstanceStatusStopped {
  121. // delete
  122. deleteEcsInstance(t, client, instanceInfo.InstanceId)
  123. // wait
  124. waitForEcsInstance(t, client, instanceInfo.InstanceId, EcsInstanceStatusDeleted, 600)
  125. }
  126. }
  127. }
  128. }
  129. }
  130. func waitForEcsInstance(t *testing.T, client *ecs.Client, instanceId string, targetStatus string, timeout int) {
  131. if timeout <= 0 {
  132. timeout = EcsInstanceDefaultTimeout
  133. }
  134. for {
  135. request := ecs.CreateDescribeInstanceAttributeRequest()
  136. request.InstanceId = instanceId
  137. response, err := client.DescribeInstanceAttribute(request)
  138. if targetStatus == EcsInstanceStatusDeleted {
  139. if response.GetHttpStatus() == 404 || response.Status == EcsInstanceStatusDeleted {
  140. fmt.Printf("delete ecs instance(%s) success\n", instanceId)
  141. break
  142. } else {
  143. assertErrorNil(t, err, "Failed to describe ecs instance \n")
  144. }
  145. } else {
  146. assertErrorNil(t, err, "Failed to describe ecs instance \n")
  147. if response.Status == targetStatus {
  148. fmt.Printf("ecs instance(%s) status changed to %s, wait a moment\n", instanceId, targetStatus)
  149. time.Sleep(EcsDefaultWaitForInterval * time.Second)
  150. break
  151. } else {
  152. fmt.Printf("ecs instance(%s) status is %s, wait for changing to %s\n", instanceId, response.Status, targetStatus)
  153. }
  154. }
  155. timeout = timeout - EcsDefaultWaitForInterval
  156. if timeout <= 0 {
  157. t.Errorf(fmt.Sprintf("wait for ecs instance(%s) status to %s timeout(%d)\n", instanceId, targetStatus, timeout))
  158. }
  159. time.Sleep(EcsDefaultWaitForInterval * time.Second)
  160. }
  161. }