rds_test.go 7.5 KB

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