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
This commit is contained in:
parent
598b712fba
commit
cf7fef6f8f
@ -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}))
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user