stormchaser-runner-k8s 1.4.2

A robust, distributed workflow engine for event-driven and human-triggered workflows.
Documentation
use k8s_openapi::api::core::v1::Pod;

pub struct PodMetrics {
    pub exit_code: Option<i32>,
    pub attempts: i32,
    pub failure_reason: Option<String>,
}

pub fn do_extract_pod_metrics_with_reason(pods: Vec<Pod>) -> PodMetrics {
    let mut max_restart_count = 0;
    let mut exit_code = None;
    let mut failure_reason = None;

    for pod in pods {
        if let Some(status) = pod.status {
            if let Some(container_statuses) = status.container_statuses {
                for cs in container_statuses {
                    max_restart_count = max_restart_count.max(cs.restart_count);
                    if let Some(state) = cs.state {
                        if let Some(terminated) = state.terminated {
                            exit_code = Some(terminated.exit_code);
                            if terminated.exit_code != 0 {
                                let reason = terminated.reason.as_deref().unwrap_or("Terminated");
                                let message = terminated.message.as_deref().unwrap_or("");
                                failure_reason = Some(if message.is_empty() {
                                    reason.to_string()
                                } else {
                                    format!("{}: {}", reason, message)
                                });
                            }
                        } else if let Some(waiting) = state.waiting {
                            let reason = waiting.reason.as_deref().unwrap_or("Waiting");
                            let message = waiting.message.as_deref().unwrap_or("");
                            failure_reason = Some(if message.is_empty() {
                                reason.to_string()
                            } else {
                                format!("{}: {}", reason, message)
                            });
                        }
                    }
                }
            }
        }
    }

    PodMetrics {
        exit_code,
        attempts: 1 + max_restart_count,
        failure_reason,
    }
}