Skip to content

Commit b62fdf7

Browse files
authored
fix(vpc): [121226612] tencentcloud_vpn_gateway support bgp_asn (#3041)
* add * add
1 parent eca3582 commit b62fdf7

File tree

11 files changed

+205
-86
lines changed

11 files changed

+205
-86
lines changed

.changelog/3041.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note:enhancement
2+
resource/tencentcloud_vpn_gateway: support `bgp_asn`
3+
```

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ require (
4646
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.1034
4747
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.1033
4848
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.1046
49-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1066
49+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1068
5050
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.1053
5151
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cwp v1.0.762
5252
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.1058
@@ -96,7 +96,7 @@ require (
9696
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tse v1.0.857
9797
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tsf v1.0.674
9898
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.0.860
99-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.1060
99+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.1068
100100
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1037
101101
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata v1.0.792
102102
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wss v1.0.199

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -941,6 +941,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1065 h1:krc
941941
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1065/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
942942
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1066 h1:D55KWjZcHJrrZC92ObBJBeo+ZGwzdVWTduIqiD2RACo=
943943
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1066/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
944+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1068 h1:mI0xoreGp9GkDJWkdzqgZcPsfoWXciahPAvEcaGSA6g=
945+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1068/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
944946
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993 h1:WlPgXldQCxt7qi5Xrc6j6zTrsXWzN5BcOGs7Irq7fwQ=
945947
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/controlcenter v1.0.993/go.mod h1:Z9U8zNtyuyKhjS0698wqsrG/kLx1TQ5CEixXBwVe7xY=
946948
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/csip v1.0.860 h1:F3esKBIT3HW9+7Gt8cVgf8X06VdGIczpgLBUECzSEzU=
@@ -1067,6 +1069,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.1045 h1:7+rfyx
10671069
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.1045/go.mod h1:yn4I7fSwpiM6ltjqksS1JtZZAHkZ35ywN+kLm6AJPzc=
10681070
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.1060 h1:hPEbNpABdOT1YA2B8aibfSQfxd91Ux2Xz8J7GqNHswE=
10691071
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.1060/go.mod h1:owVatMEAkXaooNfoH99tMFY+AAiSnsf9m+Rb/HY+oc0=
1072+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.1068 h1:oHot9DQppI0bAZmUXZfP6SbYz7m48GBuQpUG2DnHwFU=
1073+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.1068/go.mod h1:eY2rMPyFp9RQKaZAD6EvJda4+X9XljtqxZ5jkM5h7EQ=
10701074
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1037 h1:sgHOHqVFcO266dnoh0KJ0CoxrRglRZYKW78iBh41Giw=
10711075
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/waf v1.0.1037/go.mod h1:QM5m6aZ65kaxaES0D44BNKmemn+9WBf5vr3HDDPrh8U=
10721076
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wedata v1.0.792 h1:NLgKNOIHWa38AmW7dyfI9Jlcp2Kr9VRD94f48pPNmxM=

tencentcloud/services/vpn/resource_tc_vpn_gateway.go

Lines changed: 73 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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 {

tencentcloud/services/vpn/resource_tc_vpn_gateway.md

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,74 +5,94 @@ Provides a resource to create a VPN gateway.
55
Example Usage
66

77
VPC SSL VPN gateway
8+
89
```hcl
9-
resource "tencentcloud_vpn_gateway" "my_cgw" {
10-
name = "test"
10+
resource "tencentcloud_vpn_gateway" "example" {
11+
name = "tf-example"
1112
bandwidth = 5
1213
zone = "ap-guangzhou-3"
1314
type = "SSL"
1415
vpc_id = "vpc-86v957zb"
1516
1617
tags = {
17-
test = "test"
18+
createBy = "terraform"
1819
}
1920
}
2021
```
2122

2223
CCN IPSEC VPN gateway
24+
2325
```hcl
24-
resource "tencentcloud_vpn_gateway" "my_cgw" {
25-
name = "test"
26+
resource "tencentcloud_vpn_gateway" "example" {
27+
name = "tf-example"
2628
bandwidth = 5
2729
zone = "ap-guangzhou-3"
2830
type = "IPSEC"
2931
30-
tags = {
31-
test = "test"
32+
tags = {
33+
createBy = "terraform"
3234
}
3335
}
3436
```
3537

3638
CCN SSL VPN gateway
39+
3740
```hcl
38-
resource "tencentcloud_vpn_gateway" "my_cgw" {
39-
name = "test"
41+
resource "tencentcloud_vpn_gateway" "example" {
42+
name = "tf-example"
4043
bandwidth = 5
4144
zone = "ap-guangzhou-3"
4245
type = "SSL_CCN"
4346
44-
tags = {
45-
test = "test"
47+
tags = {
48+
createBy = "terraform"
49+
}
50+
}
51+
```
52+
53+
CCN VPN gateway
54+
55+
```hcl
56+
resource "tencentcloud_vpn_gateway" "example" {
57+
name = "tf-example"
58+
bandwidth = 200
59+
type = "CCN"
60+
bgp_asn = 9000
61+
62+
tags = {
63+
createBy = "terraform"
4664
}
4765
}
4866
```
4967

5068
POSTPAID_BY_HOUR VPN gateway
69+
5170
```hcl
52-
resource "tencentcloud_vpn_gateway" "my_cgw" {
53-
name = "test"
71+
resource "tencentcloud_vpn_gateway" "example" {
72+
name = "tf-example"
5473
vpc_id = "vpc-dk8zmwuf"
5574
bandwidth = 5
5675
zone = "ap-guangzhou-3"
5776
5877
tags = {
59-
test = "test"
78+
createBy = "terraform"
6079
}
6180
}
6281
```
6382

6483
PREPAID VPN gateway
84+
6585
```hcl
66-
resource "tencentcloud_vpn_gateway" "my_cgw" {
67-
name = "test"
86+
resource "tencentcloud_vpn_gateway" "example" {
87+
name = "tf-example"
6888
vpc_id = "vpc-dk8zmwuf"
6989
bandwidth = 5
7090
zone = "ap-guangzhou-3"
7191
charge_type = "PREPAID"
7292
prepaid_period = 1
7393
7494
tags = {
75-
test = "test"
95+
createBy = "terraform"
7696
}
7797
}
7898
```
@@ -82,5 +102,5 @@ Import
82102
VPN gateway can be imported using the id, e.g.
83103

84104
```
85-
$ terraform import tencentcloud_vpn_gateway.foo vpngw-8ccsnclt
105+
$ terraform import tencentcloud_vpn_gateway.example vpngw-8ccsnclt
86106
```

vendor/github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/http/request.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)