use client::{
events::{ContainerCreate, ContainerDelete},
services::v1::{events_client::EventsClient, SubscribeRequest},
};
use containerd_client as client;
#[tokio::main(flavor = "current_thread")]
async fn main() {
let channel = client::connect("/run/containerd/containerd.sock")
.await
.expect("Connect Failed");
let mut client = EventsClient::new(channel.clone());
let request = SubscribeRequest::default();
let mut response = client
.subscribe(request)
.await
.expect("failed to subscribe to events")
.into_inner();
loop {
match response.message().await {
Ok(event) => {
if let Some(event) = event {
match event.topic.as_str() {
"/containers/create" => {
if let Some(mut payload) = event.event {
if !payload.type_url.starts_with('/') {
payload.type_url.insert(0, '/');
}
let payload: ContainerCreate = payload
.to_msg()
.expect("failed to parse ContainerCreate payload");
println!(
"container created: id={} payload={:?}",
payload.id, payload
);
}
}
"/containers/delete" => {
if let Some(mut payload) = event.event {
if !payload.type_url.starts_with('/') {
payload.type_url.insert(0, '/');
}
let payload: ContainerDelete = payload
.to_msg()
.expect("failed to parse ContainerDelete payload");
println!(
"container deleted: id={} payload={:?}",
payload.id, payload
);
}
}
_ => {}
}
}
}
Err(e) => {
eprintln!("error while streaming events: {:?}", e);
break;
}
}
}
}