use serde::{Deserialize, Serialize};
use crate::resource::{ResourceKey, ResourceValue};
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "snake_case")]
pub enum ResourceCommand {
Put {
key: ResourceKey,
value: ResourceValue,
reason: Reason,
},
Patch {
key: ResourceKey,
patch: ResourceValue,
reason: Reason,
},
Delete { key: ResourceKey, reason: Reason },
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum Reason {
Operator,
Controller,
GarbageCollector,
Admission,
Scheduler,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
pub enum ResourceOp {
Created,
Replaced,
Patched,
Deleted,
#[default]
NoOp,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn resource_command_serializes_tagged() {
let cmd = ResourceCommand::Put {
key: ResourceKey::namespaced("", "v1", "Pod", "default", "podinfo"),
value: serde_json::json!({"spec": {}}),
reason: Reason::Operator,
};
let s = serde_json::to_string(&cmd).unwrap();
assert!(s.contains("\"kind\":\"put\""));
assert!(s.contains("\"reason\":\"operator\""));
let back: ResourceCommand = serde_json::from_str(&s).unwrap();
assert_eq!(back, cmd);
}
#[test]
fn every_variant_round_trips() {
let key = ResourceKey::namespaced("", "v1", "ConfigMap", "kube-system", "coredns");
let cases = [
ResourceCommand::Put {
key: key.clone(),
value: serde_json::json!({"data": {"k": "v"}}),
reason: Reason::Controller,
},
ResourceCommand::Patch {
key: key.clone(),
patch: serde_json::json!({"data": {"k": "v2"}}),
reason: Reason::Admission,
},
ResourceCommand::Delete {
key: key.clone(),
reason: Reason::GarbageCollector,
},
];
for cmd in cases {
let s = serde_json::to_string(&cmd).unwrap();
let back: ResourceCommand = serde_json::from_str(&s).unwrap();
assert_eq!(back, cmd);
}
}
}