Skip to content

Commit 9db054c

Browse files
authored
feat(cdb): [117461373]support mysql ssl (#2687)
* feat(cdb): [117461373]support mysql ssl * feat(cdb): [117461373]support mysql ssl * feat: add changelog
1 parent 9488e5e commit 9db054c

File tree

15 files changed

+3958
-2617
lines changed

15 files changed

+3958
-2617
lines changed

.changelog/2687.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:new-resource
2+
tencentcloud_mysql_ssl
3+
```

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ require (
3535
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam v1.0.760
3636
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cat v1.0.825
3737
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs v1.0.591
38-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb v1.0.800
38+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb v1.0.944
3939
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.539
4040
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdwch v1.0.843
4141
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cfs v1.0.627

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -838,6 +838,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs v1.0.591 h1:TPGLjH6
838838
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs v1.0.591/go.mod h1:nCAGfVTXZkVnurkbjF3b0FM6RwGztE9t8D9Ms1unaKo=
839839
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb v1.0.800 h1:VnnmCIaAXU7t0uwNtaLs990V7+V7/7viMpOytOT6GOE=
840840
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb v1.0.800/go.mod h1:8wiecMvcwN6785rTWLJmdm/Y7u1DjFmqI/iqiWwpm5o=
841+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb v1.0.944 h1:+PGoNHlZE/WY6KWWNOByL0sYVv1ZJtSx7yXMUJNYV1Y=
842+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb v1.0.944/go.mod h1:+VHcZ4Cnzpt6vtCvNROz8xWfNWUkoAZ9UPSonbA3NWM=
841843
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdc v1.0.967 h1:+05iVbm200Dh1td+apCB/aX2w97TvmcSlpECkaL53Bw=
842844
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdc v1.0.967/go.mod h1:JzIWhJtlitR2S92TMXikPAOQlC8smQrMbU2Y8NBzRk8=
843845
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdc v1.0.970 h1:0A6PwOaUeLtm4U5TR1uD91ETBgDcnfqFnsG9mwCNvlY=
@@ -947,6 +949,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.920/go.mod
947949
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.921/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
948950
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.932 h1:MB1+Ll6JxWTpZw/v0dMRvMEJhlcDKxK/JMQ8O5owRVc=
949951
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.932/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
952+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.944 h1:O3AcToplHDczOWzJgpqhkBYJH7f6TyAwTSy1b8yao4o=
953+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.944/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
950954
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.947 h1:obeD8UftWQ6XO1OlQQYMAJ2r6tqKPTQ/+8IrZAE0BMs=
951955
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.947/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
952956
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.949/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=

tencentcloud/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1266,6 +1266,7 @@ func Provider() *schema.Provider {
12661266
"tencentcloud_mysql_ro_start_replication": cdb.ResourceTencentCloudMysqlRoStartReplication(),
12671267
"tencentcloud_mysql_ro_stop_replication": cdb.ResourceTencentCloudMysqlRoStopReplication(),
12681268
"tencentcloud_mysql_switch_proxy": cdb.ResourceTencentCloudMysqlSwitchProxy(),
1269+
"tencentcloud_mysql_ssl": cdb.ResourceTencentCloudMysqlSsl(),
12691270
"tencentcloud_cos_bucket": cos.ResourceTencentCloudCosBucket(),
12701271
"tencentcloud_cos_bucket_object": cos.ResourceTencentCloudCosBucketObject(),
12711272
"tencentcloud_cos_bucket_referer": cos.ResourceTencentCloudCosBucketReferer(),

tencentcloud/provider.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,6 +784,7 @@ TencentDB for MySQL(cdb)
784784
tencentcloud_mysql_ro_stop_replication
785785
tencentcloud_mysql_isolate_instance
786786
tencentcloud_mysql_dr_instance
787+
tencentcloud_mysql_ssl
787788

788789
Cloud Monitor(Monitor)
789790
Data Source
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
package cdb
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
8+
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
9+
10+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
11+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
12+
mysql "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb/v20170320"
13+
14+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
15+
)
16+
17+
func ResourceTencentCloudMysqlSsl() *schema.Resource {
18+
return &schema.Resource{
19+
Create: resourceTencentCloudMysqlSslCreate,
20+
Read: resourceTencentCloudMysqlSslRead,
21+
Update: resourceTencentCloudMysqlSslUpdate,
22+
Delete: resourceTencentCloudMysqlSslDelete,
23+
Importer: &schema.ResourceImporter{
24+
State: schema.ImportStatePassthrough,
25+
},
26+
Schema: map[string]*schema.Schema{
27+
"instance_id": {
28+
Required: true,
29+
Type: schema.TypeString,
30+
Description: "Instance ID. Example value: cdb-c1nl9rpv.",
31+
},
32+
33+
"status": {
34+
Required: true,
35+
Type: schema.TypeString,
36+
Description: "Whether to enable SSL. `ON` means enabled, `OFF` means not enabled.",
37+
},
38+
39+
"url": {
40+
Computed: true,
41+
Type: schema.TypeString,
42+
Description: "The certificate download link. Example value: http://testdownload.url.",
43+
},
44+
},
45+
}
46+
}
47+
48+
func resourceTencentCloudMysqlSslCreate(d *schema.ResourceData, meta interface{}) error {
49+
defer tccommon.LogElapsed("resource.tencentcloud_mysql_ssl.create")()
50+
defer tccommon.InconsistentCheck(d, meta)()
51+
52+
d.SetId(d.Get("instance_id").(string))
53+
54+
return resourceTencentCloudMysqlSslUpdate(d, meta)
55+
}
56+
57+
func resourceTencentCloudMysqlSslRead(d *schema.ResourceData, meta interface{}) error {
58+
defer tccommon.LogElapsed("resource.tencentcloud_mysql_ssl.read")()
59+
defer tccommon.InconsistentCheck(d, meta)()
60+
61+
logId := tccommon.GetLogId(tccommon.ContextNil)
62+
63+
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
64+
65+
service := MysqlService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
66+
67+
instanceId := d.Id()
68+
69+
ssl, err := service.DescribeMysqlSslById(ctx, instanceId)
70+
if err != nil {
71+
return err
72+
}
73+
74+
if ssl == nil {
75+
d.SetId("")
76+
log.Printf("[WARN]%s resource `tencentcloud_mysql_ssl` [%s] not found, please check if it has been deleted.",
77+
logId, instanceId,
78+
)
79+
return nil
80+
}
81+
82+
_ = d.Set("instance_id", instanceId)
83+
84+
if ssl.Status != nil {
85+
_ = d.Set("status", ssl.Status)
86+
}
87+
88+
if ssl.Url != nil {
89+
_ = d.Set("url", ssl.Url)
90+
}
91+
92+
return nil
93+
}
94+
95+
func resourceTencentCloudMysqlSslUpdate(d *schema.ResourceData, meta interface{}) error {
96+
defer tccommon.LogElapsed("resource.tencentcloud_mysql_ssl.update")()
97+
defer tccommon.InconsistentCheck(d, meta)()
98+
99+
logId := tccommon.GetLogId(tccommon.ContextNil)
100+
101+
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
102+
103+
instanceId := d.Id()
104+
105+
status := ""
106+
if v, ok := d.GetOk("status"); ok {
107+
status = v.(string)
108+
if status == "ON" {
109+
request := mysql.NewOpenSSLRequest()
110+
request.InstanceId = helper.String(instanceId)
111+
112+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
113+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseMysqlClient().OpenSSL(request)
114+
if e != nil {
115+
return tccommon.RetryError(e)
116+
} else {
117+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
118+
}
119+
return nil
120+
})
121+
if err != nil {
122+
log.Printf("[CRITAL]%s update mysql ssl failed, reason:%+v", logId, err)
123+
return err
124+
}
125+
} else if status == "OFF" {
126+
request := mysql.NewCloseSSLRequest()
127+
request.InstanceId = helper.String(instanceId)
128+
129+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
130+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseMysqlClient().CloseSSL(request)
131+
if e != nil {
132+
return tccommon.RetryError(e)
133+
} else {
134+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
135+
}
136+
return nil
137+
})
138+
if err != nil {
139+
log.Printf("[CRITAL]%s update mysql ssl failed, reason:%+v", logId, err)
140+
return err
141+
}
142+
} else {
143+
return fmt.Errorf("[CRITAL]%s update mysql ssl failed, reason:your status must be ON or OFF!", logId)
144+
}
145+
146+
if status != "" {
147+
service := MysqlService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
148+
err := resource.Retry(7*tccommon.ReadRetryTimeout, func() *resource.RetryError {
149+
ssl, err := service.DescribeMysqlSslById(ctx, instanceId)
150+
if err != nil {
151+
return resource.NonRetryableError(err)
152+
}
153+
if ssl == nil {
154+
err = fmt.Errorf("mysqlid %s instance ssl not exists", instanceId)
155+
return resource.NonRetryableError(err)
156+
}
157+
if *ssl.Status != status {
158+
return resource.RetryableError(fmt.Errorf("mysql ssl status is (%v)", *ssl.Status))
159+
}
160+
if *ssl.Status == status {
161+
return nil
162+
}
163+
err = fmt.Errorf("mysql ssl status is %v,we won't wait for it finish", *ssl.Status)
164+
return resource.NonRetryableError(err)
165+
})
166+
167+
if err != nil {
168+
log.Printf("[CRITAL]%s mysql switchForUpgrade fail, reason:%s\n ", logId, err.Error())
169+
return err
170+
}
171+
}
172+
}
173+
174+
return resourceTencentCloudMysqlSslRead(d, meta)
175+
}
176+
177+
func resourceTencentCloudMysqlSslDelete(d *schema.ResourceData, meta interface{}) error {
178+
defer tccommon.LogElapsed("resource.tencentcloud_mysql_ssl.delete")()
179+
180+
return nil
181+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
Provides a resource to create a mysql ssl
2+
3+
Example Usage
4+
5+
```hcl
6+
resource "tencentcloud_mysql_ssl" "ssl" {
7+
instance_id = "cdb-j5rprr8n"
8+
status = "OFF"
9+
}
10+
```
11+
12+
Import
13+
14+
mysql ssl can be imported using the id, e.g.
15+
16+
```
17+
terraform import tencentcloud_mysql_ssl.ssl instanceId
18+
```
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
package cdb_test
2+
3+
import (
4+
"testing"
5+
6+
tcacctest "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/acctest"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
9+
)
10+
11+
func TestAccTencentCloudMysqlSslResource_basic(t *testing.T) {
12+
t.Parallel()
13+
resource.Test(t, resource.TestCase{
14+
PreCheck: func() {
15+
tcacctest.AccPreCheck(t)
16+
},
17+
Providers: tcacctest.AccProviders,
18+
Steps: []resource.TestStep{
19+
{
20+
Config: testAccMysqlSsl,
21+
Check: resource.ComposeTestCheckFunc(
22+
resource.TestCheckResourceAttrSet("tencentcloud_mysql_ssl.ssl", "id"),
23+
resource.TestCheckResourceAttr("tencentcloud_mysql_ssl.ssl", "status", "ON"),
24+
resource.TestCheckResourceAttrSet("tencentcloud_mysql_ssl.ssl", "url"),
25+
),
26+
},
27+
{
28+
ResourceName: "tencentcloud_mysql_ssl.ssl",
29+
ImportState: true,
30+
ImportStateVerify: true,
31+
},
32+
{
33+
Config: testAccMysqlSslUp,
34+
Check: resource.ComposeTestCheckFunc(
35+
resource.TestCheckResourceAttrSet("tencentcloud_mysql_ssl.ssl", "id"),
36+
resource.TestCheckResourceAttr("tencentcloud_mysql_ssl.ssl", "status", "OFF"),
37+
resource.TestCheckResourceAttrSet("tencentcloud_mysql_ssl.ssl", "url"),
38+
),
39+
},
40+
},
41+
})
42+
}
43+
44+
const testAccMysqlSsl = testAccMysql + `
45+
46+
resource "tencentcloud_mysql_ssl" "ssl" {
47+
instance_id = tencentcloud_mysql_instance.mysql.id
48+
status = "ON"
49+
}
50+
51+
`
52+
53+
const testAccMysqlSslUp = testAccMysql + `
54+
55+
resource "tencentcloud_mysql_ssl" "ssl" {
56+
instance_id = tencentcloud_mysql_instance.mysql.id
57+
status = "OFF"
58+
}
59+
60+
`

tencentcloud/services/cdb/service_tencentcloud_mysql.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1441,6 +1441,31 @@ func (me *MysqlService) DescribeMysqlTimeWindowById(ctx context.Context, instanc
14411441
return
14421442
}
14431443

1444+
func (me *MysqlService) DescribeMysqlSslById(ctx context.Context, instanceId string) (ssl *cdb.DescribeSSLStatusResponseParams, errRet error) {
1445+
logId := tccommon.GetLogId(ctx)
1446+
1447+
request := cdb.NewDescribeSSLStatusRequest()
1448+
request.InstanceId = &instanceId
1449+
1450+
defer func() {
1451+
if errRet != nil {
1452+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
1453+
}
1454+
}()
1455+
1456+
ratelimit.Check(request.GetAction())
1457+
1458+
response, err := me.client.UseMysqlClient().DescribeSSLStatus(request)
1459+
if err != nil {
1460+
errRet = err
1461+
return
1462+
}
1463+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
1464+
1465+
ssl = response.Response
1466+
return
1467+
}
1468+
14441469
func (me *MysqlService) DeleteMysqlTimeWindowById(ctx context.Context, instanceId string) (errRet error) {
14451470
logId := tccommon.GetLogId(ctx)
14461471

0 commit comments

Comments
 (0)