summaryrefslogtreecommitdiff
path: root/src/cmd/list.rs
blob: a67dfb75753170f44c03681238241e8ae1230ca5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use crate::config::Configuration;

use virt::connect::Connect;

#[derive(Debug, thiserror::Error)]
pub enum ListError {
    #[error(transparent)]
    VirtError(#[from] virt::error::Error),
}

pub fn list(_config: &Configuration) -> Result<(), ListError> {
    let conn = Connect::open("qemu:///system")?;
    let domains = conn.list_all_domains(0)?;
    for domain in domains {
        let name = domain.get_name()?;
        let (state, _) = domain.get_state()?;
        let state = state_name(state);
        println!("{} {}", name, state);
    }

    Ok(())
}

fn state_name(state: virt::domain::DomainState) -> String {
    let name = match state {
        virt::domain::VIR_DOMAIN_NOSTATE => "none",
        virt::domain::VIR_DOMAIN_RUNNING => "running",
        virt::domain::VIR_DOMAIN_BLOCKED => "blocked",
        virt::domain::VIR_DOMAIN_PAUSED => "paused",
        virt::domain::VIR_DOMAIN_SHUTDOWN => "shutdown",
        virt::domain::VIR_DOMAIN_SHUTOFF => "shutoff",
        virt::domain::VIR_DOMAIN_CRASHED => "crashed",
        virt::domain::VIR_DOMAIN_PMSUSPENDED => "power management suspended",
        _ => "unknown",
    };
    name.to_string()
}