Skip to content

Commit aa7b109

Browse files
authored
feat: add vpc route entry enable (#1043)
1 parent 756ce68 commit aa7b109

File tree

10 files changed

+209
-11
lines changed

10 files changed

+209
-11
lines changed

go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ require (
3131
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/clb v1.0.283
3232
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cloudaudit v1.0.199
3333
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cls v1.0.377
34-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.397
34+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.398
3535
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.385
3636
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.359
3737
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dayu v1.0.335
@@ -57,7 +57,7 @@ require (
5757
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tdmq v1.0.268
5858
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/tke v1.0.381
5959
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.0.199
60-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.392
60+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.398
6161
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wss v1.0.199
6262
github.com/tencentyun/cos-go-sdk-v5 v0.7.33
6363
github.com/yangwenmai/ratelimit v0.0.0-20180104140304-44221c2292e1

go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.392 h1:Uqcm
487487
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.392/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
488488
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.397 h1:oYU+ghWYDEXSpU8aogzPYHiuZAI1291BMroSG0WKdAc=
489489
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.397/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
490+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.398 h1:+VbaPRPCKAplIvwj9oGEOTbZmYiEX9AeqaTCPqLzwS8=
491+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.398/go.mod h1:7sCQWVkxcsR38nffDW057DRGk8mUjK1Ing/EFOK8s8Y=
490492
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.385 h1:8bwloRxRwSADSK48KxaUeO9JHmmgniNGJbA7Or/HUEk=
491493
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cvm v1.0.385/go.mod h1:PMxA0L4o8Fbx/6+ju1cAMAU7x2bV4C6e/LTqVe745yM=
492494
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/cynosdb v1.0.359 h1:cNKqelPgUxrJkLY0Azd2QHr/UMYOPPnmqs88clt2akk=
@@ -542,6 +544,8 @@ github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.0.199 h1:6Yt74l4
542544
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vod v1.0.199/go.mod h1:Yw6OQ33z3s4k0HVYTNSffB12qOzEJ2Zf1Vj4+5S3sRs=
543545
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.392 h1:nx8MQ8yJ3srpfEAlKLQKtOsBCBc30QJ3Q0RsSOGSphQ=
544546
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.392/go.mod h1:IAl660UAxdUtp1rHUwbUwxFCVqwk61xAIRbBk6QtTy8=
547+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.398 h1:1JVKMl+yjZbntwAW0A6esjQI1/dXXqjQ9+OLai7ZS2w=
548+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc v1.0.398/go.mod h1:+TD/TRnb5WrLcE2SL3db7ROOpwED5gBfbC19gaXnGxs=
545549
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wss v1.0.199 h1:hMBLtiJPnZ9GvA677cTB6ELBR6B68wCR2QY1sNoGQc4=
546550
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/wss v1.0.199/go.mod h1:nnY91/H3j/Gu7V/oCA6Zeg8T5D3q36EUdBh4EjmHwqY=
547551
github.com/tencentyun/cos-go-sdk-v5 v0.7.33 h1:5jmJU7U/1nf/7ZPDkrUL8KlF1oDUzTHsdtLNY6x0hq4=

tencentcloud/resource_tc_route_entry.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ func resourceTencentCloudRouteEntryCreate(d *schema.ResourceData, meta interface
147147
return fmt.Errorf("The value of next_type is invalid")
148148
}
149149

150-
_, err := service.CreateRoutes(ctx, routeTableId, destinationCidrBlock, routeTypeNewMap[nextType], nextHub, "")
150+
_, err := service.CreateRoutes(ctx, routeTableId, destinationCidrBlock, routeTypeNewMap[nextType], nextHub, "", true)
151151
if err != nil {
152152
return err
153153
}

tencentcloud/resource_tc_route_table_entry.go

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ import (
5151
"strconv"
5252
"strings"
5353

54+
vpc "github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/vpc/v20170312"
55+
"github.com/tencentcloudstack/terraform-provider-tencentcloud/tencentcloud/internal/helper"
56+
5457
"github.com/hashicorp/terraform-plugin-sdk/helper/resource"
5558
"github.com/hashicorp/terraform-plugin-sdk/helper/schema"
5659
"github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common/errors"
@@ -60,6 +63,7 @@ func resourceTencentCloudVpcRouteEntry() *schema.Resource {
6063
return &schema.Resource{
6164
Create: resourceTencentCloudVpcRouteEntryCreate,
6265
Read: resourceTencentCloudVpcRouteEntryRead,
66+
Update: resourceTencentCloudVpcRouteEntryUpdate,
6367
Delete: resourceTencentCloudVpcRouteEntryDelete,
6468
Importer: &schema.ResourceImporter{
6569
State: schema.ImportStatePassthrough,
@@ -92,6 +96,12 @@ func resourceTencentCloudVpcRouteEntry() *schema.Resource {
9296
ForceNew: true,
9397
Description: "ID of next-hop gateway. Note: when `next_type` is EIP, GatewayId should be `0`.",
9498
},
99+
// Name enabled will lead to exist route table diff fail (null -> false cannot diff).
100+
"disabled": {
101+
Type: schema.TypeBool,
102+
Optional: true,
103+
Description: "Whether the entry is disabled, default is `false`.",
104+
},
95105
"description": {
96106
Type: schema.TypeString,
97107
Optional: true,
@@ -116,6 +126,7 @@ func resourceTencentCloudVpcRouteEntryCreate(d *schema.ResourceData, meta interf
116126
destinationCidrBlock = ""
117127
nextType = ""
118128
nextHub = ""
129+
disabled = false
119130
)
120131

121132
if temp, ok := d.GetOk("description"); ok {
@@ -134,6 +145,10 @@ func resourceTencentCloudVpcRouteEntryCreate(d *schema.ResourceData, meta interf
134145
nextHub = temp.(string)
135146
}
136147

148+
if temp, ok := d.GetOk("disabled"); ok {
149+
disabled = temp.(bool)
150+
}
151+
137152
if routeTableId == "" || destinationCidrBlock == "" || nextType == "" || nextHub == "" {
138153
return fmt.Errorf("some needed fields is empty string")
139154
}
@@ -142,14 +157,25 @@ func resourceTencentCloudVpcRouteEntryCreate(d *schema.ResourceData, meta interf
142157
return fmt.Errorf("if next_type is %s, next_hub can only be \"0\" ", GATE_WAY_TYPE_EIP)
143158
}
144159

145-
entryId, err := service.CreateRoutes(ctx, routeTableId, destinationCidrBlock, nextType, nextHub, description)
160+
// route cannot disable on create
161+
entryId, err := service.CreateRoutes(ctx, routeTableId, destinationCidrBlock, nextType, nextHub, description, true)
146162

147163
if err != nil {
148164
return err
149165
}
150166

151167
d.SetId(fmt.Sprintf("%d.%s", entryId, routeTableId))
152168

169+
if disabled {
170+
request := vpc.NewDisableRoutesRequest()
171+
request.RouteTableId = &routeTableId
172+
request.RouteIds = []*uint64{helper.Int64Uint64(entryId)}
173+
err := service.DisableRoutes(ctx, request)
174+
if err != nil {
175+
return err
176+
}
177+
}
178+
153179
return nil
154180
}
155181

@@ -189,6 +215,8 @@ func resourceTencentCloudVpcRouteEntryRead(d *schema.ResourceData, meta interfac
189215
_ = d.Set("destination_cidr_block", v.destinationCidr)
190216
_ = d.Set("next_type", v.nextType)
191217
_ = d.Set("next_hub", v.nextBub)
218+
219+
_ = d.Set("disabled", !v.enabled)
192220
return nil
193221
}
194222
}
@@ -201,6 +229,33 @@ func resourceTencentCloudVpcRouteEntryRead(d *schema.ResourceData, meta interfac
201229
return nil
202230
}
203231

232+
func resourceTencentCloudVpcRouteEntryUpdate(d *schema.ResourceData, meta interface{}) error {
233+
logId := getLogId(contextNil)
234+
ctx := context.WithValue(context.TODO(), logIdKey, logId)
235+
client := meta.(*TencentCloudClient).apiV3Conn
236+
service := VpcService{client}
237+
238+
items := strings.Split(d.Id(), ".")
239+
if len(items) != 2 {
240+
return fmt.Errorf("entry id be destroyed, we can not get route table id")
241+
}
242+
243+
id := items[0]
244+
routeTableId := items[1]
245+
routeEntryId, err := strconv.ParseUint(id, 10, 64)
246+
if err != nil {
247+
return fmt.Errorf("parse route entry id %s fail: %s", id, routeTableId)
248+
}
249+
250+
if d.HasChange("disabled") {
251+
disabled := d.Get("disabled").(bool)
252+
if err := service.SwitchRouteEnabled(ctx, routeTableId, routeEntryId, !disabled); err != nil {
253+
return err
254+
}
255+
}
256+
return resourceTencentCloudVpcRouteEntryRead(d, meta)
257+
}
258+
204259
func resourceTencentCloudVpcRouteEntryDelete(d *schema.ResourceData, meta interface{}) error {
205260
defer logElapsed("resource.tencentcloud_route_table_entry.delete")()
206261

tencentcloud/resource_tc_route_table_entry_test.go

Lines changed: 76 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package tencentcloud
33
import (
44
"context"
55
"fmt"
6+
"log"
67
"strconv"
78
"strings"
89
"testing"
@@ -16,6 +17,7 @@ func TestAccTencentCloudVpcV3RouteEntryBasic(t *testing.T) {
1617
t.Parallel()
1718
resource.Test(t, resource.TestCase{
1819
PreCheck: func() {
20+
log.Printf("TF: \n%s", testAccVpcRouteEntryConfig)
1921
testAccPreCheck(t)
2022
},
2123
Providers: testAccProviders,
@@ -33,9 +35,22 @@ func TestAccTencentCloudVpcV3RouteEntryBasic(t *testing.T) {
3335
),
3436
},
3537
{
36-
ResourceName: "tencentcloud_route_table_entry.foo",
37-
ImportState: true,
38-
ImportStateVerify: true,
38+
Config: testAccVpcRouteEntryUpdate,
39+
Check: resource.ComposeTestCheckFunc(
40+
resource.TestCheckResourceAttr("tencentcloud_route_table_entry.foo", "disabled", "true"),
41+
),
42+
},
43+
{
44+
Config: testAccVpcRouteEntryUpdate2,
45+
Check: resource.ComposeTestCheckFunc(
46+
resource.TestCheckResourceAttr("tencentcloud_route_table_entry.foo", "disabled", "false"),
47+
),
48+
},
49+
{
50+
ResourceName: "tencentcloud_route_table_entry.foo",
51+
ImportState: true,
52+
ImportStateVerify: true,
53+
ImportStateVerifyIgnore: []string{"enabled"},
3954
},
4055
},
4156
})
@@ -157,3 +172,61 @@ resource "tencentcloud_route_table_entry" "foo" {
157172
description = var.instance_name
158173
}
159174
`
175+
const testAccVpcRouteEntryUpdate = defaultVpcVariable + `
176+
resource "tencentcloud_vpc" "foo" {
177+
name = var.instance_name
178+
cidr_block = var.vpc_cidr
179+
}
180+
181+
resource "tencentcloud_route_table" "foo" {
182+
name = var.instance_name
183+
vpc_id = tencentcloud_vpc.foo.id
184+
}
185+
186+
resource "tencentcloud_subnet" "foo" {
187+
name = var.instance_name
188+
vpc_id = tencentcloud_vpc.foo.id
189+
availability_zone = var.availability_zone
190+
cidr_block = var.subnet_cidr
191+
is_multicast = false
192+
route_table_id = tencentcloud_route_table.foo.id
193+
}
194+
195+
resource "tencentcloud_route_table_entry" "foo" {
196+
route_table_id = tencentcloud_route_table.foo.id
197+
destination_cidr_block = "10.0.0.0/24"
198+
next_type = "EIP"
199+
next_hub = "0"
200+
description = var.instance_name
201+
disabled = true
202+
}
203+
`
204+
const testAccVpcRouteEntryUpdate2 = defaultVpcVariable + `
205+
resource "tencentcloud_vpc" "foo" {
206+
name = var.instance_name
207+
cidr_block = var.vpc_cidr
208+
}
209+
210+
resource "tencentcloud_route_table" "foo" {
211+
name = var.instance_name
212+
vpc_id = tencentcloud_vpc.foo.id
213+
}
214+
215+
resource "tencentcloud_subnet" "foo" {
216+
name = var.instance_name
217+
vpc_id = tencentcloud_vpc.foo.id
218+
availability_zone = var.availability_zone
219+
cidr_block = var.subnet_cidr
220+
is_multicast = false
221+
route_table_id = tencentcloud_route_table.foo.id
222+
}
223+
224+
resource "tencentcloud_route_table_entry" "foo" {
225+
route_table_id = tencentcloud_route_table.foo.id
226+
destination_cidr_block = "10.0.0.0/24"
227+
next_type = "EIP"
228+
next_hub = "0"
229+
description = var.instance_name
230+
disabled = false
231+
}
232+
`

tencentcloud/service_tencentcloud_vpc.go

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ type VpcRouteEntryBasicInfo struct {
6060
nextBub string
6161
description string
6262
entryType string
63+
enabled bool
6364
}
6465

6566
// route table basic information
@@ -812,6 +813,7 @@ getMoreData:
812813
entry.description = *v.RouteDescription
813814
entry.routeEntryId = int64(*v.RouteId)
814815
entry.entryType = *v.RouteType
816+
entry.enabled = *v.Enabled
815817
basicInfo.entryInfos = append(basicInfo.entryInfos, entry)
816818
}
817819
if hasTableMap[basicInfo.routeTableId] {
@@ -985,7 +987,7 @@ func (me *VpcService) DeleteRoutes(ctx context.Context, routeTableId string, ent
985987
}
986988

987989
func (me *VpcService) CreateRoutes(ctx context.Context,
988-
routeTableId, destinationCidrBlock, nextType, nextHub, description string) (entryId int64, errRet error) {
990+
routeTableId, destinationCidrBlock, nextType, nextHub, description string, enabled bool) (entryId int64, errRet error) {
989991

990992
logId := getLogId(ctx)
991993
request := vpc.NewCreateRoutesRequest()
@@ -1006,6 +1008,7 @@ func (me *VpcService) CreateRoutes(ctx context.Context,
10061008
route.RouteDescription = &description
10071009
route.GatewayType = &nextType
10081010
route.GatewayId = &nextHub
1011+
route.Enabled = &enabled
10091012
request.Routes = []*vpc.Route{&route}
10101013
ratelimit.Check(request.GetAction())
10111014
response, err := me.client.UseVpcClient().CreateRoutes(request)
@@ -1051,6 +1054,64 @@ func (me *VpcService) CreateRoutes(ctx context.Context,
10511054
return
10521055
}
10531056

1057+
func (me *VpcService) SwitchRouteEnabled(ctx context.Context, routeTableId string, routeId uint64, enabled bool) error {
1058+
if enabled {
1059+
request := vpc.NewEnableRoutesRequest()
1060+
request.RouteTableId = &routeTableId
1061+
request.RouteIds = []*uint64{&routeId}
1062+
return me.EnableRoutes(ctx, request)
1063+
} else {
1064+
request := vpc.NewDisableRoutesRequest()
1065+
request.RouteTableId = &routeTableId
1066+
request.RouteIds = []*uint64{&routeId}
1067+
return me.DisableRoutes(ctx, request)
1068+
}
1069+
}
1070+
1071+
func (me *VpcService) EnableRoutes(ctx context.Context, request *vpc.EnableRoutesRequest) (errRet error) {
1072+
logId := getLogId(ctx)
1073+
defer func() {
1074+
if errRet != nil {
1075+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
1076+
logId, request.GetAction(), request.ToJsonString(), errRet.Error())
1077+
}
1078+
}()
1079+
1080+
ratelimit.Check(request.GetAction())
1081+
response, err := me.client.UseVpcClient().EnableRoutes(request)
1082+
1083+
if err != nil {
1084+
errRet = err
1085+
return
1086+
}
1087+
1088+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
1089+
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
1090+
1091+
return
1092+
}
1093+
func (me *VpcService) DisableRoutes(ctx context.Context, request *vpc.DisableRoutesRequest) (errRet error) {
1094+
logId := getLogId(ctx)
1095+
defer func() {
1096+
if errRet != nil {
1097+
log.Printf("[CRITAL]%s api[%s] fail, request body [%s], reason[%s]\n",
1098+
logId, request.GetAction(), request.ToJsonString(), errRet.Error())
1099+
}
1100+
}()
1101+
1102+
ratelimit.Check(request.GetAction())
1103+
response, err := me.client.UseVpcClient().DisableRoutes(request)
1104+
1105+
if err != nil {
1106+
errRet = err
1107+
return
1108+
}
1109+
1110+
log.Printf("[DEBUG]%s api[%s] success, request body [%s], response body [%s]\n",
1111+
logId, request.GetAction(), request.ToJsonString(), response.ToJsonString())
1112+
1113+
return
1114+
}
10541115
func (me *VpcService) CreateSecurityGroup(ctx context.Context, name, desc string, projectId *int) (id string, err error) {
10551116
logId := getLogId(ctx)
10561117

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)