Skip to content

Commit 2093ad6

Browse files
tongyimingmikatong
and
mikatong
authored
fix(cynosdb): [123732429] support cynosdb ssl (#3350)
* support cynosdb ssl * update doc * add changelog * update * update --------- Co-authored-by: mikatong <[email protected]>
1 parent 7c21b4b commit 2093ad6

File tree

15 files changed

+966
-437
lines changed

15 files changed

+966
-437
lines changed

.changelog/3350.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_cynosdb_ssl
3+
```

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,10 @@ require (
4646
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1107
4747
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.1033
4848
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.1148
49-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1159
49+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1161
5050
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1153
5151
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762
52-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.1111
52+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.1161
5353
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335
5454
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dbbrain v1.0.652
5555
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dc v1.0.633

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -969,6 +969,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1156 h1:Uz9
969969
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1156/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
970970
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1159 h1:Jl1XE3cY6Bz0lBexvX8z+u2KmDO3tnFxtwHIalM5YS4=
971971
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1159/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
972+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1161 h1:S4dJSWhOtaPjp0/GO/yhzUC6DfZvpWhrnsEKaLxr73c=
973+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1161/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
972974
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993 h1:WlPgXldQCxt7qi5Xrc6j6zTrsXWzN5BcOGs7Irq7fwQ=
973975
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993/go.mod h1:Z9U8zNtyuyKhjS0698wqsrG/kLx1TQ5CEixXBwVe7xY=
974976
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860 h1:F3esKBIT3HW9+7Gt8cVgf8X06VdGIczpgLBUECzSEzU=
@@ -981,6 +983,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762 h1:2egy69S
981983
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762/go.mod h1:1XylIfNUbAzmNqi4XMhwcM3VhmUHdu1OYybOeaJ4sOw=
982984
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.1111 h1:Y7LLIZEQh8OAbnBWppUopu2PjPaQOO9Jzhp8LZO7adI=
983985
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.1111/go.mod h1:hx4A0g62E4hq6vB0t9e/4vlUArok9R2qOYW5IzDiPYo=
986+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.1161 h1:0oG7oMuDBXN2WyRtTU/650zRhLAAmYBgpttNn53NhK0=
987+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.1161/go.mod h1:38t5HcmRqwC93ct7NgG82N+IQIjKLPLLvEUn263jejQ=
984988
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dasb v1.0.970 h1:qVIRHgG1twsqF4aVN/x2T2yMRfPpsZBTNefDkqzM06M=
985989
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dasb v1.0.970/go.mod h1:NJuuQD4z6vcnsZnC7Tvz2U9hElNS1wroc34UQbZvP2U=
986990
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335 h1:D8qrelkK5udv8RzJJIABMzItGIyaZoYnxEVeIsYqiNw=

tencentcloud/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1716,6 +1716,7 @@ func Provider() *schema.Provider {
17161716
"tencentcloud_cynosdb_proxy_end_point": cynosdb.ResourceTencentCloudCynosdbProxyEndPoint(),
17171717
"tencentcloud_cynosdb_upgrade_proxy_version": cynosdb.ResourceTencentCloudCynosdbUpgradeProxyVersion(),
17181718
"tencentcloud_cynosdb_backup_config": cynosdb.ResourceTencentCloudCynosdbBackupConfig(),
1719+
"tencentcloud_cynosdb_ssl": cynosdb.ResourceTencentCloudCynosdbSsl(),
17191720
"tencentcloud_vod_adaptive_dynamic_streaming_template": vod.ResourceTencentCloudVodAdaptiveDynamicStreamingTemplate(),
17201721
"tencentcloud_vod_image_sprite_template": vod.ResourceTencentCloudVodImageSpriteTemplate(),
17211722
"tencentcloud_vod_procedure_template": vod.ResourceTencentCloudVodProcedureTemplate(),

tencentcloud/provider.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -543,6 +543,7 @@ tencentcloud_cynosdb_read_only_instance_exclusive_access
543543
tencentcloud_cynosdb_proxy_end_point
544544
tencentcloud_cynosdb_upgrade_proxy_version
545545
tencentcloud_cynosdb_backup_config
546+
tencentcloud_cynosdb_ssl
546547

547548
Direct Connect(DC)
548549
Data Source
Lines changed: 183 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
package cynosdb
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
"strconv"
8+
"strings"
9+
"time"
10+
11+
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
12+
13+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
14+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
15+
cynosdb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb/v20190107"
16+
17+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
18+
)
19+
20+
func ResourceTencentCloudCynosdbSsl() *schema.Resource {
21+
return &schema.Resource{
22+
Create: resourceTencentCloudCynosdbSslCreate,
23+
Read: resourceTencentCloudCynosdbSslRead,
24+
Update: resourceTencentCloudCynosdbSslUpdate,
25+
Delete: resourceTencentCloudCynosdbSslDelete,
26+
Importer: &schema.ResourceImporter{
27+
State: schema.ImportStatePassthrough,
28+
},
29+
Schema: map[string]*schema.Schema{
30+
"cluster_id": {
31+
Required: true,
32+
Type: schema.TypeString,
33+
Description: "Cluster id.",
34+
},
35+
"instance_id": {
36+
Required: true,
37+
Type: schema.TypeString,
38+
Description: "instance id.",
39+
},
40+
"status": {
41+
Required: true,
42+
Type: schema.TypeString,
43+
Description: "Whether to enable SSL. `ON` means enabled, `OFF` means not enabled.",
44+
},
45+
"download_url": {
46+
Computed: true,
47+
Type: schema.TypeString,
48+
Description: "Certificate download address.",
49+
},
50+
},
51+
}
52+
}
53+
54+
func resourceTencentCloudCynosdbSslCreate(d *schema.ResourceData, meta interface{}) error {
55+
defer tccommon.LogElapsed("resource.tencentcloud_cynosdb_ssl.create")()
56+
defer tccommon.InconsistentCheck(d, meta)()
57+
58+
clusterId := d.Get("cluster_id").(string)
59+
instanceId := d.Get("instance_id").(string)
60+
61+
d.SetId(clusterId + tccommon.FILED_SP + instanceId)
62+
return resourceTencentCloudCynosdbSslUpdate(d, meta)
63+
}
64+
65+
func resourceTencentCloudCynosdbSslRead(d *schema.ResourceData, meta interface{}) error {
66+
defer tccommon.LogElapsed("resource.tencentcloud_cynosdb_ssl.read")()
67+
defer tccommon.InconsistentCheck(d, meta)()
68+
69+
logId := tccommon.GetLogId(tccommon.ContextNil)
70+
71+
ctx := context.WithValue(context.TODO(), tccommon.LogIdKey, logId)
72+
73+
service := CynosdbService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
74+
75+
idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
76+
if len(idSplit) != 2 {
77+
return fmt.Errorf("id is broken,%s", d.Id())
78+
}
79+
clusterId := idSplit[0]
80+
instanceId := idSplit[1]
81+
82+
ssl, err := service.DescribeSSLStatus(ctx, clusterId, instanceId)
83+
if err != nil {
84+
return err
85+
}
86+
87+
if ssl == nil {
88+
d.SetId("")
89+
log.Printf("[WARN]%s resource `tencentcloud_cynosdb_ssl` [%s] not found, please check if it has been deleted.",
90+
logId, instanceId,
91+
)
92+
return nil
93+
}
94+
95+
_ = d.Set("cluster_id", clusterId)
96+
_ = d.Set("instance_id", instanceId)
97+
98+
if ssl.IsOpenSSL != nil {
99+
if *ssl.IsOpenSSL == "yes" {
100+
_ = d.Set("status", "ON")
101+
} else {
102+
_ = d.Set("status", "OFF")
103+
}
104+
}
105+
if ssl.DownloadUrl != nil {
106+
_ = d.Set("download_url", ssl.DownloadUrl)
107+
}
108+
109+
return nil
110+
}
111+
112+
func resourceTencentCloudCynosdbSslUpdate(d *schema.ResourceData, meta interface{}) error {
113+
defer tccommon.LogElapsed("resource.tencentcloud_cynosdb_ssl.update")()
114+
defer tccommon.InconsistentCheck(d, meta)()
115+
116+
logId := tccommon.GetLogId(tccommon.ContextNil)
117+
118+
idSplit := strings.Split(d.Id(), tccommon.FILED_SP)
119+
if len(idSplit) != 2 {
120+
return fmt.Errorf("id is broken,%s", d.Id())
121+
}
122+
clusterId := idSplit[0]
123+
instanceId := idSplit[1]
124+
125+
var taskId *int64
126+
if v, ok := d.GetOk("status"); ok {
127+
status := v.(string)
128+
if status == "ON" {
129+
request := cynosdb.NewOpenSSLRequest()
130+
request.ClusterId = helper.String(clusterId)
131+
request.InstanceId = helper.String(instanceId)
132+
133+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
134+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().OpenSSL(request)
135+
if e != nil {
136+
return tccommon.RetryError(e)
137+
} else {
138+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
139+
}
140+
taskId = result.Response.TaskId
141+
return nil
142+
})
143+
if err != nil {
144+
log.Printf("[CRITAL]%s update cynosdb ssl failed, reason:%+v", logId, err)
145+
return err
146+
}
147+
} else if status == "OFF" {
148+
request := cynosdb.NewCloseSSLRequest()
149+
request.ClusterId = helper.String(clusterId)
150+
request.InstanceId = helper.String(instanceId)
151+
152+
err := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
153+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseCynosdbClient().CloseSSL(request)
154+
if e != nil {
155+
return tccommon.RetryError(e)
156+
} else {
157+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
158+
}
159+
taskId = result.Response.TaskId
160+
return nil
161+
})
162+
if err != nil {
163+
log.Printf("[CRITAL]%s update cynosdb ssl failed, reason:%+v", logId, err)
164+
return err
165+
}
166+
} else {
167+
return fmt.Errorf("[CRITAL]%s update cynosdb ssl failed, reason:your status must be ON or OFF!", logId)
168+
}
169+
service := CynosdbService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
170+
conf := tccommon.BuildStateChangeConf([]string{}, []string{"success"}, 10*tccommon.ReadRetryTimeout, time.Second, service.taskStateRefreshFunc(strconv.FormatInt(*taskId, 10), []string{}))
171+
if _, e := conf.WaitForState(); e != nil {
172+
return e
173+
}
174+
}
175+
176+
return resourceTencentCloudCynosdbSslRead(d, meta)
177+
}
178+
179+
func resourceTencentCloudCynosdbSslDelete(d *schema.ResourceData, meta interface{}) error {
180+
defer tccommon.LogElapsed("resource.tencentcloud_cynosdb_ssl.delete")()
181+
182+
return nil
183+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
Provides a resource to create a cynosdb ssl
2+
3+
Example Usage
4+
5+
```hcl
6+
resource "tencentcloud_cynosdb_ssl" "cynosdb_ssl" {
7+
cluster_id = "cynosdbmysql-1e0nzayx"
8+
instance_id = "cynosdbmysql-ins-pfsv6q1e"
9+
status = "ON"
10+
}
11+
```
12+
13+
Import
14+
15+
cynosdb ssl can be imported using the id, e.g.
16+
17+
```
18+
terraform import tencentcloud_cynosdb_ssl.cynosdb_ssl ${cluster_id}#${instance_id}
19+
```
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package cynosdb_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 TestAccTencentCloudCynosdbSslResource_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: testAccCynosdbSsl,
21+
Check: resource.ComposeTestCheckFunc(
22+
resource.TestCheckResourceAttrSet("tencentcloud_cynosdb_ssl.cynosdb_ssl", "id"),
23+
resource.TestCheckResourceAttr("tencentcloud_cynosdb_ssl.cynosdb_ssl", "status", "ON"),
24+
resource.TestCheckResourceAttrSet("tencentcloud_cynosdb_ssl.cynosdb_ssl", "download_url"),
25+
),
26+
},
27+
{
28+
Config: testAccCynosdbSsl_update,
29+
Check: resource.ComposeTestCheckFunc(
30+
resource.TestCheckResourceAttrSet("tencentcloud_cynosdb_ssl.cynosdb_ssl", "id"),
31+
resource.TestCheckResourceAttr("tencentcloud_cynosdb_ssl.cynosdb_ssl", "status", "OFF"),
32+
resource.TestCheckResourceAttrSet("tencentcloud_cynosdb_ssl.cynosdb_ssl", "download_url"),
33+
),
34+
},
35+
{
36+
ResourceName: "tencentcloud_cynosdb_ssl.cynosdb_ssl",
37+
ImportState: true,
38+
ImportStateVerify: true,
39+
},
40+
},
41+
})
42+
}
43+
44+
const testAccCynosdbSsl = `
45+
resource "tencentcloud_cynosdb_ssl" "cynosdb_ssl" {
46+
cluster_id = "cynosdbmysql-7yr4dde5"
47+
instance_id = "cynosdbmysql-ins-4f62d5tq"
48+
status = "ON"
49+
}
50+
`
51+
52+
const testAccCynosdbSsl_update = `
53+
resource "tencentcloud_cynosdb_ssl" "cynosdb_ssl" {
54+
cluster_id = "cynosdbmysql-7yr4dde5"
55+
instance_id = "cynosdbmysql-ins-4f62d5tq"
56+
status = "OFF"
57+
}
58+
`

tencentcloud/services/cynosdb/service_tencentcloud_cynosdb.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2955,3 +2955,57 @@ func (me *CynosdbService) UpgradeClusterVersion(ctx context.Context, clusterId,
29552955

29562956
return
29572957
}
2958+
2959+
func (me *CynosdbService) DescribeSSLStatus(ctx context.Context, clusterId, instanceId string) (ret *cynosdb.DescribeSSLStatusResponseParams, errRet error) {
2960+
logId := tccommon.GetLogId(ctx)
2961+
2962+
request := cynosdb.NewDescribeSSLStatusRequest()
2963+
request.ClusterId = &clusterId
2964+
request.InstanceId = &instanceId
2965+
defer func() {
2966+
if errRet != nil {
2967+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n", logId, request.GetAction(), request.ToJsonString(), errRet.Error())
2968+
}
2969+
}()
2970+
2971+
errRet = resource.Retry(tccommon.WriteRetryTimeout*2, func() *resource.RetryError {
2972+
ratelimit.Check(request.GetAction())
2973+
response, err := me.client.UseCynosdbClient().DescribeSSLStatus(request)
2974+
if err != nil {
2975+
return tccommon.RetryError(err)
2976+
}
2977+
ret = response.Response
2978+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
2979+
return nil
2980+
})
2981+
if errRet != nil {
2982+
return
2983+
}
2984+
2985+
return
2986+
}
2987+
2988+
func (me *CynosdbService) taskStateRefreshFunc(taskId string, failStates []string) resource.StateRefreshFunc {
2989+
return func() (interface{}, string, error) {
2990+
request := cynosdb.NewDescribeTasksRequest()
2991+
request.Filters = []*cynosdb.QueryFilter{
2992+
{
2993+
ExactMatch: helper.Bool(true),
2994+
Names: helper.Strings([]string{"TaskId"}),
2995+
Values: helper.Strings([]string{taskId}),
2996+
},
2997+
}
2998+
2999+
ratelimit.Check(request.GetAction())
3000+
object, err := me.client.UseCynosdbClient().DescribeTasks(request)
3001+
3002+
if err != nil {
3003+
return nil, "", err
3004+
}
3005+
if object == nil || object.Response == nil || len(object.Response.TaskList) == 0 || object.Response.TaskList[0].Status == nil {
3006+
return nil, "", nil
3007+
}
3008+
3009+
return object, *object.Response.TaskList[0].Status, nil
3010+
}
3011+
}

vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)