Skip to content

Commit 8cbf2b9

Browse files
authored
Feat/clb attach eip (#1139)
* feat: clb target - support bind eni ip * WIP: finish one eni_ip bind * fix: clb attach - target.Type check * fix: clb attach data - merge into same vpc * fix: clb target group data testcase * fix: clb listener health_check_port testcase * fix: clb sync doc of typings
1 parent 336afbd commit 8cbf2b9

11 files changed

+122
-49
lines changed

tencentcloud/basic_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,7 @@ data "tencentcloud_instances" "instance" {
425425
locals {
426426
cvm_id = data.tencentcloud_instances.instance.instance_list.0.instance_id
427427
cvm_az = "` + defaultAZone + `"
428+
cvm_private_ip = data.tencentcloud_instances.instance.instance_list.0.private_ip
428429
}
429430
`
430431

tencentcloud/data_source_tc_clb_attachments_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ const testAccTencentCloudDataSourceClbServerAttachments = instanceCommonTestCase
3232
resource "tencentcloud_clb_instance" "foo" {
3333
network_type = "OPEN"
3434
clb_name = var.instance_name
35-
vpc_id = var.vpc_id
35+
vpc_id = var.cvm_vpc_id
3636
}
3737
3838
resource "tencentcloud_clb_listener" "foo" {

tencentcloud/data_source_tc_clb_target_groups_test.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ const (
1212
targetGroupResource = "tencentcloud_clb_target_group.test"
1313
)
1414

15-
func TestAccTencentCloudDataSourceClbTargetGroup(t *testing.T) {
15+
func TestAccTencentCloudClbTargetGroupDataSource(t *testing.T) {
1616
t.Parallel()
1717
resource.Test(t, resource.TestCase{
1818
PreCheck: func() { testAccPreCheck(t) },
@@ -53,10 +53,11 @@ func TestAccTencentCloudDataSourceClbTargetGroup(t *testing.T) {
5353
})
5454
}
5555

56-
const tareGetGroupBase = `
56+
const tareGetGroupBase = defaultVpcSubnets + `
5757
resource "tencentcloud_clb_instance" "clb_basic" {
5858
network_type = "OPEN"
5959
clb_name = "tf-clb-rule-basic"
60+
vpc_id = local.vpc_id
6061
}
6162
6263
resource "tencentcloud_clb_listener" "listener_basic" {
@@ -78,13 +79,14 @@ resource "tencentcloud_clb_listener_rule" "rule_basic" {
7879
7980
resource "tencentcloud_clb_target_group" "test"{
8081
target_group_name = "test-target-keep-1"
82+
vpc_id = local.vpc_id
8183
}
8284
8385
resource "tencentcloud_clb_target_group_attachment" "group" {
8486
clb_id = tencentcloud_clb_instance.clb_basic.id
8587
listener_id = tencentcloud_clb_listener.listener_basic.listener_id
8688
rule_id = tencentcloud_clb_listener_rule.rule_basic.rule_id
87-
targrt_group_id = tencentcloud_clb_target_group.test.id
89+
target_group_id = tencentcloud_clb_target_group.test.id
8890
}
8991
`
9092

tencentcloud/resource_tc_alb_server_attachment.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ func resourceTencentCloudAlbServerAttachmentCreate(d *schema.ResourceData, meta
132132

133133
for _, inst_ := range d.Get("backends").(*schema.Set).List() {
134134
inst := inst_.(map[string]interface{})
135-
request.Targets = append(request.Targets, clbNewTarget(inst["instance_id"], inst["port"], inst["weight"]))
135+
request.Targets = append(request.Targets, clbNewTarget(inst["instance_id"], inst["eni_ip"], inst["port"], inst["weight"]))
136136
}
137137

138138
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
@@ -277,7 +277,7 @@ func resourceTencentCloudAlbServerAttachementRemove(d *schema.ResourceData, meta
277277
}
278278
for _, inst_ := range remove {
279279
inst := inst_.(map[string]interface{})
280-
request.Targets = append(request.Targets, clbNewTarget(inst["instance_id"], inst["port"], inst["weight"]))
280+
request.Targets = append(request.Targets, clbNewTarget(inst["instance_id"], inst["eni_ip"], inst["port"], inst["weight"]))
281281
}
282282

283283
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
@@ -325,7 +325,7 @@ func resourceTencentCloudAlbServerAttachementAdd(d *schema.ResourceData, meta in
325325

326326
for _, inst_ := range add {
327327
inst := inst_.(map[string]interface{})
328-
request.Targets = append(request.Targets, clbNewTarget(inst["instance_id"], inst["port"], inst["weight"]))
328+
request.Targets = append(request.Targets, clbNewTarget(inst["instance_id"], inst["eni_ip"], inst["port"], inst["weight"]))
329329
}
330330
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
331331
requestId := ""

tencentcloud/resource_tc_alb_server_attachment_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
)
1313

1414
func TestAccTencentCloudAlbServerAttachmentTcp(t *testing.T) {
15-
t.Parallel()
15+
t.Skipf("Deprecated resource TestAccTencentCloudAlbServerAttachmentTcp, skip testing")
1616
resource.Test(t, resource.TestCase{
1717
PreCheck: func() { testAccPreCheck(t) },
1818
Providers: testAccProviders,
@@ -42,7 +42,7 @@ func TestAccTencentCloudAlbServerAttachmentTcp(t *testing.T) {
4242
}
4343

4444
func TestAccTencentCloudAlbServerAttachmentHttp(t *testing.T) {
45-
t.Parallel()
45+
t.Skipf("Deprecated resource TestAccTencentCloudAlbServerAttachmentTcp, skip testing")
4646
resource.Test(t, resource.TestCase{
4747
PreCheck: func() { testAccPreCheck(t) },
4848
Providers: testAccProviders,

tencentcloud/resource_tc_clb_attachment.go

Lines changed: 77 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,13 @@ func resourceTencentCloudClbServerAttachment() *schema.Resource {
8585
Schema: map[string]*schema.Schema{
8686
"instance_id": {
8787
Type: schema.TypeString,
88-
Required: true,
89-
Description: "Id of the backend server.",
88+
Optional: true,
89+
Description: "CVM Instance Id of the backend server, conflict with `eni_ip` but must specify one of them.",
90+
},
91+
"eni_ip": {
92+
Type: schema.TypeString,
93+
Optional: true,
94+
Description: "Eni IP address of the backend server, conflict with `instance_id` but must specify one of them.",
9095
},
9196
"port": {
9297
Type: schema.TypeInt,
@@ -147,7 +152,7 @@ func resourceTencentCloudClbServerAttachmentCreate(d *schema.ResourceData, meta
147152
break
148153
}
149154
inst := insList[index].(map[string]interface{})
150-
request.Targets = append(request.Targets, clbNewTarget(inst["instance_id"], inst["port"], inst["weight"]))
155+
request.Targets = append(request.Targets, clbNewTarget(inst["instance_id"], inst["eni_ip"], inst["port"], inst["weight"]))
151156
}
152157

153158
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
@@ -220,7 +225,7 @@ func resourceTencentCloudClbServerAttachmentDelete(d *schema.ResourceData, meta
220225
break
221226
}
222227
inst := insList[index].(map[string]interface{})
223-
request.Targets = append(request.Targets, clbNewTarget(inst["instance_id"], inst["port"], inst["weight"]))
228+
request.Targets = append(request.Targets, clbNewTarget(inst["instance_id"], inst["eni_ip"], inst["port"], inst["weight"]))
224229
}
225230

226231
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
@@ -318,9 +323,9 @@ func resourceTencentCloudClbServerAttachmentAdd(d *schema.ResourceData, meta int
318323
}
319324
}
320325

321-
for _, inst_ := range add {
322-
inst := inst_.(map[string]interface{})
323-
request.Targets = append(request.Targets, clbNewTarget(inst["instance_id"], inst["port"], inst["weight"]))
326+
for _, v := range add {
327+
inst := v.(map[string]interface{})
328+
request.Targets = append(request.Targets, clbNewTarget(inst["instance_id"], inst["eni_ip"], inst["port"], inst["weight"]))
324329
}
325330
err := resource.Retry(writeRetryTimeout, func() *resource.RetryError {
326331
requestId := ""
@@ -432,21 +437,44 @@ func resourceTencentCloudClbServerAttachmentRead(d *schema.ResourceData, meta in
432437
//this may cause problems when there are members in two dimensions array
433438
//need to read state of the tfstate file to clear the relationships
434439
//in this situation, import action is not supported
440+
// TL,DR: just update partial targets which this resource declared.
435441
stateTargets := d.Get("targets").(*schema.Set)
436442
if stateTargets.Len() != 0 {
437443
//the old state exist
438444
//create a new attachment with state
439-
exactTargets := make([]*clb.Backend, 0)
440-
for _, v := range onlineTargets {
441-
if stateTargets.Contains(map[string]interface{}{
442-
"weight": int(*v.Weight),
443-
"port": int(*v.Port),
444-
"instance_id": *v.InstanceId,
445-
}) {
446-
exactTargets = append(exactTargets, v)
445+
exactTargets := make([]interface{}, 0)
446+
for i := range onlineTargets {
447+
v := onlineTargets[i]
448+
if *v.Type == "CVM" && v.InstanceId != nil {
449+
target := map[string]interface{}{
450+
"weight": int(*v.Weight),
451+
"port": int(*v.Port),
452+
"instance_id": *v.InstanceId,
453+
}
454+
if stateTargets.Contains(target) {
455+
exactTargets = append(exactTargets, map[string]interface{}{
456+
"weight": int(*v.Weight),
457+
"port": int(*v.Port),
458+
"instance_id": *v.InstanceId,
459+
})
460+
}
461+
462+
} else if len(v.PrivateIpAddresses) > 0 && *v.PrivateIpAddresses[0] != "" {
463+
target := map[string]interface{}{
464+
"weight": int(*v.Weight),
465+
"port": int(*v.Port),
466+
"eni_ip": *v.PrivateIpAddresses[0],
467+
}
468+
if stateTargets.Contains(target) {
469+
exactTargets = append(exactTargets, map[string]interface{}{
470+
"weight": int(*v.Weight),
471+
"port": int(*v.Port),
472+
"eni_ip": *v.PrivateIpAddresses[0],
473+
})
474+
}
447475
}
448476
}
449-
_ = d.Set("targets", flattenBackendList(exactTargets))
477+
_ = d.Set("targets", exactTargets)
450478
} else {
451479
_ = d.Set("targets", flattenBackendList(onlineTargets))
452480
}
@@ -466,22 +494,50 @@ func getRemoveCandidates(ctx context.Context, clbService ClbService, clbId strin
466494

467495
for _, item := range remove {
468496
target := item.(map[string]interface{})
469-
if targetGroupContainsInstance(existTargetGroups, target["instance_id"].(string)) {
497+
if targetGroupContainsInstance(existTargetGroups, target["instance_id"]) || targetGroupContainsEni(existTargetGroups, target["eni_ip"]) {
470498
removeCandidates = append(removeCandidates, target)
471499
}
472500
}
473501

474502
return removeCandidates
475503
}
476504

477-
func targetGroupContainsInstance(targets []*clb.Backend, instanceId string) (contains bool) {
505+
func targetGroupContainsInstance(targets []*clb.Backend, instanceId interface{}) (contains bool) {
478506
contains = false
507+
id, ok := instanceId.(string)
508+
if !ok || id == "" {
509+
return
510+
}
479511
for _, target := range targets {
480-
if instanceId == *target.InstanceId {
481-
log.Printf("[WARN] Instance %s applied.", instanceId)
512+
if target.InstanceId == nil {
513+
continue
514+
}
515+
if id == *target.InstanceId {
516+
log.Printf("[WARN] Instance %s applied.", id)
482517
return true
483518
}
484519
}
485-
log.Printf("[WARN] Instance %s not exist, skip deregister.", instanceId)
520+
log.Printf("[WARN] Instance %s not exist, skip deregister.", id)
521+
522+
return
523+
}
524+
525+
func targetGroupContainsEni(targets []*clb.Backend, eniIp interface{}) (contains bool) {
526+
contains = false
527+
ip, ok := eniIp.(string)
528+
if !ok || ip == "" {
529+
return
530+
}
531+
for _, target := range targets {
532+
if len(target.PrivateIpAddresses) > 0 && target.PrivateIpAddresses[0] != nil {
533+
continue
534+
}
535+
if ip == *target.PrivateIpAddresses[0] {
536+
log.Printf("[WARN] IP %s applied.", ip)
537+
return true
538+
}
539+
}
540+
log.Printf("[WARN] IP %s not exist, skip deregister.", ip)
541+
486542
return
487543
}

tencentcloud/resource_tc_clb_attachment_test.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,7 @@ resource "tencentcloud_clb_attachment" "foo" {
199199
}
200200
`
201201

202-
const testAccClbServerAttachment_tcp_update = instanceCommonTestCase + `
202+
const testAccClbServerAttachment_tcp_update = instanceCommonTestCase + presetCVM + `
203203
data "tencentcloud_ssl_certificates" "foo" {
204204
name = "keep"
205205
}
@@ -208,6 +208,7 @@ resource "tencentcloud_clb_instance" "foo" {
208208
network_type = "OPEN"
209209
clb_name = "tf-clb-attach-tcp-test"
210210
vpc_id = var.cvm_vpc_id
211+
snat_pro = true
211212
}
212213
213214
resource "tencentcloud_clb_listener" "foo" {
@@ -229,14 +230,14 @@ resource "tencentcloud_clb_attachment" "foo" {
229230
listener_id = tencentcloud_clb_listener.foo.listener_id
230231
231232
targets {
232-
instance_id = tencentcloud_instance.default.id
233+
eni_ip = local.cvm_private_ip
233234
port = 23
234235
weight = 50
235236
}
236237
}
237238
`
238239

239-
const testAccClbServerAttachment_tcp_update_ssl = instanceCommonTestCase + `
240+
const testAccClbServerAttachment_tcp_update_ssl = instanceCommonTestCase + presetCVM + `
240241
data "tencentcloud_ssl_certificates" "foo" {
241242
name = "keep"
242243
}
@@ -245,6 +246,7 @@ resource "tencentcloud_clb_instance" "foo" {
245246
network_type = "OPEN"
246247
clb_name = "tf-clb-attach-tcp-ssl"
247248
vpc_id = var.cvm_vpc_id
249+
snat_pro = true
248250
}
249251
250252
# This is will force new as expected
@@ -263,15 +265,16 @@ resource "tencentcloud_clb_attachment" "foo" {
263265
clb_id = tencentcloud_clb_instance.foo.id
264266
listener_id = tencentcloud_clb_listener.foo.listener_id
265267
268+
# cross network target
266269
targets {
267-
instance_id = tencentcloud_instance.default.id
270+
eni_ip = local.cvm_private_ip
268271
port = 23
269272
weight = 50
270273
}
271274
}
272275
`
273276

274-
const testAccClbServerAttachment_http = instanceCommonTestCase + `
277+
const testAccClbServerAttachment_http = instanceCommonTestCase + presetCVM + `
275278
resource "tencentcloud_clb_instance" "foo" {
276279
network_type = "OPEN"
277280
clb_name = "tf-clb-attach-http-test"

tencentcloud/resource_tc_clb_instance_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ const OpenClbName = "tf-clb-open"
2222
const OpenClbNameUpdate = "tf-clb-update-open"
2323

2424
func init() {
25-
// -sweep-run=tencentcloud_clb_instance
25+
// go test -v ./tencentcloud -sweep=ap-guangzhou -sweep-run=tencentcloud_clb_instance
2626
resource.AddTestSweepers("tencentcloud_clb_instance", &resource.Sweeper{
2727
Name: "tencentcloud_clb_instance",
2828
F: testSweepClbInstance,

tencentcloud/resource_tc_clb_listener_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,7 @@ resource "tencentcloud_clb_listener" "listener_tcp"{
602602
session_expire_time = 60
603603
scheduler = "WRR"
604604
health_check_type = "TCP"
605+
health_check_port = 333
605606
}
606607
`
607608

tencentcloud/service_tencentcloud_clb.go

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -522,7 +522,7 @@ func (me *ClbService) DeleteAttachmentById(ctx context.Context, clbId string, li
522522
request.LoadBalancerId = &clbId
523523
for _, inst_ := range targets {
524524
inst := inst_.(map[string]interface{})
525-
request.Targets = append(request.Targets, clbNewTarget(inst["instance_id"], inst["port"], inst["weight"]))
525+
request.Targets = append(request.Targets, clbNewTarget(inst["instance_id"], inst["eni_ip"], inst["port"], inst["weight"]))
526526
}
527527
if locationId != "" {
528528
request.LocationId = &locationId
@@ -1006,29 +1006,38 @@ func waitForTaskFinish(requestId string, meta *clb.Client) (err error) {
10061006

10071007
func flattenBackendList(list []*clb.Backend) (mapping []map[string]interface{}) {
10081008
result := make([]map[string]interface{}, 0, len(list))
1009-
for _, v := range list {
1009+
for i := range list {
1010+
v := list[i]
10101011
target := map[string]interface{}{
1011-
"instance_id": v.InstanceId,
1012-
"port": v.Port,
1013-
"weight": v.Weight,
1012+
"port": v.Port,
1013+
"weight": v.Weight,
1014+
}
1015+
if *v.Type == "ENI" && len(v.PrivateIpAddresses) > 0 {
1016+
target["eni_ip"] = v.PrivateIpAddresses[0]
1017+
} else {
1018+
target["instance_id"] = v.InstanceId
10141019
}
10151020
result = append(result, target)
10161021
}
10171022
return result
10181023
}
10191024

1020-
func clbNewTarget(instanceId, port, weight interface{}) *clb.Target {
1021-
id := instanceId.(string)
1025+
func clbNewTarget(instanceId, eniIp, port, weight interface{}) *clb.Target {
10221026
p := int64(port.(int))
1023-
bk := clb.Target{
1024-
InstanceId: &id,
1025-
Port: &p,
1027+
target := clb.Target{
1028+
Port: &p,
1029+
}
1030+
if id, ok := instanceId.(string); ok && id != "" {
1031+
target.InstanceId = &id
1032+
}
1033+
if ip, ok := eniIp.(string); ok && ip != "" {
1034+
target.EniIp = &ip
10261035
}
10271036
if w, ok := weight.(int); ok {
10281037
weight64 := int64(w)
1029-
bk.Weight = &weight64
1038+
target.Weight = &weight64
10301039
}
1031-
return &bk
1040+
return &target
10321041
}
10331042

10341043
func (me *ClbService) CreateTargetGroup(ctx context.Context, targetGroupName string, vpcId string, port uint64,

0 commit comments

Comments
 (0)