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::*;
6use std::collections::BTreeSet;
7
8flowey_request! {
9    pub struct Request{
10        pub arches: Vec<CommonArch>,
11        pub done: WriteVar<SideEffect>,
12        /// If `None`, skip downloading OpenHCL IGVM release files.
13        pub release_artifact: Option<ReadVar<PathBuf>>,
14    }
15}
16
17new_simple_flow_node!(struct Node);
18
19impl SimpleFlowNode for Node {
20    type Request = Request;
21
22    fn imports(ctx: &mut ImportCtx<'_>) {
23        ctx.import::<crate::init_openvmm_magicpath_openhcl_sysroot::Node>();
24        ctx.import::<crate::init_openvmm_magicpath_openvmm_deps::Node>();
25        ctx.import::<crate::init_openvmm_magicpath_release_openhcl_igvm::resolve::Node>();
26        ctx.import::<crate::init_openvmm_magicpath_protoc::Node>();
27        ctx.import::<crate::init_openvmm_magicpath_uefi_mu_msvm::Node>();
28        ctx.import::<crate::init_openvmm_magicpath_virtio_win::Node>();
29    }
30
31    fn process_request(request: Self::Request, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
32        let Request {
33            arches,
34            done,
35            release_artifact,
36        } = request;
37
38        let mut deps = vec![
39            ctx.reqv(crate::init_openvmm_magicpath_protoc::Request),
40            ctx.reqv(crate::init_openvmm_magicpath_virtio_win::Request),
41        ];
42
43        for arch in arches.into_iter().collect::<BTreeSet<_>>() {
44            if matches!(ctx.platform(), FlowPlatform::Linux(_)) {
45                deps.push(
46                    ctx.reqv(|v| crate::init_openvmm_magicpath_openhcl_sysroot::Request {
47                        arch,
48                        path: v,
49                    })
50                    .into_side_effect(),
51                );
52            }
53            deps.extend([
54                ctx.reqv(|done| crate::init_openvmm_magicpath_uefi_mu_msvm::Request { arch, done }),
55                ctx.reqv(|done| crate::init_openvmm_magicpath_openvmm_deps::Request { arch, done }),
56            ]);
57
58            if let Some(release_artifact) = &release_artifact {
59                deps.push(
60                    ctx.reqv(
61                        |v| crate::init_openvmm_magicpath_release_openhcl_igvm::resolve::Request {
62                            arch,
63                            release_version:
64                                crate::download_release_igvm_files_from_gh::OpenhclReleaseVersion::latest(),
65                            release_artifact: release_artifact.clone(),
66                            done: v,
67                        },
68                    )
69                    .into_side_effect(),
70                );
71            }
72        }
73
74        ctx.emit_side_effect_step(deps, [done]);
75
76        Ok(())
77    }
78}