Platform restructured into crates/, added AI service and detector,
migrated control-center-ui to Leptos 0.8
242 lines
9.1 KiB
Plaintext
242 lines
9.1 KiB
Plaintext
#!/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
|