@@ -292,6 +292,28 @@ func resourceContainerCluster() *schema.Resource {
292
292
StateFunc : StoreResourceName ,
293
293
},
294
294
295
+ "network_policy" : {
296
+ Type : schema .TypeList ,
297
+ Optional : true ,
298
+ Computed : true ,
299
+ MaxItems : 1 ,
300
+ Elem : & schema.Resource {
301
+ Schema : map [string ]* schema.Schema {
302
+ "enabled" : {
303
+ Type : schema .TypeBool ,
304
+ Optional : true ,
305
+ Default : false ,
306
+ },
307
+ "provider" : {
308
+ Type : schema .TypeString ,
309
+ Default : "PROVIDER_UNSPECIFIED" ,
310
+ Optional : true ,
311
+ ValidateFunc : validation .StringInSlice ([]string {"PROVIDER_UNSPECIFIED" , "CALICO" }, false ),
312
+ },
313
+ },
314
+ },
315
+ },
316
+
295
317
"node_config" : schemaNodeConfig ,
296
318
297
319
"node_pool" : {
@@ -443,6 +465,10 @@ func resourceContainerClusterCreate(d *schema.ResourceData, meta interface{}) er
443
465
cluster .Network = network
444
466
}
445
467
468
+ if v , ok := d .GetOk ("network_policy" ); ok && len (v .([]interface {})) > 0 {
469
+ cluster .NetworkPolicy = expandNetworkPolicy (v )
470
+ }
471
+
446
472
if v , ok := d .GetOk ("subnetwork" ); ok {
447
473
cluster .Subnetwork = v .(string )
448
474
}
@@ -525,6 +551,9 @@ func resourceContainerClusterRead(d *schema.ResourceData, meta interface{}) erro
525
551
}
526
552
527
553
d .Set ("name" , cluster .Name )
554
+
555
+ d .Set ("network_policy" , flattenNetworkPolicy (cluster .NetworkPolicy ))
556
+
528
557
d .Set ("zone" , cluster .Zone )
529
558
530
559
locations := []string {}
@@ -802,6 +831,29 @@ func resourceContainerClusterUpdate(d *schema.ResourceData, meta interface{}) er
802
831
d .SetPartial ("monitoring_service" )
803
832
}
804
833
834
+ if d .HasChange ("network_policy" ) {
835
+ np , _ := d .GetOk ("network_policy" )
836
+
837
+ req := & container.SetNetworkPolicyRequest {
838
+ NetworkPolicy : expandNetworkPolicy (np ),
839
+ }
840
+ op , err := config .clientContainer .Projects .Zones .Clusters .SetNetworkPolicy (
841
+ project , zoneName , clusterName , req ).Do ()
842
+ if err != nil {
843
+ return err
844
+ }
845
+
846
+ // Wait until it's updated
847
+ waitErr := containerOperationWait (config , op , project , zoneName , "updating GKE cluster network policy" , timeoutInMinutes , 2 )
848
+ if waitErr != nil {
849
+ return waitErr
850
+ }
851
+ log .Printf ("[INFO] Network policy for GKE cluster %s has been updated" , d .Id ())
852
+
853
+ d .SetPartial ("network_policy" )
854
+
855
+ }
856
+
805
857
if n , ok := d .GetOk ("node_pool.#" ); ok {
806
858
for i := 0 ; i < n .(int ); i ++ {
807
859
if err := nodePoolUpdate (d , meta , clusterName , fmt .Sprintf ("node_pool.%d." , i ), timeoutInMinutes ); err != nil {
@@ -945,6 +997,31 @@ func expandMasterAuthorizedNetworksConfig(configured interface{}) *container.Mas
945
997
return result
946
998
}
947
999
1000
+ func expandNetworkPolicy (configured interface {}) * container.NetworkPolicy {
1001
+ result := & container.NetworkPolicy {}
1002
+ if configured != nil && len (configured .([]interface {})) > 0 {
1003
+ config := configured .([]interface {})[0 ].(map [string ]interface {})
1004
+ if enabled , ok := config ["enabled" ]; ok && enabled .(bool ) {
1005
+ result .Enabled = true
1006
+ if provider , ok := config ["provider" ]; ok {
1007
+ result .Provider = provider .(string )
1008
+ }
1009
+ }
1010
+ }
1011
+ return result
1012
+ }
1013
+
1014
+ func flattenNetworkPolicy (c * container.NetworkPolicy ) []map [string ]interface {} {
1015
+ result := []map [string ]interface {}{}
1016
+ if c != nil {
1017
+ result = append (result , map [string ]interface {}{
1018
+ "enabled" : c .Enabled ,
1019
+ "provider" : c .Provider ,
1020
+ })
1021
+ }
1022
+ return result
1023
+ }
1024
+
948
1025
func flattenClusterAddonsConfig (c * container.AddonsConfig ) []map [string ]interface {} {
949
1026
result := make (map [string ]interface {})
950
1027
if c .HorizontalPodAutoscaling != nil {
0 commit comments