ecs_test.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package integration
  2. import (
  3. "fmt"
  4. "github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
  5. "github.com/stretchr/testify/assert"
  6. "os"
  7. "testing"
  8. "time"
  9. )
  10. const (
  11. InstanceDefaultTimeout = 120
  12. DefaultWaitForInterval = 10
  13. Running = "Running"
  14. Stopped = "Stopped"
  15. Deleted = "Deleted"
  16. )
  17. // create -> start -> stop -> delete
  18. func TestEcsInstance(t *testing.T) {
  19. // init client
  20. config := getConfigFromEnv()
  21. ecsClient, err := ecs.NewClientWithAccessKey("cn-hangzhou", config.AccessKeyId, config.AccessKeySecret)
  22. assertErrorNil(t, err, "Failed to init client")
  23. fmt.Printf("Init client success\n")
  24. // get demo instance attributes
  25. param := getDemoInstanceAttributes(t, ecsClient)
  26. // create
  27. instanceId := createInstance(t, ecsClient, param)
  28. // defer wait for deleted
  29. defer waitForInstance(t, ecsClient, instanceId, Deleted, 120)
  30. // defer delete
  31. defer deleteInstance(t, ecsClient, instanceId)
  32. // wait
  33. waitForInstance(t, ecsClient, instanceId, Stopped, 60)
  34. // start
  35. startInstance(t, ecsClient, instanceId)
  36. // wait
  37. waitForInstance(t, ecsClient, instanceId, Running, 120)
  38. // stop
  39. stopInstance(t, ecsClient, instanceId)
  40. // wait
  41. waitForInstance(t, ecsClient, instanceId, Stopped, 600)
  42. }
  43. func getDemoInstanceAttributes(t *testing.T, client *ecs.Client) *ecs.DescribeInstanceAttributeResponse {
  44. fmt.Print("trying to get demo instance...")
  45. request := ecs.CreateDescribeInstanceAttributeRequest()
  46. request.InstanceId = os.Getenv("DEMO_ECS_INSTANCE_ID")
  47. response, err := client.DescribeInstanceAttribute(request)
  48. assertErrorNil(t, err, "Failed to get demo instance attributes")
  49. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  50. fmt.Println("success!")
  51. return response
  52. }
  53. func createInstance(t *testing.T, client *ecs.Client, param *ecs.DescribeInstanceAttributeResponse) (instanceId string) {
  54. fmt.Print("creating instance...")
  55. request := ecs.CreateCreateInstanceRequest()
  56. request.ImageId = param.ImageId
  57. request.SecurityGroupId = param.SecurityGroupIds.SecurityGroupId[0]
  58. request.InstanceType = "ecs.t1.small"
  59. response, err := client.CreateInstance(request)
  60. assertErrorNil(t, err, "Failed to create instance")
  61. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  62. instanceId = response.InstanceId
  63. fmt.Printf("success(%d)! instanceId = %s\n", response.GetHttpStatus(), instanceId)
  64. return
  65. }
  66. func startInstance(t *testing.T, client *ecs.Client, instanceId string) {
  67. fmt.Printf("starting instance(%s)...", instanceId)
  68. request := ecs.CreateStartInstanceRequest()
  69. request.InstanceId = instanceId
  70. response, err := client.StartInstance(request)
  71. assertErrorNil(t, err, "Failed to start instance "+instanceId)
  72. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  73. fmt.Println("success!")
  74. }
  75. func stopInstance(t *testing.T, client *ecs.Client, instanceId string) {
  76. fmt.Printf("stopping instance(%s)...", instanceId)
  77. request := ecs.CreateStopInstanceRequest()
  78. request.InstanceId = instanceId
  79. response, err := client.StopInstance(request)
  80. assertErrorNil(t, err, "Failed to stop instance "+instanceId)
  81. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  82. fmt.Println("success!")
  83. }
  84. func deleteInstance(t *testing.T, client *ecs.Client, instanceId string) {
  85. fmt.Printf("deleting instance(%s)...", instanceId)
  86. request := ecs.CreateDeleteInstanceRequest()
  87. request.InstanceId = instanceId
  88. response, err := client.DeleteInstance(request)
  89. assertErrorNil(t, err, "Failed to delete instance "+instanceId)
  90. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  91. fmt.Println("success!")
  92. }
  93. func assertErrorNil(t *testing.T, err error, message string) {
  94. if err != nil {
  95. fmt.Fprintf(os.Stderr, message+": %v\n", err)
  96. }
  97. }
  98. func waitForInstance(t *testing.T, client *ecs.Client, instanceId string, status string, timeout int) {
  99. if timeout <= 0 {
  100. timeout = InstanceDefaultTimeout
  101. }
  102. for {
  103. request := ecs.CreateDescribeInstanceAttributeRequest()
  104. request.InstanceId = instanceId
  105. response, err := client.DescribeInstanceAttribute(request)
  106. assertErrorNil(t, err, "Failed to create describe instance request\n")
  107. if status == Deleted {
  108. if response.GetHttpStatus() == 404 || response.Status == Deleted {
  109. fmt.Printf("delete instance(%s) success\n", instanceId)
  110. break
  111. }
  112. } else {
  113. if response.Status == status {
  114. fmt.Printf("instance(%s) status changed to %s, wait a moment\n", instanceId, status)
  115. time.Sleep(DefaultWaitForInterval * time.Second)
  116. break
  117. } else {
  118. fmt.Printf("instance(%s) status is %s, wait for changing to %s\n", instanceId, response.Status, status)
  119. }
  120. }
  121. timeout = timeout - DefaultWaitForInterval
  122. if timeout <= 0 {
  123. t.Errorf(fmt.Sprintf("wait for instance(%s) status to %s timeout(%d)\n", instanceId, status, timeout))
  124. }
  125. time.Sleep(DefaultWaitForInterval * time.Second)
  126. }
  127. }