Skip to content

Commit 76c1b6c

Browse files
committed
Initial review feedback
Signed-off-by: itowlson <ivan.towlson@fermyon.com>
1 parent 9bc55b0 commit 76c1b6c

7 files changed

Lines changed: 127 additions & 31 deletions

File tree

crates/compose/src/lib.rs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,11 @@ pub async fn compose<
3535
>(
3636
loader: &L,
3737
component: &L::Component,
38-
complicator: impl Fn(Vec<u8>) -> Fut,
38+
apply_trigger_deps: impl Fn(Vec<u8>) -> Fut,
3939
) -> Result<Vec<u8>, ComposeError> {
40-
Composer::new(loader).compose(component, complicator).await
40+
Composer::new(loader)
41+
.compose(component, apply_trigger_deps)
42+
.await
4143
}
4244

4345
/// A Spin component dependency. This abstracts over the metadata associated with the
@@ -209,7 +211,7 @@ impl<'a, L: ComponentSourceLoader> Composer<'a, L> {
209211
async fn compose<Fut: std::future::Future<Output = Result<Vec<u8>, ComposeError>>>(
210212
mut self,
211213
component: &L::Component,
212-
complicator: impl Fn(Vec<u8>) -> Fut,
214+
apply_trigger_deps: impl Fn(Vec<u8>) -> Fut,
213215
) -> Result<Vec<u8>, ComposeError> {
214216
let source = self
215217
.loader
@@ -244,7 +246,7 @@ impl<'a, L: ComponentSourceLoader> Composer<'a, L> {
244246
.map_err(|e| ComposeError::EncodeError(e.into()))?
245247
};
246248

247-
let with_extras = complicator(fulfilled_source).await?;
249+
let with_extras = apply_trigger_deps(fulfilled_source).await?;
248250

249251
Ok(with_extras)
250252
}

crates/factors-executor/src/lib.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,9 +157,7 @@ impl TriggerDependenciesComposer for () {
157157
if trigger_dependencies.is_empty() {
158158
Ok(component)
159159
} else {
160-
Err(anyhow::anyhow!(
161-
"this trigger should not have complications"
162-
))
160+
Err(anyhow::anyhow!("this trigger should not have dependencies"))
163161
}
164162
}
165163
}
@@ -508,7 +506,7 @@ mod tests {
508506
&self,
509507
engine: &spin_core::wasmtime::Engine,
510508
_component: &AppComponent,
511-
_complicator: &impl TriggerDependenciesComposer,
509+
_trigger_dependencies_composer: &impl TriggerDependenciesComposer,
512510
) -> anyhow::Result<Component> {
513511
Ok(Component::new(engine, "(component)")?)
514512
}

