Skip to content

Commit 33f1821

Browse files
committed
feat(springboot cloudconfig): test cases for cloud config
Signed-off-by: lony2003 <[email protected]>
1 parent c8c1958 commit 33f1821

17 files changed

+327
-48
lines changed

dapr-spring/dapr-spring-boot-starters/dapr-spring-boot-starter/pom.xml

+5
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@
4545
<artifactId>dapr-spring-workflows</artifactId>
4646
<version>${project.parent.version}</version>
4747
</dependency>
48+
<dependency>
49+
<groupId>io.dapr.spring</groupId>
50+
<artifactId>dapr-spring-cloudconfig</artifactId>
51+
<version>${project.parent.version}</version>
52+
</dependency>
4853
</dependencies>
4954

5055
</project>

dapr-spring/dapr-spring-cloudconfig/pom.xml

+52
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,58 @@
2121
<version>${project.parent.version}</version>
2222
<scope>compile</scope>
2323
</dependency>
24+
25+
<dependency>
26+
<groupId>org.springframework.boot</groupId>
27+
<artifactId>spring-boot-starter-web</artifactId>
28+
<scope>test</scope>
29+
</dependency>
30+
<dependency>
31+
<groupId>org.testcontainers</groupId>
32+
<artifactId>testcontainers</artifactId>
33+
<scope>test</scope>
34+
</dependency>
35+
<dependency>
36+
<groupId>org.testcontainers</groupId>
37+
<artifactId>junit-jupiter</artifactId>
38+
<scope>test</scope>
39+
<exclusions>
40+
<exclusion>
41+
<groupId>com.vaadin.external.google</groupId>
42+
<artifactId>android-json</artifactId>
43+
</exclusion>
44+
</exclusions>
45+
</dependency>
46+
<dependency>
47+
<groupId>io.dapr</groupId>
48+
<artifactId>testcontainers-dapr</artifactId>
49+
<version>${dapr.sdk.alpha.version}</version>
50+
<scope>test</scope>
51+
</dependency>
2452
</dependencies>
2553

54+
<build>
55+
<plugins>
56+
<plugin>
57+
<groupId>com.github.spotbugs</groupId>
58+
<artifactId>spotbugs-maven-plugin</artifactId>
59+
<version>4.8.2.0</version>
60+
<configuration>
61+
<excludeFilterFile>./spotbugs-exclude.xml</excludeFilterFile>
62+
<failOnError>${spotbugs.fail}</failOnError>
63+
<xmlOutput>true</xmlOutput>
64+
</configuration>
65+
<executions>
66+
<execution>
67+
<id>validate</id>
68+
<phase>validate</phase>
69+
<goals>
70+
<goal>check</goal>
71+
</goals>
72+
</execution>
73+
</executions>
74+
</plugin>
75+
</plugins>
76+
</build>
77+
2678
</project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
3+
<FindBugsFilter>
4+
<Match>
5+
<Package name="~io\.dapr\.spring.*"/>
6+
<Bug pattern="EI_EXPOSE_REP"/>
7+
</Match>
8+
9+
<Match>
10+
<Package name="~io\.dapr\.spring.*"/>
11+
<Bug pattern="EI_EXPOSE_REP2"/>
12+
</Match>
13+
<Match>
14+
<Class name="~io.dapr.spring.boot.cloudconfig.configdata.*"/>
15+
<Bug pattern="NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE"/>
16+
</Match>
17+
</FindBugsFilter>

dapr-spring/dapr-spring-cloudconfig/src/main/java/io/dapr/spring/boot/cloudconfig/config/DaprCloudConfigClientManager.java

+9-13
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,16 @@
2222

