4
4
"context"
5
5
"fmt"
6
6
"log"
7
+ "reflect"
7
8
"strings"
8
-
9
9
"time"
10
10
11
11
"github.com/hashicorp/errwrap"
@@ -24,6 +24,16 @@ import (
24
24
{{- end }}
25
25
)
26
26
27
+ // IsEmptyValue does not consider a empty PreconfiguredWafConfig object as empty so we check it's nested values
28
+ func preconfiguredWafConfigIsEmptyValue(config *compute.SecurityPolicyRulePreconfiguredWafConfig) bool {
29
+ if (tpgresource.IsEmptyValue(reflect.ValueOf(config.Exclusions)) &&
30
+ tpgresource.IsEmptyValue(reflect.ValueOf(config.ForceSendFields)) &&
31
+ tpgresource.IsEmptyValue(reflect.ValueOf(config.NullFields))) {
32
+ return true
33
+ }
34
+ return false
35
+ }
36
+
27
37
func ResourceComputeSecurityPolicy() *schema.Resource {
28
38
return &schema.Resource{
29
39
Create: resourceComputeSecurityPolicyCreate,
@@ -198,7 +208,6 @@ func ResourceComputeSecurityPolicy() *schema.Resource {
198
208
Description: `A match condition that incoming traffic is evaluated against. If it evaluates to true, the corresponding action is enforced.`,
199
209
},
200
210
201
- {{ if ne $.TargetVersionName `ga` -}}
202
211
"preconfigured_waf_config": {
203
212
Type: schema.TypeList,
204
213
Optional: true,
@@ -246,7 +255,6 @@ func ResourceComputeSecurityPolicy() *schema.Resource {
246
255
},
247
256
Description: `Preconfigured WAF configuration to be applied for the rule. If the rule does not evaluate preconfigured WAF rules, i.e., if evaluatePreconfiguredWaf() is not used, this field will have no effect.`,
248
257
},
249
- {{- end }}
250
258
251
259
"description": {
252
260
Type: schema.TypeString,
@@ -597,7 +605,6 @@ func ResourceComputeSecurityPolicy() *schema.Resource {
597
605
}
598
606
}
599
607
600
- {{ if ne $.TargetVersionName `ga` -}}
601
608
func resourceComputeSecurityPolicyRulePreconfiguredWafConfigExclusionFieldParamsSchema(description string) *schema.Schema {
602
609
return &schema.Schema{
603
610
Type: schema.TypeList,
@@ -620,7 +627,6 @@ func resourceComputeSecurityPolicyRulePreconfiguredWafConfigExclusionFieldParams
620
627
Description: description,
621
628
}
622
629
}
623
- {{- end }}
624
630
625
631
func rulesCustomizeDiff(_ context.Context, diff *schema.ResourceDiff, _ interface{}) error {
626
632
_, n := diff.GetChange("rule")
@@ -730,7 +736,7 @@ func resourceComputeSecurityPolicyRead(d *schema.ResourceData, meta interface{})
730
736
if err := d.Set("type", securityPolicy.Type); err != nil {
731
737
return fmt.Errorf("Error setting type: %s", err)
732
738
}
733
- if err := d.Set("rule", flattenSecurityPolicyRules(securityPolicy.Rules)); err != nil {
739
+ if err := d.Set("rule", flattenSecurityPolicyRules(securityPolicy.Rules, d )); err != nil {
734
740
return err
735
741
}
736
742
if err := d.Set("fingerprint", securityPolicy.Fingerprint); err != nil {
@@ -1042,9 +1048,7 @@ func expandSecurityPolicyRule(raw interface{}) *compute.SecurityPolicyRule {
1042
1048
Action: data["action"].(string),
1043
1049
Preview: data["preview"].(bool),
1044
1050
Match: expandSecurityPolicyMatch(data["match"].([]interface{})),
1045
- {{- if ne $.TargetVersionName "ga" }}
1046
1051
PreconfiguredWafConfig: expandSecurityPolicyPreconfiguredWafConfig(data["preconfigured_waf_config"].([]interface{})),
1047
- {{- end }}
1048
1052
RateLimitOptions: expandSecurityPolicyRuleRateLimitOptions(data["rate_limit_options"].([]interface{})),
1049
1053
RedirectOptions: expandSecurityPolicyRuleRedirectOptions(data["redirect_options"].([]interface{})),
1050
1054
HeaderAction: expandSecurityPolicyRuleHeaderAction(data["header_action"].([]interface{})),
@@ -1128,7 +1132,6 @@ func expandSecurityPolicyMatchExprOptionsRecaptchaOptions(recaptchaOptions []int
1128
1132
}
1129
1133
}
1130
1134
1131
- {{ if ne $.TargetVersionName `ga` -}}
1132
1135
func expandSecurityPolicyPreconfiguredWafConfig(configured []interface{}) *compute.SecurityPolicyRulePreconfiguredWafConfig {
1133
1136
if len(configured) == 0 || configured[0] == nil {
1134
1137
return nil
@@ -1175,9 +1178,8 @@ func expandSecurityPolicyRulePreconfiguredWafConfigExclusionFieldParam(raw inter
1175
1178
Val: data["value"].(string),
1176
1179
}
1177
1180
}
1178
- {{- end }}
1179
1181
1180
- func flattenSecurityPolicyRules(rules []*compute.SecurityPolicyRule) []map[string]interface{} {
1182
+ func flattenSecurityPolicyRules(rules []*compute.SecurityPolicyRule, d *schema.ResourceData ) []map[string]interface{} {
1181
1183
rulesSchema := make([]map[string]interface{}, 0, len(rules))
1182
1184
for _, rule := range rules {
1183
1185
data := map[string]interface{}{
@@ -1186,9 +1188,7 @@ func flattenSecurityPolicyRules(rules []*compute.SecurityPolicyRule) []map[strin
1186
1188
"action": rule.Action,
1187
1189
"preview": rule.Preview,
1188
1190
"match": flattenMatch(rule.Match),
1189
- {{- if ne $.TargetVersionName "ga" }}
1190
- "preconfigured_waf_config": flattenPreconfiguredWafConfig(rule.PreconfiguredWafConfig),
1191
- {{- end }}
1191
+ "preconfigured_waf_config": flattenPreconfiguredWafConfig(rule.PreconfiguredWafConfig, d, int(rule.Priority)),
1192
1192
"rate_limit_options": flattenSecurityPolicyRuleRateLimitOptions(rule.RateLimitOptions),
1193
1193
"redirect_options": flattenSecurityPolicyRedirectOptions(rule.RedirectOptions),
1194
1194
"header_action": flattenSecurityPolicyRuleHeaderAction(rule.HeaderAction),
@@ -1266,12 +1266,29 @@ func flattenMatchExpr(match *compute.SecurityPolicyRuleMatcher) []map[string]int
1266
1266
return []map[string]interface{}{data}
1267
1267
}
1268
1268
1269
- {{ if ne $.TargetVersionName `ga` -}}
1270
- func flattenPreconfiguredWafConfig(config *compute.SecurityPolicyRulePreconfiguredWafConfig) []map[string]interface{} {
1269
+ func flattenPreconfiguredWafConfig(config *compute.SecurityPolicyRulePreconfiguredWafConfig, d *schema.ResourceData, rulePriority int) []map[string]interface{} {
1271
1270
if config == nil {
1272
1271
return nil
1273
1272
}
1274
1273
1274
+ // We find the current value for this field in the config and check if its empty, then check if the API is returning a empty non-null value
1275
+ if schemaRules, ok := d.GetOk("rule"); ok {
1276
+ for _, itemRaw := range schemaRules.(*schema.Set).List() {
1277
+ if itemRaw == nil {
1278
+ continue
1279
+ }
1280
+ item := itemRaw.(map[string]interface{})
1281
+
1282
+ schemaPriority := item["priority"].(int)
1283
+ if rulePriority == schemaPriority {
1284
+ if preconfiguredWafConfigIsEmptyValue(config) && tpgresource.IsEmptyValue(reflect.ValueOf(item["preconfigured_waf_config"])) {
1285
+ return nil
1286
+ }
1287
+ break
1288
+ }
1289
+ }
1290
+ }
1291
+
1275
1292
data := map[string]interface{}{
1276
1293
"exclusion": flattenPreconfiguredWafConfigExclusions(config.Exclusions),
1277
1294
}
@@ -1307,7 +1324,6 @@ func flattenPreconfiguredWafConfigExclusionField(fieldParams []*compute.Security
1307
1324
}
1308
1325
return fieldSchema
1309
1326
}
1310
- {{- end }}
1311
1327
1312
1328
func expandSecurityPolicyAdvancedOptionsConfig(configured []interface{}) *compute.SecurityPolicyAdvancedOptionsConfig {
1313
1329
if len(configured) == 0 || configured[0] == nil {
0 commit comments