Skip to content

Commit 5daa05e

Browse files
authored
feat(cdb): [127324764] add new resource (#3522)
* add * add * add
1 parent d4352d9 commit 5daa05e

File tree

9 files changed

+569
-0
lines changed

9 files changed

+569
-0
lines changed

.changelog/3522.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_audit_service
3+
```

tencentcloud/provider.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1460,6 +1460,7 @@ func Provider() *schema.Provider {
14601460
"tencentcloud_mysql_switch_proxy": cdb.ResourceTencentCloudMysqlSwitchProxy(),
14611461
"tencentcloud_mysql_ssl": cdb.ResourceTencentCloudMysqlSsl(),
14621462
"tencentcloud_mysql_cls_log_attachment": cdb.ResourceTencentCloudMysqlClsLogAttachment(),
1463+
"tencentcloud_mysql_audit_service": cdb.ResourceTencentCloudMysqlAuditService(),
14631464
"tencentcloud_cos_bucket": cos.ResourceTencentCloudCosBucket(),
14641465
"tencentcloud_cos_bucket_object": cos.ResourceTencentCloudCosBucketObject(),
14651466
"tencentcloud_cos_bucket_referer": cos.ResourceTencentCloudCosBucketReferer(),

tencentcloud/provider.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -814,6 +814,7 @@ tencentcloud_mysql_isolate_instance
814814
tencentcloud_mysql_dr_instance
815815
tencentcloud_mysql_ssl
816816
tencentcloud_mysql_cls_log_attachment
817+
tencentcloud_mysql_audit_service
817818

818819
Cloud Monitor(Monitor)
819820
Data Source
Lines changed: 343 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,343 @@
1+
package cdb
2+
3+
import (
4+
"context"
5+
"fmt"
6+
"log"
7+
8+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
9+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10+
cdbv20170320 "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb/v20170320"
11+
12+
tccommon "github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/common"
13+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
14+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/ratelimit"
15+
)
16+
17+
func ResourceTencentCloudMysqlAuditService() *schema.Resource {
18+
return &schema.Resource{
19+
Create: resourceTencentCloudMysqlAuditServiceCreate,
20+
Read: resourceTencentCloudMysqlAuditServiceRead,
21+
Update: resourceTencentCloudMysqlAuditServiceUpdate,
22+
Delete: resourceTencentCloudMysqlAuditServiceDelete,
23+
Importer: &schema.ResourceImporter{
24+
State: schema.ImportStatePassthrough,
25+
},
26+
Schema: map[string]*schema.Schema{
27+
"instance_id": {
28+
Type: schema.TypeString,
29+
Required: true,
30+
ForceNew: true,
31+
Description: "TencentDB for MySQL instance ID.",
32+
},
33+
34+
"log_expire_day": {
35+
Type: schema.TypeInt,
36+
Required: true,
37+
Description: "Retention period of the audit log. Valid values: `7` (one week), `30` (one month), `90` (three months), `180` (six months), `365` (one year), `1095` (three years), `1825` (five years).",
38+
},
39+
40+
"high_log_expire_day": {
41+
Type: schema.TypeInt,
42+
Optional: true,
43+
Computed: true,
44+
Description: "Retention period of high-frequency audit logs. Valid values: `7` (one week), `30` (one month).",
45+
},
46+
47+
"rule_template_ids": {
48+
Type: schema.TypeSet,
49+
Optional: true,
50+
Description: "Rule template ID. If both this parameter and AuditRuleFilters are not specified, all SQL statements will be recorded.",
51+
Elem: &schema.Schema{
52+
Type: schema.TypeString,
53+
},
54+
},
55+
56+
"audit_all": {
57+
Type: schema.TypeBool,
58+
Optional: true,
59+
Computed: true,
60+
Description: "Audit type. Valid values: true: Record all; false: Record by rules (default value).",
61+
},
62+
},
63+
}
64+
}
65+
66+
func resourceTencentCloudMysqlAuditServiceCreate(d *schema.ResourceData, meta interface{}) error {
67+
defer tccommon.LogElapsed("resource.tencentcloud_mysql_audit_service.create")()
68+
defer tccommon.InconsistentCheck(d, meta)()
69+
70+
var (
71+
logId = tccommon.GetLogId(tccommon.ContextNil)
72+
ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
73+
request = cdbv20170320.NewOpenAuditServiceRequest()
74+
instanceId string
75+
)
76+
77+
if v, ok := d.GetOk("instance_id"); ok {
78+
request.InstanceId = helper.String(v.(string))
79+
instanceId = v.(string)
80+
}
81+
82+
if v, ok := d.GetOkExists("log_expire_day"); ok {
83+
request.LogExpireDay = helper.IntUint64(v.(int))
84+
}
85+
86+
if v, ok := d.GetOkExists("high_log_expire_day"); ok {
87+
request.HighLogExpireDay = helper.IntUint64(v.(int))
88+
}
89+
90+
if v, ok := d.GetOk("rule_template_ids"); ok {
91+
ruleTemplateIdsSet := v.(*schema.Set).List()
92+
for i := range ruleTemplateIdsSet {
93+
if ruleTemplateId, ok := ruleTemplateIdsSet[i].(string); ok && ruleTemplateId != "" {
94+
request.RuleTemplateIds = append(request.RuleTemplateIds, helper.String(ruleTemplateId))
95+
}
96+
}
97+
}
98+
99+
if v, ok := d.GetOkExists("audit_all"); ok {
100+
request.AuditAll = helper.Bool(v.(bool))
101+
}
102+
103+
reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
104+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseMysqlClient().OpenAuditServiceWithContext(ctx, request)
105+
if e != nil {
106+
return tccommon.RetryError(e)
107+
} else {
108+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
109+
}
110+
111+
return nil
112+
})
113+
114+
if reqErr != nil {
115+
log.Printf("[CRITAL]%s create mysql audit service failed, reason:%+v", logId, reqErr)
116+
return reqErr
117+
}
118+
119+
d.SetId(instanceId)
120+
121+
// wait
122+
waitRequest := cdbv20170320.NewDescribeAuditInstanceListRequest()
123+
waitRequest.Filters = []*cdbv20170320.AuditInstanceFilters{
124+
{
125+
Name: helper.String("InstanceId"),
126+
ExactMatch: helper.Bool(true),
127+
Values: helper.Strings([]string{instanceId}),
128+
},
129+
}
130+
131+
reqErr = resource.Retry(tccommon.ReadRetryTimeout*5, func() *resource.RetryError {
132+
ratelimit.Check(request.GetAction())
133+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseMysqlClient().DescribeAuditInstanceListWithContext(ctx, waitRequest)
134+
if e != nil {
135+
return tccommon.RetryError(e)
136+
} else {
137+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, waitRequest.GetAction(), waitRequest.ToJsonString(), result.ToJsonString())
138+
}
139+
140+
if result == nil || result.Response == nil || result.Response.Items == nil || len(result.Response.Items) == 0 {
141+
return resource.RetryableError(fmt.Errorf("Describe audit instance list failed, Response is nil."))
142+
}
143+
144+
if len(result.Response.Items) != 1 {
145+
return resource.RetryableError(fmt.Errorf("Describe audit instance list failed, more than one instance item found."))
146+
}
147+
148+
item := result.Response.Items[0]
149+
if item.AuditStatus != nil && *item.AuditStatus == "ON" {
150+
if item.AuditTask != nil && *item.AuditTask == 0 {
151+
return nil
152+
}
153+
}
154+
155+
return resource.RetryableError(fmt.Errorf("waiting for mysql [%s] audit service opening", instanceId))
156+
})
157+
158+
if reqErr != nil {
159+
return reqErr
160+
}
161+
162+
return resourceTencentCloudMysqlAuditServiceRead(d, meta)
163+
}
164+
165+
func resourceTencentCloudMysqlAuditServiceRead(d *schema.ResourceData, meta interface{}) error {
166+
defer tccommon.LogElapsed("resource.tencentcloud_mysql_audit_service.read")()
167+
defer tccommon.InconsistentCheck(d, meta)()
168+
169+
var (
170+
logId = tccommon.GetLogId(tccommon.ContextNil)
171+
ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
172+
service = MysqlService{client: meta.(tccommon.ProviderMeta).GetAPIV3Conn()}
173+
instanceId = d.Id()
174+
)
175+
176+
respData, err := service.DescribeMysqlAuditInstanceListById(ctx, instanceId)
177+
if err != nil {
178+
return err
179+
}
180+
181+
if respData == nil {
182+
log.Printf("[WARN]%s resource `tencentcloud_mysql_audit_service` [%s] not found, please check if it has been deleted.\n", logId, d.Id())
183+
d.SetId("")
184+
return nil
185+
}
186+
187+
if respData.InstanceId != nil {
188+
_ = d.Set("instance_id", respData.InstanceId)
189+
}
190+
191+
if respData.LogExpireDay != nil {
192+
_ = d.Set("log_expire_day", respData.LogExpireDay)
193+
}
194+
195+
if respData.HighLogExpireDay != nil {
196+
_ = d.Set("high_log_expire_day", respData.HighLogExpireDay)
197+
}
198+
199+
if respData.RuleTemplateIds != nil {
200+
_ = d.Set("rule_template_ids", respData.RuleTemplateIds)
201+
}
202+
203+
if respData.AuditAll != nil {
204+
_ = d.Set("audit_all", respData.AuditAll)
205+
}
206+
207+
return nil
208+
}
209+
210+
func resourceTencentCloudMysqlAuditServiceUpdate(d *schema.ResourceData, meta interface{}) error {
211+
defer tccommon.LogElapsed("resource.tencentcloud_mysql_audit_service.update")()
212+
defer tccommon.InconsistentCheck(d, meta)()
213+
214+
var (
215+
logId = tccommon.GetLogId(tccommon.ContextNil)
216+
ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
217+
instanceId = d.Id()
218+
)
219+
220+
needChange := false
221+
mutableArgs := []string{"log_expire_day", "high_log_expire_day", "rule_template_ids", "audit_all"}
222+
for _, v := range mutableArgs {
223+
if d.HasChange(v) {
224+
needChange = true
225+
break
226+
}
227+
}
228+
229+
if needChange {
230+
request := cdbv20170320.NewModifyAuditServiceRequest()
231+
if v, ok := d.GetOkExists("log_expire_day"); ok {
232+
request.LogExpireDay = helper.IntUint64(v.(int))
233+
}
234+
235+
if v, ok := d.GetOkExists("high_log_expire_day"); ok {
236+
request.HighLogExpireDay = helper.IntUint64(v.(int))
237+
}
238+
239+
if v, ok := d.GetOk("rule_template_ids"); ok {
240+
ruleTemplateIdsSet := v.(*schema.Set).List()
241+
for i := range ruleTemplateIdsSet {
242+
if ruleTemplateId, ok := ruleTemplateIdsSet[i].(string); ok && ruleTemplateId != "" {
243+
request.RuleTemplateIds = append(request.RuleTemplateIds, helper.String(ruleTemplateId))
244+
}
245+
}
246+
}
247+
248+
if v, ok := d.GetOkExists("audit_all"); ok {
249+
request.AuditAll = helper.Bool(v.(bool))
250+
}
251+
252+
request.InstanceId = &instanceId
253+
reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
254+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseMysqlClient().ModifyAuditServiceWithContext(ctx, request)
255+
if e != nil {
256+
return tccommon.RetryError(e)
257+
} else {
258+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
259+
}
260+
261+
return nil
262+
})
263+
264+
if reqErr != nil {
265+
log.Printf("[CRITAL]%s update mysql audit service failed, reason:%+v", logId, reqErr)
266+
return reqErr
267+
}
268+
}
269+
270+
return resourceTencentCloudMysqlAuditServiceRead(d, meta)
271+
}
272+
273+
func resourceTencentCloudMysqlAuditServiceDelete(d *schema.ResourceData, meta interface{}) error {
274+
defer tccommon.LogElapsed("resource.tencentcloud_mysql_audit_service.delete")()
275+
defer tccommon.InconsistentCheck(d, meta)()
276+
277+
var (
278+
logId = tccommon.GetLogId(tccommon.ContextNil)
279+
ctx = tccommon.NewResourceLifeCycleHandleFuncContext(context.Background(), logId, d, meta)
280+
request = cdbv20170320.NewCloseAuditServiceRequest()
281+
instanceId = d.Id()
282+
)
283+
284+
request.InstanceId = &instanceId
285+
reqErr := resource.Retry(tccommon.WriteRetryTimeout, func() *resource.RetryError {
286+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseMysqlClient().CloseAuditServiceWithContext(ctx, request)
287+
if e != nil {
288+
return tccommon.RetryError(e)
289+
} else {
290+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
291+
}
292+
293+
return nil
294+
})
295+
296+
if reqErr != nil {
297+
log.Printf("[CRITAL]%s delete mysql audit service failed, reason:%+v", logId, reqErr)
298+
return reqErr
299+
}
300+
301+
// wait
302+
waitRequest := cdbv20170320.NewDescribeAuditInstanceListRequest()
303+
waitRequest.Filters = []*cdbv20170320.AuditInstanceFilters{
304+
{
305+
Name: helper.String("InstanceId"),
306+
ExactMatch: helper.Bool(true),
307+
Values: helper.Strings([]string{instanceId}),
308+
},
309+
}
310+
311+
reqErr = resource.Retry(tccommon.ReadRetryTimeout*5, func() *resource.RetryError {
312+
ratelimit.Check(request.GetAction())
313+
result, e := meta.(tccommon.ProviderMeta).GetAPIV3Conn().UseMysqlClient().DescribeAuditInstanceListWithContext(ctx, waitRequest)
314+
if e != nil {
315+
return tccommon.RetryError(e)
316+
} else {
317+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n", logId, waitRequest.GetAction(), waitRequest.ToJsonString(), result.ToJsonString())
318+
}
319+
320+
if result == nil || result.Response == nil || result.Response.Items == nil || len(result.Response.Items) == 0 {
321+
return resource.RetryableError(fmt.Errorf("Describe audit instance list failed, Response is nil."))
322+
}
323+
324+
if len(result.Response.Items) != 1 {
325+
return resource.RetryableError(fmt.Errorf("Describe audit instance list failed, more than one instance item found."))
326+
}
327+
328+
item := result.Response.Items[0]
329+
if item.AuditStatus != nil && *item.AuditStatus == "OFF" {
330+
if item.AuditTask != nil && *item.AuditTask == 0 {
331+
return nil
332+
}
333+
}
334+
335+
return resource.RetryableError(fmt.Errorf("waiting for mysql [%s] audit service closing", instanceId))
336+
})
337+
338+
if reqErr != nil {
339+
return reqErr
340+
}
341+
342+
return nil
343+
}

0 commit comments

Comments
 (0)