1use anyhow::Result;
2use clap::{Parser, Subcommand};
3use tonic::transport::Channel;
4
5use krata::events::EventStream;
6use krata::v1::control::control_service_client::ControlServiceClient;
7
8use crate::cli::host::cpu_topology::HostCpuTopologyCommand;
9use crate::cli::host::hv_console::HostHvConsoleCommand;
10use crate::cli::host::idm_snoop::HostIdmSnoopCommand;
11use crate::cli::host::status::HostStatusCommand;
12
13pub mod cpu_topology;
14pub mod hv_console;
15pub mod idm_snoop;
16pub mod status;
17
18#[derive(Parser)]
19#[command(about = "Manage the host of the isolation engine")]
20pub struct HostCommand {
21 #[command(subcommand)]
22 subcommand: HostCommands,
23}
24
25impl HostCommand {
26 pub async fn run(
27 self,
28 client: ControlServiceClient<Channel>,
29 events: EventStream,
30 ) -> Result<()> {
31 self.subcommand.run(client, events).await
32 }
33}
34
35#[derive(Subcommand)]
36pub enum HostCommands {
37 CpuTopology(HostCpuTopologyCommand),
38 Status(HostStatusCommand),
39 IdmSnoop(HostIdmSnoopCommand),
40 HvConsole(HostHvConsoleCommand),
41}
42
43impl HostCommands {
44 pub async fn run(
45 self,
46 client: ControlServiceClient<Channel>,
47 events: EventStream,
48 ) -> Result<()> {
49 match self {
50 HostCommands::CpuTopology(cpu_topology) => cpu_topology.run(client).await,
51
52 HostCommands::Status(status) => status.run(client).await,
53
54 HostCommands::IdmSnoop(snoop) => snoop.run(client, events).await,
55
56 HostCommands::HvConsole(hvconsole) => hvconsole.run(client).await,
57 }
58 }
59}