-Implement table selection criteria for nodels.
table.column==value will only show nodes where table.column is exactly value table.column!=value will mask out nodes where table.column is exactly value table.column=~regex will only show nodes where the table.column value matches regex table.column!~regex will mask out nodes where the table.column value matches regex git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@2091 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
parent
58eaf5f7ee
commit
d0dc5dd96a
@ -818,7 +818,25 @@ sub nodels
|
||||
{
|
||||
my $table;
|
||||
my $column;
|
||||
my $value;
|
||||
my $matchtype;
|
||||
my $temp = $_;
|
||||
if ($temp =~ /^[^=]*\!=/) {
|
||||
($temp,$value) = split /!=/,$temp,2;
|
||||
$matchtype='natch';
|
||||
}
|
||||
elsif ($temp =~ /^[^=]*=~/) {
|
||||
($temp,$value) = split /=~/,$temp,2;
|
||||
$matchtype='regex';
|
||||
}
|
||||
elsif ($temp =~ /[^=]*==/) {
|
||||
($temp,$value) = split /==/,$temp,2;
|
||||
$matchtype='match';
|
||||
}
|
||||
elsif ($temp =~ /[^=]*!~/) {
|
||||
($temp,$value) = split /!~/,$temp,2;
|
||||
$matchtype='negex';
|
||||
}
|
||||
if ($shortnames{$temp})
|
||||
{
|
||||
($table, $column) = @{$shortnames{$temp}};
|
||||
@ -848,11 +866,14 @@ sub nodels
|
||||
unless (grep /^$column$/, @{$tables{$table}})
|
||||
{
|
||||
push @{$tables{$table}},
|
||||
[$column, $temp]; #Mark this as something to get
|
||||
[$column, $temp,$value,$matchtype]; #Mark this as something to get
|
||||
}
|
||||
}
|
||||
my $tab;
|
||||
my %noderecs;
|
||||
my %filterednodes=();
|
||||
my %mustdisplaynodes=();
|
||||
my %forcedisplaykeys=();
|
||||
foreach $tab (keys %tables)
|
||||
{
|
||||
my $tabh = xCAT::Table->new($tab);
|
||||
@ -861,11 +882,24 @@ sub nodels
|
||||
#print Dumper($tables{$tab});
|
||||
my $node;
|
||||
my %labels;
|
||||
my %values;
|
||||
my %matchtypes;
|
||||
my @cols=();
|
||||
foreach (@{$tables{$tab}})
|
||||
foreach (@{$tables{$tab}})
|
||||
{
|
||||
push @cols, $_->[0];
|
||||
$labels{$_->[0]} = $_->[1];
|
||||
$labels{$_->[0]} = $_->[1]; #Remember user supplied discreptions and use them
|
||||
if (not defined $values{$_->[0]}) { #If selection criteria not previously specified
|
||||
$values{$_->[0]} = $_->[2]; #assign selection criteria
|
||||
} elsif (not defined $_->[2]) { #we already have selection criteria, but this field isn't that
|
||||
$forcedisplaykeys{$_->[0]}=1; #allow switch.switch=~switch switch.switch, for example
|
||||
} else { #User attempted multiple selection criteria on the same field, bail
|
||||
$callback->({error=>["Multiple selection critera for ".$labels{$_->[0]}]});
|
||||
return;
|
||||
}
|
||||
if (not defined $matchtypes{$_->[0]}) {
|
||||
$matchtypes{$_->[0]} = $_->[3];
|
||||
}
|
||||
}
|
||||
my $removenodecol=1;
|
||||
if (grep /^node$/,@cols) {
|
||||
@ -876,18 +910,57 @@ sub nodels
|
||||
{
|
||||
my @cols;
|
||||
my $recs = $rechash->{$node}; #$tabh->getNodeAttribs($node, \@cols);
|
||||
my %satisfiedreqs=();
|
||||
foreach my $rec (@$recs) {
|
||||
|
||||
foreach (keys %$rec)
|
||||
{
|
||||
if ($_ eq "node" and $removenodecol) { next; }
|
||||
my %datseg;
|
||||
unless ($terse > 0) {
|
||||
$datseg{data}->[0]->{desc} = [$labels{$_}];
|
||||
}
|
||||
$datseg{data}->[0]->{contents} = [$rec->{$_}];
|
||||
$datseg{name} = [$node]; #{}->{contents} = [$rec->{$_}];
|
||||
push @{$noderecs{$node}}, \%datseg;
|
||||
$satisfiedreqs{$_}=1;
|
||||
my %datseg=();
|
||||
if (defined $values{$_}) {
|
||||
my $criteria=$values{$_}; #At least vim highlighting makes me worry about syntax in regex
|
||||
if ($matchtypes{$_} eq 'match' and not ($rec->{$_} eq $criteria) or
|
||||
$matchtypes{$_} eq 'natch' and ($rec->{$_} eq $criteria) or
|
||||
$matchtypes{$_} eq 'regex' and ($rec->{$_} !~ /$criteria/) or
|
||||
$matchtypes{$_} eq 'negex' and ($rec->{$_} =~ /$criteria/)) {
|
||||
#unless ($rec->{$_} eq $values{$_}) {
|
||||
$filterednodes{$node}=1;
|
||||
next;
|
||||
}
|
||||
$mustdisplaynodes{$node}=1;
|
||||
unless ($forcedisplaykeys{$_}) { next; } #skip if only specified once on command line
|
||||
}
|
||||
unless ($terse > 0) {
|
||||
$datseg{data}->[0]->{desc} = [$labels{$_}];
|
||||
}
|
||||
$datseg{data}->[0]->{contents} = [$rec->{$_}];
|
||||
$datseg{name} = [$node]; #{}->{contents} = [$rec->{$_}];
|
||||
push @{$noderecs{$node}}, \%datseg;
|
||||
}
|
||||
}
|
||||
foreach (keys %labels) {
|
||||
unless (defined $satisfiedreqs{$_}) {
|
||||
my %dataseg;
|
||||
if (defined $values{$_}) {
|
||||
my $criteria = $values{$_};
|
||||
if ($matchtypes{$_} eq 'match' and not ("" eq $criteria) or
|
||||
$matchtypes{$_} eq 'natch' and ("" eq $criteria) or
|
||||
$matchtypes{$_} eq 'regex' and ("" !~ /$criteria/) or
|
||||
$matchtypes{$_} eq 'negex' and ("" =~ /$criteria/)) {
|
||||
#unless ("" eq $values{$_}) {
|
||||
$filterednodes{$node}=1;
|
||||
next;
|
||||
}
|
||||
$mustdisplaynodes{$node}=1;
|
||||
unless ($forcedisplaykeys{$_}) { next; }
|
||||
}
|
||||
$dataseg{name} = [ $node ];
|
||||
unless ($terse > 0) {
|
||||
$dataseg{data}->[0]->{desc} = [$labels{$_}];
|
||||
}
|
||||
$dataseg{data}->[0]->{contents} = [""];
|
||||
push @{$noderecs{$node}}, \%dataseg;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -897,6 +970,15 @@ sub nodels
|
||||
$tabh->close();
|
||||
undef $tabh;
|
||||
}
|
||||
foreach (keys %mustdisplaynodes) {
|
||||
if ($filterednodes{$_} or defined $noderecs{$_}) {
|
||||
next;
|
||||
}
|
||||
$noderecs{$_}=[{name=>[$_]}];
|
||||
}
|
||||
foreach (keys %filterednodes) {
|
||||
delete $noderecs{$_};
|
||||
}
|
||||
foreach (sort (keys %noderecs))
|
||||
{
|
||||
push @{$rsp->{"node"}}, @{$noderecs{$_}};
|
||||
|
Loading…
Reference in New Issue
Block a user