crates/loader/src/local/trigger_components.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ fn needs_splitting(locked: &LockedApp) -> HashMap<String, Vec<LockedTrigger>> {
6767

6868
fn move_deps_from_triggers_to_components(locked: &mut LockedApp) {
6969
for trigger in &mut locked.triggers {
70-
if !trigger.trigger_dependencies.is_empty()
70+
if has_trigger_deps(trigger)
7171
&& let Some(component_id) = component_id(trigger)
7272
&& let Some(component) = get_component_mut(&mut locked.components, &component_id)
7373
{

crates/loader/tests/extra-components/inoffensive.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@ name = "file-errors"
66
[[trigger.http]]
77
route = "/a"
88
component = "a"
9-
components.middleware = ["m1", "m2"]
9+
dependencies.middleware = [{ component = "m1" }, { component = "m2" }]
1010

1111
[[trigger.http]]
1212
route = "/b"
1313
component = "b"
14-
components.middleware = ["m1", "m3"]
14+
dependencies.middleware = [{ component = "m1" }, { component = "m3" }]
1515

1616
[component.a]
1717
source = "a.dummy.wasm.txt"

crates/manifest/src/schema/v2.rs

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,6 +1019,27 @@ mod tests {
10191019
option: Option<bool>,
10201020
}
10211021

1022+
fn as_reference(spec: &ComponentSpec) -> Option<&str> {
1023+
match spec {
1024+
ComponentSpec::Reference(id) => Some(id.as_ref()),
1025+
ComponentSpec::Inline(_) => None,
1026+
}
1027+
}
1028+
1029+
fn as_inline(spec: &ComponentSpec) -> Option<&Component> {
1030+
match spec {
1031+
ComponentSpec::Reference(_) => None,
1032+
ComponentSpec::Inline(c) => Some(c),
1033+
}
1034+
}
1035+
1036+
fn as_local(source: &ComponentSource) -> Option<&str> {
1037+
match source {
1038+
ComponentSource::Local(path) => Some(path),
1039+
_ => None,
1040+
}
1041+
}
1042+
10221043
#[test]
10231044
fn deserializing_trigger_configs() {
10241045
let manifest = AppManifest::deserialize(toml! {
@@ -1559,4 +1580,77 @@ mod tests {
15591580
ComponentDependency::Version(v) if v == "1.2.3",
15601581
));
15611582
}
1583+
1584+
#[test]
1585+
fn can_deserialise_one_or_many_one_ref() {
1586+
let manifest = AppManifest::deserialize(toml! {
1587+
spin_manifest_version = 2
1588+
[application]
1589+
name = "test"
1590+
[[trigger.fake]]
1591+
component = "test1"
1592+
components = { babble = "test2" }
1593+
})
1594+
.expect("manifest should be valid");
1595+
1596+
let trigger = manifest.triggers.get("fake").unwrap()[0].clone();
1597+
1598+
assert_eq!(
1599+
Some("test1"),
1600+
as_reference(trigger.component.as_ref().unwrap())
1601+
);
1602+
assert_eq!(1, trigger.components.len());
1603+
let babble_comps = &trigger.components.get("babble").as_ref().unwrap().0;
1604+
assert_eq!(1, babble_comps.len());
1605+
assert_eq!(Some("test2"), as_reference(&babble_comps[0]));
1606+
}
1607+
1608+
#[test]
1609+
fn can_deserialise_one_or_many_one_inline() {
1610+
let manifest = AppManifest::deserialize(toml! {
1611+
spin_manifest_version = 2
1612+
[application]
1613+
name = "test"
1614+
[[trigger.fake]]
1615+
component = "test1"
1616+
components = { babble = { source = "fie.wasm", allowed_outbound_hosts = ["http://example.com"] } }
1617+
})
1618+
.expect("manifest should be valid");
1619+
1620+
let trigger = manifest.triggers.get("fake").unwrap()[0].clone();
1621+
1622+
assert_eq!(1, trigger.components.len());
1623+
let babble_comps = &trigger.components.get("babble").as_ref().unwrap().0;
1624+
assert_eq!(1, babble_comps.len());
1625+
let single = as_inline(&babble_comps[0]).expect("should have deserialised to inline");
1626+
assert_eq!(Some("fie.wasm"), as_local(&single.source));
1627+
assert_eq!(1, single.allowed_outbound_hosts.len());
1628+
}
1629+
1630+
#[test]
1631+
fn can_deserialise_one_or_many_many() {
1632+
let manifest = AppManifest::deserialize(toml! {
1633+
spin_manifest_version = 2
1634+
[application]
1635+
name = "test"
1636+
[[trigger.fake]]
1637+
component = "test1"
1638+
components = { babble = ["test2", { source = "fie.wasm", allowed_outbound_hosts = ["http://example.com"] }, "test3"] }
1639+
})
1640+
.expect("manifest should be valid");
1641+
1642+
let trigger = manifest.triggers.get("fake").unwrap()[0].clone();
1643+
1644+
assert_eq!(1, trigger.components.len());
1645+
let babble_comps = &trigger.components.get("babble").as_ref().unwrap().0;
1646+
assert_eq!(3, babble_comps.len());
1647+
1648+
assert_eq!(Some("test2"), as_reference(&babble_comps[0]));
1649+
1650+
let inline = as_inline(&babble_comps[1]).expect("should have deserialised to inline");
1651+
assert_eq!(Some("fie.wasm"), as_local(&inline.source));
1652+
assert_eq!(1, inline.allowed_outbound_hosts.len());
1653+
1654+
assert_eq!(Some("test3"), as_reference(&babble_comps[2]));
1655+
}
15621656
}

crates/oci/src/client.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -992,8 +992,8 @@ async fn precompose_using_trigger(
992992
)));
993993
}
994994

995-
let complicated = trigger_out.stdout;
996-
Ok(complicated)
995+
let composed = trigger_out.stdout;
996+
Ok(composed)
997997
}
998998

999999
/// Takes a relative path and turns it into a format that is safe

