From cf7fef6f8f3f831ad1236d3f6979e6bbebfe2d29 Mon Sep 17 00:00:00 2001 From: nott Date: Thu, 28 Feb 2008 18:09:47 +0000 Subject: [PATCH] Changes to avoid keeping static group information in the nodegroup table. git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@618 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- perl-xCAT-2.0/xCAT/DBobjUtils.pm | 343 +++++++++++++++---------------- 1 file changed, 167 insertions(+), 176 deletions(-) diff --git a/perl-xCAT-2.0/xCAT/DBobjUtils.pm b/perl-xCAT-2.0/xCAT/DBobjUtils.pm index 6379ff956..dfd0cdd69 100644 --- a/perl-xCAT-2.0/xCAT/DBobjUtils.pm +++ b/perl-xCAT-2.0/xCAT/DBobjUtils.pm @@ -91,6 +91,26 @@ sub getObjectsOfType } + # if this is type "group" we need to check the nodelist table + my @nodeGroupList=(); + if ($type eq 'group') + { + my $table = "nodelist"; + my @TableRowArray = xCAT::DBobjUtils->getDBtable($table); + foreach (@TableRowArray) + { + my @tmplist = split(',', $_->{'groups'}); + push(@nodeGroupList, @tmplist); + } + foreach my $n (@nodeGroupList) + { + if (!grep(/^$n$/, @objlist) ) { + push(@objlist, $n); + } + } + } + + @{$::saveObjList{$type}} = @objlist; } @@ -130,16 +150,12 @@ sub getobjdefs %typehash = %$hash_ref; - @::foundTableList = (); - foreach my $objname (sort (keys %typehash)) { - # need a special case for the site table - for now !!!!! if ($typehash{$objname} eq 'site') { - my @TableRowArray = xCAT::DBobjUtils->getDBtable('site'); if (defined(@TableRowArray)) @@ -166,172 +182,155 @@ sub getobjdefs xCAT::MsgUtils->message("E", $rsp, $::callback); } next; - } - # see if we saved this from a previous call - if ($::saveObjHash{$objname}) + # need to refresh each time!! + # one process may update a table multiple times + # & this will have to be updated between each time + + # get data from DB + $type = $typehash{$objname}; + + # add the type to the hash for each object + $objhash{$objname}{'objtype'} = $type; + + # get the object type decription from Schema.pm + my $datatype = $xCAT::Schema::defspec{$type}; + + # get the key to look for, for this object type + my $objkey = $datatype->{'objkey'}; + + # get a list of valid attr names + # for this type object + foreach my $entry (@{$datatype->{'attrs'}}) { - - # use the one we saved - $objhash{$objname} = $::saveObjHash{$objname}; - + push(@{$attrlist{$type}}, $entry->{'attr_name'}); } - else + + # go through the list of valid attrs + foreach $this_attr (@{$datatype->{'attrs'}}) { + my $ent; - # get data from DB - $type = $typehash{$objname}; + my $attr = $this_attr->{attr_name}; - # add the type to the hash for each object - $objhash{$objname}{'objtype'} = $type; - - # get the object type decription from Schema.pm - my $datatype = $xCAT::Schema::defspec{$type}; - - # get the key to look for, for this object type - my $objkey = $datatype->{'objkey'}; - - # get a list of valid attr names - # for this type object - foreach my $entry (@{$datatype->{'attrs'}}) + # skip the key attr ??? + if ($attr eq $objkey) { - push(@{$attrlist{$type}}, $entry->{'attr_name'}); + next; } - # go through the list of valid attrs - foreach $this_attr (@{$datatype->{'attrs'}}) + # get table lookup info from Schema.pm + # !!!! some tables depend on the value of certain attrs + # we need to look up attrs in the correct order or we will + # not be able to determine what tables to look + # in for some attrs. + + if (exists($this_attr->{only_if})) { - my $ent; + my ($check_attr, $check_value) = split('\=', $this_attr->{only_if}); - my $attr = $this_attr->{attr_name}; + # if the object value is not the value we need + # to match then try the next only_if value + next if ( !($objhash{$objname}{$check_attr} =~ /\b$check_value\b/) ); + } - # skip the key attr ??? - if ($attr eq $objkey) + # OK - get the info needed to access the DB table + # - i.e. table name, key name, attr names + + # need the actual table attr name corresponding + # to the object attr name + # ex. noderes.nfsdir + my ($tab, $tabattr) = split('\.', $this_attr->{tabentry}); + + # 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"){ + next; + } + + # ex. 'nodelist.node', 'attr:node' + ($lookup_key, $lookup_value) = split('\=', $this_attr->{access_tabentry}); + + # ex. 'nodelist', 'node' + ($lookup_table, $lookup_attr) = split('\.', $lookup_key); + + # ex. 'attr', 'node' + ($lookup_type, $lookup_data) = split('\:', $lookup_value); + + # + # Get the attr values from the DB tables + # + + if ($lookup_attr eq 'node') + { + my $thistable; + my $needtocommit = 0; + + if ($::gettableref{$lookup_table}) { - next; + # if we already opened this table use the reference + $thistable = $::gettableref{$lookup_table}; } - - # get table lookup info from Schema.pm - # !!!! some tables depend on the value of certain attrs - # we need to look up attrs in the correct order or we will - # not be able to determine what tables to look - # in for some attrs. - - if (exists($this_attr->{only_if})) + else { - my ($check_attr, $check_value) = - split('\=', $this_attr->{only_if}); - - # if the object value is not the value we need - # to match then try the next only_if value - next if ( !($objhash{$objname}{$check_attr} =~ /\b$check_value\b/) ); - } - - # OK - get the info needed to access the DB table - # - i.e. table name, key name, attr names - - # need the actual table attr name corresponding - # to the object attr name - # ex. noderes.nfsdir - my ($tab, $tabattr) = split('\.', $this_attr->{tabentry}); - - # ex. 'nodelist.node', 'attr:node' - ($lookup_key, $lookup_value) = - split('\=', $this_attr->{access_tabentry}); - - # ex. 'nodelist', 'node' - ($lookup_table, $lookup_attr) = split('\.', $lookup_key); - - # ex. 'attr', 'node' - ($lookup_type, $lookup_data) = split('\:', $lookup_value); - - # - # Get the attr values from the DB tables - # - - if ($lookup_attr eq 'node') - { - - my $thistable; - my $needtocommit = 0; - - if ($::gettableref{$lookup_table}) - { - - # if we already opened this table use the reference - $thistable = $::gettableref{$lookup_table}; - } - else - { - - # open the table - $thistable = + # open the table + $thistable = xCAT::Table->new( $lookup_table, -create => 1, -autocommit => 0 ); - if (!$thistable) - { - - my %rsp; - $rsp->{data}->[0] = - "Could not get the \'$thistable\' table."; - xCAT::MsgUtils->message("E", $rsp, $::callback); - return undef; - } - - # look up attr values - my $ent; - $ent = $thistable->getNodeAttribs($objname, [$tabattr]); - - # create object hash $objhash{$objname}{$attr} - # - if the return is a reference and the - # attr val is defined - if (ref($ent) and defined $ent->{$tabattr}) - { - $objhash{$objname}{$attr} = $ent->{$tabattr}; - - } - $thistable->commit; - - # $::gettableref{$lookup_table} = $thistable; - } - - } - else - { - - # look up attr values - my @rows = xCAT::DBobjUtils->getDBtable($lookup_table); - if (defined(@rows)) - { - - foreach (@rows) - { - - - if ($_->{$lookup_attr} eq $objname) - { - - $objhash{$objname}{$attr} = $_->{$tabattr}; - } - } - } - else + if (!$thistable) { my %rsp; $rsp->{data}->[0] = - "Could not read the \'$lookup_table\' table from the xCAT database."; + "Could not get the \'$thistable\' table."; xCAT::MsgUtils->message("E", $rsp, $::callback); return undef; } + # look up attr values + my $ent; + $ent = $thistable->getNodeAttribs($objname, [$tabattr]); + + # create object hash $objhash{$objname}{$attr} + # - if the return is a reference and the + # attr val is defined + if (ref($ent) and defined $ent->{$tabattr}) + { + $objhash{$objname}{$attr} = $ent->{$tabattr}; + } + $thistable->commit; } } - $::saveObjHash{$objname} = $objhash{$objname}; + else + { + # look up attr values + my @rows = xCAT::DBobjUtils->getDBtable($lookup_table); + if (defined(@rows)) + { + foreach (@rows) + { + if ($_->{$lookup_attr} eq $objname) + { + $objhash{$objname}{$attr} = $_->{$tabattr}; + } + } + } + else + { + my %rsp; + $rsp->{data}->[0] = + "Could not read the \'$lookup_table\' table from the xCAT database."; + xCAT::MsgUtils->message("E", $rsp, $::callback); + return undef; + } + + } } + $::saveObjHash{$objname} = $objhash{$objname}; } return %objhash; } @@ -363,42 +362,23 @@ sub getDBtable my ($class, $table) = @_; my @rows = []; - # save this table info - in case this subr gets called multiple times - #if (exists($::TableHash{$table})) { + # need to refresh each time - don't cache! - if (grep(/^$table$/, @::foundTableList)) + # need to get info from DB + my $thistable = xCAT::Table->new($table, -create => 1, -autocommit => 0); + if (!$thistable) { - - # already have this - @rows = @{$::TableHash{$table}}; - + my %rsp; + $rsp->{data}->[0] = "Could not get the \'$table\' table."; + xCAT::MsgUtils->message("E", $rsp, $::callback); + return undef; } - else - { - # 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; - @rows = $thistable->getTable; + # !!!! this routine returns rows even if the table is empty!!!!!! - # !!!! 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; - } + $thistable->commit; if (defined(@rows)) { @@ -408,7 +388,6 @@ sub getDBtable { return undef; } - } #---------------------------------------------------------------------------- @@ -450,6 +429,14 @@ 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 + # the node definition + if ($type eq "group") { + next; + } # handle the site table as a special case !!!!! if ($type eq 'site') @@ -584,7 +571,7 @@ sub setobjdefs push(@{$attrlist{$type}}, $entry->{'attr_name'}); } -my @attrprovided=(); + my @attrprovided=(); # check FINALATTRS to see if all the attrs are valid foreach my $attr (keys %{$objhash{$objname}}) @@ -609,7 +596,6 @@ my @attrprovided=(); } next; } -#ndebug1 push(@attrprovided, $attr); } @@ -705,8 +691,13 @@ my @attrprovided=(); # add new to existing - at the end - comma separated if (defined($DBattrvals{$objname}{$attr_name})) { - $val = - "$DBattrvals{$objname}{$attr_name},$objhash{$objname}{$attr_name}"; + # if it's not already in the list! + if (!($DBattrvals{$objname}{$attr_name} =~ /\b$objhash{$objname}{$attr_name}\b/) ) + { + $val = "$DBattrvals{$objname}{$attr_name},$objhash{$objname}{$attr_name}"; + } else { + $val = "$DBattrvals{$objname}{$attr_name}"; + } } else { @@ -736,7 +727,7 @@ my @attrprovided=(); if (!grep(/^$i$/, @minusList)) { - # set new groups list for node + # set new list for node if (!$first) { $newlist .= ","; @@ -758,7 +749,7 @@ my @attrprovided=(); } # ex. nodetype = osi (attr=val or col = col value) - $updates{$::tabattr} = $val; + $updates{$::tabattr} = "$val"; if (ref($::settableref{$lookup_table})) {