provisioning/workspace/tools/layer-utils.nu
2025-10-07 11:12:02 +01:00

361 lines
13 KiB
Plaintext

# Layer Resolution Utilities
# Supporting functions for layer management and resolution testing
# Test layer resolution for a specific module
export def test_layer_resolution [
module_name: string,
infra: string,
provider: string
] {
print $"🧪 Testing layer resolution for ($module_name)"
print $" Context: infra=($infra), provider=($provider)"
# Test each layer in resolution order
test_layer_core $module_name
test_layer_workspace $module_name
test_layer_infra $module_name $infra
print $"📊 Resolution Summary:"
summarize_resolution $module_name $infra
}
# Test core layer
def test_layer_core [module_name: string] {
print " 🔍 Layer 1 (Core): Priority 100"
# Use discovery system to find taskserv in grouped structure
let taskserv_exists = try {
use ../../core/nulib/taskservs/discover.nu *
let taskserv_info = get-taskserv-info $module_name
($taskserv_info.name == $module_name)
} catch {
false
}
let provider_path = $"provisioning/extensions/providers/($module_name)"
let provider_exists = ($provider_path | path exists)
if $taskserv_exists {
print $" ✅ Taskserv found in grouped structure"
} else {
print $" ❌ Taskserv not found in extensions"
}
if $provider_exists {
print $" ✅ Provider found: ($provider_path)"
} else {
print $" ❌ Provider not found: ($provider_path)"
}
}
# Test workspace layer
def test_layer_workspace [module_name: string] {
print " 🔍 Layer 2 (Workspace): Priority 200"
# Find workspace root (look for workspace with infra/ subdirectory)
let workspace_root = find_workspace_root
if ($workspace_root | is-empty) {
print $" ⚠️ No workspace found"
return
}
# Check workspace-level loaded modules (new 3-layer architecture)
let loaded_taskserv = ($workspace_root | path join ".taskservs" $module_name)
let loaded_provider = ($workspace_root | path join ".providers" $module_name)
let loaded_cluster = ($workspace_root | path join ".clusters" $module_name)
let taskserv_loaded = ($loaded_taskserv | path exists)
let provider_loaded = ($loaded_provider | path exists)
let cluster_loaded = ($loaded_cluster | path exists)
if $taskserv_loaded {
print $" ✅ Taskserv loaded at workspace level: .taskservs/($module_name)"
} else {
print $" ❌ Taskserv not loaded at workspace level"
}
if $provider_loaded {
print $" ✅ Provider loaded at workspace level: .providers/($module_name)"
} else {
print $" ❌ Provider not loaded at workspace level"
}
if $cluster_loaded {
print $" ✅ Cluster loaded at workspace level: .clusters/($module_name)"
} else {
print $" ❌ Cluster not loaded at workspace level"
}
}
# Find workspace root (directory with infra/ subdirectory)
def find_workspace_root []: nothing -> string {
let pwd = $env.PWD
# Check current directory
if (($pwd | path join "infra") | path exists) and (($pwd | path join ".taskservs") | path exists) {
return $pwd
}
# Check if we're inside infra/ directory, go up
if ($pwd | str contains "/infra/") {
let parts = ($pwd | path split)
let infra_idx = ($parts | enumerate | where item == "infra" | get index | first)
if ($infra_idx | is-not-empty) {
let workspace_parts = ($parts | take $infra_idx)
let workspace_path = ($workspace_parts | path join)
if ($workspace_path | path exists) {
return $workspace_path
}
}
}
""
}
# Test infrastructure layer
def test_layer_infra [module_name: string, infra: string] {
print " 🔍 Layer 3 (Infrastructure): Priority 300"
if ($infra | is-empty) {
print $" ⚠️ No infrastructure context provided"
return
}
# Find workspace root and build infra path
let workspace_root = find_workspace_root
if ($workspace_root | is-empty) {
print $" ⚠️ No workspace found"
return
}
let infra_path = ($workspace_root | path join "infra" $infra)
# Check infrastructure-level loaded modules (new 3-layer architecture)
let infra_taskserv = ($infra_path | path join ".taskservs" $module_name)
let infra_provider = ($infra_path | path join ".providers" $module_name)
let infra_cluster = ($infra_path | path join ".clusters" $module_name)
let taskserv_exists = ($infra_taskserv | path exists)
let provider_exists = ($infra_provider | path exists)
let cluster_exists = ($infra_cluster | path exists)
if $taskserv_exists {
print $" ✅ Infrastructure taskserv override: infra/($infra)/.taskservs/($module_name)"
} else {
print $" ❌ Infrastructure taskserv not overridden"
}
if $provider_exists {
print $" ✅ Infrastructure provider override: infra/($infra)/.providers/($module_name)"
} else {
print $" ❌ Infrastructure provider not overridden"
}
if $cluster_exists {
print $" ✅ Infrastructure cluster override: infra/($infra)/.clusters/($module_name)"
} else {
print $" ❌ Infrastructure cluster not overridden"
}
}
# Summarize resolution results
def summarize_resolution [module_name: string, infra: string] {
mut resolution_chain = []
let workspace_root = find_workspace_root
# Check infra layer first (highest priority - Layer 3)
if not ($infra | is-empty) and not ($workspace_root | is-empty) {
let infra_path = ($workspace_root | path join "infra" $infra)
let infra_taskserv = ($infra_path | path join ".taskservs" $module_name)
let infra_provider = ($infra_path | path join ".providers" $module_name)
let infra_cluster = ($infra_path | path join ".clusters" $module_name)
if ($infra_taskserv | path exists) or ($infra_provider | path exists) or ($infra_cluster | path exists) {
$resolution_chain = ($resolution_chain | append "infra")
}
}
# Check workspace layer (Layer 2)
if not ($workspace_root | is-empty) {
let workspace_taskserv = ($workspace_root | path join ".taskservs" $module_name)
let workspace_provider = ($workspace_root | path join ".providers" $module_name)
let workspace_cluster = ($workspace_root | path join ".clusters" $module_name)
if ($workspace_taskserv | path exists) or ($workspace_provider | path exists) or ($workspace_cluster | path exists) {
$resolution_chain = ($resolution_chain | append "workspace")
}
}
# Check core layer using discovery system (Layer 1)
let core_exists = try {
use ../../core/nulib/taskservs/discover.nu *
let taskserv_info = get-taskserv-info $module_name
($taskserv_info.name == $module_name)
} catch {
false
}
if $core_exists {
$resolution_chain = ($resolution_chain | append "system")
}
if ($resolution_chain | length) > 0 {
let final_resolution = ($resolution_chain | first)
print $" 🎯 Final Resolution: ($final_resolution)"
print $" 📋 Full Chain: (($resolution_chain | str join ' → '))"
} else {
print $" ❌ No resolution found for ($module_name)"
}
$resolution_chain
}
# Get available modules in each layer
export def get_layer_modules [layer: string] {
match $layer {
"system" | "core" => {
# Use the discovery system to get all modules from system extensions
try {
use ../../core/nulib/taskservs/discover.nu *
discover-taskservs | get name
} catch {
[]
}
}
"workspace" => {
# Get loaded modules from workspace layer
let workspace_root = find_workspace_root
if ($workspace_root | is-empty) {
return []
}
mut modules = []
# Check workspace-level loaded modules
let taskservs_dir = ($workspace_root | path join ".taskservs")
let providers_dir = ($workspace_root | path join ".providers")
let clusters_dir = ($workspace_root | path join ".clusters")
if ($taskservs_dir | path exists) {
let taskservs = (ls $taskservs_dir | where type == dir | get name | each {|path| $path | path basename})
$modules = ($modules | append $taskservs)
}
if ($providers_dir | path exists) {
let providers = (ls $providers_dir | where type == dir | get name | each {|path| $path | path basename})
$modules = ($modules | append $providers)
}
if ($clusters_dir | path exists) {
let clusters = (ls $clusters_dir | where type == dir | get name | each {|path| $path | path basename})
$modules = ($modules | append $clusters)
}
$modules | uniq
}
"infra" => {
# Get loaded modules from infrastructure layer
let workspace_root = find_workspace_root
if ($workspace_root | is-empty) {
return []
}
# Get all infrastructure directories
let infra_root = ($workspace_root | path join "infra")
if not ($infra_root | path exists) {
return []
}
let infras = (ls $infra_root | where type == dir | get name)
mut all_modules = []
for infra_path in $infras {
let taskservs_dir = ($infra_path | path join ".taskservs")
let providers_dir = ($infra_path | path join ".providers")
let clusters_dir = ($infra_path | path join ".clusters")
if ($taskservs_dir | path exists) {
let taskservs = (ls $taskservs_dir | where type == dir | get name | each {|path| $path | path basename})
$all_modules = ($all_modules | append $taskservs)
}
if ($providers_dir | path exists) {
let providers = (ls $providers_dir | where type == dir | get name | each {|path| $path | path basename})
$all_modules = ($all_modules | append $providers)
}
if ($clusters_dir | path exists) {
let clusters = (ls $clusters_dir | where type == dir | get name | each {|path| $path | path basename})
$all_modules = ($all_modules | append $clusters)
}
}
$all_modules | uniq
}
_ => []
}
}
# Validate layer configuration
export def validate_layer_config [] {
print "🔍 Validating layer configuration"
# Check layer definition files
let core_layer = "provisioning/workspace/layers/core.layer.k"
let workspace_layer = "provisioning/workspace/layers/workspace.layer.k"
let infra_layer = "provisioning/workspace/layers/infra.layer.k"
print $" Layer definitions:"
print $" Core: ({($core_layer | path exists)})"
print $" Workspace: ({($workspace_layer | path exists)})"
print $" Infrastructure: ({($infra_layer | path exists)})"
# Check registry files
let manifest = "provisioning/workspace/registry/manifest.yaml"
let imports = "provisioning/workspace/registry/imports.k"
print $" Registry:"
print $" Manifest: ({($manifest | path exists)})"
print $" Imports: ({($imports | path exists)})"
# Check composition utilities
let compose = "provisioning/workspace/templates/lib/compose.k"
let override = "provisioning/workspace/templates/lib/override.k"
print $" Composition utilities:"
print $" Compose: ({($compose | path exists)})"
print $" Override: ({($override | path exists)})"
print "✅ Layer validation completed"
}
# Show layer statistics
export def show_layer_stats [] {
print "📊 Layer Statistics"
let core_modules = get_layer_modules "core"
let workspace_modules = get_layer_modules "workspace"
print $" Core layer: (($core_modules | length)) modules"
if ($core_modules | length) > 0 {
print $" Modules: (($core_modules | str join ', '))"
}
print $" Workspace layer: (($workspace_modules | length)) templates"
if ($workspace_modules | length) > 0 {
print $" Templates: (($workspace_modules | str join ', '))"
}
# Check for workspace infrastructures
if ("workspace/infra" | path exists) {
let infras = ls "workspace/infra" | where type == dir | get name | each {|path| $path | path basename}
print $" Infrastructure layer: (($infras | length)) infrastructures"
if ($infras | length) > 0 {
print $" Infrastructures: (($infras | str join ', '))"
}
} else {
print $" Infrastructure layer: 0 infrastructures"
}
}