enable tabch plugin

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@10461 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
lissav 2011-09-07 15:20:00 +00:00
parent a6033e7bf9
commit c50e2522dd

View File

@ -40,7 +40,7 @@ sub handled_commands
lsxcatd => "tabutils",
tabprune => "tabutils",
tabrestore => "tabutils",
tabch => "tabutils", # not implemented yet
tabch => "tabutils",
nodegrpch => "tabutils",
nodech => "tabutils",
nodeadd => "tabutils",
@ -138,7 +138,7 @@ sub process_request
return tabgrep($nodes, $callback);
}
elsif ($command eq "tabch"){
return tabch($args, $callback);
return tabch($request, $callback);
}
else
{
@ -1937,76 +1937,177 @@ sub nodels
#########
sub tabch {
my $args = shift;
my $req = shift;
my $callback = shift;
my @ARGV = @{$args};
my $delete = 0;
if ($ARGV[0] =~ /^-d$/){
shift @ARGV;
$delete = 1;
}
# tabch usages message
my $tabch_usage = sub {
my $exitcode = shift @_;
my %rsp;
push @{$rsp{data}}, "Usage: tabch";
push @{$rsp{data}}, " To add or update rows for tables:";
push @{$rsp{data}}, " chtab [keycolname=keyvalue[,keycolname=keyvalue...]] [tablename.colname=newvalue] [tablename.colname=newvalue]...";
push @{$rsp{data}}, " To delete rows from tables:";
push @{$rsp{data}}, " chtab -d|--delete keycolname=keyvalue[,keycolname=keyvalue...] tablename [tablename]...";
push @{$rsp{data}}, " keycolname=keyvalue a column name-and-value pair that identifies the rows in a table to be changed.
tablename.colname=newvalue the new value for the specified row and column of the table.";
push @{$rsp{data}}, " tabprune [-h|--help]";
push @{$rsp{data}}, " tabprune [-v|--version]";
if ($exitcode) { $rsp{errorcode} = $exitcode; }
$callback->(\%rsp);
};
# check for parameters
if (!defined($req->{arg})) { $tabch_usage->(1); return; }
@ARGV = @{$req->{arg}};
# options can be bundled up like -vV
Getopt::Long::Configure("bundling");
$Getopt::Long::ignorecase = 0;
# parse the options
if (
!GetOptions(
'd|delete' => \$::DELETE,
'h|help' => \$::HELP,
'v|version' => \$::VERSION,
)
)
{
$tabch_usage->(1);
return;
}
if ($::HELP) { $tabch_usage->(0); return; }
# display the version statement if -v or --verison is specified
if ($::VERSION)
{
my %rsp;
my $version = xCAT::Utils->Version();
$rsp{data}->[0] = "tabch :$version";
$callback->(\%rsp);
exit(0);
}
# now start processing the input
my $target = shift @ARGV;
unless ($target)
{
my $target = shift @ARGV;
my %tables;
my %keyhash=();
my @keypairs=split(/,/,$target);
if ($keypairs[0] !~ /([^\.\=]+)\.([^\.\=]+)\=(.+)/) {
foreach (@keypairs) {
m/(.*)=(.*)/;
my $key=$1;
my $val=$2;
$keyhash{$key}=$val;
}
} else {
unshift(@ARGV, $target);
}
if($delete){
my @tables_to_del=@ARGV;
if(@tables_to_del == 0){
$callback->({error => ["Missing table name."],errorcode=>[1]});
return;
}
for(@tables_to_del){
$tables{$_} = xCAT::Table->new($_,-create=> 1,-autocommit => 0);
$tables{$_}->delEntries(\%keyhash);
$tables{$_}->commit;
}
}else{
my %tableupdates;
for (@ARGV) {
my $temp;
my $table;
my $column;
my $value;
($table,$temp) = split('\.',$_,2);
($column,$value) = split("=",$temp,2);
unless ($tables{$table}) {
my $tab = xCAT::Table->new($table,-create => 1,-autocommit => 0);
if ($tab) {
$tables{$table}=$tab;
} else {
$callback->({error => [ "Table $table does not exist."],errorcode=>[1]});
}
}
$tableupdates{$table}{$column}=$value;
$tableupdates{$table}{$column}=$value;
}
#commit all the changes
foreach (keys %tables) {
if (exists($tableupdates{$_})) {
$tables{$_}->setAttribs(\%keyhash,\%{$tableupdates{$_}});
}
$tables{$_}->commit;
}
#commit all the changes
foreach (keys %tables) {
if (exists($tableupdates{$_})) {
$tables{$_}->setAttribs(\%keyhash,\%{$tableupdates{$_}});
}
$tables{$_}->commit;
$tabch_usage->(1); return;
}
my %tables;
my %keyhash = ();
my @keypairs = split(/,/, $target);
if ($keypairs[0] !~ /([^\.\=]+)\.([^\.\=]+)\=(.+)/)
{
foreach (@keypairs)
{
m/(.*)=(.*)/;
my $key = $1;
my $val = $2;
if (!defined($key) || !defined($val))
{
my %rsp;
$rsp{data}->[0] = "Incorrect argument \"$_\".\n";
$rsp{data}->[1] = "Check man tabch or tabch -h\n";
$callback->(\%rsp);
return 1;
}
$keyhash{$key} = $val;
}
}
else
{
unshift(@ARGV, $target);
}
if ($::DELETE)
{
#delete option is specified
my @tables_to_del = @ARGV;
if (@tables_to_del == 0)
{
my %rsp;
$rsp{data}->[0] = "Missing table name.\n";
$rsp{data}->[1] = "Check man tabch or tabch -h\n";
$callback->(\%rsp);
return 1;
}
for (@tables_to_del)
{
$tables{$_} = xCAT::Table->new($_, -create => 1, -autocommit => 0);
$tables{$_}->delEntries(\%keyhash);
$tables{$_}->commit;
}
}
else {
#update or create option
my %tableupdates;
for (@ARGV) {
my $temp;
my $table;
my $column;
my $value;
($table,$temp) = split('\.',$_,2);
#try to create the entry if it doesn't exist
unless ($tables{$table}) {
my $tab = xCAT::Table->new($table,-create => 1,-autocommit => 0);
if ($tab) {
$tables{$table}=$tab;
} else {
my %rsp;
$rsp{data}->[0] = "Table $table does not exist.\n";
$callback->(\%rsp);
return 1;
}
}
#splice assignment
if(grep /\+=/, $temp) {
($column,$value) = split('\+=',$temp,2);
#grab the current values to check against
my ($attrHash) = $tables{$table}->getAttribs(\%keyhash, $column);
my @existing = split(",",$attrHash->{$column});
#if it has values, merge the new and old ones together so no dupes
if (@existing) {
my @values = split(",",$value);
my %seen = ();
my @uniq = ();
my $item;
foreach $item (@existing,@values) {
unless ($seen{$item}) {
# if we get here, we have not seen it before
$seen{$item} = 1;
push(@uniq, $item);
}
}
$value = join(",",@uniq);
}
}
#normal non-splicing assignment
else {
($column,$value) = split("=",$temp,2);
}
$tableupdates{$table}{$column}=$value;
}
#commit all the changes
foreach (keys %tables) {
if (exists($tableupdates{$_})) {
$tables{$_}->setAttribs(\%keyhash,\%{$tableupdates{$_}});
}
$tables{$_}->commit;
}
}
}