use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(tag = "action", rename_all = "snake_case")]
pub enum PolicyUpdate {
Upsert { policy: OpaPolicy },
Remove { policy_id: String },
Reset { capability: Option<String> },
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct OpaPolicy {
pub policy_id: String,
pub version: u64,
pub capability: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tenant: Option<String>,
#[serde(default)]
pub priority: u32,
pub entrypoint: String,
pub module: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub data: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub limits: Option<PolicyLimits>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub scope: Option<serde_json::Value>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct PolicyLimits {
pub cpu_ms_per_100ms: u32,
pub mem_bytes: u64,
pub io_bytes: u64,
pub pids_max: u32,
pub timeout_ms: u64,
}
impl From<PolicyLimits> for crate::ExecutionLimits {
fn from(value: PolicyLimits) -> Self {
Self {
cpu_ms_per_100ms: value.cpu_ms_per_100ms,
mem_bytes: value.mem_bytes,
io_bytes: value.io_bytes,
pids_max: value.pids_max,
timeout_ms: value.timeout_ms,
}
}
}