chdef,mkdef enhancements to support nic attributes

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@15602 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
This commit is contained in:
ligc 2013-03-21 06:41:01 +00:00
parent 079665a651
commit 83bed2cb04
4 changed files with 183 additions and 3 deletions

View File

@ -2676,4 +2676,81 @@ sub expandnicsattr()
return $ret;
}
#-------------------------------------------------------------------------------
=head3 collapsenicsattr
Collapse the nics related attributes into the database format,
for example,
nicsips.eth0=1.1.1.1|2.1.1.1
nicsips.eth1=3.1.1.1|4.1.1.1
the collapsed format:
nicsips=eth0!1.1.1.1|2.1.1.1,eth1!3.1.1.1|4.1.1.1
The collapse will be done against the hash %::FILEATTRS or %::CLIATTRS,
remove the nicips.thx attributes from %::FILEATTRS or %::CLIATTRS,
add the collapsed info nicips into %::FILEATTRS or %::CLIATTRS.
Arguments:
$::FILEATTRS{$objname} or $::CLIATTRS{$objname}
$objname
Returns:
None, update %::FILEATTRS or %::CLIATTRS directly
Error:
none
Example:
xCAT::DBobjUtils->collapsenicsattr($nodeattrhash);
Comments:
none
=cut
#-------------------------------------------------------------------------------
sub collapsenicsattr()
{
my $nodeattrhash = shift;
if (($nodeattrhash) && ($nodeattrhash =~ /xCAT::/))
{
$nodeattrhash = shift;
}
my $objname = shift;
my %nicattrs = ();
foreach my $nodeattr (keys %{$nodeattrhash})
{
# e.g nicips.eth0
# do not need to handle nic attributes without the postfix .ethx,
# it will be overwritten by the attributes with the postfix .ethx,
if ($nodeattr =~ /^(nic\w+)\.(\w+)$/)
{
if ($1 && $2)
{
# $nicattrs{nicips}{eth0} = "1.1.1.1|1.2.1.1"
$nicattrs{$1}{$2} = $nodeattrhash->{$nodeattr};
# remove nicips.eth0 from the %::FILEATTRS
delete $nodeattrhash->{$nodeattr};
}
}
}
# $nicattrs{'nicips'}{'eth0'} = "1.1.1.1|1.2.1.1"
# $nicattrs{'nicips'}{'eth1'} = "2.1.1.1|2.2.1.1"
foreach my $nicattr (keys %nicattrs)
{
my @tmparray = ();
foreach my $nicname (keys %{$nicattrs{$nicattr}})
{
# eth0!1.1.1.1|1.2.1.1
push @tmparray, "$nicname!$nicattrs{$nicattr}{$nicname}";
}
# eth0!1.1.1.1|1.2.1.1,eth1!2.1.1.1|2.2.1.1
$nodeattrhash->{$nicattr} = join(',', @tmparray);
}
}
1;

View File

@ -160,6 +160,12 @@ To change the policy table for policy number 7.0 for admin1
chdef -t policy -o 7.0 name=admin1 rule=allow
=item 11.
To change the node nic attributes
chdef -t node -o cn1 nicips.eth0="1.1.1.1|1.2.1.1" nicnetworks.eth0="net1|net2" nictypes.eth0="Ethernet"
=back

View File

@ -146,6 +146,12 @@ To create a entry (7.0) in the policy table for user admin1
mkdef -t policy -o 7.0 name=admin1 rule=allow
=item 11.
To create a node definition with nic attributes
mkdef -t node cn1 groups=all nicips.eth0="1.1.1.1|1.2.1.1" nicnetworks.eth0="net1|net2" nictypes.eth0="Ethernet"
=back

View File

