Author: jfthomps
Date: Thu Feb 23 20:39:17 2012
New Revision: 1292943

URL: http://svn.apache.org/viewvc?rev=1292943&view=rev
Log:
VCL-383
make future reservations that would be part of a block allocation included in 
the block allocation

utils.php: modified isAvailable - added additional parameter that can be passed 
- $skipconcurrentcheck; if this is set to 1, it does not check the overlapping 
count for reservations of that image; when working with block allocations, it 
is often useful to call isAvailable for the block allocated time plus a leading 
reload amount, but then to only make the reservation for the leading reload 
time; this can cause an overlap for the check but not for the actual reservation

xmlrpcWrappers.php: modified XMLRPCprocessBlockTime - added code to look for 
any future reservations made by users in the user group associated with the 
block allocation for the same image; if so, try to include them in the block 
allocation to keep from tying up additional machines

Modified:
    incubator/vcl/trunk/web/.ht-inc/utils.php
    incubator/vcl/trunk/web/.ht-inc/xmlrpcWrappers.php

Modified: incubator/vcl/trunk/web/.ht-inc/utils.php
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/web/.ht-inc/utils.php?rev=1292943&r1=1292942&r2=1292943&view=diff
==============================================================================
--- incubator/vcl/trunk/web/.ht-inc/utils.php (original)
+++ incubator/vcl/trunk/web/.ht-inc/utils.php Thu Feb 23 20:39:17 2012
@@ -3644,7 +3644,7 @@ function getBlockAllocationIDs($user) {
 ///
 /// \fn isAvailable($images, $imageid, $imagerevisionid, $start, $end,
 ///                 $requestid, $userid, $ignoreprivileges, $forimaging, $ip,
-///                 $mac)
+///                 $mac, $skipconcurrentcheck)
 ///
 /// \param $images - array as returned from getImages
 /// \param $imageid - imageid from the image table
@@ -3665,6 +3665,8 @@ function getBlockAllocationIDs($user) {
 /// be a server profile reservation if defined
 /// \param $mac - (optional, default='') mac address to be assigned; assumed to
 /// be a server profile reservation if defined
+/// \param $skipconcurrentcheck (optional, default=0) - set to 1 to skip check
+/// for concurrent use of image; useful for setting up reload reservations
 ///
 /// \return -3 if unavailable due to an ip/mac conflict
 ///         -2 if specified time period is during a maintenance window
@@ -3678,7 +3680,7 @@ function getBlockAllocationIDs($user) {
 
////////////////////////////////////////////////////////////////////////////////
 function isAvailable($images, $imageid, $imagerevisionid, $start, $end,
                      $requestid=0, $userid=0, $ignoreprivileges=0,
-                     $forimaging=0, $ip='', $mac='') {
+                     $forimaging=0, $ip='', $mac='', $skipconcurrentcheck=0) {
        global $requestInfo;
        $requestInfo["start"] = $start;
        $requestInfo["end"] = $end;
@@ -3752,7 +3754,8 @@ function isAvailable($images, $imageid, 
                $ignorestates .= ",'reloading','reload','timeout','inuse'";
        foreach($requestInfo["images"] as $key => $imageid) {
                # check for max concurrent usage of image
-               if($images[$imageid]['maxconcurrent'] != NULL) {
+               if(! $skipconcurrentcheck && 
+                  $images[$imageid]['maxconcurrent'] != NULL) {
                        $compids = array();
                        $reloadid = getUserlistID('vclreload@Local');
                        $query = "SELECT rs.computerid "

Modified: incubator/vcl/trunk/web/.ht-inc/xmlrpcWrappers.php
URL: 
http://svn.apache.org/viewvc/incubator/vcl/trunk/web/.ht-inc/xmlrpcWrappers.php?rev=1292943&r1=1292942&r2=1292943&view=diff
==============================================================================
--- incubator/vcl/trunk/web/.ht-inc/xmlrpcWrappers.php (original)
+++ incubator/vcl/trunk/web/.ht-inc/xmlrpcWrappers.php Thu Feb 23 20:39:17 2012
@@ -1004,6 +1004,100 @@ function XMLRPCprocessBlockTime($blockTi
                             'errormsg' => 'invalid image associated with block 
allocation');
        }
 
+       $unixstart = datetimeToUnix($rqdata['start']);
+       $unixend = datetimeToUnix($rqdata['end']);
+       $revisionid = getProductionRevisionid($rqdata['imageid']);
+       $imgLoadTime = getImageLoadEstimate($rqdata['imageid']);
+       if($imgLoadTime == 0)
+               $imgLoadTime = $images[$rqdata['imageid']]['reloadtime'] * 60;
+       $vclreloadid = getUserlistID('vclreload@Local');
+       $groupmembers = getUserGroupMembers($rqdata['groupid']);
+       $userids = array_keys($groupmembers);
+
+       # add any computers from future reservations users in the group made
+       if(! empty($groupmembers)) {
+               ## find reservations by users
+               $allids = implode(',', $userids);
+               $query = "SELECT rq.id AS reqid, "
+                      .        "UNIX_TIMESTAMP(rq.start) AS start, "
+                      .        "rq.userid "
+                      . "FROM request rq, "
+                      .      "reservation rs "
+                      . "WHERE rs.requestid = rq.id AND "
+                      .       "rq.userid IN ($allids) AND "
+                      .       "rq.start < '{$rqdata['end']}' AND "
+                      .       "rq.end > '{$rqdata['start']}' AND "
+                      .       "rs.imageid = {$rqdata['imageid']} AND "
+                      .       "rs.computerid NOT IN (SELECT computerid "
+                      .                             "FROM blockComputers "
+                      .                             "WHERE blockTimeid = 
$blockTimesid)";
+               $qh = doQuery($query);
+               $donereqids = array();
+               $blockCompVals = array();
+               $checkstartbase = $unixstart - $imgLoadTime - 300;
+               $reloadstartbase = unixToDatetime($checkstartbase);
+               $rows = mysql_num_rows($qh);
+               while($row = mysql_fetch_assoc($qh)) {
+                       if(array_key_exists($row['reqid'], $donereqids))
+                               continue;
+                       $donereqids[$row['reqid']] = 1;
+                       if($row['start'] < datetimeToUnix($rqdata['start'])) {
+                               $checkstart = $row['start'] - $imgLoadTime - 
300;
+                               $reloadstart = unixToDatetime($checkstart);
+                               $reloadend = unixToDatetime($row['start']);
+                       }
+                       else {
+                               $checkstart = $checkstartbase;
+                               $reloadstart = $reloadstartbase;
+                               $reloadend = $rqdata['start'];
+                       }
+                       # check to see if computer is available for whole block
+                       $rc = isAvailable($images, $rqdata['imageid'], 
$revisionid, $checkstart,
+                                         $unixend, $row['reqid'], 
$row['userid'],
+                                         $ignoreprivileges, 0, '', '', 1);
+                       // if not available for whole block, just skip this one
+                       if($rc < 1)
+                               continue;
+                       $compid = $requestInfo['computers'][0];
+                       # create reload reservation
+                       $reqid = simpleAddRequest($compid, $rqdata['imageid'], 
$revisionid,
+                                                 $reloadstart, $reloadend, 19, 
$vclreloadid);
+                       if($reqid == 0)
+                               continue;
+                       # add to blockComputers
+                       $blockCompVals[] = "($blockTimesid, $compid, 
{$rqdata['imageid']}, $reqid)";
+                       # process any subimages
+                       for($key = 1; $key < count($requestInfo['computers']); 
$key++) {
+                               $subimageid = $requestInfo['images'][$key];
+                               $subrevid = 
getProductionRevisionid($subimageid);
+                               $compid = $requestInfo['computers'][$key];
+                               $mgmtnodeid = $requestInfo['mgmtnodes'][$key];
+                               $blockCompVals[] = "($blockTimesid, $compid, 
$subimageid, $reqid)";
+
+                               $query = "INSERT INTO reservation "
+                                                .        "(requestid, "
+                                                .        "computerid, "
+                                                .        "imageid, "
+                                                .        "imagerevisionid, "
+                                                .        "managementnodeid) "
+                                                . "VALUES "
+                                                .       "($reqid, "
+                                                .       "$compid, "
+                                                .       "$subimageid, "
+                                                .       "$subrevid, "
+                                                .       "$mgmtnodeid)";
+                               doQuery($query, 101);
+                       }
+               }
+               if(count($blockCompVals)) {
+                       $blockComps = implode(',', $blockCompVals);
+                       $query = "INSERT INTO blockComputers "
+                              .        "(blockTimeid, computerid, imageid, 
reloadrequestid) "
+                              . "VALUES $blockComps";
+                       doQuery($query);
+               }
+       }
+
        # check to see if all computers have been allocated
        $query = "SELECT COUNT(computerid) AS allocated "
               . "FROM blockComputers "
@@ -1020,19 +1114,23 @@ function XMLRPCprocessBlockTime($blockTi
        else
                $compsPerAlloc = 1;
        $toallocate = ($rqdata['numMachines'] * $compsPerAlloc) - 
$compCompleted;
-       if($toallocate == 0)
+       if($toallocate == 0) {
+               if(count($blockCompVals)) {
+                       return array('status' => 'success',
+                                    'allocated' => $rqdata['numMachines'],
+                                    'unallocated' => 0);
+               }
                return array('status' => 'completed');
+       }
        $reqToAlloc = $toallocate / $compsPerAlloc;
 
        if(! $ignoreprivileges) {
                # get userids in user group
-               $tmp = getUserGroupMembers($rqdata['groupid']);
-               if(empty($tmp)) {
+               if(empty($groupmembers)) {
                        return array('status' => 'error',
                                     'errorcode' => 11,
                                     'errormsg' => 'empty user group and 
ignoreprivileges set to 0');
                }
-               $userids = array_keys($tmp);
                # make length of $userids match $reqToAlloc by duplicating or 
trimming some users
                while($reqToAlloc > count($userids))
                        $userids = array_merge($userids, $userids);
@@ -1046,23 +1144,16 @@ function XMLRPCprocessBlockTime($blockTi
        $stagExtra = $reqToAlloc * 60;
 
        # determine estimated load time
-       $imgLoadTime = getImageLoadEstimate($rqdata['imageid']);
-       if($imgLoadTime == 0)
-               $imgLoadTime = $images[$rqdata['imageid']]['reloadtime'] * 60;
        $loadtime = $imgLoadTime + (10 * 60); # add 10 minute fudge factor
-       $unixstart = datetimeToUnix($rqdata['start']);
        if((time() + $loadtime + $stagExtra) > $unixstart) {
                $return['status'] = 'warning';
                $return['warningcode'] = 13;
                $return['warningmsg'] = 'possibly insufficient time to load 
machines';
        }
        $start = unixToDatetime($unixstart - $loadtime);
-       $unixend = datetimeToUnix($rqdata['end']);
 
        $userid = 0;
        $allocated = 0;
-       $vclreloadid = getUserlistID('vclreload@Local');
-       $revisionid = getProductionRevisionid($rqdata['imageid']);
        $blockCompVals = array();
        # FIXME (maybe) - if some subset of users in the user group have 
available
        # computers, but others do not, $allocated will be less than the desired


Reply via email to