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

Refactor Task List and filters with error handlers for Scheduler #1957

Merged
merged 105 commits into from
Jul 11, 2024
Merged
Show file tree
Hide file tree
Changes from 11 commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
ab427be
More error handlign for Scheduler
Rieven Oct 18, 2023
ff0047d
Merge branch 'main' of github.com:minvws/nl-kat-coordination into fix…
Rieven Oct 19, 2023
dc65052
Fix ConnectionError everywhere
Rieven Oct 23, 2023
4488a64
Merge branch 'main' into fix-more-scheduler-error-handling
Rieven Oct 23, 2023
50a555d
Fix health page
Rieven Oct 23, 2023
71dcb6b
Merge branch 'fix-more-scheduler-error-handling' of github.com:minvws…
Rieven Oct 23, 2023
75bb92a
fix lang
Rieven Oct 23, 2023
6c21376
Fix review changes
Rieven Oct 25, 2023
95140c2
Merge branch 'main' of github.com:minvws/nl-kat-coordination into fix…
Rieven Oct 25, 2023
55ac513
fix lang
Rieven Oct 25, 2023
e2d8f05
Fix function
Rieven Oct 25, 2023
0659831
Merge branch 'main' into fix-more-scheduler-error-handling
Rieven Oct 30, 2023
d7414f5
Merge branch 'main' into fix-more-scheduler-error-handling
Rieven Nov 1, 2023
ff2a9e4
Merge branch 'main' of github.com:minvws/nl-kat-coordination into fix…
Rieven Nov 6, 2023
bc797ea
Fix to handle all SchedulerErrors
Rieven Nov 6, 2023
20f9c4e
Merge branch 'main' into fix-more-scheduler-error-handling
Rieven Nov 6, 2023
7daf2bc
Fix test
Rieven Nov 6, 2023
a54fbd3
Merge branch 'main' of github.com:minvws/nl-kat-coordination into fix…
Rieven Nov 7, 2023
abb0247
Merge branch 'main' into fix-more-scheduler-error-handling
Rieven Nov 7, 2023
e234451
Merge branch 'main' into fix-more-scheduler-error-handling
Rieven Nov 8, 2023
bd1444a
fix test
Rieven Nov 8, 2023
60dad55
Merge branch 'fix-more-scheduler-error-handling' of github.com:minvws…
Rieven Nov 8, 2023
f72001a
Merge branch 'main' of github.com:minvws/nl-kat-coordination into fix…
Rieven Nov 9, 2023
7b46479
Merge branch 'main' of github.com:minvws/nl-kat-coordination into fix…
Rieven Nov 27, 2023
bb26496
Fix scheduler
Rieven Nov 27, 2023
f4a83b9
Merge branch 'main' into fix-more-scheduler-error-handling
Rieven Nov 27, 2023
ec676ac
Merge branch 'main' of github.com:minvws/nl-kat-coordination into fix…
Rieven Jan 4, 2024
9d5866e
Merge branch 'main' into fix-more-scheduler-error-handling
underdarknl Jan 31, 2024
6b17153
Merge branch 'main' into fix-more-scheduler-error-handling
Rieven Feb 5, 2024
503e753
Merge branch 'main' into fix-more-scheduler-error-handling
Rieven Feb 7, 2024
5e9685b
Merge branch 'main' into fix-more-scheduler-error-handling
Rieven Feb 7, 2024
8856ca1
Merge branch 'main' into fix-more-scheduler-error-handling
Rieven Feb 12, 2024
6bbb409
Merge branch 'main' of github.com:minvws/nl-kat-coordination into fix…
Rieven Mar 18, 2024
ea041e8
Fix schduler views
Rieven Mar 19, 2024
085d163
remove try
Rieven Mar 19, 2024
9ef97ca
Fix Scheduler error being handled properly
Rieven Mar 21, 2024
dc86c84
fix health page
Rieven Mar 21, 2024
ed4757d
Merge branch 'main' into fix-more-scheduler-error-handling
Rieven Mar 21, 2024
03636be
fix tests and views
Rieven Mar 25, 2024
000cdbb
Merge branch 'fix-more-scheduler-error-handling' of github.com:minvws…
Rieven Mar 25, 2024
f00674f
Fixes for scheduler view
Rieven Mar 25, 2024
2b59ef3
Merge branch 'main' of github.com:minvws/nl-kat-coordination into fix…
Rieven Mar 25, 2024
1304663
Merge branch 'main' into fix-more-scheduler-error-handling
Rieven Mar 25, 2024
b5aa49d
Fix scheduler error handler
Rieven Mar 26, 2024
2a66a2e
Merge branch 'main' of github.com:minvws/nl-kat-coordination into fix…
Rieven Apr 2, 2024
9376d16
Fix soem views and tests
Rieven Apr 4, 2024
f7b865f
Fix more try and except
Rieven Apr 4, 2024
7cddf60
Remove double message
Rieven Apr 4, 2024
a316a2e
Move views and error handling
Rieven Apr 8, 2024
21b6653
Merge branch 'main' into fix-more-scheduler-error-handling
Rieven Apr 8, 2024
3cc36d4
Fix task list not showing automatically
Rieven Apr 10, 2024
d6e2c90
remove double filter form
Rieven Apr 10, 2024
6c94e87
Fix normalizer detail
Rieven Apr 10, 2024
5cd1648
Set context data
Rieven Apr 11, 2024
47cf6b3
Fix views for scheduler errors
Rieven Apr 22, 2024
9f10b5f
Merge branch 'main' of github.com:minvws/nl-kat-coordination into fix…
Rieven Apr 22, 2024
86968ff
Move some actions
Rieven Apr 22, 2024
5cb97e8
fix tests
Rieven Apr 24, 2024
bbdd065
Fix scheduler filters and task list
Rieven Apr 29, 2024
a9fe041
Merge branch 'main' of github.com:minvws/nl-kat-coordination into fix…
Rieven Apr 29, 2024
ec6ad51
Fix templates task list
Rieven Apr 30, 2024
9fadb16
Merge branch 'main' into fix-more-scheduler-error-handling
Rieven Apr 30, 2024
4bcc667
Merge branch 'main' of github.com:minvws/nl-kat-coordination into fix…
Rieven May 6, 2024
f81720a
Fix clear filters
Rieven May 6, 2024
4977c37
Fix scheduler view
Rieven May 7, 2024
c7d3236
Fix some errors
Rieven May 8, 2024
e5e060f
add test
Rieven May 14, 2024
62853a6
move some code to create logic
Rieven May 29, 2024
961de4b
Merge branch 'main' of github.com:minvws/nl-kat-coordination into fix…
Rieven Jun 5, 2024
4c4a260
fix tests
Rieven Jun 6, 2024
1dfc81e
fix tests
Rieven Jun 10, 2024
cd08c98
Merge branch 'main' of github.com:minvws/nl-kat-coordination into fix…
Rieven Jun 10, 2024
c84ef9a
fix tests
Rieven Jun 17, 2024
07ab246
Merge branch 'main' into fix-more-scheduler-error-handling
Rieven Jun 17, 2024
0a61c75
fix lang and precommit
Rieven Jun 17, 2024
ca3bf8c
fix precommit
Rieven Jun 17, 2024
030a430
Merge branch 'main' into fix-more-scheduler-error-handling
Rieven Jun 19, 2024
fb6acd7
Update rocky/rocky/scheduler.py
Rieven Jun 19, 2024
43e1001
Update rocky/rocky/views/tasks.py
Rieven Jun 19, 2024
c06636d
Review feedback
Rieven Jun 19, 2024
c0d08d8
Merge branch 'fix-more-scheduler-error-handling' of github.com:minvws…
Rieven Jun 19, 2024
2ce8ad6
Fix lang
Rieven Jun 19, 2024
1a74ad4
Fix errors, not redirecting
Rieven Jun 19, 2024
874bda6
fix lang
Rieven Jun 19, 2024
bdb01d9
fix tests
Rieven Jun 19, 2024
7813253
Merge branch 'main' into fix-more-scheduler-error-handling
underdarknl Jun 20, 2024
da0ab12
Fix lang en text stats to status
Rieven Jun 24, 2024
032c6aa
Merge branch 'fix-more-scheduler-error-handling' of github.com:minvws…
Rieven Jun 24, 2024
09698fc
Merge branch 'main' of github.com:minvws/nl-kat-coordination into fix…
Rieven Jun 24, 2024
f9a691a
Merge branch 'main' of github.com:minvws/nl-kat-coordination into fix…
Rieven Jun 27, 2024
aabf97c
Merge branch 'main' of github.com:minvws/nl-kat-coordination into fix…
Rieven Jul 8, 2024
d411fd2
fix test adding fixture
Rieven Jul 8, 2024
a1f060d
Fixes for 2 list at boefje detail
Rieven Jul 10, 2024
b35f80a
extra message to main class
Rieven Jul 10, 2024
63ee0cf
Fix filtering on plugin_id for normalizers
jpbruinsslot Jul 10, 2024
b671cae
00~Merge branch 'fix/mula/fix-normalizer-filtering' of github.com:min…
Rieven Jul 10, 2024
7acc1f1
Pre-commit
jpbruinsslot Jul 10, 2024
e5a5865
00~Merge branch 'fix/mula/fix-normalizer-filtering' of github.com:min…
Rieven Jul 10, 2024
47eee5b
Add input ooi for normalizer detail
Rieven Jul 11, 2024
074507a
Add task actions
Rieven Jul 11, 2024
f6b76c8
boefje_meta_id for download normalizer task fix
Rieven Jul 11, 2024
09cb31a
00~Merge branch 'main' of github.com:minvws/nl-kat-coordination into …
Rieven Jul 11, 2024
2167c52
Merge branch 'main' into fix-more-scheduler-error-handling
dekkers Jul 11, 2024
56e2020
fix lang
Rieven Jul 11, 2024
af89a4c
Merge branch 'fix-more-scheduler-error-handling' of github.com:minvws…
Rieven Jul 11, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion rocky/katalogus/views/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
from django.utils.translation import gettext_lazy as _
from requests import HTTPError, RequestException
from rest_framework.status import HTTP_404_NOT_FOUND
from tools.view_helpers import schedule_task

