Updates ConfigData to use updated api

See gh-1715
This commit is contained in:
spencergibb
2020-10-16 13:23:35 -04:00
parent c0abdf32cc
commit 8c0c9384f2
7 changed files with 56 additions and 38 deletions

View File

@@ -67,7 +67,7 @@ public class ConfigServerBootstrapper implements Bootstrapper {
@FunctionalInterface
public interface LoaderInvocation
extends BiFunction<ConfigDataLoaderContext, ConfigServerConfigDataLocation, ConfigData> {
extends BiFunction<ConfigDataLoaderContext, ConfigServerConfigDataResource, ConfigData> {
}
@@ -75,13 +75,13 @@ public class ConfigServerBootstrapper implements Bootstrapper {
private final ConfigDataLoaderContext loaderContext;
private final ConfigServerConfigDataLocation location;
private final ConfigServerConfigDataResource location;
private final Binder binder;
private final LoaderInvocation invocation;
LoadContext(ConfigDataLoaderContext loaderContext, ConfigServerConfigDataLocation location, Binder binder,
LoadContext(ConfigDataLoaderContext loaderContext, ConfigServerConfigDataResource location, Binder binder,
LoaderInvocation invocation) {
Assert.notNull(loaderContext, "loaderContext may not be null");
Assert.notNull(location, "location may not be null");
@@ -97,7 +97,7 @@ public class ConfigServerBootstrapper implements Bootstrapper {
return this.loaderContext;
}
public ConfigServerConfigDataLocation getLocation() {
public ConfigServerConfigDataResource getLocation() {
return this.location;
}

View File

@@ -56,7 +56,7 @@ import static org.springframework.cloud.config.client.ConfigClientProperties.AUT
import static org.springframework.cloud.config.client.ConfigClientProperties.STATE_HEADER;
import static org.springframework.cloud.config.client.ConfigClientProperties.TOKEN_HEADER;
public class ConfigServerConfigDataLoader implements ConfigDataLoader<ConfigServerConfigDataLocation>, Ordered {
public class ConfigServerConfigDataLoader implements ConfigDataLoader<ConfigServerConfigDataResource>, Ordered {
protected final Log logger;
@@ -71,7 +71,7 @@ public class ConfigServerConfigDataLoader implements ConfigDataLoader<ConfigServ
@Override
// TODO: implement retry LoaderInterceptor
public ConfigData load(ConfigDataLoaderContext context, ConfigServerConfigDataLocation location) {
public ConfigData load(ConfigDataLoaderContext context, ConfigServerConfigDataResource resource) {
if (context.getBootstrapContext().isRegistered(ConfigServerInstanceMonitor.class)) {
// force initialization if needed
context.getBootstrapContext().get(ConfigServerInstanceMonitor.class);
@@ -79,13 +79,13 @@ public class ConfigServerConfigDataLoader implements ConfigDataLoader<ConfigServ
if (context.getBootstrapContext().isRegistered(LoaderInterceptor.class)) {
LoaderInterceptor interceptor = context.getBootstrapContext().get(LoaderInterceptor.class);
Binder binder = context.getBootstrapContext().get(Binder.class);
return interceptor.apply(new LoadContext(context, location, binder, this::doLoad));
return interceptor.apply(new LoadContext(context, resource, binder, this::doLoad));
}
return doLoad(context, location);
return doLoad(context, resource);
}
public ConfigData doLoad(ConfigDataLoaderContext context, ConfigServerConfigDataLocation location) {
ConfigClientProperties properties = location.getProperties();
public ConfigData doLoad(ConfigDataLoaderContext context, ConfigServerConfigDataResource resource) {
ConfigClientProperties properties = resource.getProperties();
List<PropertySource<?>> composite = new ArrayList<>();
Exception error = null;
String errorBody = null;
@@ -97,7 +97,7 @@ public class ConfigServerConfigDataLoader implements ConfigDataLoader<ConfigServ
String state = ConfigClientStateHolder.getState();
// Try all the labels until one works
for (String label : labels) {
Environment result = getRemoteEnvironment(context, location, label.trim(), state);
Environment result = getRemoteEnvironment(context, resource, label.trim(), state);
if (result != null) {
log(result);
@@ -137,13 +137,13 @@ public class ConfigServerConfigDataLoader implements ConfigDataLoader<ConfigServ
catch (Exception e) {
error = e;
}
if (properties.isFailFast() || !location.isOptional()) {
if (properties.isFailFast() || !resource.isOptional()) {
String reason;
if (properties.isFailFast()) {
reason = "the fail fast property is set";
}
else {
reason = "the location is not optional";
reason = "the resource is not optional";
}
throw new IllegalStateException("Could not locate PropertySource and " + reason + ", failing"
+ (errorBody == null ? "" : ": " + errorBody), error);
@@ -203,14 +203,14 @@ public class ConfigServerConfigDataLoader implements ConfigDataLoader<ConfigServ
}
}
protected Environment getRemoteEnvironment(ConfigDataLoaderContext context, ConfigServerConfigDataLocation location,
protected Environment getRemoteEnvironment(ConfigDataLoaderContext context, ConfigServerConfigDataResource resource,
String label, String state) {
ConfigClientProperties properties = location.getProperties();
ConfigClientProperties properties = resource.getProperties();
RestTemplate restTemplate = context.getBootstrapContext().get(RestTemplate.class);
String path = "/{name}/{profile}";
String name = properties.getName();
String profile = StringUtils.collectionToCommaDelimitedString(location.getProfiles().getAccepted());
String profile = StringUtils.collectionToCommaDelimitedString(resource.getProfiles().getAccepted());
String token = properties.getToken();
int noOfUrls = properties.getUri().length;
if (noOfUrls > 1) {

View File

@@ -26,8 +26,11 @@ import org.apache.commons.logging.Log;
import org.springframework.boot.BootstrapRegistry.InstanceSupplier;
import org.springframework.boot.ConfigurableBootstrapContext;
import org.springframework.boot.context.config.ConfigDataLocation;
import org.springframework.boot.context.config.ConfigDataLocationNotFoundException;
import org.springframework.boot.context.config.ConfigDataLocationResolver;
import org.springframework.boot.context.config.ConfigDataLocationResolverContext;
import org.springframework.boot.context.config.ConfigDataResourceNotFoundException;
import org.springframework.boot.context.config.Profiles;
import org.springframework.boot.context.properties.bind.Bindable;
import org.springframework.boot.context.properties.bind.Binder;
@@ -40,7 +43,7 @@ import static org.springframework.cloud.config.client.ConfigClientProperties.AUT
import static org.springframework.cloud.config.client.ConfigClientProperties.CONFIG_DISCOVERY_ENABLED;
public class ConfigServerConfigDataLocationResolver
implements ConfigDataLocationResolver<ConfigServerConfigDataLocation>, Ordered {
implements ConfigDataLocationResolver<ConfigServerConfigDataResource>, Ordered {
/**
* Prefix for Config Server imports.
@@ -94,8 +97,9 @@ public class ConfigServerConfigDataLocationResolver
return this.log;
}
public boolean isResolvable(ConfigDataLocationResolverContext context, String location) {
if (!location.startsWith(getPrefix())) {
@Override
public boolean isResolvable(ConfigDataLocationResolverContext context, ConfigDataLocation location) {
if (!location.hasPrefix(getPrefix())) {
return false;
}
return context.getBinder().bind(ConfigClientProperties.PREFIX + ".enabled", Boolean.class).orElse(true);
@@ -105,17 +109,20 @@ public class ConfigServerConfigDataLocationResolver
return PREFIX;
}
public List<ConfigServerConfigDataLocation> resolve(ConfigDataLocationResolverContext context, String location,
boolean optional) {
@Override
public List<ConfigServerConfigDataResource> resolve(ConfigDataLocationResolverContext context,
ConfigDataLocation location)
throws ConfigDataLocationNotFoundException, ConfigDataResourceNotFoundException {
return Collections.emptyList();
}
public List<ConfigServerConfigDataLocation> resolveProfileSpecific(
ConfigDataLocationResolverContext resolverContext, String location, boolean optional, Profiles profiles) {
@Override
public List<ConfigServerConfigDataResource> resolveProfileSpecific(
ConfigDataLocationResolverContext resolverContext, ConfigDataLocation location, Profiles profiles)
throws ConfigDataLocationNotFoundException {
ConfigClientProperties properties = loadProperties(resolverContext.getBinder());
String uris = (location.startsWith(getPrefix())) ? location.substring(getPrefix().length()) : location;
String uris = location.getNonPrefixedValue(getPrefix());
if (StringUtils.hasText(uris)) {
String[] uri = StringUtils.commaDelimitedListToStringArray(uris);
@@ -159,8 +166,8 @@ public class ConfigServerConfigDataLocationResolver
});
}
List<ConfigServerConfigDataLocation> locations = new ArrayList<>();
locations.add(new ConfigServerConfigDataLocation(properties, optional, profiles));
List<ConfigServerConfigDataResource> locations = new ArrayList<>();
locations.add(new ConfigServerConfigDataResource(properties, location.isOptional(), profiles));
return locations;
}

View File

@@ -18,11 +18,11 @@ package org.springframework.cloud.config.client;
import java.util.Objects;
import org.springframework.boot.context.config.ConfigDataLocation;
import org.springframework.boot.context.config.ConfigDataResource;
import org.springframework.boot.context.config.Profiles;
import org.springframework.core.style.ToStringCreator;
public class ConfigServerConfigDataLocation extends ConfigDataLocation {
public class ConfigServerConfigDataResource extends ConfigDataResource {
private final ConfigClientProperties properties;
@@ -30,7 +30,7 @@ public class ConfigServerConfigDataLocation extends ConfigDataLocation {
private final Profiles profiles;
public ConfigServerConfigDataLocation(ConfigClientProperties properties, boolean optional, Profiles profiles) {
public ConfigServerConfigDataResource(ConfigClientProperties properties, boolean optional, Profiles profiles) {
this.properties = properties;
this.optional = optional;
this.profiles = profiles;
@@ -56,7 +56,7 @@ public class ConfigServerConfigDataLocation extends ConfigDataLocation {
if (o == null || getClass() != o.getClass()) {
return false;
}
ConfigServerConfigDataLocation that = (ConfigServerConfigDataLocation) o;
ConfigServerConfigDataResource that = (ConfigServerConfigDataResource) o;
return Objects.equals(this.properties, that.properties) && Objects.equals(this.optional, that.optional)
&& Objects.equals(this.profiles, that.profiles);
}

View File

@@ -19,6 +19,7 @@ package org.springframework.cloud.config.client;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.springframework.boot.context.config.ConfigDataLocation;
import org.springframework.boot.context.config.ConfigDataLocationResolverContext;
import org.springframework.boot.context.properties.bind.Binder;
import org.springframework.boot.logging.DeferredLog;
@@ -48,18 +49,18 @@ public class ConfigServerConfigDataLocationResolverTests {
@Test
void isResolvableReturnsFalseWithIncorrectPrefix() {
assertThat(this.resolver.isResolvable(this.context, "test:")).isFalse();
assertThat(this.resolver.isResolvable(this.context, ConfigDataLocation.of("test:"))).isFalse();
}
@Test
void isResolvableReturnsTrueWithCorrectPrefix() {
assertThat(this.resolver.isResolvable(this.context, "configserver:")).isTrue();
assertThat(this.resolver.isResolvable(this.context, ConfigDataLocation.of("configserver:"))).isTrue();
}
@Test
void isResolvableReturnsFalseWhenDisabled() {
this.environment.setProperty(ConfigClientProperties.PREFIX + ".enabled", "false");
assertThat(this.resolver.isResolvable(this.context, "configserver:")).isFalse();
assertThat(this.resolver.isResolvable(this.context, ConfigDataLocation.of("configserver:"))).isFalse();
}
}

View File

@@ -54,8 +54,7 @@ public class NativeEnvironmentRepository implements EnvironmentRepository, Searc
private static final String[] DEFAULT_LOCATIONS = new String[] { "classpath:/", "classpath:/config/", "file:./",
"file:./config/" };
private static final Pattern RESOURCE_PATTERN = Pattern
.compile("Resource config '(.*?)' imported via location \".*\"");
static final Pattern RESOURCE_PATTERN = Pattern.compile("Config resource '(.*?)' via location.*");
private static Log logger = LogFactory.getLog(NativeEnvironmentRepository.class);
@@ -213,7 +212,7 @@ public class NativeEnvironmentRepository implements EnvironmentRepository, Searc
map.put("spring.config.location",
StringUtils.arrayToCommaDelimitedString(getLocations(application, profile, label).getLocations()));
// globally ignore config files that are not found
map.put("spring.config.on-location-not-found", "ignore");
map.put("spring.config.on-not-found", "IGNORE");
environment.getPropertySources().addFirst(new MapPropertySource("config-data-setup", map));
return environment;
}

View File

@@ -16,6 +16,8 @@
package org.springframework.cloud.config.server.environment;
import java.util.regex.Matcher;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
@@ -42,7 +44,8 @@ public class NativeEnvironmentRepositoryTests {
@Before
public void init() {
ConfigurableApplicationContext context = new SpringApplicationBuilder(NativeEnvironmentRepositoryTests.class)
.web(WebApplicationType.NONE).run();
.properties("logging.level.org.springframework.boot.context.config=TRACE").web(WebApplicationType.NONE)
.run();
this.repository = new NativeEnvironmentRepository(context.getEnvironment(), new NativeEnvironmentProperties());
this.repository.setVersion("myversion");
this.repository.setDefaultLabel(null);
@@ -215,4 +218,12 @@ public class NativeEnvironmentRepositoryTests {
+ " ^\n");
}
@Test
public void resourcePatternWorks() {
String name = "Config resource 'abc' via location '123'";
Matcher matcher = NativeEnvironmentRepository.RESOURCE_PATTERN.matcher(name);
assertThat(matcher.find()).isTrue();
assertThat(matcher.group(1)).isEqualTo("abc");
}
}