Skip to content

Commit 47e82b0

Browse files
authored
Fix workflow worker data path normalization (#644)
1 parent a6842b0 commit 47e82b0

2 files changed

Lines changed: 41 additions & 20 deletions

File tree

src/agilab/orchestrate/orchestrate_cluster.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -490,14 +490,6 @@ def _path_matches_workflow_session_default(data_path: Path, sessions_root: Path,
490490
return len(relative_path.parts) == 2 and relative_path.parts[1] == module_name
491491

492492

493-
def _path_is_current_workflow_module_or_child(data_path: Path, sessions_root: Path, module_name: str) -> bool:
494-
try:
495-
relative_path = data_path.relative_to(sessions_root)
496-
except ValueError:
497-
return False
498-
return len(relative_path.parts) >= 3 and relative_path.parts[1] == module_name
499-
500-
501493
def _workers_data_path_should_follow_workflow_session(
502494
value: Any,
503495
env: Any,
@@ -523,7 +515,7 @@ def _workers_data_path_should_follow_workflow_session(
523515
return True
524516
user_root = _workflow_user_root(cluster_share, user)
525517
if _path_is_within(data_path, user_root):
526-
return not _path_is_current_workflow_module_or_child(data_path, sessions_root, module_name)
518+
return True
527519
return False
528520

529521

@@ -1604,7 +1596,21 @@ def render_cluster_settings_ui(env: Any, deps: OrchestrateClusterDeps, *, show_r
16041596
placeholder="/path/to/data",
16051597
help="Path to data directory on workers.",
16061598
)
1607-
cluster_params["workers_data_path"] = str(workers_data_path_input or "").strip()
1599+
workers_data_path_value = str(workers_data_path_input or "").strip()
1600+
if (
1601+
workflow_workers_data_path
1602+
and _clean_path_text(workers_data_path_value)
1603+
and _workers_data_path_should_follow_workflow_session(
1604+
workers_data_path_value,
1605+
env,
1606+
user=sanitized_user,
1607+
workflow_name=workflow_id,
1608+
project_name=app_state_name,
1609+
)
1610+
):
1611+
workers_data_path_value = workflow_workers_data_path
1612+
st.session_state[workers_data_path_widget_key] = workflow_workers_data_path
1613+
cluster_params["workers_data_path"] = workers_data_path_value
16081614

16091615
workers_widget_key = widget_keys["workers"]
16101616
workers_dict = cluster_params.get("workers", {})

test/test_orchestrate_cluster.py

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,7 @@ def test_workflow_session_path_policies(tmp_path):
562562
workflow_name="workflows",
563563
project_name="demo_project",
564564
)
565-
assert not orchestrate_cluster._workers_data_path_should_follow_workflow_session(
565+
assert orchestrate_cluster._workers_data_path_should_follow_workflow_session(
566566
"clustershare/agi/workflows/latest-run/demo/custom-data",
567567
env,
568568
user="agi",
@@ -657,13 +657,27 @@ def test_workers_data_path_regression_rewrites_misplaced_managed_share_values(tm
657657
workflow_name="workflows",
658658
project_name="flight_telemetry_project",
659659
)
660-
assert not orchestrate_cluster._workers_data_path_should_follow_workflow_session(
660+
assert orchestrate_cluster._workers_data_path_should_follow_workflow_session(
661661
"clustershare/agi/workflows/20260618T093102Z-492de776/flight_telemetry/custom-data",
662662
env,
663663
user="agi",
664664
workflow_name="workflows",
665665
project_name="flight_telemetry_project",
666666
)
667+
assert orchestrate_cluster._workers_data_path_should_follow_workflow_session(
668+
"clustershare/agi/workflows/20260618T093102Z-492de776/flight_trajectory/dataset",
669+
env,
670+
user="agi",
671+
workflow_name="workflows",
672+
project_name="flight_trajectory_project",
673+
)
674+
assert orchestrate_cluster._workers_data_path_should_follow_workflow_session(
675+
"clustershare/agi/workflows/20260618T093102Z-492de776/flight_trajectory/flight_trajectory/dataset",
676+
env,
677+
user="agi",
678+
workflow_name="workflows",
679+
project_name="flight_trajectory_project",
680+
)
667681

668682

669683
def test_cluster_advisor_recommends_workers_and_writes_evidence(tmp_path):
@@ -1561,12 +1575,13 @@ def test_render_cluster_settings_ui_empty_workflow_session_auto_selects_latest(m
15611575
assert cluster["workers_data_path"] == "cluster-share/agi/workflows/session-b"
15621576

15631577

1564-
def test_render_cluster_settings_ui_preserves_custom_workers_data_path_under_workflow_root(monkeypatch, tmp_path):
1565-
app_name = "demo_project"
1578+
def test_render_cluster_settings_ui_rewrites_stale_app_child_workers_data_path(monkeypatch, tmp_path):
1579+
app_name = "flight_trajectory_project"
15661580
widget_keys = orchestrate_cluster.cluster_widget_keys(app_name)
15671581
share = tmp_path / "cluster-share"
15681582
(share / "agi" / "workflows" / "session-a").mkdir(parents=True)
1569-
custom_data_path = "cluster-share/agi/workflows/session-a/demo/custom-data"
1583+
stale_data_path = "cluster-share/agi/workflows/session-a/flight_trajectory/dataset"
1584+
session_data_path = "cluster-share/agi/workflows/session-a"
15701585
fake_st = _FakeStreamlit(
15711586
widget_values={
15721587
widget_keys["cluster_enabled"]: True,
@@ -1575,18 +1590,18 @@ def test_render_cluster_settings_ui_preserves_custom_workers_data_path_under_wor
15751590
widget_keys["rapids"]: False,
15761591
widget_keys["use_key"]: True,
15771592
widget_keys["workflow_session"]: "session-a",
1578-
widget_keys["workers_data_path"]: custom_data_path,
1593+
widget_keys["workers_data_path"]: stale_data_path,
15791594
},
15801595
session_state={
15811596
"app_settings": {
15821597
"cluster": {
15831598
"cluster_enabled": True,
15841599
"workflow_session": "session-a",
1585-
"workers_data_path": custom_data_path,
1600+
"workers_data_path": stale_data_path,
15861601
}
15871602
},
15881603
widget_keys["workflow_session"]: "session-a",
1589-
widget_keys["workers_data_path"]: custom_data_path,
1604+
widget_keys["workers_data_path"]: stale_data_path,
15901605
"benchmark": False,
15911606
},
15921607
)
@@ -1617,8 +1632,8 @@ def test_render_cluster_settings_ui_preserves_custom_workers_data_path_under_wor
16171632

16181633
cluster = fake_st.session_state.app_settings["cluster"]
16191634
assert cluster["workflow_session"] == "session-a"
1620-
assert cluster["workers_data_path"] == custom_data_path
1621-
assert fake_st.session_state[widget_keys["workers_data_path"]] == custom_data_path
1635+
assert cluster["workers_data_path"] == session_data_path
1636+
assert fake_st.session_state[widget_keys["workers_data_path"]] == session_data_path
16221637

16231638

16241639
def test_render_cluster_settings_ui_selects_existing_workflow_session_directory(monkeypatch, tmp_path):

0 commit comments

Comments
 (0)