prvng_core/nulib/taskservs/deps_validator.nu
Jesús Pérez 894046ef5a
feat(core): three-layer DAG, unified component arch, commands-registry cache, Nushell 0.112.2 migration
- DAG architecture: `dag show/validate/export` (nulib/main_provisioning/dag.nu),
    config loader (lib_provisioning/config/loader/dag.nu), taskserv dag-executor.
    Backed by schemas/lib/dag/*.ncl; orchestrator emits NATS events via
    WorkspaceComposition::into_workflow. See ADR-020, ADR-021.
  - Unified Component Architecture: components/mod.nu, main_provisioning/
    {components,workflow,extensions,ontoref-queries}.nu. Full workflow engine with
    topological sort and NATS subject emission. Blocks A-H complete (libre-daoshi).
  - Commands-registry: nulib/commands-registry.ncl (Nickel source, 314 lines) +
    JSON cache at ~/.cache/provisioning/commands-registry.json rebuilt on source
    change. cli/provisioning fast-path alias expansion avoids cold Nu startup.
    ADDING_COMMANDS.md documents new-command workflow.
  - Platform service manager: service-manager.nu (+573), startup.nu (+611),
    service-check.nu (+255); autostart/bootstrap/health/target refactored.
  - Nushell 0.112.2 migration: removed all try/catch and bash redirections;
    external commands prefixed with ^; type signatures enforced. Driven by
    scripts/refactor-try-catch{,-simplified}.nu.
  - TTY stack: removed shlib/*-tty.sh; replaced by cli/tty-dispatch.sh,
    tty-filter.sh, tty-commands.conf.
  - New domain modules: images/ (golden image lifecycle), workspace/{state,sync}.nu,
    main_provisioning/{bootstrap,cluster-deploy,fip,state}.nu, commands/{state,
    build,integrations/auth,utilities/alias}.nu, platform.nu expanded (+874).
  - Config loader overhaul: loader/core.nu slimmed (-759), cache/core.nu
    refactored (-454), removed legacy loaders/file_loader.nu (-330).
  - Thirteen new provisioning-<domain>.nu top-level modules for bash dispatcher.
  - Tests: test_workspace_state.nu (+351); updates to test_oci_registry,
    test_services.
  - README + CHANGELOG updated.
2026-04-17 04:27:33 +01:00

132 lines
4.1 KiB
Text
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
# REMOVED: use lib_provisioning * - causes circular import
use utils.nu *
use ../lib_provisioning/config/accessor.nu *
use ../lib_provisioning/utils/nickel_processor.nu [ncl-eval]
# 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 result = (try {
ncl-eval $deps_file []
} catch {
return {
valid: false
taskserv: $taskserv_name
has_dependencies: true
warnings: []
errors: ["Failed to parse dependencies.ncl"]
}
})
# 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
}
}