Skip to content

Commit fb56a51

Browse files
committed
ensure db is initialized
1 parent 16f3284 commit fb56a51

4 files changed

Lines changed: 62 additions & 21 deletions

File tree

kubernetes/README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ This directory contains a `kustomize`-based deployment for running `lti-example-
77
- `base/`: reusable application and PostgreSQL manifests
88
- `overlays/plasma/`: the deployable overlay used by the GitHub Actions workflow
99

10+
The `plasma` overlay is configured for the cluster's `traefik` ingress class.
11+
1012
## Secrets
1113

1214
The manifests expect a runtime secret named `lti-example-tool-secrets` with these keys:

kubernetes/overlays/plasma/ingress.yaml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@ apiVersion: networking.k8s.io/v1
22
kind: Ingress
33
metadata:
44
name: lti-example-tool
5-
annotations:
6-
nginx.ingress.kubernetes.io/proxy-body-size: 10m
75
spec:
8-
ingressClassName: nginx
6+
ingressClassName: traefik
97
rules:
108
- host: __INGRESS_HOST__
119
http:

src/lti_example_tool/application.gleam

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ pub fn setup() -> AppContext {
2525

2626
let db = pog.named_connection(db_config.pool_name)
2727

28-
// Ensure the database is initialized
29-
migrate.maybe_initialize_db(db_config)
28+
// Ensure the database schema and bootstrap records exist
29+
migrate.ensure_initialized(db_config)
3030

3131
let assert Ok(lti_data_provider) = db_provider.data_provider(db)
3232

src/lti_example_tool/database/migrate.gleam

Lines changed: 57 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -182,12 +182,13 @@ fn start_connection_with_retry(db_config: pog.Config, attempts_left: Int) {
182182
@external(erlang, "timer", "sleep")
183183
fn sleep(time_ms: Int) -> Nil
184184

185-
pub fn maybe_initialize_db(db_config: pog.Config) {
185+
pub fn ensure_initialized(db_config: pog.Config) {
186186
case db_exists(db_config) {
187187
True -> {
188-
logger.debug("Database '" <> db_config.database <> "' exists.")
189-
190-
Nil
188+
logger.info(
189+
"Database '" <> db_config.database <> "' exists. Ensuring migrations and bootstrap data are applied...",
190+
)
191+
ensure_existing_database_is_ready(db_config)
191192
}
192193
False -> {
193194
logger.info(
@@ -201,6 +202,15 @@ pub fn maybe_initialize_db(db_config: pog.Config) {
201202
}
202203
}
203204

205+
fn ensure_existing_database_is_ready(db_config: pog.Config) {
206+
let assert Ok(database_url) = database_url_for(db_config.database)
207+
208+
let assert Ok(_) = run_migrate_command_with("up", database_url)
209+
let _ = ensure_active_jwk(db_config)
210+
211+
Nil
212+
}
213+
204214
fn db_exists(db_config: pog.Config) -> Bool {
205215
let db_name = db_config.database
206216

@@ -318,9 +328,51 @@ fn seed_database(db_config: pog.Config) -> Result(Nil, String) {
318328
seed(started.data)
319329
}
320330

331+
fn ensure_active_jwk(db_config: pog.Config) -> Result(Nil, String) {
332+
let seed_pool_name = process.new_name("migrate_active_jwk_pool")
333+
let seed_db_config = pog.Config(..db_config, pool_name: seed_pool_name)
334+
335+
use started <- result.try(
336+
start_connection_with_retry(seed_db_config, 20)
337+
|> result.map_error(string.inspect),
338+
)
339+
340+
let db = started.data
341+
342+
case jwks.get_active_jwk(db) {
343+
Ok(_) -> {
344+
logger.info("Active JWK already present.")
345+
Ok(Nil)
346+
}
347+
Error(_) -> {
348+
logger.info("No active JWK found. Generating bootstrap JWK...")
349+
seed_jwk(db)
350+
}
351+
}
352+
}
353+
321354
fn seed(db: pog.Connection) -> Result(Nil, String) {
322355
logger.info("Seeding database...")
323356

357+
use _ <- result.try(seed_jwk(db))
358+
359+
case seeds.load_from_file(db, "seeds.yml") {
360+
Ok(_) -> {
361+
logger.info("Database seeded.")
362+
363+
Ok(Nil)
364+
}
365+
Error(e) -> {
366+
logger.error("Failed to seed database: " <> e)
367+
368+
Error(e)
369+
}
370+
}
371+
}
372+
373+
fn seed_jwk(db: pog.Connection) -> Result(Nil, String) {
374+
logger.info("Ensuring active JWK is present...")
375+
324376
use active_jwk <- result.try(
325377
jwk.generate()
326378
|> result.map_error(fn(e) {
@@ -337,18 +389,7 @@ fn seed(db: pog.Connection) -> Result(Nil, String) {
337389
|> result.map_error(database.humanize_error),
338390
)
339391

340-
case seeds.load_from_file(db, "seeds.yml") {
341-
Ok(_) -> {
342-
logger.info("Database seeded.")
343-
344-
Ok(Nil)
345-
}
346-
Error(e) -> {
347-
logger.error("Failed to seed database: " <> e)
348-
349-
Error(e)
350-
}
351-
}
392+
Ok(Nil)
352393
}
353394

354395
fn run_migrate_command(command: String) -> Result(String, String) {

0 commit comments

Comments
 (0)