9
9
10
10
import traceback
11
11
import uuid
12
- from typing import Any
13
12
14
13
from celery .beat import ScheduleEntry , Scheduler , logger
15
14
from invenio_db import db
16
- from sqlalchemy import and_
17
15
18
- from invenio_jobs .models import Job , Run , Task
16
+ from invenio_jobs .models import Job , Run
19
17
from invenio_jobs .tasks import execute_run
20
18
21
19
@@ -49,27 +47,23 @@ class RunScheduler(Scheduler):
49
47
Entry = JobEntry
50
48
entries = {}
51
49
52
- def __init__ (self , * args : Any , ** kwargs : Any ) -> None :
53
- """Initialize the database scheduler."""
54
- super ().__init__ (* args , ** kwargs )
55
-
56
50
@property
57
51
def schedule (self ):
58
52
"""Get currently scheduled entries."""
59
53
return self .entries
60
54
61
- # Celery internal override
55
+ #
56
+ # Celery overrides
57
+ #
62
58
def setup_schedule (self ):
63
59
"""Setup schedule."""
64
60
self .sync ()
65
61
66
- # Celery internal override
67
62
def reserve (self , entry ):
68
63
"""Update entry to next run execution time."""
69
64
new_entry = self .schedule [entry .job .id ] = next (entry )
70
65
return new_entry
71
66
72
- # Celery internal override
73
67
def apply_entry (self , entry , producer = None ):
74
68
"""Create and apply a JobEntry."""
75
69
with self .app .flask_app .app_context ():
@@ -93,24 +87,27 @@ def apply_entry(self, entry, producer=None):
93
87
else :
94
88
logger .debug ("%s sent." , entry .task )
95
89
96
- # Celery internal override
97
90
def sync (self ):
98
91
"""Sync Jobs from db to the scheduler."""
99
92
# TODO Should we also have a cleaup task for runs? "stale" run (status running, starttime > hour, Run pending for > 1 hr)
100
93
with self .app .flask_app .app_context ():
101
94
jobs = Job .query .filter (
102
- and_ (Job .active == True , Job .schedule != None )
103
- ).all ()
95
+ Job .active .is_ (True ),
96
+ Job .schedule .isnot (None ),
97
+ )
104
98
self .entries = {} # because some jobs might be deactivated
105
99
for job in jobs :
106
100
self .entries [job .id ] = JobEntry .from_job (job )
107
101
102
+ #
103
+ # Helpers
104
+ #
108
105
def create_run (self , entry ):
109
106
"""Create run from a JobEntry."""
110
- job = Job .query .filter_by ( id = entry .job .id ). one ( )
107
+ job = Job .query .get ( entry .job .id )
111
108
run = Run (
112
109
job = job ,
113
- args = job .default_args ,
110
+ args = job .render_args () ,
114
111
queue = job .default_queue ,
115
112
task_id = uuid .uuid4 (),
116
113
)
0 commit comments