prvng_platform/scripts/validate-system.nu
Jesús Pérez 09a97ac8f5
chore: update platform submodule to monorepo crates structure
Platform restructured into crates/, added AI service and detector,
       migrated control-center-ui to Leptos 0.8
2026-01-08 21:32:59 +00:00

242 lines
9.1 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env nu
# Comprehensive system validation script
# Validates all components: Nickel schemas, Rust crates, TOML configs, documentation
# Usage: nu scripts/validate-system.nu
def main [] {
print "═══════════════════════════════════════════════════════════════"
print "PROVISIONING PLATFORM - COMPREHENSIVE SYSTEM VALIDATION"
print "═══════════════════════════════════════════════════════════════"
print ""
let start_time = (date now)
# Phase 1: Nickel Schema Files Exist
print "PHASE 1: NICKEL SCHEMA FILES"
print "──────────────────────────────────────────────────────────────"
let schema_files = [
"vault-service.ncl",
"extension-registry.ncl",
"rag.ncl",
"ai-service.ncl",
"provisioning-daemon.ncl",
"orchestrator.ncl",
"control-center.ncl",
"mcp-server.ncl",
"installer.ncl",
]
let schemas_passed = (
$schema_files
| each { |schema|
let schema_path = $"provisioning/.typedialog/provisioning/platform/schemas/($schema)"
if ($schema_path | path exists) {
print $"✓ ($schema)"
1
} else {
print $"✗ ($schema) - NOT FOUND"
0
}
}
| math sum
)
let schemas_failed = ($schema_files | length) - $schemas_passed
print ""
print "PHASE 2: RUST CRATE DEPENDENCIES"
print "──────────────────────────────────────────────────────────────"
let crates = [
["vault-service", "provisioning/platform/crates/vault-service/Cargo.toml"],
["extension-registry", "provisioning/platform/crates/extension-registry/Cargo.toml"],
["provisioning-rag", "provisioning/platform/crates/rag/Cargo.toml"],
["ai-service", "provisioning/platform/crates/ai-service/Cargo.toml"],
["provisioning-daemon", "provisioning/platform/crates/provisioning-daemon/Cargo.toml"],
["orchestrator", "provisioning/platform/crates/orchestrator/Cargo.toml"],
["control-center", "provisioning/platform/crates/control-center/Cargo.toml"],
["mcp-server", "provisioning/platform/crates/mcp-server/Cargo.toml"],
]
let crates_passed = (
$crates
| each { |crate|
let crate_name = $crate.0
let crate_file = $crate.1
if ($crate_file | path exists) {
print $"✓ ($crate_name)"
1
} else {
print $"✗ ($crate_name) - Cargo.toml NOT FOUND"
0
}
}
| math sum
)
let crates_failed = ($crates | length) - $crates_passed
print ""
print "PHASE 3: GENERATED TOML CONFIG FILES"
print "──────────────────────────────────────────────────────────────"
let config_path = "provisioning/platform/config"
let config_count = (
if ($config_path | path exists) {
(ls $config_path | length)
} else {
0
}
)
let config_passed = (
if $config_count > 0 {
print $"✓ Found ($config_count) TOML config files"
if $config_count == 36 {
print "✓ Config count matches expected: 36 (9 services × 4 modes)"
1
} else {
print $"⚠ Config count mismatch: expected 36, found ($config_count)"
1
}
} else {
print "✗ No TOML config files found"
0
}
)
print ""
print "PHASE 4: TYPEDIALOG FORM FILES"
print "──────────────────────────────────────────────────────────────"
let forms_path = "provisioning/.typedialog/provisioning/platform/forms"
let form_count = (
if ($forms_path | path exists) {
(ls $forms_path | length)
} else {
0
}
)
let form_passed = (
if $form_count > 0 {
print $"✓ Found ($form_count) TypeDialog form files"
1
} else {
print "✗ No TypeDialog form files found"
0
}
)
let fragment_count = (
if ("provisioning/.typedialog/provisioning/platform/forms/fragments" | path exists) {
(glob "provisioning/.typedialog/provisioning/platform/forms/fragments/**/*.toml" | length)
} else {
0
}
)
let fragment_passed = (
if $fragment_count > 0 {
print $"✓ Found ($fragment_count) form fragment files"
1
} else {
print "⚠ No form fragment files found"
1
}
)
print ""
print "PHASE 5: OPERATOR DOCUMENTATION"
print "──────────────────────────────────────────────────────────────"
let doc_files = [
"provisioning/docs/src/operations/deployment-guide.md",
"provisioning/docs/src/quick-reference/platform-operations-cheatsheet.md",
"provisioning/docs/src/operations/monitoring-alerting-setup.md",
"provisioning/docs/src/operations/incident-response-runbooks.md",
]
let docs_passed = (
$doc_files
| each { |doc|
if ($doc | path exists) {
let lines = (open $doc | split row "\n" | length)
print $"✓ ($doc) - ($lines) lines"
1
} else {
print $"✗ ($doc) - NOT FOUND"
0
}
}
| math sum
)
let docs_failed = ($doc_files | length) - $docs_passed
print ""
print "PHASE 6: ENVIRONMENT VARIABLE OVERRIDE CAPABILITY"
print "──────────────────────────────────────────────────────────────"
let override_patterns = [
"VAULT_",
"REGISTRY_",
"RAG_",
"AI_SERVICE_",
"DAEMON_",
]
print "✓ Service env var patterns defined:"
for pattern in $override_patterns {
print $" - ($pattern){{SECTION}}_{{KEY}}"
}
let env_passed = 1
print ""
print "PHASE 7: CONSTRAINT SYSTEM"
print "──────────────────────────────────────────────────────────────"
let constraints_file = "provisioning/.typedialog/provisioning/platform/constraints/constraints.toml"
let constraint_passed = (
if ($constraints_file | path exists) {
print $"✓ Constraints file exists"
1
} else {
print "✗ Constraints file not found"
0
}
)
# Aggregate results
let total_passed = $schemas_passed + $crates_passed + $config_passed + $form_passed + $fragment_passed + $docs_passed + $env_passed + $constraint_passed
let total_failed = $schemas_failed + $crates_failed + (if $config_passed == 1 { 0 } else { 1 }) + (if $form_passed == 1 { 0 } else { 1 }) + (if $docs_failed == 0 { 0 } else { $docs_failed }) + (if $constraint_passed == 1 { 0 } else { 1 })
print ""
print "═══════════════════════════════════════════════════════════════"
print "VALIDATION SUMMARY"
print "═══════════════════════════════════════════════════════════════"
let total = $total_passed + $total_failed
let pass_rate = (
if $total == 0 { 0 } else { ($total_passed / $total * 100 | math round --precision 1) }
)
print $"Total Checks: ($total)"
print $"Passed: ($total_passed)"
print $"Failed: ($total_failed)"
print $"Pass Rate: ($pass_rate)%"
let end_time = (date now)
let duration = ($end_time - $start_time)
print $"Duration: ($duration | into duration)"
print ""
if $total_failed == 0 {
print "✅ ALL VALIDATION CHECKS PASSED"
print ""
print "System is ready for:"
print " • Production deployment"
print " • Integration testing"
print " • Operator runbook execution"
exit 0
} else {
print "❌ VALIDATION FAILED - CHECK ITEMS ABOVE"
exit 1
}
}
main