Skip to content

Commit 7fc2ec6

Browse files
Adds IP Filter feature support to google_storage_bucket resource. (#14002) (#22976)
[upstream:dc332fe982ee6136a18f3e5b0ef4add117328d69] Signed-off-by: Modular Magician <[email protected]>
1 parent 3ddc8d3 commit 7fc2ec6

File tree

3 files changed

+406
-0
lines changed

3 files changed

+406
-0
lines changed

google/services/storage/resource_storage_bucket.go

Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,6 +592,83 @@ func ResourceStorageBucket() *schema.Resource {
592592
Computed: true,
593593
Description: `The time at which the bucket's metadata or IAM policy was last updated, in RFC 3339 format.`,
594594
},
595+
"ip_filter": {
596+
Type: schema.TypeList,
597+
MaxItems: 1,
598+
Optional: true,
599+
Description: `The bucket IP filtering configuration.`,
600+
Elem: &schema.Resource{
601+
Schema: map[string]*schema.Schema{
602+
"mode": {
603+
Type: schema.TypeString,
604+
Required: true,
605+
Description: `The mode of the IP filter. Valid values are 'Enabled' and 'Disabled'.`,
606+
ValidateFunc: validation.StringInSlice([]string{"Enabled", "Disabled"}, false),
607+
},
608+
"public_network_source": {
609+
Type: schema.TypeList,
610+
MaxItems: 1,
611+
Optional: true,
612+
Description: `The public network IP address ranges that can access the bucket and its data.`,
613+
Elem: &schema.Resource{
614+
Schema: map[string]*schema.Schema{
615+
"allowed_ip_cidr_ranges": {
616+
Type: schema.TypeList,
617+
Required: true,
618+
Description: "The list of public IPv4, IPv6 cidr ranges that are allowed to access the bucket.",
619+
Elem: &schema.Schema{
620+
Type: schema.TypeString,
621+
ValidateFunc: validation.IsCIDR,
622+
},
623+
},
624+
},
625+
},
626+
},
627+
"vpc_network_sources": {
628+
Type: schema.TypeList,
629+
Optional: true,
630+
Description: `The list of VPC networks that can access the bucket.`,
631+
Elem: &schema.Resource{
632+
Schema: map[string]*schema.Schema{
633+
"allowed_ip_cidr_ranges": {
634+
Type: schema.TypeList,
635+
Required: true,
636+
Description: "The list of public or private IPv4 and IPv6 CIDR ranges that can access the bucket.",
637+
Elem: &schema.Schema{
638+
Type: schema.TypeString,
639+
ValidateFunc: validation.IsCIDR,
640+
},
641+
},
642+
"network": {
643+
Type: schema.TypeString,
644+
Required: true,
645+
Description: "Name of the network. Format: projects/{PROJECT_ID}/global/networks/{NETWORK_NAME}",
646+
},
647+
},
648+
},
649+
},
650+
},
651+
},
652+
DiffSuppressFunc: func(k, old, new string, d *schema.ResourceData) bool {
653+
if k == "ip_filter.#" {
654+
o, _ := d.GetChange("ip_filter")
655+
l := o.([]interface{})
656+
if len(l) == 0 {
657+
return false
658+
}
659+
660+
if contents, ok := l[0].(map[string]interface{}); !ok {
661+
return false
662+
} else if mode, ok := contents["mode"].(string); ok && mode == "Disabled" {
663+
return true
664+
}
665+
return false
666+
} else if k == "ip_filter.0.mode" {
667+
return old == "Disabled" && new == ""
668+
}
669+
return false
670+
},
671+
},
595672
},
596673
UseJSONNumber: true,
597674
}
@@ -843,6 +920,10 @@ func resourceStorageBucketCreate(d *schema.ResourceData, meta interface{}) error
843920
sb.HierarchicalNamespace = expandBucketHierachicalNamespace(v.([]interface{}))
844921
}
845922

923+
if v, ok := d.GetOk("ip_filter"); ok {
924+
sb.IpFilter = expandBucketIpFilter(v.([]interface{}))
925+
}
926+
846927
var res *storage.Bucket
847928

848929
err = transport_tpg.Retry(transport_tpg.RetryOptions{
@@ -1027,6 +1108,12 @@ func resourceStorageBucketUpdate(d *schema.ResourceData, meta interface{}) error
10271108
}
10281109
}
10291110

