Skip to content

Commit 98dec7a

Browse files
gitmknandrew-tx
andauthored
Feat/cat resource (#2143)
* feat: support cat * faet: support task * fix: Modify the interface DescribeProbeNodes to DescribeNodes * fix: modify sdk * fix: modify sdk * fix: modify test * fix: modify test * fix: modify test * fix: modify test * fix: modify test * fix: modify provider * fix: modify provider * fix: modify provider * fix: modify provider * fix: modify provider * fix: modify go mod * fix: modify go mod * fix: add doc * fix: add changelog * Update 2143.txt changelog update --------- Co-authored-by: andrewjiang <104899514+andrew-tx@users.noreply.github.com>
1 parent f2e1fb2 commit 98dec7a

19 files changed

+1028
-225
lines changed

.changelog/2143.txt

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
```release-note:new-data-source
2+
tencentcloud_cat_metric_data
3+
```
4+
5+
```release-note:enhancement
6+
datasource/tencentcloud_cat_node: Add computed `task_types`
7+
```
8+
9+
```release-note:enhancement
10+
resource/tencentcloud_cat_task_set: Support `suspend` and `resume` for dial test tasks
11+
```

go.mod

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,20 @@ require (
3030
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/apm v1.0.624
3131
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/as v1.0.756
3232
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam v1.0.409
33-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cat v1.0.520
33+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cat v1.0.760
3434
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs v1.0.591
3535
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdb v1.0.699
3636
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdn v1.0.539
3737
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cdwch v1.0.745
3838
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cfs v1.0.627
39+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cfw v1.0.759
3940
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/chdfs v1.0.600
4041
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ciam v1.0.695
4142
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ckafka v1.0.748
4243
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.693
4344
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.544
4445
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.711
45-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.759
46+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.760
4647
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.624
4748
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.589
4849
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.692
@@ -93,16 +94,14 @@ require (
9394
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tsf v1.0.674
9495
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.0.199
9596
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.755
97+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.759
9698
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata v1.0.725
9799
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wss v1.0.199
98-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cfw v1.0.759
99-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.759
100100
github.com/tencentyun/cos-go-sdk-v5 v0.7.42-0.20230629101357-7edd77448a0f
101101
github.com/yangwenmai/ratelimit v0.0.0-20180104140304-44221c2292e1
102102
gopkg.in/yaml.v2 v2.4.0
103103
)
104104

105-
106105
require (
107106
4d63.com/gocheckcompilerdirectives v1.2.1 // indirect
108107
4d63.com/gochecknoglobals v0.2.1 // indirect

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam v1.0.409 h1:ToZpNh7
786786
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cam v1.0.409/go.mod h1:U24yUxCDruJLayOsP/onO2E/7+9ljeNsNO+phu+PeiM=
787787
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cat v1.0.520 h1:n4FN0PI+1MVWi+RGQbD/cElXjquZQK0K1h1Z1nNWNWw=
788788
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cat v1.0.520/go.mod h1:gzI+2Qd/iUfPPQQjW30k0G3mJ3m7tXeXrydJMm8jsOo=
789+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cat v1.0.760 h1:oGY4IigfIw0iQKh3/cOY29KBeEeFbvJft69e0beyfdI=
790+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cat v1.0.760/go.mod h1:SoBOZr6fklP8zeHaq7XOnCd5xBypU2R94nOPafYX1J4=
789791
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs v1.0.591 h1:TPGLjH6wqkA5Iirl6xCxFkWwrtCZ8ZmeF7ASzqUbsZA=
790792
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs v1.0.591/go.mod h1:nCAGfVTXZkVnurkbjF3b0FM6RwGztE9t8D9Ms1unaKo=
791793
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cbs v1.0.592 h1:xowULQ7Mca1TjHyjAGe8RYjg37yhWpne5Q+TihFNHVA=
@@ -878,6 +880,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.758 h1:T7Ry
878880
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.758/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
879881
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.759 h1:flWgFybB3MYWFxwRO4yXbdiPT3SNwjSLuXCXsfs6kN4=
880882
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.759/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
883+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.760 h1:OyUPYgXBZNh3erZZ4jhpFH+aGtcCB1TUUtYX4WbR+xg=
884+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.760/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
881885
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.624 h1:nEZqsoqt1pEoaP9JjkHQy3/H00suCfzlHW1qOm2nYD8=
882886
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.624/go.mod h1:+TXSVyeKwt1IhZRqKPbTREteBcP+K07Q846/ilNzLWA=
883887
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.589 h1:LZihgirMH0vsaGScYexxwY0fTss9vHaSZs/YOQUVESg=
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
/*
2+
Use this data source to query detailed information of cat metric_data
3+
Example Usage
4+
```hcl
5+
data "tencentcloud_cat_metric_data" "metric_data" {
6+
analyze_task_type = "AnalyzeTaskType_Network"
7+
metric_type = "gauge"
8+
field = "avg(\"ping_time\")"
9+
filters = [
10+
"\"host\" = 'www.qq.com'",
11+
"time >= now()-1h",
12+
]
13+
}
14+
```
15+
*/
16+
package tencentcloud
17+
18+
import (
19+
"context"
20+
21+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
22+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
23+
cat "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cat/v20180409"
24+
sdkErrors "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
25+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
26+
)
27+
28+
func dataSourceTencentCloudCatMetricData() *schema.Resource {
29+
return &schema.Resource{
30+
Read: dataSourceTencentCloudCatMetricDataRead,
31+
Schema: map[string]*schema.Schema{
32+
"analyze_task_type": {
33+
Required: true,
34+
Type: schema.TypeString,
35+
Description: "Analysis of task type, supported types: `AnalyzeTaskType_Network`: network quality, `AnalyzeTaskType_Browse`: page performance, `AnalyzeTaskType_Transport`: port performance, `AnalyzeTaskType_UploadDownload`: file transport, `AnalyzeTaskType_MediaStream`: audiovisual experience.",
36+
},
37+
38+
"metric_type": {
39+
Required: true,
40+
Type: schema.TypeString,
41+
Description: "Metric type, metrics queries are passed with gauge by default.",
42+
},
43+
44+
"field": {
45+
Required: true,
46+
Type: schema.TypeString,
47+
Description: "Detailed fields of metrics, specified metrics can be passed or aggregate metrics, such as avg(ping_time) means entire delay.",
48+
},
49+
50+
"filter": {
51+
Optional: true,
52+
Type: schema.TypeString,
53+
Description: "Filter conditions can be passed as a single filter or multiple parameters concatenated together.",
54+
},
55+
56+
"group_by": {
57+
Optional: true,
58+
Type: schema.TypeString,
59+
Description: "Aggregation time, such as 1m, 1d, 30d, and so on.",
60+
},
61+
62+
"filters": {
63+
Required: true,
64+
Type: schema.TypeSet,
65+
Elem: &schema.Schema{
66+
Type: schema.TypeString,
67+
},
68+
Description: "Multiple condition filtering, supports combining multiple filtering conditions for query.",
69+
},
70+
71+
"metric_set": {
72+
Computed: true,
73+
Type: schema.TypeString,
74+
Description: "Return JSON string.",
75+
},
76+
77+
"result_output_file": {
78+
Type: schema.TypeString,
79+
Optional: true,
80+
Description: "Used to save results.",
81+
},
82+
},
83+
}
84+
}
85+
86+
func dataSourceTencentCloudCatMetricDataRead(d *schema.ResourceData, meta interface{}) error {
87+
defer logElapsed("data_source.tencentcloud_cat_metric_data.read")()
88+
defer inconsistentCheck(d, meta)()
89+
90+
logId := getLogId(contextNil)
91+
92+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
93+
94+
paramMap := make(map[string]interface{})
95+
if v, ok := d.GetOk("analyze_task_type"); ok {
96+
paramMap["AnalyzeTaskType"] = helper.String(v.(string))
97+
}
98+
99+
if v, ok := d.GetOk("metric_type"); ok {
100+
paramMap["MetricType"] = helper.String(v.(string))
101+
}
102+
103+
if v, ok := d.GetOk("field"); ok {
104+
paramMap["Field"] = helper.String(v.(string))
105+
}
106+
107+
if v, ok := d.GetOk("filter"); ok {
108+
paramMap["Filter"] = helper.String(v.(string))
109+
}
110+
111+
if v, ok := d.GetOk("group_by"); ok {
112+
paramMap["GroupBy"] = helper.String(v.(string))
113+
}
114+
115+
if v, ok := d.GetOk("filters"); ok {
116+
filtersSet := v.(*schema.Set).List()
117+
paramMap["Filters"] = helper.InterfacesStringsPoint(filtersSet)
118+
}
119+
120+
service := CatService{client: meta.(*TencentCloudClient).apiV3Conn}
121+
122+
var metric *cat.DescribeProbeMetricDataResponseParams
123+
err := resource.Retry(readRetryTimeout, func() *resource.RetryError {
124+
result, e := service.DescribeCatMetricDataByFilter(ctx, paramMap)
125+
if e != nil {
126+
if sdkError, ok := e.(*sdkErrors.TencentCloudSDKError); ok {
127+
if sdkError.Code == "FailedOperation.DbQueryFailed" {
128+
return resource.NonRetryableError(e)
129+
}
130+
}
131+
return retryError(e)
132+
}
133+
metric = result
134+
return nil
135+
})
136+
if err != nil {
137+
return err
138+
}
139+
140+
var metricSet string
141+
if metric != nil && metric.MetricSet != nil {
142+
metricSet = *metric.MetricSet
143+
_ = d.Set("metric_set", metric.MetricSet)
144+
}
145+
146+
d.SetId(helper.DataResourceIdsHash([]string{metricSet}))
147+
output, ok := d.GetOk("result_output_file")
148+
if ok && output.(string) != "" {
149+
if e := writeToFile(output.(string), metricSet); e != nil {
150+
return e
151+
}
152+
}
153+
return nil
154+
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package tencentcloud
2+
3+
import (
4+
"testing"
5+
6+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
7+
)
8+
9+
// go test -test.run TestAccTencentCloudCatMetricDataDataSource_basic -v
10+
func TestAccTencentCloudCatMetricDataDataSource_basic(t *testing.T) {
11+
t.Parallel()
12+
resource.Test(t, resource.TestCase{
13+
PreCheck: func() {
14+
testAccPreCheck(t)
15+
},
16+
Providers: testAccProviders,
17+
Steps: []resource.TestStep{
18+
{
19+
Config: testAccCatMetricDataDataSource,
20+
Check: resource.ComposeTestCheckFunc(
21+
testAccCheckTencentCloudDataSourceID("data.tencentcloud_cat_metric_data.metric_data"),
22+
resource.TestCheckResourceAttrSet("data.tencentcloud_cat_metric_data.metric_data", "metric_set"),
23+
),
24+
},
25+
},
26+
})
27+
}
28+
29+
const testAccCatMetricDataDataSource = `
30+
resource "tencentcloud_cat_task_set" "task_set" {
31+
interval = 1
32+
nodes = [
33+
"12136",
34+
"12137",
35+
]
36+
parameters = jsonencode(
37+
{
38+
blackList = ""
39+
filterIp = 0
40+
grabBag = 0
41+
ipType = 0
42+
netDigOn = 1
43+
netDnsNs = ""
44+
netDnsOn = 1
45+
netDnsQuerymethod = 1
46+
netDnsServer = 2
47+
netDnsTimeout = 5
48+
netIcmpActivex = 0
49+
netIcmpActivexStr = ""
50+
netIcmpDataCut = 1
51+
netIcmpInterval = 0.5
52+
netIcmpNum = 20
53+
netIcmpOn = 1
54+
netIcmpSize = 32
55+
netIcmpTimeout = 20
56+
netTracertNum = 30
57+
netTracertOn = 1
58+
netTracertTimeout = 60
59+
whiteList = ""
60+
}
61+
)
62+
tags = {}
63+
task_category = 1
64+
task_type = 5
65+
66+
batch_tasks {
67+
name = "terraform-test"
68+
target_address = "www.baidu.com"
69+
}
70+
}
71+
72+
data "tencentcloud_cat_metric_data" "metric_data" {
73+
analyze_task_type = "AnalyzeTaskType_Network"
74+
metric_type = "gauge"
75+
field = "avg(\"ping_time\")"
76+
filters = [
77+
"\"host\" = 'www.baidu.com'",
78+
"time >= now()-1h",
79+
]
80+
depends_on = [ tencentcloud_cat_task_set.task_set ]
81+
}
82+
83+
`

tencentcloud/data_source_tc_cat_node.go

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,12 @@ func dataSourceTencentCloudCatNode() *schema.Resource {
113113
Computed: true,
114114
Description: "Node status: 1=running, 2=offline.",
115115
},
116+
"task_types": {
117+
Type: schema.TypeList,
118+
Elem: &schema.Schema{Type: schema.TypeInt},
119+
Computed: true,
120+
Description: "The task types supported by the node. `1`: page performance, `2`: file upload, `3`: file download, `4`: port performance, `5`: network quality, `6`: audio and video experience.",
121+
},
116122
},
117123
},
118124
},
@@ -158,7 +164,7 @@ func dataSourceTencentCloudCatNodeRead(d *schema.ResourceData, meta interface{})
158164

159165
var nodeSets []*cat.NodeDefine
160166
err := resource.Retry(readRetryTimeout, func() *resource.RetryError {
161-
results, e := catService.DescribeCatNodeByFilter(ctx, paramMap)
167+
results, e := catService.DescribeCatProbeNodeByFilter(ctx, paramMap)
162168
if e != nil {
163169
return retryError(e)
164170
}
@@ -170,6 +176,20 @@ func dataSourceTencentCloudCatNodeRead(d *schema.ResourceData, meta interface{})
170176
return err
171177
}
172178

179+
var nodeSetExt []*cat.NodeDefineExt
180+
err = resource.Retry(readRetryTimeout, func() *resource.RetryError {
181+
results, e := catService.DescribeCatNodeByFilter(ctx, paramMap)
182+
if e != nil {
183+
return retryError(e)
184+
}
185+
nodeSetExt = results
186+
return nil
187+
})
188+
if err != nil {
189+
log.Printf("[CRITAL]%s read Cat nodeSet failed, reason:%+v", logId, err)
190+
return err
191+
}
192+
173193
ids := make([]string, 0, len(nodeSets))
174194
nodeSetList := make([]map[string]interface{}, 0, len(nodeSets))
175195
if nodeSets != nil {
@@ -205,6 +225,16 @@ func dataSourceTencentCloudCatNodeRead(d *schema.ResourceData, meta interface{})
205225
if nodeSet.NodeDefineStatus != nil {
206226
nodeSetMap["node_define_status"] = nodeSet.NodeDefineStatus
207227
}
228+
229+
for _, node := range nodeSetExt {
230+
if *node.Code == *nodeSet.Code {
231+
if node.TaskTypes != nil {
232+
nodeSetMap["task_types"] = node.TaskTypes
233+
}
234+
break
235+
}
236+
}
237+
208238
ids = append(ids, *nodeSet.Name)
209239
nodeSetList = append(nodeSetList, nodeSetMap)
210240
}

0 commit comments

Comments
 (0)