Skip to content
This repository was archived by the owner on Aug 28, 2024. It is now read-only.

Commit 4e657ca

Browse files
ShichaoQiusuperrdean
authored andcommitted
refine the property binding logic using spring binder api (#810)
1 parent 2fae636 commit 4e657ca

File tree

4 files changed

+19
-26
lines changed

4 files changed

+19
-26
lines changed

azure-spring-boot-tests/azure-spring-boot-test-keyvault/src/test/java/com/microsoft/azure/test/keyvault/KeyVaultIT.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ public void keyVaultAsPropertySourceWithSpecificKeys() {
113113
app.property("azure.keyvault.client-id", access.clientId());
114114
app.property("azure.keyvault.client-key", access.clientSecret());
115115
app.property("azure.keyvault.tenant-id", access.tenant());
116-
app.property("azure.keyvault.secret.keys", "key");
116+
app.property("azure.keyvault.secret.keys", "key , azure-cosmosdb-key");
117117

118118
app.start();
119119
assertEquals(KEY_VAULT_VALUE, app.getProperty("key"));

azure-spring-boot/src/main/java/com/microsoft/azure/keyvault/spring/KeyVaultEnvironmentPostProcessorHelper.java

+8-1
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,19 @@
1515
import com.azure.security.keyvault.secrets.SecretClientBuilder;
1616
import com.microsoft.azure.telemetry.TelemetrySender;
1717
import lombok.extern.slf4j.Slf4j;
18+
19+
import org.springframework.boot.context.properties.bind.Bindable;
20+
import org.springframework.boot.context.properties.bind.Binder;
1821
import org.springframework.core.env.ConfigurableEnvironment;
1922
import org.springframework.core.env.MutablePropertySources;
2023
import org.springframework.core.env.StandardEnvironment;
2124
import org.springframework.util.Assert;
2225
import org.springframework.util.ClassUtils;
2326
import org.springframework.util.StringUtils;
2427

28+
import java.util.Collections;
2529
import java.util.HashMap;
30+
import java.util.List;
2631
import java.util.Map;
2732
import java.util.Optional;
2833

@@ -45,7 +50,9 @@ public void addKeyVaultPropertySource() {
4550
final Long refreshInterval = Optional.ofNullable(
4651
this.environment.getProperty(Constants.AZURE_KEYVAULT_REFRESH_INTERVAL))
4752
.map(Long::valueOf).orElse(Constants.DEFAULT_REFRESH_INTERVAL_MS);
48-
final String secretKeys = this.environment.getProperty(Constants.AZURE_KEYVAULT_SECRET_KEYS);
53+
final Binder binder = Binder.get(this.environment);
54+
final List<String> secretKeys = binder.bind(Constants.AZURE_KEYVAULT_SECRET_KEYS, Bindable.listOf(String.class))
55+
.orElse(Collections.emptyList());
4956

5057
final TokenCredential tokenCredential = getCredentials();
5158
final SecretClient secretClient = new SecretClientBuilder()

azure-spring-boot/src/main/java/com/microsoft/azure/keyvault/spring/KeyVaultOperation.java

+6-20
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import org.springframework.util.StringUtils;
1717

1818
import java.util.ArrayList;
19+
import java.util.List;
1920
import java.util.Locale;
2021
import java.util.concurrent.atomic.AtomicLong;
2122
import java.util.concurrent.locks.ReadWriteLock;
@@ -24,7 +25,7 @@
2425
@Slf4j
2526
public class KeyVaultOperation {
2627
private final long cacheRefreshIntervalInMs;
27-
private final String[] secretKeys;
28+
private final List<String> secretKeys;
2829

2930
private final Object refreshLock = new Object();
3031
private final SecretClient keyVaultClient;
@@ -39,30 +40,15 @@ public class KeyVaultOperation {
3940
public KeyVaultOperation(final SecretClient keyVaultClient,
4041
String vaultUri,
4142
final long refreshInterval,
42-
final String secretKeysConfig) {
43+
final List<String> secretKeys) {
4344
this.cacheRefreshIntervalInMs = refreshInterval;
44-
this.secretKeys = parseSecretKeys(secretKeysConfig);
45+
this.secretKeys = secretKeys;
4546
this.keyVaultClient = keyVaultClient;
4647
// TODO(pan): need to validate why last '/' need to be truncated.
4748
this.vaultUri = StringUtils.trimTrailingCharacter(vaultUri.trim(), '/');
4849
fillSecretsList();
4950
}
5051

51-
private String[] parseSecretKeys(String secretKeysConfig) {
52-
if (StringUtils.isEmpty(secretKeysConfig)) {
53-
log.info("specific secret keys haven't set, so apply global list mode");
54-
return new String[0];
55-
}
56-
57-
final String[] split = secretKeysConfig.split(",");
58-
if (split.length == 0) {
59-
log.info("specific secret keys haven't set, so apply global list mode");
60-
return new String[0];
61-
}
62-
63-
return split;
64-
}
65-
6652
public String[] list() {
6753
try {
6854
this.rwLock.readLock().lock();
@@ -106,7 +92,7 @@ public String get(final String property) {
10692
final String secretName = getKeyvaultSecretName(property);
10793

10894
//if user don't set specific secret keys, then refresh token
109-
if (this.secretKeys == null || secretKeys.length == 0) {
95+
if (this.secretKeys == null || secretKeys.size() == 0) {
11096
// refresh periodically
11197
refreshPropertyNames();
11298
}
@@ -132,7 +118,7 @@ private void refreshPropertyNames() {
132118
private void fillSecretsList() {
133119
try {
134120
this.rwLock.writeLock().lock();
135-
if (this.secretKeys == null || secretKeys.length == 0) {
121+
if (this.secretKeys == null || secretKeys.size() == 0) {
136122
this.propertyNames.clear();
137123

138124
final PagedIterable<SecretProperties> secretProperties = keyVaultClient.listPropertiesOfSecrets();

azure-spring-boot/src/test/java/com/microsoft/azure/keyvault/spring/KeyVaultOperationUnitTest.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
@RunWith(MockitoJUnitRunner.class)
2727
public class KeyVaultOperationUnitTest {
28-
private static final String secretKeysConfig = "key1,key2,key3";
28+
private static final List<String> secretKeysConfig = Arrays.asList("key1", "key2", "key3");
2929

3030
private static final String testPropertyName1 = "testPropertyName1";
3131

@@ -54,7 +54,7 @@ public class KeyVaultOperationUnitTest {
5454
private SecretClient keyVaultClient;
5555
private KeyVaultOperation keyVaultOperation;
5656

57-
public void setupSecretBundle(String id, String value, String secretKeysConfig) {
57+
public void setupSecretBundle(String id, String value, List<String> secretKeysConfig) {
5858
//provision for list
5959
when(keyVaultClient.listPropertiesOfSecrets()).thenReturn(new MockPage(new PagedFlux<>(() -> null), id));
6060
//provison for get
@@ -98,7 +98,7 @@ public void testList() {
9898
setupSecretBundle(testPropertyName1, testPropertyName1, secretKeysConfig);
9999
final String[] specificResult = keyVaultOperation.list();
100100
assertThat(specificResult.length).isEqualTo(3);
101-
assertThat(specificResult[0]).isEqualTo(secretKeysConfig.split(",")[0]);
101+
assertThat(specificResult[0]).isEqualTo(secretKeysConfig.get(0));
102102
}
103103

104104
@Test
@@ -111,7 +111,7 @@ public void setTestSpringRelaxedBindingNames() {
111111
);
112112

113113
//test list with specific secret key configs
114-
setupSecretBundle(TEST_AZURE_KEYVAULT_NAME, TEST_AZURE_KEYVAULT_NAME, TEST_AZURE_KEYVAULT_NAME);
114+
setupSecretBundle(TEST_AZURE_KEYVAULT_NAME, TEST_AZURE_KEYVAULT_NAME, Arrays.asList(TEST_AZURE_KEYVAULT_NAME));
115115
TEST_SPRING_RELAXED_BINDING_NAMES.forEach(
116116
n -> assertThat(keyVaultOperation.get(n)).isEqualTo(TEST_AZURE_KEYVAULT_NAME)
117117
);

0 commit comments

Comments
 (0)