Skip to content

Commit 867c0be

Browse files
committed
Tidying because IT WORKS
Signed-off-by: itowlson <ivan.towlson@fermyon.com>
1 parent 816226b commit 867c0be

3 files changed

Lines changed: 31 additions & 125 deletions

File tree

crates/oci/src/client.rs

Lines changed: 6 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -370,26 +370,16 @@ impl Client {
370370
let locked_url = write_locked_app(&locked, working_dir).await.unwrap();
371371

372372
for mut c in locked.components {
373-
// TODO: what if, instead of having a separate complicate that
374-
// called the trigger, we had the trigger do the full compose
375-
// (in the presence of extras)? The trigger already has logic
376-
// for that...
377-
let extras = c.metadata.get("trigger-extras").and_then(|e| e.as_object());
373+
let extras = c.metadata.get("trigger-extras").and_then(|e| e.as_object());
378374

379375
let composed = if extras.is_none_or(|e| e.is_empty()) {
380376
spin_compose::compose(&ComponentSourceLoaderFs, &c, async |a| Ok(a)).await?
381377
} else {
382-
compose_trigger_extras_2(&c, &locked_url, working_dir).await?
378+
// There are complications: we need to hand off to the trigger
379+
// to do the composition.
380+
precompose_using_trigger(&c, &locked_url, working_dir).await?
383381
};
384382

385-
// let complicate =
386-
// |data: Vec<u8>| compose_trigger_extras(&c, &locked_url, working_dir, data);
387-
388-
// let composed = spin_compose::compose(&ComponentSourceLoaderFs, &c, complicate)
389-
// .await
390-
// .with_context(|| {
391-
// format!("failed to resolve dependencies for component {:?}", c.id)
392-
// })?;
393383
let layer = ImageLayer::new(composed, WASM_LAYER_MEDIA_TYPE.to_string(), None);
394384
c.source.content = self.content_ref_for_layer(&layer);
395385
c.dependencies.clear();
@@ -950,73 +940,7 @@ fn add_inferred(map: &mut BTreeMap<String, String>, key: &str, value: Option<Str
950940
const SPIN_LOCKED_URL: &str = "SPIN_LOCKED_URL";
951941
const SPIN_WORKING_DIR: &str = "SPIN_WORKING_DIR";
952942

953-
// async fn compose_trigger_extras(
954-
// c: &LockedComponent,
955-
// locked_url: &str,
956-
// working_dir: &Path,
957-
// data: Vec<u8>,
958-
// ) -> Result<Vec<u8>, spin_compose::ComposeError> {
959-
// use spin_compose::ComposeError;
960-
961-
// let Some(resolve_extras_using) = c
962-
// .metadata
963-
// .get("resolve-extras-using")
964-
// .and_then(|v| v.as_str())
965-
// else {
966-
// return Result::<_, ComposeError>::Ok(data);
967-
// };
968-
969-
// let resolver_subcmd = match resolve_extras_using {
970-
// "http" | "redis" => vec!["trigger".into(), resolve_extras_using.into()],
971-
// _ => vec![format!("trigger-{resolve_extras_using}")],
972-
// };
973-
974-
// let mut cmd = tokio::process::Command::new(std::env::current_exe().unwrap());
975-
// cmd.args(resolver_subcmd)
976-
// .args(["--resolve-extras-only", "--resolve-extras-component-id"])
977-
// .arg(&c.id)
978-
// // .stdin(std::process::Stdio::piped())
979-
// .stdout(std::process::Stdio::piped())
980-
// .stderr(std::process::Stdio::inherit())
981-
// .env("SPIN_PLUGINS_SUPPRESS_COMPATIBILITY_WARNINGS", "1")
982-
// .env(SPIN_LOCKED_URL, locked_url)
983-
// .env(SPIN_WORKING_DIR, working_dir);
984-
985-
// let child = cmd
986-
// .spawn()
987-
// .map_err(|e| ComposeError::PrepareError(e.into()))?;
988-
989-
// // use tokio::io::AsyncWriteExt;
990-
991-
// // let mut input = child.stdin.take().unwrap();
992-
// // input
993-
// // .write_all(&data)
994-
// // .await
995-
// // .map_err(|e| ComposeError::PrepareError(e.into()))?;
996-
// // input
997-
// // .flush()
998-
// // .await
999-
// // .map_err(|e| ComposeError::PrepareError(e.into()))?;
1000-
// // drop(input);
1001-
1002-
// let trigger_out = child
1003-
// .wait_with_output()
1004-
// .await
1005-
// .map_err(|e| ComposeError::PrepareError(e.into()))?;
1006-
1007-
// if !trigger_out.status.success() {
1008-
// return Err(ComposeError::PrepareError(anyhow::anyhow!(
1009-
// "unable to compose additional components for {} using `{}`",
1010-
// c.id,
1011-
// resolve_extras_using
1012-
// )));
1013-
// }
1014-
1015-
// let complicated = trigger_out.stdout;
1016-
// Ok(complicated)
1017-
// }
1018-
1019-
async fn compose_trigger_extras_2(
943+
async fn precompose_using_trigger(
1020944
c: &LockedComponent,
1021945
locked_url: &str,
1022946
working_dir: &Path,
@@ -1028,8 +952,7 @@ async fn compose_trigger_extras_2(
1028952
.get("resolve-extras-using")
1029953
.and_then(|v| v.as_str())
1030954
else {
1031-
return spin_compose::compose(&ComponentSourceLoaderFs, &c, async |a| Ok(a)).await;
1032-
// return Result::<_, ComposeError>::Ok(data);
955+
return spin_compose::compose(&ComponentSourceLoaderFs, c, async |a| Ok(a)).await;
1033956
};
1034957

1035958
let resolver_subcmd = match resolve_extras_using {

crates/trigger/src/cli.rs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -214,29 +214,36 @@ impl<T: Trigger<B::Factors>, B: RuntimeFactorsBuilder> FactorsTriggerCommand<T,
214214
App::new(locked_url, locked)
215215
};
216216

217-
// Validate required host features
218-
if let Err(unmet) = app.ensure_needs_only(T::TYPE, &T::supported_host_requirements()) {
219-
anyhow::bail!("This application requires the following features that are not available in this version of the '{}' trigger: {unmet}", T::TYPE);
220-
}
221-
217+
// Handle --precompose-only
222218
if self.precompose_only {
223-
let Some(resolve_extras_component_id) = self.precompose_component_id.as_ref()
224-
else {
225-
anyhow::bail!("got --resolve-extras-only but no --resolve-extras-component-id");
219+
let Some(precompose_component_id) = self.precompose_component_id.as_ref() else {
220+
anyhow::bail!("got --precompose-only but no --precompose-component-id");
226221
};
227222

228-
let Some(component) = app.get_component(resolve_extras_component_id) else {
229-
anyhow::bail!("--resolve-extras-component-id: component does not exist");
223+
let Some(component) = app.get_component(precompose_component_id) else {
224+
anyhow::bail!("--precompose-component-id: component does not exist");
230225
};
231226

232227
let loader = crate::loader::ComponentLoader::new();
233-
let composed = loader.load_full(&component, &T::complicator()).await?;
228+
let composed = loader
229+
.load_composed(&component, &T::complicator())
230+
.await
231+
.with_context(|| {
232+
format!("failed to precompose component {precompose_component_id}")
233+
})?;
234234

235235
use std::io::Write;
236-
std::io::stdout().write_all(&composed).unwrap();
236+
std::io::stdout()
237+
.write_all(&composed)
238+
.context("failed to write composition to stdout")?;
237239
return Ok(());
238240
}
239241

242+
// Validate required host features
243+
if let Err(unmet) = app.ensure_needs_only(T::TYPE, &T::supported_host_requirements()) {
244+
anyhow::bail!("This application requires the following features that are not available in this version of the '{}' trigger: {unmet}", T::TYPE);
245+
}
246+
240247
let trigger = T::new(self.trigger_args, &app)?;
241248

242249
let mut builder: TriggerAppBuilder<T, B> = TriggerAppBuilder::new(trigger);

crates/trigger/src/loader.rs

Lines changed: 6 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,11 @@ impl ComponentLoader {
6767
}
6868
}
6969

70-
pub(crate) async fn load_full(&self, component: &AppComponent<'_>, complicator: &impl spin_factors_executor::Complicator) -> anyhow::Result<Vec<u8>> {
70+
pub(crate) async fn load_composed(
71+
&self,
72+
component: &AppComponent<'_>,
73+
complicator: &impl spin_factors_executor::Complicator,
74+
) -> anyhow::Result<Vec<u8>> {
7175
let loader = ComponentSourceLoaderFs;
7276

7377
let empty: serde_json::Map<String, serde_json::Value> = Default::default();
@@ -123,35 +127,7 @@ impl<T: RuntimeFactors, U> spin_factors_executor::ComponentLoader<T, U> for Comp
123127
.with_context(|| format!("error deserializing component from {path:?}"));
124128
}
125129

126-
let composed = self.load_full(component, complicator).await?;
127-
128-
// let loader = ComponentSourceLoaderFs;
129-
130-
// let empty: serde_json::Map<String, serde_json::Value> = Default::default();
131-
// let extras = component
132-
// .locked
133-
// .metadata
134-
// .get("trigger-extras")
135-
// .and_then(|v| v.as_object())
136-
// .unwrap_or(&empty);
137-
138-
// let complications = load_complications(component.app, extras, &loader).await?;
139-
140-
// let complicate = async |c: Vec<u8>| {
141-
// complicator
142-
// .complicate(&complications, c)
143-
// .await
144-
// .map_err(spin_compose::ComposeError::PrepareError)
145-
// };
146-
147-
// let composed = spin_compose::compose(&loader, component.locked, complicate)
148-
// .await
149-
// .with_context(|| {
150-
// format!(
151-
// "failed to resolve dependencies for component {:?}",
152-
// component.locked.id
153-
// )
154-
// })?;
130+
let composed = self.load_composed(component, complicator).await?;
155131

156132
spin_core::Component::new(engine, composed)
157133
.with_context(|| format!("failed to compile component from {}", quoted_path(&path)))

0 commit comments

Comments
 (0)