diff --git a/tests/e2e/test_staging_full_saas.sh b/tests/e2e/test_staging_full_saas.sh index 2fa6892d..902bb286 100755 --- a/tests/e2e/test_staging_full_saas.sh +++ b/tests/e2e/test_staging_full_saas.sh @@ -511,8 +511,14 @@ for wid in $WS_TO_CHECK; do ok " $wid terminal-reachable (canvas terminal will work)" else DIAG_FAIL=$(echo "$DIAG_JSON" | python3 -c "import json,sys; d=json.load(sys.stdin); print(d.get('first_failure','unknown'))" 2>/dev/null || echo "unknown") - DIAG_DETAIL=$(echo "$DIAG_JSON" | python3 -c "import json,sys; d=json.load(sys.stdin); s=[x for x in d.get('steps',[]) if not x.get('ok')]; print(s[0].get('error','') if s else '')" 2>/dev/null || echo "") - fail "Workspace $wid terminal diagnose failed at step '$DIAG_FAIL': $DIAG_DETAIL — check tenant SG has tcp/22 from EIC endpoint SG (sg-0785d5c6138220523), EIC_ENDPOINT_SG_ID set in Railway, and EIC endpoint health" + # Extract both error (Go error string) and detail (subprocess stderr — vendor truth). + # detail carries subprocess stderr for EIC/ssh/tunnel failures, which is the + # actionable signal (e.g. "AccessDeniedException: ... is not authorized to perform + # ec2-instance-connect:OpenTunnel"). mc#687 / mc#424 root-cause finding. + DIAG_ERR=$(echo "$DIAG_JSON" | python3 -c "import json,sys; d=json.load(sys.stdin); s=[x for x in d.get('steps',[]) if not x.get('ok')]; print(s[0].get('error','') if s else '')" 2>/dev/null || echo "") + DIAG_DETAIL=$(echo "$DIAG_JSON" | python3 -c "import json,sys; d=json.load(sys.stdin); s=[x for x in d.get('steps',[]) if not x.get('ok')]; print(s[0].get('detail','') if s else '')" 2>/dev/null || echo "") + fail "Workspace $wid terminal diagnose failed at step '$DIAG_FAIL': $DIAG_ERR${DIAG_DETAIL:+ + detail (subprocess stderr): $DIAG_DETAIL} — check tenant SG has tcp/22 from EIC endpoint SG (sg-0785d5c6138220523), EIC_ENDPOINT_SG_ID set in Railway, and EIC endpoint health" fi done