2323
public class DaprCloudConfigClientManager {
2424

25-
private static DaprClient daprClient;
26-
private static DaprPreviewClient daprPreviewClient;
25+
private DaprClient daprClient;
26+
private DaprPreviewClient daprPreviewClient;
2727
private final DaprCloudConfigProperties daprCloudConfigProperties;
2828
private final DaprClientProperties daprClientConfig;
2929

3030
/**
3131
* Create a DaprCloudConfigClientManager to create Config-Specific Dapr Client.
3232
*
3333
* @param daprCloudConfigProperties Properties of Dapr Cloud Config
34-
* @param daprClientConfig Properties of Dapr Client
34+
* @param daprClientConfig Properties of Dapr Client
3535
*/
3636
public DaprCloudConfigClientManager(DaprCloudConfigProperties daprCloudConfigProperties,
3737
DaprClientProperties daprClientConfig) {
@@ -42,21 +42,17 @@ public DaprCloudConfigClientManager(DaprCloudConfigProperties daprCloudConfigPro
4242
createDaprConnectionDetails(daprClientConfig)
4343
);
4444

45-
if (DaprCloudConfigClientManager.daprClient == null) {
46-
DaprCloudConfigClientManager.daprClient = daprClientBuilder.build();
47-
}
45+
this.daprClient = daprClientBuilder.build();
4846

49-
if (DaprCloudConfigClientManager.daprPreviewClient == null) {
50-
DaprCloudConfigClientManager.daprPreviewClient = daprClientBuilder.buildPreviewClient();
51-
}
47+
this.daprPreviewClient = daprClientBuilder.buildPreviewClient();
5248
}
5349

54-
public static DaprPreviewClient getDaprPreviewClient() {
55-
return DaprCloudConfigClientManager.daprPreviewClient;
50+
public DaprPreviewClient getDaprPreviewClient() {
51+
return this.daprPreviewClient;
5652
}
5753

58-
public static DaprClient getDaprClient() {
59-
return DaprCloudConfigClientManager.daprClient;
54+
public DaprClient getDaprClient() {
55+
return this.daprClient;
6056
}
6157

6258
private DaprConnectionDetails createDaprConnectionDetails(DaprClientProperties properties) {

dapr-spring/dapr-spring-cloudconfig/src/main/java/io/dapr/spring/boot/cloudconfig/config/DaprCloudConfigProperties.java

+26
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,16 @@ public class DaprCloudConfigProperties {
2828
*/
2929
private Boolean enabled = true;
3030

31+
/**
32+
* whether enable dapr client wait for sidecar, if no response, will throw IOException.
33+
*/
34+
private Boolean waitSidecarEnabled = false;
35+
36+
/**
37+
* retries of dapr client wait for sidecar.
38+
*/
39+
private Integer waitSidecarRetries = 3;
40+
3141
/**
3242
* get config timeout (include wait for dapr sidecar).
3343
*/
@@ -48,4 +58,20 @@ public Boolean getEnabled() {
4858
public void setEnabled(Boolean enabled) {
4959
this.enabled = enabled;
5060
}
61+
62+
public Boolean getWaitSidecarEnabled() {
63+
return waitSidecarEnabled;
64+
}
65+
66+
public void setWaitSidecarEnabled(Boolean waitSidecarEnabled) {
67+
this.waitSidecarEnabled = waitSidecarEnabled;
68+
}
69+
70+
public Integer getWaitSidecarRetries() {
71+
return waitSidecarRetries;
72+
}
73+
74+
public void setWaitSidecarRetries(Integer waitSidecarRetries) {
75+
this.waitSidecarRetries = waitSidecarRetries;
76+
}
5177
}
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
package io.dapr.spring.boot.cloudconfig.configdata;
1515

16-
import io.dapr.spring.boot.cloudconfig.configdata.secret.DaprSecretStoreConfigDataResource;
1716
import org.springframework.boot.env.PropertySourceLoader;
1817
import org.springframework.core.env.PropertySource;
1918
import org.springframework.core.io.ByteArrayResource;
@@ -22,21 +21,22 @@
2221
import org.springframework.util.StringUtils;
2322

2423
import java.io.IOException;
24+
import java.nio.charset.StandardCharsets;
2525
import java.util.ArrayList;
2626
import java.util.HashMap;
2727
import java.util.List;
2828
import java.util.Map;
2929

30-
public class DaprSecretStoreConfigParserHandler {
30+
public class DaprCloudConfigParserHandler {
3131

3232
private static List<PropertySourceLoader> propertySourceLoaders;
3333

34-
private DaprSecretStoreConfigParserHandler() {
34+
private DaprCloudConfigParserHandler() {
3535
propertySourceLoaders = SpringFactoriesLoader
3636
.loadFactories(PropertySourceLoader.class, getClass().getClassLoader());
3737
}
3838

39-
public static DaprSecretStoreConfigParserHandler getInstance() {
39+
public static DaprCloudConfigParserHandler getInstance() {
4040
return ParserHandler.HANDLER;
4141
}
4242

@@ -85,18 +85,19 @@ private Map<String, Resource> getConfigResult(
8585
) {
8686
Map<String, Resource> result = new HashMap<>();
8787
if (DaprCloudConfigType.Doc.equals(type)) {
88-
configValue.forEach((key, value) -> result.put(key, new ByteArrayResource(value.getBytes())));
88+
configValue.forEach((key, value) -> result.put(key,
89+
new ByteArrayResource(value.getBytes(StandardCharsets.UTF_8))));
8990
} else {
9091
List<String> configList = new ArrayList<>();
9192
configValue.forEach((key, value) -> configList.add(String.format("%s=%s", key, value)));
92-
result.put("", new ByteArrayResource(String.join("\n", configList).getBytes()));
93+
result.put("", new ByteArrayResource(String.join("\n", configList).getBytes(StandardCharsets.UTF_8)));
9394
}
9495
return result;
9596
}
9697

9798
private static class ParserHandler {
9899

99-
private static final DaprSecretStoreConfigParserHandler HANDLER = new DaprSecretStoreConfigParserHandler();
100+
private static final DaprCloudConfigParserHandler HANDLER = new DaprCloudConfigParserHandler();
100101

101102
}
102103
}

dapr-spring/dapr-spring-cloudconfig/src/main/java/io/dapr/spring/boot/cloudconfig/configdata/config/DaprConfigurationConfigDataLoader.java

+18-12
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
import io.dapr.client.domain.GetConfigurationRequest;
1919
import io.dapr.spring.boot.cloudconfig.config.DaprCloudConfigClientManager;
2020
import io.dapr.spring.boot.cloudconfig.config.DaprCloudConfigProperties;
21-
import io.dapr.spring.boot.cloudconfig.configdata.DaprSecretStoreConfigParserHandler;
21+
import io.dapr.spring.boot.cloudconfig.configdata.DaprCloudConfigParserHandler;
2222
import org.apache.commons.logging.Log;
2323
import org.springframework.boot.context.config.ConfigData;
2424
import org.springframework.boot.context.config.ConfigDataLoader;
@@ -46,20 +46,20 @@ public class DaprConfigurationConfigDataLoader implements ConfigDataLoader<DaprC
4646

4747
private DaprClient daprClient;
4848

49-
private DaprCloudConfigProperties daprSecretStoreConfig;
49+
private DaprCloudConfigProperties daprCloudConfigProperties;
5050

5151
/**
5252
* Create a Config Data Loader to load config from Dapr Configuration api.
5353
*
5454
* @param logFactory logFactory
5555
* @param daprClient Dapr Client created
56-
* @param daprSecretStoreConfig Dapr Cloud Config Properties
56+
* @param daprCloudConfigProperties Dapr Cloud Config Properties
5757
*/
5858
public DaprConfigurationConfigDataLoader(DeferredLogFactory logFactory, DaprClient daprClient,
59-
DaprCloudConfigProperties daprSecretStoreConfig) {
59+
DaprCloudConfigProperties daprCloudConfigProperties) {
6060
this.log = logFactory.getLog(getClass());
6161
this.daprClient = daprClient;
62-
this.daprSecretStoreConfig = daprSecretStoreConfig;
62+
this.daprCloudConfigProperties = daprCloudConfigProperties;
6363
}
6464

6565

@@ -78,18 +78,24 @@ public ConfigData load(ConfigDataLoaderContext context, DaprConfigurationConfigD
7878
DaprCloudConfigClientManager daprClientSecretStoreConfigManager =
7979
getBean(context, DaprCloudConfigClientManager.class);
8080

81-
daprClient = DaprCloudConfigClientManager.getDaprClient();
82-
daprSecretStoreConfig = daprClientSecretStoreConfigManager.getDaprCloudConfigProperties();
81+
daprClient = daprClientSecretStoreConfigManager.getDaprClient();
82+
daprCloudConfigProperties = daprClientSecretStoreConfigManager.getDaprCloudConfigProperties();
8383

84-
waitForSidecar();
84+
if (!daprCloudConfigProperties.getEnabled()) {
85+
return ConfigData.EMPTY;
86+
}
87+
88+
if (daprCloudConfigProperties.getWaitSidecarEnabled()) {
89+
waitForSidecar();
90+
}
8591

8692
return fetchConfig(resource);
8793
}
8894

8995
private void waitForSidecar() throws IOException {
9096
try {
91-
daprClient.waitForSidecar(daprSecretStoreConfig.getTimeout())
92-
.retry(3)
97+
daprClient.waitForSidecar(daprCloudConfigProperties.getTimeout())
98+
.retry(daprCloudConfigProperties.getWaitSidecarRetries())
9399
.block();
94100
} catch (RuntimeException e) {
95101
log.info(e.getMessage(), e);
@@ -108,7 +114,7 @@ private ConfigData fetchConfig(DaprConfigurationConfigDataResource resource)
108114

109115
try {
110116
Map<String, ConfigurationItem> secretMap =
111-
secretMapMono.block(Duration.ofMillis(daprSecretStoreConfig.getTimeout()));
117+
secretMapMono.block(Duration.ofMillis(daprCloudConfigProperties.getTimeout()));
112118

113119
if (secretMap == null) {
114120
log.info("Config not found");
@@ -122,7 +128,7 @@ private ConfigData fetchConfig(DaprConfigurationConfigDataResource resource)
122128
configMap.put(value.getKey(), value.getValue());
123129
});
124130

125-
sourceList.addAll(DaprSecretStoreConfigParserHandler.getInstance().parseDaprSecretStoreData(
131+
sourceList.addAll(DaprCloudConfigParserHandler.getInstance().parseDaprSecretStoreData(
126132
resource.getStoreName(),
127133
configMap,
128134
resource.getType()

dapr-spring/dapr-spring-cloudconfig/src/main/java/io/dapr/spring/boot/cloudconfig/configdata/config/DaprConfigurationConfigDataLocationResolver.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,10 @@ public List<DaprConfigurationConfigDataResource> resolve(ConfigDataLocationResol
9393
UriComponents configUri = UriComponentsBuilder.fromUriString(fullConfig).build();
9494

9595
String storeName = configUri.getHost();
96-
String configName = StringUtils.hasText(configUri.getPath())
97-
? StringUtils.trimLeadingCharacter(configUri.getPath(), '/')
96+
97+
String configPath = configUri.getPath();
98+
String configName = StringUtils.hasText(configPath)
99+
? StringUtils.trimLeadingCharacter(configPath, '/')
98100
: null;
99101

100102
MultiValueMap<String, String> configQuery = configUri.getQueryParams();

dapr-spring/dapr-spring-cloudconfig/src/main/java/io/dapr/spring/boot/cloudconfig/configdata/secret/DaprSecretStoreConfigDataLoader.java

+16-10
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
import io.dapr.client.DaprClient;
1717
import io.dapr.spring.boot.cloudconfig.config.DaprCloudConfigClientManager;
1818
import io.dapr.spring.boot.cloudconfig.config.DaprCloudConfigProperties;
19-
import io.dapr.spring.boot.cloudconfig.configdata.DaprSecretStoreConfigParserHandler;
19+
import io.dapr.spring.boot.cloudconfig.configdata.DaprCloudConfigParserHandler;
2020
import org.apache.commons.logging.Log;
2121
import org.springframework.boot.context.config.ConfigData;
2222
import org.springframework.boot.context.config.ConfigDataLoader;
@@ -74,10 +74,16 @@ public ConfigData load(ConfigDataLoaderContext context, DaprSecretStoreConfigDat
7474
DaprCloudConfigClientManager daprCloudConfigClientManager =
7575
getBean(context, DaprCloudConfigClientManager.class);
7676

77-
daprClient = DaprCloudConfigClientManager.getDaprClient();
77+
daprClient = daprCloudConfigClientManager.getDaprClient();
7878
daprCloudConfigProperties = daprCloudConfigClientManager.getDaprCloudConfigProperties();
7979

80-
waitForSidecar();
80+
if (!daprCloudConfigProperties.getEnabled()) {
81+
return ConfigData.EMPTY;
82+
}
83+
84+
if (daprCloudConfigProperties.getWaitSidecarEnabled()) {
85+
waitForSidecar();
86+
}
8187

8288
if (resource.getSecretName() == null) {
8389
return fetchBulkSecret(resource);
@@ -89,11 +95,11 @@ public ConfigData load(ConfigDataLoaderContext context, DaprSecretStoreConfigDat
8995
private void waitForSidecar() throws IOException {
9096
try {
9197
daprClient.waitForSidecar(daprCloudConfigProperties.getTimeout())
92-
.retry(3)
98+
.retry(daprCloudConfigProperties.getWaitSidecarRetries())
9399
.block();
94100
} catch (RuntimeException e) {
95-
log.info("Failed to get secret from sidecar: " + e.getMessage(), e);
96-
throw new IOException("Failed to get secret from sidecar", e);
101+
log.info("Failed to wait for sidecar: " + e.getMessage(), e);
102+
throw new IOException("Failed to wait for sidecar", e);
97103
}
98104
}
99105

@@ -121,7 +127,7 @@ private ConfigData fetchBulkSecret(DaprSecretStoreConfigDataResource resource)
121127
List<PropertySource<?>> sourceList = new ArrayList<>();
122128

123129
for (Map.Entry<String, Map<String, String>> entry : secretMap.entrySet()) {
124-
sourceList.addAll(DaprSecretStoreConfigParserHandler.getInstance().parseDaprSecretStoreData(
130+
sourceList.addAll(DaprCloudConfigParserHandler.getInstance().parseDaprSecretStoreData(
125131
resource.getStoreName() + ":" + entry.getKey(),
126132
entry.getValue(),
127133
resource.getType()
@@ -155,16 +161,16 @@ private ConfigData fetchSecret(DaprSecretStoreConfigDataResource resource)
155161
}
156162

157163
List<PropertySource<?>> sourceList = new ArrayList<>(
158-
DaprSecretStoreConfigParserHandler.getInstance().parseDaprSecretStoreData(
164+
DaprCloudConfigParserHandler.getInstance().parseDaprSecretStoreData(
159165
resource.getStoreName() + ":" + resource.getSecretName(),
160166
secretMap,
161167
resource.getType()
162168
));
163169

164170
return new ConfigData(sourceList, IGNORE_IMPORTS, IGNORE_PROFILES, PROFILE_SPECIFIC);
165171
} catch (RuntimeException e) {
166-
log.info(e.getMessage(), e);
167-
throw new IOException("Failed to wait for sidecar", e);
172+
log.info("Failed to get secret from sidecar: " + e.getMessage(), e);
173+
throw new IOException("Failed to get secret from sidecar", e);
168174
}
169175
}
170176

0 commit comments

Comments
 (0)