2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2025-06-01 19:17:06 +00:00

Cleaned up node cmds and man pages and fixed Tracker bug 1908147

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@733 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
bp-sawyers 2008-03-08 14:14:00 +00:00
parent b1fe0bff15
commit 87030e3737
5 changed files with 267 additions and 235 deletions

View File

@ -1,65 +1,83 @@
=head1 NAME
B<nodeadd> -Adds nodes to the cluster.
B<nodeadd> - Adds nodes to the xCAT cluster database.
=head1 SYNOPSIS
I<nodeadd [-h| --help]>
I<nodeadd [noderange] nodelist.groups= [groupname] >
B<nodeadd> I<noderange> B<groups>=I<groupnames> [I<table.column=value>] [I<...>]
I<nodeadd [noderange] [table.column=value, table.column=value] >
B<nodeadd> {B<-v> | B<--version>}
B<nodeadd> [B<-?> | B<-h> | B<--help>]
=head1 DESCRIPTION
The nodeadd command adds the node from the input node range. At least one groupname must be supplied
The nodeadd command adds the nodes specified in noderange to the xCAT database. It also stores
the any additional attributes specified for these nodes. At least one groupname must be supplied.
You should also consider specifying attributes in at least the following tables: B<nodehm>, B<noderes>,
B<nodetype>. See the man page for each of these for details. Also see the B<xcatdb> man page for an
overview of each table.
nodeadd also supports some short cut tags:
groups is equivalent to table.column = nodelist.groups
for example:nodeadd blade1-blade8 groups=all,compuTe
mgt is equivalent to table.column = nodehm.mgt
for example:nodeadd blade7 mgt=blade
switch is equivalent to table.colum= switch.switch
for example:nodeadd blade8 switch=switch1
The nodeadd command also supports some short cut names as aliases to common attributes. See the
B<nodels> man page for details.
=head1 OPTIONS
=over 10
B<-h> Display usage message.
=item B<-v|--version>
B<-v> Command Version.
Command Version.
B<-V> Verbose output.
=item B<-?|-h|--help>
Display usage message.
=back
=head1 RETURN VALUE
0 The command completed successfully.
=over 3
=item 0
The command completed successfully.
=item 1
An error has occurred.
=back
1 An error has occurred.
=head1 EXAMPLES
1. To add nodes in noderange node1-node4 with group all:
=over 2
I<nodeadd node1-node4 groups=all >
2. To add nodes in noderange node1-node4 to the nodetype table with os=rhel5:
=item *
I<nodeadd node1-node4 nodetype.os=rhel5>
To add nodes in noderange node1-node4 with group all:
B<nodeadd> I<node1-node4 groups=all>
=item *
To add nodes in noderange node1-node4 to the nodetype table with os=rhel5:
B<nodeadd> I<node1-node4 groups=all,rhel5 nodetype.os=rhel5>
=back
=head1 FILES
/opt/xcat/bin/nodeadd
=head1 NOTES
=head1 SEE ALSO
This command is part of the xCAT software product.
See nodels,nodech,noderange
nodels(1), nodech(1), noderange(5)

View File

