Skip to main content

flowey_lib_hvlite/_jobs/
local_restore_packages.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4use crate::common::CommonArch;
5use flowey::node::prelude::*;
6
7flowey_request! {
8    pub struct Request{
9        pub arches: Vec<CommonArch>,
10        pub done: WriteVar<SideEffect>,
11        /// If `None`, skip downloading OpenHCL IGVM release files.
12        pub release_artifact: Option<ReadVar<PathBuf>>,
13    }
14}
15
16new_simple_flow_node!(struct Node);
17
18impl SimpleFlowNode for Node {
19    type Request = Request;
20
21    fn imports(ctx: &mut ImportCtx<'_>) {
22        ctx.import::<crate::init_openvmm_magicpath_openhcl_sysroot::Node>();
23        ctx.import::<crate::init_openvmm_magicpath_openvmm_deps::Node>();
24        ctx.import::<crate::init_openvmm_magicpath_release_openhcl_igvm::resolve::Node>();
25        ctx.import::<crate::init_openvmm_magicpath_protoc::Node>();
26        ctx.import::<crate::init_openvmm_magicpath_uefi_mu_msvm::Node>();
27        ctx.import::<crate::init_openvmm_magicpath_virtio_win::Node>();
28    }
29
30    fn process_request(request: Self::Request, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
31        let Request {
32            arches,
33            done,
34            release_artifact,
35        } = request;
36
37        let mut deps = vec![
38            ctx.reqv(crate::init_openvmm_magicpath_protoc::Request),
39            ctx.reqv(crate::init_openvmm_magicpath_virtio_win::Request),
40        ];
41
42        for arch in arches {
43            match arch {
44                CommonArch::X86_64 => {
45                    if matches!(ctx.platform(), FlowPlatform::Linux(_)) {
46                        deps.extend_from_slice(&[ctx
47                            .reqv(|v| crate::init_openvmm_magicpath_openhcl_sysroot::Request {
48                                arch: CommonArch::X86_64,
49                                path: v,
50                            })
51                            .into_side_effect()]);
52                    }
53                    deps.extend_from_slice(&[
54                        ctx.reqv(|done| crate::init_openvmm_magicpath_uefi_mu_msvm::Request {
55                            arch: CommonArch::X86_64,
56                            done,
57                        }),
58                        ctx.reqv(|done| crate::init_openvmm_magicpath_openvmm_deps::Request {
59                            arch: CommonArch::X86_64,
60                            done,
61                        }),
62                    ]);
63                }
64                CommonArch::Aarch64 => {
65                    if matches!(ctx.platform(), FlowPlatform::Linux(_)) {
66                        deps.extend_from_slice(&[ctx
67                            .reqv(|v| crate::init_openvmm_magicpath_openhcl_sysroot::Request {
68                                arch: CommonArch::Aarch64,
69                                path: v,
70                            })
71                            .into_side_effect()]);
72                    }
73                    deps.extend_from_slice(&[
74                        ctx.reqv(|done| crate::init_openvmm_magicpath_uefi_mu_msvm::Request {
75                            arch: CommonArch::Aarch64,
76                            done,
77                        }),
78                        ctx.reqv(|done| crate::init_openvmm_magicpath_openvmm_deps::Request {
79                            arch: CommonArch::Aarch64,
80                            done,
81                        }),
82                    ]);
83                }
84            }
85
86            if let Some(release_artifact) = &release_artifact {
87                deps.push(
88                    ctx.reqv(
89                        |v| crate::init_openvmm_magicpath_release_openhcl_igvm::resolve::Request {
90                            arch,
91                            release_version:
92                                crate::download_release_igvm_files_from_gh::OpenhclReleaseVersion::latest(),
93                            release_artifact: release_artifact.clone(),
94                            done: v,
95                        },
96                    )
97                    .into_side_effect(),
98                );
99            }
100        }
101
102        ctx.emit_side_effect_step(deps, [done]);
103
104        Ok(())
105    }
106}