@@ -134,84 +134,100 @@ def run(batch_job):
134134 proposal = batch_job .get ('proposal' )
135135 if not proposal :
136136 raise APIStorageException ('The batch job is not formatted correctly.' )
137- proposed_inputs = proposal .get ('inputs' , [])
138- proposed_destinations = proposal .get ('destinations' , [])
139-
140- gear_id = batch_job ['gear_id' ]
141- gear = gears .get_gear (gear_id )
142- gear_name = gear ['gear' ]['name' ]
143-
144- config_ = batch_job .get ('config' )
145- origin = batch_job .get ('origin' )
146- tags = proposal .get ('tags' , [])
147- tags .append ('batch' )
148-
149- if gear .get ('category' ) == 'analysis' :
150- analysis_base = proposal .get ('analysis' , {})
151- if not analysis_base .get ('label' ):
152- time_now = datetime .datetime .utcnow ()
153- analysis_base ['label' ] = {'label' : '{} {}' .format (gear_name , time_now )}
154- an_storage = AnalysisStorage ()
155- acq_storage = AcquisitionStorage ()
156-
157- jobs = []
158- job_ids = []
159-
160- job_defaults = {
161- 'config' : config_ ,
162- 'gear_id' : gear_id ,
163- 'tags' : tags ,
164- 'batch' : str (batch_job .get ('_id' )),
165- 'inputs' : {}
166- }
137+ preconstructed_jobs = proposal .get ('preconstructed_jobs' )
138+
139+ # If Running a batch from already-constructed jobs
140+ if preconstructed_jobs :
141+ origin = batch_job .get ('origin' )
142+ jobs = []
143+ job_ids = []
144+
145+ for preconstructed_job in preconstructed_jobs :
146+ job = Queue .enqueue_job (preconstructed_job , origin )
147+ job_id = job .id_
148+ jobs .append (job )
149+ job_ids .append (job_id )
167150
168- for inputs in proposed_inputs :
151+ # Otherwise create jobs from the containers and gear id provided in the proposal
152+ else :
153+ proposed_inputs = proposal .get ('inputs' , [])
154+ proposed_destinations = proposal .get ('destinations' , [])
155+
156+ gear_id = batch_job ['gear_id' ]
157+ gear = gears .get_gear (gear_id )
158+ gear_name = gear ['gear' ]['name' ]
169159
170- job_map = copy .deepcopy (job_defaults )
171- job_map ['inputs' ] = inputs
160+ config_ = batch_job .get ('config' )
161+ origin = batch_job .get ('origin' )
162+ tags = proposal .get ('tags' , [])
163+ tags .append ('batch' )
172164
173165 if gear .get ('category' ) == 'analysis' :
166+ analysis_base = proposal .get ('analysis' , {})
167+ if not analysis_base .get ('label' ):
168+ time_now = datetime .datetime .utcnow ()
169+ analysis_base ['label' ] = {'label' : '{} {}' .format (gear_name , time_now )}
170+ an_storage = AnalysisStorage ()
171+ acq_storage = AcquisitionStorage ()
174172
175- analysis = copy .deepcopy (analysis_base )
173+ jobs = []
174+ job_ids = []
176175
177- # Create analysis
178- acquisition_id = inputs .values ()[0 ].get ('id' )
179- session_id = acq_storage .get_container (acquisition_id , projection = {'session' :1 }).get ('session' )
180- result = an_storage .create_job_and_analysis ('sessions' , session_id , analysis , job_map , origin , None )
181- job = result .get ('job' )
182- job_id = result .get ('job_id' )
176+ job_defaults = {
177+ 'config' : config_ ,
178+ 'gear_id' : gear_id ,
179+ 'tags' : tags ,
180+ 'batch' : str (batch_job .get ('_id' )),
181+ 'inputs' : {}
182+ }
183183
184- else :
184+ for inputs in proposed_inputs :
185185
186- job = Queue . enqueue_job ( job_map , origin )
187- job_id = job . id_
186+ job_map = copy . deepcopy ( job_defaults )
187+ job_map [ 'inputs' ] = inputs
188188
189+ if gear .get ('category' ) == 'analysis' :
189190
190- jobs .append (job )
191- job_ids .append (job_id )
191+ analysis = copy .deepcopy (analysis_base )
192192
193- for dest in proposed_destinations :
193+ # Create analysis
194+ acquisition_id = inputs .values ()[0 ].get ('id' )
195+ session_id = acq_storage .get_container (acquisition_id , projection = {'session' :1 }).get ('session' )
196+ result = an_storage .create_job_and_analysis ('sessions' , session_id , analysis , job_map , origin , None )
197+ job = result .get ('job' )
198+ job_id = result .get ('job_id' )
194199
195- job_map = copy .deepcopy (job_defaults )
196- job_map ['destination' ] = dest
200+ else :
197201
198- if gear .get ('category' ) == 'analysis' :
202+ job = Queue .enqueue_job (job_map , origin )
203+ job_id = job .id_
199204
200- analysis = copy .deepcopy (analysis_base )
201205
202- # Create analysis
203- result = an_storage .create_job_and_analysis ('sessions' , bson .ObjectId (dest ['id' ]), analysis , job_map , origin , None )
204- job = result .get ('job' )
205- job_id = result .get ('job_id' )
206+ jobs .append (job )
207+ job_ids .append (job_id )
206208
207- else :
209+ for dest in proposed_destinations :
208210
209- job = Queue .enqueue_job (job_map , origin )
210- job_id = job .id_
211+ job_map = copy .deepcopy (job_defaults )
212+ job_map ['destination' ] = dest
213+
214+ if gear .get ('category' ) == 'analysis' :
215+
216+ analysis = copy .deepcopy (analysis_base )
211217
218+ # Create analysis
219+ result = an_storage .create_job_and_analysis ('sessions' , bson .ObjectId (dest ['id' ]), analysis , job_map , origin , None )
220+ job = result .get ('job' )
221+ job_id = result .get ('job_id' )
212222
213- jobs .append (job )
214- job_ids .append (job_id )
223+ else :
224+
225+ job = Queue .enqueue_job (job_map , origin )
226+ job_id = job .id_
227+
228+
229+ jobs .append (job )
230+ job_ids .append (job_id )
215231
216232 update (batch_job ['_id' ], {'state' : 'running' , 'jobs' : job_ids })
217233 return jobs
0 commit comments