From: Martin Mares Date: Wed, 15 Feb 2012 23:03:02 +0000 (+0100) Subject: One more rename of subcommands X-Git-Tag: v3.0~12 X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=744cdfa63c2e41d11c42fd4eb6287487a05d8e27;p=bex.git One more rename of subcommands `bex ls' was illogical, since it can move or remove jobs, too. --- diff --git a/bex b/bex index 0fe8495..b1cb7b0 100755 --- a/bex +++ b/bex @@ -24,10 +24,10 @@ General options: Commands (and aliases): add (a) Add new jobs to a queue job Operations on queued jobs -ls (l) Show queues and jobs on them mach List known machines and groups prun (pr) Parallel version of `run' -queue Operations on queues +qman Management of queues +queue (q) Show queues and jobs on them run (r) Run queued jobs AMEN exit 0; @@ -54,8 +54,8 @@ $sub =~ /^[0-9a-zA-Z]+$/ or die "Invalid subcommand $sub\n"; my %aliases = ( 'a' => 'add', - 'l' => 'ls', 'p' => 'prun', + 'q' => 'queue', 'r' => 'run', ); if (defined $aliases{$sub}) { $sub = $aliases{$sub}; } diff --git a/lib/bin/bex-ls b/lib/bin/bex-ls deleted file mode 100755 index a575983..0000000 --- a/lib/bin/bex-ls +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/perl -# Batch EXecutor 3.0 -- Show Queued Jobs -# (c) 2011-2012 Martin Mares - -use strict; -use warnings; -use Getopt::Long; -use POSIX; -use BEX; - -my $op_by_job; -my $op_by_host; -my $op_rm; -my $op_move_to; - -my $queue_name; -my $given_job; - -sub usage() { - print <] [[!] ...] - -Actions: - --by-job Show jobs sorted by job ID (default) --h, --by-host Show jobs sorted by host - --rm Remove jobs from the queue - --move-to= Move jobs to a different queue - -Options: --j, --job= Act on the specified job (default: on all) --q, --queue= Act on the given queue -AMEN - exit 0; -} - -GetOptions( - "by-job!" => \$op_by_job, - "h|by-host!" => \$op_by_host, - "rm!" => \$op_rm, - "move-to=s" => \$op_move_to, - "j|job=s" => \$given_job, - "q|queue=s" => \$queue_name, - "help" => \&usage, -) or die "Try `bex ls --help' for more information.\n"; - -my @machines = BEX::Config::parse_machine_list(@ARGV ? @ARGV : '*'); -my $queue = BEX::Queue->new($queue_name); - -# Select jobs -my %jobs = (); -my %machs = (); -for my $m (@machines) { - for my $j ($queue->scan($m)) { - if (defined $given_job) { - next if $j ne $given_job; - } - push @{$jobs{$j}}, $m; - push @{$machs{$m}}, $j; - } -} - -sub do_ls(); -sub do_rm(); -sub do_move_to(); - -my $ops = 0 + defined($op_by_host) + defined($op_by_job) + defined($op_rm) + defined($op_move_to); -if ($ops > 1) { die "Multiple actions are not allowed\n"; } - -if ($op_rm) { do_rm(); } -elsif (defined $op_move_to) { do_move_to(); } -else { do_ls(); } -exit 0; - -sub do_ls() -{ - my %stat = (); - my %mach_locked = (); - for my $m (keys %machs) { - $mach_locked{$m} = $queue->is_locked($m, undef); - for my $j (@{$machs{$m}}) { - my $st = $queue->read_job_status($m, $j); - if (defined($st->{'Time'}) && defined($st->{'Status'})) { - $stat{$m}{$j} = ' [' . $st->{'Status'} . ' on ' . - POSIX::strftime('%Y-%m-%d', localtime $st->{'Time'}) . ']'; - } else { - $stat{$m}{$j} = ''; - } - if ($mach_locked{$m} || $queue->is_locked($m, $j)) { - $stat{$m}{$j} .= ' [LOCKED]'; - } - } - } - - if ($queue->is_locked(undef, undef)) { - print "### Queue lock present\n\n"; - } - - if ($op_by_host) { - for my $m (sort keys %machs) { - print "$m", ($mach_locked{$m} ? ' [LOCKED]' : ''), "\n"; - for my $j (@{$machs{$m}}) { - print "\t" . $queue->job_name($j) . $stat{$m}{$j}, "\n"; - } - } - } else { - for my $j (sort keys %jobs) { - print $queue->job_name($j), "\n"; - for my $m (sort @{$jobs{$j}}) { - print "\t$m", $stat{$m}{$j}, "\n"; - } - } - } -} - -sub do_rm() -{ - my $err = 0; - for my $m (sort keys %machs) { - for my $j (sort @{$machs{$m}}) { - if (!$queue->lock($m, $j)) { - print STDERR "Cannot remove $m:", $queue->job_name($j), ", it is locked\n"; - $err = 1; - } else { - $queue->update_job_status($m, $j, 'REMOVED'); - $queue->remove($m, $j); - print "Removed $m:", $queue->job_name($j), "\n"; - } - } - } - $queue->unlock; - exit $err; -} - -sub do_move_to() -{ - my $err = 0; - my $dest = BEX::Queue->new($op_move_to); - $dest->{'Name'} ne $queue->{'Name'} or die "Moving to the same queue is not permitted\n"; - for my $j (sort keys %jobs) { - my $job = BEX::Job->new_from_file($queue->job_file($j)); - for my $m (sort @{$jobs{$j}}) { - if (!$queue->lock($m, $j)) { - print STDERR "Cannot move $m:", $queue->job_name($j), ", it is locked\n"; - $err = 1; - } else { - my $enq = $dest->enqueue($m, $job); - if ($enq) { - $dest->update_job_status($m, $job->id, 'NEW', 'Moved to this queue'); - } else { - $dest->log($m, $job->id, 'REQUEUE', 'Moved to this queue'); - } - $queue->update_job_status($m, $job->id, 'REMOVED', 'Moved from this queue'); - $queue->remove($m, $j); - print "Moved $m:", $dest->job_name($j); - print " (already queued)" if !$enq; - print "\n"; - } - } - } - $queue->unlock; - exit $err; -} diff --git a/lib/bin/bex-qman b/lib/bin/bex-qman new file mode 100755 index 0000000..e661cde --- /dev/null +++ b/lib/bin/bex-qman @@ -0,0 +1,53 @@ +#!/usr/bin/perl +# Batch EXecutor 3.0 -- Management of Queues +# (c) 2011-2012 Martin Mares + +use strict; +use warnings; +use Getopt::Long; +use BEX; + +my $init; + +sub usage() { + print <] + +Subcommands: +init Create a new queue +ls List all queues + +Options: +None defined so far. +AMEN + exit 0; +} + +GetOptions( + "init!" => \$init, + "help" => \&usage, +) or die "Try `bex qman --help' for more information.\n"; + +my $op = shift @ARGV // 'ls'; + +if ($op eq 'init') { + my $queue_name = shift @ARGV or die "bex qman init requires a queue name\n"; + my $path = $BEX::Config::home . '/' . $queue_name; + -d $path and die "Queue directory $path already exists\n"; + mkdir $path; + mkdir "$path/hosts"; + mkdir "$path/jobs"; + print "Queue $queue_name initialized.\n"; +} elsif ($op eq 'ls' && @ARGV == 0) { + opendir D, $BEX::Config::home or die "Cannot read BEX home directory\n"; + for my $q (sort readdir D) { + next if $q =~ /^\./; + my $d = $BEX::Config::home . '/' . $q; + if (-d $d && -d "$d/hosts" && -d "$d/jobs") { + print "$q\n"; + } + } + closedir D; +} else { + die "Invalid subcommand\n"; +} diff --git a/lib/bin/bex-queue b/lib/bin/bex-queue index aa90755..58387ee 100755 --- a/lib/bin/bex-queue +++ b/lib/bin/bex-queue @@ -1,53 +1,162 @@ #!/usr/bin/perl -# Batch EXecutor 3.0 -- Operations on Queues +# Batch EXecutor 3.0 -- Show Queued Jobs # (c) 2011-2012 Martin Mares use strict; use warnings; use Getopt::Long; +use POSIX; use BEX; -my $init; +my $op_by_job; +my $op_by_host; +my $op_rm; +my $op_move_to; + +my $queue_name; +my $given_job; sub usage() { print <] +Usage: bex queue [] [[!] ...] -Subcommands: -init Create a new queue -ls List all queues +Actions: + --by-job Show jobs sorted by job ID (default) +-h, --by-host Show jobs sorted by host + --rm Remove jobs from the queue + --move-to= Move jobs to a different queue Options: -None defined so far. +-j, --job= Act on the specified job (default: on all) +-q, --queue= Act on the given queue AMEN exit 0; } GetOptions( - "init!" => \$init, + "by-job!" => \$op_by_job, + "h|by-host!" => \$op_by_host, + "rm!" => \$op_rm, + "move-to=s" => \$op_move_to, + "j|job=s" => \$given_job, + "q|queue=s" => \$queue_name, "help" => \&usage, ) or die "Try `bex queue --help' for more information.\n"; -my $op = shift @ARGV // 'ls'; - -if ($op eq 'init') { - my $queue_name = shift @ARGV or die "bex queue init requires a queue name\n"; - my $path = $BEX::Config::home . '/' . $queue_name; - -d $path and die "Queue directory $path already exists\n"; - mkdir $path; - mkdir "$path/hosts"; - mkdir "$path/jobs"; - print "Queue $queue_name initialized.\n"; -} elsif ($op eq 'ls' && @ARGV == 0) { - opendir D, $BEX::Config::home or die "Cannot read BEX home directory\n"; - for my $q (sort readdir D) { - next if $q =~ /^\./; - my $d = $BEX::Config::home . '/' . $q; - if (-d $d && -d "$d/hosts" && -d "$d/jobs") { - print "$q\n"; +my @machines = BEX::Config::parse_machine_list(@ARGV ? @ARGV : '*'); +my $queue = BEX::Queue->new($queue_name); + +# Select jobs +my %jobs = (); +my %machs = (); +for my $m (@machines) { + for my $j ($queue->scan($m)) { + if (defined $given_job) { + next if $j ne $given_job; + } + push @{$jobs{$j}}, $m; + push @{$machs{$m}}, $j; + } +} + +sub do_ls(); +sub do_rm(); +sub do_move_to(); + +my $ops = 0 + defined($op_by_host) + defined($op_by_job) + defined($op_rm) + defined($op_move_to); +if ($ops > 1) { die "Multiple actions are not allowed\n"; } + +if ($op_rm) { do_rm(); } +elsif (defined $op_move_to) { do_move_to(); } +else { do_ls(); } +exit 0; + +sub do_ls() +{ + my %stat = (); + my %mach_locked = (); + for my $m (keys %machs) { + $mach_locked{$m} = $queue->is_locked($m, undef); + for my $j (@{$machs{$m}}) { + my $st = $queue->read_job_status($m, $j); + if (defined($st->{'Time'}) && defined($st->{'Status'})) { + $stat{$m}{$j} = ' [' . $st->{'Status'} . ' on ' . + POSIX::strftime('%Y-%m-%d', localtime $st->{'Time'}) . ']'; + } else { + $stat{$m}{$j} = ''; + } + if ($mach_locked{$m} || $queue->is_locked($m, $j)) { + $stat{$m}{$j} .= ' [LOCKED]'; + } + } + } + + if ($queue->is_locked(undef, undef)) { + print "### Queue lock present\n\n"; + } + + if ($op_by_host) { + for my $m (sort keys %machs) { + print "$m", ($mach_locked{$m} ? ' [LOCKED]' : ''), "\n"; + for my $j (@{$machs{$m}}) { + print "\t" . $queue->job_name($j) . $stat{$m}{$j}, "\n"; + } + } + } else { + for my $j (sort keys %jobs) { + print $queue->job_name($j), "\n"; + for my $m (sort @{$jobs{$j}}) { + print "\t$m", $stat{$m}{$j}, "\n"; + } + } + } +} + +sub do_rm() +{ + my $err = 0; + for my $m (sort keys %machs) { + for my $j (sort @{$machs{$m}}) { + if (!$queue->lock($m, $j)) { + print STDERR "Cannot remove $m:", $queue->job_name($j), ", it is locked\n"; + $err = 1; + } else { + $queue->update_job_status($m, $j, 'REMOVED'); + $queue->remove($m, $j); + print "Removed $m:", $queue->job_name($j), "\n"; + } + } + } + $queue->unlock; + exit $err; +} + +sub do_move_to() +{ + my $err = 0; + my $dest = BEX::Queue->new($op_move_to); + $dest->{'Name'} ne $queue->{'Name'} or die "Moving to the same queue is not permitted\n"; + for my $j (sort keys %jobs) { + my $job = BEX::Job->new_from_file($queue->job_file($j)); + for my $m (sort @{$jobs{$j}}) { + if (!$queue->lock($m, $j)) { + print STDERR "Cannot move $m:", $queue->job_name($j), ", it is locked\n"; + $err = 1; + } else { + my $enq = $dest->enqueue($m, $job); + if ($enq) { + $dest->update_job_status($m, $job->id, 'NEW', 'Moved to this queue'); + } else { + $dest->log($m, $job->id, 'REQUEUE', 'Moved to this queue'); + } + $queue->update_job_status($m, $job->id, 'REMOVED', 'Moved from this queue'); + $queue->remove($m, $j); + print "Moved $m:", $dest->job_name($j); + print " (already queued)" if !$enq; + print "\n"; + } } } - closedir D; -} else { - die "Invalid subcommand\n"; + $queue->unlock; + exit $err; }