krata: begin work on idm channel

This commit is contained in:
Alex Zenla
2024-03-28 07:36:48 +00:00
parent 63f7db6cf4
commit f7267e4f5d
9 changed files with 186 additions and 66 deletions

40
crates/kratad/src/idm.rs Normal file
View File

@ -0,0 +1,40 @@
use anyhow::Result;
use kratart::channel::ChannelService;
use log::error;
use tokio::{sync::mpsc::Receiver, task::JoinHandle};
pub struct DaemonIdm {
receiver: Receiver<(u32, Vec<u8>)>,
task: JoinHandle<()>,
}
impl DaemonIdm {
pub async fn new() -> Result<DaemonIdm> {
let (service, receiver) = ChannelService::new("krata-channel".to_string()).await?;
let task = service.launch().await?;
Ok(DaemonIdm { receiver, task })
}
pub async fn launch(mut self) -> Result<JoinHandle<()>> {
Ok(tokio::task::spawn(async move {
if let Err(error) = self.process().await {
error!("failed to process idm: {}", error);
}
}))
}
async fn process(&mut self) -> Result<()> {
loop {
let Some(_) = self.receiver.recv().await else {
break;
};
}
Ok(())
}
}
impl Drop for DaemonIdm {
fn drop(&mut self) {
self.task.abort();
}
}

View File

@ -4,6 +4,7 @@ use anyhow::Result;
use control::RuntimeControlService;
use db::GuestStore;
use event::{DaemonEventContext, DaemonEventGenerator};
use idm::DaemonIdm;
use krata::{dial::ControlDialAddress, v1::control::control_service_server::ControlServiceServer};
use kratart::Runtime;
use log::info;
@ -20,6 +21,7 @@ use uuid::Uuid;
pub mod control;
pub mod db;
pub mod event;
pub mod idm;
pub mod reconcile;
pub struct Daemon {
@ -30,6 +32,7 @@ pub struct Daemon {
guest_reconciler_task: JoinHandle<()>,
guest_reconciler_notify: Sender<Uuid>,
generator_task: JoinHandle<()>,
idm_task: JoinHandle<()>,
}
const GUEST_RECONCILER_QUEUE_LEN: usize = 1000;
@ -50,14 +53,20 @@ impl Daemon {
let runtime_for_reconciler = runtime.dupe().await?;
let guest_reconciler =
GuestReconciler::new(guests.clone(), events.clone(), runtime_for_reconciler)?;
let guest_reconciler_task = guest_reconciler.launch(guest_reconciler_receiver).await?;
let idm = DaemonIdm::new().await?;
let idm_task = idm.launch().await?;
let generator_task = generator.launch().await?;
Ok(Self {
store,
runtime,
guests,
events,
guest_reconciler_task: guest_reconciler.launch(guest_reconciler_receiver).await?,
guest_reconciler_task,
guest_reconciler_notify,
generator_task: generator.launch().await?,
generator_task,
idm_task,
})
}
@ -121,5 +130,6 @@ impl Drop for Daemon {
fn drop(&mut self) {
self.guest_reconciler_task.abort();
self.generator_task.abort();
self.idm_task.abort();
}
}