rds_test.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package integration
  2. import (
  3. "testing"
  4. "fmt"
  5. "github.com/aliyun/alibaba-cloud-sdk-go/services/rds"
  6. "github.com/stretchr/testify/assert"
  7. "time"
  8. "strconv"
  9. "strings"
  10. )
  11. const (
  12. RdsInstanceDefaultTimeout = 120
  13. RdsDefaultWaitForInterval = 60
  14. RdsInstanceStatusRunning = "Running"
  15. RdsInstanceStatusStopped = "Stopped"
  16. RdsInstanceStatusDeleted = "Deleted"
  17. )
  18. func TestRdsInstance(t *testing.T) {
  19. // init client
  20. config := getConfigFromEnv()
  21. rdsClient, err := rds.NewClientWithAccessKey("cn-hangzhou", config.AccessKeyId, config.AccessKeySecret)
  22. assertErrorNil(t, err, "Failed to init client")
  23. fmt.Printf("Init client success\n")
  24. dbInstanceId := createDBInstance(t, rdsClient)
  25. waitForRdsInstance(t, rdsClient, dbInstanceId, RdsInstanceStatusRunning, 1200)
  26. //createAccount(t, rdsClient, dbInstanceId)
  27. //nodeId := getHAConfig(t, rdsClient, dbInstanceId)
  28. //
  29. //changeNodeToMaster(t, rdsClient, dbInstanceId, nodeId)
  30. //
  31. //createDataBase(t, rdsClient, dbInstanceId)
  32. deleteDBInstance(t, rdsClient, dbInstanceId)
  33. //deleteAllTestRdsInstance(t, rdsClient)
  34. }
  35. func createDBInstance(t *testing.T, client *rds.Client) (rdsInstanceId string) {
  36. fmt.Print("creating rds mysql instance...")
  37. request := rds.CreateCreateDBInstanceRequest()
  38. request.Engine = "MySQL"
  39. request.EngineVersion = "5.7"
  40. request.DBInstanceClass = "mysql.n1.micro.1"
  41. request.DBInstanceStorage = "20"
  42. request.DBInstanceNetType = "Intranet"
  43. request.SecurityIPList = "0.0.0.0/0"
  44. request.PayType = "Postpaid"
  45. request.DBInstanceDescription = InstanceNamePrefix + strconv.FormatInt(time.Now().Unix(), 10)
  46. response, err := client.CreateDBInstance(request)
  47. assertErrorNil(t, err, "Failed to create rds mysql instance")
  48. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  49. rdsInstanceId = response.DBInstanceId
  50. fmt.Printf("success(%d)! dbInstanceId = %s\n", response.GetHttpStatus(), rdsInstanceId)
  51. return
  52. }
  53. func getHAConfig(t *testing.T, client *rds.Client, instanceId string)(nodeId string){
  54. fmt.Print("get dbInstance HA nodeId...")
  55. request := rds.CreateDescribeDBInstanceHAConfigRequest()
  56. request.DBInstanceId = instanceId
  57. response, err := client.DescribeDBInstanceHAConfig(request)
  58. assertErrorNil(t, err, "Failed to get dbInstance HA nodeId")
  59. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  60. nodeId = response.HostInstanceInfos.NodeInfo[0].NodeId
  61. fmt.Printf("success(%d)! nodeId = %s\n", response.GetHttpStatus(), nodeId)
  62. return
  63. }
  64. func changeNodeToMaster(t *testing.T, client *rds.Client, instanceId, nodeId string){
  65. fmt.Print("trying to change current instance to master...")
  66. request := rds.CreateSwitchDBInstanceHARequest()
  67. request.DBInstanceId = instanceId
  68. request.NodeId = nodeId
  69. response, err := client.SwitchDBInstanceHA(request)
  70. assertErrorNil(t, err, "Failed to change current instance to master")
  71. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  72. fmt.Printf("success(%d)!\n", response.GetHttpStatus())
  73. return
  74. }
  75. func createAccount(t *testing.T, client *rds.Client, instanceId string) {
  76. fmt.Print("creating mysql account...")
  77. request := rds.CreateCreateAccountRequest()
  78. request.DBInstanceId = instanceId
  79. request.AccountName = "sdktest"
  80. request.AccountPassword = strconv.FormatInt(time.Now().Unix(), 10)
  81. response, err := client.CreateAccount(request)
  82. assertErrorNil(t, err, "Failed to create mysql account")
  83. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  84. fmt.Printf("success(%d)!\n", response.GetHttpStatus())
  85. return
  86. }
  87. func createDataBase(t *testing.T, client *rds.Client, instanceId string) {
  88. fmt.Print("creating mysql database...")
  89. request := rds.CreateCreateDatabaseRequest()
  90. request.DBInstanceId = instanceId
  91. request.DBName = "sdktest"
  92. request.CharacterSetName = "utf8"
  93. response, err := client.CreateDatabase(request)
  94. assertErrorNil(t, err, "Failed to create mysql database")
  95. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  96. fmt.Printf("success(%d)!\n", response.GetHttpStatus())
  97. return
  98. }
  99. func deleteDBInstance(t *testing.T, client *rds.Client, instanceId string) {
  100. fmt.Print("deleting rds instance...")
  101. request := rds.CreateDeleteDBInstanceRequest()
  102. request.DBInstanceId = instanceId
  103. response, err := client.DeleteDBInstance(request)
  104. assertErrorNil(t, err, "Failed to delete rds instance")
  105. assert.Equal(t, 200, response.GetHttpStatus(), response.GetHttpContentString())
  106. fmt.Printf("success(%d)!\n", response.GetHttpStatus())
  107. return
  108. }
  109. func waitForRdsInstance(t *testing.T, client *rds.Client, instanceId string, targetStatus string, timeout int) {
  110. if timeout <= 0 {
  111. timeout = RdsInstanceDefaultTimeout
  112. }
  113. for {
  114. request := rds.CreateDescribeDBInstanceAttributeRequest()
  115. request.DBInstanceId = instanceId
  116. response, err := client.DescribeDBInstanceAttribute(request)
  117. currentStatus := getSingleInstanceStatusFromDescribeDBInstanceAttributeResponse(response)
  118. if targetStatus == RdsInstanceStatusDeleted {
  119. if currentStatus == targetStatus {
  120. fmt.Printf("delete rds instance(%s) success\n", instanceId)
  121. break
  122. } else {
  123. assertErrorNil(t, err, "Failed to describe rds instance \n")
  124. }
  125. } else {
  126. assertErrorNil(t, err, "Failed to describe rds instance \n")
  127. if currentStatus == targetStatus {
  128. fmt.Printf("rds instance(%s) status changed to %s, wait a moment\n", instanceId, targetStatus)
  129. time.Sleep(RdsDefaultWaitForInterval * time.Second)
  130. break
  131. } else {
  132. fmt.Printf("rds instance(%s) status is %s, wait for changing to %s\n", instanceId, currentStatus, targetStatus)
  133. }
  134. }
  135. timeout = timeout - RdsDefaultWaitForInterval
  136. if timeout <= 0 {
  137. t.Errorf(fmt.Sprintf("wait for ecs instance(%s) status to %s timeout(%d)\n", instanceId, targetStatus, timeout))
  138. }
  139. time.Sleep(RdsDefaultWaitForInterval * time.Second)
  140. }
  141. }
  142. func deleteAllTestRdsInstance(t *testing.T, client *rds.Client) {
  143. // list all instances
  144. fmt.Print("trying to list all rds test instances...")
  145. listRequest := rds.CreateDescribeDBInstancesRequest()
  146. listResponse, err := client.DescribeDBInstances(listRequest)
  147. assertErrorNil(t, err, "Failed to list all rds instances")
  148. assert.Equal(t, 200, listResponse.GetHttpStatus(), listResponse.GetHttpContentString())
  149. fmt.Printf("found %s instances\n", strconv.Itoa(listResponse.TotalRecordCount))
  150. for _, instance := range listResponse.Items.DBInstance {
  151. if strings.HasPrefix(instance.DBInstanceDescription, InstanceNamePrefix) {
  152. fmt.Printf("found test instance(%s), trying to delte it\n", instance.DBInstanceId)
  153. deleteDBInstance(t, client, instance.DBInstanceId)
  154. }
  155. }
  156. }
  157. func getSingleInstanceStatusFromDescribeDBInstanceAttributeResponse(response *rds.DescribeDBInstanceAttributeResponse) string {
  158. if response.GetHttpStatus() == 404 || len(response.Items.DBInstanceAttribute) == 0 {
  159. return RdsInstanceStatusDeleted
  160. }
  161. return response.Items.DBInstanceAttribute[0].DBInstanceStatus
  162. }