provisioning/providers/prov_lib/middleware_enhanced.nu

233 lines
7.9 KiB
Plaintext
Raw Permalink Normal View History

# Enhanced middleware with extension support
# This file can replace middleware.nu to support dynamic provider loading
use ../../core/nulib/lib_provisioning/extensions/registry.nu *
# Import core providers (keep existing functionality)
use ../aws/nulib/aws/env.nu
use ../aws/nulib/aws/servers.nu *
use ../aws/nulib/aws/cache.nu *
use ../aws/nulib/aws/prices.nu *
use ../local/nulib/local/env.nu
use ../local/nulib/local/servers.nu *
use ../upcloud/nulib/upcloud/env.nu
use ../upcloud/nulib/upcloud/servers.nu *
use ../upcloud/nulib/upcloud/cache.nu *
use ../upcloud/nulib/upcloud/prices.nu *
# Initialize extension registry on first load
init-registry
def provider_undefined [
server: record
] {
let str_providers_list = (providers_list "selection" | each { |it| $it.name} | str join " ")
print ($"(_ansi blue_bold)($server.hostname)(_ansi reset) with provider " +
$"(_ansi green_bold)($server.provider)(_ansi reset) ($server.zone) ")
let text = ( $"expected to be one of available providers [(_ansi green_italic)($str_providers_list)(_ansi reset)], " +
$"got (_ansi green_bold)($server.provider)(_ansi reset)")
print $"Error 🛑 provider ($text)"
}
# Load extension provider dynamically
def load_extension_provider [provider_name: string] {
let provider_info = (get-provider $provider_name)
if ($provider_info | is-not-empty) and $provider_info.available {
try {
use ($provider_info.entry_point) *
return true
} catch {
return false
}
}
false
}
# Enhanced query with extension support
export def mw_query_servers [
settings: record
find?: string
cols?: string
--prov: string
--serverpos: int
] {
let str_find = if $find != null { $find } else { "" }
let str_cols = if $cols != null { $cols } else { "" }
$settings.data.servers | enumerate | each { |it|
if $prov == null or $it.item.provider == $prov {
if $serverpos == null or $serverpos == $it.index {
let res = match $it.item.provider {
"aws" => {
(aws_query_servers $str_find $str_cols)
},
"local" => {
(local_query_servers $str_find $str_cols)
},
"upcloud" => {
(upcloud_query_servers $str_find $str_cols)
},
_ => {
# Try loading extension provider
if (load_extension_provider $it.item.provider) {
# Dynamically call provider function
try {
# Convention: {provider}_query_servers
let func_name = $"($it.item.provider)_query_servers"
(nu -c $"use ($env.PROVISIONING_PROV_LIB | path join 'middleware_enhanced.nu') *; ($func_name) ($str_find) ($str_cols)")
} catch {
provider_undefined $it.item
[]
}
} else {
provider_undefined $it.item
[]
}
}
}
$res
}
}
} | flatten
}
# Enhanced server creation with extension support
export def mw_create_servers [
settings: record
servers: table
check: bool
wait: bool
] {
$servers | each { |server|
# Check if provider is allowed by profile
use ../../core/nulib/lib_provisioning/extensions/profiles.nu is-provider-allowed
if not (is-provider-allowed $server.provider) {
print $"🛑 Provider ($server.provider) blocked by profile"
continue
}
let res = match $server.provider {
"aws" => {
(aws_create_servers $settings [$server] $check $wait)
},
"local" => {
(local_create_servers $settings [$server] $check $wait)
},
"upcloud" => {
(upcloud_create_servers $settings [$server] $check $wait)
},
_ => {
# Try loading extension provider
if (load_extension_provider $server.provider) {
try {
let func_name = $"($server.provider)_create_servers"
(nu -c $"use ($env.PROVISIONING_PROV_LIB | path join 'middleware_enhanced.nu') *; ($func_name) ($settings | to json) ([$server] | to json) ($check) ($wait)")
} catch {
provider_undefined $server
[]
}
} else {
provider_undefined $server
[]
}
}
}
$res
}
}
# Enhanced server deletion with extension support
export def mw_delete_servers [
settings: record
servers: table
check: bool
] {
$servers | each { |server|
# Check if provider is allowed by profile
use ../../core/nulib/lib_provisioning/extensions/profiles.nu is-provider-allowed
if not (is-provider-allowed $server.provider) {
print $"🛑 Provider ($server.provider) blocked by profile"
continue
}
let res = match $server.provider {
"aws" => {
(aws_delete_servers $settings [$server] $check)
},
"local" => {
(local_delete_servers $settings [$server] $check)
},
"upcloud" => {
(upcloud_delete_servers $settings [$server] $check)
},
_ => {
# Try loading extension provider
if (load_extension_provider $server.provider) {
try {
let func_name = $"($server.provider)_delete_servers"
(nu -c $"use ($env.PROVISIONING_PROV_LIB | path join 'middleware_enhanced.nu') *; ($func_name) ($settings | to json) ([$server] | to json) ($check)")
} catch {
provider_undefined $server
[]
}
} else {
provider_undefined $server
[]
}
}
}
$res
}
}
# Get IP with extension support
export def mw_get_ip [
settings: record
server: record
ip_type: string
public_fallback: bool
] -> string {
match $server.provider {
"aws" => {
(aws_get_ip $settings $server $ip_type $public_fallback)
},
"local" => {
(local_get_ip $settings $server $ip_type $public_fallback)
},
"upcloud" => {
(upcloud_get_ip $settings $server $ip_type $public_fallback)
},
_ => {
# Try loading extension provider
if (load_extension_provider $server.provider) {
try {
let func_name = $"($server.provider)_get_ip"
(nu -c $"use ($env.PROVISIONING_PROV_LIB | path join 'middleware_enhanced.nu') *; ($func_name) ($settings | to json) ($server | to json) ($ip_type) ($public_fallback)")
} catch {
""
}
} else {
""
}
}
}
}
# List all providers (core + extensions)
export def mw_list_all_providers [] {
let core_providers = [
{ name: "aws", type: "core", path: "../aws" }
{ name: "local", type: "core", path: "../local" }
{ name: "upcloud", type: "core", path: "../upcloud" }
]
let extension_providers = (list-providers | each {|ext|
{
name: $ext.name
type: "extension"
path: $ext.source
version: $ext.version
}
})
$core_providers | append $extension_providers
}