20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122 | def deactivate_ssh_pixi(
*,
task_group_activity_id: int,
task_group_id: int,
ssh_config: SSHConfig,
tasks_base_dir: str,
) -> None:
"""
Deactivate a pixi task group venv.
This function is run as a background task, therefore exceptions must be
handled.
Arguments:
task_group_id:
task_group_activity_id:
ssh_config:
tasks_base_dir:
Only used as a `safe_root` in `remove_dir`, and typically set to
`user_settings.ssh_tasks_dir`.
"""
LOGGER_NAME = f"{__name__}.ID{task_group_activity_id}"
with TemporaryDirectory() as tmpdir:
log_file_path = get_log_path(Path(tmpdir))
logger = set_logger(
logger_name=LOGGER_NAME,
log_file_path=log_file_path,
)
logger.debug("START")
with next(get_sync_db()) as db:
db_objects_ok, task_group, activity = get_activity_and_task_group(
task_group_activity_id=task_group_activity_id,
task_group_id=task_group_id,
db=db,
logger_name=LOGGER_NAME,
)
if not db_objects_ok:
return
with SingleUseFractalSSH(
ssh_config=ssh_config,
logger_name=LOGGER_NAME,
) as fractal_ssh:
try:
# Check SSH connection
ssh_ok = check_ssh_or_fail_and_cleanup(
fractal_ssh=fractal_ssh,
task_group=task_group,
task_group_activity=activity,
logger_name=LOGGER_NAME,
log_file_path=log_file_path,
db=db,
)
if not ssh_ok:
return
# Check that the (remote) task_group venv_path does exist
source_dir = Path(
task_group.path, SOURCE_DIR_NAME
).as_posix()
if not fractal_ssh.remote_exists(source_dir):
error_msg = f"{source_dir} does not exist."
logger.error(error_msg)
fail_and_cleanup(
task_group=task_group,
task_group_activity=activity,
logger_name=LOGGER_NAME,
log_file_path=log_file_path,
exception=FileNotFoundError(error_msg),
db=db,
)
return
# Actually mark the task group as non-active
logger.info("Now setting `active=False`.")
task_group.active = False
task_group = add_commit_refresh(obj=task_group, db=db)
# Proceed with deactivation
logger.info(f"Now removing {source_dir}.")
fractal_ssh.remove_folder(
folder=source_dir,
safe_root=tasks_base_dir,
)
logger.info(f"All good, {source_dir} removed.")
activity.status = TaskGroupActivityStatusV2.OK
activity.log = get_current_log(log_file_path)
activity.timestamp_ended = get_timestamp()
activity = add_commit_refresh(obj=activity, db=db)
reset_logger_handlers(logger)
except Exception as e:
fail_and_cleanup(
task_group=task_group,
task_group_activity=activity,
logger_name=LOGGER_NAME,
log_file_path=log_file_path,
exception=e,
db=db,
)
|