feat: idm snooping (#71)

Implement IDM snooping, a new feature that lets you snoop on messages between guests and the host. The feature exposes the IDM packets send and receives
to the API, allowing kratactl to now listen for messages and feed them to a user for debugging purposes.
This commit is contained in:
alex authored and GitHub committed 2024-04-14 11:54:21 +00:00
1 parent f8247f13e4
commit 1627cbcdd7
12 files changed
+145 -20

No files matched your search

+2 -8
View File
@@ -6,18 +6,12 @@ fn main() -> Result<()> {
.descriptor_pool("crate::DESCRIPTOR_POOL")
.configure(
&mut config,
&[
"proto/krata/v1/control.proto",
"proto/krata/internal/idm.proto",
],
&["proto/krata/v1/control.proto", "proto/krata/bus/idm.proto"],
&["proto/"],
)?;
tonic_build::configure().compile_with_config(
config,
&[
"proto/krata/v1/control.proto",
"proto/krata/internal/idm.proto",
],
&["proto/krata/v1/control.proto", "proto/krata/bus/idm.proto"],
&["proto/"],
)?;
Ok(())
@@ -1,9 +1,9 @@
syntax = "proto3";
package krata.internal.idm;
package krata.bus.idm;
option java_multiple_files = true;
option java_package = "dev.krata.proto.internal.idm";
option java_package = "dev.krata.proto.bus.idm";
option java_outer_classname = "IdmProto";
import "google/protobuf/struct.proto";
+10
View File
@@ -6,6 +6,7 @@ option java_multiple_files = true;
option java_package = "dev.krata.proto.v1.control";
option java_outer_classname = "ControlProto";
import "krata/bus/idm.proto";
import "krata/v1/common.proto";
service ControlService {
@@ -17,6 +18,7 @@ service ControlService {
rpc WatchEvents(WatchEventsRequest) returns (stream WatchEventsReply);
rpc ReadGuestMetrics(ReadGuestMetricsRequest) returns (ReadGuestMetricsReply);
rpc SnoopIdm(SnoopIdmRequest) returns (stream SnoopIdmReply);
}
message CreateGuestRequest {
@@ -110,3 +112,11 @@ message ReadGuestMetricsRequest {
message ReadGuestMetricsReply {
krata.v1.common.GuestMetricNode root = 1;
}
message SnoopIdmRequest {}
message SnoopIdmReply {
uint32 from = 1;
uint32 to = 2;
krata.bus.idm.IdmPacket packet = 3;
}
@@ -1,6 +1,6 @@
use prost_types::{ListValue, Value};
include!(concat!(env!("OUT_DIR"), "/krata.internal.idm.rs"));
include!(concat!(env!("OUT_DIR"), "/krata.bus.idm.rs"));
pub trait AsIdmMetricValue {
fn as_metric_value(&self) -> Value;
+1
View File
@@ -0,0 +1 @@
pub mod idm;
+2 -3
View File
@@ -8,10 +8,9 @@ use std::{
time::Duration,
};
use crate::idm::protocol::idm_packet::Content;
use super::protocol::{
idm_request::Request, idm_response::Response, IdmEvent, IdmPacket, IdmRequest, IdmResponse,
idm_packet::Content, idm_request::Request, idm_response::Response, IdmEvent, IdmPacket,
IdmRequest, IdmResponse,
};
use anyhow::{anyhow, Result};
use log::{debug, error};
+1 -1
View File
@@ -1,3 +1,3 @@
#[cfg(unix)]
pub mod client;
pub mod protocol;
pub use crate::bus::idm as protocol;
+1
View File
@@ -1,6 +1,7 @@
use once_cell::sync::Lazy;
use prost_reflect::DescriptorPool;
pub mod bus;
pub mod v1;
pub mod client;