prvng_core/nulib/taskservs/deps_validator.nu
2026-01-17 03:57:20 +00:00

136 lines
4.2 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.

# Taskserv Dependency Validator
# Validates taskserv dependencies, conflicts, and requirements
use lib_provisioning *
use utils.nu *
use ../lib_provisioning/config/accessor.nu *
# Validate taskserv dependencies from Nickel definition
export def validate-dependencies [
taskserv_name: string
settings: record
--verbose (-v)
] {
let taskservs_path = (get-taskservs-path)
let taskserv_schema_path = ($taskservs_path | path join $taskserv_name "nickel")
# Check if taskserv has dependencies.ncl
let deps_file = ($taskserv_schema_path | path join "dependencies.ncl")
if not ($deps_file | path exists) {
return {
valid: true
taskserv: $taskserv_name
has_dependencies: false
warnings: []
errors: []
}
}
if $verbose {
_print $"Validating dependencies for (_ansi yellow_bold)($taskserv_name)(_ansi reset)..."
}
# Run Nickel to extract dependency information
let decl_result = (do {
nickel export $deps_file --format json | from json
} | complete)
if $decl_result.exit_code != 0 {
return {
valid: false
taskserv: $taskserv_name
has_dependencies: true
warnings: []
errors: [$"Failed to parse dependencies.ncl: ($decl_result.stderr)"]
}
}
let result = $decl_result.stdout
# Extract dependency information
let deps = ($result | get -o _dependencies)
if ($deps | is-empty) {
return {
valid: true
taskserv: $taskserv_name
has_dependencies: false
warnings: ["dependencies.ncl exists but no _dependencies defined"]
errors: []
}
}
let requires = ($deps | get -o requires | default [])
let optional = ($deps | get -o optional | default [])
let conflicts = ($deps | get -o conflicts | default [])
mut warnings = []
mut errors = []
# Validate required dependencies
for req in $requires {
let req_path = ($taskservs_path | path join $req)
if not ($req_path | path exists) {
$errors = ($errors | append $"Required dependency not found: ($req)")
} else if $verbose {
_print $" ✓ Required: ($req)"
}
}
# Check optional dependencies
for opt in $optional {
let opt_path = ($taskservs_path | path join $opt)
if not ($opt_path | path exists) {
$warnings = ($warnings | append $"Optional dependency not available: ($opt)")
} else if $verbose {
_print $" Optional: ($opt)"
}
}
# Validate conflicts
for conf in $conflicts {
let conf_path = ($taskservs_path | path join $conf)
if ($conf_path | path exists) {
$warnings = ($warnings | append $"Conflicting taskserv installed: ($conf)")
} else if $verbose {
_print $" ✓ No conflict: ($conf)"
}
}
# Validate resource requirements
let resource_req = ($deps | get -o resource_requirements)
if ($resource_req | is-not-empty) {
let min_memory = ($resource_req | get -o min_memory | default 0)
let min_cores = ($resource_req | get -o min_cores | default 0)
let min_disk = ($resource_req | get -o min_disk | default 0)
if $verbose {
_print $" Resources: CPU($min_cores) MEM($min_memory)GB DISK($min_disk)GB"
}
}
# Check health check configuration
let health_check = ($deps | get -o health_check)
if ($health_check | is-not-empty) {
let endpoint = ($health_check | get -o endpoint | default "")
let timeout = ($health_check | get -o timeout | default 30)
let interval = ($health_check | get -o interval | default 10)
if $verbose {
let health_msg = $" Health: ($endpoint) (timeout=($timeout|into string) interval=($interval|into string))"
_print $health_msg
}
}
{
valid: ($errors | is-empty)
taskserv: $taskserv_name
has_dependencies: true
warnings: $warnings
errors: $errors
requires: $requires
optional: $optional
conflicts: $conflicts
}
}