provisioning/core/nulib/main_provisioning/validate.nu

343 lines
13 KiB
Plaintext
Raw Permalink Normal View History

# 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."
}