Skip to content

Commit edac482

Browse files
committed
Reimplement initial kv handling
Signed-off-by: Ryan Levick <ryan.levick@fermyon.com>
1 parent 8b7f497 commit edac482

File tree

5 files changed

+53
-7
lines changed

5 files changed

+53
-7
lines changed

Diff for: crates/factor-key-value/src/lib.rs

+5
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,11 @@ impl AppState {
133133
.values()
134134
.any(|stores| stores.contains(label))
135135
}
136+
137+
/// Get a store by label.
138+
pub async fn get_store(&self, label: &str) -> Option<Arc<dyn Store>> {
139+
self.store_manager.get(label).await.ok()
140+
}
136141
}
137142

138143
pub struct InstanceBuilder {

Diff for: crates/trigger/src/cli.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
mod initial_kv_setter;
12
mod launch_metadata;
23
mod sqlite_statements;
34
mod stdio;
@@ -17,6 +18,7 @@ use spin_factors::RuntimeFactors;
1718
use spin_factors_executor::{ComponentLoader, FactorsExecutor};
1819

1920
use crate::{Trigger, TriggerApp};
21+
pub use initial_kv_setter::InitialKvSetterHook;
2022
pub use launch_metadata::LaunchMetadata;
2123
pub use sqlite_statements::SqlStatementExecutorHook;
2224
use stdio::FollowComponents;

Diff for: crates/trigger/src/cli/initial_kv_setter.rs

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
use anyhow::Context as _;
2+
use spin_core::async_trait;
3+
use spin_factor_key_value::KeyValueFactor;
4+
use spin_factors::RuntimeFactors;
5+
use spin_factors_executor::ExecutorHooks;
6+
7+
pub struct InitialKvSetterHook {
8+
kv_pairs: Vec<(String, String)>,
9+
}
10+
11+
impl InitialKvSetterHook {
12+
pub fn new(kv_pairs: Vec<(String, String)>) -> Self {
13+
Self { kv_pairs }
14+
}
15+
}
16+
17+
const DEFAULT_KEY_VALUE_STORE_LABEL: &str = "default";
18+
19+
#[async_trait]
20+
impl<F: RuntimeFactors, U> ExecutorHooks<F, U> for InitialKvSetterHook {
21+
async fn configure_app(
22+
&mut self,
23+
configured_app: &spin_factors::ConfiguredApp<F>,
24+
) -> anyhow::Result<()> {
25+
let Some(kv) = configured_app.app_state::<KeyValueFactor>().ok() else {
26+
return Ok(());
27+
};
28+
let store = kv
29+
.get_store(DEFAULT_KEY_VALUE_STORE_LABEL)
30+
.await
31+
.expect("trigger was misconfigured and lacks a default store");
32+
for (key, value) in &self.kv_pairs {
33+
store
34+
.set(key, value.as_bytes())
35+
.await
36+
.context("failed to set key-value pair")?;
37+
}
38+
39+
Ok(())
40+
}
41+
}

Diff for: examples/spin-timer/src/main.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use anyhow::Error;
2-
use spin_trigger::cli::FactorsTriggerCommand;
2+
use clap::Parser;
33
use spin_cli::runtime_factors::FactorsBuilder;
4+
use spin_trigger::cli::FactorsTriggerCommand;
45

56
use trigger_timer::TimerTrigger;
67

Diff for: src/runtime_factors.rs

+3-6
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ use spin_factors_executor::FactorsExecutor;
55
use spin_runtime_config::ResolvedRuntimeConfig;
66
use spin_runtime_factors::{TriggerAppOptions, TriggerFactors, TriggerFactorsRuntimeConfig};
77
use spin_trigger::cli::{
8-
CommonTriggerOptions, KeyValueDefaultStoreSummaryHook, RuntimeFactorsBuilder,
9-
SqlStatementExecutorHook, StdioLoggingExecutorHooks,
8+
CommonTriggerOptions, InitialKvSetterHook, KeyValueDefaultStoreSummaryHook,
9+
RuntimeFactorsBuilder, SqlStatementExecutorHook, StdioLoggingExecutorHooks,
1010
};
1111

1212
pub struct FactorsBuilder;
@@ -56,10 +56,7 @@ impl RuntimeFactorsBuilder for FactorsBuilder {
5656
runtime_config.log_dir(),
5757
));
5858
executor.add_hooks(KeyValueDefaultStoreSummaryHook);
59-
// TODO: implement initial key values as a hook
60-
// runtime_config
61-
// .set_initial_key_values(&options.initial_key_values)
62-
// .await?;
59+
executor.add_hooks(InitialKvSetterHook::new(options.key_values.clone()));
6360
// builder.hooks(SummariseRuntimeConfigHook::new(&self.runtime_config_file));
6461
// builder.hooks(SqlitePersistenceMessageHook);
6562
Ok(())

0 commit comments

Comments
 (0)