Skip to content

Commit f73da0d

Browse files
authored
Pass worker name & compliance region through correctly (#9974)
* Pass worker name & compliance region through correctly * Create wicked-beans-nail.md * dlx -> not dlx * fix tests * Add mTLS test for Wrangler
1 parent bf4c9ab commit f73da0d

File tree

7 files changed

+121
-32
lines changed

7 files changed

+121
-32
lines changed

.changeset/wicked-beans-nail.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"wrangler": patch
3+
---
4+
5+
Pass worker name & compliance region through correctly when starting a remote bindings session

fixtures/get-platform-proxy-remote-bindings/tests/index.test.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ if (auth) {
1919
let remoteKvId: string;
2020
beforeAll(async () => {
2121
const deployOut = execSync(
22-
`pnpm dlx wrangler deploy remote-worker.js --name ${remoteWorkerName} --compatibility-date 2025-06-19`,
22+
`pnpm wrangler deploy remote-worker.js --name ${remoteWorkerName} --compatibility-date 2025-06-19`,
2323
execOptions
2424
);
2525

@@ -28,7 +28,7 @@ if (auth) {
2828
}
2929

3030
const kvAddOut = execSync(
31-
`pnpm dlx wrangler kv namespace create ${remoteKvName}`,
31+
`pnpm wrangler kv namespace create ${remoteKvName}`,
3232
execOptions
3333
);
3434

@@ -38,7 +38,7 @@ if (auth) {
3838
remoteKvId = maybeRemoteKvId;
3939

4040
execSync(
41-
`pnpm dlx wrangler kv key put test-key remote-kv-value --namespace-id=${remoteKvId} --remote`,
41+
`pnpm wrangler kv key put test-key remote-kv-value --namespace-id=${remoteKvId} --remote`,
4242
execOptions
4343
);
4444

@@ -75,12 +75,9 @@ if (auth) {
7575
}, 25_000);
7676

7777
afterAll(() => {
78+
execSync(`pnpm wrangler delete --name ${remoteWorkerName}`, execOptions);
7879
execSync(
79-
`pnpm dlx wrangler delete --name ${remoteWorkerName}`,
80-
execOptions
81-
);
82-
execSync(
83-
`pnpm dlx wrangler kv namespace delete --namespace-id=${remoteKvId}`,
80+
`pnpm wrangler kv namespace delete --namespace-id=${remoteKvId}`,
8481
execOptions
8582
);
8683
rmSync("./.tmp", { recursive: true, force: true });

fixtures/vitest-pool-workers-remote-bindings/run-tests.mjs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,14 @@ writeFileSync(
4848
"utf8"
4949
);
5050

51-
const deployOut = execSync("pnpm dlx wrangler deploy -c remote-wrangler.json", {
52-
stdio: "pipe",
53-
cwd: "./.tmp",
54-
env,
55-
});
51+
const deployOut = execSync(
52+
"pnpm wrangler deploy -c .tmp/remote-wrangler.json",
53+
{
54+
stdio: "pipe",
55+
cwd: "./.tmp",
56+
env,
57+
}
58+
);
5659
if (!new RegExp(`Deployed\\s+${remoteWorkerName}\\b`).test(`${deployOut}`)) {
5760
throw new Error(`Failed to deploy ${remoteWorkerName}`);
5861
}
@@ -62,7 +65,7 @@ try {
6265
env,
6366
});
6467
} finally {
65-
execSync(`pnpm dlx wrangler delete --name ${remoteWorkerName}`, { env });
68+
execSync(`pnpm wrangler delete --name ${remoteWorkerName}`, { env });
6669
rmSync("./.tmp", { recursive: true, force: true });
6770
}
6871

packages/wrangler/e2e/wrangler-remote-resources.test.ts

Lines changed: 92 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,11 @@ import {
1313
vi,
1414
} from "vitest";
1515
import { CLOUDFLARE_ACCOUNT_ID } from "./helpers/account-id";
16+
import {
17+
generateLeafCertificate,
18+
generateMtlsCertName,
19+
generateRootCertificate,
20+
} from "./helpers/cert";
1621
import { WranglerE2ETestHelper } from "./helpers/e2e-wrangler-test";
1722
import { fetchText } from "./helpers/fetch-text";
1823
import { generateResourceName } from "./helpers/generate-resource-name";
@@ -22,8 +27,8 @@ import type { WranglerLongLivedCommand } from "./helpers/wrangler";
2227
type TestCase<T = void> = {
2328
name: string;
2429
scriptPath: string;
25-
setup?: (helper: WranglerE2ETestHelper) => Promise<T> | T;
26-
generateWranglerConfig: (setupResult: T) => RawConfig;
30+
setup?: (helper: WranglerE2ETestHelper, workerName: string) => Promise<T> | T;
31+
generateWranglerConfig: (setupResult: T) => Omit<RawConfig, "name">;
2732
expectedResponseMatch: string | RegExp;
2833
// Flag for resources that can work without remote bindings opt-in
2934
worksWithoutRemoteBindings?: boolean;
@@ -73,7 +78,6 @@ const testCases: TestCase<Record<string, string>>[] = [
7378
return { worker: targetWorkerName };
7479
},
7580
generateWranglerConfig: ({ worker: targetWorkerName }) => ({
76-
name: "mixed-mode-service-binding-test",
7781
main: "service-binding.js",
7882
compatibility_date: "2025-01-01",
7983
services: [
@@ -99,7 +103,6 @@ const testCases: TestCase<Record<string, string>>[] = [
99103
name: "AI",
100104
scriptPath: "ai.js",
101105
generateWranglerConfig: () => ({
102-
name: "mixed-mode-ai-test",
103106
main: "ai.js",
104107
compatibility_date: "2025-01-01",
105108
ai: {
@@ -115,7 +118,6 @@ const testCases: TestCase<Record<string, string>>[] = [
115118
name: "Browser",
116119
scriptPath: "browser.js",
117120
generateWranglerConfig: () => ({
118-
name: "mixed-mode-browser-test",
119121
main: "browser.js",
120122
compatibility_date: "2025-01-01",
121123
browser: {
@@ -130,7 +132,6 @@ const testCases: TestCase<Record<string, string>>[] = [
130132
name: "Images",
131133
scriptPath: "images.js",
132134
generateWranglerConfig: () => ({
133-
name: "mixed-mode-images-test",
134135
main: "images.js",
135136
compatibility_date: "2025-01-01",
136137
images: {
@@ -154,7 +155,6 @@ const testCases: TestCase<Record<string, string>>[] = [
154155
return { name };
155156
},
156157
generateWranglerConfig: ({ name }) => ({
157-
name: "mixed-mode-vectorize-test",
158158
main: "vectorize.js",
159159
compatibility_date: "2025-01-01",
160160
vectorize: [
@@ -190,7 +190,6 @@ const testCases: TestCase<Record<string, string>>[] = [
190190
return { namespace };
191191
},
192192
generateWranglerConfig: ({ namespace }) => ({
193-
name: "mixed-mode-dispatch-namespace-test",
194193
main: "dispatch-namespace.js",
195194
compatibility_date: "2025-01-01",
196195
dispatch_namespaces: [
@@ -214,7 +213,6 @@ const testCases: TestCase<Record<string, string>>[] = [
214213
return { id: ns };
215214
},
216215
generateWranglerConfig: ({ id: namespaceId }) => ({
217-
name: "mixed-mode-kv-test",
218216
main: "kv.js",
219217
compatibility_date: "2025-01-01",
220218
kv_namespaces: [
@@ -244,7 +242,6 @@ const testCases: TestCase<Record<string, string>>[] = [
244242
return { name };
245243
},
246244
generateWranglerConfig: ({ name: bucketName }) => ({
247-
name: "mixed-mode-r2-test",
248245
main: "r2.js",
249246
compatibility_date: "2025-01-01",
250247
r2_buckets: [
@@ -274,7 +271,6 @@ const testCases: TestCase<Record<string, string>>[] = [
274271
return { id, name };
275272
},
276273
generateWranglerConfig: ({ id, name }) => ({
277-
name: "mixed-mode-d1-test",
278274
main: "d1.js",
279275
compatibility_date: "2025-01-01",
280276
d1_databases: [
@@ -288,22 +284,94 @@ const testCases: TestCase<Record<string, string>>[] = [
288284
}),
289285
expectedResponseMatch: "existing-value",
290286
},
287+
{
288+
name: "mTLS",
289+
scriptPath: "mtls.js",
290+
setup: async (helper, workerName) => {
291+
// Generate root and leaf certificates
292+
const { certificate: rootCert, privateKey: rootKey } =
293+
generateRootCertificate();
294+
const { certificate: leafCert, privateKey: leafKey } =
295+
generateLeafCertificate(rootCert, rootKey);
296+
297+
// Generate filenames for concurrent e2e test environment
298+
const mtlsCertName = generateMtlsCertName();
299+
// const caCertName = generateCaCertName();
300+
301+
// locally generated certs/key
302+
await helper.seed({ "mtls_client_cert_file.pem": leafCert });
303+
await helper.seed({ "mtls_client_private_key_file.pem": leafKey });
304+
305+
const output = await helper.run(
306+
`wrangler cert upload mtls-certificate --name ${mtlsCertName} --cert mtls_client_cert_file.pem --key mtls_client_private_key_file.pem`
307+
);
308+
309+
const match = output.stdout.match(/ID:\s+(?<certId>.*)$/m);
310+
const certificateId = match?.groups?.certId;
311+
assert(certificateId);
312+
313+
await helper.seed({
314+
"worker.js": dedent/* javascript */ `
315+
export default {
316+
fetch(request) { return new Response("Hello"); }
317+
}
318+
`,
319+
});
320+
321+
const wranglerConfig: RawConfig = {
322+
name: workerName,
323+
mtls_certificates: [
324+
{
325+
certificate_id: certificateId,
326+
binding: "MTLS",
327+
},
328+
],
329+
};
330+
await helper.seed({
331+
"pre-deployment-wrangler.json": JSON.stringify(wranglerConfig, null, 2),
332+
});
333+
334+
await helper.run(
335+
`wrangler deploy worker.js --name ${workerName} -c pre-deployment-wrangler.json --compatibility-date 2025-01-01`
336+
);
337+
onTestFinished(async () => {
338+
await helper.run(`wrangler delete --name ${workerName}`);
339+
});
340+
341+
return { certificateId };
342+
},
343+
generateWranglerConfig: ({ certificateId }) => ({
344+
main: "mtls.js",
345+
compatibility_date: "2025-01-01",
346+
mtls_certificates: [
347+
{
348+
binding: "MTLS",
349+
certificate_id: certificateId,
350+
experimental_remote: true,
351+
},
352+
],
353+
}),
354+
// Note: in this test we are making sure that TLS negotiation does work by checking that we get an SSL certificate error
355+
expectedResponseMatch: /The SSL certificate error/,
356+
},
291357
];
292358

293359
describe.skipIf(!CLOUDFLARE_ACCOUNT_ID)("Wrangler Mixed Mode E2E Tests", () => {
294360
describe.each(testCases)("$name", (testCase) => {
295361
let helper: WranglerE2ETestHelper;
362+
let workerName: string;
296363

297364
beforeEach(() => {
298365
helper = new WranglerE2ETestHelper();
366+
workerName = generateResourceName();
299367
});
300368

301369
it("works with remote bindings enabled", async () => {
302370
await helper.seed(
303371
path.resolve(__dirname, "./seed-files/remote-binding-workers")
304372
);
305373

306-
await writeWranglerConfig(testCase, helper);
374+
await writeWranglerConfig(testCase, helper, workerName);
307375

308376
const worker = helper.runLongLived("wrangler dev --x-remote-bindings");
309377

@@ -322,7 +390,7 @@ describe.skipIf(!CLOUDFLARE_ACCOUNT_ID)("Wrangler Mixed Mode E2E Tests", () => {
322390
path.resolve(__dirname, "./seed-files/remote-binding-workers")
323391
);
324392

325-
await writeWranglerConfig(testCase, helper);
393+
await writeWranglerConfig(testCase, helper, workerName);
326394

327395
const worker = helper.runLongLived("wrangler dev");
328396

@@ -339,11 +407,13 @@ describe.skipIf(!CLOUDFLARE_ACCOUNT_ID)("Wrangler Mixed Mode E2E Tests", () => {
339407
() => {
340408
let worker: WranglerLongLivedCommand;
341409
let helper: WranglerE2ETestHelper;
410+
let workerName: string;
342411

343412
let url: string;
344413

345414
beforeAll(async () => {
346415
helper = new WranglerE2ETestHelper();
416+
workerName = generateResourceName();
347417
await helper.seed(
348418
path.resolve(__dirname, "./seed-files/remote-binding-workers")
349419
);
@@ -374,7 +444,7 @@ describe.skipIf(!CLOUDFLARE_ACCOUNT_ID)("Wrangler Mixed Mode E2E Tests", () => {
374444
});
375445

376446
it.each(testCases)("$name with worker reload", async (testCase) => {
377-
await writeWranglerConfig(testCase, helper);
447+
await writeWranglerConfig(testCase, helper, workerName);
378448

379449
await worker.waitForReload();
380450

@@ -449,12 +519,17 @@ describe.skipIf(!CLOUDFLARE_ACCOUNT_ID)(
449519

450520
async function writeWranglerConfig(
451521
testCase: TestCase<Record<string, string>>,
452-
helper: WranglerE2ETestHelper
522+
helper: WranglerE2ETestHelper,
523+
workerName: string
453524
) {
454-
const setupResult = (await testCase.setup?.(helper)) ?? {};
525+
const setupResult = (await testCase.setup?.(helper, workerName)) ?? {};
455526

456527
const wranglerConfig = testCase.generateWranglerConfig(setupResult);
457528
await helper.seed({
458-
"wrangler.json": JSON.stringify(wranglerConfig, null, 2),
529+
"wrangler.json": JSON.stringify(
530+
{ name: workerName, ...wranglerConfig },
531+
null,
532+
2
533+
),
459534
});
460535
}

packages/wrangler/src/api/remoteBindings/index.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import assert from "node:assert";
22
import path from "node:path";
33
import getPort from "get-port";
44
import { readConfig } from "../../config";
5+
import { getCloudflareComplianceRegion } from "../../environment-variables/misc-variables";
56
import { getBasePath } from "../../paths";
67
import {
78
convertConfigBindingsToStartWorkerBindings,
@@ -116,6 +117,8 @@ export async function maybeStartOrUpdateRemoteProxySession(
116117
| string
117118
| {
118119
name?: string;
120+
/** If running in a non-public compliance region, set this here. */
121+
complianceRegion?: Config["compliance_region"];
119122
bindings: NonNullable<StartDevWorkerInput["bindings"]>;
120123
},
121124
preExistingRemoteProxySessionData?: {
@@ -134,6 +137,7 @@ export async function maybeStartOrUpdateRemoteProxySession(
134137

135138
configPathOrWorkerConfig = {
136139
name: config.name,
140+
complianceRegion: getCloudflareComplianceRegion(config),
137141
bindings: convertConfigBindingsToStartWorkerBindings(config) ?? {},
138142
};
139143
}
@@ -152,7 +156,10 @@ export async function maybeStartOrUpdateRemoteProxySession(
152156
if (!remoteBindingsAreSameAsBefore) {
153157
if (!remoteProxySession) {
154158
if (Object.keys(remoteBindings).length > 0) {
155-
remoteProxySession = await startRemoteProxySession(remoteBindings);
159+
remoteProxySession = await startRemoteProxySession(remoteBindings, {
160+
workerName: configPathOrWorkerConfig.name,
161+
complianceRegion: configPathOrWorkerConfig.complianceRegion,
162+
});
156163
}
157164
} else {
158165
// Note: we always call updateBindings even when there are zero remote bindings, in these

packages/wrangler/src/api/startDevWorker/LocalRuntimeController.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ export class LocalRuntimeController extends RuntimeController {
210210
await maybeStartOrUpdateRemoteProxySession(
211211
{
212212
name: configBundle.name,
213+
complianceRegion: configBundle.complianceRegion,
213214
bindings:
214215
convertCfWorkerInitBindingsToBindings(configBundle.bindings) ??
215216
{},

packages/wrangler/src/api/startDevWorker/MultiworkerRuntimeController.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ export class MultiworkerRuntimeController extends LocalRuntimeController {
117117
const remoteProxySession = await maybeStartOrUpdateRemoteProxySession(
118118
{
119119
name: configBundle.name,
120+
complianceRegion: configBundle.complianceRegion,
120121
bindings:
121122
convertCfWorkerInitBindingsToBindings(configBundle.bindings) ??
122123
{},

0 commit comments

Comments
 (0)