@@ -134,6 +134,12 @@ func ResourceTencentCloudVpnGateway() *schema.Resource {
134
134
Optional : true ,
135
135
Description : "A list of tags used to associate different resources." ,
136
136
},
137
+ "bgp_asn" : {
138
+ Type : schema .TypeInt ,
139
+ Optional : true ,
140
+ Computed : true ,
141
+ Description : "BGP ASN. Value range: 1 - 4294967295. Using BGP requires configuring ASN." ,
142
+ },
137
143
"create_time" : {
138
144
Type : schema .TypeString ,
139
145
Computed : true ,
@@ -196,6 +202,10 @@ func resourceTencentCloudVpnGatewayCreate(d *schema.ResourceData, meta interface
196
202
request .MaxConnection = helper .IntUint64 (v .(int ))
197
203
}
198
204
205
+ if v , ok := d .GetOkExists ("bgp_asn" ); ok {
206
+ request .BgpAsn = helper .IntUint64 (v .(int ))
207
+ }
208
+
199
209
var response * vpc.CreateVpnGatewayResponse
200
210
err := resource .Retry (tccommon .ReadRetryTimeout , func () * resource.RetryError {
201
211
result , e := meta .(tccommon.ProviderMeta ).GetAPIV3Conn ().UseVpcClient ().CreateVpnGateway (request )
@@ -204,17 +214,24 @@ func resourceTencentCloudVpnGatewayCreate(d *schema.ResourceData, meta interface
204
214
logId , request .GetAction (), request .ToJsonString (), e .Error ())
205
215
return tccommon .RetryError (e )
206
216
}
217
+
218
+ if result == nil || result .Response == nil || result .Response .VpnGateway == nil {
219
+ return resource .NonRetryableError (fmt .Errorf ("create VPN gateway failed, Response is nil." ))
220
+ }
221
+
207
222
response = result
208
223
return nil
209
224
})
225
+
210
226
if err != nil {
211
227
log .Printf ("[CRITAL]%s create VPN gateway failed, reason:%s\n " , logId , err .Error ())
212
228
return err
213
229
}
214
230
215
- if response .Response .VpnGateway == nil {
231
+ if response .Response .VpnGateway . VpnGatewayId == nil {
216
232
return fmt .Errorf ("VPN gateway id is nil" )
217
233
}
234
+
218
235
gatewayId := * response .Response .VpnGateway .VpnGatewayId
219
236
d .SetId (gatewayId )
220
237
@@ -229,14 +246,18 @@ func resourceTencentCloudVpnGatewayCreate(d *schema.ResourceData, meta interface
229
246
return tccommon .RetryError (e )
230
247
} else {
231
248
//if not, quit
232
- if len (result .Response .VpnGatewaySet ) != 1 {
233
- return resource .NonRetryableError (fmt .Errorf ("creating error" ))
234
- } else {
235
- if * result .Response .VpnGatewaySet [0 ].State == svcvpc .VPN_STATE_AVAILABLE {
236
- return nil
249
+ if result != nil && result .Response != nil && result .Response .VpnGatewaySet != nil {
250
+ if len (result .Response .VpnGatewaySet ) != 1 {
251
+ return resource .NonRetryableError (fmt .Errorf ("creating error" ))
237
252
} else {
238
- return resource .RetryableError (fmt .Errorf ("State is not available: %s, wait for state to be AVAILABLE." , * result .Response .VpnGatewaySet [0 ].State ))
253
+ if * result .Response .VpnGatewaySet [0 ].State == svcvpc .VPN_STATE_AVAILABLE {
254
+ return nil
255
+ } else {
256
+ return resource .RetryableError (fmt .Errorf ("State is not available: %s, wait for state to be AVAILABLE." , * result .Response .VpnGatewaySet [0 ].State ))
257
+ }
239
258
}
259
+ } else {
260
+ return resource .NonRetryableError (fmt .Errorf ("Describe Vpn Gateways failed, Response is nil." ))
240
261
}
241
262
}
242
263
})
@@ -300,6 +321,10 @@ func resourceTencentCloudVpnGatewayRead(d *schema.ResourceData, meta interface{}
300
321
_ = d .Set ("zone" , gateway .Zone )
301
322
_ = d .Set ("cdc_id" , gateway .CdcId )
302
323
_ = d .Set ("max_connection" , gateway .MaxConnection )
324
+ if gateway .BgpAsn != nil {
325
+ _ = d .Set ("bgp_asn" , gateway .BgpAsn )
326
+ }
327
+
303
328
//tags
304
329
tagService := svctag .NewTagService (meta .(tccommon.ProviderMeta ).GetAPIV3Conn ())
305
330
region := meta .(tccommon.ProviderMeta ).GetAPIV3Conn ().Region
@@ -386,7 +411,7 @@ func resourceTencentCloudVpnGatewayUpdate(d *schema.ResourceData, meta interface
386
411
}
387
412
}
388
413
389
- if d .HasChange ("name" ) || d .HasChange ("charge_type" ) {
414
+ if d .HasChange ("name" ) || d .HasChange ("charge_type" ) || d . HasChange ( "bgp_asn" ) {
390
415
//check that the charge type change is valid
391
416
//only pre-paid --> post-paid is valid
392
417
oldInterface , newInterface := d .GetChange ("charge_type" )
@@ -395,6 +420,9 @@ func resourceTencentCloudVpnGatewayUpdate(d *schema.ResourceData, meta interface
395
420
request := vpc .NewModifyVpnGatewayAttributeRequest ()
396
421
request .VpnGatewayId = & gatewayId
397
422
request .VpnGatewayName = helper .String (d .Get ("name" ).(string ))
423
+ if v , ok := d .GetOkExists ("bgp_asn" ); ok {
424
+ request .BgpAsn = helper .IntUint64 (v .(int ))
425
+ }
398
426
if oldChargeType == svcvpc .VPN_CHARGE_TYPE_PREPAID && newChargeType == svcvpc .VPN_CHARGE_TYPE_POSTPAID_BY_HOUR {
399
427
request .InstanceChargeType = & newChargeType
400
428
} else if oldChargeType == svcvpc .VPN_CHARGE_TYPE_POSTPAID_BY_HOUR && newChargeType == svcvpc .VPN_CHARGE_TYPE_PREPAID {
@@ -479,26 +507,30 @@ func resourceTencentCloudVpnGatewayDelete(d *schema.ResourceData, meta interface
479
507
if e != nil {
480
508
return tccommon .RetryError (e )
481
509
} else {
482
- //if deleted, quit
483
- if len (result .Response .VpnGatewaySet ) == 0 {
484
- return nil
485
- }
486
- if result .Response .VpnGatewaySet [0 ].ExpiredTime != nil && * result .Response .VpnGatewaySet [0 ].InstanceChargeType == svcvpc .VPN_CHARGE_TYPE_PREPAID {
487
- expiredTime := * result .Response .VpnGatewaySet [0 ].ExpiredTime
488
- if expiredTime != "0000-00-00 00:00:00" {
489
- t , err := time .Parse ("2006-01-02 15:04:05" , expiredTime )
490
- if err != nil {
491
- return resource .NonRetryableError (fmt .Errorf ("Error format expired time.%x %s" , expiredTime , err ))
492
- }
493
- if time .Until (t ) > 0 {
494
- return resource .NonRetryableError (fmt .Errorf ("Delete operation is unsupport when VPN gateway is not expired." ))
510
+ if result != nil && result .Response != nil && result .Response .VpnGatewaySet != nil {
511
+ //if deleted, quit
512
+ if len (result .Response .VpnGatewaySet ) == 0 {
513
+ return nil
514
+ }
515
+ if result .Response .VpnGatewaySet [0 ].ExpiredTime != nil && * result .Response .VpnGatewaySet [0 ].InstanceChargeType == svcvpc .VPN_CHARGE_TYPE_PREPAID {
516
+ expiredTime := * result .Response .VpnGatewaySet [0 ].ExpiredTime
517
+ if expiredTime != "0000-00-00 00:00:00" {
518
+ t , err := time .Parse ("2006-01-02 15:04:05" , expiredTime )
519
+ if err != nil {
520
+ return resource .NonRetryableError (fmt .Errorf ("Error format expired time.%x %s" , expiredTime , err ))
521
+ }
522
+ if time .Until (t ) > 0 {
523
+ return resource .NonRetryableError (fmt .Errorf ("Delete operation is unsupport when VPN gateway is not expired." ))
524
+ }
495
525
}
496
526
}
527
+ if * result .Response .VpnGatewaySet [0 ].Type == svcvpc .GATE_WAY_TYPE_CCN && * result .Response .VpnGatewaySet [0 ].NetworkInstanceId != "" {
528
+ return resource .NonRetryableError (fmt .Errorf ("Delete operation is unsupported when VPN gateway is attached to CCN instance." ))
529
+ }
530
+ return nil
531
+ } else {
532
+ return resource .NonRetryableError (fmt .Errorf ("Describe Vpn Gateways failed, Response is nil." ))
497
533
}
498
- if * result .Response .VpnGatewaySet [0 ].Type == svcvpc .GATE_WAY_TYPE_CCN && * result .Response .VpnGatewaySet [0 ].NetworkInstanceId != "" {
499
- return resource .NonRetryableError (fmt .Errorf ("Delete operation is unsupported when VPN gateway is attached to CCN instance." ))
500
- }
501
- return nil
502
534
}
503
535
})
504
536
if vpngwErr != nil {
@@ -534,10 +566,14 @@ func resourceTencentCloudVpnGatewayDelete(d *schema.ResourceData, meta interface
534
566
logId , tRequest .GetAction (), tRequest .ToJsonString (), e .Error ())
535
567
return tccommon .RetryError (e )
536
568
} else {
537
- if len (result .Response .VpnConnectionSet ) == 0 {
538
- return nil
569
+ if result != nil && result .Response != nil && result .Response .VpnConnectionSet != nil {
570
+ if len (result .Response .VpnConnectionSet ) == 0 {
571
+ return nil
572
+ } else {
573
+ return resource .NonRetryableError (fmt .Errorf ("There is associated tunnel exists, please delete associated tunnels first." ))
574
+ }
539
575
} else {
540
- return resource .NonRetryableError (fmt .Errorf ("There is associated tunnel exists, please delete associated tunnels first ." ))
576
+ return resource .NonRetryableError (fmt .Errorf ("Describe Vpn Connections failed, Response is nil ." ))
541
577
}
542
578
}
543
579
})
@@ -582,12 +618,16 @@ func resourceTencentCloudVpnGatewayDelete(d *schema.ResourceData, meta interface
582
618
return tccommon .RetryError (e )
583
619
}
584
620
} else {
585
- //if not, quit
586
- if len (result .Response .VpnGatewaySet ) == 0 {
587
- return nil
621
+ if result != nil && result .Response != nil && result .Response .VpnGatewaySet != nil {
622
+ //if not, quit
623
+ if len (result .Response .VpnGatewaySet ) == 0 {
624
+ return nil
625
+ }
626
+ //else consider delete fail
627
+ return resource .RetryableError (fmt .Errorf ("deleting retry" ))
628
+ } else {
629
+ return resource .NonRetryableError (fmt .Errorf ("Describe Vpn Gateways failed, Response is nil." ))
588
630
}
589
- //else consider delete fail
590
- return resource .RetryableError (fmt .Errorf ("deleting retry" ))
591
631
}
592
632
})
593
633
if err != nil {
0 commit comments