#!/usr/bin/env bash # Shared env resolution for the ndo-repro skill. Source this; do not execute. # Exports NDO_CTX (kube context), NDO_NS (namespace), NDO_GW (gateway base URL). NDO_CACHE="${NDO_CACHE:-$HOME/.cache/ndo-repro}" NDO_ENV_FILE="${NDO_ENV_FILE:-$NDO_CACHE/envs.tsv}" NDO_ENV_SEED="${NDO_ENV_SEED:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)/envs.tsv}" NDO_MARKER="${NDO_MARKER:-consolidated-inventory-manager-v1}" NDO_NS_RE="${NDO_NS_RE:-^(ndo|ndo-dev|ndo-at|dev-[0-9]+-oss)$}" _ndo_die() { echo "$*" >&2; exit 2; } env_file() { [ -s "$NDO_ENV_FILE" ] && { echo "$NDO_ENV_FILE"; return; } mkdir -p "$NDO_CACHE" [ -s "$NDO_ENV_SEED" ] && cp "$NDO_ENV_SEED" "$NDO_ENV_FILE" echo "$NDO_ENV_FILE" } env_list() { printf '%-16s %-34s %-14s %s\n' ALIAS CONTEXT NAMESPACE GATEWAY awk -F'\t' '!/^#/ && NF>=4 {printf "%-16s %-34s %-14s %s\n",$1,$2,$3,$4}' "$(env_file)" } # env_resolve -> sets NDO_CTX / NDO_NS / NDO_GW env_resolve() { local want="${1:-}" f hits n [ -n "$want" ] || _ndo_die "no env given. Use -e or NDO_ENV=. Known: $(env_list)" f="$(env_file)" hits=$(awk -F'\t' -v w="$want" '!/^#/ && NF>=4 && ($1==w || $1 ~ "/" w "$")' "$f") n=$(printf '%s' "$hits" | grep -c . || true) [ "$n" -eq 0 ] && _ndo_die "unknown env '$want'. Known: $(env_list) Run: ndo-api.sh env discover" [ "$n" -gt 1 ] && _ndo_die "ambiguous env '$want' — matches: $(printf '%s\n' "$hits" | cut -f1) Use the full alias (e.g. oss-01/$want)." NDO_CTX=$(printf '%s' "$hits" | cut -f2) NDO_NS=$(printf '%s' "$hits" | cut -f3) NDO_GW=$(printf '%s' "$hits" | cut -f4) export NDO_CTX NDO_NS NDO_GW } # Short cluster alias: pedro.aranha-saas-rnd-oss-01 -> oss-01 ; ndo-shared-244 -> shared-244 _cluster_alias() { sed -E 's/^.*saas-rnd-//; s/^ndo-//' <<<"$1"; } # Short env alias: dev-1-oss -> dev-1 ; ndo -> (cluster alias only) _ns_alias() { sed -E 's/-oss$//' <<<"$1"; } env_discover() { local out ctx nss ns host alias calias nalias mkdir -p "$NDO_CACHE" out="$NDO_CACHE/envs.tsv.new" : > "$out" for ctx in $(kubectl config get-contexts -o name 2>/dev/null); do case "$ctx" in orbstack|docker-desktop|minikube|kind-*) continue ;; esac nss=$(timeout 25 kubectl --context="$ctx" get ns -o name 2>/dev/null | sed 's|namespace/||' | grep -E "$NDO_NS_RE") || continue calias=$(_cluster_alias "$ctx") for ns in $nss; do timeout 20 kubectl --context="$ctx" -n "$ns" get deploy "$NDO_MARKER" -o name >/dev/null 2>&1 || continue host=$(timeout 20 kubectl --context="$ctx" -n "$ns" get ingress public-gateway \ -o jsonpath='{.spec.rules[0].host}' 2>/dev/null) [ -n "$host" ] || host="public-gateway-${ns}.$(sed -E 's/^.*(saas-rnd-[a-z0-9-]+|ndo-[a-z0-9-]+)$/\1/' <<<"$ctx").managed.netcracker.cloud" nalias=$(_ns_alias "$ns") if [ "$nalias" = "ndo" ]; then alias="$calias"; else alias="$calias/$nalias"; fi printf '%s\t%s\t%s\thttps://%s\n' "$alias" "$ctx" "$ns" "$host" >> "$out" echo "found $alias -> $ctx/$ns" >&2 done done [ -s "$out" ] || _ndo_die "discovery found no envs (VPN down? kube creds expired?) — kept $NDO_ENV_FILE" sort -o "$out" "$out" mv "$out" "$NDO_ENV_FILE" env_list }