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:
parent
a6033e7bf9
commit
c50e2522dd
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user