@@ -592,6 +592,83 @@ func ResourceStorageBucket() *schema.Resource {
592
592
Computed : true ,
593
593
Description : `The time at which the bucket's metadata or IAM policy was last updated, in RFC 3339 format.` ,
594
594
},
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
+ },
595
672
},
596
673
UseJSONNumber : true ,
597
674
}
@@ -843,6 +920,10 @@ func resourceStorageBucketCreate(d *schema.ResourceData, meta interface{}) error
843
920
sb .HierarchicalNamespace = expandBucketHierachicalNamespace (v .([]interface {}))
844
921
}
845
922
923
+ if v , ok := d .GetOk ("ip_filter" ); ok {
924
+ sb .IpFilter = expandBucketIpFilter (v .([]interface {}))
925
+ }
926
+
846
927
var res * storage.Bucket
847
928
848
929
err = transport_tpg .Retry (transport_tpg.RetryOptions {
@@ -1027,6 +1108,12 @@ func resourceStorageBucketUpdate(d *schema.ResourceData, meta interface{}) error
1027
1108
}
1028
1109
}
1029
1110
1111
+ if d .HasChange ("ip_filter" ) {
1112
+ if v , ok := d .GetOk ("ip_filter" ); ok {
1113
+ sb .IpFilter = expandBucketIpFilter (v .([]interface {}))
1114
+ }
1115
+ }
1116
+
1030
1117
res , err := config .NewStorageClient (userAgent ).Buckets .Patch (d .Get ("name" ).(string ), sb ).Do ()
1031
1118
if err != nil {
1032
1119
return err
@@ -1961,6 +2048,107 @@ func lockRetentionPolicy(bucketsService *storage.BucketsService, bucketName stri
1961
2048
return nil
1962
2049
}
1963
2050
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
+
1964
2152
// d.HasChange("lifecycle_rule") always returns true, giving false positives. This function detects changes
1965
2153
// to the list size or the actions/conditions of rules directly.
1966
2154
func detectLifecycleChange (d * schema.ResourceData ) bool {
@@ -2111,6 +2299,10 @@ func setStorageBucket(d *schema.ResourceData, config *transport_tpg.Config, res
2111
2299
}
2112
2300
}
2113
2301
2302
+ if err := d .Set ("ip_filter" , flattenBucketIpFilter (res .IpFilter )); err != nil {
2303
+ return fmt .Errorf ("Error setting ip_filter: %s" , err )
2304
+ }
2305
+
2114
2306
d .SetId (res .Id )
2115
2307
return nil
2116
2308
}
0 commit comments