@@ -34,6 +34,7 @@ func ResourceComputeExternalVpnGateway() *schema.Resource {
34
34
return & schema.Resource {
35
35
Create : resourceComputeExternalVpnGatewayCreate ,
36
36
Read : resourceComputeExternalVpnGatewayRead ,
37
+ Update : resourceComputeExternalVpnGatewayUpdate ,
37
38
Delete : resourceComputeExternalVpnGatewayDelete ,
38
39
39
40
Importer : & schema.ResourceImporter {
@@ -42,6 +43,7 @@ func ResourceComputeExternalVpnGateway() *schema.Resource {
42
43
43
44
Timeouts : & schema.ResourceTimeout {
44
45
Create : schema .DefaultTimeout (20 * time .Minute ),
46
+ Update : schema .DefaultTimeout (20 * time .Minute ),
45
47
Delete : schema .DefaultTimeout (20 * time .Minute ),
46
48
},
47
49
@@ -96,7 +98,6 @@ it cannot be an IP address from Google Compute Engine.`,
96
98
"labels" : {
97
99
Type : schema .TypeMap ,
98
100
Optional : true ,
99
- ForceNew : true ,
100
101
Description : `Labels for the external VPN gateway resource.` ,
101
102
Elem : & schema.Schema {Type : schema .TypeString },
102
103
},
@@ -107,6 +108,12 @@ it cannot be an IP address from Google Compute Engine.`,
107
108
ValidateFunc : verify .ValidateEnum ([]string {"FOUR_IPS_REDUNDANCY" , "SINGLE_IP_INTERNALLY_REDUNDANT" , "TWO_IPS_REDUNDANCY" , "" }),
108
109
Description : `Indicates the redundancy type of this external VPN gateway Possible values: ["FOUR_IPS_REDUNDANCY", "SINGLE_IP_INTERNALLY_REDUNDANT", "TWO_IPS_REDUNDANCY"]` ,
109
110
},
111
+ "label_fingerprint" : {
112
+ Type : schema .TypeString ,
113
+ Computed : true ,
114
+ Description : `The fingerprint used for optimistic locking of this resource. Used
115
+ internally during updates.` ,
116
+ },
110
117
"project" : {
111
118
Type : schema .TypeString ,
112
119
Optional : true ,
@@ -142,6 +149,12 @@ func resourceComputeExternalVpnGatewayCreate(d *schema.ResourceData, meta interf
142
149
} else if v , ok := d .GetOkExists ("labels" ); ! tpgresource .IsEmptyValue (reflect .ValueOf (labelsProp )) && (ok || ! reflect .DeepEqual (v , labelsProp )) {
143
150
obj ["labels" ] = labelsProp
144
151
}
152
+ labelFingerprintProp , err := expandComputeExternalVpnGatewayLabelFingerprint (d .Get ("label_fingerprint" ), d , config )
153
+ if err != nil {
154
+ return err
155
+ } else if v , ok := d .GetOkExists ("label_fingerprint" ); ! tpgresource .IsEmptyValue (reflect .ValueOf (labelFingerprintProp )) && (ok || ! reflect .DeepEqual (v , labelFingerprintProp )) {
156
+ obj ["labelFingerprint" ] = labelFingerprintProp
157
+ }
145
158
nameProp , err := expandComputeExternalVpnGatewayName (d .Get ("name" ), d , config )
146
159
if err != nil {
147
160
return err
@@ -261,6 +274,9 @@ func resourceComputeExternalVpnGatewayRead(d *schema.ResourceData, meta interfac
261
274
if err := d .Set ("labels" , flattenComputeExternalVpnGatewayLabels (res ["labels" ], d , config )); err != nil {
262
275
return fmt .Errorf ("Error reading ExternalVpnGateway: %s" , err )
263
276
}
277
+ if err := d .Set ("label_fingerprint" , flattenComputeExternalVpnGatewayLabelFingerprint (res ["labelFingerprint" ], d , config )); err != nil {
278
+ return fmt .Errorf ("Error reading ExternalVpnGateway: %s" , err )
279
+ }
264
280
if err := d .Set ("name" , flattenComputeExternalVpnGatewayName (res ["name" ], d , config )); err != nil {
265
281
return fmt .Errorf ("Error reading ExternalVpnGateway: %s" , err )
266
282
}
@@ -277,6 +293,77 @@ func resourceComputeExternalVpnGatewayRead(d *schema.ResourceData, meta interfac
277
293
return nil
278
294
}
279
295
296
+ func resourceComputeExternalVpnGatewayUpdate (d * schema.ResourceData , meta interface {}) error {
297
+ config := meta .(* transport_tpg.Config )
298
+ userAgent , err := tpgresource .GenerateUserAgentString (d , config .UserAgent )
299
+ if err != nil {
300
+ return err
301
+ }
302
+
303
+ billingProject := ""
304
+
305
+ project , err := tpgresource .GetProject (d , config )
306
+ if err != nil {
307
+ return fmt .Errorf ("Error fetching project for ExternalVpnGateway: %s" , err )
308
+ }
309
+ billingProject = project
310
+
311
+ d .Partial (true )
312
+
313
+ if d .HasChange ("labels" ) || d .HasChange ("label_fingerprint" ) {
314
+ obj := make (map [string ]interface {})
315
+
316
+ labelsProp , err := expandComputeExternalVpnGatewayLabels (d .Get ("labels" ), d , config )
317
+ if err != nil {
318
+ return err
319
+ } else if v , ok := d .GetOkExists ("labels" ); ! tpgresource .IsEmptyValue (reflect .ValueOf (v )) && (ok || ! reflect .DeepEqual (v , labelsProp )) {
320
+ obj ["labels" ] = labelsProp
321
+ }
322
+ labelFingerprintProp , err := expandComputeExternalVpnGatewayLabelFingerprint (d .Get ("label_fingerprint" ), d , config )
323
+ if err != nil {
324
+ return err
325
+ } else if v , ok := d .GetOkExists ("label_fingerprint" ); ! tpgresource .IsEmptyValue (reflect .ValueOf (v )) && (ok || ! reflect .DeepEqual (v , labelFingerprintProp )) {
326
+ obj ["labelFingerprint" ] = labelFingerprintProp
327
+ }
328
+
329
+ url , err := tpgresource .ReplaceVars (d , config , "{{ComputeBasePath}}projects/{{project}}/global/externalVpnGateways/{{name}}/setLabels" )
330
+ if err != nil {
331
+ return err
332
+ }
333
+
334
+ // err == nil indicates that the billing_project value was found
335
+ if bp , err := tpgresource .GetBillingProject (d , config ); err == nil {
336
+ billingProject = bp
337
+ }
338
+
339
+ res , err := transport_tpg .SendRequest (transport_tpg.SendRequestOptions {
340
+ Config : config ,
341
+ Method : "POST" ,
342
+ Project : billingProject ,
343
+ RawURL : url ,
344
+ UserAgent : userAgent ,
345
+ Body : obj ,
346
+ Timeout : d .Timeout (schema .TimeoutUpdate ),
347
+ })
348
+ if err != nil {
349
+ return fmt .Errorf ("Error updating ExternalVpnGateway %q: %s" , d .Id (), err )
350
+ } else {
351
+ log .Printf ("[DEBUG] Finished updating ExternalVpnGateway %q: %#v" , d .Id (), res )
352
+ }
353
+
354
+ err = ComputeOperationWaitTime (
355
+ config , res , project , "Updating ExternalVpnGateway" , userAgent ,
356
+ d .Timeout (schema .TimeoutUpdate ))
357
+ if err != nil {
358
+ return err
359
+ }
360
+ }
361
+
362
+ d .Partial (false )
363
+
364
+ return resourceComputeExternalVpnGatewayRead (d , meta )
365
+ }
366
+
280
367
func resourceComputeExternalVpnGatewayDelete (d * schema.ResourceData , meta interface {}) error {
281
368
config := meta .(* transport_tpg.Config )
282
369
userAgent , err := tpgresource .GenerateUserAgentString (d , config .UserAgent )
@@ -358,6 +445,10 @@ func flattenComputeExternalVpnGatewayLabels(v interface{}, d *schema.ResourceDat
358
445
return v
359
446
}
360
447
448
+ func flattenComputeExternalVpnGatewayLabelFingerprint (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
449
+ return v
450
+ }
451
+
361
452
func flattenComputeExternalVpnGatewayName (v interface {}, d * schema.ResourceData , config * transport_tpg.Config ) interface {} {
362
453
return v
363
454
}
@@ -421,6 +512,10 @@ func expandComputeExternalVpnGatewayLabels(v interface{}, d tpgresource.Terrafor
421
512
return m , nil
422
513
}
423
514
515
+ func expandComputeExternalVpnGatewayLabelFingerprint (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
516
+ return v , nil
517
+ }
518
+
424
519
func expandComputeExternalVpnGatewayName (v interface {}, d tpgresource.TerraformResourceData , config * transport_tpg.Config ) (interface {}, error ) {
425
520
return v , nil
426
521
}
0 commit comments