Skip to content

fix-1965 ( fabric8 only )#2167

Merged
ryanjbaxter merged 6 commits into
spring-cloud:mainfrom
wind57:fix-1965-by-labels
Mar 11, 2026
Merged

fix-1965 ( fabric8 only )#2167
ryanjbaxter merged 6 commits into
spring-cloud:mainfrom
wind57:fix-1965-by-labels

Conversation

@wind57

@wind57 wind57 commented Mar 6, 2026

Copy link
Copy Markdown
Contributor

No description provided.

Signed-off-by: wind57 <eugen.rabii@gmail.com>
Signed-off-by: wind57 <eugen.rabii@gmail.com>
@wind57 wind57 changed the title fix-1965 fix-1965 ( fabric8 only ) Mar 11, 2026
wind57 added 2 commits March 11, 2026 17:27
Signed-off-by: wind57 <eugen.rabii@gmail.com>
@wind57

wind57 commented Mar 11, 2026

Copy link
Copy Markdown
Contributor Author

@ryanjbaxter can you trigger copilot please?

@Conditional(OnServiceMatchingStrategyCondition.class)
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE, ElementType.METHOD })
public @interface ConditionalOnServiceMatchingStrategyCondition {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

conditionally enable loadbalancer services searching : either by name or by labels

/**
* Loadbalancer services discovery happens based on labels.
*/
LABELS

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

introduce a new way to load services

public class Fabric8LabelBasedServicesListSupplier extends AbstractFabric8ServicesListSupplier {

private static final LogAccessor LOG = new LogAccessor(Fabric8LabelBasedServicesListSupplier.class);

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this code is almost the same we have for name based searches, with the exception that this is done by labels here

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR (fabric8 module only) introduces a configurable “service matching strategy” for SERVICE-mode load balancing (by service name vs by labels), adds a new Fabric8 label-based ServiceInstanceListSupplier, and refactors/expands the Fabric8 load balancer test suite + mock helpers accordingly.

Changes:

  • Add LoadBalancerServiceMatchingStrategy (NAME/LABELS) and a conditional mechanism to select the appropriate supplier based on spring.cloud.kubernetes.loadbalancer.service-matching-strategy (default NAME).
  • Implement Fabric8LabelBasedServicesListSupplier and wire it into Fabric8 load balancer client configuration.
  • Refactor Fabric8 IT tests/mocks (remove Util, add dedicated mock helpers) and add coverage for label-based behavior and caching scenarios.

Reviewed changes

Copilot reviewed 29 out of 29 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/mode/service/name/cache/CacheEnabledWithinTTLTest.java Adjust test package/imports; switch to new mock helpers.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/mode/service/name/cache/CacheEnabledOutsideTTLTest.java Adjust test package/imports; switch to new mock helpers.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/mode/service/name/cache/CacheDisabledTest.java New test validating cache-disabled behavior (NAME strategy) using new mock helpers.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/mode/service/name/SpecificNamespaceTest.java Package rename + refactor to new mock helpers.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/mode/service/name/SelectiveNamespacesTest.java Package rename + refactor to new mock helpers.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/mode/service/name/AllNamespacesTest.java Package rename + refactor to new mock helpers; consolidate call-count constant.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/mode/service/label/cache/CacheEnabledWithinTTLTest.java New label-strategy cache-within-TTL integration test.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/mode/service/label/cache/CacheEnabledOutsideTTLTest.java New label-strategy cache-outside-TTL integration test.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/mode/service/label/cache/CacheDisabledTest.java Update existing cache-disabled test to use LABELS strategy + new mock helpers.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/mode/service/label/SpecificNamespaceTest.java New label-strategy specific-namespace integration test.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/mode/service/label/SelectiveNamespacesTest.java New label-strategy selective-namespaces integration test.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/mode/service/label/AllNamespacesTest.java New label-strategy all-namespaces integration test.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/mode/pod/SpecificNamespaceTest.java Refactor to new indexer-mock helpers; remove WireMock global configure calls.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/mode/pod/SelectiveNamespacesTest.java Refactor to new indexer-mock helpers; remove WireMock global configure calls.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/mode/pod/AllNamespacesTest.java Refactor to new indexer-mock helpers; minor assertion style cleanup.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/Util.java Remove old monolithic test util (replaced by dedicated mock helper classes).
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/LoadbalancerMocks.java New helper for mocking Fabric8 load balancer service list calls.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/LoadBalancerConfiguration.java Fix package to match path and simplify imports for IT tests.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/DiscoveryClientIndexerMocks.java New helper consolidating shared-informer indexer mock expectations.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/it/App.java Fix package to match path (IT test boot app).
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8NamedServicesListSupplierMockClientTests.java Rename test class; simplify test setup system properties.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8LoadBalancerAutoConfigurationTests.java Add tests validating default/explicit NAME vs LABELS strategy bean selection.
spring-cloud-kubernetes-fabric8-loadbalancer/src/test/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8LabeledServicesListSupplierMockClientTests.java New mock-client tests for label-based supplier behavior.
spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8ServicesListSupplier.java Minor logging initialization simplification.
spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8LoadBalancerClientConfiguration.java Wire NAME vs LABELS suppliers via new conditional strategy selection.
spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8LabelBasedServicesListSupplier.java New label-filtering SERVICE-mode list supplier implementation.
spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/loadbalancer/OnServiceMatchingStrategyCondition.java New Spring condition selecting matching strategy (defaults to NAME).
spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/loadbalancer/LoadBalancerServiceMatchingStrategy.java New enum defining NAME vs LABELS matching strategies.
spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/loadbalancer/ConditionalOnServiceMatchingStrategyCondition.java New conditional annotation for strategy-based bean selection.
Comments suppressed due to low confidence (1)

spring-cloud-kubernetes-fabric8-loadbalancer/src/main/java/org/springframework/cloud/kubernetes/fabric8/loadbalancer/Fabric8LoadBalancerClientConfiguration.java:46

  • Renaming the @Bean method from kubernetesServicesListSupplier to kubernetesNameBasedServicesListSupplier changes the bean name and can be a breaking change for users that override or reference the bean by name. Consider explicitly keeping the previous bean name (e.g., via @Bean("kubernetesServicesListSupplier")) for the NAME strategy while introducing a separate bean name for the LABELS strategy.
	@Bean
	@ConditionalOnKubernetesLoadBalancerServiceModeEnabled
	@ConditionalOnServiceMatchingStrategyCondition(NAME)
	ServiceInstanceListSupplier kubernetesNameBasedServicesListSupplier(Environment environment,
			KubernetesClient kubernetesClient, Fabric8ServiceInstanceMapper mapper,
			KubernetesDiscoveryProperties discoveryProperties, ConfigurableApplicationContext context) {
		return ServiceInstanceListSupplier.builder()
			.withBase(new Fabric8ServicesListSupplier(environment, kubernetesClient, mapper, discoveryProperties))

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Signed-off-by: wind57 <eugen.rabii@gmail.com>
@wind57 wind57 marked this pull request as ready for review March 11, 2026 16:39
@wind57

wind57 commented Mar 11, 2026

Copy link
Copy Markdown
Contributor Author

@ryanjbaxter this is ready to be looked at. it only fixes fabric8 client code, I will work on k8s-client implementation also. In that PR, I will also update the documentation.

@ryanjbaxter ryanjbaxter merged commit 3578a8a into spring-cloud:main Mar 11, 2026
25 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add support for spring.cloud.kubernetes.discovery.service-labels filter in Fabric8ServicesListSupplier

4 participants