geronimo.validation
Geronimo Configuration Validation Module.
The validation module ensures that the project configuration (geronimo.yaml) is valid
and compliant with deployment requirements before any infrastructure is provisioned.
It checks for:
- Resource sizing (valid Fargate CPU/Memory combinations)
- Scaling policies (min/max instances)
- Naming conventions (project and environment names)
- Structural integrity of the deployment config
Key components:
- ValidationEngine: Runs the suite of registered validation rules.
- ValidationRule: Base class for implementing specific checks.
1"""Geronimo Configuration Validation Module. 2 3The validation module ensures that the project configuration (`geronimo.yaml`) is valid 4and compliant with deployment requirements before any infrastructure is provisioned. 5 6It checks for: 7- Resource sizing (valid Fargate CPU/Memory combinations) 8- Scaling policies (min/max instances) 9- Naming conventions (project and environment names) 10- Structural integrity of the deployment config 11 12Key components: 13- ValidationEngine: Runs the suite of registered validation rules. 14- ValidationRule: Base class for implementing specific checks. 15""" 16 17from geronimo.validation.engine import ValidationEngine, ValidationResult 18from geronimo.validation.rules import ValidationRule 19 20__all__ = [ 21 "ValidationEngine", 22 "ValidationResult", 23 "ValidationRule", 24] 25 26__docformat__ = "google"
24class ValidationEngine: 25 """Runs validation rules against configurations. 26 27 The engine maintains a registry of rules that is checked 28 when validate() is called. 29 """ 30 31 _rules: list[ValidationRule] 32 """List of registered validation rules.""" 33 34 def __init__(self) -> None: 35 """Initialize the validation engine with default rules.""" 36 self._rules: list[ValidationRule] = [] 37 38 # Register default rules 39 for rule_class in DEFAULT_RULES: 40 self._rules.append(rule_class()) 41 42 def register_rule(self, rule: ValidationRule) -> None: 43 """Register a custom validation rule. 44 45 Args: 46 rule: The rule instance to register. 47 """ 48 self._rules.append(rule) 49 50 def validate(self, config: GeronimoConfig) -> ValidationResult: 51 """Validate a configuration against all registered rules. 52 53 Args: 54 config: The configuration to validate. 55 56 Returns: 57 ValidationResult with pass/fail status and any errors. 58 """ 59 results: list[RuleResult] = [] 60 errors: list[str] = [] 61 warnings: list[str] = [] 62 63 for rule in self._rules: 64 result = rule.validate(config) 65 results.append(result) 66 67 if not result.passed: 68 errors.append(f"[{result.rule_name}] {result.message}") 69 70 return ValidationResult( 71 is_valid=len(errors) == 0, 72 rules_checked=len(self._rules), 73 errors=errors, 74 warnings=warnings, 75 results=results, 76 ) 77 78 @property 79 def rules(self) -> list[ValidationRule]: 80 """Get list of registered rules.""" 81 return self._rules.copy()
Runs validation rules against configurations.
The engine maintains a registry of rules that is checked when validate() is called.
34 def __init__(self) -> None: 35 """Initialize the validation engine with default rules.""" 36 self._rules: list[ValidationRule] = [] 37 38 # Register default rules 39 for rule_class in DEFAULT_RULES: 40 self._rules.append(rule_class())
Initialize the validation engine with default rules.
42 def register_rule(self, rule: ValidationRule) -> None: 43 """Register a custom validation rule. 44 45 Args: 46 rule: The rule instance to register. 47 """ 48 self._rules.append(rule)
Register a custom validation rule.
Arguments:
- rule: The rule instance to register.
50 def validate(self, config: GeronimoConfig) -> ValidationResult: 51 """Validate a configuration against all registered rules. 52 53 Args: 54 config: The configuration to validate. 55 56 Returns: 57 ValidationResult with pass/fail status and any errors. 58 """ 59 results: list[RuleResult] = [] 60 errors: list[str] = [] 61 warnings: list[str] = [] 62 63 for rule in self._rules: 64 result = rule.validate(config) 65 results.append(result) 66 67 if not result.passed: 68 errors.append(f"[{result.rule_name}] {result.message}") 69 70 return ValidationResult( 71 is_valid=len(errors) == 0, 72 rules_checked=len(self._rules), 73 errors=errors, 74 warnings=warnings, 75 results=results, 76 )
Validate a configuration against all registered rules.
Arguments:
- config: The configuration to validate.
Returns:
ValidationResult with pass/fail status and any errors.
78 @property 79 def rules(self) -> list[ValidationRule]: 80 """Get list of registered rules.""" 81 return self._rules.copy()
Get list of registered rules.
13@dataclass 14class ValidationResult: 15 """Result of validating a configuration.""" 16 17 is_valid: bool 18 rules_checked: int 19 errors: list[str] = field(default_factory=list) 20 warnings: list[str] = field(default_factory=list) 21 results: list[RuleResult] = field(default_factory=list)
Result of validating a configuration.
24class ValidationRule(ABC): 25 """Abstract base class for validation rules.""" 26 27 # Human-readable name for the rule 28 name: str = "Base Rule" 29 30 # Description of what the rule checks 31 description: str = "" 32 33 @abstractmethod 34 def validate(self, config: "GeronimoConfig") -> RuleResult: 35 """Validate the configuration against this rule. 36 37 Args: 38 config: The configuration to validate. 39 40 Returns: 41 RuleResult indicating pass/fail and any messages. 42 """ 43 pass
Abstract base class for validation rules.
33 @abstractmethod 34 def validate(self, config: "GeronimoConfig") -> RuleResult: 35 """Validate the configuration against this rule. 36 37 Args: 38 config: The configuration to validate. 39 40 Returns: 41 RuleResult indicating pass/fail and any messages. 42 """ 43 pass
Validate the configuration against this rule.
Arguments:
- config: The configuration to validate.
Returns:
RuleResult indicating pass/fail and any messages.