@@ -34,7 +34,7 @@ func newLoadBalancers(client *cli.Client, defaultLocationID *int64) cloudprovide
3434}
3535
3636func (l * loadBalancers ) GetLoadBalancer (ctx context.Context , clusterName string , service * v1.Service ) (* v1.LoadBalancerStatus , bool , error ) {
37- loadBalancer , err := l .findLoadBalancerByName (ctx , clusterName , service )
37+ loadBalancer , err := l .findLoadBalancer (ctx , clusterName , service )
3838
3939 if err != nil && isNotFoundError (err ) {
4040 return nil , false , nil
@@ -59,7 +59,7 @@ func (l *loadBalancers) GetLoadBalancerName(ctx context.Context, clusterName str
5959}
6060
6161func (l * loadBalancers ) EnsureLoadBalancer (ctx context.Context , clusterName string , service * v1.Service , nodes []* v1.Node ) (* v1.LoadBalancerStatus , error ) {
62- loadBalancer , err := l .findLoadBalancerByName (ctx , clusterName , service )
62+ loadBalancer , err := l .findLoadBalancer (ctx , clusterName , service )
6363 if err != nil {
6464 if ! isNotFoundError (err ) {
6565 return nil , err
@@ -130,7 +130,7 @@ func (l *loadBalancers) EnsureLoadBalancer(ctx context.Context, clusterName stri
130130}
131131
132132func (l * loadBalancers ) UpdateLoadBalancer (ctx context.Context , clusterName string , service * v1.Service , nodes []* v1.Node ) error {
133- loadBalancer , err := l .findLoadBalancerByName (ctx , clusterName , service )
133+ loadBalancer , err := l .findLoadBalancer (ctx , clusterName , service )
134134 if err != nil {
135135 return err
136136 }
@@ -166,7 +166,7 @@ func (l *loadBalancers) UpdateLoadBalancer(ctx context.Context, clusterName stri
166166}
167167
168168func (l * loadBalancers ) EnsureLoadBalancerDeleted (ctx context.Context , clusterName string , service * v1.Service ) error {
169- loadBalancer , err := l .findLoadBalancerByName (ctx , clusterName , service )
169+ loadBalancer , err := l .findLoadBalancer (ctx , clusterName , service )
170170 if err != nil {
171171 if isNotFoundError (err ) {
172172 return nil
@@ -178,10 +178,29 @@ func (l *loadBalancers) EnsureLoadBalancerDeleted(ctx context.Context, clusterNa
178178 return l .client .LoadBalancers .DeleteL4LoadBalancer (ctx , loadBalancer .ID )
179179}
180180
181- func (l * loadBalancers ) findLoadBalancerByName (ctx context.Context , clusterName string , service * v1.Service ) (* cli.L4LoadBalancer , error ) {
182- name := l .GetLoadBalancerName (ctx , clusterName , service )
183-
181+ // findLoadBalancer tries to find load balancer by label selector first, then by name
182+ func (l * loadBalancers ) findLoadBalancer (ctx context.Context , clusterName string , service * v1.Service ) (* cli.L4LoadBalancer , error ) {
183+ // first try to find by label selector
184+ labelSelector := loadBalancerServiceUUIDLabel + "=" + string (service .UID )
184185 loadBalancers , err := l .client .LoadBalancers .Collection ().
186+ SetPerPage (100 ).
187+ SetParam (typeParamKey , "l4" ).
188+ SetParam ("label_selector" , labelSelector ).
189+ Collect (ctx )
190+
191+ if err != nil {
192+ return nil , err
193+ }
194+
195+ if len (loadBalancers ) == 1 {
196+ return l .client .LoadBalancers .GetL4LoadBalancer (ctx , loadBalancers [0 ].ID )
197+ } else if len (loadBalancers ) > 1 {
198+ return nil , fmt .Errorf ("found more than one load balancer with the same label selector: %s" , labelSelector )
199+ }
200+
201+ // fallback to name-based search
202+ name := l .GetLoadBalancerName (ctx , clusterName , service )
203+ loadBalancers , err = l .client .LoadBalancers .Collection ().
185204 SetPerPage (100 ).
186205 SetParam (typeParamKey , "l4" ).
187206 SetParam (searchPatternParamKey , name ).
0 commit comments