You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vcl.apache.org by fa...@apache.org on 2009/06/04 16:51:06 UTC
svn commit: r781760 -
/incubator/vcl/trunk/managementnode/lib/VCL/blockrequest.pm
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 {