Skip to content

Commit 291a2a1

Browse files
authored
Merge pull request #82 from setoru/fix-members
Fix Incorrect Deletion of All ELB Members
2 parents 6f5f21f + 57ca36a commit 291a2a1

File tree

1 file changed

+32
-17
lines changed

1 file changed

+32
-17
lines changed

pkg/services/elb/loadbalancer.go

Lines changed: 32 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,15 @@ func (s *Service) getPool(poolId string) (*elbmodel.Pool, error) {
127127
return response.Pool, nil
128128
}
129129

130+
func (s *Service) listMembers(poolId string) (*[]elbmodel.Member, error) {
131+
req := &elbmodel.ListMembersRequest{PoolId: poolId}
132+
response, err := s.elbClient.ListMembers(req)
133+
if err != nil {
134+
return nil, err
135+
}
136+
return response.Members, nil
137+
}
138+
130139
// ReconcileLoadbalancers reconciles the load balancers for the given cluster.
131140
func (s *Service) ReconcileLoadbalancers() error {
132141
klog.Info("Reconciling load balancers")
@@ -393,7 +402,7 @@ func (s *Service) CreateMember(pools []infrav1alpha1.PoolRef, instance *infrav1a
393402
}
394403
sdkPool, err := s.getPool(pool.Id)
395404
if err != nil {
396-
return err
405+
return errors.Wrapf(err, "failed to get pool")
397406
}
398407

399408
listeners := sdkPool.Listeners
@@ -403,18 +412,26 @@ func (s *Service) CreateMember(pools []infrav1alpha1.PoolRef, instance *infrav1a
403412
}
404413
sdkListener, err := s.getListener(listener.Id)
405414
if err != nil {
406-
return err
415+
return errors.Wrapf(err, "failed to get listener")
407416
}
408417

409-
createMembersRequest := &elbmodel.BatchCreateMembersRequest{Body: &elbmodel.BatchCreateMembersRequestBody{Members: make([]elbmodel.BatchCreateMembersOption, 0)}}
418+
createMembersRequest := &elbmodel.BatchCreateMembersRequest{
419+
Body: &elbmodel.BatchCreateMembersRequestBody{
420+
Members: make([]elbmodel.BatchCreateMembersOption, 0),
421+
},
422+
}
410423
for _, addr := range instance.Addresses {
411424
memberExists, err := s.memberExists(sdkPool, addr.Address, sdkListener.ProtocolPort, instance.SubnetID)
412425
if err != nil {
413426
return err
414427
}
415428
if !memberExists && addr.Type == clusterv1.MachineInternalIP {
416429
createMembersRequest.PoolId = sdkPool.Id
417-
createMember := elbmodel.BatchCreateMembersOption{Address: addr.Address, ProtocolPort: sdkListener.ProtocolPort, SubnetCidrId: &s.scope.Subnets()[0].NeutronSubnetId}
430+
createMember := elbmodel.BatchCreateMembersOption{
431+
Address: addr.Address,
432+
ProtocolPort: sdkListener.ProtocolPort,
433+
SubnetCidrId: &s.scope.Subnets()[0].NeutronSubnetId,
434+
}
418435
createMembersRequest.Body.Members = append(createMembersRequest.Body.Members, createMember)
419436
}
420437
}
@@ -424,7 +441,7 @@ func (s *Service) CreateMember(pools []infrav1alpha1.PoolRef, instance *infrav1a
424441
}
425442
_, err = s.elbClient.BatchCreateMembers(createMembersRequest)
426443
if err != nil {
427-
return err
444+
return errors.Wrapf(err, "failed to create members")
428445
}
429446
}
430447
}
@@ -436,23 +453,21 @@ func (s *Service) DeleteMember(pools []infrav1alpha1.PoolRef, instance *infrav1a
436453
if pool.Id == "" {
437454
continue
438455
}
439-
sdkPool, err := s.getPool(pool.Id)
456+
members, err := s.listMembers(pool.Id)
440457
if err != nil {
441-
return err
458+
return errors.Wrapf(err, "failed to get members")
442459
}
443-
444-
members := sdkPool.Members
445-
for _, member := range members {
446-
if member.Id == "" {
460+
for _, member := range *members {
461+
if *member.InstanceId != instance.ID {
447462
continue
448463
}
449-
deleteMembersRequest := &elbmodel.BatchDeleteMembersRequest{Body: &elbmodel.BatchDeleteMembersRequestBody{Members: make([]elbmodel.BatchDeleteMembersOption, 0)}}
450-
deleteMembersRequest.PoolId = sdkPool.Id
451-
deleteMember := elbmodel.BatchDeleteMembersOption{Id: &member.Id}
452-
deleteMembersRequest.Body.Members = append(deleteMembersRequest.Body.Members, deleteMember)
453-
_, err = s.elbClient.BatchDeleteMembers(deleteMembersRequest)
464+
deleteMemberRequest := &elbmodel.DeleteMemberRequest{
465+
PoolId: pool.Id,
466+
MemberId: member.Id,
467+
}
468+
_, err = s.elbClient.DeleteMember(deleteMemberRequest)
454469
if err != nil {
455-
return err
470+
return errors.Wrapf(err, "failed to delete member")
456471
}
457472
}
458473
}

0 commit comments

Comments
 (0)