66from .panel import Panel
77from ..dialogs import TestJobsDialog
88from ..log import log
9- from ..state import Attr
9+ from ..state import Attr , State
1010from ..widgets import MSelect , ShortcutButton
1111
1212from textual import on
@@ -220,6 +220,10 @@ class BatchSchedulerPanel(Panel):
220220 ('alt+t' , 'toggle_test_job' )
221221 ]
222222
223+ def __init__ (self , state : State ) -> None :
224+ super ().__init__ (state )
225+ self ._auto_scheduler : Optional [str ] = None
226+
223227 def _build_widgets (self ) -> Widget :
224228 return Vertical (
225229 Label ('Select and configure a batch system.' , classes = 'header' ),
@@ -258,7 +262,7 @@ def _build_widgets(self) -> Widget:
258262 Input (id = 'mqueue-input' ),
259263 classes = 'bs-col-2 form-row batch-valid'
260264 ),
261- Checkbox ('Run [b bright_yellow]t[/b bright_yellow]est job' ,
265+ Checkbox ('Run [b bright_yellow]t[/b bright_yellow]est job' , value = False ,
262266 id = 'cb-run-test-job' , classes = 'bs-col-3 m-t-1 batch-valid' ),
263267 classes = 'w-100 form-row' , id = 'batch-system-group-2'
264268 ),
@@ -278,7 +282,11 @@ def _build_widgets(self) -> Widget:
278282 )
279283
280284 async def validate (self ) -> bool :
281- if self .state .run_test_job and self .state .scheduler is not None :
285+ run_test_job = self .get_widget_by_id ('cb-run-test-job' )
286+ assert isinstance (run_test_job , Checkbox )
287+ scheduler = self ._get_scheduler ()
288+
289+ if run_test_job .value and scheduler != 'none' and scheduler != 'local' :
282290 return await self .run_test_jobs ()
283291 else :
284292 return True
@@ -291,14 +299,19 @@ def label(self) -> str:
291299 def name (self ) -> str :
292300 return 'scheduler'
293301
294- async def activate (self ) -> None :
295- self .update_attrs ()
302+ def _get_scheduler (self ) -> str :
296303 selector = self .get_widget_by_id ('batch-selector' )
297304 assert isinstance (selector , Select )
298- sched = selector .selection
299- if sched is None or sched == 'none' :
300- selector .focus (False )
301- elif sched == 'local' :
305+ value = selector .selection
306+ assert isinstance (value , str )
307+ return value
308+
309+ async def activate (self ) -> None :
310+ self .update_attrs ()
311+ scheduler = self ._get_scheduler ()
312+ if scheduler is None or scheduler == 'none' :
313+ self .get_widget_by_id ('batch-selector' ).focus (False )
314+ elif scheduler == 'local' :
302315 self .app ._focus_next () # type: ignore
303316 else :
304317 self .get_widget_by_id ('account-input' ).focus (False )
@@ -316,40 +329,48 @@ def update_attrs(self) -> None:
316329
317330 @on (Select .Changed , '#batch-selector' )
318331 def batch_system_selected (self ) -> None :
319- selector = cast (Select [str ], self .get_widget_by_id ('batch-selector' ))
320- sched = selector .selection
321- disabled = (sched is None or sched == 'none' or sched == 'local' )
322- if disabled :
323- self .state .scheduler = None
324- else :
325- self .state .scheduler = sched
332+ scheduler = self ._get_scheduler ()
333+
334+ self .state .set_batch_executor (scheduler )
335+
336+ disabled = (scheduler is None or scheduler == 'none' or scheduler == 'local' )
326337 for widget in self .query ('.batch-valid' ):
327338 widget .disabled = disabled
328- if sched == 'local' :
339+ run_test_job = self .get_widget_by_id ('cb-run-test-job' )
340+ assert isinstance (run_test_job , Checkbox )
341+ run_test_job .value = not disabled
342+ if scheduler == 'local' :
329343 self .app ._focus_next () # type: ignore
330344 else :
331345 self .get_widget_by_id ('account-input' ).focus (False )
332346
333347 def set_scheduler (self , name : str ) -> None :
348+ if name == '' :
349+ name = 'none'
334350 selector = self .get_widget_by_id ('batch-selector' )
335351 assert isinstance (selector , Select )
336352 selector .value = name
353+ self ._auto_scheduler = name
337354
338355 @on (Input .Submitted , '#account-input' )
339- def account_submitted (self ) -> None :
356+ def account_submitted (self , event : Input .Submitted ) -> None :
357+ self .state .update_conf ('account' , event .value )
340358 next = self .get_widget_by_id ('queue-input' )
341359 next .focus (False )
342360
343361 @on (Input .Submitted , '#queue-input' )
344362 def queue_submitted (self , event : Input .Submitted ) -> None :
363+ self .state .update_conf ('queue_name' , event .value )
345364 next = self .get_widget_by_id ('mqueue-input' )
346365 assert isinstance (next , Input )
347366 if next .value == '' :
348367 next .value = event .input .value
368+ self .state .update_conf ('multi_node_queue_name' , event .value )
349369 next .focus (False )
350370
351371 @on (Input .Submitted , '#mqueue-input' )
352- def mqueue_submitted (self ) -> None :
372+ def mqueue_submitted (self , event : Input .Submitted ) -> None :
373+ self .state .update_conf ('multi_node_queue_name' , event .value )
353374 self .app ._focus_next () # type: ignore
354375
355376 @on (Button .Pressed , '#btn-edit-attrs' )
@@ -405,12 +426,13 @@ async def _run_test_job(self, jd: TestJobsDialog, job_no: int, label: str,
405426 return False
406427
407428 def _launch_job (self , test_name : str , rspec : Optional [ResourceSpecV1 ]) -> Job :
408- s = self .state . scheduler
409- assert s is not None
429+ scheduler = self ._get_scheduler ()
430+ assert scheduler is not None
410431
411- ex = JobExecutor .get_instance (s )
432+ ex = JobExecutor .get_instance (scheduler )
412433
413434 attrs = JobAttributes ()
435+
414436 account = self .state .conf .get ('account' , '' )
415437 if rspec is not None and rspec .computed_node_count > 1 :
416438 queue = self .state .conf .get ('multi_node_queue_name' , '' )
@@ -423,7 +445,7 @@ def _launch_job(self, test_name: str, rspec: Optional[ResourceSpecV1]) -> Job:
423445 for attr in self .state .attrs :
424446 if re .match (attr .filter , test_name ):
425447 attrs .set_custom_attribute (attr .name , attr .value )
426-
448+ log . write ( f'attrs: { attrs } , rspec: { rspec } \n ' )
427449 job = Job (JobSpec ('/bin/date' , attributes = attrs , resources = rspec ))
428450 ex .submit (job )
429451 log .write ('Job submitted\n ' )
0 commit comments