207 lines
6.2 KiB
Text
207 lines
6.2 KiB
Text
# Cache Manager - Progressive version cache with infra hierarchy
|
|
# Handles cache lookup, storage, and hierarchy management
|
|
|
|
use domain/cache/version_loader.nu [load-version-from-source]
|
|
use domain/cache/grace_checker.nu [is-cache-valid?]
|
|
|
|
# Get version with progressive cache hierarchy
|
|
export def get-cached-version [
|
|
component: string # Component name (e.g., kubernetes, containerd)
|
|
] {
|
|
# Cache hierarchy: infra -> provisioning -> source
|
|
|
|
# 1. Try infra cache first (project-specific)
|
|
let infra_version = (get-infra-cache $component)
|
|
if ($infra_version | is-not-empty) {
|
|
if (is-cache-valid? $component "infra") {
|
|
return $infra_version
|
|
}
|
|
}
|
|
|
|
# 2. Try provisioning cache (system-wide)
|
|
let prov_version = (get-provisioning-cache $component)
|
|
if ($prov_version | is-not-empty) {
|
|
if (is-cache-valid? $component "provisioning") {
|
|
return $prov_version
|
|
}
|
|
}
|
|
|
|
# 3. Load from source and cache
|
|
print $"⚠️ Loading ($component) from source \(cache miss or expired\)"
|
|
let version = (load-version-from-source $component)
|
|
|
|
if ($version | is-not-empty) {
|
|
# Cache in both levels
|
|
cache-version $component $version "provisioning"
|
|
cache-version $component $version "infra"
|
|
return $version
|
|
}
|
|
|
|
# 4. Return empty if not found
|
|
""
|
|
}
|
|
|
|
# Get version from infra cache
|
|
def get-infra-cache [component: string] {
|
|
let cache_path = (get-infra-cache-path)
|
|
let cache_file = ($cache_path | path join "versions.json")
|
|
|
|
if not ($cache_file | path exists) {
|
|
return ""
|
|
}
|
|
|
|
let result = (do { open $cache_file } | complete)
|
|
if $result.exit_code != 0 {
|
|
return ""
|
|
}
|
|
|
|
let cache_data = ($result.stdout | from json)
|
|
let version_result = (do { $cache_data | get $component } | complete)
|
|
let version_data = if $version_result.exit_code == 0 { $version_result.stdout } else { {} }
|
|
let current_result = (do { $version_data | get current } | complete)
|
|
if $current_result.exit_code == 0 { $current_result.stdout } else { "" }
|
|
}
|
|
|
|
# Get version from provisioning cache
|
|
def get-provisioning-cache [component: string] {
|
|
let cache_path = (get-provisioning-cache-path)
|
|
let cache_file = ($cache_path | path join "versions.json")
|
|
|
|
if not ($cache_file | path exists) {
|
|
return ""
|
|
}
|
|
|
|
let result = (do { open $cache_file } | complete)
|
|
if $result.exit_code != 0 {
|
|
return ""
|
|
}
|
|
|
|
let cache_data = ($result.stdout | from json)
|
|
let version_result = (do { $cache_data | get $component } | complete)
|
|
let version_data = if $version_result.exit_code == 0 { $version_result.stdout } else { {} }
|
|
let current_result = (do { $version_data | get current } | complete)
|
|
if $current_result.exit_code == 0 { $current_result.stdout } else { "" }
|
|
}
|
|
|
|
# Cache version data
|
|
export def cache-version [
|
|
component: string # Component name
|
|
version: string # Version string
|
|
cache_type: string # "infra" or "provisioning"
|
|
] {
|
|
let cache_path = if $cache_type == "infra" {
|
|
get-infra-cache-path
|
|
} else {
|
|
get-provisioning-cache-path
|
|
}
|
|
|
|
let cache_file = ($cache_path | path join "versions.json")
|
|
|
|
# Ensure cache directory exists
|
|
mkdir ($cache_file | path dirname)
|
|
|
|
# Load existing cache or create new
|
|
let existing_cache = if ($cache_file | path exists) {
|
|
let result = (do { open $cache_file } | complete)
|
|
if $result.exit_code == 0 { $result.stdout | from json } else { {} }
|
|
} else {
|
|
{}
|
|
}
|
|
|
|
# Update cache entry
|
|
let updated_cache = ($existing_cache | upsert $component {
|
|
current: $version
|
|
cached_at: (date now | format date '%Y-%m-%dT%H:%M:%SZ')
|
|
cache_type: $cache_type
|
|
grace_period: (get-default-grace-period)
|
|
})
|
|
|
|
# Save cache
|
|
$updated_cache | save -f $cache_file
|
|
}
|
|
|
|
# Get cache paths from config
|
|
export def get-infra-cache-path [] {
|
|
use ../config/accessor.nu config-get
|
|
let infra_path = (config-get "paths.infra" "")
|
|
let current_infra = (config-get "infra.current" "default")
|
|
|
|
if ($infra_path | is-empty) {
|
|
return (get-provisioning-cache-path)
|
|
}
|
|
|
|
$infra_path | path join $current_infra "cache"
|
|
}
|
|
|
|
export def get-provisioning-cache-path [] {
|
|
use ../config/accessor.nu config-get
|
|
config-get "cache.path" ".cache/versions"
|
|
}
|
|
|
|
def get-default-grace-period [] {
|
|
use ../config/accessor.nu config-get
|
|
config-get "cache.grace_period" 86400
|
|
}
|
|
|
|
# Initialize cache system
|
|
export def init-cache-system [] {
|
|
let infra_cache = (get-infra-cache-path)
|
|
let prov_cache = (get-provisioning-cache-path)
|
|
|
|
mkdir $infra_cache
|
|
mkdir $prov_cache
|
|
|
|
# Create empty cache files if they don't exist
|
|
let infra_file = ($infra_cache | path join "versions.json")
|
|
let prov_file = ($prov_cache | path join "versions.json")
|
|
|
|
if not ($infra_file | path exists) {
|
|
{} | save $infra_file
|
|
}
|
|
|
|
if not ($prov_file | path exists) {
|
|
{} | save $prov_file
|
|
}
|
|
}
|
|
|
|
# Clear cache system
|
|
export def clear-cache-system [] {
|
|
let infra_cache = (get-infra-cache-path)
|
|
let prov_cache = (get-provisioning-cache-path)
|
|
|
|
if ($infra_cache | path exists) {
|
|
do { rm -rf $infra_cache } | complete | ignore
|
|
}
|
|
if ($prov_cache | path exists) {
|
|
do { rm -rf $prov_cache } | complete | ignore
|
|
}
|
|
|
|
init-cache-system
|
|
}
|
|
|
|
# Show cache status
|
|
export def show-cache-status [] {
|
|
let infra_cache = (get-infra-cache-path | path join "versions.json")
|
|
let prov_cache = (get-provisioning-cache-path | path join "versions.json")
|
|
|
|
print "📁 Cache Locations:"
|
|
print $" Infra: ($infra_cache)"
|
|
print $" Provisioning: ($prov_cache)"
|
|
print ""
|
|
|
|
if ($infra_cache | path exists) {
|
|
let infra_data = (open $infra_cache)
|
|
let infra_count = ($infra_data | columns | length)
|
|
print $"🏗️ Infra cache: ($infra_count) components"
|
|
} else {
|
|
print "🏗️ Infra cache: not found"
|
|
}
|
|
|
|
if ($prov_cache | path exists) {
|
|
let prov_data = (open $prov_cache)
|
|
let prov_count = ($prov_data | columns | length)
|
|
print $"⚙️ Provisioning cache: ($prov_count) components"
|
|
} else {
|
|
print "⚙️ Provisioning cache: not found"
|
|
}
|
|
}
|