-Add xcoll abbreviation support by popular demand

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@3194 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
jbjohnso 2009-04-14 18:27:43 +00:00
parent ee79fb1cc1
commit be121bafb2
3 changed files with 82 additions and 5 deletions

View File

@ -7,7 +7,7 @@ use strict;
#Perl implementation of noderange
our @ISA = qw(Exporter);
our @EXPORT = qw(noderange nodesmissed);
our @EXPORT_OK = qw(extnoderange);
our @EXPORT_OK = qw(extnoderange abbreviate_noderange);
my $missingnodes=[];
my $nodelist; #=xCAT::Table->new('nodelist',-create =>1);
@ -241,6 +241,51 @@ sub extnoderange { #An extended noderange function. Needed as the more straight
@allnodeset=();
return $return;
}
sub abbreviate_noderange {
#takes a list of nodes or a string and abbreviates
my $nodes=shift;
my %grouphash;
my %sizedgroups;
my %nodesleft;
my %targetelems;
unless (ref $nodes) {
$nodes = noderange($nodes);
}
%nodesleft = map { $_ => 1 } @{$nodes};
unless ($nodelist) {
$nodelist =xCAT::Table->new('nodelist',-create =>1);
}
my $group;
foreach($nodelist->getAllAttribs('node','groups')) {
my @groups=split(/,/,$_->{groups}); #The where clause doesn't guarantee the atom is a full group name, only that it could be
foreach $group (@groups) {
push @{$grouphash{$group}},$_->{node};
}
}
foreach $group (keys %grouphash) {
push @{$sizedgroups{scalar @{$grouphash{$group}}}},$group;
}
my $node;
use Data::Dumper;
print Dumper(\%sizedgroups);
foreach (reverse sort {$a <=> $b} keys %sizedgroups) {
GROUP: foreach $group (@{$sizedgroups{$_}}) {
foreach $node (@{$grouphash{$group}}) {
unless (grep $node eq $_,keys %nodesleft) {
#this group contains a node that isn't left, skip it
next GROUP;
}
}
foreach $node (@{$grouphash{$group}}){
delete $nodesleft{$node};
}
$targetelems{$group}=1;
}
}
return (join ',',keys %targetelems,keys %nodesleft);
}
sub noderange {
$missingnodes=[];
#We for now just do left to right operations

View File

@ -1,6 +1,10 @@
#!/usr/bin/env perl
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html
BEGIN { $::XCATROOT = $ENV{'XCATROOT'} ? $ENV{'XCATROOT'} : -d '/opt/xcat' ? '/opt/xcat' : '/usr'; }
use lib "$::XCATROOT/lib/perl";
use Data::Dumper;
use xCAT::Client;
use strict;
my %output;
while (<STDIN>) {
my $node;
@ -18,11 +22,24 @@ my %collated;
foreach (keys %output) {
$collated{$output{$_}}->{$_}=1;
}
foreach (keys %collated) {
my $nodes = join(',',sort (keys %{$collated{$_}}));
my $nodes;
sub fillerup {
my $response = shift;
if ($response->{data}->[0]) {
$nodes = $response->{data}->[0];
}
}
foreach my $output (keys %collated) {
$nodes = join(',',sort (keys %{$collated{$output}}));
my $cmdref = {
noderange => [$nodes],
command => ['rnoderange'],
};
xCAT::Client::submit_request($cmdref,\&fillerup);
print "====================================\n";
print "$nodes\n";
print "====================================\n";
print $_;
print $output;
print "\n";
}

View File

@ -11,7 +11,7 @@ use warnings;
use xCAT::Table;
use xCAT::Schema;
use Data::Dumper;
use xCAT::NodeRange;
use xCAT::NodeRange qw/abbreviate_noderange/;
use xCAT::Schema;
use xCAT::Utils;
use Getopt::Long;
@ -46,6 +46,7 @@ sub handled_commands
delattr => "tabutils", # not implemented yet
chtype => "tabutils", # not implemented yet
nr => "tabutils", # not implemented yet
rnoderange => "tabutils", # not implemented yet
tabgrep => "tabutils"
};
}
@ -89,6 +90,10 @@ sub process_request
{
return nodels($nodes, $args, $callback, $request->{emptynoderange}->[0]);
}
elsif ($command eq "rnoderange")
{
return rnoderange($nodes,$args,$callback);
}
elsif ($command eq "noderm" or $command eq "rmnode")
{
return noderm($nodes, $args, $callback);
@ -833,6 +838,16 @@ sub tabgrep
}
sub rnoderange
{
my $nodes = shift;
my $args = shift;
my $callback = shift;
my $data = abbreviate_noderange($nodes);
if ($data) {
$callback->({data=>[$data]});
}
}
#####################################################
# nodels command
#####################################################