Author: fapeeler
Date: Thu Jun  4 14:51:06 2009
New Revision: 781760

URL: http://svn.apache.org/viewvc?rev=781760&view=rev
Log:
VCL-15

Converted to use xmlrpc calls, eliminates duplication of code on
backend.

moved all sql queries to sub routines in utils. 



Modified:
    incubator/vcl/trunk/managementnode/lib/VCL/blockrequest.pm

Modified: incubator/vcl/trunk/managementnode/lib/VCL/blockrequest.pm
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/managementnode/lib/VCL/blockrequest.pm?rev=781760&r1=781759&r2=781760&view=diff
==============================================================================
--- incubator/vcl/trunk/managementnode/lib/VCL/blockrequest.pm (original)
+++ incubator/vcl/trunk/managementnode/lib/VCL/blockrequest.pm Thu Jun  4 
14:51:06 2009
@@ -75,7 +75,7 @@
 =cut
 
 sub initialize {
-       my $self                    = shift;
+       my $self = shift;
 
        # Initialize the database handle count
        $ENV{dbh_count} = 0;
@@ -88,18 +88,12 @@
                notify($ERRORS{'WARNING'}, 0, "unable to obtain a database 
handle for this state process");
        }
 
-
        # Store the name of this class in an environment variable
        $ENV{class_name} = ref($self);
 
        # Rename this process to include some request info
        rename_vcld_process($self->data);
 
-       # Call the old _initialize subroutine
-       if (!$self->_initialize()) {
-               return 0;
-       }
-
        notify($ERRORS{'OK'}, 0, "returning 1");
        return 1;
 
@@ -108,354 +102,6 @@
 =pod
 
////////////////////////////////////////////////////////////////////////////////
 ///
-/// \fn function _initialize
-///
-/// \param hash data structure of the referenced object
-///
-/// \return
-///
-/// \brief  collects data based this modules goals, sets up data structure
-///
-////////////////////////////////////////////////////////////////////////////////
-=cut
-
-sub _initialize {
-       my $self    = shift;
-       my $request = $self->data->get_blockrequest_data();
-       my ($package, $filename, $line) = caller;
-
-       # Create a new database handler
-       my $dbh = getnewdbh();
-
-       # Retrieve data from the data structure
-       my $blockrequest_id              = $self->data->get_blockrequest_id();
-       my $blockrequest_mode            = $self->data->get_blockrequest_mode();
-       my $blockrequest_image_id        = 
$self->data->get_blockrequest_image_id();
-       my $blockrequest_number_machines = 
$self->data->get_blockrequest_number_machines();
-       my $blockrequest_expire          = 
$self->data->get_blockrequest_expire();
-       my $blocktime_id                 = $self->data->get_blocktime_id();
-       my $blocktime_processed          = 
$self->data->get_blocktime_processed();
-       my $blocktime_start              = $self->data->get_blocktime_start();
-       my $blocktime_end                = $self->data->get_blocktime_end();
-
-       notify($ERRORS{'DEBUG'}, 0, "blockrequest id: $blockrequest_id");
-       notify($ERRORS{'DEBUG'}, 0, "blockrequest mode: $blockrequest_mode");
-       notify($ERRORS{'DEBUG'}, 0, "blockrequest image id: 
$blockrequest_image_id");
-       notify($ERRORS{'DEBUG'}, 0, "blockrequest number machines: 
$blockrequest_number_machines");
-       notify($ERRORS{'DEBUG'}, 0, "blockrequest expire: 
$blockrequest_expire");
-       notify($ERRORS{'DEBUG'}, 0, "blocktime id: $blocktime_id");
-       notify($ERRORS{'DEBUG'}, 0, "blocktime processed: 
$blocktime_processed");
-       notify($ERRORS{'DEBUG'}, 0, "blocktime start: $blocktime_start");
-       notify($ERRORS{'DEBUG'}, 0, "blocktime end: $blocktime_end");
-
-       sleep 2;
-
-       #record my process start time
-       $request->{"myprocessStart"} = convert_to_epoch_seconds();
-
-
-       # active db handle ?
-       if (!($dbh->ping)) {
-               notify($ERRORS{'WARNING'}, 0, "database handle died, trying to 
create another one");
-               $dbh = getnewdbh();
-               notify($ERRORS{'OK'},      0, "database handle re-est")     if 
($dbh->ping);
-               notify($ERRORS{'WARNING'}, 0, "database handle NOT re-set") if 
(!($dbh->ping));
-       }
-
-       #get the production imagerevision
-       my $imageselh = $dbh->prepare(
-               "SELECT ir.imagename,ir.id
-                                              FROM imagerevision ir
-                                              WHERE ir.production = 1 AND 
ir.imageid = ?") or notify($ERRORS{'WARNING'}, 0, "block request Could not 
prepare selecting production image from imagerevision" . $dbh->errstr());
-
-       $imageselh->execute($blockrequest_image_id) or 
notify($ERRORS{'WARNING'}, 0, "block request Could not execute selecting 
production image from imagerevision " . $dbh->errstr());
-       my $imagerows = $imageselh->rows;
-       my @imagerow;
-       if ($imagerows != 0) {
-               @imagerow                     = $imageselh->fetchrow_array;
-               $request->{"imagename"}       = $imagerow[0];
-               $request->{"imagerevisionid"} = $imagerow[1];
-               notify($ERRORS{'OK'}, 0, "collected production imagename 
imagerevisionid @imagerow $blockrequest_image_id");
-       }
-       else {
-               #warning no data for imageid
-               notify($ERRORS{'CRITICAL'}, 0, "no data from imagerevision 
table $blockrequest_image_id");
-               #preform more steps to prevent looping
-               return 0;
-       }
-
-       if ($blockrequest_mode eq "start") {
-               # find all nodes that can load/run requested image including 
those under other management nodes
-               # collect resourceid for this imageid
-               my $selh = $dbh->prepare(
-                       "SELECT r.id
-                                            FROM resource r, resourcetype rt
-                                            WHERE r.resourcetypeid = rt.id AND 
rt.name = ? AND r.subid = ?") or notify($ERRORS{'WARNING'}, 0, "block request 
Could not prepare select imageid resourceid" . $dbh->errstr());
-               $selh->execute("image", $blockrequest_image_id) or 
notify($ERRORS{'WARNING'}, 0, "block request Could not execute select imageid 
resourceid" . $dbh->errstr());
-               my $rows = $selh->rows;
-               my @row;
-               if ($rows != 0) {
-                       @row = $selh->fetchrow_array;
-                       $request->{"imageresourceid"} = $row[0];
-                       notify($ERRORS{'OK'}, 0, "collected resourceid $row[0] 
for imageid $blockrequest_image_id");
-               }
-               else {
-                       #warning no data for imageid
-                       notify($ERRORS{'CRITICAL'}, 0, "no resource id 
associated with imageid $blockrequest_image_id");
-                       #preform more steps to prevent looping
-                       return 0;
-               }
-               # collect resource groups this image is a member of
-               $selh = $dbh->prepare(
-                       "SELECT resourcegroupid
-                                          FROM resourcegroupmembers
-                                         WHERE resourceid = ?")                
                           or notify($ERRORS{'WARNING'}, 0, "Could not prepare 
select resource group membership resourceid" . $dbh->errstr());
-               $selh->execute($request->{imageresourceid}) or 
notify($ERRORS{'WARNING'}, 0, "Could not execute select resource group 
membership resourceid" . $dbh->errstr());
-               $rows = $selh->rows;
-               if ($rows != 0) {
-                       while (@row = $selh->fetchrow_array) {
-                               push(@{$request->{resourcegroups}}, $row[0]);
-                               notify($ERRORS{'OK'}, 0, "pushing image 
resource group $row[0] on list");
-                       }
-                       notify($ERRORS{'OK'}, 0, "complete list of image 
resource groups @{ $request->{resourcegroups} }");
-               }
-               else {
-                       #warning no data for imageid
-                       notify($ERRORS{'CRITICAL'}, 0, "image resource id 
$request->{imageresourceid} is not in any groups");
-                       #preform more steps to prevent looping
-                       return 0;
-               }
-
-               # active db handle ?
-               if (!($dbh->ping)) {
-                       notify($ERRORS{'WARNING'}, 0, "database handle died, 
trying to create another one");
-                       $dbh = getnewdbh();
-                       notify($ERRORS{'OK'},      0, "database handle re-est") 
    if ($dbh->ping);
-                       notify($ERRORS{'WARNING'}, 0, "database handle NOT 
re-set") if (!($dbh->ping));
-               }
-
-               #find mapping between image resource groups and computer groups
-               $selh = $dbh->prepare(
-                       "SELECT r.resourcegroupid2,r.resourcetypeid2
-                                             FROM resourcemap r, resourcetype 
rt
-                                             WHERE r.resourcetypeid1 = rt.id 
AND rt.name = ? AND r.resourcegroupid1 = ?") or notify($ERRORS{'WARNING'}, 0, 
"Could not prepare resource to computer group mapping" . $dbh->errstr());
-               foreach my $rgroupid (@{$request->{resourcegroups}}) {
-                       notify($ERRORS{'OK'}, 0, "fetching list of groups 
mapped to image resource group $rgroupid");
-                       $selh->execute("image", $rgroupid) or 
notify($ERRORS{'WARNING'}, 0, "Could not execute select resource group 
membership resourceid" . $dbh->errstr());
-                       $rows = $selh->rows;
-                       if ($rows != 0) {
-                               while (@row = $selh->fetchrow_array) {
-                                       
$request->{"computergroups"}->{$row[0]}->{"resourceid"}     = $row[0];
-                                       
$request->{"computergroups"}->{$row[0]}->{"resourcetypeid"} = $row[1];
-                                       notify($ERRORS{'OK'}, 0, "computer 
group= $row[0] can run image grpid= $rgroupid");
-                               }
-                       }
-                       else {
-                               #warning no data for mapped resources on 
resourcegroupid
-                               notify($ERRORS{'WARNING'}, 0, "no computer 
groups found for image resource groupid $rgroupid");
-                               #preform more steps to prevent looping
-                               #check next one
-
-                       }
-               } ## end foreach my $rgroupid (@{$request->{resourcegroups...
-                   # active db handle ?
-               if (!($dbh->ping)) {
-                       notify($ERRORS{'WARNING'}, 0, "database handle died, 
trying to create another one");
-                       $dbh = getnewdbh();
-                       notify($ERRORS{'OK'},      0, "database handle re-est") 
    if ($dbh->ping);
-                       notify($ERRORS{'WARNING'}, 0, "database handle NOT 
re-set") if (!($dbh->ping));
-               }
-               #who(Management Node) can control these computer group(s)
-               $selh = $dbh->prepare(
-                       "SELECT rg.resourceid
-                                          FROM resourcemap rm, 
resourcegroupmembers rg, resourcetype rt
-                                          WHERE rg.resourcegroupid = 
rm.resourcegroupid1 AND rm.resourcetypeid1 = rt.id AND rt.name = ? AND 
rm.resourcegroupid2 = ?") or notify($ERRORS{'WARNING'}, 0, "Could not prepare 
managment node owner of computer group" . $dbh->errstr());
-               #seperating statement about management node information
-               my $selhmn = $dbh->prepare(
-                       "SELECT 
r.subid,m.IPaddress,m.hostname,m.ownerid,s.name,m.lastcheckin
-                                                FROM resource r,managementnode 
m,resourcetype rt,state s
-                                              WHERE m.id = r.subid AND 
r.resourcetypeid = rt.id AND s.id = m.stateid AND rt.name = ? AND r.id = ?") or 
notify($ERRORS{'WARNING'}, 0, "Could not prepare managment node info statement" 
. $dbh->errstr());
-
-               foreach my $computergrpid (keys %{$request->{computergroups}}) {
-                       $selh->execute("managementnode", $computergrpid) or 
notify($ERRORS{'WARNING'}, 0, "Could not execute select resource group 
membership resourceid" . $dbh->errstr());
-                       $rows = $selh->rows;
-                       if ($rows != 0) {
-                               while (@row = $selh->fetchrow_array) {
-                                       
$request->{"computergroups"}->{$computergrpid}->{"controllingmnids"}->{$row[0]}->{"resourceid"}
 = $row[0];
-                                       notify($ERRORS{'OK'}, 0, "management 
node resourceid @row can control this computer grp $computergrpid");
-                                       $selhmn->execute("managementnode", 
$row[0]) or notify($ERRORS{'WARNING'}, 0, "Could not execute select management 
node info" . $dbh->errstr());
-                                       my $mrows = $selhmn->rows;
-                                       if ($mrows != 0) {
-                                               while (my @mrow = 
$selhmn->fetchrow_array) {
-                                                       
$request->{"computergroups"}->{$computergrpid}->{"controllingmnids"}->{$mrow[0]}->{"IPaddress"}
        = $mrow[1];
-                                                       
$request->{"computergroups"}->{$computergrpid}->{"controllingmnids"}->{$mrow[0]}->{"hostname"}
         = $mrow[2];
-                                                       
$request->{"computergroups"}->{$computergrpid}->{"controllingmnids"}->{$mrow[0]}->{"ownerid"}
          = $mrow[3];
-                                                       
$request->{"computergroups"}->{$computergrpid}->{"controllingmnids"}->{$mrow[0]}->{"state"}
            = $mrow[4];
-                                                       
$request->{"computergroups"}->{$computergrpid}->{"controllingmnids"}->{$mrow[0]}->{"lastcheckin"}
      = $mrow[5];
-                                                       
$request->{"computergroups"}->{$computergrpid}->{"controllingmnids"}->{$mrow[0]}->{"managementnodeid"}
 = $mrow[0];
-                                                       notify($ERRORS{'OK'}, 
0, "management node $mrow[2] can control computergroup $computergrpid");
-                                               }
-                                       } ## end if ($mrows != 0)
-                                       else {
-                                               #warning no data for mapped 
resources on resourcegroupid
-                                               notify($ERRORS{'CRITICAL'}, 0, 
"no management nodes listed controlling computer groupid $row[0] skipping this 
group");
-                                               #preform more steps to prevent 
looping
-                                       }
-                               } ## end while (@row = $selh->fetchrow_array)
-                       } ## end if ($rows != 0)
-                       else {
-                               #warning no data for mapped resources on 
resourcegroupid
-                               notify($ERRORS{'CRITICAL'}, 0, "no management 
nodes listed to control computer group id $computergrpid, attempting to remove 
from our local hash");
-                               #preform more steps to prevent looping
-                               #delete computergroupid from hash
-                               
delete($request->{computergroups}->{$computergrpid});
-                               if 
(!(exists($request->{computergroups}->{$computergrpid}))) {
-                                       notify($ERRORS{'OK'}, 0, "SUCCESSFULLY 
removed problem computer groupid from list");
-                               }
-                       } ## end else [ if ($rows != 0)
-               } ## end foreach my $computergrpid (keys 
%{$request->{computergroups...
-                   # active db handle ?
-               if (!($dbh->ping)) {
-                       notify($ERRORS{'WARNING'}, 0, "database handle died, 
trying to create another one");
-                       $dbh = getnewdbh();
-                       notify($ERRORS{'OK'},      0, "database handle re-est") 
    if ($dbh->ping);
-                       notify($ERRORS{'WARNING'}, 0, "database handle NOT 
re-set") if (!($dbh->ping));
-               }
-               #collect computer members of associated computer groups
-               $selh = $dbh->prepare(
-                       "SELECT 
c.id,c.hostname,c.IPaddress,s.name,c.currentimageid,c.type
-                                          FROM resourcetype rt, resource 
r,resourcegroupmembers rg,computer c,state s
-                                         WHERE s.id = c.stateid AND 
rg.resourceid = r.id AND r.subid = c.id AND r.resourcetypeid = rt.id AND 
rt.name = ? AND rg.resourcegroupid = ?") or notify($ERRORS{'WARNING'}, 0, 
"Could not prepare statement collect members of related computer groups" . 
$dbh->errstr());
-
-               #collect list of computers already in the blockcomputers table 
for this start time
-               my $bcselh = $dbh->prepare(
-                       "SELECT bc.computerid FROM blockComputers bc, 
blockTimes bt
-                                          WHERE bc.blockTimeid = bt.id AND 
bt.id != ? AND bt.start < ? AND bt.end > ?") or notify($ERRORS{'WARNING'}, 0, 
"Could not prepare statement collect members of related computer groups" . 
$dbh->errstr());
-               $bcselh->execute($blocktime_id, $blocktime_end, 
$blocktime_start) or notify($ERRORS{'WARNING'}, 0, "Could not execute 
blockcomputer lookup " . $dbh->errstr());
-               my $bcrows = $bcselh->rows;
-               if ($bcrows != 0) {
-                       my @bclist;
-                       while (@bclist = $bcselh->fetchrow_array) {
-                               $request->{"blockcomputerslist"}->{$bclist[0]} 
= 1;
-                       }
-               }
-
-               #collect OSname for image id
-               my $selhOS = $dbh->prepare(
-                       "SELECT o.name FROM OS o,image i
-                                              WHERE i.id = ?") or 
notify($ERRORS{'WARNING'}, 0, "Could not prepare statement for OS " . 
$dbh->errstr());
-               #sort through list of computers
-               foreach my $grpid (keys %{$request->{computergroups}}) {
-                       $selh->execute("computer", $grpid) or 
notify($ERRORS{'WARNING'}, 0, "Could not execute select computer members of 
group ids" . $dbh->errstr());
-                       $rows = $selh->rows;
-                       if ($rows != 0) {
-                               while (@row = $selh->fetchrow_array) {
-                                       
$request->{"computergroups"}->{computercount}++;
-                                       
$request->{"computergroups"}->{$grpid}->{"members"}->{$row[0]}->{"id"}        = 
$row[0];
-                                       
$request->{"computergroups"}->{$grpid}->{"members"}->{$row[0]}->{"hostname"}  = 
$row[1];
-                                       
$request->{"computergroups"}->{$grpid}->{"members"}->{$row[0]}->{"IPaddress"} = 
$row[2];
-                                       
$request->{"computergroups"}->{$grpid}->{"members"}->{$row[0]}->{"state"}     = 
$row[3];
-                                       if 
(exists($request->{"blockcomputerslist"}->{$row[0]})) {
-                                               notify($ERRORS{'OK'}, 0, 
"computer id $row[0] hostname $row[1] is in another block reservation");
-                                               $row[3] = "inuse";
-                                               
$request->{"computergroups"}->{$grpid}->{"members"}->{$row[0]}->{"state"} = 
$row[3];
-                                       }
-                                       if ($row[3] eq "available") {
-                                               notify($ERRORS{'OK'}, 0, 
"available machineid $row[0] hostname $row[1]");
-                                               
$request->{"availablemachines"}->{$row[0]}->{"id"}             = $row[0];
-                                               
$request->{"availablemachines"}->{$row[0]}->{"hostname"}       = $row[1];
-                                               
$request->{"availablemachines"}->{$row[0]}->{"IPaddress"}      = $row[2];
-                                               
$request->{"availablemachines"}->{$row[0]}->{"state"}          = $row[3];
-                                               
$request->{"availablemachines"}->{$row[0]}->{"currentimageid"} = $row[4];
-                                               
$request->{"availablemachines"}->{$row[0]}->{"type"}           = $row[5];
-                                               
$request->{"availablemachines"}->{$row[0]}->{"shortname"}      = $1 if ($row[1] 
=~ /([-_a-zA-Z0-9]*)\./);
-                                               #which management node should 
handle this -- in case there are more than one
-                                               my $mncount = 0;
-                                               foreach my $mnid (keys 
%{$request->{computergroups}->{$grpid}->{controllingmnids}}) {
-                                                       if 
($request->{computergroups}->{$grpid}->{controllingmnids}->{$mnid}->{managementnodeid})
 {
-                                                               $mncount++;
-                                                               
notify($ERRORS{'OK'}, 0, "setting MN to 
$request->{computergroups}->{$grpid}->{controllingmnids}->{$mnid}->{managementnodeid}
 for computerid $row[0]");
-                                                               
$request->{"availablemachines"}->{$row[0]}->{"managementnodeid"} = 
$request->{computergroups}->{$grpid}->{controllingmnids}->{$mnid}->{managementnodeid};
-
-                                                               if ($mncount > 
1) {
-                                                                       #need 
to figure out which one has less load
-                                                               }
-                                                       }
-                                               } ## end foreach my $mnid (keys 
%{$request->{computergroups...
-
-                                               if ($row[4] eq 
$blockrequest_image_id) {
-                                                       
push(@{$request->{preloadedlist}}, $row[0]);
-                                                       
$request->{"availablemachines"}->{$row[0]}->{"preloaded"} = 1;
-                                               }
-                                               else {
-                                                       
$request->{"availablemachines"}->{$row[0]}->{"preloaded"} = 0;
-                                               }
-                                               if ($row[5] =~ /lab/) {
-                                                       
$selhOS->execute($row[4]) or notify($ERRORS{'WARNING'}, 0, "Could not execute 
statement to collect OS info" . $dbh->errstr());
-                                                       my $OS;
-                                                       my $dbretval = 
$selhOS->bind_columns(\($OS));
-                                                       if ($selhOS->fetch) {
-                                                               
$request->{"availablemachines"}->{$row[0]}->{"OS"} = $OS;
-                                                       }
-                                               }
-                                       } ## end if ($row[3] eq "available")
-                               } ## end while (@row = $selh->fetchrow_array)
-                       } ## end if ($rows != 0)
-                       else {
-                               notify($ERRORS{'WARNING'}, 0, "possible empty 
group for groupid $grpid");
-                       }
-               } ## end foreach my $grpid (keys %{$request->{computergroups...
-                   #collect id for reload state and vclreload user
-               $selh = $dbh->prepare("SELECT s.id,u.id FROM state s,user u 
WHERE s.name= ? AND u.unityid=?") or notify($ERRORS{'WARNING'}, 0, "Could not 
prepare statement to find reload state" . $dbh->errstr());
-               $selh->execute("reload", "vclreload") or 
notify($ERRORS{'WARNING'}, 0, "Could not execute reload stateid fetch" . 
$dbh->errstr());
-               $rows = $selh->rows;
-               if ($rows != 0) {
-                       if (@row = $selh->fetchrow_array) {
-                               $request->{"reloadstateid"} = $row[0];
-                               $request->{"vclreloaduid"}  = $row[1];
-                       }
-               }
-               else {
-                       notify($ERRORS{'CRITICAL'}, 0, "reload state id or 
vclreload user id not found");
-               }
-       } ## end if ($blockrequest_mode eq "start")
-       elsif ($blockrequest_mode eq "end") {
-               #collect machines assigned for this blockRequest
-               my $selhandle = $dbh->prepare("SELECT computerid FROM 
blockComputers WHERE blockTimeid = ?") or notify($ERRORS{'WARNING'}, 0, "Could 
not prepare statement to collect computerids under blockTimesid" . 
$dbh->errstr());
-               $selhandle->execute($blocktime_id);
-               if (!$dbh->err) {
-                       notify($ERRORS{'OK'}, 0, "collected computer ids for 
block time $blocktime_id");
-               }
-               else {
-                       notify($ERRORS{'WARNING'}, 0, "could not execute 
statement collect computerid under blockTimesid" . $dbh->errstr());
-               }
-
-               my $rows = $selhandle->rows;
-               if (!$rows == 0) {
-                       while (my @row = $selhandle->fetchrow_array) {
-                               $request->{"blockComputers"}->{$row[0]}->{"id"} 
= $row[0];
-                       }
-               }
-               else {
-                       #strange -- no machines
-                       notify($ERRORS{'WARNING'}, 0, "mode= $blockrequest_mode 
no machines found for blockRequest $blockrequest_id blockTimesid $blocktime_id 
in blockTimes table");
-               }
-       } ## end elsif ($blockrequest_mode eq "end")  [ if ($blockrequest_mode 
eq "start")
-       elsif ($blockrequest_mode eq "expire") {
-               #just remove request entry from table
-
-       }
-       else {
-               #mode not set or mode
-               notify($ERRORS{'CRITICAL'}, 0, "mode not determined mode= 
$blockrequest_mode");
-       }
-
-       return 1;
-} ## end sub _initialize
-
-=pod
-////////////////////////////////////////////////////////////////////////////////
-///
 /// \fn sub process
 ///
 /// \param  hash
@@ -463,10 +109,8 @@
 /// \return  1, 0
 ///
 /// \brief start mode:
-///         sorts through list of computers, pull out machines that are not
-///         available or are inuse or already scheduled to be used
-///         based on the number of machines needed put machines into 
blockcomputers
-///         table and insert reload requests
+///         uses xml-rpc to call the web api to process block request
+//          event
 ///        end mode:
 ///         remove machines from blockComputers table for block request id X
 ///         reload ?
@@ -477,13 +121,9 @@
 =cut
 
 sub process {
-       my $self    = shift;
-       my $request = $self->data->get_blockrequest_data();
+       my $self = shift;
        my ($package, $filename, $line) = caller;
 
-       # Create a new database handler
-       my $dbh = getnewdbh();
-
        # Retrieve data from the data structure
        my $blockrequest_id              = $self->data->get_blockrequest_id();
        my $blockrequest_mode            = $self->data->get_blockrequest_mode();
@@ -495,6 +135,9 @@
        my $blocktime_start              = $self->data->get_blocktime_start();
        my $blocktime_end                = $self->data->get_blocktime_end();
 
+       #Set local timer
+       my $localtimer = convert_to_epoch_seconds();
+
        notify($ERRORS{'DEBUG'}, 0, "blockrequest id: $blockrequest_id");
        notify($ERRORS{'DEBUG'}, 0, "blockrequest mode: $blockrequest_mode");
        notify($ERRORS{'DEBUG'}, 0, "blockrequest image id: 
$blockrequest_image_id");
@@ -506,253 +149,75 @@
        notify($ERRORS{'DEBUG'}, 0, "blocktime end: $blocktime_end");
 
        if ($blockrequest_mode eq "start") {
-               #confirm preloaded list
-               if ($blocktime_processed) {
 
-                       notify($ERRORS{'WARNING'}, 0, "id $blockrequest_id has 
already been processed, pausing 60 seconds before reseting the processing 
flag");
-                       ##remove processing flag
-                       sleep 60;
-                       my $updatehdle = $dbh->prepare("UPDATE blockRequest SET 
processing = ? WHERE id = ?") or notify($ERRORS{'WARNING'}, 0, "Could not 
prepare update processing statement for end mode" . $dbh->errstr());
-                       $updatehdle->execute(0, $blockrequest_id) or 
notify($ERRORS{'WARNING'}, 0, "Could not execute update processing statement 
for end mode" . $dbh->errstr());
-                       notify($ERRORS{'OK'}, 0, "removed processing flag from 
blockrequest id $blockrequest_id");
-                       return 1;
-               } ## end if ($blocktime_processed)
-               $request->{"availmachinecount"} = 0;
-               # active db handle ?
-               if (!($dbh->ping)) {
-                       notify($ERRORS{'WARNING'}, 0, "database handle died, 
trying to create another one");
-                       $dbh = getnewdbh();
-                       notify($ERRORS{'OK'},      0, "database handle re-est") 
    if ($dbh->ping);
-                       notify($ERRORS{'WARNING'}, 0, "database handle NOT 
re-set") if (!($dbh->ping));
-               }
-
-               my $selh = $dbh->prepare(
-                       "SELECT r.id,r.start,r.end,s.name
-                                            FROM request r, reservation rs, 
state s
-                                            WHERE r.stateid = s.id AND 
rs.computerid = ?") or notify($ERRORS{'WARNING'}, 0, "Could not prepare 
statement for furture reservations checks of computer id " . $dbh->errstr());
-               #sort hash based on preloaded flag
-               foreach my $computerid (sort 
{$request->{availablemachines}->{$b}->{preloaded} eq '1'} keys 
%{$request->{availablemachines}}) {
-                       #confirm status of available machines
-                       notify($ERRORS{'OK'}, 0, "$computerid preload flag= 
$request->{availablemachines}->{$computerid}->{preloaded}");
-
-                       #can only check the machines under this MN control
-                       $request->{availablemachines}->{$computerid}->{"ok"} = 
0;
-                       my @status;
-                       if 
($request->{availablemachines}->{$computerid}->{type} =~ /blade/) {
-                               
$request->{availablemachines}->{$computerid}->{"on"} = 1;
-                       }
-                       elsif 
($request->{availablemachines}->{$computerid}->{type} =~ /lab/) {
-                               @status = 
virtual_status_unix($request->{availablemachines}->{$computerid}->{hostname}, 
$request->{availablemachines}->{$computerid}->{OS}, "linux", 
$request->{availablemachines}->{$computerid}->{IPaddress});
-                               if ($status[2]) {
-                                       
$request->{availablemachines}->{$computerid}->{"on"} = 1;
-                               }
-                       }
-                       elsif 
($request->{availablemachines}->{$computerid}->{type} =~ /virtualmachine/) {
-                               
$request->{availablemachines}->{$computerid}->{"on"} = 1;
-                       }
-                       notify($ERRORS{'OK'}, 0, "checking for future 
reservations for computerid $computerid");
-                       #check for future reservations
-                       $selh->execute($computerid) or 
notify($ERRORS{'WARNING'}, 0, "Could not execute statement for furture 
reservations checks of computer id $computerid" . $dbh->errstr());
-                       my $rows = $selh->rows;
-                       if (!$rows == 0) {
-                               my @row = $selh->fetchrow_array;
-                               #does blockrequest end time end before this 
reservations start time
-                               if ($row[3] =~ /new/) {
-                                       my $furture_start = 
convert_to_epoch_seconds($row[1]);
-                                       my $BRend         = 
convert_to_epoch_seconds($blocktime_end);
-                                       #is start greater than end by at least 
35 minutes -- to be safe?
-                                       if ((($furture_start - (35 * 60)) > 
$BRend)) {
-                                               #this one is ok
-                                               
$request->{availablemachines}->{$computerid}->{"ok"} = 1;
-                                               notify($ERRORS{'OK'}, 0, 
"setting ok flag for computerid $computerid");
-                                       }
-                                       else {
-                                               notify($ERRORS{'OK'}, 0, 
"$computerid not ok to use deleting from hash");
-                                               my $d = ($furture_start - (35 * 
60));
-                                               notify($ERRORS{'OK'}, 0, 
"furture_start $furture_start : BRend $BRend : delta $d");
-                                               #skip and remove from our list
-                                               #my $a = 
delete($request->{availablemachines}->{$computerid});
-                                               #next;
-                                               
$request->{availablemachines}->{$computerid}->{"ok"} = 0;
-                                       }
-                               } ## end if ($row[3] =~ /new/)
-                               else {
-                                       
$request->{availablemachines}->{$computerid}->{"ok"} = 0;
-                                       notify($ERRORS{'OK'}, 0, "NOT setting 
ok flag for computerid $computerid : listed in request $row[0] with state 
$row[3]");
-                               }
-                       } ## end if (!$rows == 0)
-                       else {
-                               #nothing scheduled for this computer id
-                               
$request->{availablemachines}->{$computerid}->{"ok"} = 1;
-                               notify($ERRORS{'OK'}, 0, " setting ok flag for 
computerid $computerid");
-                       }
-
-                       if ($request->{availablemachines}->{$computerid}->{on} 
&& $request->{availablemachines}->{$computerid}->{ok}) {
-                               # add to our master list
-                               $request->{"masterlist"}->{$computerid}->{"id"} 
             = $computerid;
-                               
$request->{"masterlist"}->{$computerid}->{"controllingMNid"} = 
$request->{availablemachines}->{$computerid}->{managementnodeid};
-                               #increment our count
-                               $request->{availmachinecount}++;
-                       }
-
-                       if ($request->{availmachinecount} > 
$blockrequest_number_machines) {
-                               #should end up with one extra machine
-                               last;
-                       }
-
-               } ## end foreach my $computerid (sort 
{$request->{availablemachines...
+               #update processed flag for request
+               if (update_blockTimes_processing($blocktime_id, 1)) {
+                       notify($ERRORS{'OK'}, 0, "updated process flag on 
blocktime_id= $blocktime_id");
+               }
 
-               #insert machines into Block computers
-               # insert reload request for machine
-               #one sanity check
-               if (!$request->{availmachinecount}) {
-                       #nothing  -- not good, complain
-                       notify($ERRORS{'CRITICAL'}, 0, "no machines where found 
or allocated for block request $blockrequest_id");
+               my $xmlcall = process_block_time($blocktime_id);
 
+               if ($xmlcall->{status} =~ /success/) {
+                       notify($ERRORS{'OK'}, 0, "success blockTimes id 
$blocktime_id processed and allocated $xmlcall->{allocated} nodes");
                }
-               if ($request->{availmachinecount} >= 
$blockrequest_number_machines) {
-                       #good they can get what they requested
+               elsif ($xmlcall->{status} =~ /completed/) {
+                       notify($ERRORS{'OK'}, 0, "success blockTimes id 
$blocktime_id already processed");
+               }
+               elsif ($xmlcall->{status} =~ /warning/) {
+                       my $warningmsg  = $xmlcall->{warningmsg}  if 
(defined($xmlcall->{warningmsg}));
+                       my $allocated   = $xmlcall->{allocated}   if 
(defined($xmlcall->{allocated}));
+                       my $unallocated = $xmlcall->{unallocated} if 
(defined($xmlcall->{unallocated}));
+                       notify($ERRORS{'CRITICAL'}, 0, "xmlrpc warning: 
$warningmsg allocated= $allocated unallocated= $unallocated");
+               }
+               elsif ($xmlcall->{status} =~ /error/) {
+                       my $errormsg = $xmlcall->{errormsg} if 
(defined($xmlcall->{errormsg}));
+                       notify($ERRORS{'CRITICAL'}, 0, "xmlrpc error on 
blockrequest_id=$blockrequest_id blocktime_id=$blocktime_id : $errormsg");
                }
                else {
-                       notify($ERRORS{'CRITICAL'}, 0, "Could not allocate 
number of requested machines for block request id $blockrequest_id . Only 
$request->{availmachinecount} are available, will give them those.");
+                       notify($ERRORS{'CRITICAL'}, 0, "xmlrpc status unknown 
status=  $xmlcall->{status} blockrequest_id=$blockrequest_id 
blocktime_id=$blocktime_id");
                }
-               # active db handle ?
-               if (!($dbh->ping)) {
-                       notify($ERRORS{'WARNING'}, 0, "database handle died, 
trying to create another one");
-                       $dbh = getnewdbh();
-                       notify($ERRORS{'OK'},      0, "database handle re-est") 
    if ($dbh->ping);
-                       notify($ERRORS{'WARNING'}, 0, "database handle NOT 
re-set") if (!($dbh->ping));
-               }
-               my $insertBC = $dbh->prepare("INSERT INTO blockComputers 
(blockTimeid,computerid) VALUES(?,?)") or notify($ERRORS{'WARNING'}, 0, "Could 
not prepare INSERT of blockcomputer table for start mode" . $dbh->errstr());
-
-               my $insertlog = $dbh->prepare("INSERT INTO log 
(userid,start,initialend,wasavailable,computerid,imageid) VALUES(?,?,?,?,?,?)") 
or notify($ERRORS{'WARNING'}, 0, "Could not prepare INSERT log entry " . 
$dbh->errstr());
-               my $lastinsertid;
-               my $insertsublog = $dbh->prepare("INSERT INTO sublog 
(logid,imageid,computerid) VALUES(?,?,?)") or notify($ERRORS{'WARNING'}, 0, 
"Could not prepare INSERT of sublog for reload mode" . $dbh->errstr());
-
-               my $insertrequest     = $dbh->prepare("INSERT INTO request 
(stateid,userid,laststateid,logid,start,end,daterequested) 
VALUES(?,?,?,?,?,?,?)")       or notify($ERRORS{'WARNING'}, 0, "Could not 
prepare INSERT of request for reload mode" . $dbh->errstr());
-               my $insertreservation = $dbh->prepare("INSERT INTO reservation 
(requestid,computerid,imageid,imagerevisionid,managementnodeid) VALUES 
(?,?,?,?,?)") or notify($ERRORS{'WARNING'}, 0, "Could not prepare INSERT of 
reservation for reload mode" . $dbh->errstr());
-
-
-               # $request->masterlist should contain a list of machines we can 
allocate
-               notify($ERRORS{'OK'}, 0, "number of available machines= 
$request->{availmachinecount}");
-
-               #do this in two or more loops
-               foreach my $computerid (keys %{$request->{masterlist}}) {
-                       $insertBC->execute($blocktime_id, 
$request->{masterlist}->{$computerid}->{id}) or notify($ERRORS{'WARNING'}, 0, 
"Could not execute blockcomputers INSERT statement for computerid $computerid 
under blockrequest id $blockrequest_id" . $dbh->errstr());
-                       notify($ERRORS{'OK'}, 0, "Inserted computerid 
$computerid blockTimesid $blocktime_id into blockcomputers table for block 
request $blockrequest_id");
-               }
-
-               foreach my $compid (keys %{$request->{masterlist}}) {
-                       # set start to be 35 minutes prior to start time
-                       # convert to epoch time
-                       my $starttimeepoch = 
convert_to_epoch_seconds($blocktime_start);
-                       #subtract 35 minutes from start time
-                       $starttimeepoch = ($starttimeepoch - (35 * 60));
-                       #convert back to datetime
-                       my $starttime = convert_to_datetime($starttimeepoch);
-                       #set to nearest 15 minute mark
-                       my $start = timefloor15interval($starttime);
-                       #set end time
-                       my $Eend = ($starttimeepoch + (15 * 60));
-                       my $end = convert_to_datetime($Eend);
-                       notify($ERRORS{'OK'}, 0, "blockstart= $blocktime_start 
reloadstart= $start reloadend= $end");
-                       #insert into log and sublog
-                       $insertlog->execute($request->{vclreloaduid}, $start, 
$end, 1, $compid, $blockrequest_image_id) or notify($ERRORS{'WARNING'}, 0, 
"Could not execute log entry" . $dbh->errstr());
-                       #get last insertid
-                       $lastinsertid = $dbh->{'mysql_insertid'};
-                       notify($ERRORS{'OK'}, 0, "lastinsertid for log entry is 
$lastinsertid");
-                       $request->{masterlist}->{$compid}->{"logid"} = 
$lastinsertid;
-                       #insert sublog entry
-                       $insertsublog->execute($lastinsertid, 
$blockrequest_image_id, $request->{masterlist}->{$compid}->{id}) or 
notify($ERRORS{'WARNING'}, 0, "Could not execute sublog entry" . 
$dbh->errstr());
-                       $lastinsertid = 0;
-                       #insert reload request
-                       $insertrequest->execute($request->{reloadstateid}, 
$request->{vclreloaduid}, $request->{reloadstateid}, 
$request->{masterlist}->{$compid}->{logid}, $start, $end, $start) or 
notify($ERRORS{'WARNING'}, 0, "Could not prepare INSERT of request for reload 
mode" . $dbh->errstr());
-                       #fetch request insert id
-                       $lastinsertid = $dbh->{'mysql_insertid'};
-                       notify($ERRORS{'OK'}, 0, "lastinsertid for request 
entry is $lastinsertid");
-                       $request->{masterlist}->{$compid}->{"requestid"} = 
$lastinsertid;
-                       #insert reservation
-                       $insertreservation->execute($lastinsertid, 
$request->{masterlist}->{$compid}->{id}, $blockrequest_image_id, 
$request->{imagerevisionid}, 
$request->{masterlist}->{$compid}->{controllingMNid}) or 
notify($ERRORS{'WARNING'}, 0, "Could not execute reservation entry" . 
$dbh->errstr());
-               } ## end foreach my $compid (keys %{$request->{masterlist...
-
-               #update processed flag for request
-               my $updatetimes = $dbh->prepare("UPDATE blockTimes SET 
processed=? WHERE id =?") or notify($ERRORS{'WARNING'}, 0, "Could not prepare 
INSERT of blockcomputer table for start mode " . $dbh->errstr());
-               $updatetimes->execute(1, $blocktime_id) or 
notify($ERRORS{'WARNING'}, 0, "could not execute update processing flag on 
blockRequest id $blockrequest_id " . $dbh->errstr());
-
 
                #pause
-               if (pauseprocessing($request->{myprocessStart})) {
+               if (pauseprocessing($localtimer)) {
                        notify($ERRORS{'OK'}, 0, "past check window for this 
request, -- ok to proceed");
                }
-               # active db handle ?
-               if (!($dbh->ping)) {
-                       notify($ERRORS{'WARNING'}, 0, "database handle died, 
trying to create another one");
-                       $dbh = getnewdbh();
-                       notify($ERRORS{'OK'},      0, "database handle re-est") 
    if ($dbh->ping);
-                       notify($ERRORS{'WARNING'}, 0, "database handle NOT 
re-set") if (!($dbh->ping));
-               }
 
-               #remove processing flag
-               my $update = $dbh->prepare("UPDATE blockRequest SET processing 
= ? WHERE id = ?") or notify($ERRORS{'WARNING'}, 0, "Could not prepare INSERT 
of blockcomputer table for start mode " . $dbh->errstr());
-               $update->execute(0, $blockrequest_id);
-               if (!$dbh->errstr()) {
-                       notify($ERRORS{'OK'}, 0, "updated processing flag on 
blockRequest $blockrequest_id to 0");
-               }
-               else {
-                       notify($ERRORS{'WARNING'}, 0, "failed to update 
processing flag on blockRequest $blockrequest_id to 0: " . $dbh->errstr());
+               if (update_blockrequest_processing($blockrequest_id, 0)) {
+                       notify($ERRORS{'OK'}, 0, "Removed processing flag on 
blockrequest_id $blockrequest_id");
                }
 
        } ## end if ($blockrequest_mode eq "start")
        elsif ($blockrequest_mode eq "end") {
-               # active db handle ?
-               if (!($dbh->ping)) {
-                       notify($ERRORS{'WARNING'}, 0, "database handle died, 
trying to create another one");
-                       $dbh = getnewdbh();
-                       notify($ERRORS{'OK'},      0, "database handle re-est") 
    if ($dbh->ping);
-                       notify($ERRORS{'WARNING'}, 0, "database handle NOT 
re-set") if (!($dbh->ping));
-               }
-
                # remove blockTime entry for this request
-               #
-               my $delhandle = $dbh->prepare("DELETE blockTimes FROM 
blockTimes WHERE id = ?") or notify($ERRORS{'WARNING'}, 0, "Could not prepare 
DELETE blockTimes under id $blockrequest_id" . $dbh->errstr());
-               $delhandle->execute($blocktime_id) or 
notify($ERRORS{'WARNING'}, 0, "Could not prepare DELETE blockcomputers under id 
$blockrequest_id" . $dbh->errstr());
-               notify($ERRORS{'OK'}, 0, "removed blockTimes id $blocktime_id 
from blockTimes table");
-
-               $delhandle = $dbh->prepare("DELETE blockComputers FROM 
blockComputers WHERE blockTimeid = ? AND computerid = ?") or 
notify($ERRORS{'WARNING'}, 0, "Could not prepare DELETE blockcomputers under id 
$blockrequest_id" . $dbh->errstr());
-               # remove each computer in order to reload blades
-               foreach my $computerid (keys %{$request->{"blockComputers"}}) {
-                       #remove machines from blockComputers table for block 
request id X
-                       $delhandle->execute($blocktime_id, 
$request->{blockComputers}->{$computerid}->{id}) or notify($ERRORS{'WARNING'}, 
0, "Could not prepare DELETE blockcomputers under id $blockrequest_id" . 
$dbh->errstr());
-                       notify($ERRORS{'OK'}, 0, "removed block computerid 
$computerid from blockComputers table for blockTimeid $blocktime_id");
-
-                       #reload blades
-                       #call get next image -- placeholder
-
+               if (clear_blockComputers($blocktime_id)) {
+                       notify($ERRORS{'OK'}, 0, "Removed computers from 
blockComputers table for blocktime_id=$blocktime_id");
                }
-               #check expire time also, if this was the last blockTimes entry 
then this is likely the expiration time as well
+               if (clear_blockTimes($blocktime_id)) {
+                       notify($ERRORS{'OK'}, 0, "Removed 
blocktime_id=$blocktime_id from blockTimes table");
+               }
+
+               #check expire time, if this was the last blockTimes entry then 
this is likely the expiration time as well
                my $status = check_blockrequest_time($blocktime_start, 
$blocktime_end, $blockrequest_expire);
                if ($status eq "expire") {
                        #fork start processing
-                       notify($ERRORS{'OK'}, 0, "this is expire time also");
-                       #just remove blockRequest entry from BlockRequest table
-                       my $delhandle = $dbh->prepare("DELETE blockRequest FROM 
blockRequest WHERE id = ?") or notify($ERRORS{'WARNING'}, 0, "Could not prepare 
DELETE blockRequest id $blockrequest_id " . $dbh->errstr());
-                       $delhandle->execute($blockrequest_id) or 
notify($ERRORS{'WARNING'}, 0, "Could not execute DELETE blcokRequest id 
$blockrequest_id " . $dbh->errstr());
-                       notify($ERRORS{'OK'}, 0, "blockRequest id 
$blockrequest_id has expired and was removed from the database");
+                       notify($ERRORS{'OK'}, 0, "Block Request 
$blockrequest_id has expired");
+                       if (delete_block_request($blockrequest_id)) {
+                               notify($ERRORS{'OK'}, 0, "Removed blockRequest 
id $blockrequest_id");
+                       }
                        return 1;
                }
 
                ##remove processing flag
-               my $updatehdle = $dbh->prepare("UPDATE blockRequest SET 
processing = ? WHERE id = ?") or notify($ERRORS{'WARNING'}, 0, "Could not 
prepare update processing statement for end mode" . $dbh->errstr());
-               $updatehdle->execute(0, $blockrequest_id) or 
notify($ERRORS{'WARNING'}, 0, "Could not execute update processing statement 
for end mode" . $dbh->errstr());
-               notify($ERRORS{'OK'}, 0, "removed processing flag from 
blockrequest id $blockrequest_id");
+               if (update_blockrequest_processing($blockrequest_id, 0)) {
+                       notify($ERRORS{'OK'}, 0, "Removed processing flag on 
blockrequest_id $blockrequest_id");
+               }
 
        } ## end elsif ($blockrequest_mode eq "end")  [ if ($blockrequest_mode 
eq "start")
        elsif ($blockrequest_mode eq "expire") {
-               #there should not be any blockTimes entries for this request
-               #just remove blockRequest entry from BlockRequest table
-               my $delhandle = $dbh->prepare("DELETE blockRequest FROM 
blockRequest WHERE id = ?") or notify($ERRORS{'WARNING'}, 0, "Could not prepare 
DELETE blockRequest id $blockrequest_id " . $dbh->errstr());
-               $delhandle->execute($blockrequest_id) or 
notify($ERRORS{'WARNING'}, 0, "Could not execute DELETE blcokRequest id 
$blockrequest_id " . $dbh->errstr());
-               notify($ERRORS{'OK'}, 0, "blockRequest id $blockrequest_id has 
expired and was removed from the database");
+               notify($ERRORS{'OK'}, 0, "Block Request $blockrequest_id has 
expired");
+               if (delete_block_request($blockrequest_id)) {
+                       notify($ERRORS{'OK'}, 0, "Removed blockRequest id 
$blockrequest_id");
+               }
                return 1;
        }
        else {


Reply via email to