use chrono::{DateTime, Utc};
use kube::CustomResource;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use crate::phase::ProcessPhase;
#[derive(CustomResource, Clone, Debug, Deserialize, Serialize, JsonSchema)]
#[kube(
group = "tatara.pleme.io",
version = "v1alpha1",
kind = "ProcessTable",
plural = "processtables",
shortname = "pt",
status = "ProcessTableStatus",
printcolumn = r#"{"name":"Procs","type":"integer","jsonPath":".status.processCount"}"#,
printcolumn = r#"{"name":"Ready","type":"integer","jsonPath":".status.readyCount"}"#,
printcolumn = r#"{"name":"NextPID","type":"integer","jsonPath":".spec.nextSequence"}"#,
printcolumn = r#"{"name":"Depth","type":"integer","jsonPath":".spec.maxDepth"}"#,
printcolumn = r#"{"name":"Age","type":"date","jsonPath":".metadata.creationTimestamp"}"#
)]
#[serde(rename_all = "camelCase")]
pub struct ProcessTableSpec {
#[serde(default = "default_next_seq")]
pub next_sequence: u32,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub parent_pid: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dns_domain: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub dns_zone_id: Option<String>,
#[serde(default)]
pub max_depth: u32,
#[serde(default)]
pub max_children: u32,
#[serde(default = "default_sigterm_timeout")]
pub sigterm_timeout_seconds: u32,
#[serde(default = "default_zombie_timeout")]
pub zombie_timeout_seconds: u32,
#[serde(default = "default_true")]
pub orphan_reaping_enabled: bool,
}
fn default_next_seq() -> u32 {
1
}
fn default_sigterm_timeout() -> u32 {
480
}
fn default_zombie_timeout() -> u32 {
600
}
fn default_true() -> bool {
true
}
#[derive(Clone, Debug, Default, Deserialize, Serialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ProcessTableStatus {
pub process_count: u32,
pub ready_count: u32,
#[serde(default)]
pub processes: Vec<ProcessEntry>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_reconciled: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
pub claims: BTreeMap<String, ClaimRecord>,
}
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct ClaimRecord {
pub holder: String,
pub pid: String,
pub granted_at: DateTime<Utc>,
pub priority: i32,
}
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ProcessEntry {
pub name: String,
pub namespace: String,
pub pid: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub parent_pid: Option<String>,
pub phase: ProcessPhase,
pub point_type: String,
pub substrate: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub content_hash: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub attestation_root: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_updated: Option<DateTime<Utc>>,
}