Skip to content

Commit d3485c7

Browse files
resource/alicloud_threat_detection_vendor: new resource and data source for Threat Detection Vendor
Add the alicloud_threat_detection_vendor resource and the alicloud_threat_detection_vendors data source backed by the cloud-siem/2024-12-12 RPC API (CreateVendor/ListVendors/UpdateVendor/ DeleteVendor). Register cloud-siem endpoint and add the CloudSiemService helper.
1 parent 991dbca commit d3485c7

9 files changed

Lines changed: 767 additions & 0 deletions

alicloud/connectivity/endpoint.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,7 @@ var regularProductEndpoint = map[string]string{
406406
"fc_open": "%s.fc.aliyuncs.com",
407407
"fc": "%s.fc.aliyuncs.com",
408408
"cloudapi": "apigateway.%s.aliyuncs.com",
409+
"cloud_siem": "cloud-siem.%s.aliyuncs.com",
409410
"mns_open": "mns-open.%s.aliyuncs.com",
410411
"elasticsearch": "elasticsearch.%s.aliyuncs.com",
411412
"alikafka": "alikafka.%s.aliyuncs.com",
Lines changed: 213 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,213 @@
1+
package alicloud
2+
3+
import (
4+
"fmt"
5+
"regexp"
6+
"time"
7+
8+
"github.com/PaesslerAG/jsonpath"
9+
"github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity"
10+
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
11+
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
12+
"github.com/hashicorp/terraform-plugin-sdk/helper/validation"
13+
)
14+
15+
func dataSourceAlicloudThreatDetectionVendors() *schema.Resource {
16+
return &schema.Resource{
17+
Read: dataSourceAlicloudThreatDetectionVendorsRead,
18+
Schema: map[string]*schema.Schema{
19+
"name_regex": {
20+
Optional: true,
21+
Type: schema.TypeString,
22+
ValidateFunc: validation.StringIsValidRegExp,
23+
},
24+
"vendor_type": {
25+
Optional: true,
26+
Type: schema.TypeString,
27+
},
28+
"lang": {
29+
Optional: true,
30+
Default: "en",
31+
Type: schema.TypeString,
32+
},
33+
"role_for": {
34+
Optional: true,
35+
Type: schema.TypeInt,
36+
},
37+
"ids": {
38+
Optional: true,
39+
Computed: true,
40+
Type: schema.TypeList,
41+
Elem: &schema.Schema{
42+
Type: schema.TypeString,
43+
},
44+
},
45+
"output_file": {
46+
Optional: true,
47+
Type: schema.TypeString,
48+
},
49+
"vendors": {
50+
Computed: true,
51+
Type: schema.TypeList,
52+
Elem: &schema.Resource{
53+
Schema: map[string]*schema.Schema{
54+
"id": {
55+
Computed: true,
56+
Type: schema.TypeString,
57+
},
58+
"vendor_id": {
59+
Computed: true,
60+
Type: schema.TypeString,
61+
},
62+
"vendor_name": {
63+
Computed: true,
64+
Type: schema.TypeString,
65+
},
66+
"vendor_type": {
67+
Computed: true,
68+
Type: schema.TypeString,
69+
},
70+
"create_time": {
71+
Computed: true,
72+
Type: schema.TypeInt,
73+
},
74+
"update_time": {
75+
Computed: true,
76+
Type: schema.TypeInt,
77+
},
78+
},
79+
},
80+
},
81+
},
82+
}
83+
}
84+
85+
func dataSourceAlicloudThreatDetectionVendorsRead(d *schema.ResourceData, meta interface{}) error {
86+
client := meta.(*connectivity.AliyunClient)
87+
88+
request := make(map[string]interface{})
89+
if v, ok := d.GetOk("lang"); ok {
90+
request["Lang"] = v
91+
}
92+
if v, ok := d.GetOk("role_for"); ok {
93+
request["RoleFor"] = v
94+
}
95+
if v, ok := d.GetOk("vendor_type"); ok {
96+
request["VendorType"] = v
97+
}
98+
99+
var nameRegex *regexp.Regexp
100+
if v, ok := d.GetOk("name_regex"); ok {
101+
r, err := regexp.Compile(v.(string))
102+
if err != nil {
103+
return WrapError(err)
104+
}
105+
nameRegex = r
106+
}
107+
108+
idsMap := make(map[string]string)
109+
if v, ok := d.GetOk("ids"); ok {
110+
for _, vv := range v.([]interface{}) {
111+
if vv == nil {
112+
continue
113+
}
114+
idsMap[vv.(string)] = vv.(string)
115+
}
116+
}
117+
118+
var objects []interface{}
119+
var response map[string]interface{}
120+
nextToken := ""
121+
maxResults := 50
122+
123+
for {
124+
request["MaxResults"] = maxResults
125+
if nextToken != "" {
126+
request["NextToken"] = nextToken
127+
} else {
128+
delete(request, "NextToken")
129+
}
130+
131+
action := "ListVendors"
132+
wait := incrementalWait(3*time.Second, 3*time.Second)
133+
err := resource.Retry(5*time.Minute, func() *resource.RetryError {
134+
resp, err := client.RpcPost("cloud-siem", "2024-12-12", action, nil, request, true)
135+
if err != nil {
136+
if NeedRetry(err) {
137+
wait()
138+
return resource.RetryableError(err)
139+
}
140+
return resource.NonRetryableError(err)
141+
}
142+
response = resp
143+
addDebug(action, response, request)
144+
return nil
145+
})
146+
if err != nil {
147+
return WrapErrorf(err, DataDefaultErrorMsg, "alicloud_threat_detection_vendors", action, AlibabaCloudSdkGoERROR)
148+
}
149+
150+
vendorsRaw, err := jsonpath.Get("$.Vendors", response)
151+
if err != nil {
152+
return WrapErrorf(err, FailedGetAttributeMsg, action, "$.Vendors", response)
153+
}
154+
result, ok := vendorsRaw.([]interface{})
155+
if !ok {
156+
result = []interface{}{}
157+
}
158+
159+
if isPagingRequest(d) {
160+
objects = result
161+
break
162+
}
163+
164+
for _, v := range result {
165+
item := v.(map[string]interface{})
166+
if len(idsMap) > 0 {
167+
if _, ok := idsMap[fmt.Sprint(item["VendorId"])]; !ok {
168+
continue
169+
}
170+
}
171+
if nameRegex != nil && !nameRegex.MatchString(fmt.Sprint(item["VendorName"])) {
172+
continue
173+
}
174+
objects = append(objects, item)
175+
}
176+
177+
nt, _ := jsonpath.Get("$.NextToken", response)
178+
nextToken = fmt.Sprint(nt)
179+
if nextToken == "" || nextToken == "<nil>" {
180+
break
181+
}
182+
}
183+
184+
ids := make([]string, 0)
185+
s := make([]map[string]interface{}, 0)
186+
for _, v := range objects {
187+
object := v.(map[string]interface{})
188+
mapping := map[string]interface{}{
189+
"id": fmt.Sprint(object["VendorId"]),
190+
"vendor_id": object["VendorId"],
191+
"vendor_name": object["VendorName"],
192+
"vendor_type": object["VendorType"],
193+
"create_time": object["CreateTime"],
194+
"update_time": object["UpdateTime"],
195+
}
196+
ids = append(ids, fmt.Sprint(object["VendorId"]))
197+
s = append(s, mapping)
198+
}
199+
200+
d.SetId(dataResourceIdHash(ids))
201+
if err := d.Set("ids", ids); err != nil {
202+
return WrapError(err)
203+
}
204+
if err := d.Set("vendors", s); err != nil {
205+
return WrapError(err)
206+
}
207+
if output, ok := d.GetOk("output_file"); ok && output.(string) != "" {
208+
if err := writeToFile(output.(string), s); err != nil {
209+
return err
210+
}
211+
}
212+
return nil
213+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package alicloud
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
"testing"
7+
8+
"github.com/aliyun/terraform-provider-alicloud/alicloud/connectivity"
9+
"github.com/hashicorp/terraform-plugin-sdk/helper/acctest"
10+
)
11+
12+
func TestAccAliCloudThreatDetectionVendorsDataSource_basic(t *testing.T) {
13+
rand := acctest.RandIntRange(10000, 99999)
14+
15+
idsConf := dataSourceTestAccConfig{
16+
existConfig: testAccCheckAlicloudThreatDetectionVendorsSourceConfig(rand, map[string]string{
17+
"ids": `["${alicloud_threat_detection_vendor.default.id}"]`,
18+
}),
19+
fakeConfig: testAccCheckAlicloudThreatDetectionVendorsSourceConfig(rand, map[string]string{
20+
"ids": `["${alicloud_threat_detection_vendor.default.id}_fake"]`,
21+
}),
22+
}
23+
nameRegexConf := dataSourceTestAccConfig{
24+
existConfig: testAccCheckAlicloudThreatDetectionVendorsSourceConfig(rand, map[string]string{
25+
"name_regex": `"${var.name}"`,
26+
}),
27+
fakeConfig: testAccCheckAlicloudThreatDetectionVendorsSourceConfig(rand, map[string]string{
28+
"name_regex": `"${var.name}_fake"`,
29+
}),
30+
}
31+
allConf := dataSourceTestAccConfig{
32+
existConfig: testAccCheckAlicloudThreatDetectionVendorsSourceConfig(rand, map[string]string{
33+
"ids": `["${alicloud_threat_detection_vendor.default.id}"]`,
34+
"name_regex": `"${var.name}"`,
35+
}),
36+
fakeConfig: testAccCheckAlicloudThreatDetectionVendorsSourceConfig(rand, map[string]string{
37+
"ids": `["${alicloud_threat_detection_vendor.default.id}_fake"]`,
38+
"name_regex": `"${var.name}_fake"`,
39+
}),
40+
}
41+
42+
preCheck := func() {
43+
testAccPreCheck(t)
44+
testAccPreCheckWithRegions(t, true, []connectivity.Region{connectivity.Shanghai})
45+
}
46+
ThreatDetectionVendorsDataSourceCheckInfo.dataSourceTestCheckWithPreCheck(t, rand, preCheck, idsConf, nameRegexConf, allConf)
47+
}
48+
49+
var existThreatDetectionVendorsMapFunc = func(rand int) map[string]string {
50+
return map[string]string{
51+
"vendors.#": "1",
52+
"vendors.0.id": CHECKSET,
53+
"vendors.0.vendor_id": CHECKSET,
54+
"vendors.0.vendor_name": CHECKSET,
55+
"vendors.0.vendor_type": CHECKSET,
56+
"vendors.0.create_time": CHECKSET,
57+
"vendors.0.update_time": CHECKSET,
58+
}
59+
}
60+
61+
var fakeThreatDetectionVendorsMapFunc = func(rand int) map[string]string {
62+
return map[string]string{
63+
"vendors.#": "0",
64+
}
65+
}
66+
67+
var ThreatDetectionVendorsDataSourceCheckInfo = dataSourceAttr{
68+
resourceId: "data.alicloud_threat_detection_vendors.default",
69+
existMapFunc: existThreatDetectionVendorsMapFunc,
70+
fakeMapFunc: fakeThreatDetectionVendorsMapFunc,
71+
}
72+
73+
func testAccCheckAlicloudThreatDetectionVendorsSourceConfig(rand int, attrMap map[string]string) string {
74+
var pairs []string
75+
for k, v := range attrMap {
76+
pairs = append(pairs, k+" = "+v)
77+
}
78+
config := fmt.Sprintf(`
79+
variable "name" {
80+
default = "tf-testAccThreatDetectionVendors%d"
81+
}
82+
83+
resource "alicloud_threat_detection_vendor" "default" {
84+
vendor_name = var.name
85+
lang = "en"
86+
}
87+
88+
data "alicloud_threat_detection_vendors" "default" {
89+
%s
90+
}
91+
`, rand, strings.Join(pairs, "\n "))
92+
return config
93+
}

alicloud/provider.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -909,6 +909,7 @@ func Provider() terraform.ResourceProvider {
909909
"alicloud_threat_detection_honeypot_images": dataSourceAlicloudThreatDetectionHoneypotImages(),
910910
"alicloud_threat_detection_honey_pots": dataSourceAlicloudThreatDetectionHoneyPots(),
911911
"alicloud_threat_detection_honeypot_probes": dataSourceAlicloudThreatDetectionHoneypotProbes(),
912+
"alicloud_threat_detection_vendors": dataSourceAlicloudThreatDetectionVendors(),
912913
"alicloud_ecs_capacity_reservations": dataSourceAlicloudEcsCapacityReservations(),
913914
"alicloud_cen_inter_region_traffic_qos_queues": dataSourceAlicloudCenInterRegionTrafficQosQueues(),
914915
"alicloud_cen_transit_router_multicast_domain_peer_members": dataSourceAlicloudCenTransitRouterMulticastDomainPeerMembers(),
@@ -2118,6 +2119,7 @@ func Provider() terraform.ResourceProvider {
21182119
"alicloud_threat_detection_anti_brute_force_rule": resourceAliCloudThreatDetectionAntiBruteForceRule(),
21192120
"alicloud_threat_detection_honey_pot": resourceAlicloudThreatDetectionHoneyPot(),
21202121
"alicloud_threat_detection_honeypot_probe": resourceAlicloudThreatDetectionHoneypotProbe(),
2122+
"alicloud_threat_detection_vendor": resourceAlicloudThreatDetectionVendor(),
21212123
"alicloud_ecs_capacity_reservation": resourceAlicloudEcsCapacityReservation(),
21222124
"alicloud_cen_inter_region_traffic_qos_queue": resourceAliCloudCenInterRegionTrafficQosQueue(),
21232125
"alicloud_cen_transit_router_multicast_domain_peer_member": resourceAliCloudCenTransitRouterMulticastDomainPeerMember(),

0 commit comments

Comments
 (0)