use chrono::{DateTime, Utc};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use crate::boundary::Condition;
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ProcessCondition {
#[serde(rename = "type")]
pub type_: String,
pub status: String,
pub last_transition_time: DateTime<Utc>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
}
impl ProcessCondition {
pub fn ready(reason: impl Into<String>, message: Option<String>) -> Self {
Self {
type_: "Ready".into(),
status: "True".into(),
last_transition_time: Utc::now(),
reason: Some(reason.into()),
message,
}
}
pub fn not_ready(reason: impl Into<String>, message: impl Into<String>) -> Self {
Self {
type_: "Ready".into(),
status: "False".into(),
last_transition_time: Utc::now(),
reason: Some(reason.into()),
message: Some(message.into()),
}
}
pub fn attested(root: &str) -> Self {
Self {
type_: "Attested".into(),
status: "True".into(),
last_transition_time: Utc::now(),
reason: Some("AttestationWritten".into()),
message: Some(format!("composed_root={root}")),
}
}
}
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct FluxResourceRef {
pub api_version: String,
pub kind: String,
pub name: String,
pub namespace: String,
#[serde(default)]
pub ready: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_check: Option<DateTime<Utc>>,
}
#[derive(Clone, Debug, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct CheckedCondition {
#[serde(flatten)]
pub condition: Condition,
pub satisfied: bool,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub last_check: Option<DateTime<Utc>>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub message: Option<String>,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct BoundaryStatus {
#[serde(default)]
pub preconditions: Vec<CheckedCondition>,
#[serde(default)]
pub postconditions: Vec<CheckedCondition>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub deadline: Option<DateTime<Utc>>,
}
#[derive(Clone, Debug, Default, Serialize, Deserialize, JsonSchema)]
#[serde(rename_all = "camelCase")]
pub struct ComplianceStatus {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub baseline: Option<String>,
pub satisfied: u32,
pub violated: u32,
pub total: u32,
#[serde(default)]
pub violations: Vec<String>,
}