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}