343 lines
13 KiB
Plaintext
343 lines
13 KiB
Plaintext
# Infrastructure Validation Commands
|
||
# Integrates validation system into the main provisioning CLI
|
||
|
||
# Import validation functions
|
||
use ../lib_provisioning/infra_validator/validator.nu *
|
||
use ../lib_provisioning/infra_validator/agent_interface.nu *
|
||
|
||
# Main validation command
|
||
export def "main validate" [
|
||
infra_path?: string # Path to infrastructure configuration (default: current directory)
|
||
...args # Additional arguments
|
||
--fix (-f) # Auto-fix issues where possible
|
||
--report (-r): string = "md" # Report format (md|yaml|json|all)
|
||
--output (-o): string = "./validation_results" # Output directory
|
||
--severity (-s): string = "warning" # Minimum severity (info|warning|error|critical)
|
||
--ci # CI/CD mode (exit codes, no colors, minimal output)
|
||
--dry-run (-d) # Show what would be fixed without actually fixing
|
||
--rules: string # Comma-separated list of specific rules to run
|
||
--exclude: string # Comma-separated list of rules to exclude
|
||
--verbose (-v) # Verbose output (show all details)
|
||
--help (-h) # Show detailed help
|
||
]: nothing -> nothing {
|
||
|
||
if $help {
|
||
show_validation_help
|
||
return
|
||
}
|
||
|
||
let target_path = if ($infra_path | is-empty) {
|
||
"."
|
||
} else {
|
||
$infra_path
|
||
}
|
||
|
||
if not ($target_path | path exists) {
|
||
if not $ci {
|
||
print $"🛑 Infrastructure path not found: ($target_path)"
|
||
print "Use --help for usage information"
|
||
}
|
||
exit 1
|
||
}
|
||
|
||
if not $ci {
|
||
print_validation_banner
|
||
print $"🔍 Validating infrastructure: ($target_path | path expand)"
|
||
print ""
|
||
}
|
||
|
||
# Validate input parameters
|
||
let valid_severities = ["info", "warning", "error", "critical"]
|
||
if ($severity not-in $valid_severities) {
|
||
if not $ci {
|
||
print $"🛑 Invalid severity level: ($severity)"
|
||
print $"Valid options: ($valid_severities | str join ', ')"
|
||
}
|
||
exit 1
|
||
}
|
||
|
||
let valid_formats = ["md", "markdown", "yaml", "yml", "json", "all"]
|
||
if ($report not-in $valid_formats) {
|
||
if not $ci {
|
||
print $"🛑 Invalid report format: ($report)"
|
||
print $"Valid options: ($valid_formats | str join ', ')"
|
||
}
|
||
exit 1
|
||
}
|
||
|
||
# Set up environment
|
||
setup_validation_environment $verbose
|
||
|
||
# Run validation using the validator engine
|
||
try {
|
||
let result = (main $target_path
|
||
--fix=$fix
|
||
--report=$report
|
||
--output=$output
|
||
--severity=$severity
|
||
--ci=$ci
|
||
--dry-run=$dry_run
|
||
)
|
||
|
||
if not $ci {
|
||
print ""
|
||
print $"📊 Reports generated in: ($output)"
|
||
show_validation_next_steps $result
|
||
}
|
||
|
||
} catch {|error|
|
||
if not $ci {
|
||
print $"🛑 Validation failed: ($error.msg)"
|
||
}
|
||
exit 4
|
||
}
|
||
}
|
||
|
||
# Quick validation subcommand
|
||
export def "main validate quick" [
|
||
infra_path?: string
|
||
--fix (-f)
|
||
]: nothing -> nothing {
|
||
let target = if ($infra_path | is-empty) { "." } else { $infra_path }
|
||
|
||
print "🚀 Quick Infrastructure Validation"
|
||
print "=================================="
|
||
print ""
|
||
|
||
main validate $target --severity="error" --report="md" --output="./quick_validation" --fix=$fix
|
||
}
|
||
|
||
# CI validation subcommand
|
||
export def "main validate ci" [
|
||
infra_path: string
|
||
--format (-f): string = "yaml"
|
||
--fix
|
||
]: nothing -> nothing {
|
||
main validate $infra_path --ci --report=$format --output="./ci_validation" --fix=$fix
|
||
}
|
||
|
||
# Full validation subcommand
|
||
export def "main validate full" [
|
||
infra_path?: string
|
||
--output (-o): string = "./full_validation"
|
||
]: nothing -> nothing {
|
||
let target = if ($infra_path | is-empty) { "." } else { $infra_path }
|
||
|
||
print "🔍 Full Infrastructure Validation"
|
||
print "================================="
|
||
print ""
|
||
|
||
main validate $target --severity="info" --report="all" --output=$output --verbose
|
||
}
|
||
|
||
# Agent interface for automation
|
||
export def "main validate agent" [
|
||
infra_path: string
|
||
--auto_fix: bool = false
|
||
--severity_threshold: string = "warning"
|
||
--format: string = "json"
|
||
]: nothing -> nothing {
|
||
|
||
print "🤖 Agent Validation Mode"
|
||
print "========================"
|
||
print ""
|
||
|
||
let result = (validate_for_agent $infra_path --auto_fix=$auto_fix --severity_threshold=$severity_threshold)
|
||
|
||
match $format {
|
||
"json" => { $result | to json },
|
||
"yaml" => { $result | to yaml },
|
||
_ => { $result }
|
||
}
|
||
}
|
||
|
||
# List available rules
|
||
export def "main validate rules" []: nothing -> nothing {
|
||
print "📋 Available Validation Rules"
|
||
print "============================"
|
||
print ""
|
||
|
||
let rules = [
|
||
{id: "VAL001", category: "syntax", severity: "critical", name: "YAML Syntax Validation", auto_fix: false}
|
||
{id: "VAL002", category: "compilation", severity: "critical", name: "KCL Compilation Check", auto_fix: false}
|
||
{id: "VAL003", category: "syntax", severity: "error", name: "Unquoted Variable References", auto_fix: true}
|
||
{id: "VAL004", category: "schema", severity: "error", name: "Required Fields Validation", auto_fix: false}
|
||
{id: "VAL005", category: "best_practices", severity: "warning", name: "Resource Naming Conventions", auto_fix: true}
|
||
{id: "VAL006", category: "security", severity: "error", name: "Basic Security Checks", auto_fix: false}
|
||
{id: "VAL007", category: "compatibility", severity: "warning", name: "Version Compatibility Check", auto_fix: false}
|
||
{id: "VAL008", category: "networking", severity: "error", name: "Network Configuration Validation", auto_fix: false}
|
||
]
|
||
|
||
for rule in $rules {
|
||
let auto_fix_indicator = if $rule.auto_fix { "🔧" } else { "👁️" }
|
||
let severity_color = match $rule.severity {
|
||
"critical" => "🚨"
|
||
"error" => "❌"
|
||
"warning" => "⚠️"
|
||
_ => "ℹ️"
|
||
}
|
||
|
||
print $"($auto_fix_indicator) ($severity_color) ($rule.id): ($rule.name)"
|
||
print $" Category: ($rule.category) | Severity: ($rule.severity) | Auto-fix: ($rule.auto_fix)"
|
||
print ""
|
||
}
|
||
|
||
print "Legend:"
|
||
print "🔧 = Auto-fixable | 👁️ = Manual fix required"
|
||
print "🚨 = Critical | ❌ = Error | ⚠️ = Warning | ℹ️ = Info"
|
||
}
|
||
|
||
# Test validation system
|
||
export def "main validate test" []: nothing -> nothing {
|
||
print "🧪 Testing Validation System"
|
||
print "============================="
|
||
print ""
|
||
|
||
# Run the test script
|
||
try {
|
||
^nu test_validation.nu
|
||
} catch {|error|
|
||
print $"❌ Test failed: ($error.msg)"
|
||
exit 1
|
||
}
|
||
}
|
||
|
||
def print_validation_banner []: nothing -> nothing {
|
||
print "╔══════════════════════════════════════════════════════════════╗"
|
||
print "║ Infrastructure Validation & Review Tool ║"
|
||
print "║ Cloud Native Provisioning ║"
|
||
print "╚══════════════════════════════════════════════════════════════╝"
|
||
print ""
|
||
}
|
||
|
||
def show_validation_help []: nothing -> nothing {
|
||
print "Infrastructure Validation & Review Tool"
|
||
print "========================================"
|
||
print ""
|
||
print "USAGE:"
|
||
print " ./core/nulib/provisioning validate [SUBCOMMAND] [INFRA_PATH] [OPTIONS]"
|
||
print ""
|
||
print "SUBCOMMANDS:"
|
||
print " (none) Full validation with customizable options"
|
||
print " quick Quick validation focusing on errors and critical issues"
|
||
print " ci CI/CD optimized validation with structured output"
|
||
print " full Comprehensive validation including info-level checks"
|
||
print " agent Agent/automation interface with JSON output"
|
||
print " rules List all available validation rules"
|
||
print " test Run validation system self-tests"
|
||
print ""
|
||
print "ARGUMENTS:"
|
||
print " INFRA_PATH Path to infrastructure configuration (default: current directory)"
|
||
print ""
|
||
print "OPTIONS:"
|
||
print " -f, --fix Auto-fix issues where possible"
|
||
print " -r, --report FORMAT Report format: md, yaml, json, all (default: md)"
|
||
print " -o, --output DIR Output directory (default: ./validation_results)"
|
||
print " -s, --severity LEVEL Minimum severity: info, warning, error, critical (default: warning)"
|
||
print " --ci CI/CD mode (exit codes, no colors, minimal output)"
|
||
print " -d, --dry-run Show what would be fixed without actually fixing"
|
||
print " --rules RULES Comma-separated list of specific rules to run"
|
||
print " --exclude RULES Comma-separated list of rules to exclude"
|
||
print " -v, --verbose Verbose output"
|
||
print " -h, --help Show this help"
|
||
print ""
|
||
print "EXIT CODES:"
|
||
print " 0 All validations passed"
|
||
print " 1 Critical errors found (blocks deployment)"
|
||
print " 2 Errors found (should be fixed)"
|
||
print " 3 Only warnings found"
|
||
print " 4 Validation system error"
|
||
print ""
|
||
print "EXAMPLES:"
|
||
print ""
|
||
print " # Validate current directory"
|
||
print " ./core/nulib/provisioning validate"
|
||
print ""
|
||
print " # Quick validation with auto-fix"
|
||
print " ./core/nulib/provisioning validate quick klab/sgoyol --fix"
|
||
print ""
|
||
print " # CI/CD validation"
|
||
print " ./core/nulib/provisioning validate ci klab/sgoyol --format yaml"
|
||
print ""
|
||
print " # Full validation with all reports"
|
||
print " ./core/nulib/provisioning validate full klab/sgoyol --output ./reports"
|
||
print ""
|
||
print " # Agent mode for automation"
|
||
print " ./core/nulib/provisioning validate agent klab/sgoyol --auto_fix"
|
||
print ""
|
||
print " # List available rules"
|
||
print " ./core/nulib/provisioning validate rules"
|
||
print ""
|
||
print " # Test the validation system"
|
||
print " ./core/nulib/provisioning validate test"
|
||
print ""
|
||
}
|
||
|
||
def setup_validation_environment [verbose: bool]: nothing -> nothing {
|
||
# Check required dependencies
|
||
let dependencies = ["kcl"] # Add other required tools
|
||
|
||
for dep in $dependencies {
|
||
let check = (^bash -c $"type -P ($dep)" | complete)
|
||
if $check.exit_code != 0 {
|
||
if $verbose {
|
||
print $"⚠️ Warning: ($dep) not found in PATH"
|
||
print " Some validation rules may be skipped"
|
||
}
|
||
} else if $verbose {
|
||
print $"✅ ($dep) found"
|
||
}
|
||
}
|
||
}
|
||
|
||
def show_validation_next_steps [result: record]: nothing -> nothing {
|
||
let exit_code = $result.exit_code
|
||
|
||
print "🎯 Next Steps:"
|
||
print "=============="
|
||
|
||
match $exit_code {
|
||
0 => {
|
||
print "✅ All validations passed! Your infrastructure is ready for deployment."
|
||
print ""
|
||
print "Recommended actions:"
|
||
print "• Review the validation report for any enhancement suggestions"
|
||
print "• Consider setting up automated validation in your CI/CD pipeline"
|
||
print "• Share the report with your team for documentation"
|
||
}
|
||
1 => {
|
||
print "🚨 Critical issues found that block deployment:"
|
||
print ""
|
||
print "Required actions:"
|
||
print "• Fix all critical issues before deployment"
|
||
print "• Review the validation report for specific fixes needed"
|
||
print "• Re-run validation after fixes: ./core/nulib/provisioning validate --fix"
|
||
print "• Consider using --dry-run first to preview fixes"
|
||
}
|
||
2 => {
|
||
print "❌ Errors found that should be resolved:"
|
||
print ""
|
||
print "Recommended actions:"
|
||
print "• Review and fix the errors in the validation report"
|
||
print "• Use --fix flag to auto-resolve fixable issues"
|
||
print "• Test your infrastructure after fixes"
|
||
print "• Consider the impact of proceeding with these errors"
|
||
}
|
||
3 => {
|
||
print "⚠️ Warnings found - review recommended:"
|
||
print ""
|
||
print "Suggested actions:"
|
||
print "• Review warnings for potential improvements"
|
||
print "• Consider addressing warnings for better practices"
|
||
print "• Documentation and monitoring suggestions may be included"
|
||
print "• Safe to proceed with deployment"
|
||
}
|
||
_ => {
|
||
print "❓ Unexpected validation result - please review the output"
|
||
}
|
||
}
|
||
|
||
print ""
|
||
print "For detailed information, check the generated reports in the output directory."
|
||
print "Use --help for more usage examples and CI/CD integration guidance."
|
||
} |