Skip to content

Commit e1fd360

Browse files
committed
Ensure pool member reaches active state
When (re)creating a pool member, wait until its provisioning_status is ACTIVE. This avoids scenarios were CAPO contrinues removing members before new ones are actually active
1 parent f12882d commit e1fd360

File tree

3 files changed

+51
-1
lines changed

3 files changed

+51
-1
lines changed

pkg/clients/loadbalancer.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ type LbClient interface {
5151
DeletePool(id string) error
5252
CreatePoolMember(poolID string, opts pools.CreateMemberOptsBuilder) (*pools.Member, error)
5353
ListPoolMember(poolID string, opts pools.ListMembersOptsBuilder) ([]pools.Member, error)
54+
GetPoolMember(poolID string, lbMemberID string) (*pools.Member, error)
5455
DeletePoolMember(poolID string, lbMemberID string) error
5556
CreateMonitor(opts monitors.CreateOptsBuilder) (*monitors.Monitor, error)
5657
ListMonitors(opts monitors.ListOptsBuilder) ([]monitors.Monitor, error)
@@ -213,6 +214,15 @@ func (l lbClient) ListPoolMember(poolID string, opts pools.ListMembersOptsBuilde
213214
return pools.ExtractMembers(allPages)
214215
}
215216

217+
func (l lbClient) GetPoolMember(poolID string, lbMemberID string) (*pools.Member, error) {
218+
mc := metrics.NewMetricPrometheusContext("loadbalancer_member", "get")
219+
member, err := pools.GetMember(context.TODO(), l.serviceClient, poolID, lbMemberID).Extract()
220+
if mc.ObserveRequest(err) != nil {
221+
return nil, fmt.Errorf("error getting lbmember: %s", err)
222+
}
223+
return member, nil
224+
}
225+
216226
func (l lbClient) DeletePoolMember(poolID string, lbMemberID string) error {
217227
mc := metrics.NewMetricPrometheusContext("loadbalancer_member", "delete")
218228
err := pools.DeleteMember(context.TODO(), l.serviceClient, poolID, lbMemberID).ExtractErr()

pkg/clients/mock/loadbalancer.go

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pkg/cloud/services/loadbalancer/loadbalancer.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ const (
5252
const (
5353
loadBalancerProvisioningStatusActive = "ACTIVE"
5454
loadBalancerProvisioningStatusPendingDelete = "PENDING_DELETE"
55+
poolMembeProvisioningStatusActive = "ACTIVE"
5556
)
5657

5758
// Default values for Monitor, sync with `kubebuilder:default` annotations on APIServerLoadBalancerMonitor object.
@@ -714,7 +715,12 @@ func (s *Service) ReconcileLoadBalancerMember(openStackCluster *infrav1.OpenStac
714715
return err
715716
}
716717

717-
if _, err := s.loadbalancerClient.CreatePoolMember(pool.ID, lbMemberOpts); err != nil {
718+
member, err := s.loadbalancerClient.CreatePoolMember(pool.ID, lbMemberOpts)
719+
if err != nil {
720+
return err
721+
}
722+
723+
if _, err := s.waitForPoolMemberActive(pool.ID, member.ID); err != nil {
718724
return err
719725
}
720726

@@ -928,6 +934,25 @@ func (s *Service) waitForLoadBalancerActive(id string) (*loadbalancers.LoadBalan
928934
return lb, nil
929935
}
930936

937+
// Possible Pool Member states are documented here: https://docs.openstack.org/api-ref/load-balancer/v2/#prov-status
938+
func (s *Service) waitForPoolMemberActive(poolID, memberID string) (*pools.Member, error) {
939+
var member *pools.Member
940+
941+
s.scope.Logger().Info("Waiting for pool member", "pool_id", poolID, "member_id", memberID, "targetStatus", "ACTIVE")
942+
err := wait.ExponentialBackoff(backoff, func() (bool, error) {
943+
var err error
944+
member, err = s.loadbalancerClient.GetPoolMember(poolID, memberID)
945+
if err != nil {
946+
return false, err
947+
}
948+
return member.ProvisioningStatus == poolMembeProvisioningStatusActive, nil
949+
})
950+
if err != nil {
951+
return nil, err
952+
}
953+
return member, nil
954+
}
955+
931956
func (s *Service) waitForListener(id, target string) error {
932957
s.scope.Logger().Info("Waiting for load balancer listener", "id", id, "targetStatus", target)
933958
return wait.ExponentialBackoff(backoff, func() (bool, error) {

0 commit comments

Comments
 (0)