blob: a4d55b6e7c8adbf655977008d699d8434e19137d [file] [log] [blame] [edit]
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