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