From 5e0346c91e0ca05c53e7ce753b789d9539b1963d Mon Sep 17 00:00:00 2001 From: spencergibb Date: Wed, 8 Mar 2023 15:53:46 -0500 Subject: [PATCH] If consul token is not set, default to CONSUL_TOKEN env var This matches the behaviour of ConsulPropertySourceLocator which depends on ConsulConfigProperties that uses `@Value` which is not recognized in ConfigData. Fixes gh-738 --- pom.xml | 2 +- .../ConsulConfigDataLocationResolver.java | 7 +++++- ...ConsulConfigDataLocationResolverTests.java | 25 +++++++++++++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 8c998e67..31540bda 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ 1.0.3.RELEASE 3.1.7-SNAPSHOT 3.2.8-SNAPSHOT - 1.15.1 + 1.17.6 diff --git a/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolver.java b/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolver.java index 2bba719e..df8ede7d 100644 --- a/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolver.java +++ b/spring-cloud-consul-config/src/main/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolver.java @@ -212,9 +212,14 @@ public class ConsulConfigDataLocationResolver implements ConfigDataLocationResol .bind(ConsulConfigProperties.PREFIX, Bindable.of(ConsulConfigProperties.class), bindHandler) .orElseGet(ConsulConfigProperties::new); - if (StringUtils.isEmpty(properties.getName())) { + if (!StringUtils.hasText(properties.getName())) { properties.setName(binder.bind("spring.application.name", String.class).orElse("application")); } + + if (!StringUtils.hasText(properties.getAclToken())) { + properties.setAclToken(binder.bind("spring.cloud.consul.token", String.class) + .orElse(binder.bind("consul.token", String.class).orElse(null))); + } return properties; } diff --git a/spring-cloud-consul-config/src/test/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolverTests.java b/spring-cloud-consul-config/src/test/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolverTests.java index 7af3760c..cee033a4 100644 --- a/spring-cloud-consul-config/src/test/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolverTests.java +++ b/spring-cloud-consul-config/src/test/java/org/springframework/cloud/consul/config/ConsulConfigDataLocationResolverTests.java @@ -22,6 +22,8 @@ import java.util.stream.Collectors; import org.apache.commons.logging.LogFactory; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.springframework.boot.BootstrapRegistry.InstanceSupplier; import org.springframework.boot.DefaultBootstrapContext; @@ -30,6 +32,7 @@ import org.springframework.boot.context.config.ConfigDataLocationResolverContext import org.springframework.boot.context.config.Profiles; import org.springframework.boot.context.properties.bind.Binder; import org.springframework.cloud.consul.ConsulProperties; +import org.springframework.core.env.SystemEnvironmentPropertySource; import org.springframework.mock.env.MockEnvironment; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -81,6 +84,28 @@ public class ConsulConfigDataLocationResolverTests { assertThat(properties.getPort()).isEqualTo(8502); } + @ParameterizedTest + @ValueSource(strings = { "consul.token", "CONSUL_TOKEN", "spring.cloud.consul.token", "SPRING_CLOUD_CONSUL_TOKEN", + "spring.cloud.consul.config.acl-token" }) + public void testLoadConfigProperties(String property) { + MockEnvironment mockEnvironment = new MockEnvironment(); + String tokenValue = "mytoken"; + if (property.contains("_")) { + SystemEnvironmentPropertySource envPS = new SystemEnvironmentPropertySource("mocksysenv", + Collections.singletonMap(property, tokenValue)); + mockEnvironment.getPropertySources().addLast(envPS); + } + else { + mockEnvironment.setProperty(property, tokenValue); + } + Binder binder = Binder.get(mockEnvironment); + ConfigDataLocationResolverContext resolverContext = mock(ConfigDataLocationResolverContext.class); + when(resolverContext.getBinder()).thenReturn(binder); + when(resolverContext.getBootstrapContext()).thenReturn(new DefaultBootstrapContext()); + ConsulConfigProperties properties = createResolver().loadConfigProperties(resolverContext); + assertThat(properties.getAclToken()).isEqualTo(tokenValue); + } + private List toContexts(List locations) { return locations.stream().map(ConsulConfigDataResource::getContext).collect(Collectors.toList()); }