chore: fix creation and speed up prices
This commit is contained in:
parent
2b4c1fde11
commit
b409bbf813
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
use lib.nu *
|
use lib.nu *
|
||||||
use ../../../../../core/nulib/lib_provisioning/config/accessor.nu *
|
use ../../../../../core/nulib/lib_provisioning/config/accessor.nu *
|
||||||
|
use ../../../../../core/nulib/lib_provisioning/utils/settings.nu [get_provider_data_path load_provider_env save_provider_env]
|
||||||
|
|
||||||
export def aws_start_cache_info [
|
export def aws_start_cache_info [
|
||||||
settings: record
|
settings: record
|
||||||
|
|||||||
@ -826,7 +826,7 @@ $output | append '
|
|||||||
# - > Make middleware (middleware.nu env_middleware.nu) for existing providers
|
# - > Make middleware (middleware.nu env_middleware.nu) for existing providers
|
||||||
export def make_middleware [
|
export def make_middleware [
|
||||||
] {
|
] {
|
||||||
use ../../core/nulib/lib_provisioning/config/accessor.nu get-providers-path
|
use ../../../core/nulib/lib_provisioning/config/accessor.nu get-providers-path
|
||||||
let providers_path = (get-providers-path)
|
let providers_path = (get-providers-path)
|
||||||
if not ($providers_path | path exists) {
|
if not ($providers_path | path exists) {
|
||||||
print $"🛑 providers path (ansi red_bold)($providers_path)(ansi reset) not found"
|
print $"🛑 providers path (ansi red_bold)($providers_path)(ansi reset) not found"
|
||||||
|
|||||||
@ -234,8 +234,8 @@ export def mw_server_exists [
|
|||||||
provider_undefined $server
|
provider_undefined $server
|
||||||
if $error_exit { exit } else { false }
|
if $error_exit { exit } else { false }
|
||||||
} else {
|
} else {
|
||||||
let result = $res
|
# Return the boolean result directly (true/false from provider)
|
||||||
$result != null
|
$res | default false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -414,6 +414,32 @@ export def mw_get_infra_price [
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Get all infrastructure prices at once (provider-agnostic) - Phase 2 optimization
|
||||||
|
# Returns: { hour: float, day: float, month: float, unit_info: string }
|
||||||
|
export def mw_get_all_infra_prices [
|
||||||
|
server: record
|
||||||
|
data: record
|
||||||
|
error_exit: bool
|
||||||
|
price_col?: string
|
||||||
|
]: nothing -> record {
|
||||||
|
# Try to call provider-specific batched implementation if available
|
||||||
|
let res = (dispatch_provider_function $server.provider "get_all_infra_prices" $server $data $error_exit $price_col)
|
||||||
|
|
||||||
|
if $res != null {
|
||||||
|
# Provider has batched implementation
|
||||||
|
$res
|
||||||
|
} else {
|
||||||
|
# Fallback to individual calls (for providers without batched implementation)
|
||||||
|
let hour = (mw_get_infra_price $server $data "hour" $error_exit $price_col)
|
||||||
|
{
|
||||||
|
hour: $hour,
|
||||||
|
day: (($hour * 24) | math round -p 4),
|
||||||
|
month: ((mw_get_infra_price $server $data "month" $error_exit $price_col) | math round -p 4),
|
||||||
|
unit_info: (mw_get_infra_price $server $data "unit" $error_exit $price_col)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# Get infrastructure storage (provider-agnostic)
|
# Get infrastructure storage (provider-agnostic)
|
||||||
export def mw_get_infra_storage [
|
export def mw_get_infra_storage [
|
||||||
server: record
|
server: record
|
||||||
@ -538,6 +564,99 @@ export def mw_suggest_deployment_strategy [
|
|||||||
$recommendations
|
$recommendations
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Create cache for server (provider-specific)
|
||||||
|
export def mw_create_cache [
|
||||||
|
settings: record
|
||||||
|
server: record
|
||||||
|
error_exit: bool
|
||||||
|
]: nothing -> nothing {
|
||||||
|
if not ($env.PROVIDER_REGISTRY_INITIALIZED? | default false) {
|
||||||
|
init-middleware | ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
let provider_name = $server.provider
|
||||||
|
|
||||||
|
# Dynamic provider dispatch
|
||||||
|
let res = (dispatch_provider_function $provider_name "create_cache" $settings $server $error_exit)
|
||||||
|
|
||||||
|
if $res == null {
|
||||||
|
provider_undefined $server
|
||||||
|
if $error_exit {
|
||||||
|
log-error $"Failed to create cache for ($server.hostname)" "middleware"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# Modify server (provider-specific)
|
||||||
|
export def mw_modify_server [
|
||||||
|
settings: record
|
||||||
|
server: record
|
||||||
|
modifications: list
|
||||||
|
check: bool
|
||||||
|
]: nothing -> any {
|
||||||
|
if not ($env.PROVIDER_REGISTRY_INITIALIZED? | default false) {
|
||||||
|
init-middleware | ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
let provider_name = $server.provider
|
||||||
|
|
||||||
|
# Dynamic provider dispatch
|
||||||
|
let res = (dispatch_provider_function $provider_name "modify_server" $settings $server $modifications $check)
|
||||||
|
|
||||||
|
if $res == null {
|
||||||
|
provider_undefined $server
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
$res
|
||||||
|
}
|
||||||
|
|
||||||
|
# Post-create server hook (provider-specific)
|
||||||
|
export def mw_post_create_server [
|
||||||
|
settings: record
|
||||||
|
server: record
|
||||||
|
check: bool
|
||||||
|
]: nothing -> string {
|
||||||
|
if not ($env.PROVIDER_REGISTRY_INITIALIZED? | default false) {
|
||||||
|
init-middleware | ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
let provider_name = $server.provider
|
||||||
|
|
||||||
|
# Dynamic provider dispatch
|
||||||
|
let res = (dispatch_provider_function $provider_name "post_create_server" $settings $server $check)
|
||||||
|
|
||||||
|
if $res == null {
|
||||||
|
provider_undefined $server
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
$res
|
||||||
|
}
|
||||||
|
|
||||||
|
# Post-generate server hook (provider-specific)
|
||||||
|
export def mw_post_generate_server [
|
||||||
|
settings: record
|
||||||
|
server: record
|
||||||
|
check: bool
|
||||||
|
]: nothing -> string {
|
||||||
|
if not ($env.PROVIDER_REGISTRY_INITIALIZED? | default false) {
|
||||||
|
init-middleware | ignore
|
||||||
|
}
|
||||||
|
|
||||||
|
let provider_name = $server.provider
|
||||||
|
|
||||||
|
# Dynamic provider dispatch
|
||||||
|
let res = (dispatch_provider_function $provider_name "post_generate_server" $settings $server $check)
|
||||||
|
|
||||||
|
if $res == null {
|
||||||
|
provider_undefined $server
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
$res
|
||||||
|
}
|
||||||
|
|
||||||
# Initialize middleware when loaded
|
# Initialize middleware when loaded
|
||||||
export-env {
|
export-env {
|
||||||
# This will be set when middleware functions are first called
|
# This will be set when middleware functions are first called
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
use std
|
use std
|
||||||
use ../../../../../core/nulib/lib_provisioning/config/accessor.nu *
|
use ../../../../../core/nulib/lib_provisioning/config/accessor.nu *
|
||||||
|
use ../../../../../core/nulib/lib_provisioning/utils/settings.nu [get_provider_data_path load_provider_env save_provider_env]
|
||||||
|
|
||||||
export def upcloud_start_cache_info [
|
export def upcloud_start_cache_info [
|
||||||
settings: record
|
settings: record
|
||||||
|
|||||||
@ -114,6 +114,68 @@ export def upcloud_get_price [
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Phase 2 Optimization: Get all prices at once
|
||||||
|
export def upcloud_get_all_infra_prices [
|
||||||
|
all_data: record
|
||||||
|
error_exit: bool
|
||||||
|
price_col: string = "global_price"
|
||||||
|
] {
|
||||||
|
let data = ($all_data | get -o item)
|
||||||
|
# Return default record if item is empty or not a record
|
||||||
|
if ($data | is-empty) or (($data | describe) !~ "^record") {
|
||||||
|
return { hour: 0.0, day: 0.0, month: 0.0, unit_info: 1 }
|
||||||
|
}
|
||||||
|
let str_price_col = if ($price_col | is-empty) { "global_price" } else { $price_col }
|
||||||
|
match ($all_data | get -o target) {
|
||||||
|
"server" => {
|
||||||
|
let price_data = ($data | get -o $str_price_col)
|
||||||
|
if ($price_data | is-empty) or (($price_data | describe) !~ "^record") {
|
||||||
|
return { hour: 0.0, day: 0.0, month: 0.0, unit_info: 1 }
|
||||||
|
}
|
||||||
|
let hour_raw = ($price_data | get -o hour | default "")
|
||||||
|
let month_raw = ($price_data | get -o month | default "")
|
||||||
|
if ($hour_raw | is-empty) or ($hour_raw == "") {
|
||||||
|
return { hour: 0.0, day: 0.0, month: 0.0, unit_info: 1 }
|
||||||
|
}
|
||||||
|
let hour = ($hour_raw | str replace -a "€" "" | str trim | into float)
|
||||||
|
let month = ($month_raw | str replace -a "€" "" | str trim | into float)
|
||||||
|
{
|
||||||
|
hour: $hour,
|
||||||
|
day: (($hour * 24) | math round -p 4),
|
||||||
|
month: ($month | math round -p 4),
|
||||||
|
unit_info: 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"storage" => {
|
||||||
|
# Index 0 should be part of the server PLAN
|
||||||
|
let it = ($all_data | get -o src)
|
||||||
|
if ($it | is-empty) or ($it | get -o item | is-empty) {
|
||||||
|
return { hour: 0.0, day: 0.0, month: 0.0, unit_info: 1 }
|
||||||
|
}
|
||||||
|
if ($it.index) == 0 {
|
||||||
|
return { hour: 0.0, day: 0.0, month: 0.0, unit_info: 1 }
|
||||||
|
}
|
||||||
|
let storage = $it.item
|
||||||
|
let storage_type = match ($storage | get -o voltype) {
|
||||||
|
"maxiops" => "MaxIOPS",
|
||||||
|
"hdd" => "HDD",
|
||||||
|
"custom" => "Custom image",
|
||||||
|
}
|
||||||
|
let month = ($data | find $storage_type | select $str_price_col | flatten | into record | get -o month | default "" | str replace -a "€" "" | into float)
|
||||||
|
let hour = ($data | find $storage_type | select $str_price_col | flatten | into record | get -o hour | default "" | str replace -a "€" "" | into float)
|
||||||
|
{
|
||||||
|
hour: $hour,
|
||||||
|
day: (($hour * 24) | math round -p 4),
|
||||||
|
month: ($month | math round -p 4),
|
||||||
|
unit_info: 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_ => {
|
||||||
|
{ hour: 0.0, day: 0.0, month: 0.0, unit_info: 1 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
export def upcloud_get_item_for_storage [
|
export def upcloud_get_item_for_storage [
|
||||||
server: record
|
server: record
|
||||||
settings: record
|
settings: record
|
||||||
|
|||||||
@ -244,6 +244,23 @@ export def get_infra_price [
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Phase 2 Optimization: Get all prices at once
|
||||||
|
export def get_all_infra_prices [
|
||||||
|
server: record
|
||||||
|
data: record
|
||||||
|
error_exit: bool
|
||||||
|
price_col?: string
|
||||||
|
]: nothing -> record {
|
||||||
|
if ($data | get -o item | is-empty) {
|
||||||
|
return { hour: 0.0, day: 0.0, month: 0.0, unit_info: 1 }
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
upcloud_get_all_infra_prices $data $error_exit $price_col
|
||||||
|
} catch {
|
||||||
|
{ hour: 0.0, day: 0.0, month: 0.0, unit_info: 1 }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# Cache operations
|
# Cache operations
|
||||||
export def start_cache_info [
|
export def start_cache_info [
|
||||||
settings: record
|
settings: record
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user