Skip to content

Commit 7ef64cb

Browse files
Add advanced_options_config to regional security policies. (#14726) (#23914)
[upstream:faa4bee71581156f098912ac874b06aa6dd0a8f7] Signed-off-by: Modular Magician <[email protected]>
1 parent 13ee382 commit 7ef64cb

File tree

4 files changed

+246
-0
lines changed

4 files changed

+246
-0
lines changed

.changelog/14726.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
compute: added `advanced_options_config` field to `google_compute_region_security_policy` resource
3+
```

google/services/compute/resource_compute_region_security_policy.go

Lines changed: 200 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,56 @@ func ResourceComputeRegionSecurityPolicy() *schema.Resource {
9393
Description: `Name of the resource. Provided by the client when the resource is created. The name must be 1-63 characters long, and comply with RFC1035.
9494
Specifically, the name must be 1-63 characters long and match the regular expression [a-z]([-a-z0-9]*[a-z0-9])? which means the first character must be a lowercase letter, and all following characters must be a dash, lowercase letter, or digit, except the last character, which cannot be a dash.`,
9595
},
96+
"advanced_options_config": {
97+
Type: schema.TypeList,
98+
Optional: true,
99+
Description: `Advanced Options Config of this security policy.`,
100+
MaxItems: 1,
101+
Elem: &schema.Resource{
102+
Schema: map[string]*schema.Schema{
103+
"json_custom_config": {
104+
Type: schema.TypeList,
105+
Optional: true,
106+
Description: `Custom configuration to apply the JSON parsing. Only applicable when JSON parsing is set to STANDARD.`,
107+
MaxItems: 1,
108+
Elem: &schema.Resource{
109+
Schema: map[string]*schema.Schema{
110+
"content_types": {
111+
Type: schema.TypeSet,
112+
Required: true,
113+
Description: `A list of custom Content-Type header values to apply the JSON parsing.`,
114+
Elem: &schema.Schema{
115+
Type: schema.TypeString,
116+
},
117+
Set: schema.HashString,
118+
},
119+
},
120+
},
121+
},
122+
"json_parsing": {
123+
Type: schema.TypeString,
124+
Optional: true,
125+
ValidateFunc: verify.ValidateEnum([]string{"DISABLED", "STANDARD", "STANDARD_WITH_GRAPHQL", ""}),
126+
Description: `JSON body parsing. Supported values include: "DISABLED", "STANDARD", "STANDARD_WITH_GRAPHQL". Possible values: ["DISABLED", "STANDARD", "STANDARD_WITH_GRAPHQL"]`,
127+
},
128+
"log_level": {
129+
Type: schema.TypeString,
130+
Optional: true,
131+
ValidateFunc: verify.ValidateEnum([]string{"NORMAL", "VERBOSE", ""}),
132+
Description: `Logging level. Supported values include: "NORMAL", "VERBOSE". Possible values: ["NORMAL", "VERBOSE"]`,
133+
},
134+
"user_ip_request_headers": {
135+
Type: schema.TypeSet,
136+
Optional: true,
137+
Description: `An optional list of case-insensitive request header names to use for resolving the callers client IP address.`,
138+
Elem: &schema.Schema{
139+
Type: schema.TypeString,
140+
},
141+
Set: schema.HashString,
142+
},
143+
},
144+
},
145+
},
96146
"ddos_protection_config": {
97147
Type: schema.TypeList,
98148
Optional: true,
@@ -713,6 +763,12 @@ func resourceComputeRegionSecurityPolicyCreate(d *schema.ResourceData, meta inte
713763
} else if v, ok := d.GetOkExists("ddos_protection_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(ddosProtectionConfigProp)) && (ok || !reflect.DeepEqual(v, ddosProtectionConfigProp)) {
714764
obj["ddosProtectionConfig"] = ddosProtectionConfigProp
715765
}
766+
advancedOptionsConfigProp, err := expandComputeRegionSecurityPolicyAdvancedOptionsConfig(d.Get("advanced_options_config"), d, config)
767+
if err != nil {
768+
return err
769+
} else if v, ok := d.GetOkExists("advanced_options_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(advancedOptionsConfigProp)) && (ok || !reflect.DeepEqual(v, advancedOptionsConfigProp)) {
770+
obj["advancedOptionsConfig"] = advancedOptionsConfigProp
771+
}
716772
userDefinedFieldsProp, err := expandComputeRegionSecurityPolicyUserDefinedFields(d.Get("user_defined_fields"), d, config)
717773
if err != nil {
718774
return err
@@ -848,6 +904,9 @@ func resourceComputeRegionSecurityPolicyRead(d *schema.ResourceData, meta interf
848904
if err := d.Set("ddos_protection_config", flattenComputeRegionSecurityPolicyDdosProtectionConfig(res["ddosProtectionConfig"], d, config)); err != nil {
849905
return fmt.Errorf("Error reading RegionSecurityPolicy: %s", err)
850906
}
907+
if err := d.Set("advanced_options_config", flattenComputeRegionSecurityPolicyAdvancedOptionsConfig(res["advancedOptionsConfig"], d, config)); err != nil {
908+
return fmt.Errorf("Error reading RegionSecurityPolicy: %s", err)
909+
}
851910
if err := d.Set("self_link", flattenComputeRegionSecurityPolicySelfLink(res["selfLink"], d, config)); err != nil {
852911
return fmt.Errorf("Error reading RegionSecurityPolicy: %s", err)
853912
}
@@ -901,6 +960,12 @@ func resourceComputeRegionSecurityPolicyUpdate(d *schema.ResourceData, meta inte
901960
} else if v, ok := d.GetOkExists("ddos_protection_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, ddosProtectionConfigProp)) {
902961
obj["ddosProtectionConfig"] = ddosProtectionConfigProp
903962
}
963+
advancedOptionsConfigProp, err := expandComputeRegionSecurityPolicyAdvancedOptionsConfig(d.Get("advanced_options_config"), d, config)
964+
if err != nil {
965+
return err
966+
} else if v, ok := d.GetOkExists("advanced_options_config"); !tpgresource.IsEmptyValue(reflect.ValueOf(v)) && (ok || !reflect.DeepEqual(v, advancedOptionsConfigProp)) {
967+
obj["advancedOptionsConfig"] = advancedOptionsConfigProp
968+
}
904969
userDefinedFieldsProp, err := expandComputeRegionSecurityPolicyUserDefinedFields(d.Get("user_defined_fields"), d, config)
905970
if err != nil {
906971
return err
@@ -935,6 +1000,10 @@ func resourceComputeRegionSecurityPolicyUpdate(d *schema.ResourceData, meta inte
9351000
updateMask = append(updateMask, "ddosProtectionConfig")
9361001
}
9371002

1003+
if d.HasChange("advanced_options_config") {
1004+
updateMask = append(updateMask, "advancedOptionsConfig")
1005+
}
1006+
9381007
if d.HasChange("user_defined_fields") {
9391008
updateMask = append(updateMask, "userDefinedFields")
9401009
}
@@ -1099,6 +1168,60 @@ func flattenComputeRegionSecurityPolicyDdosProtectionConfigDdosProtection(v inte
10991168
return v
11001169
}
11011170

1171+
func flattenComputeRegionSecurityPolicyAdvancedOptionsConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1172+
if v == nil {
1173+
return nil
1174+
}
1175+
original := v.(map[string]interface{})
1176+
if len(original) == 0 {
1177+
return nil
1178+
}
1179+
transformed := make(map[string]interface{})
1180+
transformed["json_parsing"] =
1181+
flattenComputeRegionSecurityPolicyAdvancedOptionsConfigJsonParsing(original["jsonParsing"], d, config)
1182+
transformed["json_custom_config"] =
1183+
flattenComputeRegionSecurityPolicyAdvancedOptionsConfigJsonCustomConfig(original["jsonCustomConfig"], d, config)
1184+
transformed["log_level"] =
1185+
flattenComputeRegionSecurityPolicyAdvancedOptionsConfigLogLevel(original["logLevel"], d, config)
1186+
transformed["user_ip_request_headers"] =
1187+
flattenComputeRegionSecurityPolicyAdvancedOptionsConfigUserIpRequestHeaders(original["userIpRequestHeaders"], d, config)
1188+
return []interface{}{transformed}
1189+
}
1190+
func flattenComputeRegionSecurityPolicyAdvancedOptionsConfigJsonParsing(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1191+
return v
1192+
}
1193+
1194+
func flattenComputeRegionSecurityPolicyAdvancedOptionsConfigJsonCustomConfig(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1195+
if v == nil {
1196+
return nil
1197+
}
1198+
original := v.(map[string]interface{})
1199+
if len(original) == 0 {
1200+
return nil
1201+
}
1202+
transformed := make(map[string]interface{})
1203+
transformed["content_types"] =
1204+
flattenComputeRegionSecurityPolicyAdvancedOptionsConfigJsonCustomConfigContentTypes(original["contentTypes"], d, config)
1205+
return []interface{}{transformed}
1206+
}
1207+
func flattenComputeRegionSecurityPolicyAdvancedOptionsConfigJsonCustomConfigContentTypes(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1208+
if v == nil {
1209+
return v
1210+
}
1211+
return schema.NewSet(schema.HashString, v.([]interface{}))
1212+
}
1213+
1214+
func flattenComputeRegionSecurityPolicyAdvancedOptionsConfigLogLevel(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1215+
return v
1216+
}
1217+
1218+
func flattenComputeRegionSecurityPolicyAdvancedOptionsConfigUserIpRequestHeaders(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
1219+
if v == nil {
1220+
return v
1221+
}
1222+
return schema.NewSet(schema.HashString, v.([]interface{}))
1223+
}
1224+
11021225
func flattenComputeRegionSecurityPolicySelfLink(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
11031226
return v
11041227
}
@@ -1749,6 +1872,83 @@ func expandComputeRegionSecurityPolicyDdosProtectionConfigDdosProtection(v inter
17491872
return v, nil
17501873
}
17511874

1875+
func expandComputeRegionSecurityPolicyAdvancedOptionsConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1876+
l := v.([]interface{})
1877+
if len(l) == 0 || l[0] == nil {
1878+
return nil, nil
1879+
}
1880+
raw := l[0]
1881+
original := raw.(map[string]interface{})
1882+
transformed := make(map[string]interface{})
1883+
1884+
transformedJsonParsing, err := expandComputeRegionSecurityPolicyAdvancedOptionsConfigJsonParsing(original["json_parsing"], d, config)
1885+
if err != nil {
1886+
return nil, err
1887+
} else if val := reflect.ValueOf(transformedJsonParsing); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1888+
transformed["jsonParsing"] = transformedJsonParsing
1889+
}
1890+
1891+
transformedJsonCustomConfig, err := expandComputeRegionSecurityPolicyAdvancedOptionsConfigJsonCustomConfig(original["json_custom_config"], d, config)
1892+
if err != nil {
1893+
return nil, err
1894+
} else if val := reflect.ValueOf(transformedJsonCustomConfig); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1895+
transformed["jsonCustomConfig"] = transformedJsonCustomConfig
1896+
}
1897+
1898+
transformedLogLevel, err := expandComputeRegionSecurityPolicyAdvancedOptionsConfigLogLevel(original["log_level"], d, config)
1899+
if err != nil {
1900+
return nil, err
1901+
} else if val := reflect.ValueOf(transformedLogLevel); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1902+
transformed["logLevel"] = transformedLogLevel
1903+
}
1904+
1905+
transformedUserIpRequestHeaders, err := expandComputeRegionSecurityPolicyAdvancedOptionsConfigUserIpRequestHeaders(original["user_ip_request_headers"], d, config)
1906+
if err != nil {
1907+
return nil, err
1908+
} else if val := reflect.ValueOf(transformedUserIpRequestHeaders); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1909+
transformed["userIpRequestHeaders"] = transformedUserIpRequestHeaders
1910+
}
1911+
1912+
return transformed, nil
1913+
}
1914+
1915+
func expandComputeRegionSecurityPolicyAdvancedOptionsConfigJsonParsing(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1916+
return v, nil
1917+
}
1918+
1919+
func expandComputeRegionSecurityPolicyAdvancedOptionsConfigJsonCustomConfig(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1920+
l := v.([]interface{})
1921+
if len(l) == 0 || l[0] == nil {
1922+
return nil, nil
1923+
}
1924+
raw := l[0]
1925+
original := raw.(map[string]interface{})
1926+
transformed := make(map[string]interface{})
1927+
1928+
transformedContentTypes, err := expandComputeRegionSecurityPolicyAdvancedOptionsConfigJsonCustomConfigContentTypes(original["content_types"], d, config)
1929+
if err != nil {
1930+
return nil, err
1931+
} else if val := reflect.ValueOf(transformedContentTypes); val.IsValid() && !tpgresource.IsEmptyValue(val) {
1932+
transformed["contentTypes"] = transformedContentTypes
1933+
}
1934+
1935+
return transformed, nil
1936+
}
1937+
1938+
func expandComputeRegionSecurityPolicyAdvancedOptionsConfigJsonCustomConfigContentTypes(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1939+
v = v.(*schema.Set).List()
1940+
return v, nil
1941+
}
1942+
1943+
func expandComputeRegionSecurityPolicyAdvancedOptionsConfigLogLevel(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1944+
return v, nil
1945+
}
1946+
1947+
func expandComputeRegionSecurityPolicyAdvancedOptionsConfigUserIpRequestHeaders(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
1948+
v = v.(*schema.Set).List()
1949+
return v, nil
1950+
}
1951+
17521952
func expandComputeRegionSecurityPolicyUserDefinedFields(v interface{}, d tpgresource.TerraformResourceData, config *transport_tpg.Config) (interface{}, error) {
17531953
l := v.([]interface{})
17541954
req := make([]interface{}, 0, len(l))

google/services/compute/resource_compute_region_security_policy_generated_meta.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ api_service_name: 'compute.googleapis.com'
55
api_version: 'v1'
66
api_resource_type_kind: 'SecurityPolicy'
77
fields:
8+
- field: 'advanced_options_config.json_custom_config.content_types'
9+
- field: 'advanced_options_config.json_parsing'
10+
- field: 'advanced_options_config.log_level'
11+
- field: 'advanced_options_config.user_ip_request_headers'
812
- field: 'ddos_protection_config.ddos_protection'
913
- field: 'description'
1014
- field: 'fingerprint'

website/docs/r/compute_region_security_policy.html.markdown

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,11 @@ The following arguments are supported:
160160
Configuration for Google Cloud Armor DDOS Proctection Config.
161161
Structure is [documented below](#nested_ddos_protection_config).
162162

163+
* `advanced_options_config` -
164+
(Optional)
165+
Advanced Options Config of this security policy.
166+
Structure is [documented below](#nested_advanced_options_config).
167+
163168
* `user_defined_fields` -
164169
(Optional)
165170
Definitions of user-defined fields for CLOUD_ARMOR_NETWORK policies.
@@ -192,6 +197,40 @@ The following arguments are supported:
192197
- ADVANCED_PREVIEW: flag to enable the security policy in preview mode.
193198
Possible values are: `ADVANCED`, `ADVANCED_PREVIEW`, `STANDARD`.
194199

200+
<a name="nested_advanced_options_config"></a>The `advanced_options_config` block supports:
201+
202+
* `json_parsing` -
203+
(Optional)
204+
JSON body parsing. Supported values include: "DISABLED", "STANDARD", "STANDARD_WITH_GRAPHQL".
205+
Possible values are: `DISABLED`, `STANDARD`, `STANDARD_WITH_GRAPHQL`.
206+
207+
* `json_custom_config` -
208+
(Optional)
209+
Custom configuration to apply the JSON parsing. Only applicable when JSON parsing is set to STANDARD.
210+
Structure is [documented below](#nested_advanced_options_config_json_custom_config).
211+
212+
* `log_level` -
213+
(Optional)
214+
Logging level. Supported values include: "NORMAL", "VERBOSE".
215+
Possible values are: `NORMAL`, `VERBOSE`.
216+
217+
* `user_ip_request_headers` -
218+
(Optional)
219+
An optional list of case-insensitive request header names to use for resolving the callers client IP address.
220+
221+
* `request_body_inspection_size` -
222+
(Optional, [Beta](https://terraform.io/docs/providers/google/guides/provider_versions.html))
223+
The maximum request size chosen by the customer with Waf enabled. Values supported are "8KB", "16KB, "32KB", "48KB" and "64KB".
224+
Values are case insensitive.
225+
Possible values are: `8KB`, `16KB`, `32KB`, `48KB`, `64KB`.
226+
227+
228+
<a name="nested_advanced_options_config_json_custom_config"></a>The `json_custom_config` block supports:
229+
230+
* `content_types` -
231+
(Required)
232+
A list of custom Content-Type header values to apply the JSON parsing.
233+
195234
<a name="nested_user_defined_fields"></a>The `user_defined_fields` block supports:
196235

197236
* `name` -

0 commit comments

Comments
 (0)