Author: jfthomps
Date: Tue Aug 18 18:23:28 2015
New Revision: 1696477

URL: http://svn.apache.org/r1696477
Log:
VCL-864 - selecting the first image id from the user's set of images can give 
an error when the user has no access to images

computer.php:
-modified AJsubmitDeleteComputers: use noimage as the image for the semaphore 
and call new function getAnyManagementNodeID to get management node id for 
semaphore
-modified AJsubmitCompStateChange: use noimage as the image for the semaphores 
and call new function getAnyManagementNodeID to get management node id for 
semaphores; removed other places that were getting the id of the noimage 
image/revision

requests.php: modified AJeditRequest: use id for noimage for $semimageid rather 
than just the first image a user has access to

utils.php:
-modified moveReservationsOffVMs: use id for noimage for $sem['imageid'] rather 
than just the first image a user has access to; use new function 
getAnyManagementNodeID to get id of management node instead of just using the 
first on the user has access to
-added getAnyManagementNodeID


Modified:
    vcl/trunk/web/.ht-inc/computer.php
    vcl/trunk/web/.ht-inc/requests.php
    vcl/trunk/web/.ht-inc/utils.php

Modified: vcl/trunk/web/.ht-inc/computer.php
URL: 
http://svn.apache.org/viewvc/vcl/trunk/web/.ht-inc/computer.php?rev=1696477&r1=1696476&r2=1696477&view=diff
==============================================================================
--- vcl/trunk/web/.ht-inc/computer.php (original)
+++ vcl/trunk/web/.ht-inc/computer.php Tue Aug 18 18:23:28 2015
@@ -3224,13 +3224,13 @@ class Computer extends Resource {
                $fails = array();
                $passes = array();
 
-               # get ids from getUserResources because that data should 
already be in cache
-               $resources = getUserResources(array("imageAdmin", 
"imageCheckOut"));
-               $tmp = array_keys($resources['image']);
-               $imageid = $tmp[0];
+               $imageid = getImageId('noimage');
                $revid = getProductionRevisionid($imageid);
-               $tmp = array_keys($resources['managementnode']);
-               $mnid = $tmp[0];
+               if(! ($mnid = getAnyManagementNodeID())) {
+                       $ret = array('status' => 'error', 'errormsg' => 'No 
management nodes are available for controlling the submitted computers.');
+                       sendJSON($ret);
+                       return;
+               }
 
                foreach($compids as $compid) {
                        if(retryGetSemaphore($imageid, $revid, $mnid, $compid, 
$startstamp, $endstamp))
@@ -3393,23 +3393,12 @@ class Computer extends Resource {
                             'clearselection' => 0,
                             'newstate' => $states[$newstateid],
                             'refreshcount' => 1);
-               # get ids from getUserResources because that data should 
already be in cache
-               $resources = getUserResources(array("imageAdmin", 
"imageCheckOut"));
-               $tmp = array_keys($resources['image']);
-               $semimageid = $tmp[0];
-               $semrevid = getProductionRevisionid($semimageid);
-               if(! empty($resources['managementnode'])) {
-                       $tmp = array_keys($resources['managementnode']);
-                       $semmnid = $tmp[0];
-               }
-               else {
-                       $allmns = array_keys(getManagementNodes('future'));
-                       if(empty($allmns)) {
-                               $ret = array('status' => 'error', 'errormsg' => 
'No management nodes are available for controlling the submitted computers.');
-                               sendJSON($ret);
-                               return;
-                       }
-                       $semmnid = $allmns[0];
+               $noimageid = getImageId('noimage');
+               $norevid = getProductionRevisionid($noimageid);
+               if(! ($semmnid = getAnyManagementNodeID())) {
+                       $ret = array('status' => 'error', 'errormsg' => 'No 
management nodes are available for controlling the submitted computers.');
+                       sendJSON($ret);
+                       return;
                }
 
                if($newstateid == 2) {
@@ -3613,7 +3602,7 @@ class Computer extends Resource {
                                cleanSemaphore();
                                $reloadstart = 
getCompFinalReservationTime($compid);
                                if($computers[$compid]['state'] == 
'vmhostinuse') {
-                                       $sem = array('imageid' => $semimageid, 
'revid' => $semrevid,
+                                       $sem = array('imageid' => $noimageid, 
'revid' => $norevid,
                                                     'mnid' => $semmnid, 
'start' => $semstart, 'end' => $semend);
                                        moveReservationsOffVMs($compid, $sem);
                                        cleanSemaphore();
@@ -3630,8 +3619,6 @@ class Computer extends Resource {
                                                        continue;
                                                }
                                                # schedule tomaintenance/tohpc 
reservations for VMs and host
-                                               $noimageid = 
getImageId('noimage');
-                                               $revid = 
getProductionRevisionid($noimageid);
                                                $startdt = 
unixToDatetime($reloadstart);
                                                $end = $reloadstart + 
SECINMONTH;
                                                $enddt = unixToDatetime($end);
@@ -3651,7 +3638,7 @@ class Computer extends Resource {
                                                                # leave 
existing tomaintenance reservation as is
                                                        }
                                                        # add tomaintenance 
reservation
-                                                       elseif(! 
simpleAddRequest($row['id'], $noimageid, $revid, $startdt,
+                                                       elseif(! 
simpleAddRequest($row['id'], $noimageid, $norevid, $startdt,
                                                                                
  $enddt, 18, $vclreloadid)) {
                                                                
cleanSemaphore();
                                                                $fails[] = 
$compid;
@@ -3669,7 +3656,7 @@ class Computer extends Resource {
                                                $start = $reloadstart + 300; # 
allow 5 minutes for VMs to get removed
                                                $startdt = 
unixToDatetime($start);
                                                # lock this computer
-                                               if(! 
retryGetSemaphore($semimageid, $semrevid, $semmnid, $compid, $startdt, $enddt)) 
{
+                                               if(! 
retryGetSemaphore($noimageid, $norevid, $semmnid, $compid, $startdt, $enddt)) {
                                                        cleanSemaphore();
                                                        $fails[] = $compid;
                                                        continue;
@@ -3685,7 +3672,7 @@ class Computer extends Resource {
                                                                
updateExistingToState($compid, $startdt, $tostateid);
                                                        # leave existing 
tomaintenance/tohpc reservation as is
                                                }
-                                               elseif(! 
simpleAddRequest($compid, $noimageid, $revid, $startdt,
+                                               elseif(! 
simpleAddRequest($compid, $noimageid, $norevid, $startdt,
                                                                          
$enddt, $tostateid, $vclreloadid)) {
                                                        cleanSemaphore();
                                                        $fails[] = $compid;
@@ -3717,13 +3704,11 @@ class Computer extends Resource {
                                                continue;
                                        }
                                        # computer has reservations, schedule 
tomaintenance
-                                       $noimageid = getImageId('noimage');
-                                       $revid = 
getProductionRevisionid($noimageid);
                                        $startdt = unixToDatetime($reloadstart);
                                        $end = $reloadstart + SECINMONTH;
                                        $enddt = unixToDatetime($end);
                                        # lock this computer
-                                       if(! retryGetSemaphore($semimageid, 
$semrevid, $semmnid, $compid, $startdt, $enddt)) {
+                                       if(! retryGetSemaphore($noimageid, 
$norevid, $semmnid, $compid, $startdt, $enddt)) {
                                                $fails[] = $compid;
                                                cleanSemaphore();
                                                continue;
@@ -3741,7 +3726,7 @@ class Computer extends Resource {
                                                        # leave existing 
tomaintenance/tohpc reservation as is
                                                        $reloadstart = 
$checkstart;
                                        }
-                                       elseif(! simpleAddRequest($compid, 
$noimageid, $revid, $startdt,
+                                       elseif(! simpleAddRequest($compid, 
$noimageid, $norevid, $startdt,
                                                                  $enddt, 
$tostateid, $vclreloadid)) {
                                                $fails[] = $compid;
                                                cleanSemaphore();
@@ -3757,7 +3742,7 @@ class Computer extends Resource {
                                # we may end up moving reservations to the 
computer later in the
                                # loop
                                # lock this computer
-                               if(! retryGetSemaphore($semimageid, $semrevid, 
$semmnid, $compid, $semstart, $semend)) {
+                               if(! retryGetSemaphore($noimageid, $norevid, 
$semmnid, $compid, $semstart, $semend)) {
                                        $fails[] = $compid;
                                        cleanSemaphore();
                                        continue;
@@ -3910,16 +3895,14 @@ class Computer extends Resource {
                                                if(! 
is_null($computers[$compid]['vmprofileid']) &&
                                                   array_key_exists($compid, 
$maintvmids) &&
                                                   count($maintvmids[$compid])) 
{
-                                                       $noimageid = 
getImageId('noimage');
-                                                       $revid = 
getProductionRevisionid($noimageid);
                                                        $reloadstart = $start + 
1800;
                                                        $reloadstartdt = 
unixToDatetime($reloadstart);
                                                        $end = $reloadstart + 
3600;
                                                        $enddt = 
unixToDatetime($end);
                                                        
foreach($maintvmids[$compid] as $vmid) {
-                                                               if(! 
retryGetSemaphore($semimageid, $semrevid, $semmnid, $vmid, $reloadstartdt, 
$enddt))
+                                                               if(! 
retryGetSemaphore($noimageid, $norevid, $semmnid, $vmid, $reloadstartdt, 
$enddt))
                                                                        
continue;
-                                                               
simpleAddRequest($vmid, $noimageid, $revid, $reloadstartdt,
+                                                               
simpleAddRequest($vmid, $noimageid, $norevid, $reloadstartdt,
                                                                                
 $enddt, 19, $vclreloadid);
                                                                # continue even 
if failed to schedule VM to be reloaded
                                                        }
@@ -3977,7 +3960,7 @@ class Computer extends Resource {
                                        
if($profiles[$computers[$compid]['vmprofileid']]['imageid'] !=
                                           $profiles[$profileid]['imageid']) {
                                                
if($computers[$compid]['provisioning'] != 'None') {
-                                                       $sem = array('imageid' 
=> $semimageid, 'revid' => $semrevid,
+                                                       $sem = array('imageid' 
=> $noimageid, 'revid' => $norevid,
                                                                     'mnid' => 
$semmnid, 'start' => $semstart, 'end' => $semend);
                                                        
moveReservationsOffVMs($compid, $sem);
                                                        cleanSemaphore();
@@ -3991,8 +3974,6 @@ class Computer extends Resource {
                                                                $start = 
getReloadStartTime();
                                                        else
                                                                $start = 
$reloadstart;
-                                                       $noimageid = 
getImageId('noimage');
-                                                       $revid = 
getProductionRevisionid($noimageid);
                                                        $startdt = 
unixToDatetime($start);
                                                        $end = $start + 
SECINWEEK;
                                                        $enddt = 
unixToDatetime($end);
@@ -4051,7 +4032,7 @@ class Computer extends Resource {
                                                                                
                $end = $start + SECINYEAR;
                                                                                
                $enddt = unixToDatetime($end);
                                                                                
                # lock this computer
-                                                                               
                if(! retryGetSemaphore($semimageid, $semrevid, $semmnid, 
$compid, $startdt, $enddt)) {
+                                                                               
                if(! retryGetSemaphore($noimageid, $norevid, $semmnid, $compid, 
$startdt, $enddt)) {
                                                                                
                        $fails[] = $compid;
                                                                                
                        continue;
                                                                                
                }
@@ -4077,7 +4058,7 @@ class Computer extends Resource {
                                                        }
                                                        
if(array_key_exists($compid, $allvmids)) {
                                                                
foreach($allvmids[$compid] as $vmid) {
-                                                                       $rc = 
simpleAddRequest($vmid, $noimageid, $revid, $startdt,
+                                                                       $rc = 
simpleAddRequest($vmid, $noimageid, $norevid, $startdt,
                                                                                
               $enddt, 19, $vclreloadid);
                                                                        if(! 
$rc) {
                                                                                
$fails[] = $compid;

Modified: vcl/trunk/web/.ht-inc/requests.php
URL: 
http://svn.apache.org/viewvc/vcl/trunk/web/.ht-inc/requests.php?rev=1696477&r1=1696476&r2=1696477&view=diff
==============================================================================
--- vcl/trunk/web/.ht-inc/requests.php (original)
+++ vcl/trunk/web/.ht-inc/requests.php Tue Aug 18 18:23:28 2015
@@ -3296,9 +3296,7 @@ function AJeditRequest() {
                        # get semaphore on each existing node in cluster so 
that nothing 
                        # can get moved to the nodes during this process
 
-                       $resources = getUserResources(array("imageAdmin", 
"imageCheckOut"));
-                       $tmp = array_keys($resources['image']);
-                       $semimageid = $tmp[0];
+                       $semimageid = getImageId('noimage');
                        $semrevid = getProductionRevisionid($semimageid);
                        $checkend = unixToDatetime($unixend + 900);
                        foreach($request["reservations"] as $res) {

Modified: vcl/trunk/web/.ht-inc/utils.php
URL: 
http://svn.apache.org/viewvc/vcl/trunk/web/.ht-inc/utils.php?rev=1696477&r1=1696476&r2=1696477&view=diff
==============================================================================
--- vcl/trunk/web/.ht-inc/utils.php (original)
+++ vcl/trunk/web/.ht-inc/utils.php Tue Aug 18 18:23:28 2015
@@ -5817,9 +5817,6 @@ function moveReservationsOffComputer($co
 /// for a VM after reservations have been moved off of it; must include these
 /// keys: imageid, revid, mnid, start (datetime), end (datetime)
 ///
-/// \return 0 if failed to move reservations, 1 if succeeded, -1 if no
-/// reservations were found on $compid
-///
 /// \brief attempts to move reservations off of any VMs assigned to a $compid
 /// NOTE - cleanSemaphore should be called after this by the calling function
 ///
@@ -5827,12 +5824,10 @@ function moveReservationsOffComputer($co
 function moveReservationsOffVMs($compid, $sem=0) {
        if(! is_array($sem)) {
                $sem = array();
-               $resources = getUserResources(array("imageAdmin", 
"imageCheckOut"));
-               $tmp = array_keys($resources['image']);
-               $sem['imageid'] = $tmp[0];
+               $sem['imageid'] = getImageId('noimage');
                $sem['revid'] = getProductionRevisionid($sem['imageid']);
-               $tmp = array_keys($resources['managementnode']);
-               $sem['mnid'] = $tmp[0];
+               if(! ($sem['mnid'] = getAnyManagementNodeID()))
+                       return;
                $sem['start'] = unixToDatetime(time());
                $sem['end'] = '2038-01-01 00:00:00';
        }
@@ -6904,6 +6899,30 @@ function getMnsFromImage($imageid) {
 }
 
 
////////////////////////////////////////////////////////////////////////////////
+///
+/// \fn getAnyManagementNodeID()
+///
+/// \return id of any management node available to user; 0 if none available
+///
+/// \brief finds a management node available to the user; primarily useful for
+/// getting an id to be used when getting a semaphore lock on a computer when
+/// the computer isn't actually going to be loaded as a result of the lock
+///
+////////////////////////////////////////////////////////////////////////////////
+function getAnyManagementNodeID() {
+       # try getting id from getUserResources because that data should already 
be in cache
+       $resources = getUserResources(array("imageCheckOut", "mgmtNodeAdmin"));
+       if(! empty($resources['managementnode'])) {
+               $tmp = array_keys($resources['managementnode']);
+               return $tmp[0];
+       }
+       $allmns = array_keys(getManagementNodes('future'));
+       if(empty($allmns))
+               return 0;
+       return $allmns[0];
+}
+
+////////////////////////////////////////////////////////////////////////////////
 ///
 /// \fn checkAvailableNetworks($ip)
 ///


Reply via email to