Skip to main content

flowey_lib_hvlite/_jobs/
test_local_flowey_build_igvm.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Encapsulates the logic of invoking `cargo xflowey build-igvm x64 --install-missing-deps`
5use flowey::node::prelude::*;
6
7use crate::build_openhcl_igvm_from_recipe::OpenhclIgvmRecipe;
8
9flowey_request! {
10    pub struct Request {
11        pub base_recipe: OpenhclIgvmRecipe,
12        pub done: WriteVar<SideEffect>,
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::git_checkout_openvmm_repo::Node>();
23        ctx.import::<flowey_lib_common::install_rust::Node>();
24    }
25
26    fn process_request(request: Self::Request, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
27        let Request { base_recipe, done } = request;
28
29        let hvlite_repo = ctx.reqv(crate::git_checkout_openvmm_repo::req::GetRepoDir);
30        let rust_install = ctx.reqv(flowey_lib_common::install_rust::Request::EnsureInstalled);
31        let rust_toolchain = ctx.reqv(flowey_lib_common::install_rust::Request::GetRustupToolchain);
32        let gh_token = (ctx.backend() == FlowBackend::Github)
33            .then(|| ctx.get_gh_context_var().global().token());
34
35        let test_local = ctx.emit_rust_step(
36            "test cargo xflowey build-igvm x64 --install-missing-deps",
37            |ctx| {
38                rust_install.claim(ctx);
39                let rust_toolchain = rust_toolchain.claim(ctx);
40                let hvlite_repo = hvlite_repo.claim(ctx);
41                let gh_token = gh_token.claim(ctx);
42                move |rt| {
43                    let hvlite_repo = rt.read(hvlite_repo);
44                    let gh_token = rt.read(gh_token);
45                    let rust_toolchain = rt.read(rust_toolchain);
46                    let base_recipe = base_recipe.non_production_tag();
47                    rt.sh.change_dir(hvlite_repo);
48                    let mut cmd = if let Some(rust_toolchain) = &rust_toolchain {
49                        flowey::shell_cmd!(rt, "rustup run {rust_toolchain} cargo")
50                    } else {
51                        flowey::shell_cmd!(rt, "cargo")
52                    }
53                    .args(["xflowey", "build-igvm", &base_recipe])
54                    .arg("--install-missing-deps")
55                    .env("I_HAVE_A_GOOD_REASON_TO_RUN_BUILD_IGVM_IN_CI", "true");
56                    if let Some(gh_token) = gh_token {
57                        cmd = cmd.env("GITHUB_TOKEN", gh_token);
58                    }
59                    cmd.run()?;
60                    Ok(())
61                }
62            },
63        );
64
65        ctx.emit_side_effect_step([test_local], [done]);
66
67        Ok(())
68    }
69}