-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPostgres.kt
56 lines (49 loc) · 1.8 KB
/
Postgres.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
package no.nav.k9.los.db
import com.zaxxer.hikari.HikariDataSource
import io.ktor.server.application.*
import no.nav.k9.los.Configuration
import no.nav.k9.los.KoinProfile
import no.nav.vault.jdbc.hikaricp.HikariCPVaultUtil
import org.flywaydb.core.Flyway
import java.util.*
import javax.sql.DataSource
import kotlin.time.measureTimedValue
enum class Role {
Admin, User, ReadOnly;
override fun toString() = name.lowercase(Locale.getDefault())
}
fun getDataSource(configuration: Configuration): HikariDataSource =
if (configuration.koinProfile() == KoinProfile.LOCAL) {
HikariDataSource(configuration.hikariConfig())
} else {
dataSourceFromVault(configuration, Role.User)
}
fun dataSourceFromVault(hikariConfig: Configuration, role: Role): HikariDataSource =
HikariCPVaultUtil.createHikariDataSourceWithVaultIntegration(
hikariConfig.hikariConfig(),
hikariConfig.getVaultDbPath(),
"${hikariConfig.databaseName()}-$role"
)
fun Application.migrate(configuration: Configuration) {
log.info("Migrerer database")
val (antallMigrert, tidsbruk) = measureTimedValue {
if (configuration.koinProfile() == KoinProfile.LOCAL) {
runMigration(HikariDataSource(configuration.hikariConfig()))
} else {
runMigration(
dataSourceFromVault(configuration, Role.Admin),
"SET ROLE \"${configuration.databaseName()}-${Role.Admin}\""
)
}
}
log.info("Migrert database, antallMigrert={} tidsbruk={}", antallMigrert, tidsbruk)
}
fun runMigration(dataSource: DataSource, initSql: String? = null): Int {
return Flyway.configure()
.locations("migreringer/")
.dataSource(dataSource)
.initSql(initSql)
.load()
.migrate()
.migrationsExecuted
}