flowey_lib_hvlite/
run_igvmfilegen.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Raw bindings to `igvmfilegen`, used to build an igvm file from a manifest +
5//! set of resources.
6
7use 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        /// Path to igvmfilegen bin to use
23        pub igvmfilegen: ReadVar<PathBuf>,
24        /// IGVM manifest to build
25        pub manifest: ReadVar<PathBuf>,
26        /// Resources required by the provided IGVM manifest
27        pub resources: ReadVar<BTreeMap<ResourceType, PathBuf>>,
28        /// Output path of generated igvm file
29        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}