Skip to main content

flowey_hvlite/pipelines/
mod.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4use cca_tests::CcaTestsCli;
5use flowey::pipeline::prelude::*;
6use restore_packages::RestorePackagesCli;
7use vmm_tests_run::VmmTestsRunCli;
8
9pub mod build_docs;
10pub mod build_igvm;
11pub mod build_reproducible;
12pub mod cca_tests;
13pub mod checkin_gates;
14pub mod custom_vmfirmwareigvm_dll;
15pub mod restore_packages;
16pub mod vmm_tests_run;
17
18#[derive(clap::Subcommand)]
19#[expect(clippy::large_enum_variant)]
20pub enum OpenvmmPipelines {
21    /// Alias for root-level `regen` command.
22    // DEVNOTE: this enables the useful `cargo xflowey regen` alias
23    Regen {
24        #[arg(trailing_var_arg = true, allow_hyphen_values = true, hide = true)]
25        args: Vec<String>,
26    },
27
28    BuildIgvm(build_igvm::BuildIgvmCli),
29    BuildReproducible(build_reproducible::BuildReproducibleCli),
30    CustomVmfirmwareigvmDll(custom_vmfirmwareigvm_dll::CustomVmfirmwareigvmDllCli),
31
32    /// Flowey pipelines primarily designed to run in CI.
33    #[clap(subcommand)]
34    Ci(OpenvmmPipelinesCi),
35
36    /// Install tools needed to build OpenVMM
37    RestorePackages(RestorePackagesCli),
38
39    /// Build and run VMM tests with automatic artifact discovery
40    VmmTestsRun(VmmTestsRunCli),
41
42    /// Build and run CCA tests with installation of emulation environment supported
43    CcaTests(CcaTestsCli),
44}
45
46#[derive(clap::Subcommand)]
47pub enum OpenvmmPipelinesCi {
48    CheckinGates(checkin_gates::CheckinGatesCli),
49    BuildDocs(build_docs::BuildDocsCli),
50}
51
52impl IntoPipeline for OpenvmmPipelines {
53    fn into_pipeline(self, pipeline_hint: PipelineBackendHint) -> anyhow::Result<Pipeline> {
54        match self {
55            OpenvmmPipelines::Regen { args } => {
56                let status = std::process::Command::new("cargo")
57                    .args(["run", "-p", "flowey_hvlite", "--", "regen"])
58                    .args(args)
59                    .spawn()?
60                    .wait()?;
61                std::process::exit(status.code().unwrap_or(-1));
62            }
63            OpenvmmPipelines::BuildIgvm(cmd) => cmd.into_pipeline(pipeline_hint),
64            OpenvmmPipelines::BuildReproducible(cmd) => cmd.into_pipeline(pipeline_hint),
65            OpenvmmPipelines::CustomVmfirmwareigvmDll(cmd) => cmd.into_pipeline(pipeline_hint),
66            OpenvmmPipelines::Ci(cmd) => match cmd {
67                OpenvmmPipelinesCi::CheckinGates(cmd) => cmd.into_pipeline(pipeline_hint),
68                OpenvmmPipelinesCi::BuildDocs(cmd) => cmd.into_pipeline(pipeline_hint),
69            },
70            OpenvmmPipelines::RestorePackages(cmd) => cmd.into_pipeline(pipeline_hint),
71            OpenvmmPipelines::VmmTestsRun(cmd) => cmd.into_pipeline(pipeline_hint),
72            OpenvmmPipelines::CcaTests(cmd) => cmd.into_pipeline(pipeline_hint),
73        }
74    }
75}