Skip to main content

sk_store/
event.rs

1use serde::{
2    Deserialize,
3    Serialize,
4};
5use sk_core::k8s::dyn_obj_type_str;
6use sk_core::prelude::*;
7use tracing::*;
8
9
10#[derive(Clone, Copy, Debug)]
11pub enum TraceAction {
12    ObjectApplied,
13    ObjectDeleted,
14}
15
16#[derive(Clone, Debug, Default, Deserialize, PartialEq, Serialize)]
17pub struct TraceEvent {
18    pub ts: i64,
19    pub applied_objs: Vec<DynamicObject>,
20    pub deleted_objs: Vec<DynamicObject>,
21}
22
23impl TraceEvent {
24    pub fn len(&self) -> usize {
25        self.applied_objs.len() + self.deleted_objs.len()
26    }
27
28    pub fn is_empty(&self) -> bool {
29        self.applied_objs.is_empty() && self.deleted_objs.is_empty()
30    }
31}
32
33pub(crate) fn append_event(event_list: &mut Vec<TraceEvent>, ts: i64, obj: &DynamicObject, action: TraceAction) {
34    info!("{:?} @ {ts}: {} {}", action, dyn_obj_type_str(obj), obj.namespaced_name(),);
35
36    let obj = obj.clone();
37    match event_list.last_mut() {
38        Some(evt) if evt.ts == ts => match action {
39            TraceAction::ObjectApplied => evt.applied_objs.push(obj),
40            TraceAction::ObjectDeleted => evt.deleted_objs.push(obj),
41        },
42        _ => {
43            let evt = match action {
44                TraceAction::ObjectApplied => TraceEvent { ts, applied_objs: vec![obj], ..Default::default() },
45                TraceAction::ObjectDeleted => TraceEvent { ts, deleted_objs: vec![obj], ..Default::default() },
46            };
47            event_list.push(evt);
48        },
49    }
50}