syncable_cli/analyzer/kubelint/templates/
livenessprobe.rs

1//! Liveness probe detection template.
2
3use crate::analyzer::kubelint::context::Object;
4use crate::analyzer::kubelint::extract;
5use crate::analyzer::kubelint::templates::{CheckFunc, ParameterDesc, Template, TemplateError};
6use crate::analyzer::kubelint::types::{Diagnostic, ObjectKindsDesc};
7
8/// Template for detecting containers without liveness probes.
9pub struct LivenessProbeTemplate;
10
11impl Template for LivenessProbeTemplate {
12    fn key(&self) -> &str {
13        "liveness-probe"
14    }
15
16    fn human_name(&self) -> &str {
17        "Liveness Probe"
18    }
19
20    fn description(&self) -> &str {
21        "Detects containers without a liveness probe"
22    }
23
24    fn supported_object_kinds(&self) -> ObjectKindsDesc {
25        ObjectKindsDesc::default()
26    }
27
28    fn parameters(&self) -> Vec<ParameterDesc> {
29        Vec::new()
30    }
31
32    fn instantiate(
33        &self,
34        _params: &serde_yaml::Value,
35    ) -> Result<Box<dyn CheckFunc>, TemplateError> {
36        Ok(Box::new(LivenessProbeCheck))
37    }
38}
39
40struct LivenessProbeCheck;
41
42impl CheckFunc for LivenessProbeCheck {
43    fn check(&self, object: &Object) -> Vec<Diagnostic> {
44        let mut diagnostics = Vec::new();
45
46        if let Some(pod_spec) = extract::pod_spec::extract_pod_spec(&object.k8s_object) {
47            // Only check regular containers, not init containers
48            for container in extract::container::containers(pod_spec) {
49                if container.liveness_probe.is_none() {
50                    diagnostics.push(Diagnostic {
51                        message: format!(
52                            "Container '{}' does not have a liveness probe",
53                            container.name
54                        ),
55                        remediation: Some(
56                            "Add a livenessProbe to detect when the container becomes unresponsive."
57                                .to_string(),
58                        ),
59                    });
60                }
61            }
62        }
63
64        diagnostics
65    }
66}