Skip to content

Commit c4bba02

Browse files
authored
Merge pull request #962 from scitran/rules-enqueue
Use central job enqueue logic for jobs spawned by rules
2 parents 307ec32 + c6aef26 commit c4bba02

File tree

5 files changed

+83
-5
lines changed

5 files changed

+83
-5
lines changed

api/jobs/gears.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,21 @@ def validate_gear_config(gear, config_):
124124
})
125125
return True
126126

127+
def fill_gear_default_values(gear, config_):
128+
"""
129+
Given a gear and a config map, fill any missing keys using defaults from the gear's config
130+
"""
131+
132+
if config_ is None:
133+
config_ = {}
134+
135+
for k,v in gear['gear'].get('config', {}).iteritems():
136+
if 'default' in v:
137+
config_.setdefault(k, v['default'])
138+
139+
return config_
140+
141+
127142
def insert_gear(doc):
128143
gear_tools.validate_manifest(doc['gear'])
129144

api/jobs/handlers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -335,7 +335,7 @@ def get_config(self, _id):
335335
# Detect if config is old- or new-style.
336336
# TODO: remove this logic with a DB upgrade, ref database.py's reserved upgrade section.
337337

338-
if c.get('config') is not None and c.get('inputs') is not None:
338+
if 'config' in c and c.get('inputs') is not None:
339339
# New behavior
340340

341341
# API keys are only returned in-flight, when the job is running, and not persisted to the job object.

api/jobs/queue.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99

1010
from .. import config
1111
from .jobs import Job
12-
from .gears import get_gear, validate_gear_config
12+
from .gears import get_gear, validate_gear_config, fill_gear_default_values
1313
from ..validators import InputValidationException
1414
from ..dao.containerutil import create_filereference_from_dictionary, create_containerreference_from_dictionary, create_containerreference_from_filereference
1515

@@ -156,7 +156,7 @@ def enqueue_job(job_map, origin, perm_check_uid=None):
156156
if gear.get('gear', {}).get('custom', {}).get('flywheel', {}).get('invalid', False):
157157
raise InputValidationException('Gear marked as invalid, will not run!')
158158

159-
config_ = job_map.get('config', {})
159+
config_ = fill_gear_default_values(gear, job_map.get('config', {}))
160160
validate_gear_config(gear, config_)
161161

162162
# Translate maps to FileReferences

api/jobs/rules.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
import fnmatch
22

33
from .. import config
4+
from ..types import Origin
45
from ..dao.containerutil import FileReference
56

67
from . import gears
78
from .jobs import Job
9+
from .queue import Queue
810

911
log = config.log
1012

@@ -235,11 +237,16 @@ def create_jobs(db, container_before, container_after, container_type):
235237

236238

237239
spawned_jobs = []
240+
origin ={
241+
'type': str(Origin.system),
242+
'id': None
243+
}
238244

239245
for pj in potential_jobs:
240-
pj['job'].insert()
241-
spawned_jobs.append(pj['rule']['alg'])
246+
job_map = pj['job'].map()
247+
Queue.enqueue_job(job_map, origin)
242248

249+
spawned_jobs.append(pj['rule']['alg'])
243250

244251
return spawned_jobs
245252

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
2+
import copy
3+
from api.jobs import gears
4+
5+
# DISCUSS: this basically asserts that the log helper doesn't throw, which is of non-zero but questionable value.
6+
# Could instead be marked for pytest et. al to ignore coverage? Desirability? Compatibility?
7+
def test_fill_defaults():
8+
9+
gear_config = {
10+
'key_one': {'default': 1},
11+
'key_two': {'default': 2},
12+
'key_three': {'default': 3},
13+
'key_no_de': {}
14+
}
15+
16+
gear = {
17+
'gear': {
18+
'config': gear_config
19+
}
20+
}
21+
22+
# test sending in complete config does not change
23+
config = {
24+
'key_one': 4,
25+
'key_two': 5,
26+
'key_three': 6
27+
}
28+
29+
result = gears.fill_gear_default_values(gear, config)
30+
assert result['key_one'] == 4
31+
assert result['key_two'] == 5
32+
assert result['key_three'] == 6
33+
34+
# test sending in empty config
35+
result = gears.fill_gear_default_values(gear, {})
36+
assert result['key_one'] == 1
37+
assert result['key_two'] == 2
38+
assert result['key_three'] == 3
39+
40+
# test sending in None config
41+
result = gears.fill_gear_default_values(gear, None)
42+
assert result['key_one'] == 1
43+
assert result['key_two'] == 2
44+
assert result['key_three'] == 3
45+
46+
# test sending in semi-complete config
47+
config = {
48+
'key_one': None,
49+
'key_two': []
50+
#'key_three': 6 # missing
51+
}
52+
53+
result = gears.fill_gear_default_values(gear, config)
54+
assert result['key_one'] == None
55+
assert result['key_two'] == []
56+
assert result['key_three'] == 3

0 commit comments

Comments
 (0)