#!/usr/bin/env nu # Derived variables for odoo bundle rendering. # Keys are lowercase — merged into the odoo tera context. def domain_to_zone [domain: string]: nothing -> string { # "in.jesusperez.pro" -> "jesusperez.pro" (strip first label) let parts = ($domain | split row ".") if ($parts | length) > 2 { $parts | skip 1 | str join "." } else { $domain } } def zone_to_secret [zone: string]: nothing -> string { # "jesusperez.pro" -> "dns-jesusperez-pro" $"dns-($zone | str replace --all '.' '-')" } def resolve_fip_ip [fip_name: string]: nothing -> string { let result = (do { ^hcloud floating-ip list -o json } | complete) if $result.exit_code != 0 { error make { msg: $"hcloud failed: ($result.stderr | str trim)" } } let matched = ($result.stdout | from json | where name == $fip_name) if ($matched | is-empty) { error make { msg: $"FIP '($fip_name)' not found in Hetzner account" } } $matched | first | get ip } def main [component_json: string]: nothing -> nothing { let d = ($component_json | from json) let db_name = ($d | get -o db_name | default "") let db_filter = ($d | get -o db_filter | default "") let oca_addons = ($d | get -o oca_addons | default []) let oca_default_ref = ($d | get -o oca_addons_default_ref | default "18.0") let oca_refs = ($d | get -o oca_addons_refs | default {}) let python_packages = ($d | get -o python_packages | default []) let tenant = ($d | get -o tenant | default "") let domain = ($d | get -o domain | default "") let dns_zone = ($d | get -o dns_zone | default "") let cf_secret = ($d | get -o cf_secret_name | default "") let gateway_ip = ($d | get -o gateway_ip | default "") let gateway_fip = ($d | get -o gateway_fip | default "") let resolved_filter = if ($db_filter | is-not-empty) { $db_filter } else if ($db_name | is-not-empty) { $"^($db_name)$" } else { "" } let resolved_zone = if ($dns_zone | is-not-empty) { $dns_zone } else if ($domain | is-not-empty) { domain_to_zone $domain } else { "" } let resolved_cf_secret = if ($cf_secret | is-not-empty) { $cf_secret } else if ($resolved_zone | is-not-empty) { zone_to_secret $resolved_zone } else { "" } let resolved_gateway_ip = if ($gateway_ip | is-not-empty) { $gateway_ip } else if ($gateway_fip | is-not-empty) { resolve_fip_ip $gateway_fip } else { "" } let oca_resolved = ($oca_addons | each {|repo| { repo: $repo, ref: ($oca_refs | get -o $repo | default $oca_default_ref) } }) { odoo_db_filter: $resolved_filter, odoo_oca_addons_space: ($oca_addons | str join " "), odoo_oca_addons_json: ($oca_addons | to json --raw), odoo_oca_addons_resolved: $oca_resolved, odoo_python_packages: ($python_packages | str join " "), dns_zone: $resolved_zone, cf_secret_name: $resolved_cf_secret, gateway_ip: $resolved_gateway_ip, tls_secret: $"($tenant)-tls", } | to json --raw | print }