from katalogus.client import (
Boefje as KATalogusBoefje,
Expand All @@ -30,6 +29,7 @@
)
from rocky.scheduler import Boefje, BoefjeTask, Normalizer, NormalizerTask, QueuePrioritizedItem, RawData
from rocky.views.mixins import OctopoesView
from rocky.views.scheduler import schedule_task

logger = getLogger(__name__)

Expand Down
5 changes: 3 additions & 2 deletions rocky/katalogus/views/plugin_detail.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
from katalogus.client import get_katalogus
from katalogus.views.mixins import BoefjeMixin
from katalogus.views.plugin_settings_list import PluginSettingsListView
from rocky import scheduler
from rocky.views.scheduler import get_list_of_tasks_lazy

logger = getLogger(__name__)

Expand Down Expand Up @@ -52,7 +52,8 @@ def get_task_history(self) -> Page:

page = int(self.request.GET.get("task_history_page", 1))

task_history = scheduler.client.get_lazy_task_list(
task_history = get_list_of_tasks_lazy(
self.request,
scheduler_id=scheduler_id,
task_type=plugin_type,
plugin_id=plugin_id,
Expand Down
35 changes: 22 additions & 13 deletions rocky/rocky/locale/django.pot
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-10-17 13:44+0000\n"
"POT-Creation-Date: 2023-10-25 14:29+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
Expand Down Expand Up @@ -3330,13 +3330,6 @@ msgstr ""
msgid "Members"
msgstr ""

#: tools/view_helpers.py
msgid ""
"Your task is scheduled and will soon be started in the background. Results "
"will be added to the object list when they are in. It may take some time, a "
"refresh of the page may be needed to show the results."
msgstr ""

#: rocky/messaging.py
msgid ""
"You have trusted this member with a clearance level of L{}. This member "
Expand All @@ -3345,7 +3338,7 @@ msgid ""
msgstr ""

#: rocky/scheduler.py
msgid "Connectivity issues with Mula."
msgid "Could not connect to Scheduler. Service is possibly down."
msgstr ""

#: rocky/scheduler.py
Expand All @@ -3360,6 +3353,10 @@ msgstr ""
msgid "Task already queued."
msgstr ""

#: rocky/scheduler.py
msgid "Task could not be found."
msgstr ""

#: rocky/settings.py
msgid "Blue light"
msgstr ""
Expand Down Expand Up @@ -5524,12 +5521,24 @@ msgstr ""
msgid "Reset"
msgstr ""

#: rocky/views/tasks.py
msgid "Task details not found."
#: rocky/views/scheduler.py
msgid "'Plugin not found'"
msgstr ""

#: rocky/views/tasks.py
msgid "Fetching tasks failed: no connection with scheduler"
#: rocky/views/scheduler.py
msgid "'OOI not found'"
msgstr ""

#: rocky/views/scheduler.py
msgid "Scheduling {} {} with input object {} failed. "
msgstr ""

#: rocky/views/scheduler.py
msgid ""
"Task of {} {} with input object {} is scheduled and will soon be started in "
"the background. Results will be added to the object list when they are in. "
"It may take some time, a refresh of the page may be needed to show the "
"results."
msgstr ""

#: rocky/views/upload_csv.py
Expand Down
65 changes: 46 additions & 19 deletions rocky/rocky/scheduler.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from __future__ import annotations

import datetime
import logging
import uuid
from enum import Enum
from http import HTTPStatus
Expand All @@ -10,10 +11,12 @@
from django.conf import settings
from django.utils.translation import gettext_lazy as _
from pydantic import BaseModel, Field
from requests.exceptions import HTTPError
from requests.exceptions import ConnectionError, HTTPError

from rocky.health import ServiceHealth

logger = logging.getLogger(__name__)


class Boefje(BaseModel):
"""Boefje representation."""
Expand Down Expand Up @@ -164,7 +167,7 @@ def __getitem__(self, key) -> List[Task]:


class SchedulerError(Exception):
message = _("Connectivity issues with Mula.")
message = _("Could not connect to Scheduler. Service is possibly down.")

def __str__(self):
return str(self.message)
Expand All @@ -182,17 +185,25 @@ class ConflictError(SchedulerError):
message = _("Task already queued.")


class TaskNotFoundError(SchedulerError):
message = _("Task could not be found.")


class SchedulerClient:
def __init__(self, base_uri: str):
self.session = requests.Session()
Rieven marked this conversation as resolved.
Show resolved Hide resolved
self._base_uri = base_uri
self.is_alive()

def list_tasks(
self,
**kwargs,
) -> PaginatedTasksResponse:
res = self.session.get(f"{self._base_uri}/tasks", params=kwargs)
return PaginatedTasksResponse.parse_raw(res.text)
try:
res = self.session.get(f"{self._base_uri}/tasks", params=kwargs)
return PaginatedTasksResponse.parse_raw(res.text)
except ConnectionError:
raise SchedulerError()

def get_lazy_task_list(
self,
Expand All @@ -205,22 +216,30 @@ def get_lazy_task_list(
plugin_id: Optional[str] = None,
boefje_name: Optional[str] = None,
) -> LazyTaskList:
return LazyTaskList(
self,
scheduler_id=scheduler_id,
type=task_type,
status=status,
min_created_at=min_created_at,
max_created_at=max_created_at,
input_ooi=input_ooi,
plugin_id=plugin_id,
boefje_name=boefje_name,
)
try:
return LazyTaskList(
self,
scheduler_id=scheduler_id,
type=task_type,
status=status,
min_created_at=min_created_at,
max_created_at=max_created_at,
input_ooi=input_ooi,
plugin_id=plugin_id,
boefje_name=boefje_name,
)
except ConnectionError:
raise SchedulerError()

def get_task_details(self, task_id) -> Task:
res = self.session.get(f"{self._base_uri}/tasks/{task_id}")
res.raise_for_status()
return Task.parse_raw(res.content)
try:
res = self.session.get(f"{self._base_uri}/tasks/{task_id}")
res.raise_for_status()
return Task.parse_raw(res.content)
except HTTPError:
raise TaskNotFoundError()
except ConnectionError:
raise SchedulerError()

def push_task(self, queue_name: str, prioritized_item: QueuePrioritizedItem) -> None:
try:
Expand All @@ -237,10 +256,18 @@ def push_task(self, queue_name: str, prioritized_item: QueuePrioritizedItem) ->
else:
raise SchedulerError()

def is_alive(self) -> None:
try:
request = self.session.get(f"{self._base_uri}")
request.raise_for_status()
except ConnectionError:
raise SchedulerError()

def health(self) -> ServiceHealth:
health_endpoint = self.session.get(f"{self._base_uri}/health")
health_endpoint.raise_for_status()
return ServiceHealth.parse_raw(health_endpoint.content)


client = SchedulerClient(settings.SCHEDULER_API)
def get_scheduler() -> SchedulerClient:
return SchedulerClient(settings.SCHEDULER_API)
8 changes: 5 additions & 3 deletions rocky/rocky/views/health.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
from rocky.bytes_client import get_bytes_client
from rocky.health import ServiceHealth
from rocky.keiko import keiko_client
from rocky.scheduler import client
from rocky.scheduler import SchedulerError, get_scheduler
from rocky.version import __version__

logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -54,8 +54,8 @@ def get_octopoes_health(octopoes_api_connector: OctopoesAPIConnector) -> Service

def get_scheduler_health() -> ServiceHealth:
try:
scheduler_health = client.health()
except RequestException as ex:
scheduler_health = get_scheduler().health()
except (SchedulerError, RequestException) as ex:
logger.exception(ex)
scheduler_health = ServiceHealth(
service="scheduler",
Expand Down Expand Up @@ -120,6 +120,8 @@ def get_context_data(self, **kwargs):
"text": _("Beautified"),
},
]

rocky_health = get_rocky_health(self.octopoes_api_connector)
context["health_checks"] = flatten_health(rocky_health)

return context
12 changes: 4 additions & 8 deletions rocky/rocky/views/ooi_detail.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,22 +21,17 @@

from octopoes.models import OOI, Reference
from octopoes.models.ooi.question import Question
from rocky import scheduler
from rocky.views.ooi_detail_related_object import OOIFindingManager, OOIRelatedObjectAddView
from rocky.views.ooi_view import BaseOOIDetailView
from rocky.views.scheduler import get_list_of_tasks_lazy


class PageActions(Enum):
START_SCAN = "start_scan"
SUBMIT_ANSWER = "submit_answer"


class OOIDetailView(
BoefjeMixin,
OOIRelatedObjectAddView,
OOIFindingManager,
BaseOOIDetailView,
):
class OOIDetailView(BoefjeMixin, OOIRelatedObjectAddView, OOIFindingManager, BaseOOIDetailView):
template_name = "oois/ooi_detail.html"
connector_form_class = ObservedAtForm
task_history_limit = 10
Expand Down Expand Up @@ -125,7 +120,8 @@ def get_task_history(self) -> Page:
else:
max_created_at = None

task_history = scheduler.client.get_lazy_task_list(
task_history = get_list_of_tasks_lazy(
self.request,
scheduler_id=scheduler_id,
status=status,
min_created_at=min_created_at,
Expand Down
69 changes: 69 additions & 0 deletions rocky/rocky/views/scheduler.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import logging

from django.contrib import messages
from django.http import HttpRequest
from django.utils.translation import gettext_lazy as _

from rocky.scheduler import (
BadRequestError,
ConflictError,
LazyTaskList,
QueuePrioritizedItem,
SchedulerError,
Task,
TaskNotFoundError,
TooManyRequestsError,
get_scheduler,
)

logger = logging.getLogger(__name__)


def schedule_task(request: HttpRequest, organization_code: str, task: QueuePrioritizedItem) -> None:
plugin_name = ""
input_ooi = ""
plugin_type = task.data.type

if plugin_type == "boefje":
plugin_name = task.data.boefje.name
input_ooi = task.data.input_ooi
elif plugin_type == "normalizer":
plugin_name = task.data.normalizer.id # name not set yet, is None for name
input_ooi = task.data.raw_data.boefje_meta.input_ooi
else:
plugin_name = _("'Plugin not found'")
input_ooi = _("'OOI not found'")
try:
get_scheduler().push_task(f"{task.data.type}-{organization_code}", task)
except (BadRequestError, TooManyRequestsError, ConflictError) as task_error:
error_message = (
_("Scheduling {} {} with input object {} failed. ").format(plugin_type.title(), plugin_name, input_ooi)
+ task_error.message
)
messages.error(request, error_message)
except SchedulerError as error:
messages.error(request, error.message)
else:
messages.success(
request,
_(
"Task of {} {} with input object {} is scheduled and will soon be started in the background. "
"Results will be added to the object list when they are in. "
"It may take some time, a refresh of the page may be needed to show the results."
).format(plugin_type.title(), plugin_name, input_ooi),
)


def get_list_of_tasks_lazy(request: HttpRequest, **params) -> LazyTaskList:
try:
return get_scheduler().get_lazy_task_list(**params)
except SchedulerError as error:
messages.error(request, error.message)
return []


def get_details_of_task(request: HttpRequest, task_id: str) -> Task:
try:
return get_scheduler().get_task_details(task_id)
except (TaskNotFoundError, TooManyRequestsError, SchedulerError) as error:
messages.error(request, error.message)
10 changes: 3 additions & 7 deletions rocky/rocky/views/task_detail.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,16 @@
from django.views.generic import TemplateView
from katalogus.views.mixins import BoefjeMixin, NormalizerMixin

from rocky.scheduler import client
from rocky.views.mixins import OctopoesView
from rocky.views.scheduler import get_details_of_task


class TaskDetailView(OctopoesView, TemplateView):
@staticmethod
def get_task(task_id):
return client.get_task_details(task_id)

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)

context["task_id"] = kwargs["task_id"]
context["task"] = self.get_task(context["task_id"])
context["task"] = get_details_of_task(self.request, context["task_id"])
return context


Expand Down Expand Up @@ -58,7 +54,7 @@ def get_output_oois(self, task):

def get(self, request, *args, **kwargs):
task_id = kwargs["task_id"]
task = self.get_task(task_id)
task = get_details_of_task(request, task_id)
return JsonResponse(
{
"oois": self.get_output_oois(task),
Expand Down
Loading
Loading