ecs_test.go 5.3 KB

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