1111+
if d.HasChange("ip_filter") {
1112+
if v, ok := d.GetOk("ip_filter"); ok {
1113+
sb.IpFilter = expandBucketIpFilter(v.([]interface{}))
1114+
}
1115+
}
1116+
10301117
res, err := config.NewStorageClient(userAgent).Buckets.Patch(d.Get("name").(string), sb).Do()
10311118
if err != nil {
10321119
return err
@@ -1961,6 +2048,107 @@ func lockRetentionPolicy(bucketsService *storage.BucketsService, bucketName stri
19612048
return nil
19622049
}
19632050

2051+
func flattenBucketIpFilter(ipFilter *storage.BucketIpFilter) []map[string]interface{} {
2052+
ipFilterList := make([]map[string]interface{}, 0, 1)
2053+
2054+
if ipFilter == nil {
2055+
return ipFilterList
2056+
}
2057+
2058+
filterItem := map[string]interface{}{
2059+
"mode": ipFilter.Mode,
2060+
}
2061+
2062+
if publicSrc := flattenBucketIpFilterPublicNetworkSource(ipFilter.PublicNetworkSource); publicSrc != nil {
2063+
filterItem["public_network_source"] = publicSrc
2064+
}
2065+
if vpcSrc := flattenBucketIpFilterVpcNetworkSources(ipFilter.VpcNetworkSources); vpcSrc != nil {
2066+
filterItem["vpc_network_sources"] = vpcSrc
2067+
}
2068+
2069+
return append(ipFilterList, filterItem)
2070+
}
2071+
2072+
func flattenBucketIpFilterPublicNetworkSource(publicNetworkSource *storage.BucketIpFilterPublicNetworkSource) []map[string]interface{} {
2073+
if publicNetworkSource == nil || len(publicNetworkSource.AllowedIpCidrRanges) == 0 {
2074+
return nil
2075+
}
2076+
2077+
return []map[string]interface{}{
2078+
{
2079+
"allowed_ip_cidr_ranges": publicNetworkSource.AllowedIpCidrRanges,
2080+
},
2081+
}
2082+
}
2083+
2084+
func flattenBucketIpFilterVpcNetworkSources(vpnNetworkSource []*storage.BucketIpFilterVpcNetworkSources) []map[string]interface{} {
2085+
if len(vpnNetworkSource) == 0 {
2086+
return nil
2087+
}
2088+
2089+
srcs := make([]map[string]interface{}, 0, len(vpnNetworkSource))
2090+
2091+
for i := range vpnNetworkSource {
2092+
srcs = append(srcs, map[string]interface{}{
2093+
"allowed_ip_cidr_ranges": vpnNetworkSource[i].AllowedIpCidrRanges,
2094+
"network": vpnNetworkSource[i].Network,
2095+
})
2096+
}
2097+
2098+
return srcs
2099+
}
2100+
2101+
func expandBucketIpFilter(v interface{}) *storage.BucketIpFilter {
2102+
ipFilterList := v.([]interface{})
2103+
if len(ipFilterList) == 0 || ipFilterList[0] == nil {
2104+
return nil
2105+
}
2106+
ipFilter := ipFilterList[0].(map[string]interface{})
2107+
return &storage.BucketIpFilter{
2108+
Mode: ipFilter["mode"].(string),
2109+
PublicNetworkSource: expandBucketIpFilterPublicNetworkSource(ipFilter["public_network_source"]),
2110+
VpcNetworkSources: expandBucketIpFilterVpcNetworkSources(ipFilter["vpc_network_sources"]),
2111+
ForceSendFields: []string{"PublicNetworkSource", "VpcNetworkSources"},
2112+
}
2113+
}
2114+
2115+
func expandBucketIpFilterPublicNetworkSource(v interface{}) *storage.BucketIpFilterPublicNetworkSource {
2116+
e := &storage.BucketIpFilterPublicNetworkSource{
2117+
ForceSendFields: []string{"AllowedIpCidrRanges"},
2118+
}
2119+
2120+
publicNetworkSources := v.([]interface{})
2121+
if len(publicNetworkSources) == 0 || publicNetworkSources[0] == nil {
2122+
return e
2123+
}
2124+
publicNetworkSource := publicNetworkSources[0].(map[string]interface{})
2125+
cidrs := publicNetworkSource["allowed_ip_cidr_ranges"].([]interface{})
2126+
if len(cidrs) == 0 {
2127+
return e
2128+
}
2129+
2130+
e.AllowedIpCidrRanges = tpgresource.ConvertStringArr(cidrs)
2131+
return e
2132+
}
2133+
2134+
func expandBucketIpFilterVpcNetworkSources(v interface{}) []*storage.BucketIpFilterVpcNetworkSources {
2135+
vpcNetworkSources := v.([]interface{})
2136+
if len(vpcNetworkSources) == 0 || vpcNetworkSources[0] == nil {
2137+
return nil
2138+
}
2139+
2140+
transformedvpcNetworkSources := make([]*storage.BucketIpFilterVpcNetworkSources, 0, len(vpcNetworkSources))
2141+
for i := range vpcNetworkSources {
2142+
transformedvpcNetworkSource := vpcNetworkSources[i].(map[string]interface{})
2143+
transformedvpcNetworkSources = append(transformedvpcNetworkSources, &storage.BucketIpFilterVpcNetworkSources{
2144+
AllowedIpCidrRanges: tpgresource.ConvertStringArr(transformedvpcNetworkSource["allowed_ip_cidr_ranges"].([]interface{})),
2145+
Network: transformedvpcNetworkSource["network"].(string),
2146+
})
2147+
}
2148+
2149+
return transformedvpcNetworkSources
2150+
}
2151+
19642152
// d.HasChange("lifecycle_rule") always returns true, giving false positives. This function detects changes
19652153
// to the list size or the actions/conditions of rules directly.
19662154
func detectLifecycleChange(d *schema.ResourceData) bool {
@@ -2111,6 +2299,10 @@ func setStorageBucket(d *schema.ResourceData, config *transport_tpg.Config, res
21112299
}
21122300
}
21132301

2302+
if err := d.Set("ip_filter", flattenBucketIpFilter(res.IpFilter)); err != nil {
2303+
return fmt.Errorf("Error setting ip_filter: %s", err)
2304+
}
2305+
21142306
d.SetId(res.Id)
21152307
return nil
21162308
}

0 commit comments

Comments
 (0)