flowey_lib_hvlite/
run_igvmfilegen.rs1use flowey::node::prelude::*;
8use igvmfilegen_config::ResourceType;
9use std::collections::BTreeMap;
10
11#[derive(Serialize, Deserialize)]
12pub struct IgvmOutput {
13 pub igvm_bin: PathBuf,
14 pub igvm_map: Option<PathBuf>,
15 pub igvm_tdx_json: Option<PathBuf>,
16 pub igvm_snp_json: Option<PathBuf>,
17 pub igvm_vbs_json: Option<PathBuf>,
18}
19
20flowey_request! {
21 pub struct Request {
22 pub igvmfilegen: ReadVar<PathBuf>,
24 pub manifest: ReadVar<PathBuf>,
26 pub resources: ReadVar<BTreeMap<ResourceType, PathBuf>>,
28 pub igvm: WriteVar<IgvmOutput>,
30 }
31}
32
33new_simple_flow_node!(struct Node);
34
35impl SimpleFlowNode for Node {
36 type Request = Request;
37
38 fn imports(_ctx: &mut ImportCtx<'_>) {}
39
40 fn process_request(request: Self::Request, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
41 let Request {
42 igvmfilegen,
43 manifest,
44 resources,
45 igvm,
46 } = request;
47
48 ctx.emit_rust_step("building igvm file", |ctx| {
49 let igvm = igvm.claim(ctx);
50 let igvmfilegen = igvmfilegen.claim(ctx);
51 let manifest = manifest.claim(ctx);
52 let resources = resources.claim(ctx);
53 move |rt| {
54 let igvmfilegen = rt.read(igvmfilegen);
55 let manifest = rt.read(manifest);
56 let resources = rt.read(resources);
57
58 let sh = xshell::Shell::new()?;
59
60 let igvm_file_stem = "igvm";
61 let igvm_path = sh.current_dir().join(format!("{igvm_file_stem}.bin"));
62 let resources_path = sh.current_dir().join("igvm.json");
63
64 let resources = igvmfilegen_config::Resources::new(resources.into_iter().collect())
65 .context("creating igvm resources")?;
66 std::fs::write(&resources_path, serde_json::to_string_pretty(&resources)?)
67 .context("writing resources")?;
68
69 xshell::cmd!(
70 sh,
71 "{igvmfilegen} manifest
72 -m {manifest}
73 -r {resources_path}
74 --debug-validation
75 -o {igvm_path}
76 "
77 )
78 .run()?;
79
80 let igvm_map_path = igvm_path.with_extension("bin.map");
81 let igvm_map_path = igvm_map_path.exists().then_some(igvm_map_path);
82 let igvm_tdx_json = {
83 let path = igvm_path.with_file_name(format!("{igvm_file_stem}-tdx.json"));
84 path.exists().then_some(path)
85 };
86 let igvm_snp_json = {
87 let path = igvm_path.with_file_name(format!("{igvm_file_stem}-snp.json"));
88 path.exists().then_some(path)
89 };
90 let igvm_vbs_json = {
91 let path = igvm_path.with_file_name(format!("{igvm_file_stem}-vbs.json"));
92 path.exists().then_some(path)
93 };
94
95 rt.write(
96 igvm,
97 &IgvmOutput {
98 igvm_bin: igvm_path,
99 igvm_map: igvm_map_path,
100 igvm_tdx_json,
101 igvm_snp_json,
102 igvm_vbs_json,
103 },
104 );
105
106 Ok(())
107 }
108 });
109
110 Ok(())
111 }
112}