@@ -3,13 +3,141 @@ package tencentcloud
33import (
44 "context"
55 "fmt"
6+ "log"
7+ "strings"
68 "testing"
79 "time"
810
11+ sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
12+
913 "github.com/hashicorp/terraform-plugin-sdk/helper/resource"
1014 "github.com/hashicorp/terraform-plugin-sdk/terraform"
1115)
1216
17+ func init () {
18+ resource .AddTestSweepers ("redis_instance" , & resource.Sweeper {
19+ Name : "redis_instance" ,
20+ F : func (region string ) error {
21+ logId := getLogId (contextNil )
22+ ctx := context .WithValue (context .TODO (), logIdKey , logId )
23+ cli , _ := sharedClientForRegion (region )
24+ client := cli .(* TencentCloudClient ).apiV3Conn
25+
26+ service := RedisService {client : client }
27+
28+ instances , err := service .DescribeInstances (ctx , "ap-guangzhou-3" , "" , 0 , 0 )
29+
30+ if err != nil {
31+ return err
32+ }
33+
34+ for _ , v := range instances {
35+ name := v .Name
36+ id := v .RedisId
37+ if ! strings .HasPrefix (name , "terrform_test" ) {
38+ continue
39+ }
40+ // Collect infos before deleting action
41+ var chargeType string
42+ errQuery := resource .Retry (20 * readRetryTimeout , func () * resource.RetryError {
43+ has , online , info , err := service .CheckRedisOnlineOk (ctx , id )
44+ if err != nil {
45+ log .Printf ("[CRITAL]%s redis querying before deleting fail, reason:%s\n " , logId , err .Error ())
46+ return resource .NonRetryableError (err )
47+ }
48+ if ! has {
49+ return nil
50+ }
51+ if online {
52+ chargeType = REDIS_CHARGE_TYPE_NAME [* info .BillingMode ]
53+ return nil
54+ } else {
55+ return resource .RetryableError (fmt .Errorf ("Deleting ERROR: Creating redis task is processing." ))
56+ }
57+ })
58+ if errQuery != nil {
59+ log .Printf ("[CRITAL]%s redis querying before deleting task fail, reason:%s\n " , logId , errQuery .Error ())
60+ return errQuery
61+ }
62+
63+ var wait = func (action string , taskInfo interface {}) (errRet error ) {
64+
65+ errRet = resource .Retry (writeRetryTimeout , func () * resource.RetryError {
66+ var ok bool
67+ var err error
68+ switch v := taskInfo .(type ) {
69+ case int64 :
70+ ok , err = service .DescribeTaskInfo (ctx , id , v )
71+ case string :
72+ ok , _ , err = service .DescribeInstanceDealDetail (ctx , v )
73+ }
74+ if err != nil {
75+ if _ , ok := err .(* sdkErrors.TencentCloudSDKError ); ! ok {
76+ return resource .RetryableError (err )
77+ } else {
78+ return resource .NonRetryableError (err )
79+ }
80+ }
81+ if ok {
82+ return nil
83+ } else {
84+ return resource .RetryableError (fmt .Errorf ("%s timeout." , action ))
85+ }
86+ })
87+
88+ if errRet != nil {
89+ log .Printf ("[CRITAL]%s redis %s fail, reason:%s\n " , logId , action , errRet .Error ())
90+ }
91+ return errRet
92+ }
93+
94+ if chargeType == REDIS_CHARGE_TYPE_POSTPAID {
95+ taskId , err := service .DestroyPostpaidInstance (ctx , id )
96+ if err != nil {
97+ log .Printf ("[CRITAL]%s redis %s fail, reason:%s\n " , logId , "DestroyPostpaidInstance" , err .Error ())
98+ return err
99+ }
100+ if err = wait ("DestroyPostpaidInstance" , taskId ); err != nil {
101+ return err
102+ }
103+
104+ } else {
105+ if _ , err := service .DestroyPrepaidInstance (ctx , id ); err != nil {
106+ log .Printf ("[CRITAL]%s redis %s fail, reason:%s\n " , logId , "DestroyPrepaidInstance" , err .Error ())
107+ return err
108+ }
109+
110+ // Deal info only support create and renew and resize, need to check destroy status by describing api.
111+ if errDestroyChecking := resource .Retry (20 * readRetryTimeout , func () * resource.RetryError {
112+ has , isolated , err := service .CheckRedisDestroyOk (ctx , id )
113+ if err != nil {
114+ log .Printf ("[CRITAL]%s CheckRedisDestroyOk fail, reason:%s\n " , logId , err .Error ())
115+ return resource .NonRetryableError (err )
116+ }
117+ if ! has || isolated {
118+ return nil
119+ }
120+ return resource .RetryableError (fmt .Errorf ("instance is not ready to be destroyed" ))
121+ }); errDestroyChecking != nil {
122+ log .Printf ("[CRITAL]%s redis querying before deleting task fail, reason:%s\n " , logId , errDestroyChecking .Error ())
123+ return errDestroyChecking
124+ }
125+ }
126+
127+ taskId , err := service .CleanUpInstance (ctx , id )
128+ if err != nil {
129+ log .Printf ("[CRITAL]%s redis %s fail, reason:%s\n " , logId , "CleanUpInstance" , err .Error ())
130+ return err
131+ }
132+
133+ wait ("CleanUpInstance" , taskId )
134+ }
135+
136+ return nil
137+ },
138+ })
139+ }
140+
13141func TestAccTencentCloudRedisInstance (t * testing.T ) {
14142 t .Parallel ()
15143 resource .Test (t , resource.TestCase {
0 commit comments