rds_test.go 7.5 KB

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