@@ -52,6 +52,7 @@ const (
5252const (
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+
931956func (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