Пример #1
0
def create_schedule(
        project: str,
        schedule: schemas.ScheduleInput,
        auth_verifier: deps.AuthVerifierDep = Depends(deps.AuthVerifierDep),
        db_session: Session = Depends(deps.get_db_session),
):
    mlrun.api.utils.singletons.project_member.get_project_member(
    ).ensure_project(db_session, project, auth_info=auth_verifier.auth_info)
    mlrun.api.utils.clients.opa.Client().query_project_resource_permissions(
        mlrun.api.schemas.AuthorizationResourceTypes.schedule,
        project,
        schedule.name,
        mlrun.api.schemas.AuthorizationAction.create,
        auth_verifier.auth_info,
    )
    get_scheduler().create_schedule(
        db_session,
        auth_verifier.auth_info,
        project,
        schedule.name,
        schedule.kind,
        schedule.scheduled_object,
        schedule.cron_trigger,
        labels=schedule.labels,
        concurrency_limit=schedule.concurrency_limit,
    )
    return Response(status_code=HTTPStatus.CREATED.value)
Пример #2
0
def create_schedule(
        project: str,
        schedule: schemas.ScheduleInput,
        auth_info: mlrun.api.schemas.AuthInfo = Depends(
            deps.authenticate_request),
        db_session: Session = Depends(deps.get_db_session),
):
    mlrun.api.utils.singletons.project_member.get_project_member(
    ).ensure_project(db_session, project, auth_info=auth_info)
    mlrun.api.utils.auth.verifier.AuthVerifier(
    ).query_project_resource_permissions(
        mlrun.api.schemas.AuthorizationResourceTypes.schedule,
        project,
        schedule.name,
        mlrun.api.schemas.AuthorizationAction.create,
        auth_info,
    )
    if not auth_info.access_key:
        auth_info.access_key = schedule.credentials.access_key
    get_scheduler().create_schedule(
        db_session,
        auth_info,
        project,
        schedule.name,
        schedule.kind,
        schedule.scheduled_object,
        schedule.cron_trigger,
        schedule.labels,
        schedule.concurrency_limit,
    )
    return Response(status_code=HTTPStatus.CREATED.value)
Пример #3
0
def update_schedule(
        project: str,
        name: str,
        schedule: schemas.ScheduleUpdate,
        auth_info: mlrun.api.schemas.AuthInfo = Depends(
            deps.authenticate_request),
        db_session: Session = Depends(deps.get_db_session),
):
    mlrun.api.utils.auth.verifier.AuthVerifier(
    ).query_project_resource_permissions(
        mlrun.api.schemas.AuthorizationResourceTypes.schedule,
        project,
        name,
        mlrun.api.schemas.AuthorizationAction.update,
        auth_info,
    )
    if not auth_info.access_key:
        auth_info.access_key = schedule.credentials.access_key
    get_scheduler().update_schedule(
        db_session,
        auth_info,
        project,
        name,
        schedule.scheduled_object,
        schedule.cron_trigger,
        labels=schedule.labels,
    )
    return Response(status_code=HTTPStatus.OK.value)
Пример #4
0
def delete_schedule(
        project: str,
        name: str,
        db_session: Session = Depends(deps.get_db_session),
):
    get_scheduler().delete_schedule(db_session, project, name)
    return Response(status_code=HTTPStatus.NO_CONTENT.value)
Пример #5
0
def _submit_run(db_session: Session, auth_info: mlrun.api.schemas.AuthInfo,
                data) -> typing.Tuple[str, str, str, typing.Dict]:
    """
    :return: Tuple with:
        1. str of the project of the run
        2. str of the kind of the function of the run
        3. str of the uid of the run that started execution (None when it was scheduled)
        4. dict of the response info
    """
    run_uid = None
    project = None
    try:
        fn, task = _parse_submit_run_body(db_session, auth_info, data)
        run_db = get_run_db_instance(db_session, auth_info.session)
        fn.set_db_connection(run_db, True)
        logger.info("Submitting run", function=fn.to_dict(), task=task)
        # fn.spec.rundb = "http://mlrun-api:8080"
        schedule = data.get("schedule")
        if schedule:
            cron_trigger = schedule
            if isinstance(cron_trigger, dict):
                cron_trigger = schemas.ScheduleCronTrigger(**cron_trigger)
            schedule_labels = task["metadata"].get("labels")
            get_scheduler().create_schedule(
                db_session,
                auth_info,
                task["metadata"]["project"],
                task["metadata"]["name"],
                schemas.ScheduleKinds.job,
                data,
                cron_trigger,
                schedule_labels,
            )
            project = task["metadata"]["project"]

            response = {
                "schedule": schedule,
                "project": task["metadata"]["project"],
                "name": task["metadata"]["name"],
            }
        else:
            run = fn.run(task, watch=False)
            run_uid = run.metadata.uid
            project = run.metadata.project
            if run:
                response = run.to_dict()

    except HTTPException:
        logger.error(traceback.format_exc())
        raise
    except mlrun.errors.MLRunHTTPStatusError:
        raise
    except Exception as err:
        logger.error(traceback.format_exc())
        log_and_raise(HTTPStatus.BAD_REQUEST.value,
                      reason=f"runtime error: {err}")

    logger.info("Run submission succeeded", response=response)
    return project, fn.kind, run_uid, {"data": response}
