@@ -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.
19662154func 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