File Coverage

blib/lib/NBI/QueuedJob.pm
Criterion Covered Total %
statement 50 62 80.6
branch 23 46 50.0
condition 2 6 33.3
subroutine 9 9 100.0
pod 6 6 100.0
total 90 129 69.7


line stmt bran cond sub pod time code
1             #ABSTRACT: NBI::QueuedJob, to describe a job from the SLURM queue (squeue)
2             #
3             # NBI::QueuedJob - Represents a single job entry returned by squeue.
4             #
5             # DESCRIPTION:
6             # A lightweight data object populated from one row of squeue output.
7             # Key responsibilities:
8             # - new() : accepts -user, -jobid, -queue, -status, -name, and any
9             # additional valid squeue attribute (validated against
10             # @VALID_ATTR and @VALID_STATUS lists)
11             # - Lvalue accessors: username, queue, name, jobid, status
12             # - $attrs hash: holds any extra squeue fields passed via - => value
13             # Validation constants:
14             # - @VALID_ATTR : list of valid squeue column names (extended with keys
15             # from %NBI::Slurm::FORMAT_STRINGS)
16             # - @VALID_STATUS : list of valid long-form SLURM job states
17             #
18             # RELATIONSHIPS:
19             # - Instantiated exclusively by NBI::Queue->_squeue() for each output row.
20             # - Depends on %NBI::Slurm::FORMAT_STRINGS for the extended @VALID_ATTR list.
21             # - $NBI::QueuedJob::VERSION is set from $NBI::Slurm::VERSION.
22             #
23 3     3   366718 use strict;
  3         7  
  3         154  
24 3     3   23 use warnings;
  3         6  
  3         246  
25             package NBI::QueuedJob;
26 3     3   19 use Carp qw(confess croak);
  3         6  
  3         4858  
