@@ -134,6 +134,12 @@ func ResourceTencentCloudVpnGateway() *schema.Resource {
134134 Optional : true ,
135135 Description : "A list of tags used to associate different resources." ,
136136 },
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+ },
137143 "create_time" : {
138144 Type : schema .TypeString ,
139145 Computed : true ,
@@ -196,6 +202,10 @@ func resourceTencentCloudVpnGatewayCreate(d *schema.ResourceData, meta interface
196202 request .MaxConnection = helper .IntUint64 (v .(int ))
197203 }
198204
205+ if v , ok := d .GetOkExists ("bgp_asn" ); ok {
206+ request .BgpAsn = helper .IntUint64 (v .(int ))
207+ }
208+
199209 var response * vpc.CreateVpnGatewayResponse
200210 err := resource .Retry (tccommon .ReadRetryTimeout , func () * resource.RetryError {
201211 result , e := meta .(tccommon.ProviderMeta ).GetAPIV3Conn ().UseVpcClient ().CreateVpnGateway (request )
@@ -204,17 +214,24 @@ func resourceTencentCloudVpnGatewayCreate(d *schema.ResourceData, meta interface
204214 logId , request .GetAction (), request .ToJsonString (), e .Error ())
205215 return tccommon .RetryError (e )
206216 }
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+
207222 response = result
208223 return nil
209224 })
225+
210226 if err != nil {
211227 log .Printf ("[CRITAL]%s create VPN gateway failed, reason:%s\n " , logId , err .Error ())
212228 return err
213229 }
214230
215- if response .Response .VpnGateway == nil {
231+ if response .Response .VpnGateway . VpnGatewayId == nil {
216232 return fmt .Errorf ("VPN gateway id is nil" )
217233 }
234+
218235 gatewayId := * response .Response .VpnGateway .VpnGatewayId
219236 d .SetId (gatewayId )
220237
@@ -229,14 +246,18 @@ func resourceTencentCloudVpnGatewayCreate(d *schema.ResourceData, meta interface
229246 return tccommon .RetryError (e )
230247 } else {
231248 //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" ))
237252 } 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+ }
239258 }
259+ } else {
260+ return resource .NonRetryableError (fmt .Errorf ("Describe Vpn Gateways failed, Response is nil." ))
240261 }
241262 }
242263 })
@@ -300,6 +321,10 @@ func resourceTencentCloudVpnGatewayRead(d *schema.ResourceData, meta interface{}
300321 _ = d .Set ("zone" , gateway .Zone )
301322 _ = d .Set ("cdc_id" , gateway .CdcId )
302323 _ = d .Set ("max_connection" , gateway .MaxConnection )
324+ if gateway .BgpAsn != nil {
325+ _ = d .Set ("bgp_asn" , gateway .BgpAsn )
326+ }
327+
303328 //tags
304329 tagService := svctag .NewTagService (meta .(tccommon.ProviderMeta ).GetAPIV3Conn ())
305330 region := meta .(tccommon.ProviderMeta ).GetAPIV3Conn ().Region
@@ -386,7 +411,7 @@ func resourceTencentCloudVpnGatewayUpdate(d *schema.ResourceData, meta interface
386411 }
387412 }
388413
389- if d .HasChange ("name" ) || d .HasChange ("charge_type" ) {
414+ if d .HasChange ("name" ) || d .HasChange ("charge_type" ) || d . HasChange ( "bgp_asn" ) {
390415 //check that the charge type change is valid
391416 //only pre-paid --> post-paid is valid
392417 oldInterface , newInterface := d .GetChange ("charge_type" )
@@ -395,6 +420,9 @@ func resourceTencentCloudVpnGatewayUpdate(d *schema.ResourceData, meta interface
395420 request := vpc .NewModifyVpnGatewayAttributeRequest ()
396421 request .VpnGatewayId = & gatewayId
397422 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+ }
398426 if oldChargeType == svcvpc .VPN_CHARGE_TYPE_PREPAID && newChargeType == svcvpc .VPN_CHARGE_TYPE_POSTPAID_BY_HOUR {
399427 request .InstanceChargeType = & newChargeType
400428 } 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
479507 if e != nil {
480508 return tccommon .RetryError (e )
481509 } 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+ }
495525 }
496526 }
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." ))
497533 }
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
502534 }
503535 })
504536 if vpngwErr != nil {
@@ -534,10 +566,14 @@ func resourceTencentCloudVpnGatewayDelete(d *schema.ResourceData, meta interface
534566 logId , tRequest .GetAction (), tRequest .ToJsonString (), e .Error ())
535567 return tccommon .RetryError (e )
536568 } 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+ }
539575 } 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 ." ))
541577 }
542578 }
543579 })
@@ -582,12 +618,16 @@ func resourceTencentCloudVpnGatewayDelete(d *schema.ResourceData, meta interface
582618 return tccommon .RetryError (e )
583619 }
584620 } 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." ))
588630 }
589- //else consider delete fail
590- return resource .RetryableError (fmt .Errorf ("deleting retry" ))
591631 }
592632 })
593633 if err != nil {
0 commit comments