201 lines
6.5 KiB
Python
201 lines
6.5 KiB
Python
"""
|
|
Data models for Kubernetes resources
|
|
"""
|
|
from typing import List, Dict, Any, Optional
|
|
from pydantic import BaseModel
|
|
|
|
class ContainerResource(BaseModel):
|
|
"""Container resources"""
|
|
name: str
|
|
image: str
|
|
resources: Dict[str, Dict[str, str]]
|
|
|
|
class PodResource(BaseModel):
|
|
"""Pod resources"""
|
|
name: str
|
|
namespace: str
|
|
node_name: Optional[str] = None
|
|
phase: str
|
|
containers: List[Dict[str, Any]]
|
|
cpu_requests: float = 0.0
|
|
memory_requests: float = 0.0
|
|
cpu_limits: float = 0.0
|
|
memory_limits: float = 0.0
|
|
|
|
class NamespaceResources(BaseModel):
|
|
"""Namespace resources"""
|
|
name: str
|
|
pods: List[PodResource]
|
|
total_cpu_requests: str = "0"
|
|
total_cpu_limits: str = "0"
|
|
total_memory_requests: str = "0"
|
|
total_memory_limits: str = "0"
|
|
|
|
class VPARecommendation(BaseModel):
|
|
"""VPA recommendation"""
|
|
name: str
|
|
namespace: str
|
|
target_ref: Dict[str, str]
|
|
recommendations: Dict[str, Any]
|
|
|
|
class ResourceValidation(BaseModel):
|
|
"""Resource validation result"""
|
|
pod_name: str
|
|
namespace: str
|
|
container_name: str
|
|
validation_type: str # "missing_requests", "missing_limits", "invalid_ratio", "overcommit"
|
|
severity: str # "warning", "error", "critical"
|
|
message: str
|
|
recommendation: Optional[str] = None
|
|
priority_score: Optional[int] = None # 1-10, higher = more critical
|
|
workload_category: Optional[str] = None # "new", "established", "outlier", "compliant"
|
|
estimated_impact: Optional[str] = None # "low", "medium", "high", "critical"
|
|
|
|
class ClusterReport(BaseModel):
|
|
"""Cluster report"""
|
|
timestamp: str
|
|
total_pods: int
|
|
total_namespaces: int
|
|
total_nodes: int
|
|
validations: List[ResourceValidation]
|
|
vpa_recommendations: List[VPARecommendation]
|
|
overcommit_info: Dict[str, Any]
|
|
summary: Dict[str, Any]
|
|
|
|
class NamespaceReport(BaseModel):
|
|
"""Namespace report"""
|
|
namespace: str
|
|
timestamp: str
|
|
total_pods: int
|
|
validations: List[ResourceValidation]
|
|
resource_usage: Dict[str, Any]
|
|
recommendations: List[str]
|
|
|
|
class ExportRequest(BaseModel):
|
|
"""Request to export report"""
|
|
format: str # "json", "csv", "pdf"
|
|
namespaces: Optional[List[str]] = None
|
|
include_vpa: bool = True
|
|
include_validations: bool = True
|
|
|
|
class ApplyRecommendationRequest(BaseModel):
|
|
"""Request to apply recommendation"""
|
|
pod_name: str
|
|
namespace: str
|
|
container_name: str
|
|
resource_type: str # "cpu", "memory"
|
|
action: str # "requests", "limits"
|
|
value: str
|
|
dry_run: bool = True
|
|
|
|
class WorkloadCategory(BaseModel):
|
|
"""Workload categorization"""
|
|
workload_name: str
|
|
namespace: str
|
|
category: str # "new", "established", "outlier", "compliant"
|
|
age_days: int
|
|
resource_config_status: str # "missing_requests", "missing_limits", "suboptimal_ratio", "compliant"
|
|
priority_score: int # 1-10
|
|
estimated_impact: str # "low", "medium", "high", "critical"
|
|
vpa_candidate: bool = False
|
|
historical_data_available: bool = False
|
|
|
|
class SmartRecommendation(BaseModel):
|
|
"""Smart recommendation based on analysis"""
|
|
workload_name: str
|
|
namespace: str
|
|
recommendation_type: str # "resource_config", "vpa_activation", "ratio_adjustment"
|
|
priority: str # "critical", "high", "medium", "low"
|
|
title: str
|
|
description: str
|
|
current_config: Optional[Dict[str, str]] = None
|
|
suggested_config: Optional[Dict[str, str]] = None
|
|
confidence_level: Optional[float] = None # 0.0-1.0
|
|
estimated_impact: Optional[str] = None
|
|
implementation_steps: Optional[List[str]] = None
|
|
kubectl_commands: Optional[List[str]] = None
|
|
vpa_yaml: Optional[str] = None
|
|
workload_list: Optional[List[str]] = None # List of workloads for grouped recommendations
|
|
|
|
class QoSClassification(BaseModel):
|
|
"""QoS (Quality of Service) classification"""
|
|
pod_name: str
|
|
namespace: str
|
|
qos_class: str # "Guaranteed", "Burstable", "BestEffort"
|
|
cpu_requests: float = 0.0
|
|
memory_requests: float = 0.0
|
|
cpu_limits: float = 0.0
|
|
memory_limits: float = 0.0
|
|
efficiency_score: float = 0.0 # 0.0-1.0
|
|
recommendation: Optional[str] = None
|
|
|
|
class ResourceQuota(BaseModel):
|
|
"""Resource Quota information"""
|
|
namespace: str
|
|
name: str
|
|
cpu_requests: Optional[str] = None
|
|
memory_requests: Optional[str] = None
|
|
cpu_limits: Optional[str] = None
|
|
memory_limits: Optional[str] = None
|
|
pods: Optional[str] = None
|
|
status: str = "Unknown" # "Active", "Exceeded", "Missing"
|
|
usage_percentage: float = 0.0
|
|
recommended_quota: Optional[Dict[str, str]] = None
|
|
|
|
class PodHealthScore(BaseModel):
|
|
"""Pod health score and simplified status"""
|
|
pod_name: str
|
|
namespace: str
|
|
health_score: int # 0-10
|
|
health_status: str # "Excellent", "Good", "Medium", "Poor", "Critical"
|
|
status_color: str # "green", "yellow", "orange", "red"
|
|
status_icon: str # "✅", "🟡", "🟠", "🔴"
|
|
|
|
# Simplified resource display
|
|
cpu_display: str # "100m → 500m (5:1 ratio)"
|
|
memory_display: str # "128Mi → 256Mi (2:1 ratio)"
|
|
cpu_status: str # "✅", "⚠️", "🔴"
|
|
memory_status: str # "✅", "⚠️", "🔴"
|
|
|
|
# Grouped validations
|
|
critical_issues: List[str] = []
|
|
warnings: List[str] = []
|
|
info_items: List[str] = []
|
|
|
|
# Actions available
|
|
available_actions: List[str] = [] # "fix_cpu_ratio", "add_requests", "add_limits"
|
|
oc_commands: List[str] = []
|
|
|
|
class SimplifiedValidation(BaseModel):
|
|
"""Simplified validation for UI display"""
|
|
pod_name: str
|
|
namespace: str
|
|
validation_group: str # "cpu_ratio", "memory_ratio", "missing_requests", "missing_limits"
|
|
severity: str # "critical", "warning", "info"
|
|
title: str # "CPU Ratio Issue"
|
|
description: str # "CPU ratio 5:1 exceeds recommended 3:1"
|
|
current_value: str # "5:1"
|
|
recommended_value: str # "3:1"
|
|
action_required: str # "Adjust CPU limits to 300m"
|
|
oc_command: Optional[str] = None
|
|
|
|
class ClusterHealth(BaseModel):
|
|
"""Cluster health overview"""
|
|
total_pods: int
|
|
total_namespaces: int
|
|
total_nodes: int
|
|
cluster_cpu_capacity: float
|
|
cluster_memory_capacity: float
|
|
cluster_cpu_requests: float
|
|
cluster_memory_requests: float
|
|
cluster_cpu_limits: float
|
|
cluster_memory_limits: float
|
|
cpu_overcommit_percentage: float
|
|
memory_overcommit_percentage: float
|
|
overall_health: str # "Healthy", "Warning", "Critical"
|
|
critical_issues: int
|
|
namespaces_in_overcommit: int
|
|
top_resource_consumers: List[Dict[str, Any]]
|
|
qos_distribution: Dict[str, int]
|
|
resource_quota_coverage: float
|