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 igvm_file_stem = "igvm";
59 let igvm_path = rt.sh.current_dir().join(format!("{igvm_file_stem}.bin"));
60 let resources_path = rt.sh.current_dir().join("igvm.json");
61
62 let resources = igvmfilegen_config::Resources::new(resources.into_iter().collect())
63 .context("creating igvm resources")?;
64 std::fs::write(&resources_path, serde_json::to_string_pretty(&resources)?)
65 .context("writing resources")?;
66
67 flowey::shell_cmd!(
68 rt,
69 "{igvmfilegen} manifest
70 -m {manifest}
71 -r {resources_path}
72 --debug-validation
73 -o {igvm_path}
74 "
75 )
76 .run()?;
77
78 let igvm_map_path = igvm_path.with_extension("bin.map");
79 let igvm_map_path = igvm_map_path.exists().then_some(igvm_map_path);
80 let igvm_tdx_json = {
81 let path = igvm_path.with_file_name(format!("{igvm_file_stem}-tdx.json"));
82 path.exists().then_some(path)
83 };
84 let igvm_snp_json = {
85 let path = igvm_path.with_file_name(format!("{igvm_file_stem}-snp.json"));
86 path.exists().then_some(path)
87 };
88 let igvm_vbs_json = {
89 let path = igvm_path.with_file_name(format!("{igvm_file_stem}-vbs.json"));
90 path.exists().then_some(path)
91 };
92
93 rt.write(
94 igvm,
95 &IgvmOutput {
96 igvm_bin: igvm_path,
97 igvm_map: igvm_map_path,
98 igvm_tdx_json,
99 igvm_snp_json,
100 igvm_vbs_json,
101 },
102 );
103
104 Ok(())
105 }
106 });
107
108 Ok(())
109 }
110}