@ -1,54 +1,104 @@
=head1 NAME
B<nodech> -Changes node attributes in the database.
B<nodech> - Changes nodes' attributes in the xCAT cluster database.
=head1 SYNOPSIS
I<nodech [-h| --help]>
B<nodech> I<noderange> I<table.column=value> [I<...>]
I<nodech [noderange] [table.column=value, table.column=value] >
B<nodech> {B<-d> | B<--delete>} I<noderange> I<table> [I<...>]
B<nodech> {B<-v> | B<--version>}
B<nodech> [B<-?> | B<-h> | B<--help>]
=head1 DESCRIPTION
The nodech command changes the attribute value in the input table.column for the input node range.
The nodech command changes the specified attributes for the given nodes. Normally, the given
value will completely replace the current attribute value. But if ",=" is used instead of "=",
the specified value will be added to the attribute's comma separated list, if it is not already
there. If "^=" is used, the specified value will be removed from the attribute's comma separated list,
if it is there. You can also use "^=" and ",=" in the same command to essentially replace one item
in the list with another. (See the Examples section.)
See the B<xcatdb> man page for an overview of each table.
The nodech command also supports some short cut names as aliases to common attributes. See the
B<nodels> man page for details.
=head1 OPTIONS
=over 10
B<-h> Display usage message.
=item B<-d|--delete>
B<-v> Command Version.
Delete the nodes' row in the specified tables.
=item B<-v|--version>
Command Version.
=item B<-?|-h|--help>
Display usage message.
=back
=head1 RETURN VALUE
0 The command completed successfully.
=over 3
=item 0
The command completed successfully.
=item 1
An error has occurred.
=back
1 An error has occurred.
=head1 EXAMPLES
1. To change the group name nodes in noderange node1-node4:
=over 2
I<nodech node1-node4 nodelist.groups=compute >
2. To change nodes in noderange node1-node4 to os=rhel5 in nodetype table:
=item *
I<nodech node1-node4 nodetype.os=rhel5>
To add nodes in noderange node1-node4 with group all:
B< nodech> I<node1-node4 groups=all>
=item *
To add nodes in noderange node1-node4 to the nodetype table with os=rhel5:
B< nodech> I<node1-node4 groups=all,rhel5 nodetype.os=rhel5>
=item *
To add node1-node4 to group1:
B< nodech> I<node1-node4 groups,=group1>
=item *
To put node1-node4 in group2, instead of group1:
B< nodech> I<node1-node4 groups^=group1 groups,=group2>
=back
=head1 FILES
/opt/xcat/bin/nodech
=head1 NOTES
=head1 SEE ALSO
This command is part of the xCAT software product.
See nodels,nodeadd,noderange
nodels(1), nodeadd(1), noderange(5)

View File

@ -2,21 +2,22 @@
B<nodels> - lists the nodes in the noderange.
=head1 SYNOPSIS
B<nodels> [I<noderange>] [I<table.attribute> | I<shortname>] I<...>
B<nodels> [I<noderange>] [I<table.column> | I<shortname>] [I<...>]
B<nodels> {B<-v> | B<--version>}
B<nodels> [B<-?> | B<-h> | B<--help>]
B<nodels> [B<-v> | B<--version>]
=head1 DESCRIPTION
The nodels command lists the nodes specified in the node range. If no noderange is provided, then all nodes are listed.
Additional attributes of the nodes will also be displayed if the table names and attribute names
are specified after the noderange in the form: I<table.attribute> . A few shortcut names can
are specified after the noderange in the form: I<table.column> . A few shortcut names can
also be used as aliases to common attributes:
=over 10
@ -44,20 +45,22 @@ for grep'ing through the tab files, like was done in xCAT 1.x. This is because
any regular expression rows in the tables into their meaning for the specified node. The tab* commands
will not do this, instead they will just display the single regular expression row.
=head1 OPTIONS
=over 10
=item B<-v|--version>
Command Version.
=item B<-?|-h|--help>
Display usage message.
=item B<-v>
Command Version.
=back
=head1 RETURN VALUE
=over 3
@ -72,6 +75,7 @@ An error has occurred.
=back
=head1 EXAMPLES
=over 2
@ -131,10 +135,12 @@ Output is similar to:
=back
=head1 FILES
/opt/xcat/bin/nodels
=head1 SEE ALSO
noderange(5)

View File

@ -336,7 +336,7 @@ Displays usage information.
\fR
.RE
.RS +9
Set up the SSH keys for the specified node list. Currently, this must be run on the management node in bypass mode (export XCATBYPASS=1).
Set up the SSH keys for the specified node list. Currently, this must be run on the management node in bypass mode. Run: XCATBYPASS=1 xdsh <noderange> -K
.RE
.RS +3
\fB-l | --user \fIuser_ID\fR

View File

