@@ -186,6 +186,192 @@ def takeover(index = 1):
186
186
verify_rpc(slurm_takeover(index))
187
187
188
188
189
+ def add_debug_flags (flags ):
190
+ """ Add DebugFlags to slurmctld
191
+
192
+ Args:
193
+ flags (list):
194
+ For an available list of possible values, please check the
195
+ `slurm.conf` documentation under `DebugFlags`.
196
+
197
+ Raises:
198
+ (pyslurm.RPCError): When setting the debug flags was not successful.
199
+
200
+ Examples:
201
+ >>> from pyslurm import slurmctld
202
+ >>> slurmctld.add_debug_flags(["CpuFrequency"])
203
+ """
204
+ if not flags:
205
+ return
206
+
207
+ data = _debug_flags_str_to_int(flags)
208
+ if not data:
209
+ raise RPCError(msg = " Invalid Debug Flags specified." )
210
+
211
+ verify_rpc(slurm_set_debugflags(data, 0 ))
212
+
213
+
214
+ def remove_debug_flags (flags ):
215
+ """ Remove DebugFlags from slurmctld.
216
+
217
+ Args:
218
+ flags (list):
219
+ For an available list of possible values, please check the
220
+ `slurm.conf` documentation under `DebugFlags`.
221
+
222
+ Raises:
223
+ (pyslurm.RPCError): When removing the debug flags was not successful.
224
+
225
+ Examples:
226
+ >>> from pyslurm import slurmctld
227
+ >>> slurmctld.remove_debug_flags(["CpuFrequency"])
228
+ """
229
+ if not flags:
230
+ return
231
+
232
+ data = _debug_flags_str_to_int(flags)
233
+ if not data:
234
+ raise RPCError(msg = " Invalid Debug Flags specified." )
235
+
236
+ verify_rpc(slurm_set_debugflags(0 , data))
237
+
238
+
239
+ def clear_debug_flags ():
240
+ """ Remove all currently set debug flags from slurmctld.
241
+
242
+ Raises:
243
+ (pyslurm.RPCError): When removing the debug flags was not successful.
244
+
245
+ Examples:
246
+ >>> from pyslurm import slurmctld
247
+ >>> slurmctld.clear_debug_flags()
248
+ """
249
+ current_flags = get_debug_flags()
250
+ if not current_flags:
251
+ return
252
+
253
+ data = _debug_flags_str_to_int(current_flags)
254
+ verify_rpc(slurm_set_debugflags(0 , data))
255
+
256
+
257
+ def get_debug_flags ():
258
+ """ Get the current list of debug flags for the slurmctld.
259
+
260
+ Raises:
261
+ (pyslurm.RPCError): When getting the debug flags was not successful.
262
+
263
+ Examples:
264
+ >>> from pyslurm import slurmctld
265
+ >>> flags = slurmctld.get_debug_flags()
266
+ >>> print(flags)
267
+ ['CpuFrequency', 'Backfill']
268
+ """
269
+ return Config.load().debug_flags
270
+
271
+
272
+ def set_log_level (level ):
273
+ """ Set the logging level for slurmctld.
274
+
275
+ Args:
276
+ level (str):
277
+ For an available list of possible values, please check the
278
+ `slurm.conf` documentation under `SlurmctldDebug`.
279
+
280
+ Raises:
281
+ (pyslurm.RPCError): When setting the log level was not successful.
282
+
283
+ Examples:
284
+ >>> from pyslurm import slurmctld
285
+ >>> slurmctld.set_log_level("quiet")
286
+ """
287
+ data = _log_level_str_to_int(level)
288
+ verify_rpc(slurm_set_debug_level(data))
289
+
290
+
291
+ def get_log_level ():
292
+ """ Get the current log level for the slurmctld.
293
+
294
+ Raises:
295
+ (pyslurm.RPCError): When getting the log level was not successful.
296
+
297
+ Examples:
298
+ >>> from pyslurm import slurmctld
299
+ >>> level = slurmctld.get_log_level()
300
+ >>> print(level)
301
+ quiet
302
+ """
303
+ return Config.load().slurmctld_log_level
304
+
305
+
306
+ def enable_scheduler_logging ():
307
+ """ Enable scheduler logging for slurmctld.
308
+
309
+ Raises:
310
+ (pyslurm.RPCError): When enabling scheduler logging was not successful.
311
+
312
+ Examples:
313
+ >>> from pyslurm import slurmctld
314
+ >>> slurmctld.enable_scheduler_logging()
315
+ """
316
+ verify_rpc(slurm_set_schedlog_level(1 ))
317
+
318
+
319
+ def is_scheduler_logging_enabled ():
320
+ """ Check whether scheduler logging is enabled for slurmctld.
321
+
322
+ Returns:
323
+ (bool): Whether scheduler logging is enabled or not.
324
+
325
+ Raises:
326
+ (pyslurm.RPCError): When getting the scheduler logging was not
327
+ successful.
328
+
329
+ Examples:
330
+ >>> from pyslurm import slurmctld
331
+ >>> print(slurmctld.is_scheduler_logging_enabled())
332
+ False
333
+ """
334
+ return Config.load().scheduler_logging
335
+
336
+
337
+ def set_fair_share_dampening_factor (factor ):
338
+ """ Set the FairShare Dampening factor.
339
+
340
+ Args:
341
+ factor (int):
342
+ The factor to set. A minimum value of `1`, and a maximum value of
343
+ `65535` are allowed.
344
+
345
+ Raises:
346
+ (pyslurm.RPCError): When setting the factor was not successful.
347
+
348
+ Examples:
349
+ >>> from pyslurm import slurmctld
350
+ >>> slurmctld.set_fair_share_dampening_factor(100)
351
+ """
352
+ max_value = (2 ** 16 ) - 1
353
+ if not factor or factor >= max_value:
354
+ raise RPCError(msg = f" Invalid Dampening factor: {factor}. "
355
+ f" Factor must be between 0 and {max_value}." )
356
+
357
+ verify_rpc(slurm_set_fs_dampeningfactor(factor))
358
+
359
+
360
+ def get_fair_share_dampening_factor ():
361
+ """ Get the currently set FairShare Dampening factor.
362
+
363
+ Raises:
364
+ (pyslurm.RPCError): When getting the factor was not successful.
365
+
366
+ Examples:
367
+ >>> from pyslurm import slurmctld
368
+ >>> factor = slurmctld.get_fair_share_dampening_factor()
369
+ >>> print(factor)
370
+ 100
371
+ """
372
+ return Config.load().fair_share_dampening_factor
373
+
374
+
189
375
cdef class MPIConfig:
190
376
191
377
def __init__ (self ):
@@ -1022,8 +1208,8 @@ cdef class Config:
1022
1208
return cstr.to_unicode(self .ptr.sched_logfile)
1023
1209
1024
1210
@property
1025
- def scheduler_log_level (self ):
1026
- return u16_parse (self .ptr.sched_log_level, zero_is_noval = False )
1211
+ def scheduler_logging (self ):
1212
+ return u16_parse_bool (self .ptr.sched_log_level)
1027
1213
1028
1214
@property
1029
1215
def scheduler_parameters (self ):
@@ -1344,7 +1530,13 @@ def _debug_flags_int_to_list(flags):
1344
1530
1345
1531
1346
1532
def _debug_flags_str_to_int (flags ):
1347
- pass
1533
+ cdef:
1534
+ uint64_t flags_num = 0
1535
+ char * flags_str = NULL
1536
+
1537
+ flags_str = cstr.from_unicode(cstr.list_to_str(flags))
1538
+ slurm.debug_str2flags(flags_str, & flags_num)
1539
+ return flags_num
1348
1540
1349
1541
1350
1542
# https://github.com/SchedMD/slurm/blob/01a3aac7c59c9b32a9dd4e395aa5a97a8aea4f08/slurm/slurm.h#L621
@@ -1432,6 +1624,14 @@ def _log_level_int_to_str(flags):
1432
1624
return data
1433
1625
1434
1626
1627
+ def _log_level_str_to_int (level ):
1628
+ cdef uint16_t data = slurm.log_string2num(str (level))
1629
+ if u16_parse(data, zero_is_noval = False ) is None :
1630
+ raise RPCError(msg = f" Invalid Log level: {level}." )
1631
+
1632
+ return data
1633
+
1634
+
1435
1635
def _acct_store_flags_int_to_str (flags ):
1436
1636
cdef list out = []
1437
1637
0 commit comments