33
44This script keeps the runtime logic minimal and explicit:
55- reconcile Cloud Run traffic to the latest ready revision and verify commit-sha
6- - delete only explicit legacy session-check Cloud Scheduler jobs
7-
8- It deliberately does not touch probe/precheck bridge jobs or unknown schedulers.
6+ - delete only explicit legacy Cloud Scheduler jobs
97"""
108from __future__ import annotations
119
@@ -52,9 +50,28 @@ def _first_target(plan: Mapping[str, Any]) -> Mapping[str, Any]:
5250def _resolve_context (env : Mapping [str , str ] = os .environ ) -> tuple [RuntimeContext , dict [str , Any ]]:
5351 plan = _parse_sync_plan (str (env .get ("SYNC_PLAN_JSON" , "" ) or "" ))
5452 target = _first_target (plan )
53+ configured_service = str (env .get ("CLOUD_RUN_SERVICE" , "" ) or "" ).strip ()
54+ targets = plan .get ("targets" )
55+ if configured_service and isinstance (targets , list ) and targets :
56+ matching_targets = [
57+ candidate
58+ for candidate in targets
59+ if isinstance (candidate , Mapping )
60+ and configured_service
61+ in {
62+ str (candidate .get ("service_name" ) or "" ).strip (),
63+ str (candidate .get ("service" ) or "" ).strip (),
64+ str (candidate .get ("cloud_run_service" ) or "" ).strip (),
65+ }
66+ ]
67+ if len (matching_targets ) != 1 :
68+ raise ValueError (
69+ f"CLOUD_RUN_SERVICE { configured_service } does not match any sync-plan target"
70+ )
71+ target = matching_targets [0 ]
5572
5673 service_name = (
57- str ( env . get ( "CLOUD_RUN_SERVICE" , "" ) or "" ). strip ()
74+ configured_service
5875 or str (target .get ("service_name" ) or "" ).strip ()
5976 or str (target .get ("service" ) or "" ).strip ()
6077 or str (target .get ("cloud_run_service" ) or "" ).strip ()
@@ -256,11 +273,18 @@ def reconcile_traffic(
256273 time .sleep (5 )
257274
258275
259- def _legacy_session_check_jobs (service_name : str ) -> list [str ]:
276+ def _legacy_scheduler_jobs (service_name : str ) -> list [str ]:
260277 candidates = [f"{ service_name } -session-check-scheduler" ]
261278 alias = service_name .removesuffix ("-service" )
262279 if alias and alias != service_name :
263- candidates .append (f"{ alias } -session-check-scheduler" )
280+ candidates .extend (
281+ [
282+ f"{ alias } -session-check-scheduler" ,
283+ f"{ alias } -probe-scheduler" ,
284+ f"{ alias } -precheck-scheduler" ,
285+ ]
286+ )
287+ candidates .append ("firstrade-monitor-dispatcher-scheduler" )
264288 seen : list [str ] = []
265289 for candidate in candidates :
266290 if candidate not in seen :
@@ -273,9 +297,53 @@ def cleanup_legacy_scheduler_jobs(
273297 * ,
274298 run_gcloud : RunGcloud = _run_gcloud ,
275299) -> None :
276- ctx , _plan = _resolve_context (env )
300+ ctx , plan = _resolve_context (env )
277301 deleted : list [str ] = []
278- for job_name in _legacy_session_check_jobs (ctx .service_name ):
302+ legacy_jobs = _legacy_scheduler_jobs (ctx .service_name )
303+ dispatcher_job = "firstrade-monitor-dispatcher-scheduler"
304+ direct_jobs = (
305+ f"{ ctx .service_name } -probe-scheduler" ,
306+ f"{ ctx .service_name } -precheck-scheduler" ,
307+ )
308+ targets = plan .get ("targets" )
309+ has_single_sync_target = not str (env .get ("SYNC_PLAN_JSON" , "" ) or "" ).strip () or (
310+ isinstance (targets , list ) and len (targets ) == 1
311+ )
312+ migration_confirmed = (
313+ str (env .get ("DIRECT_MONITOR_MIGRATION_COMPLETE" ) or "" ).strip () == "true"
314+ )
315+ current_sync_confirmed = (
316+ str (env .get ("DIRECT_MONITOR_SCHEDULERS_RECONCILED" ) or "" ).strip ().lower ()
317+ == "true"
318+ )
319+ direct_jobs_exist = (
320+ migration_confirmed
321+ and current_sync_confirmed
322+ and has_single_sync_target
323+ and all (
324+ run_gcloud (
325+ [
326+ "scheduler" ,
327+ "jobs" ,
328+ "describe" ,
329+ job_name ,
330+ "--project" ,
331+ ctx .project_id ,
332+ "--location" ,
333+ ctx .scheduler_location ,
334+ ]
335+ ).returncode
336+ == 0
337+ for job_name in direct_jobs
338+ )
339+ )
340+ if dispatcher_job in legacy_jobs and not direct_jobs_exist :
341+ legacy_jobs .remove (dispatcher_job )
342+ print (
343+ f"Keeping legacy Cloud Scheduler job { dispatcher_job } until direct monitor jobs exist."
344+ )
345+
346+ for job_name in legacy_jobs :
279347 result = run_gcloud (
280348 [
281349 "scheduler" ,
@@ -317,7 +385,7 @@ def build_parser() -> argparse.ArgumentParser:
317385 subparsers = parser .add_subparsers (dest = "command" , required = True )
318386 subparsers .add_parser ("traffic" , help = "reconcile Cloud Run traffic" )
319387 subparsers .add_parser (
320- "scheduler-cleanup" , help = "delete explicit legacy session-check scheduler jobs"
388+ "scheduler-cleanup" , help = "delete explicit legacy scheduler jobs"
321389 )
322390 return parser
323391
0 commit comments