diff --git a/gateway-service/src/main/java/org/zowe/apiml/gateway/service/RouteLocator.java b/gateway-service/src/main/java/org/zowe/apiml/gateway/service/RouteLocator.java index eeac8c41d7..c9fd1113cf 100644 --- a/gateway-service/src/main/java/org/zowe/apiml/gateway/service/RouteLocator.java +++ b/gateway-service/src/main/java/org/zowe/apiml/gateway/service/RouteLocator.java @@ -20,6 +20,7 @@ import org.springframework.cloud.gateway.route.RouteDefinitionLocator; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Service; +import org.springframework.util.PatternMatchUtils; import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource; import org.zowe.apiml.auth.Authentication; import org.zowe.apiml.auth.AuthenticationScheme; @@ -44,6 +45,9 @@ public class RouteLocator implements RouteDefinitionLocator { private static final EurekaMetadataParser metadataParser = new EurekaMetadataParser(); + @Value("${apiml.routing.ignoredServices:}") + private String[] ignoredServices; + @Value("${apiml.service.forwardClientCertEnabled:false}") private boolean forwardingClientCertEnabled; @@ -80,6 +84,7 @@ public RouteLocator( Flux> getServiceInstances() { return discoveryClient.getServices() + .filter(this::filterIgnored) .flatMap(service -> discoveryClient.getInstances(service) .collectList()); } @@ -186,4 +191,7 @@ public Flux getRouteDefinitions() { .flatMapIterable(list -> list); } + private boolean filterIgnored(String serviceId) { + return !PatternMatchUtils.simpleMatch(ignoredServices, serviceId); + } } diff --git a/gateway-service/src/main/resources/application.yml b/gateway-service/src/main/resources/application.yml index 110be8b577..7ad33c3dff 100644 --- a/gateway-service/src/main/resources/application.yml +++ b/gateway-service/src/main/resources/application.yml @@ -79,6 +79,7 @@ apiml: timeToLive: 10000 routing: instanceIdHeader: false + ignoredServices: discovery,zaas # to disable routing to the Discovery and ZAAS service service: apimlId: apiml1 corsEnabled: true @@ -113,13 +114,6 @@ server: trustStore: keystore/localhost/localhost.truststore.p12 trustStorePassword: password trustStoreType: PKCS12 - - cloud: - gateway: - discovery: - locator: - enabled: false - lowerCaseServiceId: true application: name: gateway main: diff --git a/gateway-service/src/test/java/org/zowe/apiml/gateway/service/RouteLocatorTest.java b/gateway-service/src/test/java/org/zowe/apiml/gateway/service/RouteLocatorTest.java index c296b96b8a..30579389bd 100644 --- a/gateway-service/src/test/java/org/zowe/apiml/gateway/service/RouteLocatorTest.java +++ b/gateway-service/src/test/java/org/zowe/apiml/gateway/service/RouteLocatorTest.java @@ -136,6 +136,19 @@ void givenDiscoveryClient_whenGetServiceInstances_thenReturnAllServiceInstances( ); } + @Test + void givenIgnoredServices_whenGetServiceInstances_thenFilteredOut() { + ReflectionTestUtils.setField(routeLocator, "ignoredServices", new String[]{"discovery"} ); + when(discoveryClient.getServices()).thenReturn(Flux.fromArray(new String[] {"service", "discovery"})); + ServiceInstance serviceInstance = mock(ServiceInstance.class); + ServiceInstance discoveryInstance = mock(ServiceInstance.class); + doReturn(Flux.just(serviceInstance)).when(discoveryClient).getInstances("service"); + doReturn(Flux.just(discoveryInstance)).when(discoveryClient).getInstances("discovery"); + + doCallRealMethod().when(routeLocator).getServiceInstances(); + assertArrayEquals(new Object[] {Collections.singletonList(serviceInstance)}, routeLocator.getServiceInstances().toStream().toArray()); + } + @Test void givenNoAuthentication_whenSetAuth_thenDoNothing() { assertDoesNotThrow(() -> routeLocator.setAuth(MOCK_SERVICE,null, null));