@@ -89,6 +89,7 @@ const (
8989 ServiceAnnotationLoadBalancerHealthMonitorMaxRetriesDown = "loadbalancer.openstack.org/health-monitor-max-retries-down"
9090 ServiceAnnotationLoadBalancerLoadbalancerHostname = "loadbalancer.openstack.org/hostname"
9191 ServiceAnnotationLoadBalancerAddress = "loadbalancer.openstack.org/load-balancer-address"
92+ ServiceAnnotationLoadBalancerBatchPoolsMembersUpdate = "loadbalancer.openstack.org/batch-pools-members-update"
9293 // revive:disable:var-naming
9394 ServiceAnnotationTlsContainerRef = "loadbalancer.openstack.org/default-tls-container-ref"
9495 // revive:enable:var-naming
@@ -959,14 +960,18 @@ func (lbaas *LbaasV2) ensureOctaviaPool(ctx context.Context, lbID string, name s
959960 return nil , err
960961 }
961962
962- if ! curMembers .Equal (newMembers ) {
963+ batchPoolsMembersUpdate := getBoolFromServiceAnnotation (service , ServiceAnnotationLoadBalancerBatchPoolsMembersUpdate , lbaas .opts .BatchPoolsMembersUpdate )
964+ if ! curMembers .Equal (newMembers ) && ! batchPoolsMembersUpdate {
963965 klog .V (2 ).Infof ("Updating %d members for pool %s" , len (members ), pool .ID )
964966 if err := openstackutil .BatchUpdatePoolMembers (ctx , lbaas .lb , lbID , pool .ID , members ); err != nil {
965967 return nil , err
966968 }
967969 klog .V (2 ).Infof ("Successfully updated %d members for pool %s" , len (members ), pool .ID )
968970 }
969971
972+ // set the updated members to the pool for further batch update
973+ pool .Members = batchUpdateMemberOptsToMembers (members )
974+
970975 return pool , nil
971976}
972977
@@ -1050,6 +1055,20 @@ func (lbaas *LbaasV2) buildBatchUpdateMemberOpts(ctx context.Context, port corev
10501055 return members , newMembers , nil
10511056}
10521057
1058+ func batchUpdateMemberOptsToMembers (opts []v2pools.BatchUpdateMemberOpts ) []v2pools.Member {
1059+ members := make ([]v2pools.Member , len (opts ))
1060+ for i := range opts {
1061+ members [i ] = v2pools.Member {
1062+ Address : opts [i ].Address ,
1063+ ProtocolPort : opts [i ].ProtocolPort ,
1064+ Name : ptr .Deref (opts [i ].Name , "" ),
1065+ SubnetID : ptr .Deref (opts [i ].SubnetID , "" ),
1066+ MonitorPort : ptr .Deref (opts [i ].MonitorPort , 0 ),
1067+ }
1068+ }
1069+ return members
1070+ }
1071+
10531072func (lbaas * LbaasV2 ) buildCreateMemberOpts (ctx context.Context , port corev1.ServicePort , nodes []* corev1.Node , svcConf * serviceConfig ) ([]v2pools.CreateMemberOpts , sets.Set [string ], error ) {
10541073 batchUpdateMemberOpts , newMembers , err := lbaas .buildBatchUpdateMemberOpts (ctx , port , nodes , svcConf )
10551074 if err != nil {
@@ -1783,6 +1802,8 @@ func (lbaas *LbaasV2) ensureOctaviaLoadBalancer(ctx context.Context, clusterName
17831802 return nil , err
17841803 }
17851804
1805+ // a list of pools to update
1806+ pools := make ([]v2pools.Pool , 0 , len (service .Spec .Ports ))
17861807 for portIndex , port := range service .Spec .Ports {
17871808 listener , err := lbaas .ensureOctaviaListener (ctx , loadbalancer .ID , cpoutil .Sprintf255 (listenerFormat , portIndex , lbName ), curListenerMapping , port , svcConf )
17881809 if err != nil {
@@ -1793,6 +1814,7 @@ func (lbaas *LbaasV2) ensureOctaviaLoadBalancer(ctx context.Context, clusterName
17931814 if err != nil {
17941815 return nil , err
17951816 }
1817+ pools = append (pools , * pool )
17961818
17971819 if err := lbaas .ensureOctaviaHealthMonitor (ctx , loadbalancer .ID , cpoutil .Sprintf255 (monitorFormat , portIndex , lbName ), pool , port , svcConf ); err != nil {
17981820 return nil , err
@@ -1804,6 +1826,17 @@ func (lbaas *LbaasV2) ensureOctaviaLoadBalancer(ctx context.Context, clusterName
18041826 curListeners = popListener (curListeners , listener .ID )
18051827 }
18061828
1829+ batchPoolsMembersUpdate := getBoolFromServiceAnnotation (service , ServiceAnnotationLoadBalancerBatchPoolsMembersUpdate , lbaas .opts .BatchPoolsMembersUpdate )
1830+ if batchPoolsMembersUpdate {
1831+ err := openstackutil .BatchUpdatePoolsMembers (ctx , lbaas .lb , loadbalancer .ID , pools )
1832+ if err != nil {
1833+ err = PreserveGopherError (err )
1834+ msg := fmt .Sprintf ("Error updating batch pools members for LoadBalancer: %v" , err )
1835+ klog .Errorf (msg , "lbID" , loadbalancer .ID )
1836+ return nil , err
1837+ }
1838+ }
1839+
18071840 // Deal with the remaining listeners, delete the listener if it was created by this Service previously.
18081841 if err := lbaas .deleteOctaviaListeners (ctx , loadbalancer .ID , curListeners , isLBOwner , lbName ); err != nil {
18091842 return nil , err
@@ -1935,6 +1968,9 @@ func (lbaas *LbaasV2) updateOctaviaLoadBalancer(ctx context.Context, clusterName
19351968 lbListeners [key ] = l
19361969 }
19371970
1971+ // a list of pools to update
1972+ pools := make ([]v2pools.Pool , 0 , len (service .Spec .Ports ))
1973+
19381974 // Update pool members for each listener.
19391975 for portIndex , port := range service .Spec .Ports {
19401976 proto := getListenerProtocol (port .Protocol , svcConf )
@@ -1950,13 +1986,25 @@ func (lbaas *LbaasV2) updateOctaviaLoadBalancer(ctx context.Context, clusterName
19501986 if err != nil {
19511987 return err
19521988 }
1989+ pools = append (pools , * pool )
19531990
19541991 err = lbaas .ensureOctaviaHealthMonitor (ctx , loadbalancer .ID , cpoutil .Sprintf255 (monitorFormat , portIndex , loadbalancer .Name ), pool , port , svcConf )
19551992 if err != nil {
19561993 return err
19571994 }
19581995 }
19591996
1997+ batchPoolsMembersUpdate := getBoolFromServiceAnnotation (service , ServiceAnnotationLoadBalancerBatchPoolsMembersUpdate , lbaas .opts .BatchPoolsMembersUpdate )
1998+ if batchPoolsMembersUpdate {
1999+ err := openstackutil .BatchUpdatePoolsMembers (ctx , lbaas .lb , loadbalancer .ID , pools )
2000+ if err != nil {
2001+ err = PreserveGopherError (err )
2002+ msg := fmt .Sprintf ("Error updating batch pools members for LoadBalancer: %v" , err )
2003+ klog .Errorf (msg , "lbID" , loadbalancer .ID )
2004+ return err
2005+ }
2006+ }
2007+
19602008 if lbaas .opts .ManageSecurityGroups {
19612009 err := lbaas .ensureAndUpdateOctaviaSecurityGroup (ctx , clusterName , service , filteredNodes , svcConf )
19622010 if err != nil {
0 commit comments