From 18b346def151bd9182a7dfc8638077faaced0183 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Mon, 9 Feb 2015 17:30:23 -0700 Subject: [PATCH] update the serviceId and location for statically configured routes that are also part of serviceDiscovery. fixes gh-199 --- .../zuul/filters/ProxyRouteLocator.java | 7 ++++--- .../netflix/zuul/filters/ZuulProperties.java | 4 ++++ .../zuul/filters/ProxyRouteLocatorTests.java | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRouteLocator.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRouteLocator.java index 5a377ce1..06fd3d2e 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRouteLocator.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ProxyRouteLocator.java @@ -153,16 +153,17 @@ public class ProxyRouteLocator implements RouteLocator { // Ignore specifically ignored services and those that were manually // configured String key = "/" + serviceId + "/**"; - ZuulRoute route = new ZuulRoute(key, serviceId); if (staticServices.containsKey(serviceId) && staticServices.get(serviceId).getUrl() == null) { // Explicitly configured with no URL, cannot be ignored - routesMap.put(key, route); + // all static routes are already in routesMap, just update + ZuulRoute staticRoute = staticServices.get(serviceId); + staticRoute.updateRoute(key, serviceId); } if (!PatternMatchUtils.simpleMatch(ignored, serviceId) && !routesMap.containsKey(key)) { // Not ignored - routesMap.put(key, route); + routesMap.put(key, new ZuulRoute(key, serviceId)); } } } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java index 3f9e7ea6..022be907 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/zuul/filters/ZuulProperties.java @@ -102,6 +102,10 @@ public class ZuulProperties { } public ZuulRoute(String path, String location) { + updateRoute(path, location); + } + + public void updateRoute(String path, String location) { this.id = extractId(path); this.path = path; setLocation(location); diff --git a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRouteLocatorTests.java b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRouteLocatorTests.java index 835272e4..233fecf0 100644 --- a/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRouteLocatorTests.java +++ b/spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/zuul/filters/ProxyRouteLocatorTests.java @@ -17,6 +17,7 @@ package org.springframework.cloud.netflix.zuul.filters; import java.util.Collections; +import java.util.LinkedHashMap; import java.util.Map; import org.junit.Before; @@ -31,6 +32,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; import static org.mockito.BDDMockito.given; import static org.mockito.MockitoAnnotations.initMocks; @@ -257,6 +259,23 @@ public class ProxyRouteLocatorTests { assertNotNull("routes ignored foo", serviceId); } + @Test + public void testIgnoredRoutePropertiesRemain() { + ZuulRoute route = new ZuulRoute("/foo/**"); + route.setStripPrefix(true); + route.setRetryable(Boolean.TRUE); + this.properties.getRoutes().put("foo", route); + ProxyRouteLocator routeLocator = new ProxyRouteLocator("/", this.discovery, + this.properties); + this.properties.setIgnoredServices(Collections.singletonList("*")); + given(this.discovery.getServices()).willReturn(Collections.singletonList("foo")); + LinkedHashMap routes = routeLocator.locateRoutes(); + ZuulRoute actual = routes.get(getMapping("foo")); + assertNotNull("routes ignored foo", actual); + assertTrue("stripPrefix is wrong", actual.isStripPrefix()); + assertEquals("retryable is wrong", Boolean.TRUE, actual.getRetryable()); + } + @Test public void testIgnoredRouteIncludedIfConfiguredAndNotDiscovered() { this.properties.getRoutes()