From 83bed2cb04e788cf9b26acc36002a1d6c51c1063 Mon Sep 17 00:00:00 2001 From: ligc Date: Thu, 21 Mar 2013 06:41:01 +0000 Subject: [PATCH] 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 --- perl-xCAT/xCAT/DBobjUtils.pm | 77 ++++++++++++++++ xCAT-client/pods/man1/chdef.1.pod | 6 ++ xCAT-client/pods/man1/mkdef.1.pod | 6 ++ xCAT-server/lib/xcat/plugins/DBobjectdefs.pm | 97 +++++++++++++++++++- 4 files changed, 183 insertions(+), 3 deletions(-) diff --git a/perl-xCAT/xCAT/DBobjUtils.pm b/perl-xCAT/xCAT/DBobjUtils.pm index 2ad64d399..027bcf0a6 100644 --- a/perl-xCAT/xCAT/DBobjUtils.pm +++ b/perl-xCAT/xCAT/DBobjUtils.pm @@ -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; diff --git a/xCAT-client/pods/man1/chdef.1.pod b/xCAT-client/pods/man1/chdef.1.pod index 65f60ce9b..65d35593d 100644 --- a/xCAT-client/pods/man1/chdef.1.pod +++ b/xCAT-client/pods/man1/chdef.1.pod @@ -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 diff --git a/xCAT-client/pods/man1/mkdef.1.pod b/xCAT-client/pods/man1/mkdef.1.pod index 95399259f..814ce99a3 100644 --- a/xCAT-client/pods/man1/mkdef.1.pod +++ b/xCAT-client/pods/man1/mkdef.1.pod @@ -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 diff --git a/xCAT-server/lib/xcat/plugins/DBobjectdefs.pm b/xCAT-server/lib/xcat/plugins/DBobjectdefs.pm index ce2e4660c..7203b1418 100644 --- a/xCAT-server/lib/xcat/plugins/DBobjectdefs.pm +++ b/xCAT-server/lib/xcat/plugins/DBobjectdefs.pm @@ -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}}) {