ecs_test.go 6.3 KB

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