mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-07-07 04:19:58 +00:00
Merge pull request #4383 from cyyzero/runk-list
runk: Support `list` sub-command
This commit is contained in:
commit
f981190621
27
src/tools/runk/Cargo.lock
generated
27
src/tools/runk/Cargo.lock
generated
@ -985,7 +985,9 @@ dependencies = [
|
|||||||
"serde_json",
|
"serde_json",
|
||||||
"slog",
|
"slog",
|
||||||
"slog-async",
|
"slog-async",
|
||||||
|
"tabwriter",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
"users",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -1166,6 +1168,15 @@ dependencies = [
|
|||||||
"unicode-xid",
|
"unicode-xid",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "tabwriter"
|
||||||
|
version = "1.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "36205cfc997faadcc4b0b87aaef3fbedafe20d38d4959a7ca6ff803564051111"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-width",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "take_mut"
|
name = "take_mut"
|
||||||
version = "0.2.2"
|
version = "0.2.2"
|
||||||
@ -1348,12 +1359,28 @@ version = "1.9.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99"
|
checksum = "7e8820f5d777f6224dc4be3632222971ac30164d4a258d595640799554ebfd99"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "unicode-width"
|
||||||
|
version = "0.1.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-xid"
|
name = "unicode-xid"
|
||||||
version = "0.2.2"
|
version = "0.2.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
|
checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "users"
|
||||||
|
version = "0.11.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "24cc0f6d6f267b73e5a2cadf007ba8f9bc39c6a6f9666f8cf25ea809a153b032"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
"log",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "version_check"
|
name = "version_check"
|
||||||
version = "0.9.4"
|
version = "0.9.4"
|
||||||
|
@ -22,6 +22,8 @@ slog-async = "2.7.0"
|
|||||||
tokio = { version = "1.15.0", features = ["full"] }
|
tokio = { version = "1.15.0", features = ["full"] }
|
||||||
serde = { version = "1.0.133", features = ["derive"] }
|
serde = { version = "1.0.133", features = ["derive"] }
|
||||||
serde_json = "1.0.74"
|
serde_json = "1.0.74"
|
||||||
|
users = "0.11.0"
|
||||||
|
tabwriter = "1.2.1"
|
||||||
|
|
||||||
[workspace]
|
[workspace]
|
||||||
members = [
|
members = [
|
||||||
|
69
src/tools/runk/src/commands/list.rs
Normal file
69
src/tools/runk/src/commands/list.rs
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
// Copyright 2021-2022 Kata Contributors
|
||||||
|
//
|
||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
//
|
||||||
|
|
||||||
|
use super::state::get_container_state_name;
|
||||||
|
use anyhow::Result;
|
||||||
|
use libcontainer::status::{get_current_container_state, Status};
|
||||||
|
use liboci_cli::List;
|
||||||
|
use oci::ContainerState;
|
||||||
|
use slog::{info, Logger};
|
||||||
|
use std::{fs, os::unix::prelude::MetadataExt, path::Path};
|
||||||
|
use std::{io, io::Write};
|
||||||
|
use tabwriter::TabWriter;
|
||||||
|
use users::get_user_by_uid;
|
||||||
|
|
||||||
|
pub fn run(_: List, root: &Path, logger: &Logger) -> Result<()> {
|
||||||
|
let mut content = String::new();
|
||||||
|
for entry in fs::read_dir(root)? {
|
||||||
|
let entry = entry?;
|
||||||
|
// Possibly race with runk delete, so continue loop when any error occurs below
|
||||||
|
let metadata = match entry.metadata() {
|
||||||
|
Ok(metadata) => metadata,
|
||||||
|
Err(_) => continue,
|
||||||
|
};
|
||||||
|
if !metadata.is_dir() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let container_id = match entry.file_name().into_string() {
|
||||||
|
Ok(id) => id,
|
||||||
|
Err(_) => continue,
|
||||||
|
};
|
||||||
|
let status = match Status::load(root, &container_id) {
|
||||||
|
Ok(status) => status,
|
||||||
|
Err(_) => continue,
|
||||||
|
};
|
||||||
|
let state = match get_current_container_state(&status) {
|
||||||
|
Ok(state) => state,
|
||||||
|
Err(_) => continue,
|
||||||
|
};
|
||||||
|
// Just like runc, pid of stopped container is 0
|
||||||
|
let pid = match state {
|
||||||
|
ContainerState::Stopped => 0,
|
||||||
|
_ => status.pid,
|
||||||
|
};
|
||||||
|
// May replace get_user_by_uid with getpwuid(3)
|
||||||
|
let owner = match get_user_by_uid(metadata.uid()) {
|
||||||
|
Some(user) => String::from(user.name().to_string_lossy()),
|
||||||
|
None => format!("#{}", metadata.uid()),
|
||||||
|
};
|
||||||
|
content.push_str(&format!(
|
||||||
|
"{}\t{}\t{}\t{}\t{}\t{}\n",
|
||||||
|
container_id,
|
||||||
|
pid,
|
||||||
|
get_container_state_name(state),
|
||||||
|
status.bundle.display(),
|
||||||
|
status.created,
|
||||||
|
owner
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut tab_writer = TabWriter::new(io::stdout());
|
||||||
|
writeln!(&mut tab_writer, "ID\tPID\tSTATUS\tBUNDLE\tCREATED\tOWNER")?;
|
||||||
|
write!(&mut tab_writer, "{}", content)?;
|
||||||
|
tab_writer.flush()?;
|
||||||
|
|
||||||
|
info!(&logger, "list command finished successfully");
|
||||||
|
Ok(())
|
||||||
|
}
|
@ -6,6 +6,7 @@
|
|||||||
pub mod create;
|
pub mod create;
|
||||||
pub mod delete;
|
pub mod delete;
|
||||||
pub mod kill;
|
pub mod kill;
|
||||||
|
pub mod list;
|
||||||
pub mod run;
|
pub mod run;
|
||||||
pub mod spec;
|
pub mod spec;
|
||||||
pub mod start;
|
pub mod start;
|
||||||
|
@ -78,6 +78,7 @@ async fn cmd_run(subcmd: SubCommand, root_path: &Path, logger: &Logger) -> Resul
|
|||||||
SubCommand::Common(cmd) => match cmd {
|
SubCommand::Common(cmd) => match cmd {
|
||||||
CommonCmd::Run(run) => commands::run::run(run, root_path, logger).await,
|
CommonCmd::Run(run) => commands::run::run(run, root_path, logger).await,
|
||||||
CommonCmd::Spec(spec) => commands::spec::run(spec, logger),
|
CommonCmd::Spec(spec) => commands::spec::run(spec, logger),
|
||||||
|
CommonCmd::List(list) => commands::list::run(list, root_path, logger),
|
||||||
_ => {
|
_ => {
|
||||||
return Err(anyhow!("command is not implemented yet"));
|
return Err(anyhow!("command is not implemented yet"));
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user