slb_test.go 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. package integration
  2. import (
  3. "fmt"
  4. "github.com/aliyun/alibaba-cloud-sdk-go/sdk/utils"
  5. "github.com/aliyun/alibaba-cloud-sdk-go/services/slb"
  6. "github.com/stretchr/testify/assert"
  7. "net/http"
  8. "strconv"
  9. "strings"
  10. "testing"
  11. "time"
  12. )
  13. const (
  14. SlbInstanceStopped = "inactive"
  15. )
  16. // create -> start -> stop -> delete
  17. func TestSlbInstance(t *testing.T) {
  18. // init client
  19. config := getConfigFromEnv()
  20. slbClient, err := slb.NewClientWithAccessKey("cn-hangzhou", config.AccessKeyId, config.AccessKeySecret)
  21. assertErrorNil(t, err, "Failed to init client")
  22. fmt.Printf("Init client success\n")
  23. // create
  24. instanceId := createSlbInstance(t, slbClient)
  25. // defer delete
  26. defer deleteSlbInstance(t, slbClient, instanceId)
  27. // add backend server
  28. addBackEndServer(t, slbClient, instanceId)
  29. // set weight to 80
  30. setBackEndServer(t, slbClient, instanceId)
  31. // remove backend server
  32. removeBackEndServer(t, slbClient, instanceId)
  33. // stop
  34. stopSlbInstance(t, slbClient, instanceId)
  35. // delete all test instance
  36. deleteAllTestSlbInstance(t, slbClient)
  37. }
  38. func createSlbInstance(t *testing.T, client *slb.Client) (instanceId string) {
  39. fmt.Print("creating slb instance...")
  40. request := slb.CreateCreateLoadBalancerRequest()
  41. request.LoadBalancerName = InstanceNamePrefix + strconv.FormatInt(time.Now().Unix(), 10)
  42. request.AddressType = "internet"
  43. request.ClientToken = utils.GetUUIDV4()
  44. response, err := client.CreateLoadBalancer(request)
  45. assertErrorNil(t, err, "Failed to create slb instance")
  46. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  47. instanceId = response.LoadBalancerId
  48. fmt.Printf("success(%d)! loadBalancerId = %s\n", response.GetHttpStatus(), instanceId)
  49. return
  50. }
  51. func stopSlbInstance(t *testing.T, client *slb.Client, instanceId string) {
  52. fmt.Printf("stopping slb instance(%s)...", instanceId)
  53. request := slb.CreateSetLoadBalancerStatusRequest()
  54. request.LoadBalancerId = instanceId
  55. request.LoadBalancerStatus = SlbInstanceStopped
  56. response, err := client.SetLoadBalancerStatus(request)
  57. assertErrorNil(t, err, "Failed to stop slb instance "+instanceId)
  58. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  59. fmt.Println("success!")
  60. }
  61. func deleteSlbInstance(t *testing.T, client *slb.Client, instanceId string) {
  62. fmt.Printf("deleting slb instance(%s)...", instanceId)
  63. request := slb.CreateDeleteLoadBalancerRequest()
  64. request.LoadBalancerId = instanceId
  65. response, err := client.DeleteLoadBalancer(request)
  66. if response != nil && response.GetHttpStatus() == http.StatusNotFound {
  67. fmt.Println("success!")
  68. } else {
  69. assertErrorNil(t, err, "Failed to delete slb instance "+instanceId)
  70. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  71. fmt.Println("success!")
  72. }
  73. }
  74. func addBackEndServer(t *testing.T, client *slb.Client, instanceId string) {
  75. fmt.Printf("add backend server for slb(%s)...", instanceId)
  76. ecsDemoInstanceId := getEcsDemoInstanceId()
  77. request := slb.CreateSetBackendServersRequest()
  78. request.BackendServers = fmt.Sprintf("[{\"ServerId\":\"%s\",\"Weight\":\"100\"}]", ecsDemoInstanceId)
  79. request.LoadBalancerId = instanceId
  80. response, err := client.SetBackendServers(request)
  81. assertErrorNil(t, err, "Failed to add backend servers, LoadBalancerId: "+instanceId)
  82. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  83. fmt.Println("success!")
  84. }
  85. func setBackEndServer(t *testing.T, client *slb.Client, instanceId string) {
  86. fmt.Printf("set backend server for slb(%s)...", instanceId)
  87. ecsDemoInstanceId := getEcsDemoInstanceId()
  88. request := slb.CreateSetBackendServersRequest()
  89. request.BackendServers = fmt.Sprintf("[{\"ServerId\":\"%s\",\"Weight\":\"80\"}]", ecsDemoInstanceId)
  90. request.LoadBalancerId = instanceId
  91. response, err := client.SetBackendServers(request)
  92. assertErrorNil(t, err, "Failed to set backend servers, LoadBalancerId: "+instanceId)
  93. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  94. fmt.Println("success!")
  95. }
  96. func removeBackEndServer(t *testing.T, client *slb.Client, instanceId string) {
  97. fmt.Printf("remove backend server for slb(%s)...", instanceId)
  98. ecsDemoInstanceId := getEcsDemoInstanceId()
  99. request := slb.CreateRemoveBackendServersRequest()
  100. request.BackendServers = fmt.Sprintf("[\"%s\"]", ecsDemoInstanceId)
  101. request.LoadBalancerId = instanceId
  102. response, err := client.RemoveBackendServers(request)
  103. assertErrorNil(t, err, "Failed to remove backend servers, LoadBalancerId: "+instanceId)
  104. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  105. fmt.Println("success!")
  106. }
  107. func deleteAllTestSlbInstance(t *testing.T, client *slb.Client) {
  108. fmt.Printf("list all slb instances...")
  109. request := slb.CreateDescribeLoadBalancersRequest()
  110. response, err := client.DescribeLoadBalancers(request)
  111. assertErrorNil(t, err, "Failed to list all slb instances")
  112. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  113. fmt.Printf("success(%d)! TotalCount = %s\n", response.GetHttpStatus(), strconv.Itoa(response.TotalCount))
  114. for _, slbInstanceInfo := range response.LoadBalancers.LoadBalancer {
  115. if strings.HasPrefix(slbInstanceInfo.LoadBalancerName, InstanceNamePrefix) {
  116. createTime, err := strconv.ParseInt(slbInstanceInfo.LoadBalancerName[len(InstanceNamePrefix):], 10, 64)
  117. assertErrorNil(t, err, "Parse instance create time failed: "+slbInstanceInfo.LoadBalancerName)
  118. if (time.Now().Unix() - createTime) < (5 * 60) {
  119. fmt.Printf("found undeleted slb instance(%s) but created in 5 minutes, try to delete next time\n", slbInstanceInfo.LoadBalancerName)
  120. return
  121. } else {
  122. fmt.Printf("found undeleted slb instance(%s), status=%s, try to delete it.\n",
  123. slbInstanceInfo.LoadBalancerId, slbInstanceInfo.LoadBalancerStatus)
  124. if slbInstanceInfo.LoadBalancerStatus != SlbInstanceStopped {
  125. // stop
  126. stopSlbInstance(t, client, slbInstanceInfo.LoadBalancerId)
  127. }
  128. // delete
  129. deleteSlbInstance(t, client, slbInstanceInfo.LoadBalancerId)
  130. }
  131. }
  132. }
  133. }