12
12
13
13
from jobflow import JobStore , initialize_logger
14
14
from jobflow .core .flow import get_flow
15
+ from monty .design_patterns import singleton
15
16
from monty .os import cd
16
17
from monty .serialization import dumpfn , loadfn
17
18
from monty .shutil import decompress_file
18
19
19
20
from jobflow_remote .jobs .batch import LocalBatchManager
20
- from jobflow_remote .jobs .data import IN_FILENAME , OUT_FILENAME
21
+ from jobflow_remote .jobs .data import IN_FILENAME , OUT_FILENAME , JobDoc
21
22
from jobflow_remote .remote .data import get_job_path , get_store_file_paths
22
23
from jobflow_remote .utils .log import initialize_remote_run_log
23
24
29
30
logger = logging .getLogger (__name__ )
30
31
31
32
33
+ @singleton
34
+ class JfrState :
35
+ """State of the current job being executed."""
36
+
37
+ job_doc : JobDoc = None
38
+
39
+ def reset (self ):
40
+ """Reset the current state."""
41
+ self .job_doc = None
42
+
43
+
44
+ CURRENT_JOBDOC : JfrState = JfrState ()
45
+
46
+
32
47
def run_remote_job (run_dir : str | Path = "." ) -> None :
33
48
"""Run the job."""
34
49
initialize_remote_run_log ()
@@ -42,6 +57,10 @@ def run_remote_job(run_dir: str | Path = ".") -> None:
42
57
43
58
job : Job = in_data ["job" ]
44
59
store = in_data ["store" ]
60
+ job_doc_dict = in_data .get ("job_doc" , None )
61
+ if job_doc_dict :
62
+ job_doc_dict ["job" ] = job
63
+ JfrState ().job_doc = JobDoc .model_validate (job_doc_dict )
45
64
46
65
store .connect ()
47
66
@@ -91,6 +110,8 @@ def run_remote_job(run_dir: str | Path = ".") -> None:
91
110
"end_time" : datetime .datetime .utcnow (),
92
111
}
93
112
dumpfn (output , OUT_FILENAME )
113
+ finally :
114
+ JfrState ().reset ()
94
115
95
116
96
117
def run_batch_jobs (
0 commit comments