233 lines
7.9 KiB
Plaintext
233 lines
7.9 KiB
Plaintext
# 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
|
|
} |