Пример #6
0
def update_schedule(
        project: str,
        name: str,
        schedule: schemas.ScheduleUpdate,
        db_session: Session = Depends(deps.get_db_session),
):
    get_scheduler().update_schedule(
        db_session,
        project,
        name,
        schedule.scheduled_object,
        schedule.cron_trigger,
        labels=schedule.labels,
    )
    return Response(status_code=HTTPStatus.OK.value)
Пример #7
0
def delete_schedule(
        project: str,
        name: str,
        auth_verifier: deps.AuthVerifierDep = Depends(deps.AuthVerifierDep),
        db_session: Session = Depends(deps.get_db_session),
):
    mlrun.api.utils.clients.opa.Client().query_project_resource_permissions(
        mlrun.api.schemas.AuthorizationResourceTypes.schedule,
        project,
        name,
        mlrun.api.schemas.AuthorizationAction.delete,
        auth_verifier.auth_info,
    )
    get_scheduler().delete_schedule(db_session, project, name)
    return Response(status_code=HTTPStatus.NO_CONTENT.value)
Пример #8
0
def create_schedule(
    project: str,
    schedule: schemas.ScheduleInput,
    db_session: Session = Depends(deps.get_db_session),
):
    get_scheduler().create_schedule(
        db_session,
        project,
        schedule.name,
        schedule.kind,
        schedule.scheduled_object,
        schedule.cron_trigger,
        labels={label.name: label.value for label in schedule.labels},
    )
    return Response(status_code=HTTPStatus.CREATED.value)
Пример #9
0
def list_schedules(
        project: str,
        name: str = None,
        labels: str = None,
        kind: schemas.ScheduleKinds = None,
        include_last_run: bool = False,
        auth_verifier: deps.AuthVerifierDep = Depends(deps.AuthVerifierDep),
        db_session: Session = Depends(deps.get_db_session),
):
    mlrun.api.utils.clients.opa.Client().query_project_permissions(
        project,
        mlrun.api.schemas.AuthorizationAction.read,
        auth_verifier.auth_info,
    )
    schedules = get_scheduler().list_schedules(
        db_session,
        project,
        name,
        kind,
        labels,
        include_last_run=include_last_run,
    )
    filtered_schedules = mlrun.api.utils.clients.opa.Client(
    ).filter_project_resources_by_permissions(
        mlrun.api.schemas.AuthorizationResourceTypes.schedule,
        schedules.schedules,
        lambda schedule: (
            schedule.project,
            schedule.name,
        ),
        auth_verifier.auth_info,
    )
    schedules.schedules = filtered_schedules
    return schedules
Пример #10
0
def list_schedules(
        project: str,
        name: str = None,
        labels: str = None,
        kind: schemas.ScheduleKinds = None,
        include_last_run: bool = False,
        include_credentials: bool = fastapi.Query(False,
                                                  alias="include-credentials"),
        auth_info: mlrun.api.schemas.AuthInfo = Depends(
            deps.authenticate_request),
        db_session: Session = Depends(deps.get_db_session),
):
    mlrun.api.utils.auth.verifier.AuthVerifier().query_project_permissions(
        project,
        mlrun.api.schemas.AuthorizationAction.read,
        auth_info,
    )
    schedules = get_scheduler().list_schedules(db_session, project, name, kind,
                                               labels, include_last_run,
                                               include_credentials)
    filtered_schedules = mlrun.api.utils.auth.verifier.AuthVerifier(
    ).filter_project_resources_by_permissions(
        mlrun.api.schemas.AuthorizationResourceTypes.schedule,
        schedules.schedules,
        lambda schedule: (
            schedule.project,
            schedule.name,
        ),
        auth_info,
    )
    schedules.schedules = filtered_schedules
    return schedules
