def reactivate_local(
*,
task_group_activity_id: int,
task_group_id: int,
resource: Resource,
profile: Profile,
) -> None:
"""
Reactivate a task group venv.
This function is run as a background task, therefore exceptions must be
handled.
Args:
task_group_id:
task_group_activity_id:
resource:
"""
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:
try:
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,
)
except NoResultFound:
return
# Check that the (local) task_group venv_path does not exist
if Path(task_group.venv_path).exists():
error_msg = f"{task_group.venv_path} already exists."
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=FileExistsError(error_msg),
db=db,
)
return
try:
activity.status = TaskGroupActivityStatus.ONGOING
activity = add_commit_refresh(obj=activity, db=db)
# Prepare replacements for templates
python_bin = get_python_interpreter(
python_version=task_group.python_version,
resource=resource,
)
replacements = get_collection_replacements(
task_group=task_group,
python_bin=python_bin,
resource=resource,
)
with open(f"{tmpdir}/pip_freeze.txt", "w") as f:
f.write(task_group.env_info)
replacements.add(
("__PIP_FREEZE_FILE__", f"{tmpdir}/pip_freeze.txt")
)
# Prepare common arguments for `_customize_and_run_template`
common_args = dict(
replacements=replacements,
script_dir=(
Path(task_group.path) / SCRIPTS_SUBFOLDER
).as_posix(),
prefix=(
f"{int(time.time())}_"
f"{TaskGroupActivityAction.REACTIVATE}"
),
logger_name=LOGGER_NAME,
)
logger.debug("start - create venv")
_customize_and_run_template(
template_filename="1_create_venv.sh",
**common_args,
)
logger.debug("end - create venv")
activity.log = get_current_log(log_file_path)
activity = add_commit_refresh(obj=activity, db=db)
logger.debug("start - install from pip freeze")
_customize_and_run_template(
template_filename="5_pip_install_from_freeze.sh",
**common_args,
)
logger.debug("end - install from pip freeze")
activity.log = get_current_log(log_file_path)
activity.status = TaskGroupActivityStatus.OK
activity.timestamp_ended = get_timestamp()
activity = add_commit_refresh(obj=activity, db=db)
task_group.active = True
task_group = add_commit_refresh(obj=task_group, db=db)
logger.debug("END")
reset_logger_handlers(logger)
except Exception as reactivate_e:
rmtree_nofail(
folder_path=task_group.venv_path,
logger_name=LOGGER_NAME,
)
fail_and_cleanup(
task_group=task_group,
task_group_activity=activity,
logger_name=LOGGER_NAME,
log_file_path=log_file_path,
exception=reactivate_e,
db=db,
)
return