crates/trigger/src/loader.rs

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -70,22 +70,22 @@ impl ComponentLoader {
7070
pub(crate) async fn load_composed(
7171
&self,
7272
component: &AppComponent<'_>,
73-
complicator: &impl spin_factors_executor::TriggerDependenciesComposer,
73+
trigger_dependencies_composer: &impl spin_factors_executor::TriggerDependenciesComposer,
7474
) -> anyhow::Result<Vec<u8>> {
7575
let loader = ComponentSourceLoaderFs;
7676

7777
let trigger_deps = &component.locked.trigger_dependencies;
7878

79-
let complications = load_complications(&mut trigger_deps.iter(), &loader).await?;
79+
let trigger_deps = load_trigger_dependencies(&mut trigger_deps.iter(), &loader).await?;
8080

81-
let complicate = async |c: Vec<u8>| {
82-
complicator
83-
.compose_trigger_dependencies(&complications, c)
81+
let apply_trigger_deps = async |c: Vec<u8>| {
82+
trigger_dependencies_composer
83+
.compose_trigger_dependencies(&trigger_deps, c)
8484
.await
8585
.map_err(spin_compose::ComposeError::PrepareError)
8686
};
8787

88-
let composed = spin_compose::compose(&loader, component.locked, complicate)
88+
let composed = spin_compose::compose(&loader, component.locked, apply_trigger_deps)
8989
.await
9090
.with_context(|| {
9191
format!(
@@ -104,7 +104,7 @@ impl<T: RuntimeFactors, U> spin_factors_executor::ComponentLoader<T, U> for Comp
104104
&self,
105105
engine: &wasmtime::Engine,
106106
component: &AppComponent,
107-
complicator: &impl spin_factors_executor::TriggerDependenciesComposer,
107+
trigger_dependencies_composer: &impl spin_factors_executor::TriggerDependenciesComposer,
108108
) -> anyhow::Result<Component> {
109109
let source = component
110110
.source()
@@ -122,16 +122,18 @@ impl<T: RuntimeFactors, U> spin_factors_executor::ComponentLoader<T, U> for Comp
122122
return Ok(component);
123123
}
124124

125-
let composed = self.load_composed(component, complicator).await?;
125+
let composed = self
126+
.load_composed(component, trigger_dependencies_composer)
127+
.await?;
126128

127129
let component = spin_core::Component::new(engine, composed)
128130
.with_context(|| format!("failed to compile component from {}", quoted_path(&path)))?;
129131
Ok(component)
130132
}
131133
}
132134

133-
pub(crate) async fn load_complications(
134-
extras: &mut impl ExactSizeIterator<
135+
pub(crate) async fn load_trigger_dependencies(
136+
trigger_dependencies: &mut impl ExactSizeIterator<
135137
Item = (&String, &Vec<spin_app::locked::LockedComponentDependency>),
136138
>,
137139
loader: &spin_compose::ComponentSourceLoaderFs,
@@ -142,25 +144,25 @@ pub(crate) async fn load_complications(
142144
use spin_factors_executor::TriggerDependency;
143145
use std::collections::HashMap;
144146

145-
let mut complications = HashMap::with_capacity(extras.len());
147+
let mut resolved_trigger_deps = HashMap::with_capacity(trigger_dependencies.len());
146148

147-
for (role, role_components) in extras {
148-
let mut complications_for_role = Vec::with_capacity(role_components.len());
149+
for (role, role_components) in trigger_dependencies {
150+
let mut deps_for_role = Vec::with_capacity(role_components.len());
149151

150152
for locked_dep in role_components {
151-
let data = load_complication_data(loader, &locked_dep.source).await?;
152-
complications_for_role.push(TriggerDependency {
153+
let data = load_trigger_dep_data(loader, &locked_dep.source).await?;
154+
deps_for_role.push(TriggerDependency {
153155
data,
154156
dependency: locked_dep.clone(),
155157
});
156158
}
157-
complications.insert(role.clone(), complications_for_role);
159+
resolved_trigger_deps.insert(role.clone(), deps_for_role);
158160
}
159161

160-
Ok(complications)
162+
Ok(resolved_trigger_deps)
161163
}
162164

163-
async fn load_complication_data(
165+
async fn load_trigger_dep_data(
164166
loader: &ComponentSourceLoaderFs,
165167
source: &spin_app::locked::LockedComponentSource,
166168
) -> anyhow::Result<TriggerDependencyData> {

0 commit comments

Comments
 (0)