From 50a4e0a81323c5112056dd3588577e9a9915e471 Mon Sep 17 00:00:00 2001 From: nott Date: Fri, 14 Mar 2008 17:11:21 +0000 Subject: [PATCH] Added getNetwkInfo. git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@784 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- perl-xCAT-2.0/xCAT/DBobjUtils.pm | 176 ++++++++++++++++++++++++++----- 1 file changed, 152 insertions(+), 24 deletions(-) diff --git a/perl-xCAT-2.0/xCAT/DBobjUtils.pm b/perl-xCAT-2.0/xCAT/DBobjUtils.pm index dfd0cdd69..e1774e6b1 100644 --- a/perl-xCAT-2.0/xCAT/DBobjUtils.pm +++ b/perl-xCAT-2.0/xCAT/DBobjUtils.pm @@ -16,6 +16,9 @@ use xCAT::Table; use xCAT::Utils; use xCAT::MsgUtils; +# IPv6 not yet implemented - need Socket6 +use Socket; + #---------------------------------------------------------------------------- =head3 getObjectsOfType @@ -150,6 +153,8 @@ sub getobjdefs %typehash = %$hash_ref; + @::foundTableList = (); + foreach my $objname (sort (keys %typehash)) { # need a special case for the site table - for now !!!!! @@ -184,9 +189,16 @@ sub getobjdefs next; } - # need to refresh each time!! - # one process may update a table multiple times - # & this will have to be updated between each time + # see if we saved this from a previous call + if ($::saveObjHash{$objname}) + { + + # use the one we saved + $objhash{$objname} = $::saveObjHash{$objname}; + + } + else + { # get data from DB $type = $typehash{$objname}; @@ -245,7 +257,7 @@ sub getobjdefs # don't try to get static group attrs from the nodegroup table # - don't support dynamic groups yet - #if (($tab eq "nodegroup") && ($objhash{$objname}{grouptype} eq "static") ) { + #if (($tab eq "nodegroup") && ($objhash{$objname}{grouptype} eq "static") ) if ($tab eq "nodegroup"){ next; } @@ -331,6 +343,8 @@ sub getobjdefs } } $::saveObjHash{$objname} = $objhash{$objname}; + + } # end if not cached } return %objhash; } @@ -362,31 +376,48 @@ sub getDBtable my ($class, $table) = @_; my @rows = []; - # need to refresh each time - don't cache! - - # need to get info from DB - my $thistable = xCAT::Table->new($table, -create => 1, -autocommit => 0); - if (!$thistable) + # save this table info - in case this subr gets called multiple times + if (grep(/^$table$/, @::foundTableList)) { - my %rsp; - $rsp->{data}->[0] = "Could not get the \'$table\' table."; - xCAT::MsgUtils->message("E", $rsp, $::callback); - return undef; - } - @rows = $thistable->getTable; + # already have this + @rows = @{$::TableHash{$table}}; - # !!!! this routine returns rows even if the table is empty!!!!!! - - $thistable->commit; - - if (defined(@rows)) - { - return @rows; } else { - return undef; + + # need to get info from DB + my $thistable = xCAT::Table->new($table, -create => 1, -autocommit => 0); + if (!$thistable) + { + my %rsp; + $rsp->{data}->[0] = "Could not get the \'$table\' table."; + xCAT::MsgUtils->message("E", $rsp, $::callback); + return undef; + } + + @rows = $thistable->getTable; + + # !!!! this routine returns rows even if the table is empty!!!!!! + + # keep track of the fact that we checked this table + # - even if it's empty! + push(@::foundTableList, $thistable->{tabname}); + + @{$::TableHash{$table}} = @rows; + + $thistable->commit; + + } # end if not cached + + if (defined(@rows)) + { + return @rows; + } + else + { + return undef; } } @@ -429,7 +460,6 @@ sub setobjdefs # get attr=val that are set in the DB ?? my $type = $objhash{$objname}{objtype}; - # my $grouptype = $objhash{$objname}{grouptype}; # don't add any group defs to the nodegroup table # - group info is stored in the nodelist table as part of @@ -1264,4 +1294,102 @@ sub getGroupMembers return $members; } +#---------------------------------------------------------------------------- + +=head3 getNetwkInfo + + Get the network info from the database for a list of nodes. + + Arguments: + Returns: + undef + hash ref - ex. $nethash{nodename}{networks attr name} = value + Globals: + Error: + Example: + + %nethash = xCAT::DBobjUtils->getNetwkInfo(\@targetnodes); + + Comments: + Not supporting IPv6 yet + +=cut + +#----------------------------------------------------------------------------- +sub getNetwkInfo +{ + my ($class, $ref_nodes) = @_; + my @nodelist = @$ref_nodes; + + my %nethash; + + # get the current list of network attrs (networks table columns) + my $datatype = $xCAT::Schema::defspec{'network'}; + foreach my $a (@{$datatype->{'attrs'}}) { + my $attr = $a->{attr_name}; + push(@attrnames, $attr); + } + + # read the networks table + my @TableRowArray = xCAT::DBobjUtils->getDBtable('networks'); + if (!defined(@TableRowArray)) + { + return undef; + } + + # for each node - get the network info + foreach my $node (@nodelist) + { + + # get, check, split the node IP + my $IP = inet_ntoa(inet_aton($node)); + chomp $IP; + unless ($IP =~ /\d+\.\d+\.\d+\.\d+/) + { + next; #Not supporting IPv6 yet + } + my ($ia, $ib, $ic, $id) = split('\.', $IP); + + # check the entries of the networks table + # - if the bitwise AND of the IP and the netmask gives you + # the "net" name then that is the entry you want. + foreach (@TableRowArray) { + my $NM = $_->{'mask'}; + my $net=$_->{'net'}; + chomp $NM; + chomp $net; + my ($n1, $n2, $n3, $n4) = split('\.', $net); + my ($na, $nb, $nc, $nd) = split('\.', $NM); + + # Convert to integers so the bitwise and (&) works correctly. + int $ia; + int $ib; + int $ic; + int $id; + int $na; + int $nb; + int $nc; + int $nd; + my $sa = ($ia & $na); + my $sb = ($ib & $nb); + my $sc = ($ic & $nc); + my $sd = ($id & $nd); + + # if all the octals match then we have the right network + if ( ($n1 == $sa) && ($n2 ==$sb) && ($n3 == $sc) && ($n4 == $sd) ) { + # fill in the hash - + foreach my $attr (@attrnames) { + if ( defined($_->{$attr}) ) { + $nethash{$node}{$attr} = $_->{$attr}; + } + } + next; + } + } + + } #end - for each node + + return %nethash; +} + 1;