Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

lambda manager: send signal before calling function #6215

Merged
merged 9 commits into from
Jun 8, 2023
6 changes: 2 additions & 4 deletions cvat/apps/iam/permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,8 @@ def get_organization(request, obj):
except AttributeError as exc:
# Skip initialization of organization for those objects that don't related with organization
view = request.parser_context.get('view')
if view and view.basename in ('user', 'function', 'request'):
return None
if view and view.basename in ('user', 'function', 'request',):
return request.iam_context['organization']

raise exc

Expand All @@ -72,8 +72,6 @@ def get_organization(request, obj):
except Organization.DoesNotExist:
return None



return request.iam_context['organization']

def get_membership(request, organization):
Expand Down
7 changes: 7 additions & 0 deletions cvat/apps/lambda_manager/signals.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Copyright (C) 2023 CVAT.ai Corporation
#
# SPDX-License-Identifier: MIT

from django.dispatch import Signal

interactive_function_call_signal = Signal()
18 changes: 16 additions & 2 deletions cvat/apps/lambda_manager/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import numpy as np
import requests
import rq
from cvat.apps.lambda_manager.signals import interactive_function_call_signal
from django.conf import settings
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from drf_spectacular.types import OpenApiTypes
Expand All @@ -27,6 +28,7 @@
inline_serializer)
from rest_framework import serializers, status, viewsets
from rest_framework.response import Response
from rest_framework.request import Request

import cvat.apps.dataset_manager as dm
from cvat.apps.engine.frame_provider import FrameProvider
Expand Down Expand Up @@ -194,7 +196,15 @@ def to_dict(self):

return response

def invoke(self, db_task: Task, data: Dict[str, Any], *, db_job: Optional[Job] = None):
def invoke(
self,
db_task: Task,
data: Dict[str, Any],
*,
db_job: Optional[Job] = None,
is_interactive: Optional[bool] = False,
request: Optional[Request] = None
):
try:
if db_job is not None and db_job.get_task_id() != db_task.id:
raise ValidationError("Job task id does not match task id",
Expand Down Expand Up @@ -299,7 +309,11 @@ def invoke(self, db_task: Task, data: Dict[str, Any], *, db_job: Optional[Job] =
.format(self.id, str(err)),
code=status.HTTP_400_BAD_REQUEST)

if is_interactive and request:
interactive_function_call_signal.send(sender=self, request=request)

response = self.gateway.invoke(self, payload)

response_filtered = []
def check_attr_value(value, func_attr, db_attr):
if db_attr is None:
Expand Down Expand Up @@ -788,7 +802,7 @@ def call(self, request, func_id):
gateway = LambdaGateway()
lambda_func = gateway.get(func_id)

return lambda_func.invoke(db_task, request.data, db_job=job)
return lambda_func.invoke(db_task, request.data, db_job=job, is_interactive=True, request=request)

@extend_schema(tags=['lambda'])
@extend_schema_view(
Expand Down