@ -12,7 +12,7 @@ use Data::Dumper;
use xCAT::NodeRange;
use xCAT::Schema;
#use Getopt::Long qw(GetOptionsFromArray);
use Getopt::Long;
1;
@ -48,40 +48,40 @@ sub handled_commands
};
}
my %usage = (
nodech =>
"Usage: nodech <noderange> [table.column=value] [table.column=value] ...",
nodeadd =>
"Usage: nodeadd <noderange> [table.column=value] [table.column=value] ...",
noderm => "Usage: noderm <noderange>",
# Each cmd now returns its own usage inside its function
#my %usage = (
#nodech => "Usage: nodech <noderange> [table.column=value] [table.column=value] ...",
#nodeadd => "Usage: nodeadd <noderange> [table.column=value] [table.column=value] ...",
#noderm => "Usage: noderm <noderange>",
# the usage for tabdump is in the tabdump function
#tabdump => "Usage: tabdump <tablename>\n where <tablename> is one of the following:\n " . join("\n ", keys %xCAT::Schema::tabspec),
# the usage for tabrestore is in the tabrestore client cmd
#tabrestore => "Usage: tabrestore <tablename>.csv",
);
#);
#####################################################
# Process the command
#####################################################
sub process_request
{
use Getopt::Long;
#use Getopt::Long;
Getopt::Long::Configure("bundling");
Getopt::Long::Configure("pass_through");
#Getopt::Long::Configure("pass_through");
Getopt::Long::Configure("no_pass_through");
my $request = shift;
my $callback = shift;
my $nodes = $request->{node};
my $command = $request->{command}->[0];
my $args = $request->{arg};
unless ($args or $nodes or $request->{data})
{
if ($usage{$command})
{
$callback->({data => [$usage{$command}]});
return;
}
}
#unless ($args or $nodes or $request->{data})
#{
#if ($usage{$command})
#{
#$callback->({data => [$usage{$command}]});
#return;
#}
#}
if ($command eq "nodels")
{
@ -185,38 +185,32 @@ sub noderm
my $VERSION;
my $HELP;
sub noderm_usage
{
sub noderm_usage {
my $exitcode = shift @_;
my %rsp;
$rsp->{data}->[0] = "Usage:";
$rsp->{data}->[1] = " noderm [noderange] ";
$cb->($rsp);
push @{$rsp{data}}, "Usage:";
push @{$rsp{data}}, " noderm noderange";
push @{$rsp{data}}, " noderm {-v|--version}";
push @{$rsp{data}}, " noderm [-?|-h|--help]";
if ($exitcode) { $rsp{errorcode} = $exitcode; }
$cb->(\%rsp);
}
@ARGV = @{$args};
if (
!GetOptions('h|?|help' => \$HELP,
'v|version' => \$VERSION,)
)
{
&noderm_usage;
}
if (!GetOptions('h|?|help' => \$HELP, 'v|version' => \$VERSION) ) { noderm_usage(1); return; }
# Help
if ($HELP)
{
&noderm_usage;
return;
}
if ($HELP) { noderm_usage(0); return; }
# Version
if ($VERSION)
{
if ($VERSION) {
my %rsp;
$rsp->{data}->[0] = "2.0";
$cb->($rsp);
return;
}
if (!$nodes) { noderm_usage(1); return; }
# Build the argument list for using the -d option of nodech to do our work for us
my @tablist = ("-d");
foreach (keys %{xCAT::Schema::tabspec})
{
@ -485,55 +479,60 @@ sub nodech
my $addmode = shift;
my $VERSION;
my $HELP;
my $deletemode;
sub nodech_usage
{
my $exitcode = shift @_;
my $addmode = shift @_;
my $cmdname = $addmode ? 'nodeadd' : 'nodech';
my %rsp;
$rsp->{data}->[0] = "Usage:";
$rsp->{data}->[1] = " nodech <noderange> [table.column=value] [table.column=value] ...\n ";
$callback->($rsp);
if ($addmode) {
push @{$rsp{data}}, "Usage: $cmdname <noderange> groups=<groupnames> [table.column=value] [...]";
} else {
push @{$rsp{data}}, "Usage: $cmdname <noderange> table.column=value [...]";
push @{$rsp{data}}, " $cmdname {-d | --delete} <noderange> <table> [...]";
}
push @{$rsp{data}}, " $cmdname {-v | --version}";
push @{$rsp{data}}, " $cmdname [-? | -h | --help]";
if ($exitcode) { $rsp{errorcode} = $exitcode; }
$callback->(\%rsp);
}
@ARGV = @{$args};
if (
!GetOptions('h|?|help' => \$HELP,
'v|version' => \$VERSION,)
)
{
&nodech_usage;
my %options = ('h|?|help' => \$HELP, 'v|version' => \$VERSION);
if (!$addmode) { $options{'d|delete'} = \$deletemode; }
if (!GetOptions(%options)) {
nodech_usage(1, $addmode);
return;
}
# Help
if ($HELP)
{
&nodech_usage;
if ($HELP) {
nodech_usage(0, $addmode);
return;
}
# Version
if ($VERSION)
{
if ($VERSION) {
my %rsp;
$rsp->{data}->[0] = "2.0";
$callback->($rsp);
return;
}
# Note: the noderange comes through in $arg (and therefore @ARGV) for nodeadd,
# because it is linked to xcatclientnnr, since the nodes specified in the noderange
# do not exist yet. The nodech cmd is linked to xcatclient, so its noderange is
# put in $nodes instead of $args.
if (scalar(@ARGV) < (1+$addmode)) { nodech_usage(1, $addmode); return; }
if ($addmode)
{
my $idx = 0;
foreach my $arg (@$args)
{
unless ($arg =~ /^-/)
{
$nodes = [noderange($arg, 0)];
splice(@$args, $idx, 1);
last;
}
$idx++;
}
unless ($nodes)
{
$callback->({error => "No range to add detected\n"});
my $nr = shift @ARGV;
$nodes = [noderange($nr, 0)];
unless ($nodes) {
$callback->({error => "No noderange to add.\n",errorcode=>1});
return;
}
}
@ -542,51 +541,15 @@ sub nodech
my $temp;
my %tables;
my $tab;
my $deletemode;
#No GetOptionsFromArray...
#GetOptionsFromArray($args,"d|delete" => \$deletemode);
#print Dumper($deletemode);
foreach (@$args)
foreach (@ARGV)
{
if (m/^-/)
{ #A quick and dirty option parser in lieu of lacking Getoptinos
if (m/^--/)
{
if (m/--delete/)
{
$deletemode = 1;
next;
}
else
{
$callback->(
{data => ["ERROR: Malformed argument $_ ignored"]});
next;
}
}
else
{
if (m/^-d$/)
{
$deletemode = 1;
next;
}
else
{
$callback->(
{data => ["ERROR: Malformed argument $_ ignored"]});
next;
}
}
}
if ($deletemode)
{
if (m/[=\.]/)
if (m/[=\.]/) # in delete mode they can only specify tables names
{
$callback->(
{data => ["ERROR: . and = not valid in delete mode"]});
$callback->({error => [". and = not valid in delete mode."],errorcode=>1});
next;
}
$tables{$_} = 1;
@ -594,7 +557,7 @@ sub nodech
}
unless (m/=/)
{
$callback->({data => ["ERROR: Malformed argument $_ ignored"]});
$callback->({error => ["Malformed argument $_ ignored."],errorcode=>1});
next;
}
($temp, $value) = split('=', $_, 2);
@ -622,7 +585,10 @@ sub nodech
$callback->({error=>"$table.$column not a valid table.column description",errorcode=>[1]});
return;
}
$tables{$table}->{$column} = [$value, $op];
# Keep a list of the value/op pairs, in case there is more than 1 per table.column
#$tables{$table}->{$column} = [$value, $op];
push @{$tables{$table}->{$column}}, ($value, $op);
}
foreach $tab (keys %tables)
{
@ -641,60 +607,60 @@ sub nodech
#$tabhdl->setNodeAttribs($_,$tables{$tab});
my %uhsh;
my $node = $_;
foreach (keys %{$tables{$tab}})
foreach (keys %{$tables{$tab}}) # for each column specified for this table
{
my $op = $tables{$tab}->{$_}->[1];
my $val = $tables{$tab}->{$_}->[0];
my $key = $_;
if ($op eq '=')
{
$uhsh{$key} = $val;
}
elsif ($op eq ',=')
{ #splice assignment
my $cent = $tabhdl->getNodeAttribs($node, [$key]);
my $curval;
if ($cent) { $curval = $cent->{$key}; }
if ($curval)
{
my @vals = split(/,/, $curval);
unless (grep /^$val$/, @vals)
{
@vals = (@vals, $val);
my $newval = join(',', @vals);
$uhsh{$key} = $newval;
}
}
else
{
$uhsh{$key} = $val;
}
}
elsif ($op eq '^=')
{
my $cent = $tabhdl->getNodeAttribs($node, [$key]);
my $curval;
if ($cent) { $curval = $cent->{$key}; }
if ($curval)
{
my @vals = split(/,/, $curval);
if (grep /^$val$/, @vals)
{ #only bother if there
@vals = grep(!/^$val$/, @vals);
my $newval = join(',', @vals);
$uhsh{$key} = $newval;
}
} #else, what they asked for is the case alredy
#my $op = $tables{$tab}->{$_}->[1];
#my $val = $tables{$tab}->{$_}->[0];
my $valoppairs = $tables{$tab}->{$_};
while (scalar(@$valoppairs)) { # alternating list of value and op for this table.column
my $val = shift @$valoppairs;
my $op = shift @$valoppairs;
my $key = $_;
if ($op eq '=') {
$uhsh{$key} = $val;
}
elsif ($op eq ',=') { #splice assignment
my $curval = $uhsh{$key}; # in case it was already set
if (!defined($curval)) {
my $cent = $tabhdl->getNodeAttribs($node, [$key]);
if ($cent) { $curval = $cent->{$key}; }
}
if ($curval) {
my @vals = split(/,/, $curval);
unless (grep /^$val$/, @vals) {
@vals = (@vals, $val);
my $newval = join(',', @vals);
$uhsh{$key} = $newval;
}
} else {
$uhsh{$key} = $val;
}
}
elsif ($op eq '^=') {
my $curval = $uhsh{$key}; # in case it was already set
if (!defined($curval)) {
my $cent = $tabhdl->getNodeAttribs($node, [$key]);
if ($cent) { $curval = $cent->{$key}; }
}
if ($curval) {
my @vals = split(/,/, $curval);
if (grep /^$val$/, @vals) { #only bother if there
@vals = grep(!/^$val$/, @vals);
my $newval = join(',', @vals);
$uhsh{$key} = $newval;
}
} #else, what they asked for is the case alredy
}
} # end of while $valoppairs
} # end of foreach column specified for this table
}
}
if (keys %uhsh)
{
my @rc = $tabhdl->setNodeAttribs($node, \%uhsh);
if (not defined($rc[0]))
{
$callback->({error => "DB error " . $rc[1]});
$callback->({error => "DB error " . $rc[1],errorcode=>1});
}
}
}
@ -704,7 +670,7 @@ sub nodech
else
{
$callback->(
{data => ["ERROR: Unable to open table $tab in configuration"]}
{error => ["ERROR: Unable to open table $tab in configuration"],errorcode=>1}
);
}
}
@ -751,11 +717,12 @@ sub nodels
sub nodels_usage
{
my $exitcode = shift @_;
my %rsp;
$rsp->{data}->[0] = "Usage:";
$rsp->{data}->[1] = " nodels [-?|-h|--help] ";
$rsp->{data}->[2] = " nodels [-v|--version] ";
$rsp->{data}->[3] = " nodels [noderange] [table.attribute | shortname] ...";
push @{$rsp{data}}, "Usage:";
push @{$rsp{data}}, " nodels [noderange] [table.attribute | shortname] [...]";
push @{$rsp{data}}, " nodels {-v|--version}";
push @{$rsp{data}}, " nodels [-?|-h|--help]";
##### xcat 1.2 nodels usage:
# $rsp->{data}->[1]= " nodels [noderange] [group|pos|type|rg|install|hm|all]";
# $rsp->{data}->[2]= " ";
@ -767,24 +734,15 @@ sub nodels
# $rsp->{data}->[8]= " nodels [noderange] rg.{tftp|nfs_install|install_dir|serial}";
# $rsp->{data}->[9]= " rg.{usenis|install_roll|acct|gm|pbs}";
# $rsp->{data}->[10]=" rg.{access|gpfs|netdevice|prinic|all}";
$callback->($rsp);
if ($exitcode) { $rsp{errorcode} = $exitcode; }
$callback->(\%rsp);
}
@ARGV = @{$args};
if (
!GetOptions('h|?|help' => \$HELP,
'v|version' => \$VERSION,)
)
{
&nodels_usage;
}
if (!GetOptions('h|?|help' => \$HELP, 'v|version' => \$VERSION,) ) { nodels_usage(1); return; }
# Help
if ($HELP)
{
&nodels_usage;
return;
}
if ($HELP) { nodels_usage(0); return; }
# Version
if ($VERSION)