Skip to content

Commit 20e11ec

Browse files
Merge pull request #2945 from kate-goldenring/configure-log-dir-from-runtime-config
fix: enable configuring log_dir from runtime config
2 parents 7ec2df8 + af6ad60 commit 20e11ec

File tree

1 file changed

+49
-16
lines changed
  • crates/runtime-config/src

1 file changed

+49
-16
lines changed

crates/runtime-config/src/lib.rs

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -129,27 +129,32 @@ where
129129
let runtime_config_dir = runtime_config_path
130130
.and_then(Path::parent)
131131
.map(ToOwned::to_owned);
132+
let state_dir = toml_resolver.state_dir()?;
132133
let tls_resolver = runtime_config_dir.clone().map(SpinTlsRuntimeConfig::new);
133-
let key_value_config_resolver =
134-
key_value_config_resolver(runtime_config_dir, toml_resolver.state_dir()?);
135-
let sqlite_config_resolver = sqlite_config_resolver(toml_resolver.state_dir()?)
134+
let key_value_resolver = key_value_config_resolver(runtime_config_dir, state_dir.clone());
135+
let sqlite_resolver = sqlite_config_resolver(state_dir.clone())
136136
.context("failed to resolve sqlite runtime config")?;
137137

138+
let toml = toml_resolver.toml();
139+
let log_dir = toml_resolver.log_dir()?;
138140
let source = TomlRuntimeConfigSource::new(
139-
toml_resolver.clone(),
140-
&key_value_config_resolver,
141+
toml_resolver,
142+
&key_value_resolver,
141143
tls_resolver.as_ref(),
142-
&sqlite_config_resolver,
144+
&sqlite_resolver,
143145
);
146+
// Note: all valid fields in the runtime config must have been referenced at
147+
// this point or the finalizer will fail due to `validate_all_keys_used`
148+
// not passing.
144149
let runtime_config: T = source.try_into().map_err(Into::into)?;
145150

146151
Ok(Self {
147152
runtime_config,
148-
key_value_resolver: key_value_config_resolver,
149-
sqlite_resolver: sqlite_config_resolver,
150-
state_dir: toml_resolver.state_dir()?,
151-
log_dir: toml_resolver.log_dir()?,
152-
toml: toml_resolver.toml(),
153+
key_value_resolver,
154+
sqlite_resolver,
155+
state_dir,
156+
log_dir,
157+
toml,
153158
})
154159
}
155160

@@ -461,12 +466,11 @@ mod tests {
461466
fn resolve_toml(
462467
toml: toml::Table,
463468
path: impl AsRef<std::path::Path>,
464-
) -> ResolvedRuntimeConfig<TestFactorsRuntimeConfig> {
469+
) -> anyhow::Result<ResolvedRuntimeConfig<TestFactorsRuntimeConfig>> {
465470
ResolvedRuntimeConfig::<TestFactorsRuntimeConfig>::new(
466471
toml_resolver(&toml),
467472
Some(path.as_ref()),
468473
)
469-
.unwrap()
470474
}
471475
};
472476
}
@@ -502,13 +506,16 @@ mod tests {
502506
type = "spin"
503507
};
504508
assert_eq!(
505-
resolve_toml(toml, ".").runtime_config.configured_labels(),
509+
resolve_toml(toml, ".")
510+
.unwrap()
511+
.runtime_config
512+
.configured_labels(),
506513
vec!["default", "foo"]
507514
);
508515

509516
// Test that the default label is added with an empty toml config.
510517
let toml = toml::Table::new();
511-
let runtime_config = resolve_toml(toml, "config.toml").runtime_config;
518+
let runtime_config = resolve_toml(toml, "config.toml").unwrap().runtime_config;
512519
assert_eq!(runtime_config.configured_labels(), vec!["default"]);
513520
}
514521

@@ -527,7 +534,7 @@ mod tests {
527534
[key_value_store.foo]
528535
type = "spin"
529536
};
530-
let runtime_config = resolve_toml(toml, "config.toml").runtime_config;
537+
let runtime_config = resolve_toml(toml, "config.toml").unwrap().runtime_config;
531538
assert!(["default", "foo"]
532539
.iter()
533540
.all(|label| runtime_config.has_store_manager(label)));
@@ -565,6 +572,7 @@ mod tests {
565572
})
566573
.runtime_config(
567574
resolve_toml(runtime_config, tmp_dir.path().join("runtime-config.toml"))
575+
.unwrap()
568576
.runtime_config,
569577
)?;
570578
let mut state = env.build_instance_state().await?;
@@ -590,4 +598,29 @@ mod tests {
590598
UserProvidedPath::Default,
591599
)
592600
}
601+
602+
#[test]
603+
fn dirs_are_resolved() {
604+
define_test_factor!(sqlite: SqliteFactor);
605+
606+
let toml = toml::toml! {
607+
state_dir = "/foo"
608+
log_dir = "/bar"
609+
};
610+
resolve_toml(toml, "config.toml").unwrap();
611+
}
612+
613+
#[test]
614+
fn fails_to_resolve_with_unused_key() {
615+
define_test_factor!(sqlite: SqliteFactor);
616+
617+
let toml = toml::toml! {
618+
baz = "/baz"
619+
};
620+
// assert returns an error with value "unused runtime config key(s): local_app_dir"
621+
let Err(e) = resolve_toml(toml, "config.toml") else {
622+
panic!("Should not be able to resolve unknown key");
623+
};
624+
assert_eq!(e.to_string(), "unused runtime config key(s): baz");
625+
}
593626
}

0 commit comments

Comments
 (0)