| package Slurm; |
| |
| use 5.008; |
| use strict qw(refs vars); |
| use warnings; |
| use Carp; |
| |
| require Exporter; |
| use AutoLoader; |
| |
| our @ISA = qw(Exporter); |
| |
| our %constants; |
| # make this in BEGIN block to use subs |
| BEGIN { |
| |
| $constants{macros} = [qw / |
| INFINITE |
| NO_VAL |
| SLURM_BATCH_SCRIPT |
| SHOW_ALL |
| JOB_COMPLETING |
| |
| NODE_STATE_BASE |
| NODE_STATE_FLAGS |
| NODE_RESUME |
| NODE_STATE_DRAIN |
| NODE_STATE_COMPLETING |
| NODE_STATE_NO_RESPOND |
| |
| MAIL_JOB_BEGIN |
| MAIL_JOB_END |
| MAIL_JOB_FAIL |
| |
| SLURM_SUCCESS |
| SLURM_ERROR |
| /]; |
| |
| $constants{job_states} = [qw / |
| JOB_PENDING |
| JOB_RUNNING |
| JOB_SUSPENDED |
| JOB_COMPLETE |
| JOB_CANCELLED |
| JOB_TIMEOUT |
| JOB_FAILED |
| JOB_NODE_FAIL |
| /]; |
| |
| |
| $constants{job_state_reason} = [qw / |
| WAIT_NO_REASON |
| WAIT_PRIORITY |
| WAIT_DEPENDENCY |
| WAIT_RESOURCES |
| WAIT_PART_NODE_LIMIT |
| WAIT_PART_TIME_LIMIT |
| WAIT_PART_STATE |
| WAIT_HELD |
| WAIT_TIME |
| WAIT_TBD1 |
| WAIT_TBD2 |
| FAIL_DOWN_PARTITION |
| FAIL_DOWN_NODE |
| FAIL_BAD_CONSTRAINTS |
| FAIL_SYSTEM |
| FAIL_LAUNCH |
| FAIL_EXIT_CODE |
| FAIL_TIMEOUT |
| FAIL_INACTIVE_LIMIT |
| /]; |
| |
| $constants{job_acct_type} = [qw / |
| JOB_START |
| JOB_STEP |
| JOB_SUSPEND |
| JOB_TERMINATED |
| /]; |
| |
| $constants{connection_type} = [qw / |
| SELECT_MESH |
| SELECT_TORUS |
| SELECT_NAV |
| SELECT_SMALL |
| /]; |
| |
| # some bluegene specific codes needed here |
| |
| $constants{jobacct_data_type} = [qw / |
| JOBACCT_DATA_TOTAL |
| JOBACCT_DATA_PIPE |
| JOBACCT_DATA_RUSAGE |
| JOBACCT_DATA_MAX_VSIZE |
| JOBACCT_DATA_MAX_VSIZE_ID |
| JOBACCT_DATA_TOT_VSIZE |
| JOBACCT_DATA_MAX_RSS |
| JOBACCT_DATA_MAX_RSS_ID |
| JOBACCT_DATA_TOT_RSS |
| JOBACCT_DATA_MAX_PAGES |
| JOBACCT_DATA_MAX_PAGES_ID |
| JOBACCT_DATA_TOT_PAGES |
| JOBACCT_DATA_MIN_CPU |
| JOBACCT_DATA_MIN_CPU_ID |
| JOBACCT_DATA_TOT_CPU |
| /]; |
| |
| $constants{task_dist_state} = [qw / |
| SLURM_DIST_CYCLIC |
| SLURM_DIST_BLOCK |
| SLURM_DIST_ARBITRARY |
| SLURM_DIST_PLANE |
| SLURM_DIST_CYCLIC_CYCLIC |
| SLURM_DIST_CYCLIC_BLOCK |
| SLURM_DIST_BLOCK_CYCLIC |
| SLURM_DIST_BLOCK_BLOCK |
| SLURM_NO_LLLP_DIST |
| SLURM_DIST_UNKNOWN |
| /]; |
| |
| $constants{cpu_bind_type} = [qw / |
| CPU_BIND_TO_THREADS |
| CPU_BIND_TO_CORES |
| CPU_BIND_TO_SOCKETS |
| CPU_BIND_VERBOSE |
| CPU_BIND_NONE |
| CPU_BIND_RANK |
| CPU_BIND_MAP |
| CPU_BIND_MASK |
| /]; |
| |
| $constants{mem_bind_type} = [qw / |
| MEM_BIND_VERBOSE |
| MEM_BIND_NONE |
| MEM_BIND_RANK |
| MEM_BIND_MAP |
| MEM_BIND_MASK |
| MEM_BIND_LOCAL |
| /]; |
| |
| $constants{node_states} = [qw / |
| NODE_STATE_UNKNOWN |
| NODE_STATE_DOWN |
| NODE_STATE_IDLE |
| NODE_STATE_ALLOCATED |
| /]; |
| |
| $constants{ctx_keys} = [qw / |
| SLURM_STEP_CTX_STEPID |
| SLURM_STEP_CTX_TASKS |
| SLURM_STEP_CTX_TID |
| SLURM_STEP_CTX_RESP |
| SLURM_STEP_CTX_CRED |
| SLURM_STEP_CTX_SWITCH_JOB |
| SLURM_STEP_CTX_NUM_HOSTS |
| SLURM_STEP_CTX_HOST |
| SLURM_STEP_CTX_JOBID |
| SLURM_STEP_CTX_USER_MANAGED_SOCKETS |
| /]; |
| |
| $constants{select_type_plugin_info} = [qw / |
| SELECT_TYPE_INFO_NONE |
| CR_CPU |
| CR_SOCKET |
| CR_CORE |
| CR_MEMORY |
| CR_SOCKET_MEMORY |
| CR_CORE_MEMORY |
| CR_CPU_MEMORY |
| /]; |
| |
| foreach my $const(values(%constants)) { |
| push @{$constants{all}}, @$const; |
| } |
| |
| } # BEGIN |
| |
| use subs @{$constants{all}}; |
| |
| # Items to export into callers namespace by default. Note: do not export |
| # names by default without a very good reason. Use EXPORT_OK instead. |
| # Do not simply export all your public functions/methods/constants. |
| |
| # This allows declaration use Slurm ':all'; |
| # If you do not need this, moving things directly into @EXPORT or @EXPORT_OK |
| # will save memory. |
| our %EXPORT_TAGS = %constants; |
| |
| our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); |
| |
| our @EXPORT = qw(); |
| |
| our $VERSION = '0.01'; |
| |
| sub AUTOLOAD { |
| # This AUTOLOAD is used to 'autoload' constants from the constant() |
| # XS function. |
| |
| my $constname; |
| our $AUTOLOAD; |
| ($constname = $AUTOLOAD) =~ s/.*:://; |
| croak "&Slurm::constant not defined" if $constname eq 'constant'; |
| my ($error, $val) = constant($constname); |
| if ($error) { croak $error; } |
| { |
| no strict 'refs'; |
| # Fixed between 5.005_53 and 5.005_61 |
| #XXX if ($] >= 5.00561) { |
| #XXX *$AUTOLOAD = sub () { $val }; |
| #XXX } |
| #XXX else { |
| *$AUTOLOAD = sub { $val }; |
| #XXX } |
| } |
| goto &$AUTOLOAD; |
| } |
| |
| #require XSLoader; |
| #XSLoader::load('Slurm', $VERSION); |
| |
| # XSLoader will not work for SLURM because it does not honour dl_load_flags. |
| require DynaLoader; |
| push @ISA, 'DynaLoader'; |
| bootstrap Slurm $VERSION; |
| |
| sub dl_load_flags { if($^O eq 'aix') { 0x00 } else { 0x01 }} |
| |
| ############################################################ |
| # Preloaded methods go here. |
| |
| # Autoload methods go after =cut, and are processed by the autosplit program. |
| |
| sub break_node_state { |
| my $st = shift; |
| return ($st & NODE_STATE_BASE, $st & NODE_STATE_DRAIN, $st & NODE_STATE_COMPLETING, $st & NODE_STATE_NO_RESPOND); |
| } |
| |
| sub node_state_string { |
| my $st = shift; |
| my ($base, $drain, $comp, $noresp) = break_node_state($st); |
| |
| if($drain) { |
| my $str = ($comp || $base == NODE_STATE_ALLOCATED) ? "DRAINING" : "DRAINED"; |
| return $noresp ? $str . "*" : $str; |
| } |
| return $noresp ? "DOWN*" : "DOWN" if $base == NODE_STATE_DOWN; |
| return $noresp ? "ALLOCATED*" : ($comp ? "ALLOCATED+" : "ALLOCATED") if $base == NODE_STATE_ALLOCATED; |
| return $noresp ? "COMPLETING*" : "COMPLETING" if $comp; |
| return $noresp ? "IDLE*" : "IDLE" if $base == NODE_STATE_IDLE; |
| return $noresp ? "UNKNOWN*" : "UNKNOWN" if $base == NODE_STATE_UNKNOWN; |
| } |
| |
| sub node_state_string_compact { |
| my $st = shift; |
| my ($base, $drain, $comp, $noresp) = break_node_state($st); |
| |
| if($drain) { |
| my $str = ($comp || $base == NODE_STATE_ALLOCATED) ? "DRNG" : "DRAIN"; |
| return $noresp ? $str . "*" : $str; |
| } |
| return $noresp ? "DOWN*" : "DOWN" if $base == NODE_STATE_DOWN; |
| return $noresp ? "ALLOC*" : ($comp ? "ALLOC+" : "ALLOC") if $base == NODE_STATE_ALLOCATED; |
| return $noresp ? "COMP*" : "COMP" if $comp; |
| return $noresp ? "IDLE*" : "IDLE" if $base == NODE_STATE_IDLE; |
| return $noresp ? "UNK*" : "UNK" if $base == NODE_STATE_UNKNOWN; |
| } |
| |
| sub job_state_string { |
| my $st = shift; |
| return "COMPLETING" if $st & JOB_COMPLETING; |
| return "PENDING" if $st == JOB_PENDING; |
| return "RUNNING" if $st == JOB_RUNNING; |
| return "SUSPENDED" if $st == JOB_SUSPENDED; |
| return "COMPLETED" if $st == JOB_COMPLETE; |
| return "CANCELLED" if $st == JOB_CANCELLED; |
| return "FAILED" if $st == JOB_FAILED; |
| return "TIMEOUT" if $st == JOB_TIMEOUT; |
| return "NODE_FAIL" if$st == JOB_NODE_FAIL; |
| return "?"; |
| } |
| |
| sub job_state_string_compact { |
| my $st = shift; |
| return "CG" if $st & JOB_COMPLETING; |
| return "PD" if $st == JOB_PENDING; |
| return "R" if $st == JOB_RUNNING; |
| return "S" if $st == JOB_SUSPENDED; |
| return "CD" if $st == JOB_COMPLETE; |
| return "CA" if $st == JOB_CANCELLED; |
| return "F" if $st == JOB_FAILED; |
| return "TO" if $st == JOB_TIMEOUT; |
| return "NF" if$st == JOB_NODE_FAIL; |
| return "?"; |
| } |
| |
| sub job_reason_string { |
| my $r = shift; |
| return "None" if $r == WAIT_NO_REASON; |
| return "Priority" if $r == WAIT_PRIORITY; |
| return "Dependency" if $r == WAIT_DEPENDENCY; |
| return "Resource" if $r == WAIT_RESOURCES; |
| return "PartitionNodeLimit" if $r == WAIT_PART_NODE_LIMIT; |
| return "PartitionTimeLimit" if $r == WAIT_PART_TIME_LIMIT; |
| return "PartitionDown" if $r == WAIT_PART_STATE; |
| return "JobHeld" if $r == WAIT_HELD; |
| return "BeginTime" if $r == WAIT_TIME; |
| return "PartitionDown" if $r == FAIL_DOWN_PARTITION; |
| return "NodeDown" if $r == FAIL_DOWN_NODE; |
| return "BadConstraints" if $r == FAIL_BAD_CONSTRAINTS; |
| return "SystemFailure" if $r == FAIL_SYSTEM; |
| return "JobLaunchFailure" if $r == FAIL_LAUNCH; |
| return "NonZeroExitCode" if $r == FAIL_EXIT_CODE; |
| return "TimeLimit" if $r == FAIL_TIMEOUT; |
| return "InactiveLimit" if $r == FAIL_INACTIVE_LIMIT; |
| return "?"; |
| } |
| |
| |
| 1; |
| __END__ |
| # Below is stub documentation for your module. You'd better edit it! |
| |
| =head1 NAME |
| |
| Slurm - Perl API for slurm |
| |
| =head1 SYNOPSIS |
| |
| use Slurm; |
| |
| $nodes = Slurm->load_node(); |
| unless($nodes) { |
| $errmsg = Slurm->strerror(); |
| print "Error loading nodes: $errmsg"; |
| } |
| |
| |
| =head1 DESCRIPTION |
| |
| The Slurm class is a wrapper of the slurm API. |
| |
| TODO |
| |
| =head2 FUNCTIONS |
| |
| |
| =head2 EXPORT |
| |
| None by default. |
| |
| =head2 Exportable constants |
| |
| |
| |
| =head1 SEE ALSO |
| |
| Mention other useful documentation such as the documentation of |
| related modules or operating system documentation (such as man pages |
| in UNIX), or any relevant external documentation such as RFCs or |
| standards. |
| |
| If you have a mailing list set up for your module, mention it here. |
| |
| If you have a web site set up for your module, mention it here. |
| |
| =head1 AUTHOR |
| |
| Hongjia Cao, E<lt>hjcao@nudt.edu.cnE<gt> |
| |
| =head1 COPYRIGHT AND LICENSE |
| |
| Copyright (C) 2007 by Hongjia Cao |
| |
| This library is free software; you can redistribute it and/or modify |
| it under the same terms as Perl itself, either Perl version 5.8.4 or, |
| at your option, any later version of Perl 5 you may have available. |
| |
| |
| =cut |