Skip to content

Commit f1406b4

Browse files
committed
New Data Source: alicloud_esa_waf_rulesets
1 parent 7c14c61 commit f1406b4

4 files changed

Lines changed: 628 additions & 0 deletions

File tree

Lines changed: 289 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,289 @@
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 dataSourceAliCloudEsaWafRuleSets() *schema.Resource {
16+
return &schema.Resource{
17+
Read: dataSourceAliCloudEsaWafRuleSetRead,
18+
Schema: map[string]*schema.Schema{
19+
"ids": {
20+
Type: schema.TypeList,
21+
Optional: true,
22+
Computed: true,
23+
Elem: &schema.Schema{Type: schema.TypeString},
24+
},
25+
"name_regex": {
26+
Type: schema.TypeString,
27+
Optional: true,
28+
ValidateFunc: validation.StringIsValidRegExp,
29+
},
30+
"site_id": {
31+
Type: schema.TypeString,
32+
Required: true,
33+
},
34+
"phase": {
35+
Type: schema.TypeString,
36+
Required: true,
37+
},
38+
"site_version": {
39+
Type: schema.TypeInt,
40+
Required: true,
41+
},
42+
"status": {
43+
Type: schema.TypeString,
44+
Optional: true,
45+
ValidateFunc: StringInSlice([]string{"on", "off"}, true),
46+
},
47+
"query_args": {
48+
Type: schema.TypeList,
49+
Optional: true,
50+
MaxItems: 1,
51+
Elem: &schema.Resource{
52+
Schema: map[string]*schema.Schema{
53+
"any_like": {
54+
Type: schema.TypeString,
55+
Optional: true,
56+
},
57+
"name_like": {
58+
Type: schema.TypeString,
59+
Optional: true,
60+
},
61+
"order_by": {
62+
Type: schema.TypeString,
63+
Optional: true,
64+
},
65+
"desc": {
66+
Type: schema.TypeBool,
67+
Optional: true,
68+
},
69+
},
70+
},
71+
},
72+
"output_file": {
73+
Type: schema.TypeString,
74+
Optional: true,
75+
},
76+
"names": {
77+
Type: schema.TypeList,
78+
Computed: true,
79+
Elem: &schema.Schema{Type: schema.TypeString},
80+
},
81+
"sets": {
82+
Type: schema.TypeList,
83+
Computed: true,
84+
Elem: &schema.Resource{
85+
Schema: map[string]*schema.Schema{
86+
"id": {
87+
Type: schema.TypeString,
88+
Computed: true,
89+
},
90+
"ruleset_id": {
91+
Type: schema.TypeString,
92+
Computed: true,
93+
},
94+
"phase": {
95+
Type: schema.TypeString,
96+
Computed: true,
97+
},
98+
"name": {
99+
Type: schema.TypeString,
100+
Computed: true,
101+
},
102+
"target": {
103+
Type: schema.TypeString,
104+
Computed: true,
105+
},
106+
"status": {
107+
Type: schema.TypeString,
108+
Computed: true,
109+
},
110+
"update_time": {
111+
Type: schema.TypeString,
112+
Computed: true,
113+
},
114+
"types": {
115+
Type: schema.TypeList,
116+
Computed: true,
117+
Elem: &schema.Schema{Type: schema.TypeString},
118+
},
119+
"fields": {
120+
Type: schema.TypeList,
121+
Computed: true,
122+
Elem: &schema.Schema{Type: schema.TypeString},
123+
},
124+
},
125+
},
126+
},
127+
},
128+
}
129+
}
130+
131+
func dataSourceAliCloudEsaWafRuleSetRead(d *schema.ResourceData, meta interface{}) error {
132+
client := meta.(*connectivity.AliyunClient)
133+
134+
action := "ListWafRulesets"
135+
request := make(map[string]interface{})
136+
request["RegionId"] = client.RegionId
137+
request["PageSize"] = PageSizeLarge
138+
request["PageNumber"] = 1
139+
140+
request["SiteId"] = d.Get("site_id")
141+
request["Phase"] = d.Get("phase")
142+
request["SiteVersion"] = d.Get("site_version")
143+
144+
if v, ok := d.GetOk("query_args"); ok {
145+
queryArgsMap := map[string]interface{}{}
146+
for _, queryArgsList := range v.([]interface{}) {
147+
queryArgsArg := queryArgsList.(map[string]interface{})
148+
149+
if anyLike, ok := queryArgsArg["any_like"]; ok {
150+
queryArgsMap["AnyLike"] = anyLike
151+
}
152+
153+
if nameLike, ok := queryArgsArg["name_like"]; ok {
154+
queryArgsMap["NameLike"] = nameLike
155+
}
156+
157+
if orderBy, ok := queryArgsArg["order_by"]; ok {
158+
queryArgsMap["OrderBy"] = orderBy
159+
}
160+
161+
if desc, ok := d.GetOkExists("query_args.0.desc"); ok {
162+
queryArgsMap["Desc"] = desc
163+
}
164+
}
165+
166+
request["QueryArgs"] = convertObjectToJsonString(queryArgsMap)
167+
}
168+
169+
status, statusOk := d.GetOk("status")
170+
171+
var objects []map[string]interface{}
172+
173+
idsMap := make(map[string]string)
174+
if v, ok := d.GetOk("ids"); ok {
175+
for _, vv := range v.([]interface{}) {
176+
if vv == nil {
177+
continue
178+
}
179+
idsMap[vv.(string)] = vv.(string)
180+
}
181+
}
182+
183+
var wafRuleSetNameRegex *regexp.Regexp
184+
if v, ok := d.GetOk("name_regex"); ok {
185+
r, err := regexp.Compile(v.(string))
186+
if err != nil {
187+
return WrapError(err)
188+
}
189+
190+
wafRuleSetNameRegex = r
191+
}
192+
193+
var response map[string]interface{}
194+
var err error
195+
196+
for {
197+
wait := incrementalWait(3*time.Second, 5*time.Second)
198+
err = resource.Retry(5*time.Minute, func() *resource.RetryError {
199+
response, err = client.RpcPost("ESA", "2024-09-10", action, nil, request, true)
200+
if err != nil {
201+
if IsExpectedErrors(err, []string{"Site.ServiceBusy", "TooManyRequests"}) || NeedRetry(err) {
202+
wait()
203+
return resource.RetryableError(err)
204+
}
205+
return resource.NonRetryableError(err)
206+
}
207+
return nil
208+
})
209+
addDebug(action, response, request)
210+
211+
if err != nil {
212+
return WrapErrorf(err, DataDefaultErrorMsg, "alicloud_esa_waf_rulesets", action, AlibabaCloudSdkGoERROR)
213+
}
214+
215+
resp, err := jsonpath.Get("$.Rulesets", response)
216+
if err != nil {
217+
return WrapErrorf(err, FailedGetAttributeMsg, action, "$.Rulesets", response)
218+
}
219+
220+
result, _ := resp.([]interface{})
221+
for _, v := range result {
222+
item := v.(map[string]interface{})
223+
if len(idsMap) > 0 {
224+
if _, ok := idsMap[fmt.Sprintf("%v:%v", item["Id"], request["SiteId"])]; !ok {
225+
continue
226+
}
227+
}
228+
229+
if wafRuleSetNameRegex != nil {
230+
if !wafRuleSetNameRegex.MatchString(fmt.Sprint(item["Name"])) {
231+
continue
232+
}
233+
}
234+
235+
if statusOk && status.(string) != "" && status.(string) != item["Status"].(string) {
236+
continue
237+
}
238+
239+
objects = append(objects, item)
240+
}
241+
242+
if len(result) < PageSizeLarge {
243+
break
244+
}
245+
246+
request["PageNumber"] = request["PageNumber"].(int) + 1
247+
}
248+
249+
ids := make([]string, 0)
250+
names := make([]interface{}, 0)
251+
s := make([]map[string]interface{}, 0)
252+
for _, object := range objects {
253+
mapping := map[string]interface{}{
254+
"id": fmt.Sprintf("%v:%v", object["Id"], request["SiteId"]),
255+
"ruleset_id": fmt.Sprint(object["Id"]),
256+
"phase": object["Phase"],
257+
"name": object["Name"],
258+
"target": object["Target"],
259+
"status": object["Status"],
260+
"update_time": object["UpdateTime"],
261+
"types": object["Types"],
262+
"fields": object["Fields"],
263+
}
264+
265+
ids = append(ids, fmt.Sprint(mapping["id"]))
266+
names = append(names, object["Name"])
267+
s = append(s, mapping)
268+
}
269+
270+
d.SetId(dataResourceIdHash(ids))
271+
272+
if err := d.Set("ids", ids); err != nil {
273+
return WrapError(err)
274+
}
275+
276+
if err := d.Set("names", names); err != nil {
277+
return WrapError(err)
278+
}
279+
280+
if err := d.Set("sets", s); err != nil {
281+
return WrapError(err)
282+
}
283+
284+
if output, ok := d.GetOk("output_file"); ok && output.(string) != "" {
285+
writeToFile(output.(string), s)
286+
}
287+
288+
return nil
289+
}

0 commit comments

Comments
 (0)