Skip to main content

flowey_lib_hvlite/_jobs/
download_and_run_nextest_vmm_tests.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Download pre-built artifacts and run cargo-nextest based VMM tests.
5//
6// Unfortunately, this follows a different pattern than the normal VMM tests
7// flow where VmmTestsBuiltArtifacts is constructed at the pipeline level.
8// This is necessary because flowey does not yet support dependencies within
9// a job.
10// TODO: unify these two paths for running VMM tests in CI.
11
12use crate::_jobs::consume_and_test_nextest_vmm_tests_archive::TestContentConfig;
13use crate::common::CommonTriple;
14use crate::init_vmm_tests_content_dir::VmmTestsBuiltArtifacts;
15use crate::init_vmm_tests_content_dir::VmmTestsBuiltArtifactsWrite;
16use crate::init_vmm_tests_content_dir::vmm_tests_artifact_builders::VmmTestsArtifactsBuilderWindowsX86;
17use crate::init_vmm_tests_env::PetriParams;
18use crate::install_vmm_tests_external_deps::VmmTestsExternalDeps;
19use crate::install_vmm_tests_external_deps::VmmTestsExternalDepsWindows;
20use crate::run_cargo_nextest_run::NextestProfile;
21use flowey::node::prelude::*;
22use vmm_test_images::KnownTestArtifacts;
23
24#[derive(Serialize, Deserialize)]
25pub enum VmmTestsProfile {
26    X64WindowsAll,
27}
28
29struct VmmTestsParameters {
30    target: CommonTriple,
31    nextest_filter_expr: String,
32    built_artifacts: VmmTestsBuiltArtifacts,
33    built_artifacts_write: VmmTestsBuiltArtifactsWrite,
34    downloaded_artifacts: Vec<KnownTestArtifacts>,
35    prep_steps_variants: Vec<String>,
36    external_deps: VmmTestsExternalDeps,
37}
38
39impl VmmTestsProfile {
40    fn parameters(&self, ctx: &mut NodeCtx<'_>) -> VmmTestsParameters {
41        match self {
42            VmmTestsProfile::X64WindowsAll => {
43                let (built_artifacts, built_artifacts_write) =
44                    VmmTestsArtifactsBuilderWindowsX86::pair(ctx);
45                let mut nextest_filter_expr = "all()".to_string();
46                // self-hosted runners don't have HvlDeviceHost installed
47                // TODO: configure runners and remove this exclusion
48                nextest_filter_expr.push_str(" & !test(storvsp_nvme_hyperv)");
49                // self-hosted runners don't have a Hyper-V switch configured
50                // TODO: configure runners and remove this exclusion
51                nextest_filter_expr.push_str(" & !test(dio_nic)");
52
53                VmmTestsParameters {
54                    target: CommonTriple::X86_64_WINDOWS_MSVC,
55                    nextest_filter_expr,
56                    built_artifacts,
57                    built_artifacts_write,
58                    downloaded_artifacts: vec![
59                        KnownTestArtifacts::Alpine323X64Vhd,
60                        KnownTestArtifacts::FreeBsd13_2X64Vhd,
61                        KnownTestArtifacts::FreeBsd13_2X64Iso,
62                        KnownTestArtifacts::Gen1WindowsDataCenterCore2022X64Vhd,
63                        KnownTestArtifacts::Gen2WindowsDataCenterCore2022X64Vhd,
64                        KnownTestArtifacts::Gen2WindowsDataCenterCore2025X64Vhd,
65                        KnownTestArtifacts::Ubuntu2404ServerX64Vhd,
66                        KnownTestArtifacts::Ubuntu2504ServerX64Vhd,
67                        KnownTestArtifacts::VmgsWithBootEntry,
68                        KnownTestArtifacts::VmgsWith16kTpm,
69                    ],
70                    prep_steps_variants: vec!["standard".into(), "no-vmbus".into()],
71                    external_deps: VmmTestsExternalDeps::Windows(VmmTestsExternalDepsWindows {
72                        hyperv: true,
73                        whp: true,
74                        hardware_isolation: true,
75                    }),
76                }
77            }
78        }
79    }
80}
81
82flowey_request! {
83    pub struct Params {
84        pub label: String,
85        pub profile: VmmTestsProfile,
86        pub repetitions: std::num::NonZeroU64,
87        pub done: WriteVar<SideEffect>,
88    }
89}
90
91new_simple_flow_node!(struct Node);
92
93impl SimpleFlowNode for Node {
94    type Request = Params;
95
96    fn imports(ctx: &mut ImportCtx<'_>) {
97        ctx.import::<crate::download_vmm_tests_built_artifacts::Node>();
98        ctx.import::<crate::_jobs::consume_and_test_nextest_vmm_tests_archive::Node>();
99    }
100
101    fn process_request(request: Self::Request, ctx: &mut NodeCtx<'_>) -> anyhow::Result<()> {
102        let Params {
103            label,
104            profile,
105            repetitions,
106            done,
107        } = request;
108
109        let VmmTestsParameters {
110            target,
111            nextest_filter_expr,
112            built_artifacts,
113            built_artifacts_write,
114            downloaded_artifacts,
115            prep_steps_variants,
116            external_deps,
117        } = profile.parameters(ctx);
118
119        ctx.req(crate::download_vmm_tests_built_artifacts::Request {
120            built_artifacts_write,
121            target: target.clone(),
122        });
123
124        ctx.req(
125            crate::_jobs::consume_and_test_nextest_vmm_tests_archive::Params {
126                junit_test_label: format!("{label}-vmm-tests"),
127                target: target.as_triple(),
128                nextest_profile: NextestProfile::Ci,
129                nextest_filter_expr: Some(nextest_filter_expr),
130                test_content_config: TestContentConfig::Uninitialized {
131                    test_content_dir: None,
132                    built_artifacts,
133                    needs_release_igvm: true, // TODO
134                },
135                downloaded_artifacts,
136                prep_steps_variants,
137                external_deps,
138                incubator_profile: None,
139                upload_logs_on_success: false,
140                fail_job_on_test_fail: true,
141                repetitions,
142                // TODO
143                petri_params: PetriParams {
144                    disable_remote_artifacts: true,
145                    reuse_prepped_vhds: false,
146                    require_2mb_hugetlb: false,
147                },
148                test_content_dir_as_repo_root: false,
149                done,
150            },
151        );
152
153        Ok(())
154    }
155}