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)
///