Skip to content

Commit eddda76

Browse files
Pigbibicodex
andcommitted
fix: harden precheck scheduler rollout
Co-Authored-By: Codex <noreply@openai.com>
1 parent cb3c7bb commit eddda76

3 files changed

Lines changed: 58 additions & 6 deletions

File tree

.github/workflows/sync-cloud-run-env.yml

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,32 @@ jobs:
536536
done
537537
done
538538
539+
- name: Pause legacy monitor dispatcher
540+
if: steps.config.outputs.env_sync_enabled == 'true'
541+
run: |
542+
set -euo pipefail
543+
544+
if [ "${WORKFLOW_TARGET:-configured}" = "hk-verify" ]; then
545+
echo "Skipping global dispatcher retirement for the isolated HK verify target."
546+
exit 0
547+
fi
548+
549+
scheduler_location="${CLOUD_SCHEDULER_LOCATION:-${CLOUD_RUN_REGION}}"
550+
legacy_monitor_job="interactive-brokers-monitor-dispatcher-scheduler"
551+
legacy_monitor_state="$(gcloud scheduler jobs describe "${legacy_monitor_job}" \
552+
--project="${GCP_PROJECT_ID}" \
553+
--location="${scheduler_location}" \
554+
--format='value(state)' 2>/dev/null || true)"
555+
if [ -z "${legacy_monitor_state}" ] || [ "${legacy_monitor_state}" = "PAUSED" ]; then
556+
exit 0
557+
fi
558+
559+
echo "Pausing legacy Cloud Scheduler job ${legacy_monitor_job} before removing its target configuration."
560+
gcloud scheduler jobs pause "${legacy_monitor_job}" \
561+
--project="${GCP_PROJECT_ID}" \
562+
--location="${scheduler_location}" \
563+
--quiet
564+
539565
- name: Sync Cloud Run environment
540566
if: steps.config.outputs.env_sync_enabled == 'true'
541567
env:
@@ -1192,6 +1218,7 @@ jobs:
11921218
--oidc-token-audience="${service_url}" \
11931219
--attempt-deadline=120s \
11941220
--max-retry-attempts=0 \
1221+
--max-retry-duration=0s \
11951222
--quiet
11961223
else
11971224
echo "Creating Cloud Scheduler precheck ${precheck_job_name} at ${desired_precheck_schedule}."
@@ -1206,6 +1233,7 @@ jobs:
12061233
--oidc-token-audience="${service_url}" \
12071234
--attempt-deadline=120s \
12081235
--max-retry-attempts=0 \
1236+
--max-retry-duration=0s \
12091237
--quiet
12101238
fi
12111239
if [ "${precheck_state}" = "PAUSED" ]; then
@@ -1227,12 +1255,16 @@ jobs:
12271255
esac
12281256
done
12291257
1230-
python3 scripts/reconcile_cloud_runtime.py \
1231-
--platform=ibkr \
1232-
--project="${GCP_PROJECT_ID}" \
1233-
--region="${CLOUD_RUN_REGION}" \
1234-
--scheduler-location="${scheduler_location}" \
1235-
--delete-legacy-schedulers
1258+
reconcile_args=(
1259+
--platform=ibkr
1260+
--project="${GCP_PROJECT_ID}"
1261+
--region="${CLOUD_RUN_REGION}"
1262+
--scheduler-location="${scheduler_location}"
1263+
)
1264+
if [ "${WORKFLOW_TARGET:-configured}" != "hk-verify" ]; then
1265+
reconcile_args+=(--delete-legacy-schedulers)
1266+
fi
1267+
python3 scripts/reconcile_cloud_runtime.py "${reconcile_args[@]}"
12361268
12371269
- name: Prune old Cloud Run revisions
12381270
if: steps.config.outputs.enabled == 'true'

