304 lines
7.0 KiB
Plaintext
304 lines
7.0 KiB
Plaintext
|
|
# Local Provider Adapter
|
||
|
|
# Implements the standard provider interface for Local (bare metal/existing servers)
|
||
|
|
|
||
|
|
use nulib/local/env.nu
|
||
|
|
use nulib/local/servers.nu *
|
||
|
|
|
||
|
|
# Provider metadata
|
||
|
|
export def get-provider-metadata []: nothing -> record {
|
||
|
|
{
|
||
|
|
name: "local"
|
||
|
|
version: "1.0.0"
|
||
|
|
description: "Local provider for bare metal and existing servers"
|
||
|
|
capabilities: {
|
||
|
|
server_management: true
|
||
|
|
network_management: false # Limited network management
|
||
|
|
storage_management: true
|
||
|
|
load_balancer: false
|
||
|
|
dns_management: false
|
||
|
|
cdn: false
|
||
|
|
backup_service: false
|
||
|
|
monitoring: false
|
||
|
|
logging: false
|
||
|
|
auto_scaling: false
|
||
|
|
spot_instances: false
|
||
|
|
containers: true
|
||
|
|
serverless: false
|
||
|
|
multi_region: false
|
||
|
|
encryption_at_rest: false
|
||
|
|
encryption_in_transit: false
|
||
|
|
compliance_certifications: []
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
# Server query operations
|
||
|
|
export def query_servers [
|
||
|
|
find?: string
|
||
|
|
cols?: string
|
||
|
|
]: nothing -> list {
|
||
|
|
let str_find = if $find != null { $find } else { "" }
|
||
|
|
let str_cols = if $cols != null { $cols } else { "" }
|
||
|
|
local_query_servers $str_find $str_cols
|
||
|
|
}
|
||
|
|
|
||
|
|
# Server information operations
|
||
|
|
export def server_info [
|
||
|
|
server: record
|
||
|
|
check: bool
|
||
|
|
find?: string
|
||
|
|
cols?: string
|
||
|
|
]: nothing -> record {
|
||
|
|
local_server_info $server $check
|
||
|
|
}
|
||
|
|
|
||
|
|
# Server existence and status operations
|
||
|
|
export def server_exists [
|
||
|
|
server: record
|
||
|
|
error_exit: bool
|
||
|
|
]: nothing -> bool {
|
||
|
|
local_server_exists $server $error_exit
|
||
|
|
}
|
||
|
|
|
||
|
|
export def server_is_running [
|
||
|
|
server: record
|
||
|
|
error_exit: bool
|
||
|
|
]: nothing -> bool {
|
||
|
|
local_server_is_running $server $error_exit
|
||
|
|
}
|
||
|
|
|
||
|
|
# Server lifecycle operations
|
||
|
|
export def check_server_requirements [
|
||
|
|
settings: record
|
||
|
|
server: record
|
||
|
|
check: bool
|
||
|
|
]: nothing -> bool {
|
||
|
|
local_check_server_requirements $settings $server $check
|
||
|
|
}
|
||
|
|
|
||
|
|
export def create_server [
|
||
|
|
settings: record
|
||
|
|
server: record
|
||
|
|
check: bool
|
||
|
|
wait: bool
|
||
|
|
]: nothing -> bool {
|
||
|
|
# Local provider doesn't "create" servers, they already exist
|
||
|
|
# This just validates the server is accessible
|
||
|
|
try {
|
||
|
|
local_server_state $server "started" true $wait $settings
|
||
|
|
true
|
||
|
|
} catch {
|
||
|
|
false
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
export def delete_server [
|
||
|
|
settings: record
|
||
|
|
server: record
|
||
|
|
keep_storage: bool
|
||
|
|
error_exit: bool
|
||
|
|
]: nothing -> bool {
|
||
|
|
local_delete_server $settings $server $keep_storage $error_exit
|
||
|
|
}
|
||
|
|
|
||
|
|
export def delete_server_storage [
|
||
|
|
settings: record
|
||
|
|
server: record
|
||
|
|
error_exit: bool
|
||
|
|
]: nothing -> bool {
|
||
|
|
local_delete_server_storage $settings $server $error_exit
|
||
|
|
}
|
||
|
|
|
||
|
|
export def post_create_server [
|
||
|
|
settings: record
|
||
|
|
server: record
|
||
|
|
check: bool
|
||
|
|
]: nothing -> bool {
|
||
|
|
local_post_create_server $settings $server $check
|
||
|
|
}
|
||
|
|
|
||
|
|
export def modify_server [
|
||
|
|
settings: record
|
||
|
|
server: record
|
||
|
|
new_values: list
|
||
|
|
error_exit: bool
|
||
|
|
]: nothing -> bool {
|
||
|
|
local_modify_server $settings $server $new_values $error_exit
|
||
|
|
}
|
||
|
|
|
||
|
|
# Server state management
|
||
|
|
export def server_state [
|
||
|
|
server: record
|
||
|
|
new_state: string
|
||
|
|
error_exit: bool
|
||
|
|
wait: bool
|
||
|
|
settings: record
|
||
|
|
]: nothing -> bool {
|
||
|
|
local_server_state $server $new_state $error_exit $wait $settings
|
||
|
|
}
|
||
|
|
|
||
|
|
# Network operations
|
||
|
|
export def get_ip [
|
||
|
|
settings: record
|
||
|
|
server: record
|
||
|
|
ip_type: string
|
||
|
|
error_exit: bool
|
||
|
|
]: nothing -> string {
|
||
|
|
let use_type = match $ip_type {
|
||
|
|
"$network_public_ip" => "public"
|
||
|
|
"$network_private_ip" => "private"
|
||
|
|
_ => $ip_type
|
||
|
|
}
|
||
|
|
|
||
|
|
let result = (local_server [ "get_ip", $use_type ] --server $server --settings $settings)
|
||
|
|
$result | str trim
|
||
|
|
}
|
||
|
|
|
||
|
|
export def servers_ips [
|
||
|
|
settings: record
|
||
|
|
data: list
|
||
|
|
prov?: string
|
||
|
|
serverpos?: int
|
||
|
|
]: nothing -> list {
|
||
|
|
mut result = []
|
||
|
|
mut index = -1
|
||
|
|
|
||
|
|
for srv in $data {
|
||
|
|
$index += 1
|
||
|
|
let settings_server = ($settings.data.servers | where {|it| $it.hostname == $srv.hostname})
|
||
|
|
if ($settings_server | length) == 0 { continue }
|
||
|
|
let provider = ($settings_server | get -o 0 | get -o provider | default "")
|
||
|
|
if $prov != null and $provider != "local" { continue }
|
||
|
|
if $serverpos != null and $serverpos != $index { continue }
|
||
|
|
|
||
|
|
if $srv.ip_addresses? != null {
|
||
|
|
$result = ($result | append ($srv.ip_addresses? |
|
||
|
|
each {|it| { hostname: $srv.hostname, ip: $it.address, access: $it.access, family: $it.family }} |
|
||
|
|
flatten
|
||
|
|
))
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
$result
|
||
|
|
}
|
||
|
|
|
||
|
|
# Infrastructure operations (simplified for local)
|
||
|
|
export def load_infra_servers_info [
|
||
|
|
settings: record
|
||
|
|
server: record
|
||
|
|
error_exit: bool
|
||
|
|
]: nothing -> record {
|
||
|
|
# Local provider doesn't have cloud infrastructure info
|
||
|
|
{
|
||
|
|
provider: "local"
|
||
|
|
server: $server.hostname
|
||
|
|
info: "Local servers don't have cloud infrastructure info"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
export def load_infra_storages_info [
|
||
|
|
settings: record
|
||
|
|
server: record
|
||
|
|
error_exit: bool
|
||
|
|
]: nothing -> record {
|
||
|
|
# Local storage info is basic
|
||
|
|
{
|
||
|
|
provider: "local"
|
||
|
|
server: $server.hostname
|
||
|
|
storage: "Local storage managed directly on server"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
export def get_infra_storage [
|
||
|
|
server: record
|
||
|
|
settings: record
|
||
|
|
cloud_data: record
|
||
|
|
error_exit: bool
|
||
|
|
]: nothing -> list {
|
||
|
|
# Return empty list for local provider
|
||
|
|
[]
|
||
|
|
}
|
||
|
|
|
||
|
|
export def get_infra_item [
|
||
|
|
server: record
|
||
|
|
settings: record
|
||
|
|
cloud_data: record
|
||
|
|
error_exit: bool
|
||
|
|
]: nothing -> record {
|
||
|
|
# Return basic server info
|
||
|
|
{
|
||
|
|
provider: "local"
|
||
|
|
hostname: $server.hostname
|
||
|
|
type: "local-server"
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
export def get_infra_price [
|
||
|
|
server: record
|
||
|
|
data: record
|
||
|
|
key: string
|
||
|
|
error_exit: bool
|
||
|
|
price_col?: string
|
||
|
|
]: nothing -> float {
|
||
|
|
# Local servers don't have pricing
|
||
|
|
0.0
|
||
|
|
}
|
||
|
|
|
||
|
|
# Cache operations (local doesn't use cloud caching)
|
||
|
|
export def start_cache_info [
|
||
|
|
settings: record
|
||
|
|
server: record
|
||
|
|
]: nothing -> nothing {
|
||
|
|
# No-op for local provider
|
||
|
|
}
|
||
|
|
|
||
|
|
export def create_cache [
|
||
|
|
settings: record
|
||
|
|
server: record
|
||
|
|
error_exit: bool
|
||
|
|
]: nothing -> nothing {
|
||
|
|
# No-op for local provider
|
||
|
|
}
|
||
|
|
|
||
|
|
export def read_cache [
|
||
|
|
settings: record
|
||
|
|
server: record
|
||
|
|
error_exit: bool
|
||
|
|
]: nothing -> nothing {
|
||
|
|
# No-op for local provider
|
||
|
|
}
|
||
|
|
|
||
|
|
export def clean_cache [
|
||
|
|
settings: record
|
||
|
|
server: record
|
||
|
|
error_exit: bool
|
||
|
|
]: nothing -> nothing {
|
||
|
|
# No-op for local provider
|
||
|
|
}
|
||
|
|
|
||
|
|
export def ip_from_cache [
|
||
|
|
settings: record
|
||
|
|
server: record
|
||
|
|
error_exit: bool
|
||
|
|
]: nothing -> nothing {
|
||
|
|
# For local, just return the configured IP
|
||
|
|
$server | get -o network_public_ip | default ""
|
||
|
|
}
|
||
|
|
|
||
|
|
# Provider metadata operations
|
||
|
|
export def on_prov_server [
|
||
|
|
server: record
|
||
|
|
]: nothing -> string {
|
||
|
|
local_on_prov_server $server
|
||
|
|
}
|
||
|
|
|
||
|
|
# Provider validation
|
||
|
|
export def validate_provider []: nothing -> record {
|
||
|
|
{
|
||
|
|
provider: "local"
|
||
|
|
valid: true
|
||
|
|
interface_version: "1.0.0"
|
||
|
|
capabilities: (get-provider-metadata).capabilities
|
||
|
|
last_validated: (date now)
|
||
|
|
}
|
||
|
|
}
|