Skip to content

Commit 7f78ab7

Browse files
VaultTemplate refactor (#63)
* VaultTemplate --------- Signed-off-by: Anders Swanson <anders.swanson@oracle.com>
1 parent 8c9a638 commit 7f78ab7

File tree

10 files changed

+69
-55
lines changed

10 files changed

+69
-55
lines changed

docs/src/main/asciidoc/getting-started.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ The following table highlights several samples of the most used integrations in
8282
| Oracle Autonomous Database
8383
| https://github.com/oracle/spring-cloud-oci/tree/main/spring-cloud-oci-samples/spring-cloud-oci-adb-samples[spring-cloud-oci-adb-samples]
8484

85-
| Generative AI
85+
| Generative AI
8686
| https://github.com/oracle/spring-cloud-oci/tree/main/spring-cloud-oci-samples/spring-cloud-oci-gen-ai-sample[spring-cloud-oci-gen-ai-sample]
8787

8888
| Vault

docs/src/main/asciidoc/vault.adoc

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ dependencies {
2828
=== Using VaultPropertySource
2929

3030
By configuring Vault as a property source, secrets can be dynamically loaded from OCI Vault into the Spring application context.
31-
For each vault specified as a property source, Spring will inject secrets as properties identified by their name.
31+
For each Vault specified as a property source, Spring will inject secrets as properties identified by their name.
3232

3333
[source,yaml]
3434
----
@@ -58,10 +58,10 @@ spring:
5858
String secretValue;
5959
----
6060

61-
=== Using Vault APIs in an application
61+
=== Using VaultTemplate
6262

63-
The starter automatically configures and registers an `Vault` bean in the Spring application context.
64-
The `Vault` bean can be used to create, update, list, and delete secrets in an OCI Vault
63+
The starter automatically configures and registers an `VaultTemplate` bean in the Spring application context.
64+
The `VaultTemplate` bean can be used to create, update, list, and delete secrets in an OCI Vault
6565

6666
[source,yaml]
6767
----
@@ -81,11 +81,11 @@ spring:
8181
[source,java]
8282
----
8383
@Autowired
84-
private Vault vault;
84+
private VaultTemplate vaultTemplate;
8585
8686
public String getSecretByName(String secretName) {
87-
GetSecretBundleByNameResponse bundle = vault.getSecret(secretName);
88-
return vault.decodeBundle(bundle);
87+
GetSecretBundleByNameResponse bundle = vaultTemplate.getSecret(secretName);
88+
return vaultTemplate.decodeBundle(bundle);
8989
}
9090
9191
----

spring-cloud-oci-autoconfigure/src/main/java/com/oracle/cloud/spring/vault/VaultAutoConfiguration.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@
2727
* {@link com.oracle.cloud.spring.autoconfigure.core.RegionProviderAutoConfiguration}
2828
* for loading the Authentication configuration
2929
*
30-
* @see Vault
30+
* @see VaultTemplate
3131
*/
3232
@AutoConfiguration
33-
@ConditionalOnClass({Vault.class})
33+
@ConditionalOnClass({VaultTemplate.class})
3434
@EnableConfigurationProperties(VaultProperties.class)
3535
@ConditionalOnProperty(name = "spring.cloud.oci.vault.enabled", havingValue = "true", matchIfMissing = true)
3636
public class VaultAutoConfiguration {
@@ -42,9 +42,9 @@ public VaultAutoConfiguration(VaultProperties properties) {
4242

4343
@Bean
4444
@RefreshScope
45-
@ConditionalOnMissingBean(Vault.class)
46-
public Vault vault(Vaults vaults, Secrets secrets) {
47-
return new VaultImpl(vaults, secrets, properties.getVaultId(), properties.getCompartment());
45+
@ConditionalOnMissingBean(VaultTemplate.class)
46+
public VaultTemplate vault(Vaults vaults, Secrets secrets) {
47+
return new VaultTemplateImpl(vaults, secrets, properties.getVaultId(), properties.getCompartment());
4848
}
4949

5050
@Bean

spring-cloud-oci-autoconfigure/src/main/java/com/oracle/cloud/spring/vault/VaultEnvironmentPostProcessor.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727

2828
/**
2929
* Injects a VaultPropertySource for each OCI Vault property source specified in the application properties.
30-
* OCI Vault property sources will only be loaded if the com.oracle.cloud.spring.vault.Vault class is on the classpath.
30+
* OCI Vault property sources will only be loaded if the com.oracle.cloud.spring.vault.VaulTemplate class is on the classpath.
3131
*/
3232
public class VaultEnvironmentPostProcessor implements EnvironmentPostProcessor, Ordered {
3333
@Override
@@ -51,8 +51,8 @@ public void postProcessEnvironment(ConfigurableEnvironment environment, SpringAp
5151
// Inject VaultPropertySources into the system property sources
5252
MutablePropertySources propertySources = environment.getPropertySources();
5353
for (VaultPropertySourceProperties properties : vaultProperties.getPropertySources()) {
54-
Vault vault = new VaultImpl(vaultClient, secretsClient, properties.getVaultId(), vaultProperties.getCompartment());
55-
VaultPropertyLoader vaultPropertyLoader = new VaultPropertyLoader(vault, vaultProperties.getPropertyRefreshInterval());
54+
VaultTemplate vaultTemplate = new VaultTemplateImpl(vaultClient, secretsClient, properties.getVaultId(), vaultProperties.getCompartment());
55+
VaultPropertyLoader vaultPropertyLoader = new VaultPropertyLoader(vaultTemplate, vaultProperties.getPropertyRefreshInterval());
5656
VaultPropertySource vaultPropertySource = new VaultPropertySource(properties.getVaultId(), vaultPropertyLoader);
5757
if (propertySources.contains(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME)) {
5858
propertySources.addAfter(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, vaultPropertySource);
@@ -69,7 +69,7 @@ public int getOrder() {
6969
}
7070

7171
private boolean areClassesLoaded() {
72-
return ClassUtils.isPresent("com.oracle.cloud.spring.vault.Vault", VaultEnvironmentPostProcessor.class.getClassLoader());
72+
return ClassUtils.isPresent("com.oracle.cloud.spring.vault.VaultTemplate", VaultEnvironmentPostProcessor.class.getClassLoader());
7373
}
7474

7575
private CredentialsProvider getCredentialsProvider(CredentialsProperties credentialsProperties) {

spring-cloud-oci-autoconfigure/src/main/java/com/oracle/cloud/spring/vault/VaultPropertyLoader.java

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@
1616
public class VaultPropertyLoader implements AutoCloseable {
1717
private static Timer timer;
1818

19-
private final Vault vault;
20-
private final Map<String, Object> properties = new LinkedHashMap<>();
19+
private final VaultTemplate vaultTemplate;
20+
private Map<String, String> properties = new LinkedHashMap<>();
2121

22-
public VaultPropertyLoader(Vault vault, Duration refresh) {
23-
this.vault = vault;
22+
public VaultPropertyLoader(VaultTemplate vaultTemplate, Duration refresh) {
23+
this.vaultTemplate = vaultTemplate;
2424
reload();
2525
long refreshMillis = Optional.ofNullable(refresh)
2626
.orElse(Duration.ofMinutes(10))
@@ -54,12 +54,7 @@ String[] getPropertyNames() {
5454
}
5555

5656
private void reload() {
57-
List<SecretSummary> secrets = vault.listSecrets();
58-
for (SecretSummary secretSummary : secrets) {
59-
GetSecretBundleByNameResponse getSecretResponse = vault.getSecret(secretSummary.getSecretName());
60-
String secretValue = vault.decodeBundle(getSecretResponse);
61-
properties.put(secretSummary.getSecretName(), secretValue);
62-
}
57+
properties = vaultTemplate.getAllSecrets();
6358
}
6459

6560
@Override

spring-cloud-oci-samples/spring-cloud-oci-vault-sample/src/main/java/com/oracle/cloud/spring/sample/vault/springcloudocivaultsample/VaultController.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
package com.oracle.cloud.spring.sample.vault.springcloudocivaultsample;
44

55
import com.oracle.bmc.secrets.responses.GetSecretBundleByNameResponse;
6-
import com.oracle.cloud.spring.vault.Vault;
6+
import com.oracle.cloud.spring.vault.VaultTemplate;
77
import io.swagger.v3.oas.annotations.tags.Tag;
88
import org.springframework.beans.factory.annotation.Value;
99
import org.springframework.http.ResponseEntity;
@@ -20,16 +20,16 @@ public class VaultController {
2020
@Value("${mysecret}")
2121
private String vaultSecretValue;
2222

23-
private final Vault vault;
23+
private final VaultTemplate vaultTemplate;
2424

25-
public VaultController(Vault vault) {
26-
this.vault = vault;
25+
public VaultController(VaultTemplate vaultTemplate) {
26+
this.vaultTemplate = vaultTemplate;
2727
}
2828

2929
@GetMapping("secret")
3030
public ResponseEntity<?> getSecret(@RequestParam String secretName) {
31-
GetSecretBundleByNameResponse secret = vault.getSecret(secretName);
32-
return ResponseEntity.ok(vault.decodeBundle(secret));
31+
GetSecretBundleByNameResponse secret = vaultTemplate.getSecret(secretName);
32+
return ResponseEntity.ok(vaultTemplate.decodeBundle(secret));
3333
}
3434

3535
public String getVaultSecretValue() {
Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import com.oracle.bmc.vault.model.SecretSummary;
1212
import com.oracle.bmc.vault.model.UpdateSecretDetails;
1313
import com.oracle.bmc.vault.responses.UpdateSecretResponse;
14-
import com.oracle.cloud.spring.vault.Vault;
14+
import com.oracle.cloud.spring.vault.VaultTemplate;
1515
import org.junit.jupiter.api.Test;
1616
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable;
1717
import org.springframework.beans.factory.annotation.Autowired;
@@ -26,9 +26,9 @@
2626
@SpringBootTest
2727
@EnabledIfEnvironmentVariable(named = "OCI_COMPARTMENT_ID", matches = ".+")
2828
@EnabledIfEnvironmentVariable(named = "OCI_VAULT_ID", matches = ".+")
29-
public class VaultIT {
29+
public class VaultTemplateIT {
3030
@Autowired
31-
Vault vault;
31+
VaultTemplate vaultTemplate;
3232

3333
@Autowired
3434
VaultController vaultController;
@@ -37,8 +37,8 @@ public class VaultIT {
3737

3838
@Test
3939
void getSecret() {
40-
GetSecretBundleByNameResponse secret = vault.getSecret(secretName);
41-
String decoded = vault.decodeBundle(secret);
40+
GetSecretBundleByNameResponse secret = vaultTemplate.getSecret(secretName);
41+
String decoded = vaultTemplate.decodeBundle(secret);
4242
assertThat(decoded).isNotNull();
4343
assertThat(decoded).hasSizeGreaterThan(1);
4444
}
@@ -50,15 +50,15 @@ void updateSecret() {
5050
.content(Base64.getEncoder().encodeToString(content.getBytes()))
5151
.name(content)
5252
.build();
53-
UpdateSecretResponse response = vault.updateSecret(secretName, UpdateSecretDetails.builder()
53+
UpdateSecretResponse response = vaultTemplate.updateSecret(secretName, UpdateSecretDetails.builder()
5454
.secretContent(contentDetails)
5555
.build());
5656
assertThat(response.getSecret()).isNotNull();
5757
}
5858

5959
@Test
6060
void listSecret() {
61-
List<SecretSummary> summaries = vault.listSecrets();
61+
List<SecretSummary> summaries = vaultTemplate.listSecrets();
6262
assertThat(summaries).hasSize(1);
6363
}
6464

spring-cloud-oci-vault/src/main/java/com/oracle/cloud/spring/vault/Vault.java renamed to spring-cloud-oci-vault/src/main/java/com/oracle/cloud/spring/vault/VaultTemplate.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.nio.charset.StandardCharsets;
66
import java.util.Base64;
77
import java.util.List;
8+
import java.util.Map;
89

910
import com.oracle.bmc.secrets.model.Base64SecretBundleContentDetails;
1011
import com.oracle.bmc.secrets.model.SecretBundleContentDetails;
@@ -17,17 +18,24 @@
1718
import com.oracle.bmc.vault.responses.UpdateSecretResponse;
1819

1920
/**
20-
* The Vault interface defines the API for accessing OCI Vault Service.
21+
* The VaultTemplate interface defines the API for accessing OCI Vault Service.
2122
* Users can retrieve, create, update, list, and delete secrets within an OCI Vault.
2223
*/
23-
public interface Vault {
24+
public interface VaultTemplate {
2425
/**
2526
* Retrieves a secret by name.
2627
* @param secretName The name of the secret.
2728
* @return The secret bundle response.
2829
*/
2930
GetSecretBundleByNameResponse getSecret(String secretName);
3031

32+
/**
33+
* Retrieve all secrets from the Vault.
34+
*
35+
* @return A mapping of secret names to secret values.
36+
*/
37+
Map<String, String> getAllSecrets();
38+
3139
/**
3240
* Lists all secrets in the Vault.
3341
* @return A list of secret summaries.

spring-cloud-oci-vault/src/main/java/com/oracle/cloud/spring/vault/VaultImpl.java renamed to spring-cloud-oci-vault/src/main/java/com/oracle/cloud/spring/vault/VaultTemplateImpl.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@
55
import java.text.SimpleDateFormat;
66
import java.util.ArrayList;
77
import java.util.Calendar;
8+
import java.util.LinkedHashMap;
89
import java.util.List;
10+
import java.util.Map;
911

1012
import com.oracle.bmc.secrets.Secrets;
1113
import com.oracle.bmc.secrets.requests.GetSecretBundleByNameRequest;
@@ -27,17 +29,17 @@
2729

2830
/**
2931
* Default implementation for Vault interface.
30-
* @see Vault
32+
* @see VaultTemplate
3133
*/
32-
public class VaultImpl implements Vault {
34+
public class VaultTemplateImpl implements VaultTemplate {
3335
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd");
3436

3537
private final Vaults vaults;
3638
private final Secrets secrets;
3739
private final String vaultId;
3840
private final String compartmentId;
3941

40-
public VaultImpl(Vaults vaults, Secrets secrets, String vaultId, String compartmentId) {
42+
public VaultTemplateImpl(Vaults vaults, Secrets secrets, String vaultId, String compartmentId) {
4143
Assert.notNull(vaults, "vaults must not be null");
4244
Assert.notNull(secrets, "secrets must not be null");
4345
Assert.hasText(vaultId, "vaultId must not be empty");
@@ -63,6 +65,16 @@ public GetSecretBundleByNameResponse getSecret(String secretName) {
6365
return secrets.getSecretBundleByName(request);
6466
}
6567

68+
@Override
69+
public Map<String, String> getAllSecrets() {
70+
LinkedHashMap<String, String> secrets = new LinkedHashMap<>();
71+
for (SecretSummary secretSummary : listSecrets()) {
72+
GetSecretBundleByNameResponse bundle = getSecret(secretSummary.getSecretName());
73+
secrets.put(secretSummary.getSecretName(), decodeBundle(bundle));
74+
}
75+
return secrets;
76+
}
77+
6678
/**
6779
* Create a secret.
6880
* @param secretName The name of the secret being created.

spring-cloud-oci-vault/src/test/java/com/oracle/cloud/spring/vault/VaultImplTest.java renamed to spring-cloud-oci-vault/src/test/java/com/oracle/cloud/spring/vault/VaultTemplateImplTest.java

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import java.nio.charset.StandardCharsets;
66
import java.util.Base64;
7-
import java.util.Date;
87
import java.util.List;
98

109
import com.oracle.bmc.secrets.Secrets;
@@ -27,10 +26,10 @@
2726
import static org.mockito.Mockito.mock;
2827
import static org.mockito.Mockito.when;
2928

30-
public class VaultImplTest {
29+
public class VaultTemplateImplTest {
3130
private Vaults vaults;
3231
private Secrets secrets;
33-
private Vault vault;
32+
private VaultTemplate vaultTemplate;
3433

3534
private final String compartmentId = "mycompartment";
3635
private final String vaultId = "myvault";
@@ -43,7 +42,7 @@ public class VaultImplTest {
4342
void setUp() {
4443
vaults = mock(Vaults.class);
4544
secrets = mock(Secrets.class);
46-
vault = new VaultImpl(vaults, secrets, vaultId, compartmentId);
45+
vaultTemplate = new VaultTemplateImpl(vaults, secrets, vaultId, compartmentId);
4746
GetSecretBundleByNameResponse response = GetSecretBundleByNameResponse.builder()
4847
.secretBundle(SecretBundle.builder()
4948
.secretId(secretName)
@@ -57,29 +56,29 @@ void setUp() {
5756

5857
@Test
5958
void getSecretBundle() {
60-
GetSecretBundleByNameResponse foo = vault.getSecret(secretName);
61-
String decoded = vault.decodeBundle(foo);
59+
GetSecretBundleByNameResponse foo = vaultTemplate.getSecret(secretName);
60+
String decoded = vaultTemplate.decodeBundle(foo);
6261
assertThat(decoded).isEqualTo(secretValue);
6362
}
6463

6564
@Test
6665
void createSecret() {
6766
when(vaults.createSecret(any())).thenReturn(CreateSecretResponse.builder().build());
68-
CreateSecretResponse response = vault.createSecret(secretName, CreateSecretDetails.builder().build());
67+
CreateSecretResponse response = vaultTemplate.createSecret(secretName, CreateSecretDetails.builder().build());
6968
assertThat(response).isNotNull();
7069
}
7170

7271
@Test
7372
void scheduleSecretDeletion() {
7473
when(vaults.scheduleSecretDeletion(any())).thenReturn(ScheduleSecretDeletionResponse.builder().build());
75-
ScheduleSecretDeletionResponse response = vault.scheduleSecretDeletion(secretName, 1);
74+
ScheduleSecretDeletionResponse response = vaultTemplate.scheduleSecretDeletion(secretName, 1);
7675
assertThat(response).isNotNull();
7776
}
7877

7978
@Test
8079
void updateSecret() {
8180
when(vaults.updateSecret(any())).thenReturn(UpdateSecretResponse.builder().build());
82-
UpdateSecretResponse response = vault.updateSecret(secretName, UpdateSecretDetails.builder().build());
81+
UpdateSecretResponse response = vaultTemplate.updateSecret(secretName, UpdateSecretDetails.builder().build());
8382
assertThat(response).isNotNull();
8483
}
8584

@@ -94,7 +93,7 @@ void listSecrets() {
9493
.items(summaries)
9594
.build();
9695
when(vaults.listSecrets(any())).thenReturn(r1).thenReturn(r2);
97-
List<SecretSummary> actual = vault.listSecrets();
96+
List<SecretSummary> actual = vaultTemplate.listSecrets();
9897
assertThat(actual).hasSize(2);
9998
}
10099
}

0 commit comments

Comments
 (0)