tests/test_scheduler_deadline_contract.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ def test_precheck_uses_per_service_scheduler_with_bounded_deadline() -> None:
5252
assert 'precheck_uri="${service_url}/dry-run"' in workflow
5353
assert workflow.count("--attempt-deadline=120s") == 2
5454
assert workflow.count("--max-retry-attempts=0") == 2
55+
assert workflow.count("--max-retry-duration=0s") == 2
5556
assert 'gcloud scheduler jobs resume "${precheck_job_name}"' in workflow
5657
assert 'gcloud scheduler jobs pause "${precheck_job_name}"' in workflow
5758
assert 'monitor_job_name="interactive-brokers-monitor-dispatcher-scheduler"' not in workflow
@@ -62,3 +63,16 @@ def test_precheck_uses_per_service_scheduler_with_bounded_deadline() -> None:
6263
assert strategy_deadline is not None
6364
assert report_grace is not None
6465
assert 120 > int(strategy_deadline.group(1)) + int(report_grace.group(1))
66+
67+
68+
def test_legacy_dispatcher_is_paused_before_removing_its_targets() -> None:
69+
workflow = WORKFLOW.read_text(encoding="utf-8")
70+
71+
pause_step = workflow.index("- name: Pause legacy monitor dispatcher")
72+
remove_targets = workflow.index('"IBKR_MONITOR_DISPATCH_TARGETS_JSON"')
73+
74+
assert pause_step < remove_targets
75+
assert 'gcloud scheduler jobs pause "${legacy_monitor_job}"' in workflow
76+
assert 'if [ "${WORKFLOW_TARGET:-configured}" = "hk-verify" ]; then' in workflow
77+
assert 'if [ "${WORKFLOW_TARGET:-configured}" != "hk-verify" ]; then' in workflow
78+
assert 'reconcile_args+=(--delete-legacy-schedulers)' in workflow

tests/test_sync_cloud_run_env_workflow.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,11 @@ grep -Fq 'python3 scripts/reconcile_cloud_runtime.py' "$workflow_file"
8989
grep -Fq -- '--platform=ibkr' "$workflow_file"
9090
grep -Fq -- '--ensure-latest-traffic' "$workflow_file"
9191
grep -Fq -- '--delete-legacy-schedulers' "$workflow_file"
92+
grep -Fq 'Pause legacy monitor dispatcher' "$workflow_file"
93+
grep -Fq 'gcloud scheduler jobs pause "${legacy_monitor_job}"' "$workflow_file"
94+
grep -Fq 'if [ "${WORKFLOW_TARGET:-configured}" = "hk-verify" ]; then' "$workflow_file"
95+
grep -Fq 'if [ "${WORKFLOW_TARGET:-configured}" != "hk-verify" ]; then' "$workflow_file"
96+
grep -Fq 'reconcile_args+=(--delete-legacy-schedulers)' "$workflow_file"
9297

9398
grep -Fq 'emit_target_env_pairs()' "$workflow_file"
9499
grep -Fq 'emit_target_remove_env_vars()' "$workflow_file"
@@ -162,6 +167,7 @@ grep -Fq 'gcloud scheduler jobs update http "${precheck_job_name}"' "$workflow_f
162167
grep -Fq 'gcloud scheduler jobs create http "${precheck_job_name}"' "$workflow_file"
163168
test "$(grep -Fc -- '--attempt-deadline=120s' "$workflow_file")" -eq 2
164169
test "$(grep -Fc -- '--max-retry-attempts=0' "$workflow_file")" -eq 2
170+
test "$(grep -Fc -- '--max-retry-duration=0s' "$workflow_file")" -eq 2
165171
grep -Fq 'gcloud scheduler jobs resume "${precheck_job_name}"' "$workflow_file"
166172
grep -Fq 'gcloud scheduler jobs pause "${precheck_job_name}"' "$workflow_file"
167173
test "$(grep -Fc 'monitor_job_name="interactive-brokers-monitor-dispatcher-scheduler"' "$workflow_file")" -eq 0

0 commit comments

Comments
 (0)