Correct the order when routes are refreshed by group (#3112)
This commit is contained in:
@@ -88,8 +88,9 @@ public class CachingRouteLocator
|
||||
.onErrorResume(s -> Mono.just(List.of()));
|
||||
|
||||
scopedRoutes.subscribe(scopedRoutesList -> {
|
||||
Flux.concat(Flux.fromIterable(scopedRoutesList), getNonScopedRoutes(event)).materialize()
|
||||
.collect(Collectors.toList()).subscribe(signals -> {
|
||||
Flux.concat(Flux.fromIterable(scopedRoutesList), getNonScopedRoutes(event))
|
||||
.sort(AnnotationAwareOrderComparator.INSTANCE).materialize().collect(Collectors.toList())
|
||||
.subscribe(signals -> {
|
||||
applicationEventPublisher.publishEvent(new RefreshRoutesResultEvent(this));
|
||||
cache.put(CACHE_KEY, signals);
|
||||
}, this::handleRefreshError);
|
||||
|
||||
@@ -23,6 +23,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.UUID;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.assertj.core.util.Maps;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
@@ -193,6 +194,62 @@ public class GatewayControllerEndpointTests {
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testOrderOfRefreshByGroup() {
|
||||
RouteDefinition testRouteDefinition = new RouteDefinition();
|
||||
testRouteDefinition.setUri(URI.create("http://example.org"));
|
||||
testRouteDefinition.setOrder(1000);
|
||||
String group1 = "group-1_" + UUID.randomUUID();
|
||||
testRouteDefinition.setMetadata(Map.of("groupBy", group1));
|
||||
|
||||
String routeId1 = "route-1_" + UUID.randomUUID();
|
||||
testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId1)
|
||||
.accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition)).exchange()
|
||||
.expectStatus().isCreated();
|
||||
|
||||
RouteDefinition testRouteDefinition2 = new RouteDefinition();
|
||||
testRouteDefinition2.setUri(URI.create("http://example.org"));
|
||||
testRouteDefinition2.setOrder(0);
|
||||
String group2 = "group-2_" + UUID.randomUUID();
|
||||
testRouteDefinition2.setMetadata(Map.of("groupBy", group2));
|
||||
String routeId2 = "route-2_" + UUID.randomUUID();
|
||||
testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId2)
|
||||
.accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition2)).exchange()
|
||||
.expectStatus().isCreated();
|
||||
|
||||
testClient.post().uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group1)
|
||||
.exchange().expectStatus().isOk();
|
||||
testClient.post().uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group2)
|
||||
.exchange().expectStatus().isOk();
|
||||
|
||||
testClient.get().uri("http://localhost:" + port + "/actuator/gateway/routes").exchange().expectStatus().isOk()
|
||||
.expectBodyList(Map.class).consumeWith(result -> {
|
||||
List<Map> responseBody = result.getResponseBody();
|
||||
|
||||
List ids = responseBody.stream()
|
||||
.map(route -> route.get("route_id"))
|
||||
.filter(id -> id.equals(routeId1) || id.equals(routeId2))
|
||||
.collect(Collectors.toList());
|
||||
assertThat(ids).containsExactly(routeId2, routeId1);
|
||||
});
|
||||
|
||||
testRouteDefinition2.setOrder(testRouteDefinition.getOrder() + 1);
|
||||
testClient.post().uri("http://localhost:" + port + "/actuator/gateway/routes/" + routeId2)
|
||||
.accept(MediaType.APPLICATION_JSON).body(BodyInserters.fromValue(testRouteDefinition2)).exchange()
|
||||
.expectStatus().isCreated();
|
||||
testClient.post().uri("http://localhost:" + port + "/actuator/gateway/refresh?metadata=groupBy:" + group2)
|
||||
.exchange().expectStatus().isOk();
|
||||
testClient.get().uri("http://localhost:" + port + "/actuator/gateway/routes").exchange().expectStatus().isOk()
|
||||
.expectBodyList(Map.class).consumeWith(result -> {
|
||||
List<Map> responseBody = result.getResponseBody();
|
||||
List ids = responseBody.stream()
|
||||
.map(route -> route.get("route_id"))
|
||||
.filter(id -> id.equals(routeId1) || id.equals(routeId2))
|
||||
.collect(Collectors.toList());
|
||||
assertThat(ids).containsExactly(routeId1, routeId2);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRefreshByGroup_whenRouteDefinitionsAreDeleted() {
|
||||
RouteDefinition testRouteDefinition = new RouteDefinition();
|
||||
|
||||
Reference in New Issue
Block a user