Skip to content

Commit 5adcfac

Browse files
authored
cleanup/vault_autoconfigured (#3766)
* Normalizing import statements. * Refactored Vault code as autoconfigured beans. * Removed unnecessary @import statements related to Vault autoconfiguration. * Fixed dependencies. * Now getting datasource URL from Spring DataSource config, not from Vault Database config. * Removed explicit imports to avoid polluting application context (which is autoconfigured in the actual apps, but not understood by IntelliJ). * Removed hanging comment. * Reenabled DataSourceProperties, VaultDatabaseProperties.
1 parent 0e61064 commit 5adcfac

File tree

12 files changed

+126
-137
lines changed

12 files changed

+126
-137
lines changed

apps/brreg-stub/src/main/java/no/nav/brregstub/config/AppConfig.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,12 @@
66
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
77

88
import no.nav.testnav.libs.servletcore.config.ApplicationCoreConfig;
9-
import no.nav.testnav.libs.database.config.FlywayConfiguration;
10-
import no.nav.testnav.libs.database.config.VaultHikariConfiguration;
119

1210
@Configuration
1311
@EnableJpaAuditing
1412
@EnableJpaRepositories(basePackages = "no.nav.brregstub.database.repository")
1513
@Import({
16-
ApplicationCoreConfig.class,
17-
VaultHikariConfiguration.class,
18-
FlywayConfiguration.class,
14+
ApplicationCoreConfig.class
1915
})
2016
public class AppConfig {
2117
}

apps/brreg-stub/src/main/resources/application-prod.yml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
21
spring:
2+
config:
3+
import: "vault://"
34
flyway:
45
locations: classpath:db/migration/postgresql
56
datasource:
@@ -30,5 +31,3 @@ spring:
3031
role: testnav-brregstub-admin
3132
backend: postgresql/preprod-fss
3233
fail-fast: true
33-
config:
34-
import: vault://

apps/testnorge-statisk-data-forvalter/src/main/java/no/nav/registre/sdforvalter/config/DbProdConfig.java

Lines changed: 0 additions & 17 deletions
This file was deleted.

apps/testnorge-statisk-data-forvalter/src/main/resources/application-prod.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
spring:
22
config:
3-
import: vault://
3+
import: "vault://"
44
datasource:
55
url: jdbc:postgresql://b27dbvl032.preprod.local:5432/testnav-statisk-data?useUnicode=yes&characterEncoding=UTF-8
66
hikari:

apps/udi-stub/src/main/java/no/nav/udistub/config/AppConfig.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
11
package no.nav.udistub.config;
22

3-
import no.nav.testnav.libs.database.config.FlywayConfiguration;
4-
import no.nav.testnav.libs.database.config.VaultHikariConfiguration;
53
import no.nav.testnav.libs.servletcore.config.ApplicationCoreConfig;
64
import org.springframework.context.annotation.Configuration;
75
import org.springframework.context.annotation.Import;
86

97
@Configuration
108
@Import({
11-
ApplicationCoreConfig.class,
12-
FlywayConfiguration.class,
13-
VaultHikariConfiguration.class
9+
ApplicationCoreConfig.class
1410
})
1511
public class AppConfig {
1612

apps/udi-stub/src/main/resources/application-prod.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
spring:
2+
config:
3+
import: "vault://"
24
datasource:
35
url: jdbc:postgresql://b27dbvl032.preprod.local:5432/testnav-udistub?autoReconnect=true&useSSL=false
46
hikari:
@@ -23,8 +25,6 @@ spring:
2325
backend: postgresql/preprod-fss
2426
role: testnav-udistub-admin
2527
enabled: true
26-
config:
27-
import: vault://
2828
security:
2929
oauth2:
3030
resourceserver:

libs/vault/build.gradle

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,10 @@ plugins {
33
}
44

55
dependencies {
6-
api "org.springframework.cloud:spring-cloud-starter-vault-config"
7-
86
implementation "org.springframework.boot:spring-boot-starter-data-jpa"
7+
98
implementation "org.springframework.cloud:spring-cloud-vault-config-databases"
10-
9+
1110
implementation "org.flywaydb:flyway-core"
1211
implementation "org.flywaydb:flyway-database-postgresql"
1312
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
package no.nav.dolly.libs.vault.database;
2+
3+
import com.zaxxer.hikari.HikariDataSource;
4+
import lombok.RequiredArgsConstructor;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.springframework.beans.factory.InitializingBean;
7+
import org.springframework.boot.autoconfigure.AutoConfiguration;
8+
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
9+
import org.springframework.boot.autoconfigure.flyway.FlywayConfigurationCustomizer;
10+
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
11+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
12+
import org.springframework.cloud.vault.config.databases.VaultDatabaseProperties;
13+
import org.springframework.context.annotation.Bean;
14+
import org.springframework.vault.core.VaultTemplate;
15+
import org.springframework.vault.core.lease.SecretLeaseContainer;
16+
import org.springframework.vault.core.lease.domain.RequestedSecret;
17+
import org.springframework.vault.core.lease.event.SecretLeaseCreatedEvent;
18+
19+
@AutoConfiguration
20+
@ConditionalOnProperty("spring.cloud.vault.database.enabled")
21+
@RequiredArgsConstructor
22+
@EnableConfigurationProperties({
23+
DataSourceProperties.class,
24+
VaultDatabaseProperties.class
25+
})
26+
@Slf4j
27+
public class VaultDatabaseAutoConfiguration implements InitializingBean {
28+
29+
private final DataSourceProperties dataSourceProperties;
30+
31+
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
32+
private final HikariDataSource dataSource;
33+
34+
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
35+
private final SecretLeaseContainer container;
36+
37+
private final VaultDatabaseProperties vaultDatabaseProperties;
38+
39+
@SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection")
40+
private final VaultTemplate vault;
41+
42+
/**
43+
* Setup a rotating lease for the database credentials in Vault.
44+
* Not configurable as a bean.
45+
*/
46+
@Override
47+
public void afterPropertiesSet() {
48+
49+
var secret = RequestedSecret.rotating(vaultDatabaseProperties.getBackend() + "/creds/" + vaultDatabaseProperties.getRole());
50+
log.info("Setup vault lease for {}", secret);
51+
container
52+
.addLeaseListener(
53+
event -> {
54+
log.info("Triggering on event: {}", event);
55+
if (event.getSource() == secret && event instanceof SecretLeaseCreatedEvent lease) {
56+
log.info("Rotating username/password on event: {}", event);
57+
var username = lease.getSecrets().get("username").toString();
58+
var password = lease.getSecrets().get("password").toString();
59+
dataSource.setUsername(username);
60+
dataSource.setPassword(password);
61+
if (dataSource.getHikariPoolMXBean() != null) {
62+
dataSource.getHikariPoolMXBean().softEvictConnections();
63+
}
64+
65+
}
66+
});
67+
container.addRequestedSecret(secret);
68+
69+
}
70+
71+
@Bean
72+
FlywayConfigurationCustomizer flywayConfigurationCustomizer() {
73+
return new VaultFlywayConfigurationCustomizer(vault, dataSourceProperties, vaultDatabaseProperties);
74+
}
75+
76+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package no.nav.dolly.libs.vault.database;
2+
3+
import lombok.AccessLevel;
4+
import lombok.RequiredArgsConstructor;
5+
import lombok.extern.slf4j.Slf4j;
6+
import org.flywaydb.core.api.configuration.FluentConfiguration;
7+
import org.springframework.boot.autoconfigure.flyway.FlywayConfigurationCustomizer;
8+
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
9+
import org.springframework.cloud.vault.config.databases.VaultDatabaseProperties;
10+
import org.springframework.vault.core.VaultTemplate;
11+
import org.springframework.vault.support.VaultResponse;
12+
13+
import java.util.Optional;
14+
15+
@RequiredArgsConstructor(access = AccessLevel.PACKAGE)
16+
@Slf4j
17+
class VaultFlywayConfigurationCustomizer implements FlywayConfigurationCustomizer {
18+
19+
private final VaultTemplate vault;
20+
private final DataSourceProperties dataSourceProperties;
21+
private final VaultDatabaseProperties vaultDatabaseProperties;
22+
23+
@Override
24+
public void customize(FluentConfiguration configuration) {
25+
26+
var secretPath = "%s/creds/%s".formatted(vaultDatabaseProperties.getBackend(), vaultDatabaseProperties.getRole());
27+
var response = Optional
28+
.of(vault.read(secretPath))
29+
.map(VaultResponse::getData)
30+
.orElseThrow(() -> new IllegalStateException("Could not read credentials from Vault path %s".formatted(secretPath)));
31+
var username = response.get("username").toString();
32+
var password = response.get("password").toString();
33+
configuration
34+
.dataSource(dataSourceProperties.getUrl(), username, password)
35+
.initSql("SET ROLE \"%s\"".formatted(vaultDatabaseProperties.getRole()));
36+
log.info("Flyway configured with credentials from Vault path {}", secretPath);
37+
38+
}
39+
40+
}

libs/vault/src/main/java/no/nav/testnav/libs/database/config/FlywayConfiguration.java

Lines changed: 0 additions & 44 deletions
This file was deleted.

libs/vault/src/main/java/no/nav/testnav/libs/database/config/VaultHikariConfiguration.java

Lines changed: 0 additions & 57 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
no.nav.dolly.libs.vault.database.VaultDatabaseAutoConfiguration

0 commit comments

Comments
 (0)