@@ -185,7 +185,6 @@ func ResourceNetworkServicesGateway() *schema.Resource {
185
185
"ports" : {
186
186
Type : schema .TypeList ,
187
187
Required : true ,
188
- ForceNew : true ,
189
188
Description : `One or more port numbers (1-65535), on which the Gateway will receive traffic.
190
189
The proxy binds to the specified ports. Gateways of type 'SECURE_WEB_GATEWAY' are
191
190
limited to 1 port. Gateways of type 'OPEN_MESH' listen on 0.0.0.0 and support multiple ports.` ,
@@ -594,6 +593,12 @@ func resourceNetworkServicesGatewayUpdate(d *schema.ResourceData, meta interface
594
593
} else if v , ok := d .GetOkExists ("description" ); ! tpgresource .IsEmptyValue (reflect .ValueOf (v )) && (ok || ! reflect .DeepEqual (v , descriptionProp )) {
595
594
obj ["description" ] = descriptionProp
596
595
}
596
+ portsProp , err := expandNetworkServicesGatewayPorts (d .Get ("ports" ), d , config )
597
+ if err != nil {
598
+ return err
599
+ } else if v , ok := d .GetOkExists ("ports" ); ! tpgresource .IsEmptyValue (reflect .ValueOf (v )) && (ok || ! reflect .DeepEqual (v , portsProp )) {
600
+ obj ["ports" ] = portsProp
601
+ }
597
602
serverTlsPolicyProp , err := expandNetworkServicesGatewayServerTlsPolicy (d .Get ("server_tls_policy" ), d , config )
598
603
if err != nil {
599
604
return err
@@ -625,6 +630,11 @@ func resourceNetworkServicesGatewayUpdate(d *schema.ResourceData, meta interface
625
630
obj ["labels" ] = labelsProp
626
631
}
627
632
633
+ obj , err = resourceNetworkServicesGatewayUpdateEncoder (d , meta , obj )
634
+ if err != nil {
635
+ return err
636
+ }
637
+
628
638
url , err := tpgresource .ReplaceVars (d , config , "{{NetworkServicesBasePath}}projects/{{project}}/locations/{{location}}/gateways/{{name}}" )
629
639
if err != nil {
630
640
return err
@@ -638,6 +648,10 @@ func resourceNetworkServicesGatewayUpdate(d *schema.ResourceData, meta interface
638
648
updateMask = append (updateMask , "description" )
639
649
}
640
650
651
+ if d .HasChange ("ports" ) {
652
+ updateMask = append (updateMask , "ports" )
653
+ }
654
+
641
655
if d .HasChange ("server_tls_policy" ) {
642
656
updateMask = append (updateMask , "serverTlsPolicy" )
643
657
}
@@ -663,11 +677,6 @@ func resourceNetworkServicesGatewayUpdate(d *schema.ResourceData, meta interface
663
677
if err != nil {
664
678
return err
665
679
}
666
- if d .Get ("type" ) == "SECURE_WEB_GATEWAY" {
667
- obj ["name" ] = d .Get ("name" )
668
- obj ["type" ] = d .Get ("type" )
669
- obj ["routingMode" ] = d .Get ("routingMode" )
670
- }
671
680
672
681
// err == nil indicates that the billing_project value was found
673
682
if bp , err := tpgresource .GetBillingProject (d , config ); err == nil {
@@ -945,3 +954,14 @@ func expandNetworkServicesGatewayEffectiveLabels(v interface{}, d tpgresource.Te
945
954
}
946
955
return m , nil
947
956
}
957
+
958
+ func resourceNetworkServicesGatewayUpdateEncoder (d * schema.ResourceData , meta interface {}, obj map [string ]interface {}) (map [string ]interface {}, error ) {
959
+ // Always force-send some attributes even if they were not modified. This works around extra API-side requirements.
960
+ obj ["scope" ] = d .Get ("scope" )
961
+ if d .Get ("type" ) == "SECURE_WEB_GATEWAY" {
962
+ obj ["name" ] = d .Get ("name" )
963
+ obj ["type" ] = d .Get ("type" )
964
+ obj ["routingMode" ] = d .Get ("routingMode" )
965
+ }
966
+ return obj , nil
967
+ }
0 commit comments