From b3edeb553b23e709488d611c26fc1a630a6e9d8d Mon Sep 17 00:00:00 2001 From: Ivan Barba Date: Wed, 23 Sep 2026 18:10:22 +0000 Subject: [PATCH 1/4] [Better Tests] Add GCE metadata emulator worker fixtures Adds the JSON fixtures the WireMock metadata emulator serves: a tworker and a uworker identity, plus an annotated template describing the shape of a fixture. The shape mirrors the real metadata server's hierarchy, so a fixture can be written by reading a live instance: curl -H 'Metadata-Flavor: Google' \ 'http://metadata.google.internal/computeMetadata/v1/?recursive=true' template.json is documentation rather than a loadable fixture: it keeps its // comments, and nothing parses it. --- local/emulators/configs/template.json | 63 +++++++++++++++++++++++++++ local/emulators/configs/tworker.json | 37 ++++++++++++++++ local/emulators/configs/uworker.json | 32 ++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 local/emulators/configs/template.json create mode 100644 local/emulators/configs/tworker.json create mode 100644 local/emulators/configs/uworker.json diff --git a/local/emulators/configs/template.json b/local/emulators/configs/template.json new file mode 100644 index 00000000000..c3590e02793 --- /dev/null +++ b/local/emulators/configs/template.json @@ -0,0 +1,63 @@ +{ + // Reference metadata emulator config. Copy this file to create a fixture, + // stripping "//" comments so standard encoding/json can parse it. + // + // The shape of "metadata" mirrors the GCE metadata server's hierarchy: + // + // curl -H 'Metadata-Flavor: Google' \ + // 'http://metadata.google.internal/computeMetadata/v1/?recursive=true' \ + // | jq + + "credentials": { + // Identity and token reported under instance/service-accounts/. + // No network, no gcloud, no real credentials. + "email": "", + "scopes": [], + "access_token": "", + "expires_in_seconds": 3600 + }, + + "host": { + "interface": "127.0.0.1" + }, + + "metadata": { + "project": { + "project-id": "", + "numeric-project-id": "", + + // Project-wide custom metadata, served under project/attributes/. + // Applies to every instance in the project. + "attributes": { + "deployment-bucket": "test-deployment" + } + }, + + "instance": { + "id": "", + "hostname": "", + + // Write the zone the way the real metadata server does: as a full + // resource path, not just the zone name. + // + // do this: "projects/1234567890/zones/us-central1-f" + // not this: "us-central1-f" + "zone": "", + + "machine-type": "", + "preempted": "FALSE", + "scheduling": { + "preemptible": "FALSE", + "provisioning-model": "STANDARD" + }, + + // Per-instance custom metadata, served under instance/attributes/. + // An instance attribute shadows a project attribute of the same name. If + // neither scope defines the key the server returns 404, which some + // callers treat as a meaningful answer rather than an error. + "attributes": { + "override_tworker_queue": "jobs-linux-test" + } + } + } +} diff --git a/local/emulators/configs/tworker.json b/local/emulators/configs/tworker.json new file mode 100644 index 00000000000..b435553d2ef --- /dev/null +++ b/local/emulators/configs/tworker.json @@ -0,0 +1,37 @@ +{ + "credentials": { + "email": "test-clusterfuzz-service-account-email", + "scopes": [ + "https://www.googleapis.com/auth/cloud-platform", + "https://www.googleapis.com/auth/userinfo.email" + ], + "access_token": "fake-tworker-access-token", + "expires_in_seconds": 3600 + }, + "host": { + "interface": "127.0.0.1" + }, + "metadata": { + "project": { + "project-id": "test-clusterfuzz", + "numeric-project-id": "1234567890", + "attributes": { + "deployment-bucket": "test-deployment-bucket", + "deployment-zip": "linux-3.zip" + } + }, + "instance": { + "id": "1111111111111111111", + "hostname": "tworker-1.c.test-clusterfuzz.internal", + "zone": "projects/1234567890/zones/us-central1-f", + "preempted": "FALSE", + "scheduling": { + "preemptible": "FALSE", + "provisioning-model": "STANDARD" + }, + "attributes": { + "override_tworker_queue": "jobs-linux-test" + } + } + } +} diff --git a/local/emulators/configs/uworker.json b/local/emulators/configs/uworker.json new file mode 100644 index 00000000000..38b7fa0b188 --- /dev/null +++ b/local/emulators/configs/uworker.json @@ -0,0 +1,32 @@ +{ + "credentials": { + "email": "test-unpriv-clusterfuzz-service-account-email", + "scopes": ["https://www.googleapis.com/auth/cloud-platform"], + "access_token": "fake-uworker-access-token", + "expires_in_seconds": 3600 + }, + "host": { + "interface": "127.0.0.1" + }, + "metadata": { + "project": { + "project-id": "test-clusterfuzz", + "numeric-project-id": "1234567890", + "attributes": { + "deployment-bucket": "test-deployment-bucket", + "deployment-zip": "linux-3.zip" + } + }, + "instance": { + "id": "2222222222222222222", + "hostname": "uworker-1.c.test-clusterfuzz.internal", + "zone": "projects/1234567890/zones/us-central1-f", + "preempted": "FALSE", + "scheduling": { + "preemptible": "TRUE", + "provisioning-model": "SPOT" + }, + "attributes": {} + } + } +} From 64c1ec5245b088e928aa70a21200d687121ad054 Mon Sep 17 00:00:00 2001 From: Ivan Barba Date: Tue, 29 Sep 2026 23:58:20 +0000 Subject: [PATCH 2/4] [Better tests] Defaults uworker to non pre-emtible bot --- local/emulators/configs/uworker.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/local/emulators/configs/uworker.json b/local/emulators/configs/uworker.json index 38b7fa0b188..45bce63c6d1 100644 --- a/local/emulators/configs/uworker.json +++ b/local/emulators/configs/uworker.json @@ -23,7 +23,7 @@ "zone": "projects/1234567890/zones/us-central1-f", "preempted": "FALSE", "scheduling": { - "preemptible": "TRUE", + "preemptible": "FALSE", "provisioning-model": "SPOT" }, "attributes": {} From 580fe26e4b318cb88a8404606ce1b95e507cac92 Mon Sep 17 00:00:00 2001 From: Ivan Barba Date: Wed, 30 Sep 2026 18:27:12 +0000 Subject: [PATCH 3/4] [Better tests] Moves location of configs --- .../seed/gce_metadata_server}/template.json | 0 .../configs => test_suites/seed/gce_metadata_server}/tworker.json | 0 .../configs => test_suites/seed/gce_metadata_server}/uworker.json | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {local/emulators/configs => test_suites/seed/gce_metadata_server}/template.json (100%) rename {local/emulators/configs => test_suites/seed/gce_metadata_server}/tworker.json (100%) rename {local/emulators/configs => test_suites/seed/gce_metadata_server}/uworker.json (100%) diff --git a/local/emulators/configs/template.json b/test_suites/seed/gce_metadata_server/template.json similarity index 100% rename from local/emulators/configs/template.json rename to test_suites/seed/gce_metadata_server/template.json diff --git a/local/emulators/configs/tworker.json b/test_suites/seed/gce_metadata_server/tworker.json similarity index 100% rename from local/emulators/configs/tworker.json rename to test_suites/seed/gce_metadata_server/tworker.json diff --git a/local/emulators/configs/uworker.json b/test_suites/seed/gce_metadata_server/uworker.json similarity index 100% rename from local/emulators/configs/uworker.json rename to test_suites/seed/gce_metadata_server/uworker.json From 2c935362a2f3fd4dcc2b0024734af841dd4ed37e Mon Sep 17 00:00:00 2001 From: Ivan Barba Date: Wed, 30 Sep 2026 21:44:30 +0000 Subject: [PATCH 4/4] [Better tests] Scheduling is now STANDARD for uworkers --- test_suites/seed/gce_metadata_server/uworker.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_suites/seed/gce_metadata_server/uworker.json b/test_suites/seed/gce_metadata_server/uworker.json index 45bce63c6d1..075868487e5 100644 --- a/test_suites/seed/gce_metadata_server/uworker.json +++ b/test_suites/seed/gce_metadata_server/uworker.json @@ -24,7 +24,7 @@ "preempted": "FALSE", "scheduling": { "preemptible": "FALSE", - "provisioning-model": "SPOT" + "provisioning-model": "STANDARD" }, "attributes": {} }