1
0
Fork 0
mirror of https://github.com/containers/youki synced 2024-05-21 15:06:07 +02:00
youki/src/commands/events.rs
2021-08-12 11:31:26 +02:00

63 lines
1.9 KiB
Rust

use crate::utils;
use cgroups::common;
use clap::Clap;
use std::{path::PathBuf, thread, time::Duration};
use anyhow::{bail, Context, Result};
use crate::container::{Container, ContainerStatus};
#[derive(Clap, Debug)]
pub struct Events {
/// Sets the stats collection interval in seconds (default: 5s)
#[clap(long, default_value = "5")]
pub interval: u32,
/// Display the container stats only once
#[clap(long)]
pub stats: bool,
/// Name of the container instance
pub container_id: String,
}
impl Events {
pub fn exec(&self, root_path: PathBuf) -> Result<()> {
let container_dir = root_path.join(&self.container_id);
if !container_dir.exists() {
log::debug!("{:?}", container_dir);
bail!("{} doesn't exist.", self.container_id)
}
let container = Container::load(container_dir)?.refresh_status()?;
if !container.state.status.eq(&ContainerStatus::Running) {
bail!("{} is not in running state", self.container_id);
}
let cgroups_path = utils::get_cgroup_path(
&container
.spec()?
.linux
.context("no linux in spec")?
.cgroups_path,
&self.container_id,
);
let use_systemd = container
.systemd()
.context("Could not determine cgroup manager")?;
let cgroup_manager = common::create_cgroup_manager(cgroups_path, use_systemd)?;
match self.stats {
true => {
let stats = cgroup_manager.stats()?;
println!("{}", serde_json::to_string_pretty(&stats)?);
}
false => loop {
let stats = cgroup_manager.stats()?;
println!("{}", serde_json::to_string_pretty(&stats)?);
thread::sleep(Duration::from_secs(self.interval as u64));
},
}
Ok(())
}
}