Пример #11
0
def get_schedule(
    project: str,
    name: str,
    include_last_run: bool = False,
    db_session: Session = Depends(deps.get_db_session),
):
    return get_scheduler().get_schedule(
        db_session, project, name, include_last_run=include_last_run
    )
Пример #12
0
def create_schedule(
    project: str,
    schedule: schemas.ScheduleInput,
    auth_verifier: deps.AuthVerifier = Depends(deps.AuthVerifier),
    db_session: Session = Depends(deps.get_db_session),
):
    get_scheduler().create_schedule(
        db_session,
        auth_verifier.auth_info,
        project,
        schedule.name,
        schedule.kind,
        schedule.scheduled_object,
        schedule.cron_trigger,
        labels=schedule.labels,
        concurrency_limit=schedule.concurrency_limit,
    )
    return Response(status_code=HTTPStatus.CREATED.value)
Пример #13
0
def list_schedules(
    project: str,
    name: str = None,
    labels: str = None,
    kind: schemas.ScheduleKinds = None,
    include_last_run: bool = False,
    db_session: Session = Depends(deps.get_db_session),
):
    return get_scheduler().list_schedules(
        db_session, project, name, labels, kind, include_last_run=include_last_run
    )
Пример #14
0
def delete_schedules(
        project: str,
        auth_info: mlrun.api.schemas.AuthInfo = Depends(
            deps.authenticate_request),
        db_session: Session = Depends(deps.get_db_session),
):
    schedules = get_scheduler().list_schedules(
        db_session,
        project,
    )
    mlrun.api.utils.auth.verifier.AuthVerifier(
    ).query_project_resources_permissions(
        mlrun.api.schemas.AuthorizationResourceTypes.schedule,
        schedules.schedules,
        lambda schedule: (schedule.project, schedule.name),
        mlrun.api.schemas.AuthorizationAction.delete,
        auth_info,
    )
    get_scheduler().delete_schedules(db_session, project)
    return Response(status_code=HTTPStatus.NO_CONTENT.value)
Пример #15
0
def update_schedule(
        project: str,
        name: str,
        schedule: schemas.ScheduleUpdate,
        auth_verifier: deps.AuthVerifierDep = Depends(deps.AuthVerifierDep),
        db_session: Session = Depends(deps.get_db_session),
):
    mlrun.api.utils.clients.opa.Client().query_project_resource_permissions(
        mlrun.api.schemas.AuthorizationResourceTypes.schedule,
        project,
        name,
        mlrun.api.schemas.AuthorizationAction.update,
        auth_verifier.auth_info,
    )
    get_scheduler().update_schedule(
        db_session,
        auth_verifier.auth_info,
        project,
        name,
        schedule.scheduled_object,
        schedule.cron_trigger,
        labels=schedule.labels,
    )
    return Response(status_code=HTTPStatus.OK.value)
Пример #16
0
def get_schedule(
        project: str,
        name: str,
        include_last_run: bool = False,
        auth_verifier: deps.AuthVerifierDep = Depends(deps.AuthVerifierDep),
        db_session: Session = Depends(deps.get_db_session),
):
    schedule = get_scheduler().get_schedule(
        db_session,
        project,
        name,
        include_last_run=include_last_run,
    )
    mlrun.api.utils.clients.opa.Client().query_project_resource_permissions(
        mlrun.api.schemas.AuthorizationResourceTypes.schedule,
        project,
        name,
        mlrun.api.schemas.AuthorizationAction.read,
        auth_verifier.auth_info,
    )
    return schedule
Пример #17
0
def get_schedule(
        project: str,
        name: str,
        include_last_run: bool = False,
        include_credentials: bool = fastapi.Query(False,
                                                  alias="include-credentials"),
        auth_info: mlrun.api.schemas.AuthInfo = Depends(
            deps.authenticate_request),
        db_session: Session = Depends(deps.get_db_session),
):
    schedule = get_scheduler().get_schedule(db_session, project, name,
                                            include_last_run,
                                            include_credentials)
    mlrun.api.utils.auth.verifier.AuthVerifier(
    ).query_project_resource_permissions(
        mlrun.api.schemas.AuthorizationResourceTypes.schedule,
        project,
        name,
        mlrun.api.schemas.AuthorizationAction.read,
        auth_info,
    )
    return schedule
Пример #18
0
async def shutdown_event():
    if get_project_member():
        get_project_member().shutdown()
    cancel_all_periodic_functions()
    if get_scheduler():
        await get_scheduler().stop()