flowey_lib_hvlite/
init_openvmm_magicpath_linux_test_kernel.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Ensure the OpenVMM example linux kernel + initrd are extracted into the
5//! correct "magic directory" set by the project-level `[env]` table in
6//! `.cargo/config.toml`
7
8use crate::download_openvmm_deps::OpenvmmDepsArch;
9use flowey::node::prelude::*;
10use std::collections::BTreeMap;
11
12new_flow_node!(struct Node);
13
14#[derive(Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord, Debug)]
15pub enum OpenvmmLinuxTestKernelArch {
16    Aarch64,
17    X64,
18}
19
20flowey_request! {
21    pub struct Request {
22        pub arch: OpenvmmLinuxTestKernelArch,
23        pub done: WriteVar<SideEffect>,
24    }
25}
26
27impl FlowNode for Node {
28    type Request = Request;
29
30    fn imports(ctx: &mut ImportCtx<'_>) {
31        ctx.import::<crate::cfg_openvmm_magicpath::Node>();
32        ctx.import::<crate::download_openvmm_deps::Node>();
33    }
34
35    fn emit(requests: Vec<Self::Request>, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
36        let mut kernel_arch: BTreeMap<_, Vec<_>> = BTreeMap::new();
37
38        for Request { arch, done } in requests {
39            kernel_arch.entry(arch).or_default().push(done)
40        }
41
42        let kernel_arch = kernel_arch;
43
44        // -- end of req processing -- //
45
46        let openvmm_magicpath = ctx.reqv(crate::cfg_openvmm_magicpath::Request);
47
48        for (arch, out_vars) in kernel_arch {
49            let openvmm_deps_arch = match arch {
50                OpenvmmLinuxTestKernelArch::Aarch64 => OpenvmmDepsArch::Aarch64,
51                OpenvmmLinuxTestKernelArch::X64 => OpenvmmDepsArch::X86_64,
52            };
53            let openvmm_linux_test_kernel = ctx.reqv(|v| {
54                crate::download_openvmm_deps::Request::GetLinuxTestKernel(openvmm_deps_arch, v)
55            });
56            let openvmm_linux_test_initrd = ctx.reqv(|v| {
57                crate::download_openvmm_deps::Request::GetLinuxTestInitrd(openvmm_deps_arch, v)
58            });
59
60            ctx.emit_rust_step(format!("extract {arch:?} sysroot.tar.gz"), |ctx| {
61                let openvmm_linux_test_kernel = openvmm_linux_test_kernel.claim(ctx);
62                let openvmm_linux_test_initrd = openvmm_linux_test_initrd.claim(ctx);
63                let openvmm_magicpath = openvmm_magicpath.clone().claim(ctx);
64                out_vars.claim(ctx);
65
66                move |rt| {
67                    let openvmm_linux_test_kernel = rt.read(openvmm_linux_test_kernel);
68                    let openvmm_linux_test_initrd = rt.read(openvmm_linux_test_initrd);
69                    let openvmm_magicpath = rt.read(openvmm_magicpath);
70
71                    let test_kernel_path =
72                        openvmm_magicpath
73                            .join("underhill-deps-private")
74                            .join(match arch {
75                                OpenvmmLinuxTestKernelArch::Aarch64 => "aarch64",
76                                OpenvmmLinuxTestKernelArch::X64 => "x64",
77                            });
78                    fs_err::create_dir_all(&test_kernel_path)?;
79                    fs_err::copy(openvmm_linux_test_initrd, test_kernel_path.join("initrd"))?;
80                    fs_err::copy(
81                        openvmm_linux_test_kernel,
82                        test_kernel_path.join(match arch {
83                            OpenvmmLinuxTestKernelArch::Aarch64 => "Image",
84                            OpenvmmLinuxTestKernelArch::X64 => "vmlinux",
85                        }),
86                    )?;
87
88                    Ok(())
89                }
90            });
91        }
92
93        Ok(())
94    }
95}