97 lines
3.3 KiB
Text
97 lines
3.3 KiB
Text
|
|
#!/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
|
||
|
|
}
|