Skip to content

Commit 9b70cf6

Browse files
authored
feat/support DBBrain resource (#1417)
* feat/support dbrain resource * add audit log export task resource * passed e2e test * fix golangci-lint * remove import
1 parent 479b2bb commit 9b70cf6

22 files changed

+9236
-6
lines changed

.changelog/1417.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
```release-note:new-resource
2+
tencentcloud_dbbrain_sql_filter
3+
```
4+
5+
```release-note:new-resource
6+
tencentcloud_dbbrain_security_audit_log_export_task
7+
```

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,11 @@ require (
3535
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.445
3636
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.199
3737
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.412
38-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.540
38+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.542
3939
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.445
4040
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.488
4141
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335
42+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dbbrain v1.0.542
4243
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dc v1.0.199
4344
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dcdb v1.0.527
4445
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.539

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,12 +519,16 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.539 h1:5lhW
519519
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.539/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
520520
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.540 h1:gcESVrWAja6ap5WMz0NbmSxI6S2ee89j4KM3BNEXuoA=
521521
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.540/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
522+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.542 h1:hnKPqiCRTgbAimItdWC4J8TYjzpmdXmiO9AGoj1WjPc=
523+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.542/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
522524
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.445 h1:Bh7XD0ypNMHYyBOM8hhKsSu+y0VVKUnJVS+YKKhfpGg=
523525
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.445/go.mod h1:jMDD351efCFpT1+KVFbcpu6SbmP4TYmp4qkoCfr63nQ=
524526
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.488 h1:A1seXWtMf2atBjSNYvcwxyDoFzCMgqyVnsxnWzhqJEA=
525527
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.488/go.mod h1:T8mL4dQLkPTL6VtVMeBYol3asSUS53ycP9PJf5Qp1GE=
526528
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335 h1:D8qrelkK5udv8RzJJIABMzItGIyaZoYnxEVeIsYqiNw=
527529
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335/go.mod h1:pz4s3nOhoB9cY0+uWzifuwr7lfh/Gvi1rv0ADxpPzD4=
530+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dbbrain v1.0.542 h1:96OU+NJZKgx6VC7KTu4syZ4I71LwUHLAl5BeKNHanio=
531+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dbbrain v1.0.542/go.mod h1:3/T0WFIreoZnp4qmZTQwQZImcnwTtYnTMwmsnK/yWhY=
528532
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dc v1.0.199 h1:7ShREKvI8ik2YNtLF42JR9x2YEeZS/gZvhIRfpsI8T0=
529533
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dc v1.0.199/go.mod h1:5WGSrlIZJOhwIqPjjafb6vzrPEZieSHPhPMjjGPXOSU=
530534
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dcdb v1.0.527 h1:YBswG1ojXMW6hnbPtB7H/E1jdXOqHGuGVTrNXpa2TBQ=

tencentcloud/basic_test.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -827,3 +827,10 @@ const (
827827
)
828828

829829
// End of TDCPG
830+
831+
// DBBRAIN
832+
const (
833+
defaultDbBrainsagId = "sag-01z37l4g"
834+
)
835+
836+
// End of DBBRAIN

tencentcloud/connectivity/client.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ import (
3838
cvm "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm/v20170312"
3939
cynosdb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb/v20190107"
4040
dayu "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu/v20180709"
41+
dbbrain "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dbbrain/v20210527"
4142
dc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dc/v20180410"
4243
dcdb "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dcdb/v20180411"
4344
dnspod "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod/v20210323"
@@ -145,6 +146,7 @@ type TencentCloudClient struct {
145146
tatConn *tat.Client
146147
organizationConn *organization.Client
147148
tdcpgConn *tdcpg.Client
149+
dbbrainConn *dbbrain.Client
148150
}
149151

150152
// NewClientProfile returns a new ClientProfile
@@ -928,6 +930,20 @@ func (me *TencentCloudClient) UseTdcpgClient() *tdcpg.Client {
928930
return me.tdcpgConn
929931
}
930932

933+
// UseDbbrainClient returns dbbrain client for service
934+
func (me *TencentCloudClient) UseDbbrainClient() *dbbrain.Client {
935+
if me.dbbrainConn != nil {
936+
return me.dbbrainConn
937+
}
938+
939+
cpf := me.NewClientProfile(300)
940+
cpf.Language = "zh-CN"
941+
me.dbbrainConn, _ = dbbrain.NewClient(me.Credential, me.Region, cpf)
942+
me.dbbrainConn.WithHttpTransport(&LogRoundTripper{})
943+
944+
return me.dbbrainConn
945+
}
946+
931947
func getEnvDefault(key string, defVal int) int {
932948
val, ex := os.LookupEnv(key)
933949
if !ex {

tencentcloud/internal/helper/transform.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,18 @@ func Strings(strs []string) []*string {
4848
return sp
4949
}
5050

51+
func StringsToUint64Pointer(strs []*string) []*uint64 {
52+
if len(strs) == 0 {
53+
return nil
54+
}
55+
56+
vs := make([]*uint64, 0, len(strs))
57+
for _, v := range strs {
58+
vs = append(vs, StrToUint64Point(*v))
59+
}
60+
return vs
61+
}
62+
5163
func PString(pointer *string) string {
5264
if pointer == nil {
5365
return ""
@@ -183,6 +195,11 @@ func UInt64ToStr(s uint64) (i string) {
183195
return
184196
}
185197

198+
func UInt64ToStrPoint(i uint64) *string {
199+
s := strconv.FormatUint(i, 10)
200+
return &s
201+
}
202+
186203
func StrToUInt64(s string) (i uint64) {
187204
intNum, _ := strconv.Atoi(s)
188205
i = uint64(intNum)

tencentcloud/provider.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,12 @@ TDSQL-C for PostgreSQL(TDCPG)
786786
Resource
787787
tencentcloud_tdcpg_cluster
788788
tencentcloud_tdcpg_instance
789+
790+
DBbrain
791+
Resource
792+
tencentcloud_dbbrain_sql_filter
793+
tencentcloud_dbbrain_security_audit_log_export_task
794+
789795
*/
790796
package tencentcloud
791797

@@ -1400,6 +1406,8 @@ func Provider() terraform.ResourceProvider {
14001406
"tencentcloud_organization_org_node": resourceTencentCloudOrganizationOrgNode(),
14011407
"tencentcloud_organization_org_member": resourceTencentCloudOrganizationOrgMember(),
14021408
"tencentcloud_organization_policy_sub_account_attachment": resourceTencentCloudOrganizationPolicySubAccountAttachment(),
1409+
"tencentcloud_dbbrain_sql_filter": resourceTencentCloudDbbrainSqlFilter(),
1410+
"tencentcloud_dbbrain_security_audit_log_export_task": resourceTencentCloudDbbrainSecurityAuditLogExportTask(),
14031411
},
14041412

14051413
ConfigureFunc: providerConfigure,
Lines changed: 224 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,224 @@
1+
/*
2+
Provides a resource to create a dbbrain security_audit_log_export_task
3+
4+
Example Usage
5+
6+
```hcl
7+
resource "tencentcloud_dbbrain_security_audit_log_export_task" "task" {
8+
sec_audit_group_id = "sec_audit_group_id"
9+
start_time = "2020-12-28 00:00:00"
10+
end_time = "2020-12-28 01:00:00"
11+
product = "mysql"
12+
danger_levels = [0,1,2]
13+
}
14+
15+
```
16+
*/
17+
package tencentcloud
18+
19+
import (
20+
"context"
21+
"errors"
22+
"fmt"
23+
"log"
24+
"strings"
25+
26+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
27+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
28+
dbbrain "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dbbrain/v20210527"
29+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
30+
)
31+
32+
func resourceTencentCloudDbbrainSecurityAuditLogExportTask() *schema.Resource {
33+
return &schema.Resource{
34+
Read: resourceTencentCloudDbbrainSecurityAuditLogExportTaskRead,
35+
Create: resourceTencentCloudDbbrainSecurityAuditLogExportTaskCreate,
36+
Delete: resourceTencentCloudDbbrainSecurityAuditLogExportTaskDelete,
37+
// Importer: &schema.ResourceImporter{
38+
// State: schema.ImportStatePassthrough,
39+
// },
40+
Schema: map[string]*schema.Schema{
41+
"sec_audit_group_id": {
42+
Type: schema.TypeString,
43+
Required: true,
44+
ForceNew: true,
45+
Description: "security audit group id.",
46+
},
47+
48+
"start_time": {
49+
Type: schema.TypeString,
50+
Required: true,
51+
ForceNew: true,
52+
Description: "start time.",
53+
},
54+
55+
"end_time": {
56+
Type: schema.TypeString,
57+
Required: true,
58+
ForceNew: true,
59+
Description: "end time.",
60+
},
61+
62+
"product": {
63+
Type: schema.TypeString,
64+
Required: true,
65+
ForceNew: true,
66+
Description: "product, optional value is mysql.",
67+
},
68+
69+
"danger_levels": {
70+
Type: schema.TypeSet,
71+
Elem: &schema.Schema{
72+
Type: schema.TypeInt,
73+
},
74+
Optional: true,
75+
ForceNew: true,
76+
Description: "List of log risk levels, supported values include: 0 no risk; 1 low risk; 2 medium risk; 3 high risk.",
77+
},
78+
},
79+
}
80+
}
81+
82+
func resourceTencentCloudDbbrainSecurityAuditLogExportTaskCreate(d *schema.ResourceData, meta interface{}) error {
83+
defer logElapsed("resource.tencentcloud_dbbrain_security_audit_log_export_task.create")()
84+
defer inconsistentCheck(d, meta)()
85+
86+
logId := getLogId(contextNil)
87+
88+
var (
89+
request = dbbrain.NewCreateSecurityAuditLogExportTaskRequest()
90+
response *dbbrain.CreateSecurityAuditLogExportTaskResponse
91+
service = DbbrainService{client: meta.(*TencentCloudClient).apiV3Conn}
92+
ctx = context.WithValue(context.TODO(), logIdKey, logId)
93+
secAuditGroupId string
94+
asyncRequestId string
95+
)
96+
97+
if v, ok := d.GetOk("sec_audit_group_id"); ok {
98+
secAuditGroupId = v.(string)
99+
request.SecAuditGroupId = helper.String(v.(string))
100+
}
101+
102+
if v, ok := d.GetOk("start_time"); ok {
103+
request.StartTime = helper.String(v.(string))
104+
}
105+
106+
if v, ok := d.GetOk("end_time"); ok {
107+
request.EndTime = helper.String(v.(string))
108+
}
109+
110+
if v, ok := d.GetOk("product"); ok {
111+
request.Product = helper.String(v.(string))
112+
}
113+
114+
if v, ok := d.GetOk("danger_levels"); ok {
115+
dangerLevelsSet := v.(*schema.Set).List()
116+
for i := range dangerLevelsSet {
117+
dangerLevels := dangerLevelsSet[i].(int)
118+
request.DangerLevels = append(request.DangerLevels, helper.IntInt64(dangerLevels))
119+
}
120+
}
121+
122+
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
123+
result, e := meta.(*TencentCloudClient).apiV3Conn.UseDbbrainClient().CreateSecurityAuditLogExportTask(request)
124+
if e != nil {
125+
return retryError(e)
126+
} else {
127+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
128+
logId, request.GetAction(), request.ToJsonString(), result.ToJsonString())
129+
}
130+
response = result
131+
return nil
132+
})
133+
if err != nil {
134+
log.Printf("[CRITAL]%s create dbbrain securityAuditLogExportTask failed, reason:%+v", logId, err)
135+
return err
136+
}
137+
138+
asyncRequestId = helper.UInt64ToStr(*response.Response.AsyncRequestId)
139+
140+
err = resource.Retry(2*readRetryTimeout, func() *resource.RetryError {
141+
ret, err := service.DescribeDbbrainSecurityAuditLogExportTask(ctx, helper.String(secAuditGroupId), helper.String(asyncRequestId), nil)
142+
if err != nil {
143+
return retryError(err)
144+
}
145+
if ret != nil {
146+
log.Printf("[###########] task.Status:[%s]\n", *ret.Status)
147+
return nil
148+
}
149+
return resource.RetryableError(errors.New("[DEBUG] describe the audit log export task is nil, retry..."))
150+
})
151+
if err != nil {
152+
log.Printf("[CRITAL]%s query dbbrain securityAuditLogExportTask failed, reason:%+v", logId, err)
153+
return err
154+
}
155+
156+
d.SetId(secAuditGroupId + FILED_SP + asyncRequestId)
157+
return resourceTencentCloudDbbrainSecurityAuditLogExportTaskRead(d, meta)
158+
}
159+
160+
func resourceTencentCloudDbbrainSecurityAuditLogExportTaskRead(d *schema.ResourceData, meta interface{}) error {
161+
defer logElapsed("resource.tencentcloud_dbbrain_security_audit_log_export_task.read")()
162+
defer inconsistentCheck(d, meta)()
163+
164+
logId := getLogId(contextNil)
165+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
166+
167+
service := DbbrainService{client: meta.(*TencentCloudClient).apiV3Conn}
168+
169+
idSplit := strings.Split(d.Id(), FILED_SP)
170+
if len(idSplit) != 2 {
171+
return fmt.Errorf("id is broken,%s", d.Id())
172+
}
173+
secAuditGroupId := helper.String(idSplit[0])
174+
asyncRequestId := helper.String(idSplit[1])
175+
176+
securityAuditLogExportTask, err := service.DescribeDbbrainSecurityAuditLogExportTask(ctx, secAuditGroupId, asyncRequestId, nil)
177+
if err != nil {
178+
return err
179+
}
180+
181+
// _ = d.Set("sec_audit_group_id", secAuditGroupId)
182+
183+
if securityAuditLogExportTask == nil {
184+
d.SetId("")
185+
return fmt.Errorf("resource `securityAuditLogExportTask` %s does not exist", d.Id())
186+
}
187+
188+
if securityAuditLogExportTask.LogStartTime != nil {
189+
_ = d.Set("start_time", securityAuditLogExportTask.LogStartTime)
190+
}
191+
192+
if securityAuditLogExportTask.LogEndTime != nil {
193+
_ = d.Set("end_time", securityAuditLogExportTask.LogEndTime)
194+
}
195+
196+
if securityAuditLogExportTask.DangerLevels != nil {
197+
_ = d.Set("danger_levels", securityAuditLogExportTask.DangerLevels)
198+
}
199+
200+
return nil
201+
}
202+
203+
func resourceTencentCloudDbbrainSecurityAuditLogExportTaskDelete(d *schema.ResourceData, meta interface{}) error {
204+
defer logElapsed("resource.tencentcloud_dbbrain_security_audit_log_export_task.delete")()
205+
defer inconsistentCheck(d, meta)()
206+
207+
logId := getLogId(contextNil)
208+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
209+
210+
service := DbbrainService{client: meta.(*TencentCloudClient).apiV3Conn}
211+
212+
idSplit := strings.Split(d.Id(), FILED_SP)
213+
if len(idSplit) != 2 {
214+
return fmt.Errorf("id is broken,%s", d.Id())
215+
}
216+
secAuditGroupId := helper.String(idSplit[0])
217+
asyncRequestId := helper.String(idSplit[1])
218+
219+
if err := service.DeleteDbbrainSecurityAuditLogExportTaskById(ctx, secAuditGroupId, asyncRequestId, nil); err != nil {
220+
return err
221+
}
222+
223+
return nil
224+
}

0 commit comments

Comments
 (0)