Skip to content

Commit 37eabac

Browse files
committed
fix bun cli cleanup and relayer readiness fallback
1 parent 596c036 commit 37eabac

File tree

3 files changed

+112
-5
lines changed

3 files changed

+112
-5
lines changed

test-suite/fhevm/scripts/bun/command-clean.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import path from "node:path";
12
import type { CommandDeps } from "./command-contracts";
23
import type { CleanOptions } from "./types";
34

@@ -182,6 +183,7 @@ function cleanupAllFhevmProjects(
182183
export function createCleanHandlers(deps: CommandDeps) {
183184
const {
184185
PROJECT,
186+
COMPOSE_DIR,
185187
COLORS,
186188
runCommand,
187189
usageError,
@@ -191,13 +193,22 @@ export function createCleanHandlers(deps: CommandDeps) {
191193
purgeLocalBuildxCache,
192194
} = deps;
193195

196+
function cleanupTracingStack(): void {
197+
const tracingCompose = path.resolve(COMPOSE_DIR, "tracing-docker-compose.yml");
198+
runCommand(["docker", "compose", "-p", PROJECT, "-f", tracingCompose, "down", "-v"], {
199+
check: false,
200+
allowFailure: true,
201+
});
202+
}
203+
194204
function clean(args: string[]): void {
195205
const options = parseCleanArgs(args, usageError);
196206
console.log(`${COLORS.lightBlue}[CLEAN]${COLORS.reset} ${COLORS.bold}Cleaning up FHEVM stack...${COLORS.reset}`);
197207
if (options.allFhevmProjects) {
198208
cleanupAllFhevmProjects(runCommand, logInfo, true);
199209
} else {
200210
cleanupKnownStack(true);
211+
cleanupTracingStack();
201212
}
202213

203214
if (options.purgeNetworks) {

test-suite/fhevm/scripts/bun/command-test.ts

Lines changed: 62 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ type RelayerKeyUrls = {
77
crsUrl: string;
88
};
99

10+
function replaceRelayerHostWithIp(url: string, relayerHost: string): string {
11+
return url.replace(/^https?:\/\/fhevm-relayer(?=[:/]|$)/, (prefix) => {
12+
if (prefix.startsWith("https://")) {
13+
return `https://${relayerHost}`;
14+
}
15+
return `http://${relayerHost}`;
16+
});
17+
}
18+
1019
function parseRelayerKeyUrls(payloadRaw: string): RelayerKeyUrls | undefined {
1120
const payload = payloadRaw.trim();
1221
if (!payload) {
@@ -157,20 +166,69 @@ export function createTestHandlers(deps: CommandDeps) {
157166
} else if (!testSuiteContainer || !isContainerRunningExact("fhevm-test-suite-e2e-debug")) {
158167
lastMessage = "fhevm-test-suite-e2e-debug container is not running";
159168
} else {
160-
const keyurlResult = runCommand(
161-
["docker", "exec", testSuiteContainer, "curl", "-fsS", "http://fhevm-relayer:3000/v2/keyurl"],
169+
const relayerIpInspect = runCommand(
170+
["docker", "inspect", "-f", "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}", relayerContainer],
162171
{ capture: true, check: false, allowFailure: true },
163172
);
173+
const relayerIp = relayerIpInspect.status === 0 ? relayerIpInspect.stdout.trim() : "";
174+
const relayerHosts = ["fhevm-relayer"];
175+
if (relayerIp) {
176+
relayerHosts.push(relayerIp);
177+
}
164178

165-
if (keyurlResult.status !== 0) {
166-
const details = [keyurlResult.stdout.trim(), keyurlResult.stderr.trim()].filter(Boolean).join(" ");
179+
let keyurlResult:
180+
| {
181+
stdout: string;
182+
stderr: string;
183+
status: number;
184+
}
185+
| undefined;
186+
let resolvedRelayerHost = relayerHosts[0];
187+
188+
for (const relayerHost of relayerHosts) {
189+
const result = runCommand(
190+
["docker", "exec", testSuiteContainer, "curl", "-fsS", `http://${relayerHost}:3000/v2/keyurl`],
191+
{ capture: true, check: false, allowFailure: true },
192+
);
193+
if (result.status === 0) {
194+
keyurlResult = result;
195+
resolvedRelayerHost = relayerHost;
196+
break;
197+
}
198+
keyurlResult = result;
199+
}
200+
201+
if (!keyurlResult || keyurlResult.status !== 0) {
202+
const details = keyurlResult
203+
? [keyurlResult.stdout.trim(), keyurlResult.stderr.trim()].filter(Boolean).join(" ")
204+
: "failed to query relayer keyurl endpoint";
167205
lastMessage = details || "failed to query relayer keyurl endpoint";
168206
} else {
169207
const urls = parseRelayerKeyUrls(keyurlResult.stdout);
170208
if (!urls) {
171209
lastMessage = "relayer keyurl payload is missing required public key / CRS URLs";
172210
} else {
173211
const unreachable = [urls.publicKeyUrl, urls.crsUrl].filter((url) => {
212+
const urlCandidates = [url];
213+
if (resolvedRelayerHost !== "fhevm-relayer") {
214+
const rewritten = replaceRelayerHostWithIp(url, resolvedRelayerHost);
215+
if (rewritten !== url) {
216+
urlCandidates.push(rewritten);
217+
}
218+
}
219+
220+
const reachable = urlCandidates.some((candidateUrl) => {
221+
const probe = runCommand(
222+
["docker", "exec", testSuiteContainer, "curl", "-fsS", "--max-time", "5", "-o", "/dev/null", candidateUrl],
223+
{ capture: true, check: false, allowFailure: true },
224+
);
225+
return probe.status === 0;
226+
});
227+
228+
if (reachable) {
229+
return false;
230+
}
231+
174232
const probe = runCommand(
175233
["docker", "exec", testSuiteContainer, "curl", "-fsS", "--max-time", "5", "-o", "/dev/null", url],
176234
{ capture: true, check: false, allowFailure: true },

test-suite/fhevm/scripts/tests/deploy-fhevm-stack.behavior.sh

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,13 +105,25 @@ case "${subcommand}" in
105105
shift || true
106106
107107
if [[ "${1:-}" == "curl" ]]; then
108+
if [[ "$*" == *"http://fhevm-relayer:3000/v2/keyurl"* && "${DOCKER_RELAYER_KEYURL_FAIL_HOSTNAME:-false}" == "true" ]]; then
109+
echo "curl: (6) Could not resolve host: fhevm-relayer" >&2
110+
exit 6
111+
fi
112+
108113
if [[ "$*" == *"http://fhevm-relayer:3000/v2/keyurl"* ]]; then
109114
cat <<'JSON'
110115
{"response":{"fheKeyInfo":[{"fhePublicKey":{"urls":["http://mock-fhevm/key"]}}],"crs":{"2048":{"urls":["http://mock-fhevm/crs"]}}}}
111116
JSON
112117
exit 0
113118
fi
114119
120+
if [[ -n "${DOCKER_RELAYER_IP:-}" && "$*" == *"http://${DOCKER_RELAYER_IP}:3000/v2/keyurl"* ]]; then
121+
cat <<'JSON'
122+
{"response":{"fheKeyInfo":[{"fhePublicKey":{"urls":["http://mock-fhevm/key"]}}],"crs":{"2048":{"urls":["http://mock-fhevm/crs"]}}}}
123+
JSON
124+
exit 0
125+
fi
126+
115127
if [[ "$*" == *"http://mock-fhevm/key"* || "$*" == *"http://mock-fhevm/crs"* ]]; then
116128
exit 0
117129
fi
@@ -235,7 +247,11 @@ JSON
235247
format="${2:-}"
236248
target="${3:-}"
237249
if [[ "${format}" == "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" ]]; then
238-
echo "${DOCKER_MINIO_IP:-172.20.0.2}"
250+
if [[ "${target}" == *"relayer"* ]]; then
251+
echo "${DOCKER_RELAYER_IP:-172.20.0.9}"
252+
else
253+
echo "${DOCKER_MINIO_IP:-172.20.0.2}"
254+
fi
239255
exit 0
240256
fi
241257
fi
@@ -945,6 +961,27 @@ test_telemetry_smoke_requires_jaeger() {
945961
cleanup_fixture
946962
}
947963

964+
test_test_command_falls_back_to_relayer_ip_when_dns_alias_fails() {
965+
setup_fixture
966+
967+
local output_file="${TEST_TMP_DIR}/test-relayer-ip-fallback.out"
968+
export DOCKER_RELAYER_KEYURL_FAIL_HOSTNAME="true"
969+
export DOCKER_RELAYER_IP="172.22.0.15"
970+
971+
if ! run_cli "${output_file}" test input-proof --no-hardhat-compile; then
972+
echo "Test command should fall back to relayer container IP when hostname lookup fails" >&2
973+
cat "${output_file}" >&2
974+
return 1
975+
fi
976+
977+
assert_contains "${COMMAND_LOG}" "http://fhevm-relayer:3000/v2/keyurl"
978+
assert_contains "${COMMAND_LOG}" "http://172.22.0.15:3000/v2/keyurl"
979+
980+
unset DOCKER_RELAYER_KEYURL_FAIL_HOSTNAME
981+
unset DOCKER_RELAYER_IP
982+
cleanup_fixture
983+
}
984+
948985
test_command_and_flag_matrix() {
949986
setup_fixture
950987

@@ -1025,6 +1062,7 @@ main() {
10251062
test_multicoprocessor_resume_forces_minio_reset
10261063
test_clean_purge_invokes_prunes
10271064
test_telemetry_smoke_requires_jaeger
1065+
test_test_command_falls_back_to_relayer_ip_when_dns_alias_fails
10281066
test_command_and_flag_matrix
10291067
test_usage_is_shown_for_cli_argument_errors
10301068

0 commit comments

Comments
 (0)