Skip to content

Task group lifecycle

FUNCTION DESCRIPTION
deactivate_task_group

Deactivate task-group venv

reactivate_task_group

Deactivate task-group venv

Classes

Functions:

deactivate_task_group(task_group_id, background_tasks, response, superuser=Depends(current_superuser_act), db=Depends(get_async_db)) async

Deactivate task-group venv

Source code in fractal_server/app/routes/admin/v2/task_group_lifecycle.py
@router.post(
    "/{task_group_id}/deactivate/",
    response_model=TaskGroupActivityRead,
)
async def deactivate_task_group(
    task_group_id: int,
    background_tasks: BackgroundTasks,
    response: Response,
    superuser: UserOAuth = Depends(current_superuser_act),
    db: AsyncSession = Depends(get_async_db),
) -> TaskGroupActivityV2:
    """
    Deactivate task-group venv
    """
    task_group = await _get_task_group_or_404(
        task_group_id=task_group_id, db=db
    )

    # Check that task-group is active
    if not task_group.active:
        raise HTTPException(
            status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
            detail=(
                f"Cannot deactivate a task group with {task_group.active=}."
            ),
        )

    # Check no other activity is ongoing
    await check_no_ongoing_activity(task_group_id=task_group_id, db=db)

    # Check no submitted jobs use tasks from this task group
    await check_no_submitted_job(task_group_id=task_group.id, db=db)

    # Shortcut for task-group with origin="other"
    if task_group.origin == TaskGroupOriginEnum.OTHER:
        task_group.active = False
        task_group_activity = TaskGroupActivityV2(
            user_id=task_group.user_id,
            taskgroupv2_id=task_group.id,
            status=TaskGroupActivityStatus.OK,
            action=TaskGroupActivityAction.DEACTIVATE,
            pkg_name=task_group.pkg_name,
            version=task_group.version,
            log=(
                f"Task group has {task_group.origin=}, set "
                "task_group.active to False and exit."
            ),
            timestamp_started=get_timestamp(),
            timestamp_ended=get_timestamp(),
            fractal_server_version=__VERSION__,
        )
        db.add(task_group)
        db.add(task_group_activity)
        await db.commit()
        response.status_code = status.HTTP_202_ACCEPTED
        return task_group_activity

    task_group_activity = TaskGroupActivityV2(
        user_id=task_group.user_id,
        taskgroupv2_id=task_group.id,
        status=TaskGroupActivityStatus.PENDING,
        action=TaskGroupActivityAction.DEACTIVATE,
        pkg_name=task_group.pkg_name,
        version=task_group.version,
        timestamp_started=get_timestamp(),
        fractal_server_version=__VERSION__,
    )
    db.add(task_group_activity)
    await db.commit()

    user = await db.get_one(UserOAuth, task_group.user_id)
    # Get validated resource and profile
    resource, profile = await validate_user_profile(user=user, db=db)

    # Submit background task
    if resource.type == ResourceType.SLURM_SSH:
        if task_group.origin == TaskGroupOriginEnum.PIXI:
            deactivate_function = deactivate_ssh_pixi
        else:
            deactivate_function = deactivate_ssh
    else:
        if task_group.origin == TaskGroupOriginEnum.PIXI:
            deactivate_function = deactivate_local_pixi
        else:
            deactivate_function = deactivate_local
    background_tasks.add_task(
        deactivate_function,
        task_group_id=task_group.id,
        task_group_activity_id=task_group_activity.id,
        resource=resource,
        profile=profile,
    )

    logger.debug(
        "Admin task group deactivation endpoint: start deactivate "
        "and return task_group_activity"
    )
    response.status_code = status.HTTP_202_ACCEPTED
    return task_group_activity

reactivate_task_group(task_group_id, background_tasks, response, superuser=Depends(current_superuser_act), db=Depends(get_async_db)) async

Deactivate task-group venv

Source code in fractal_server/app/routes/admin/v2/task_group_lifecycle.py
@router.post(
    "/{task_group_id}/reactivate/",
    response_model=TaskGroupActivityRead,
)
async def reactivate_task_group(
    task_group_id: int,
    background_tasks: BackgroundTasks,
    response: Response,
    superuser: UserOAuth = Depends(current_superuser_act),
    db: AsyncSession = Depends(get_async_db),
) -> TaskGroupActivityV2:
    """
    Deactivate task-group venv
    """

    task_group = await _get_task_group_or_404(
        task_group_id=task_group_id, db=db
    )

    # Check that task-group is not active
    if task_group.active:
        raise HTTPException(
            status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
            detail=(
                f"Cannot reactivate a task group with {task_group.active=}."
            ),
        )

    # Check no other activity is ongoing
    await check_no_ongoing_activity(task_group_id=task_group_id, db=db)

    # Check no submitted jobs use tasks from this task group
    await check_no_submitted_job(task_group_id=task_group.id, db=db)

    # Shortcut for task-group with origin="other"
    if task_group.origin == TaskGroupOriginEnum.OTHER:
        task_group.active = True
        task_group_activity = TaskGroupActivityV2(
            user_id=task_group.user_id,
            taskgroupv2_id=task_group.id,
            status=TaskGroupActivityStatus.OK,
            action=TaskGroupActivityAction.REACTIVATE,
            pkg_name=task_group.pkg_name,
            version=task_group.version,
            log=(
                f"Task group has {task_group.origin=}, set "
                "task_group.active to True and exit."
            ),
            timestamp_started=get_timestamp(),
            timestamp_ended=get_timestamp(),
            fractal_server_version=__VERSION__,
        )
        db.add(task_group)
        db.add(task_group_activity)
        await db.commit()
        response.status_code = status.HTTP_202_ACCEPTED
        return task_group_activity

    if task_group.env_info is None:
        raise HTTPException(
            status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
            detail=(
                f"Cannot reactivate a task group with {task_group.env_info=}."
            ),
        )

    task_group_activity = TaskGroupActivityV2(
        user_id=task_group.user_id,
        taskgroupv2_id=task_group.id,
        status=TaskGroupActivityStatus.PENDING,
        action=TaskGroupActivityAction.REACTIVATE,
        pkg_name=task_group.pkg_name,
        version=task_group.version,
        timestamp_started=get_timestamp(),
        fractal_server_version=__VERSION__,
    )
    db.add(task_group_activity)
    await db.commit()

    # Get validated resource and profile
    user = await db.get_one(UserOAuth, task_group.user_id)
    resource, profile = await validate_user_profile(user=user, db=db)

    # Submit background task
    if resource.type == ResourceType.SLURM_SSH:
        if task_group.origin == TaskGroupOriginEnum.PIXI:
            reactivate_function = reactivate_ssh_pixi
        else:
            reactivate_function = reactivate_ssh
    else:
        if task_group.origin == TaskGroupOriginEnum.PIXI:
            reactivate_function = reactivate_local_pixi
        else:
            reactivate_function = reactivate_local

    background_tasks.add_task(
        reactivate_function,
        task_group_id=task_group.id,
        task_group_activity_id=task_group_activity.id,
        resource=resource,
        profile=profile,
    )

    logger.debug(
        "Admin task group reactivation endpoint: start reactivate "
        "and return task_group_activity"
    )
    response.status_code = status.HTTP_202_ACCEPTED
    return task_group_activity