@@ -959,14 +959,17 @@ func (lbaas *LbaasV2) ensureOctaviaPool(ctx context.Context, lbID string, name s
959959 return nil , err
960960 }
961961
962- if ! curMembers .Equal (newMembers ) {
962+ if ! curMembers .Equal (newMembers ) && ! lbaas . opts . BatchPoolsMembersUpdate {
963963 klog .V (2 ).Infof ("Updating %d members for pool %s" , len (members ), pool .ID )
964964 if err := openstackutil .BatchUpdatePoolMembers (ctx , lbaas .lb , lbID , pool .ID , members ); err != nil {
965965 return nil , err
966966 }
967967 klog .V (2 ).Infof ("Successfully updated %d members for pool %s" , len (members ), pool .ID )
968968 }
969969
970+ // set the updated members to the pool for further batch update
971+ pool .Members = batchUpdateMemberOptsToMembers (members )
972+
970973 return pool , nil
971974}
972975
@@ -1050,6 +1053,20 @@ func (lbaas *LbaasV2) buildBatchUpdateMemberOpts(ctx context.Context, port corev
10501053 return members , newMembers , nil
10511054}
10521055
1056+ func batchUpdateMemberOptsToMembers (opts []v2pools.BatchUpdateMemberOpts ) []v2pools.Member {
1057+ members := make ([]v2pools.Member , len (opts ))
1058+ for i := range opts {
1059+ members [i ] = v2pools.Member {
1060+ Address : opts [i ].Address ,
1061+ ProtocolPort : opts [i ].ProtocolPort ,
1062+ Name : ptr .Deref (opts [i ].Name , "" ),
1063+ SubnetID : ptr .Deref (opts [i ].SubnetID , "" ),
1064+ MonitorPort : ptr .Deref (opts [i ].MonitorPort , 0 ),
1065+ }
1066+ }
1067+ return members
1068+ }
1069+
10531070func (lbaas * LbaasV2 ) buildCreateMemberOpts (ctx context.Context , port corev1.ServicePort , nodes []* corev1.Node , svcConf * serviceConfig ) ([]v2pools.CreateMemberOpts , sets.Set [string ], error ) {
10541071 batchUpdateMemberOpts , newMembers , err := lbaas .buildBatchUpdateMemberOpts (ctx , port , nodes , svcConf )
10551072 if err != nil {
@@ -1783,6 +1800,8 @@ func (lbaas *LbaasV2) ensureOctaviaLoadBalancer(ctx context.Context, clusterName
17831800 return nil , err
17841801 }
17851802
1803+ // a list of pools to update
1804+ pools := make ([]v2pools.Pool , 0 , len (service .Spec .Ports ))
17861805 for portIndex , port := range service .Spec .Ports {
17871806 listener , err := lbaas .ensureOctaviaListener (ctx , loadbalancer .ID , cpoutil .Sprintf255 (listenerFormat , portIndex , lbName ), curListenerMapping , port , svcConf )
17881807 if err != nil {
@@ -1793,6 +1812,7 @@ func (lbaas *LbaasV2) ensureOctaviaLoadBalancer(ctx context.Context, clusterName
17931812 if err != nil {
17941813 return nil , err
17951814 }
1815+ pools = append (pools , * pool )
17961816
17971817 if err := lbaas .ensureOctaviaHealthMonitor (ctx , loadbalancer .ID , cpoutil .Sprintf255 (monitorFormat , portIndex , lbName ), pool , port , svcConf ); err != nil {
17981818 return nil , err
@@ -1804,6 +1824,16 @@ func (lbaas *LbaasV2) ensureOctaviaLoadBalancer(ctx context.Context, clusterName
18041824 curListeners = popListener (curListeners , listener .ID )
18051825 }
18061826
1827+ if lbaas .opts .BatchPoolsMembersUpdate {
1828+ err := openstackutil .BatchUpdatePoolsMembers (ctx , lbaas .lb , loadbalancer .ID , pools )
1829+ if err != nil {
1830+ err = PreserveGopherError (err )
1831+ msg := fmt .Sprintf ("Error updating batch pools members for LoadBalancer: %v" , err )
1832+ klog .Errorf (msg , "lbID" , loadbalancer .ID )
1833+ return nil , err
1834+ }
1835+ }
1836+
18071837 // Deal with the remaining listeners, delete the listener if it was created by this Service previously.
18081838 if err := lbaas .deleteOctaviaListeners (ctx , loadbalancer .ID , curListeners , isLBOwner , lbName ); err != nil {
18091839 return nil , err
@@ -1935,6 +1965,9 @@ func (lbaas *LbaasV2) updateOctaviaLoadBalancer(ctx context.Context, clusterName
19351965 lbListeners [key ] = l
19361966 }
19371967
1968+ // a list of pools to update
1969+ pools := make ([]v2pools.Pool , 0 , len (service .Spec .Ports ))
1970+
19381971 // Update pool members for each listener.
19391972 for portIndex , port := range service .Spec .Ports {
19401973 proto := getListenerProtocol (port .Protocol , svcConf )
@@ -1950,13 +1983,24 @@ func (lbaas *LbaasV2) updateOctaviaLoadBalancer(ctx context.Context, clusterName
19501983 if err != nil {
19511984 return err
19521985 }
1986+ pools = append (pools , * pool )
19531987
19541988 err = lbaas .ensureOctaviaHealthMonitor (ctx , loadbalancer .ID , cpoutil .Sprintf255 (monitorFormat , portIndex , loadbalancer .Name ), pool , port , svcConf )
19551989 if err != nil {
19561990 return err
19571991 }
19581992 }
19591993
1994+ if lbaas .opts .BatchPoolsMembersUpdate {
1995+ err := openstackutil .BatchUpdatePoolsMembers (ctx , lbaas .lb , loadbalancer .ID , pools )
1996+ if err != nil {
1997+ err = PreserveGopherError (err )
1998+ msg := fmt .Sprintf ("Error updating batch pools members for LoadBalancer: %v" , err )
1999+ klog .Errorf (msg , "lbID" , loadbalancer .ID )
2000+ return err
2001+ }
2002+ }
2003+
19602004 if lbaas .opts .ManageSecurityGroups {
19612005 err := lbaas .ensureAndUpdateOctaviaSecurityGroup (ctx , clusterName , service , filteredNodes , svcConf )
19622006 if err != nil {
0 commit comments