Skip to main content

flowey_hvlite/pipelines/
mod.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4use crate::pipelines::vmm_tests_run_target::VmmTestsRunTargetCli;
5use cca_tests::CcaTestsCli;
6use flowey::pipeline::prelude::*;
7use restore_packages::RestorePackagesCli;
8use vmm_perf::VmmPerfCli;
9use vmm_tests_run::VmmTestsRunCli;
10
11pub mod build_docs;
12pub mod build_igvm;
13pub mod build_opentmk;
14pub mod build_reproducible;
15pub mod burn_in;
16pub mod cca_tests;
17pub mod checkin_gates;
18pub mod custom_vmfirmwareigvm_dll;
19pub mod openvmm_source_release;
20pub mod restore_packages;
21pub mod vmm_perf;
22pub mod vmm_tests_run;
23pub mod vmm_tests_run_target;
24
25#[derive(clap::Subcommand)]
26#[expect(clippy::large_enum_variant)]
27pub enum OpenvmmPipelines {
28    /// Alias for root-level `regen` command.
29    // DEVNOTE: this enables the useful `cargo xflowey regen` alias
30    Regen {
31        #[arg(trailing_var_arg = true, allow_hyphen_values = true, hide = true)]
32        args: Vec<String>,
33    },
34
35    BuildIgvm(build_igvm::BuildIgvmCli),
36    /// Build OpenTMK and package it into a bootable VHD
37    BuildOpentmk(build_opentmk::BuildOpentmkCli),
38    BuildReproducible(build_reproducible::BuildReproducibleCli),
39    CustomVmfirmwareigvmDll(custom_vmfirmwareigvm_dll::CustomVmfirmwareigvmDllCli),
40
41    /// Flowey pipelines primarily designed to run in CI.
42    #[clap(subcommand)]
43    Ci(OpenvmmPipelinesCi),
44
45    /// Install tools needed to build OpenVMM
46    RestorePackages(RestorePackagesCli),
47
48    /// Build and run VMM tests with automatic artifact discovery
49    VmmTestsRun(VmmTestsRunCli),
50
51    /// Build and run VMM.Perf without Petri/nextest
52    VmmPerf(VmmPerfCli),
53
54    /// Run VMM tests on a target system with artifacts built by `VmmTestsRun`.
55    VmmTestsRunTarget(VmmTestsRunTargetCli),
56
57    /// Build and run CCA tests with installation of emulation environment supported
58    CcaTests(CcaTestsCli),
59}
60
61#[derive(clap::Subcommand)]
62pub enum OpenvmmPipelinesCi {
63    CheckinGates(checkin_gates::CheckinGatesCli),
64    BuildDocs(build_docs::BuildDocsCli),
65    /// Assemble, validate, and draft an OpenVMM source release.
66    OpenvmmSourceRelease(openvmm_source_release::OpenvmmSourceReleaseCli),
67    BurnIn(burn_in::BurnInCli),
68}
69
70impl IntoPipeline for OpenvmmPipelines {
71    fn into_pipeline(self, pipeline_hint: PipelineBackendHint) -> anyhow::Result<Pipeline> {
72        match self {
73            OpenvmmPipelines::Regen { args } => {
74                let status = std::process::Command::new("cargo")
75                    .args([
76                        "run",
77                        "-p",
78                        "flowey_hvlite",
79                        "--profile",
80                        "light",
81                        "--",
82                        "regen",
83                    ])
84                    .args(args)
85                    .spawn()?
86                    .wait()?;
87                std::process::exit(status.code().unwrap_or(-1));
88            }
89            OpenvmmPipelines::BuildIgvm(cmd) => cmd.into_pipeline(pipeline_hint),
90            OpenvmmPipelines::BuildOpentmk(cmd) => cmd.into_pipeline(pipeline_hint),
91            OpenvmmPipelines::BuildReproducible(cmd) => cmd.into_pipeline(pipeline_hint),
92            OpenvmmPipelines::CustomVmfirmwareigvmDll(cmd) => cmd.into_pipeline(pipeline_hint),
93            OpenvmmPipelines::Ci(cmd) => match cmd {
94                OpenvmmPipelinesCi::CheckinGates(cmd) => cmd.into_pipeline(pipeline_hint),
95                OpenvmmPipelinesCi::BuildDocs(cmd) => cmd.into_pipeline(pipeline_hint),
96                OpenvmmPipelinesCi::OpenvmmSourceRelease(cmd) => cmd.into_pipeline(pipeline_hint),
97                OpenvmmPipelinesCi::BurnIn(cmd) => cmd.into_pipeline(pipeline_hint),
98            },
99            OpenvmmPipelines::RestorePackages(cmd) => cmd.into_pipeline(pipeline_hint),
100            OpenvmmPipelines::VmmTestsRun(cmd) => cmd.into_pipeline(pipeline_hint),
101            OpenvmmPipelines::VmmPerf(cmd) => cmd.into_pipeline(pipeline_hint),
102            OpenvmmPipelines::VmmTestsRunTarget(cmd) => cmd.into_pipeline(pipeline_hint),
103            OpenvmmPipelines::CcaTests(cmd) => cmd.into_pipeline(pipeline_hint),
104        }
105    }
106}