@@ -116,68 +116,60 @@ def nodelist_runner(nodes, updatehash=False, stop_first=False):
116
116
yield i , result , err
117
117
118
118
119
- def write_report (node , report_type = None , is_mapnode = False ):
120
- """Write a report file for a node"""
119
+ def write_node_report (node , result = None , is_mapnode = False ):
120
+ """Write a report file for a node. """
121
121
if not str2bool (node .config ['execution' ]['create_report' ]):
122
122
return
123
123
124
- if report_type not in ['preexec' , 'postexec' ]:
125
- logger .warning ('[Node] Unknown report type "%s".' , report_type )
126
- return
127
-
128
124
cwd = node .output_dir ()
129
- report_dir = os .path .join (cwd , '_report' )
130
- report_file = os .path .join (report_dir , 'report.rst' )
131
- makedirs (report_dir , exist_ok = True )
132
-
133
- logger .debug ('[Node] Writing %s-exec report to "%s"' , report_type [:- 4 ],
134
- report_file )
135
- if report_type .startswith ('pre' ):
136
- lines = [
137
- write_rst_header ('Node: %s' % get_print_name (node ), level = 0 ),
138
- write_rst_list (
139
- ['Hierarchy : %s' % node .fullname ,
140
- 'Exec ID : %s' % node ._id ]),
141
- write_rst_header ('Original Inputs' , level = 1 ),
142
- write_rst_dict (node .inputs .trait_get ()),
143
- ]
144
- with open (report_file , 'wt' ) as fp :
145
- fp .write ('\n ' .join (lines ))
146
- return
125
+ report_file = Path (cwd ) / '_report' / 'report.rst'
126
+ report_file .parent .mkdir (exist_ok = True , parents = True )
147
127
148
128
lines = [
129
+ write_rst_header ('Node: %s' % get_print_name (node ), level = 0 ),
130
+ write_rst_list (
131
+ ['Hierarchy : %s' % node .fullname ,
132
+ 'Exec ID : %s' % node ._id ]),
133
+ write_rst_header ('Original Inputs' , level = 1 ),
134
+ write_rst_dict (node .inputs .trait_get ()),
135
+ ]
136
+
137
+ if result is None :
138
+ logger .debug ('[Node] Writing pre-exec report to "%s"' , report_file )
139
+ report_file .write_text ('\n ' .join (lines ))
140
+ return
141
+
142
+ logger .debug ('[Node] Writing post-exec report to "%s"' , report_file )
143
+ lines += [
149
144
write_rst_header ('Execution Inputs' , level = 1 ),
150
145
write_rst_dict (node .inputs .trait_get ()),
146
+ write_rst_header ('Execution Outputs' , level = 1 )
151
147
]
152
148
153
- result = node .result # Locally cache result
154
149
outputs = result .outputs
155
-
156
150
if outputs is None :
157
- with open ( report_file , 'at' ) as fp :
158
- fp . write ('\n ' .join (lines ))
151
+ lines += [ 'None' ]
152
+ report_file . write_text ('\n ' .join (lines ))
159
153
return
160
154
161
- lines .append (write_rst_header ('Execution Outputs' , level = 1 ))
162
-
163
155
if isinstance (outputs , Bunch ):
164
156
lines .append (write_rst_dict (outputs .dictcopy ()))
165
157
elif outputs :
166
158
lines .append (write_rst_dict (outputs .trait_get ()))
159
+ else :
160
+ lines += ['Outputs object was empty.' ]
167
161
168
162
if is_mapnode :
169
163
lines .append (write_rst_header ('Subnode reports' , level = 1 ))
170
164
nitems = len (ensure_list (getattr (node .inputs , node .iterfield [0 ])))
171
165
subnode_report_files = []
172
166
for i in range (nitems ):
173
- nodecwd = os . path . join (cwd , 'mapflow' , '_%s%d' % ( node . name , i ),
174
- '_report' , 'report.rst' )
175
- subnode_report_files .append ('subnode %d : %s' % (i , nodecwd ))
167
+ subnode_file = Path (cwd ) / 'mapflow' / (
168
+ '_%s%d' % ( node . name , i )) / '_report' / 'report.rst'
169
+ subnode_report_files .append ('subnode %d : %s' % (i , subnode_file ))
176
170
177
171
lines .append (write_rst_list (subnode_report_files ))
178
-
179
- with open (report_file , 'at' ) as fp :
180
- fp .write ('\n ' .join (lines ))
172
+ report_file .write_text ('\n ' .join (lines ))
181
173
return
182
174
183
175
lines .append (write_rst_header ('Runtime info' , level = 1 ))
@@ -189,15 +181,9 @@ def write_report(node, report_type=None, is_mapnode=False):
189
181
'prev_wd' : getattr (result .runtime , 'prevcwd' , '<not-set>' ),
190
182
}
191
183
192
- if hasattr (result .runtime , 'cmdline' ):
193
- rst_dict ['command' ] = result .runtime .cmdline
194
-
195
- # Try and insert memory/threads usage if available
196
- if hasattr (result .runtime , 'mem_peak_gb' ):
197
- rst_dict ['mem_peak_gb' ] = result .runtime .mem_peak_gb
198
-
199
- if hasattr (result .runtime , 'cpu_percent' ):
200
- rst_dict ['cpu_percent' ] = result .runtime .cpu_percent
184
+ for prop in ('cmdline' , 'mem_peak_gb' , 'cpu_percent' ):
185
+ if hasattr (result .runtime , prop ):
186
+ rst_dict [prop ] = getattr (result .runtime , prop )
201
187
202
188
lines .append (write_rst_dict (rst_dict ))
203
189
@@ -225,9 +211,17 @@ def write_report(node, report_type=None, is_mapnode=False):
225
211
write_rst_dict (result .runtime .environ ),
226
212
]
227
213
228
- with open (report_file , 'at' ) as fp :
229
- fp .write ('\n ' .join (lines ))
230
- return
214
+ report_file .write_text ('\n ' .join (lines ))
215
+
216
+
217
+ def write_report (node , report_type = None , is_mapnode = False ):
218
+ """Write a report file for a node - DEPRECATED"""
219
+ if report_type not in ('preexec' , 'postexec' ):
220
+ logger .warning ('[Node] Unknown report type "%s".' , report_type )
221
+ return
222
+
223
+ write_node_report (node , is_mapnode = is_mapnode ,
224
+ result = node .result if report_type == 'postexec' else None )
231
225
232
226
233
227
def save_resultfile (result , cwd , name , rebase = None ):
0 commit comments