syncable_cli/analyzer/k8s_optimize/rules/
k8s_opt_001.rs1use super::{OptimizationRule, RuleContext, codes};
4use crate::analyzer::k8s_optimize::config::K8sOptimizeConfig;
5use crate::analyzer::k8s_optimize::types::{
6 OptimizationIssue, ResourceRecommendation, ResourceSpec, RuleCode, Severity,
7};
8
9pub struct NoCpuRequestRule;
11
12impl OptimizationRule for NoCpuRequestRule {
13 fn code(&self) -> &'static str {
14 codes::NO_CPU_REQUEST
15 }
16
17 fn description(&self) -> &'static str {
18 "No CPU request defined"
19 }
20
21 fn default_severity(&self) -> Severity {
22 Severity::High
23 }
24
25 fn check(
26 &self,
27 ctx: &RuleContext,
28 _config: &K8sOptimizeConfig,
29 ) -> Option<ResourceRecommendation> {
30 if ctx.current.cpu_request.is_some() {
32 return None;
33 }
34
35 if !ctx.current.has_any() {
37 return None;
38 }
39
40 let defaults = ctx.workload_type.default_resources();
41 let recommended = ResourceSpec {
42 cpu_request: Some(defaults.cpu_request.to_string()),
43 cpu_limit: Some(defaults.cpu_limit.to_string()),
44 memory_request: None,
45 memory_limit: None,
46 };
47
48 Some(ResourceRecommendation {
49 resource_kind: ctx.resource_kind.clone(),
50 resource_name: ctx.resource_name.clone(),
51 namespace: ctx.namespace.clone(),
52 container: ctx.container_name.clone(),
53 file_path: ctx.file_path.clone(),
54 line: ctx.line,
55 issue: OptimizationIssue::NoRequestsDefined,
56 severity: self.default_severity(),
57 message: "No CPU request defined. This can lead to resource contention and unpredictable scheduling.".to_string(),
58 workload_type: ctx.workload_type,
59 current: ctx.current.clone(),
60 actual_usage: None,
61 recommended: recommended.clone(),
62 savings: None,
63 fix_yaml: recommended.to_yaml(),
64 rule_code: RuleCode::new(self.code()),
65 })
66 }
67}