27             require Exporter;
28             our @ISA = qw(Exporter);
29              
30              
31             $NBI::QueuedJob::VERSION = $NBI::Slurm::VERSION;
32             our $VALID_ATTR_STR="ACCOUNT|GRES|MIN_CPUS|MIN_TMP_DISK|END_TIME|FEATURES|GROUP|OVER_SUBSCRIBE|JOBID|NAME|COMMENT|TIME_LIMIT|MIN_MEMORY|REQ_NODES|COMMAND|PRIORITY|QOS|REASON|ST|USER|RESERVATION|WCKEY|EXC_NODES|NICE|S:C:T|JOBID|EXEC_HOST|CPUS|NODES|DEPENDENCY|ARRAY_JOB_ID|GROUP|SOCKETS_PER_NODE|CORES_PER_SOCKET|THREADS_PER_CORE|ARRAY_TASK_ID|TIME_LEFT|TIME|NODELIST|CONTIGUOUS|PARTITION|PRIORITY|NODELIST(REASON)|START_TIME|STATE|USER|SUBMIT_TIME|LICENSES|CORE_SPEC|SCHEDNODES|WORK_DIR";
33             our $VALID_STATUS_STR="PENDING,RUNNING,SUSPENDED,COMPLETED,CANCELLED,FAILED,TIMEOUT,NODE_FAIL,PREEMPTED,BOOT_FAIL,DEADLINE,OUT_OF_MEMORY,COMPLETING,CONFIGURING,RESIZING,REVOKED,SPECIAL_EXIT";
34             our @VALID_ATTR=split(/\|/,$VALID_ATTR_STR);
35             our @VALID_STATUS=split(/,/,$VALID_STATUS_STR);
36              
37             # Append to @VALID_STATUS also @FORMAT_STRINGS
38             @VALID_ATTR = (@VALID_ATTR, keys %NBI::Slurm::FORMAT_STRINGS);
39             # make uc all VALID_ATTR
40             @VALID_ATTR = map {uc($_)} @VALID_ATTR;
41             sub new {
42 2     2 1 1230 my $class = shift @_;
43 2         10 my $username;
44             my $queue;
45 2         0 my $name;
46 2         0 my $jobid;
47 2         0 my $status;
48 2         7 my $attrs = {};
49             # Descriptive instantiation with parameters -param => value
50 2 50       11 if (substr($_[0], 0, 1) eq '-') {
51 2         10 my %data = @_;
52             # Try parsing
53 2         8 for my $i (keys %data) {
54 6 100       67 if ($i =~ /^-user/) {
    50          
    50          
    50          
    50          
    50          
55 1         4 $username = $data{$i};
56             } elsif ($i =~ /^-jobid/) {
57             # Check it's an integer
58 0 0       0 if ($data{$i} =~ /^\d+$/) {
59 0         0 $jobid = $data{$i};
60             } else {
61 0         0 confess "ERROR NBI: -threads expects an integer\n";
62             }
63             } elsif ($i =~ /^-queue/) {
64 0         0 $queue = $data{$i};
65             } elsif ($i =~ /^-status/) {
66             # Check it's a valid status
67 0 0       0 if (grep {$_ eq uc($data{$i})} @VALID_STATUS) {
  0         0  
68 0         0 $status = uc($data{$i});
69             } else {
70 0         0 confess "ERROR NBI: -status expects one of the following values: $VALID_STATUS_STR\n";
71             }
72            
73             } elsif ($i =~ /^-name/) {
74 0         0 $name = $data{$i};
75             } elsif ($i =~ /^-(\w+)/) {
76 5 100       13 if (grep {$_ eq uc($1)} @VALID_ATTR) {
  255         484  
77 4 50       11 if (defined $data{$i}) {
78 4         18 $attrs->{uc($1)} = $data{$i};
79             } else {
80 0         0 croak "ERROR NBI: -$1 expects a value\n";
81             }
82             } else {
83 1         325 confess "ERROR NBI: Unknown parameter -$1\nValid parameters are: ",
84             join("\n -",@VALID_ATTR), "\n";
85             }
86             } else {
87 0         0 confess "ERROR NBI: Unknown option/parameter $i\n";
88             }
89             }
90             }
91            
92 1         4 my $self = bless {}, $class;
93            
94             # Set attributes
95 1 50       5 $self->username = defined $username ? $username : undef;
96 1 50       19 $self->queue = defined $queue ? $queue : undef;
97 1 50       6 $self->name = defined $name ? $name : undef;
98 1 50       5 $self->jobid = defined $jobid ? $jobid : undef;
99 1 50       3 $self->status = defined $status ? $status : undef;
100 1         3 $self->{attrs} = $attrs;
101 1         5 return $self;
102             }
103              
104             sub username : lvalue {
105             # Update threads
106 1     1 1 2 my ($self, $new_val) = @_;
107 1 50       5 $self->{username} = $new_val if (defined $new_val);
108 1         7 return $self->{username};
109             }
110              
111             sub queue : lvalue {
112             # Update queue
113 1     1 1 2 my ($self, $new_val) = @_;
114 1 50       3 $self->{queue} = $new_val if (defined $new_val);
115 1         2 return $self->{queue};
116             }
117              
118             sub name : lvalue {
119             # Update name
120 1     1 1 2 my ($self, $new_val) = @_;
121 1 50       2 $self->{name} = $new_val if (defined $new_val);
122 1         11 return $self->{name};
123             }
124              
125             sub jobid : lvalue {
126             # Update jobid
127 1     1 1 3 my ($self, $new_val) = @_;
128 1 50 33     9 confess "ERROR NBI::Queue: jobid must be an integer\n" if (defined $new_val && $new_val !~ /^\d+$/);
129 1 50       3 $self->{jobid} = $new_val if (defined $new_val);
130 1         2 return $self->{jobid};
131             }
132              
133             sub status : lvalue {
134             # Update status
135 1     1 1 2 my ($self, $new_val) = @_;
136 1 50 33     4 confess "ERROR NBI::Queue: status must be one of the following values: $VALID_STATUS_STR\n" if (defined $new_val && !grep {$_ eq uc($new_val)} @VALID_STATUS);
  0         0  
137 1 50       3 $self->{status} = $new_val if (defined $new_val);
138 1         8 return $self->{status};
139             }
140             1;
141              
142             __END__