flowey_lib_hvlite/
init_openvmm_magicpath_release_openhcl_igvm.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4pub mod resolve {
5    use crate::download_release_igvm_files_from_gh;
6    use crate::run_cargo_build::common::CommonArch;
7    use flowey::node::prelude::new_simple_flow_node;
8    use flowey::node::prelude::*;
9
10    new_simple_flow_node!(struct Node);
11
12    flowey_request! {
13        pub struct Request{
14            pub arch: CommonArch,
15            pub done: WriteVar<SideEffect>,
16            pub release_artifact: ReadVar<PathBuf>,
17            pub release_version: download_release_igvm_files_from_gh::OpenhclReleaseVersion
18        }
19    }
20
21    impl SimpleFlowNode for Node {
22        type Request = Request;
23
24        fn imports(ctx: &mut ImportCtx<'_>) {
25            ctx.import::<download_release_igvm_files_from_gh::resolve::Node>();
26        }
27
28        fn process_request(request: Self::Request, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
29            let Request {
30                arch,
31                release_version,
32                release_artifact,
33                done,
34            } = request;
35
36            let latest_release_igvm_files =
37                ctx.reqv(|v| download_release_igvm_files_from_gh::resolve::Request {
38                    arch,
39                    release_igvm_files: v,
40                    release_version,
41                });
42
43            let release_version_str = release_version.to_string();
44
45            ctx.emit_rust_step(
46                "copy downloaded release igvm files to artifact dir",
47                move |ctx| {
48                    let latest_release_igvm_files = latest_release_igvm_files.claim(ctx);
49                    let latest_release_artifact = release_artifact.claim(ctx);
50                    done.claim(ctx);
51
52                    move |rt| {
53                        let latest_release_igvm_files = rt.read(latest_release_igvm_files);
54                        let latest_release_artifact = rt.read(latest_release_artifact);
55
56                        match arch {
57                            CommonArch::Aarch64 => {
58                                let aarch64_name =
59                                    format!("{}-aarch64-openhcl.bin", release_version_str);
60                                if let Some(src) = &latest_release_igvm_files.openhcl_aarch64 {
61                                    fs_err::copy(src, latest_release_artifact.join(&aarch64_name))?;
62                                }
63                            }
64                            CommonArch::X86_64 => {
65                                let x64_name = format!("{}-x64-openhcl.bin", release_version_str);
66                                let direct_name =
67                                    format!("{}-x64-direct-openhcl.bin", release_version_str);
68                                if let Some(src) = &latest_release_igvm_files.openhcl {
69                                    fs_err::copy(src, latest_release_artifact.join(&x64_name))?;
70                                }
71                                if let Some(src) = &latest_release_igvm_files.openhcl_direct {
72                                    fs_err::copy(src, latest_release_artifact.join(&direct_name))?;
73                                }
74                            }
75                        }
76
77                        Ok(())
78                    }
79                },
80            );
81
82            Ok(())
83        }
84    }
85}