diff --git a/deploy/scripts/test-generate.sh b/deploy/scripts/test-generate.sh index fa7a1c6..37e3861 100755 --- a/deploy/scripts/test-generate.sh +++ b/deploy/scripts/test-generate.sh @@ -516,9 +516,9 @@ fi _vn="${DEPLOY_DIR}/scripts/verify-nessie.sh" if [[ -x "${_vn}" ]] && bash -n "${_vn}" 2>/dev/null \ && grep -q 'api/v2/config' "${_vn}" && grep -q 'v1/namespaces' "${_vn}" \ - && grep -q 'Iceberg REST' "${_vn}" && grep -q 'code_hint' "${_vn}" \ - && grep -q 'namespace' "${_vn}"; then - ok "verify-nessie.sh: versi + dukungan API (native v2 + Iceberg REST) + contoh namespace" + && grep -q 'ns_cands' "${_vn}" && grep -q 'Iceberg REST' "${_vn}" \ + && grep -q 'code_hint' "${_vn}" && grep -q 'namespace' "${_vn}"; then + ok "verify-nessie.sh: versi + dukungan API (native v2 + Iceberg REST) + contoh namespace (multi-kandidat path)" else bad "verify-nessie.sh hilang/tidak lengkap" fi diff --git a/deploy/scripts/verify-nessie.sh b/deploy/scripts/verify-nessie.sh index d450891..21f4385 100755 --- a/deploy/scripts/verify-nessie.sh +++ b/deploy/scripts/verify-nessie.sh @@ -139,32 +139,60 @@ echo "" # C. Catalog — contoh schema (namespace) & refs # ───────────────────────────────────────────────────────────────────────────── echo -e "${BOLD}C. Catalog — contoh schema (≤5) & refs${NC}" -ns_json="$(curl -sf --max-time 10 "${BASE}${PFX}/v1/namespaces" 2>/dev/null || echo "")" -if [[ -z "${ns_json}" ]]; then - code="$(http_code "${BASE}${PFX}/v1/namespaces")" - if [[ -z "${ic_cfg}" ]]; then - warn "Tak bisa membaca namespace karena Iceberg REST tak tersedia [HTTP ${code}]" - else - fail "Iceberg REST aktif tetapi namespace tak terbaca [HTTP ${code} — $(code_hint "${code}")]" - fi -else - ns_out="$(printf '%s' "${ns_json}" | python3 -c ' +# Endpoint 'namespaces' Iceberg REST memakai PREFIX (warehouse/branch) yang bergantung +# pada server — `/v1/namespaces` (tanpa prefix) bisa 404 walau REST aktif. Coba beberapa +# kandidat; kandidat pertama yang mengembalikan JSON namespace dipakai. +ns_parse() { + printf '%s' "$1" | python3 -c ' import sys, json try: d = json.load(sys.stdin) except Exception: - print("0|"); sys.exit() -ns = d.get("namespaces") or [] + sys.exit(1) +ns = d.get("namespaces") +if ns is None: + sys.exit(1) def flat(n): return ".".join(n) if isinstance(n, list) else str(n) print(f"{len(ns)}|" + ", ".join(flat(n) for n in ns[:5])) +' 2>/dev/null +} +ic_prefix="$(printf '%s' "${ic_cfg}" | python3 -c ' +import sys, json +try: + d = json.load(sys.stdin) +except Exception: + sys.exit() +ov = d.get("overrides") or {}; df = d.get("defaults") or {} +print(ov.get("prefix") or df.get("prefix") or "") ' 2>/dev/null)" +ns_cands=() +[[ -n "${ic_prefix}" ]] && ns_cands+=("${BASE}${PFX}/v1/${ic_prefix}/namespaces") +ns_cands+=("${BASE}${PFX}/v1/namespaces") +[[ -n "${WAREHOUSE}" ]] && ns_cands+=("${BASE}${PFX}/v1/${WAREHOUSE}/namespaces") +ns_cands+=("${BASE}${PFX}/v1/main/namespaces") +[[ -n "${WAREHOUSE}" ]] && ns_cands+=("${BASE}${PFX}/v1/main%7C${WAREHOUSE}/namespaces") +[[ -n "${WAREHOUSE}" ]] && ns_cands+=("${BASE}${PFX}/v1/%7C${WAREHOUSE}/namespaces") +ns_out=""; ns_used="" +for _u in "${ns_cands[@]}"; do + _j="$(curl -sf --max-time 10 "${_u}" 2>/dev/null || echo "")" + if [[ -n "${_j}" ]] && ns_out="$(ns_parse "${_j}")" && [[ -n "${ns_out}" ]]; then ns_used="${_u}"; break; fi + ns_out="" +done +if [[ -n "${ns_out}" ]]; then ns_count="${ns_out%%|*}"; ns_list="${ns_out#*|}" if [[ "${ns_count:-0}" -gt 0 ]]; then pass "Catalog berisi ${ns_count} namespace — contoh (≤5): ${ns_list}" else warn "Iceberg REST aktif tetapi catalog MASIH KOSONG (0 namespace) — normal sebelum ingest" - info "Konteks konfigurasi: bucket='${BUCKET}' warehouse='${WAREHOUSE}' prefix='${PFX}'" fi + info "namespace via ${ns_used#${BASE}} (bucket='${BUCKET}' warehouse='${WAREHOUSE}' prefix='${PFX}')" +elif [[ -z "${ic_cfg}" ]]; then + warn "Tak bisa membaca namespace karena Iceberg REST tak tersedia [HTTP $(http_code "${BASE}${PFX}/v1/namespaces")]" +else + codes="" + for _u in "${ns_cands[@]}"; do codes+="${_u#${BASE}}→$(http_code "${_u}") "; done + fail "Iceberg REST aktif tetapi namespace TIDAK terbaca — kandidat path: ${codes% }" + info "Nessie umumnya menaruh namespace di path ber-PREFIX (warehouse/branch), mis. ${PFX}/v1/${WAREHOUSE}/namespaces" fi main_code="$(http_code "${BASE}/api/v2/trees/main")" [[ "${main_code}" == "200" ]] && pass "Branch 'main' tersedia" \