@ -445,6 +445,26 @@ sub processArgs
}
}
if ((!$::opt_t || $::opt_t eq 'node') && ($::command eq 'chdef') && ($::opt_m || $::opt_p))
{
my $nicattrs = 0;
foreach my $kattr (keys %::ATTRS)
{
if ($kattr =~ /^nic\w+\.\w+$/)
{
$nicattrs = 1;
}
last;
}
if ($nicattrs)
{
my $rsp;
$rsp->{data}->[0] = "chdef does not support to change the nic related attributes with -m or -p flag.";
xCAT::MsgUtils->message("E", $rsp, $::callback);
return 3;
}
}
# Check arguments for rmdef command
# rmdef is very dangerous if wrong flag is specified
# it may cause all the objects to be deleted, check the flags
@ -1088,6 +1108,12 @@ sub defmk
# set the attrs from the attr=val pairs
foreach my $attr (keys %::ATTRS)
{
my $attrorig = $attr;
# nicips.eth0 => nicips
if ($attr =~ /^(nic\w+)\.\w+$/)
{
$attr = $1;
}
if (!grep(/^$attr$/, @list) && ($::objtype ne 'site') && ($::objtype ne 'monitoring'))
{
my $rsp;
@ -1100,12 +1126,12 @@ sub defmk
}
else
{
$::CLIATTRS{$objname}{$attr} = $::ATTRS{$attr};
$::CLIATTRS{$objname}{$attrorig} = $::ATTRS{$attrorig};
if ($::verbose)
{
my $rsp;
$rsp->{data}->[0] = "\nFunction: defmk-->set the attrs for each object definition";
$rsp->{data}->[1] = "defmk: objname=$objname, attr=$attr, value=$::ATTRS{$attr}";
$rsp->{data}->[1] = "defmk: objname=$objname, attr=$attrorig, value=$::ATTRS{$attrorig}";
xCAT::MsgUtils->message("I", $rsp, $::callback);
}
}
@ -1712,6 +1738,12 @@ sub defch
# set the attrs from the attr=val pairs
foreach my $attr (keys %::ATTRS)
{
my $attrorig = $attr;
# nicips.eth0 => nicips
if ($attr =~ /^(nic\w+)\.\w+$/)
{
$attr = $1;
}
if (!defined($list{$attr}) && ($::objtype ne 'site') && ($::objtype ne 'monitoring'))
{
my $rsp;
@ -1724,7 +1756,7 @@ sub defch
}
else
{
$::CLIATTRS{$objname}{$attr} = $::ATTRS{$attr};
$::CLIATTRS{$objname}{$attrorig} = $::ATTRS{$attrorig};
}
}
@ -2305,6 +2337,13 @@ sub setFINALattrs
next;
}
# special case for the nic* attributes
# merge nic*.eth0, nic*.eth1
if ($::FILEATTRS{$objname}{objtype} eq 'node')
{
xCAT::DBobjUtils->collapsenicsattr($::FILEATTRS{$objname}, $objname);
}
my $datatype =
$xCAT::Schema::defspec{$::FILEATTRS{$objname}{objtype}};
my @list;
@ -2350,6 +2389,58 @@ sub setFINALattrs
foreach my $objname (@::clobjnames)
{
# special case for the nic* attributes
# merge nic*.eth0, nic*.eth1
if ($::CLIATTRS{$objname}{objtype} eq 'node')
{
# Even if only the nicips.eth0 is specified with CLI,
# need to read the whole nicips attribute from the nics table,
# then merge the nicips.eth0 into the nicips attribute,
my %tmphash = ();
foreach my $nodeattr (keys %{$::CLIATTRS{$objname}})
{
if ($nodeattr =~ /^(nic\w+)\.\w+$/)
{
my $tmpnicattr = $1;
if (!defined($tmphash{$tmpnicattr}))
{
my $nicstable = xCAT::Table->new("nics", -create => 1, -autocommit => 0);
if (!$nicstable) {
my $rsp;
$rsp->{data}->[0] = "Could not open the \'nics\' table.";
xCAT::MsgUtils->message("E", $rsp, $::callback);
return 1;
}
my $nichash = $nicstable->getNodeAttribs($objname, [$tmpnicattr]);
if ($nichash && $nichash->{$tmpnicattr})
{
$tmphash{$tmpnicattr} = $nichash->{$tmpnicattr};
}
$nicstable->close();
}
}
}
# $tmphash{nicips} = "eth0!1.1.1.1|1.2.1.1,eth1!2.1.1.1|2.2.1.1"
foreach my $nicattr (keys %tmphash)
{
# eth0!1.1.1.1|1.2.1.1,eth1!2.1.1.1|2.2.1.1
my $nicval = $tmphash{$nicattr};
my @nicarray = split(/,/, $nicval);
foreach my $nicv (@nicarray)
{
my @nica = split(/!/, $nicv);
# put the additional nicips.eth1, nicips.eth2 into %::CLIATTRS
if (!defined $::CLIATTRS{$objname}{"$nicattr.$nica[0]"})
{
$::CLIATTRS{$objname}{"$nicattr.$nica[0]"} = $nica[1];
}
}
}
xCAT::DBobjUtils->collapsenicsattr($::CLIATTRS{$objname}, $objname);
}
foreach my $attr (keys %{$::CLIATTRS{$objname}})
{