Modified: vcl/trunk/web/.ht-inc/vm.php URL: http://svn.apache.org/viewvc/vcl/trunk/web/.ht-inc/vm.php?rev=1624325&r1=1624324&r2=1624325&view=diff ============================================================================== --- vcl/trunk/web/.ht-inc/vm.php (original) +++ vcl/trunk/web/.ht-inc/vm.php Thu Sep 11 16:01:48 2014 @@ -31,6 +31,7 @@ function editVMInfo() { print "<h2>Manage Virtual Hosts</h2>\n"; $profiles = getVMProfiles(); + uasort($profiles, 'sortKeepIndex'); if(checkUserHasPerm('Manage VM Profiles')) { print "<div id=\"mainTabContainer\" dojoType=\"dijit.layout.TabContainer\"\n"; print " style=\"width:650px;height:600px\">\n"; @@ -554,7 +555,6 @@ function updateVMlimit() { } $resources = getUserResources(array("computerAdmin"), array("administer")); if(! array_key_exists($data[$vmhostid]['computerid'], $resources['computer'])) { - print "alert('You do not have access to manage this host.');"; $rc = array('status' => 'ERROR', 'msg' => "You do not have access to manage this host."); sendJSON($rc); @@ -718,6 +718,7 @@ function AJvmFromHost() { } # try to remove reservations off of computer moveReservationsOffComputer($compid); + cleanSemaphore(); # check for unmovable or active reservations $query = "SELECT DATE_FORMAT(rq.end, '%l:%i%p %c/%e/%y') AS end, " @@ -960,19 +961,19 @@ function AJupdateVMprofileItem() { $item = mysql_real_escape_string($item); $profile = getVMProfiles($profileid); - if($item == 'password' && $profile[$profileid]['rsapub']){ - $encrypted = encryptDataAsymmetric($newvalue, $profile[$profileid]['rsapub']); - $escaped = mysql_real_escape_string($encrypted); - $query = "UPDATE vmprofile " - . "SET `encryptedpasswd` = '$escaped' " - . "WHERE id=$profileid"; - doQuery($query, 101); - # don't store the unencrypted password - $newvalue2 = 'NULL'; - $newvalue = ''; - } else if($profile[$profileid][$item] == $newvalue){ + if($item == 'password' && $profile[$profileid]['rsapub']) { + $encrypted = encryptDataAsymmetric($newvalue, $profile[$profileid]['rsapub']); + $escaped = mysql_real_escape_string($encrypted); + $query = "UPDATE vmprofile " + . "SET `encryptedpasswd` = '$escaped' " + . "WHERE id = $profileid"; + doQuery($query, 101); + # don't store the unencrypted password + $newvalue2 = 'NULL'; + $newvalue = ''; + } + else if($profile[$profileid][$item] == $newvalue) return; - } $query = "UPDATE vmprofile " . "SET `$item` = $newvalue2 " . "WHERE id = $profileid";
Modified: vcl/trunk/web/.ht-inc/xmlrpcWrappers.php URL: http://svn.apache.org/viewvc/vcl/trunk/web/.ht-inc/xmlrpcWrappers.php?rev=1624325&r1=1624324&r2=1624325&view=diff ============================================================================== --- vcl/trunk/web/.ht-inc/xmlrpcWrappers.php (original) +++ vcl/trunk/web/.ht-inc/xmlrpcWrappers.php Thu Sep 11 16:01:48 2014 @@ -108,9 +108,11 @@ function XMLRPCtest($string) { /// /// \fn XMLRPCgetImages() /// -/// \return an array of image arrays, each with 2 indices:\n +/// \return an array of image arrays, each with these indices:\n /// \b id - id of the image\n -/// \b name - name of the image +/// \b name - name of the image\n +/// \b description - description of image\n +/// \b usage - usage instructions for image /// /// \brief gets the images to which the user has access /// @@ -215,7 +217,7 @@ function XMLRPCaddRequest($imageid, $sta $images = getImages(); $revisionid = getProductionRevisionid($imageid); - $rc = isAvailable($images, $imageid, $revisionid, $start, $end); + $rc = isAvailable($images, $imageid, $revisionid, $start, $end, 1); if($rc < 1) { addLogEntry($nowfuture, unixToDatetime($start), unixToDatetime($end), 0, $imageid); @@ -323,7 +325,7 @@ function XMLRPCaddRequestWithEnding($ima $images = getImages(); $revisionid = getProductionRevisionid($imageid); - $rc = isAvailable($images, $imageid, $revisionid, $start, $end); + $rc = isAvailable($images, $imageid, $revisionid, $start, $end, 1); if($rc < 1) { addLogEntry($nowfuture, unixToDatetime($start), unixToDatetime($end), 0, $imageid); @@ -376,7 +378,7 @@ function XMLRPCdeployServer($imageid, $s $logingroup='', $ipaddr='', $macaddr='', $monitored=0, $foruser='', $name='') { global $user, $remoteIP; - if(! in_array("serverProfileAdmin", $user["privileges"])) { + if(! in_array("serverCheckOut", $user["privileges"])) { return array('status' => 'error', 'errorcode' => 60, 'errormsg' => "access denied to deploy server"); @@ -527,7 +529,7 @@ function XMLRPCdeployServer($imageid, $s $images = getImages(); $revisionid = getProductionRevisionid($imageid); $rc = isAvailable($images, $imageid, $revisionid, $start, $end, - 0, 0, 0, 0, $ipaddr, $macaddr); + 1, 0, 0, 0, 0, $ipaddr, $macaddr); if($rc < 1) { addLogEntry($nowfuture, unixToDatetime($start), unixToDatetime($end), 0, $imageid); @@ -582,7 +584,7 @@ function XMLRPCdeployServer($imageid, $s /// \li \b errorcode - error number\n /// \li \b errormsg - error string\n /// -/// \b success - request was successfully ended; there will be an additional +/// \b success - request was successfully found; there will be an additional /// element whose index is 'requests' which is an array of arrays, each having /// these elements (or empty if no existing requests):\n /// \li \b requestid - id of the request\n @@ -614,7 +616,8 @@ function XMLRPCgetRequestIds() { 'start' => $start, 'end' => $end, 'OS' => $req['OS'], - 'isserver' => $req['server']); + 'isserver' => $req['server'], + 'admin' => $req['serveradmin']); if($req['currstateid'] == 14) $tmp['state'] = $states[$req['laststateid']]; else @@ -884,12 +887,33 @@ function XMLRPCextendRequest($requestid, $timeToNext = timeToNextReservation($request); $movedall = 1; if($timeToNext > -1) { - foreach($request["reservations"] as $res) { - if(! moveReservationsOffComputer($res["computerid"])) { - $movedall = 0; - break; + $lockedall = 1; + if(count($request['reservations']) > 1) { + # get semaphore on each existing node in cluster so that nothing + # can get moved to the nodes during this process + $checkend = unixToDatetime($unixend + 900); + foreach($request["reservations"] as $res) { + if(! retryGetSemaphore(1, 1, $res['managementnodeid'], $res['computerid'], $request['start'], $checkend, $requestid)) { + $lockedall = 0; + break; + } } } + if($lockedall) { + foreach($request["reservations"] as $res) { + if(! moveReservationsOffComputer($res["computerid"])) { + $movedall = 0; + break; + } + } + } + else { + cleanSemaphore(); + return array('status' => 'error', + 'errorcode' => 42, + 'errormsg' => 'cannot extend due to another reservation immediately after this one'); + } + cleanSemaphore(); } if(! $movedall) { $timeToNext = timeToNextReservation($request); @@ -912,7 +936,7 @@ function XMLRPCextendRequest($requestid, } $rc = isAvailable(getImages(), $request['reservations'][0]["imageid"], $request['reservations'][0]['imagerevisionid'], - $startts, $newendts, $requestid); + $startts, $newendts, 1, $requestid); // conflicts with scheduled maintenance if($rc == -2) { addChangeLogEntry($request["logid"], NULL, unixToDatetime($newendts), @@ -939,6 +963,7 @@ function XMLRPCextendRequest($requestid, } // success updateRequest($requestid); + cleanSemaphore(); return array('status' => 'success'); } @@ -1022,12 +1047,33 @@ function XMLRPCsetRequestEnding($request $timeToNext = timeToNextReservation($request); $movedall = 1; if($timeToNext > -1) { - foreach($request["reservations"] as $res) { - if(! moveReservationsOffComputer($res["computerid"])) { - $movedall = 0; - break; + $lockedall = 1; + if(count($request['reservations']) > 1) { + # get semaphore on each existing node in cluster so that nothing + # can get moved to the nodes during this process + $checkend = unixToDatetime($unixend + 900); + foreach($request["reservations"] as $res) { + if(! retryGetSemaphore(1, 1, $res['managementnodeid'], $res['computerid'], $request['start'], $checkend, $requestid)) { + $lockedall = 0; + break; + } + } + } + if($lockedall) { + foreach($request["reservations"] as $res) { + if(! moveReservationsOffComputer($res["computerid"])) { + $movedall = 0; + break; + } } } + else { + cleanSemaphore(); + return array('status' => 'error', + 'errorcode' => 42, + 'errormsg' => 'cannot extend due to another reservation immediately after this one'); + } + cleanSemaphore(); } if(! $movedall) { $timeToNext = timeToNextReservation($request); @@ -1051,7 +1097,7 @@ function XMLRPCsetRequestEnding($request } $rc = isAvailable(getImages(), $request['reservations'][0]["imageid"], $request['reservations'][0]['imagerevisionid'], - $startts, $end, $requestid); + $startts, $end, 1, $requestid); // conflicts with scheduled maintenance if($rc == -2) { addChangeLogEntry($request["logid"], NULL, unixToDatetime($end), @@ -1078,6 +1124,7 @@ function XMLRPCsetRequestEnding($request } // success updateRequest($requestid); + cleanSemaphore(); return array('status' => 'success'); } @@ -1164,7 +1211,7 @@ function XMLRPCautoCapture($requestid) { 'errorcode' => 48, 'errormsg' => 'cannot image a cluster reservation'); } - require_once(".ht-inc/images.php"); + require_once(".ht-inc/image.php"); $imageid = $reqData['reservations'][0]['imageid']; $imageData = getImages(0, $imageid); $captime = unixToDatetime(time()); @@ -1175,7 +1222,7 @@ function XMLRPCautoCapture($requestid) { # create new revision if requestor is owner and not a kickstart image if($imageData[$imageid]['installtype'] != 'kickstart' && $reqData['userid'] == $imageData[$imageid]['ownerid']) { - $rc = updateExistingImage($requestid, $reqData['userid'], $comments, 1); + $rc = Image::AJupdateImage($requestid, $reqData['userid'], $comments, 1); if($rc == 0) { return array('status' => 'error', 'errorcode' => 49, @@ -1191,7 +1238,7 @@ function XMLRPCautoCapture($requestid) { . "owner: {$ownerdata['unityid']}@{$ownerdata['affiliation']}<br>"; $connectmethods = getImageConnectMethods($imageid, $reqData['reservations'][0]['imagerevisionid']); $data = array('requestid' => $requestid, - 'description' => $desc, + 'desc' => $desc, 'usage' => '', 'owner' => "{$ownerdata['unityid']}@{$ownerdata['affiliation']}", 'prettyname' => "Autocaptured ({$ownerdata['unityid']} - $requestid)", @@ -1203,9 +1250,15 @@ function XMLRPCautoCapture($requestid) { 'checkuser' => 1, 'rootaccess' => 1, 'sysprep' => 1, + 'basedoffrevisionid' => $reqData['reservations'][0]['imagerevisionid'], + 'platformid' => $imageData[$imageid]['platformid'], + 'osid' => $imageData[$imageid]["osid"], + 'reload' => 20, 'comments' => $comments, - 'connectmethodids' => implode(',', array_keys($connectmethods))); - $rc = submitAddImage($data, 1); + 'connectmethodids' => implode(',', array_keys($connectmethods)), + 'autocaptured' => 1); + $obj = new Image(); + $rc = $obj->addResource($data); if($rc == 0) { return array('status' => 'error', 'errorcode' => 50, @@ -1608,7 +1661,7 @@ function XMLRPCaddNode($nodeName, $paren } if(in_array("nodeAdmin", $user['privileges'])) { $nodeInfo = getNodeInfo($parentNode); - if(is_null($tmp)) { + if(is_null($nodeInfo)) { return array('status' => 'error', 'errorcode' => 78, 'errormsg' => 'Invalid nodeid specified'); @@ -1821,7 +1874,8 @@ function XMLRPCaddUserGroupPriv($name, $ array_push($usertypes["users"], "cascade"); $diff = array_diff($perms, $usertypes['users']); - if(count($diff) || (count($perms) == 1 && $perms[0] == 'cascade')) { + if(! count($perms) || count($diff) || + (count($perms) == 1 && $perms[0] == 'cascade')) { return array('status' => 'error', 'errorcode' => 66, 'errormsg' => 'Invalid or missing permissions list supplied'); @@ -1830,9 +1884,13 @@ function XMLRPCaddUserGroupPriv($name, $ $cnp = getNodeCascadePrivileges($nodeid, "usergroups"); $np = getNodePrivileges($nodeid, "usergroups", $cnp); - $diff = array_diff($perms, $np['usergroups'][$name]['privs']); - if(empty($diff)) - return array('status' => 'success'); + if(array_key_exists($name, $np['usergroups'])) { + $diff = array_diff($perms, $np['usergroups'][$name]['privs']); + if(empty($diff)) + return array('status' => 'success'); + } + else + $diff = $perms; updateUserOrGroupPrivs($groupid, $nodeid, $diff, array(), "group"); return array('status' => 'success'); @@ -2430,7 +2488,7 @@ function XMLRPCeditUserGroup($name, $aff return $rc; # get info about group - $query = "SELECT ownerid " + $query = "SELECT ownerid, " . "affiliationid, " . "custom, " . "courseroll " @@ -3014,23 +3072,23 @@ function XMLRPCremoveResourceGroup($name /// created block time and at least one other index named 'status' which will /// have one of these values:\n /// \b error - error occurred; there will be 2 additional elements in the -/// array: -/// \li \b errorcode - error number -/// \li \b errormsg - error string +/// array:\n +/// \li \b errorcode - error number\n +/// \li \b errormsg - error string\n /// /// \b success - blockTimesid was processed; there will be two additional -/// elements in this case: +/// elements in this case:\n /// \li \b allocated - total number of desired allocations that have been -/// processed +/// processed\n /// \li \b unallocated - total number of desired allocations that have not been -/// processed +/// processed\n /// /// \b warning - there was a non-fatal issue that occurred while processing -/// the call; there will be four additional elements in this case: -/// \li \b warningcode - warning number -/// \li \b warningmsg - warning string +/// the call; there will be four additional elements in this case:\n +/// \li \b warningcode - warning number\n +/// \li \b warningmsg - warning string\n /// \li \b allocated - total number of desired allocations that have been -/// processed +/// processed\n /// \li \b unallocated - total number of desired allocations that have not been /// processed\n\n /// @@ -3206,18 +3264,18 @@ function XMLRPCblockAllocation($imageid, /// /// \b completed - blockTimesid was previously successfully processed\n /// \b success - blockTimesid was processed; there will be two additional -/// elements in this case: +/// elements in this case:\n /// \li \b allocated - total number of desired allocations that have been -/// processed +/// processed\n /// \li \b unallocated - total number of desired allocations that have not been -/// processed +/// processed\n /// /// \b warning - there was a non-fatal issue that occurred while processing -/// the call; there will be four additional elements in this case: -/// \li \b warningcode - warning number -/// \li \b warningmsg - warning string +/// the call; there will be four additional elements in this case:\n +/// \li \b warningcode - warning number\n +/// \li \b warningmsg - warning string\n /// \li \b allocated - total number of desired allocations that have been -/// processed +/// processed\n /// \li \b unallocated - total number of desired allocations that have not been /// processed\n\n /// @@ -3332,7 +3390,7 @@ function XMLRPCprocessBlockTime($blockTi } # check to see if computer is available for whole block $rc = isAvailable($images, $rqdata['imageid'], $revisionid, $checkstart, - $unixend, $row['reqid'], $row['userid'], + $unixend, 1, $row['reqid'], $row['userid'], $ignoreprivileges, 0, '', '', 1); // if not available for whole block, just skip this one if($rc < 1) @@ -3375,6 +3433,7 @@ function XMLRPCprocessBlockTime($blockTi . "VALUES $blockComps"; doQuery($query); } + cleanSemaphore(); } # check to see if all computers have been allocated @@ -3451,7 +3510,7 @@ function XMLRPCprocessBlockTime($blockTi $userid = array_pop($userids); # use end of block time to find available computers, but... $rc = isAvailable($images, $rqdata['imageid'], $revisionid, $stagunixstart, - $unixend, 0, $userid, $ignoreprivileges); + $unixend, 1, 0, $userid, $ignoreprivileges); if($rc < 1) continue; @@ -3488,12 +3547,12 @@ function XMLRPCprocessBlockTime($blockTi . "$mgmtnodeid)"; doQuery($query, 101); } - semUnlock(); $blockComps = implode(',', $blockCompVals); $query = "INSERT INTO blockComputers " . "(blockTimeid, computerid, imageid, reloadrequestid) " . "VALUES $blockComps"; doQuery($query, 101); + cleanSemaphore(); $blockCompVals = array(); } if($allocated == 0) { Modified: vcl/trunk/web/css/vcl.css URL: http://svn.apache.org/viewvc/vcl/trunk/web/css/vcl.css?rev=1624325&r1=1624324&r2=1624325&view=diff ============================================================================== --- vcl/trunk/web/css/vcl.css (original) +++ vcl/trunk/web/css/vcl.css Thu Sep 11 16:01:48 2014 @@ -14,6 +14,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +html { + height: 100%; + width: 100%; +} +body { + height: 100%; + width: 100%; +} .scriptonly { display: none; } @@ -219,6 +227,14 @@ color: red; } +.ready { + color: #008000; +} + +.wait { + color: #e58304; +} + #revisiontable th { border: solid 1px #000000; padding: 2px; @@ -311,9 +327,232 @@ margin: 10px; } +#gridcontainer table th, +#gridcontainer table td, #usergroupcontainer table th, #usergroupcontainer table td, #resourcegroupcontainer table th, -#resourcegroupcontainer table td { +#resourcegroupcontainer table td, +#extrafiltersdiv table th, +#extrafiltersdiv table td { font-size: 1em; } + +.editmntable, #deployprofilediv table, #serverprofiledata table { + border-collapse: collapse; +} + +.boxedtablerows { + border: 1px solid #000000; +} + +#systemconfigdiv .dojoxMultiSelectSelectedOption, +#groupbyresourcediv .dojoxMultiSelectSelectedOption, +#groupbygroupdiv .dojoxMultiSelectSelectedOption, +#mapbyresgroupdiv .dojoxMultiSelectSelectedOption, +#mapbymaptogroupdiv .dojoxMultiSelectSelectedOption { + background-color: black; + color: white; +} + +/*#configvariablegriddiv .dojoxGridCellFocus { + background-color: black; + color: white; +}*/ + +#systemconfigdiv .dojoxGridHeader, +#groupbyresourcediv .dojoxGridHeader, +#groupbygroupdiv .dojoxGridHeader, +#mapbyresgroupdiv .dojoxGridHeader, +#mapbymaptogroupdiv .dojoxGridHeader, +#configvariablegriddiv .dojoxGridHeader { + display: none; +} + +#systemconfigdiv .dojoxGrid, +#groupbyresourcediv .dojoxGrid, +#groupbygroupdiv .dojoxGrid, +#mapbyresgroupdiv .dojoxGrid, +#mapbymaptogroupdiv .dojoxGrid, +#subimagegriddiv .dojoxGrid, +#configvariablegriddiv .dojoxGrid { + background-color: white; + border: 1px solid black; +} + +#systemconfigdiv .dojoxGridRow, +#systemconfigdiv .dojoxGridRowOdd, +#groupbyresourcediv .dojoxGridRow, +#groupbyresourcediv .dojoxGridRowOdd, +#groupbygroupdiv .dojoxGridRow, +#groupbygroupdiv .dojoxGridRowOdd, +#mapbyresgroupdiv .dojoxGridRow, +#mapbyresgroupdiv .dojoxGridRowOdd, +#mapbymaptogroupdiv .dojoxGridRow, +#mapbymaptogroupdiv .dojoxGridRowOdd, +#subimagegriddiv .dojoxGridRow, +#subimagegriddiv .dojoxGridRowOdd, +#configvariablegriddiv .dojoxGridRow, +#configvariablegriddiv .dojoxGridRowOdd { + width: 300px; + background-color: white; + border: none; + padding: 0; + margin: 0; +} + +#content #systemconfigdiv table, +#content #groupbyresourcediv table, +#content #groupbygroupdiv table, +#content #mapbyresgroupdiv table, +#content #mapbymaptogroupdiv table, +#content #subimagegriddiv table, +#content #configvariablegriddiv table { + border-spacing: 0; +} + +#systemconfigdiv .dojoxGridRowSelected, +#groupbyresourcediv .dojoxGridRowSelected, +#groupbygroupdiv .dojoxGridRowSelected, +#mapbyresgroupdiv .dojoxGridRowSelected, +#mapbymaptogroupdiv .dojoxGridRowSelected, +#subimagegriddiv .dojoxGridRowSelected, +#configvariablegriddiv .dojoxGridRowSelected { + width: 300px; + background-color: black; + border: none; + padding: 0; + margin: 0; + color: white; +} + +#systemconfigdiv .dojoxGridRowSelected td, +#groupbyresourcediv .dojoxGridRowSelected td, +#groupbygroupdiv .dojoxGridRowSelected td, +#mapbyresgroupdiv .dojoxGridRowSelected td, +#mapbymaptogroupdiv .dojoxGridRowSelected td, +#subimagegriddiv .dojoxGridRowSelected td, +#configvariablegriddiv .dojoxGridRowSelected td { + background-color: black; + color: white; +} + +#systemconfigdiv .dojoxGridCell, +#systemconfigdiv .dojoxGridCellFocus, +#systemconfigdiv .dojoxGridCellOver, +#groupbyresourcediv .dojoxGridCell, +#groupbyresourcediv .dojoxGridCellFocus, +#groupbyresourcediv .dojoxGridCellOver, +#groupbygroupdiv .dojoxGridCell, +#groupbygroupdiv .dojoxGridCellFocus, +#groupbygroupdiv .dojoxGridCellOver, +#mapbyresgroupdiv .dojoxGridCell, +#mapbyresgroupdiv .dojoxGridCellFocus, +#mapbyresgroupdiv .dojoxGridCellOver, +#mapbymaptogroupdiv .dojoxGridCell, +#mapbymaptogroupdiv .dojoxGridCellFocus, +#mapbymaptogroupdiv .dojoxGridCellOver, +#subimagegriddiv .dojoxGridCell, +#subimagegriddiv .dojoxGridCellFocus, +#subimagegriddiv .dojoxGridCellOver, +#configvariablegriddiv .dojoxGridCell, +#configvariablegriddiv .dojoxGridCellFocus, +#configvariablegriddiv .dojoxGridCellOver { + border: none; + border-style: none; +} + +#systemconfigdiv .dojoxMultiSelectItemBox, +#groupbyresourcediv .dojoxMultiSelectItemBox, +#groupbygroupdiv .dojoxMultiSelectItemBox, +#mapbyresgroupdiv .dojoxMultiSelectItemBox, +#mapbymaptogroupdiv .dojoxMultiSelectItemBox, +#subimagegriddiv .dojoxMultiSelectItemBox, +#configvariablegriddiv .dojoxMultiSelectItemBox { + display: none; +} + +#addeditdlgcontent label, +#newreslabelfields label { + position: absolute; + text-align: right; + width: 9em; + font-weight: bold; +} + +#newreslabelfields label { + width: 10em; +} + +#addeditdlgcontent .labeledform { + margin-left: 9.5em; +} + +#advancedoptions .labeledform { + margin-left: 17em; +} + +#mgmtnodedlgcontent label { + width: 18.5em; +} + +#mgmtnodedlgcontent .labeledform { + margin-left: 19em; +} + +#computerdlgcontent label { + width: 12em; +} + +#computerdlgcontent .labeledform { + margin-left: 12.5em; +} + +#advancedoptions label { + width: 16.5em; +} + +#cfgvartypelbl { + margin-top: 6px; +} + +#addeditdlgcontent .labeledforminnerlabel { + text-align: left; + font-weight: normal; + position: static; +} + +#newreslabelfields .labeledform { + margin-left: 10.5em; +} + +#configvariables { + border: 1px solid black; + margin: 3px; +} + +.strikethrough { + text-decoration: line-through; +} + +#nrfixedipdiv { + border: 1px solid black; + padding: 3px; + margin: 3px; + display: inline-block; +} + +.boxedoptions { + border: 1px solid black; + padding: 3px; + margin: 3px 1px; +} + +#imageRevisionDlg .dijitDialogPaneContent { + height: 100%; + width: 100%; +} + +.disabledlabel { + color: #888888; +} Modified: vcl/trunk/web/index.php URL: http://svn.apache.org/viewvc/vcl/trunk/web/index.php?rev=1624325&r1=1624324&r2=1624325&view=diff ============================================================================== --- vcl/trunk/web/index.php (original) +++ vcl/trunk/web/index.php Thu Sep 11 16:01:48 2014 @@ -16,10 +16,9 @@ limitations under the License. */ -# ASF VCL v2.3 -$VCLversion = '2.3'; +# ASF VCL v2.4 +$VCLversion = '2.4'; -@include_once("fckeditor/fckeditor.php"); require_once(".ht-inc/conf.php"); if(! isset($_SERVER['HTTPS']) || $_SERVER['HTTPS'] != "on") { header("Location: " . BASEURL . "/"); @@ -84,14 +83,30 @@ if(checkUserHasPerm('View Debug Informat } if($hasArg) { - $actionFunction($arg); + if(function_exists($actionFunction)) + $actionFunction($arg); + else { + $obj = getContinuationVar('obj'); + if(! is_null($obj) && method_exists($obj, $actionFunction)) + $obj->$actionFunction($arg); + else + main(); + } } else { - $actionFunction(); + if(function_exists($actionFunction)) + $actionFunction(); + else { + $obj = getContinuationVar('obj'); + if(! is_null($obj) && method_exists($obj, $actionFunction)) + $obj->$actionFunction(); + else + main(); + } } printHTMLFooter(); -dbDisconnect(); +cleanSemaphore(); -semUnlock(); +dbDisconnect(); ?> Modified: vcl/trunk/web/js/blockallocations.js URL: http://svn.apache.org/viewvc/vcl/trunk/web/js/blockallocations.js?rev=1624325&r1=1624324&r2=1624325&view=diff ============================================================================== --- vcl/trunk/web/js/blockallocations.js (original) +++ vcl/trunk/web/js/blockallocations.js Thu Sep 11 16:01:48 2014 @@ -32,27 +32,7 @@ var blockFormAddListData = { items: [] } -function RPCwrapper(data, CB, dojson) { - if(dojson) { - dojo.xhrPost({ - url: 'index.php', - load: CB, - handleAs: "json", - error: errorHandler, - content: data, - timeout: 15000 - }); - } - else { - dojo.xhrPost({ - url: 'index.php', - load: CB, - error: errorHandler, - content: data, - timeout: 15000 - }); - } -} +var usagechart = null; function generalReqCB(data, ioArgs) { eval(data); @@ -1367,3 +1347,49 @@ function timestampToTimeVirtual(val) { function machinecntfilter(val) { return parseInt(val); } + +function viewBlockUsage(blockid) { + var cont = dojo.byId('viewblockusagecont').value; + RPCwrapper({continuation: cont, blockid: blockid}, viewBlockUsageCB, 1); +} + +function viewBlockUsageCB(data, ioArgs) { + if(data.items.status == 'success') { + if(usagechart) + usagechart.destroy(); + usagechart = new dojox.charting.Chart2D('blockusagechartdiv'); + usagechart.setTheme(dojox.charting.themes.ThreeD); + var xtickstep = parseInt(data.items.usage.xlabels.length / 10) || 1; + usagechart.addAxis("x", { + includeZero: false, + labels: data.items.usage.xlabels, + rotation: -90, + minorTicks: false, + font: 'normal normal normal 11px verdana', + majorTickStep: xtickstep + }); + usagechart.addAxis('y', { + vertical: true, + max: 100, + includeZero: true, + minorTicks: true, + minorLabels: false, + majorTickStep: 20, + minorTickStep: 10 + }); + usagechart.addPlot('default', {type: "Columns", gap: 1}); + usagechart.addPlot('Grid', {type: 'Grid', hMajorLines: true, vMajorLines: false}); + usagechart.addSeries("Main", data.items.usage.points, {stroke: {width: 1}}); + var a = new dojox.charting.action2d.Tooltip(usagechart); + usagechart.render(); + dojo.addClass('blockusageemptydiv', 'hidden'); + dojo.removeClass('blockusagechartdiv', 'hidden'); + dijit.byId('viewUsageDialog').show(); + } + else if(data.items.status == 'empty') { + dojo.addClass('blockusagechartdiv', 'hidden'); + dojo.removeClass('blockusageemptydiv', 'hidden'); + dijit.byId('viewUsageDialog').show(); + } +} + Modified: vcl/trunk/web/js/code.js URL: http://svn.apache.org/viewvc/vcl/trunk/web/js/code.js?rev=1624325&r1=1624324&r2=1624325&view=diff ============================================================================== --- vcl/trunk/web/js/code.js (original) +++ vcl/trunk/web/js/code.js Thu Sep 11 16:01:48 2014 @@ -48,52 +48,47 @@ function testJS() { document.getElementById('testjavascript').value = '1'; } -function checkAllCompUtils() { - var count = 0; - var obj; - while(obj = document.getElementById('comp' + count)) { - obj.checked = true; - document.getElementById('compid' + count).className = 'hlrow'; - toggledRows['compid' + count] = 1; - count++; - } - return true; -} - -function uncheckAllCompUtils() { - var count = 0; - var obj; - while(obj = document.getElementById('comp' + count)) { - obj.checked = false; - document.getElementById('compid' + count).className = ''; - toggledRows['compid' + count] = 0; - count++; - } - return true; -} - -function reloadComputerSubmit() { - var formobj = document.getElementById('utilform'); - var obj = document.getElementById('utilformcont'); - var contobj = document.getElementById('reloadcont'); - obj.value = contobj.value; - formobj.submit(); -} - -function compStateChangeSubmit() { - var formobj = document.getElementById('utilform'); - var obj = document.getElementById('utilformcont'); - var contobj = document.getElementById('statecont'); - obj.value = contobj.value; - formobj.submit(); -} - -function compScheduleChangeSubmit() { - var formobj = document.getElementById('utilform'); - var obj = document.getElementById('utilformcont'); - var contobj = document.getElementById('schcont'); - obj.value = contobj.value; - formobj.submit(); +function RPCwrapper(data, CB, dojson, timeout) { + if(typeof timeout === 'undefined') + timeout = 15000; + if(dojson) { + return dojo.xhrPost({ + url: 'index.php', + load: function(data, ioArgs) {returnCheck(CB, data, ioArgs);}, + //load: CB, + //handleAs: "json", + error: errorHandler, + content: data, + timeout: timeout + }); + } + else { + return dojo.xhrPost({ + url: 'index.php', + load: CB, + error: errorHandler, + content: data, + timeout: timeout + }); + } +} + +function returnCheck(CB, data, ioArgs) { + try { + var json = dojo.fromJson(data); + } + catch(error) { + if(data.match(/<html/) || ! error.message.match(/syntax error/)) { + alert(_('Error encountered:') + " " + _('Please try again later')); + return; + } + var div = document.createElement('div'); + div.innerHTML = data; + var msg = div.textContent || div.innerText || ""; + alert(_('Error encountered:') + '\n\n' + msg); + return; + } + CB(json, ioArgs); } Array.prototype.inArray = function(data) { @@ -114,7 +109,7 @@ Array.prototype.search = function(data) return false; } -var genericCB = function(type, data, evt) { +function generalCB(data, ioArgs) { unsetLoading(); var regex = new RegExp('^<!DOCTYPE html'); if(data.match(regex)) { @@ -125,7 +120,7 @@ var genericCB = function(type, data, evt alert(mesg); var d = {mode: 'errorrpt', data: data}; - RPCwrapper(d, function(type, data, evt) {}); + RPCwrapper(d, function(data, ioArgs) {}); return; } eval(data); @@ -135,6 +130,7 @@ var errorHandler = function(error, ioArg /*if(error.name == 'cancel') return; alert('AJAX Error: ' + error.message + '\nLine ' + error.lineNumber + ' in ' + error.fileName);*/ + //console.log(error); } function errorHandler(data, ioArgs) { @@ -149,38 +145,14 @@ function AJdojoCreate(objid) { function setLoading() { document.body.style.cursor = 'wait'; - if(dojo.widget.byId('workingDialog')) - dojo.widget.byId('workingDialog').show(); + if(dijit.byId('workingDialog')) + dijit.byId('workingDialog').show(); } function unsetLoading() { document.body.style.cursor = 'default'; - if(dojo.widget.byId('workingDialog')) - dojo.widget.byId('workingDialog').hide(); -} - -function toggleRowSelect(id) { - var row = document.getElementById(id); - if(toggledRows[id] && toggledRows[id] == 1) { - row.className = ''; - toggledRows[id] = 0; - } - else { - row.className = 'hlrow'; - toggledRows[id] = 1; - } -} - -function toggleColSelect(id) { - var col = document.getElementById(id); - if(toggledCols[id] && toggledCols[id] == 1) { - col.className = ''; - toggledCols[id] = 0; - } - else { - col.className = 'hlcol'; - toggledCols[id] = 1; - } + if(dijit.byId('workingDialog')) + dijit.byId('workingDialog').hide(); } function updateMouseXY(e) { @@ -345,3 +317,59 @@ function recenterDijitDialog(id) { delete dijit.byId(id)._relativePosition; dijit.byId(id)._position(); } + +function resizeRecenterDijitDialog(id) { + // taken from Dialog.js _size function + /*var d = dijit.byId(id); + var mb = dojo._getMarginSize(d.domNode); + var viewport = dojo.window.getBox(); + if(mb.h >= viewport.h) { + // Reduce size of dialog contents so that dialog fits in viewport + var h = Math.min(mb.h, Math.floor(viewport.h * 0.75)); + dojo.style(d.containerNode, { + height: h + "px", + overflow: "auto", + position: "relative" // workaround IE bug moving scrollbar or dragging dialog + }); + }*/ + dijit.byId(id)._size(); + recenterDijitDialog(id); +} + +function checkValidatedObj(objid, errobj) { + if(dijit.byId(objid) && ! dijit.byId(objid).get('disabled') && + ! dijit.byId(objid).isValid()) { + dijit.byId(objid)._hasBeenBlurred = true; + dijit.byId(objid).validate(); + //dijit.byId(objid).focus(); + if(typeof errobj == 'string') { + if(dijit.byId(errobj)) + dijit.byId(errobj).set('value', ''); + else if(dojo.byId(errobj)) + dojo.byId(errobj).innerHTML = ''; + else + errobj = null; + } + if(errobj !== null && typeof errobj != 'undefined') + errobj.innerHTML = ''; + return 0; + } + return 1; +} + +function resetSelect(objid) { + if(dijit.byId(objid)) { + dijit.byId(objid).reset(); + return; + } + var obj = dojo.byId(objid); + var found = 0; + for(var i = 0; i < obj.options.length; i++) { + if(obj.options[i].defaultSelected) { + obj.selectedIndex = i; + found = 1; + } + } + if(! found) + obj.selectedIndex = 0; +} Modified: vcl/trunk/web/js/dashboard.js URL: http://svn.apache.org/viewvc/vcl/trunk/web/js/dashboard.js?rev=1624325&r1=1624324&r2=1624325&view=diff ============================================================================== --- vcl/trunk/web/js/dashboard.js (original) +++ vcl/trunk/web/js/dashboard.js Thu Sep 11 16:01:48 2014 @@ -15,27 +15,7 @@ * limitations under the License. */ -function RPCwrapper(data, CB, dojson) { - if(dojson) { - dojo.xhrPost({ - url: 'index.php', - load: CB, - handleAs: "json", - error: errorHandler, - content: data, - timeout: 15000 - }); - } - else { - dojo.xhrPost({ - url: 'index.php', - load: CB, - error: errorHandler, - content: data, - timeout: 15000 - }); - } -} +var refreshtimer; function generalReqCB(data, ioArgs) { eval(data); @@ -61,7 +41,9 @@ function updateDashboardCB(data, ioArgs) updateBlockAllocation(data.items.blockallocation); if(dojo.byId('newreservations')) updateNewReservations(data.items.newreservations); - setTimeout(updateDashboard, 15000); + if(dojo.byId('failedimaging')) + updateFailedImaging(data.items.failedimaging); + refreshtimer = setTimeout(updateDashboard, 15000); } function updateStatus(data) { @@ -157,11 +139,15 @@ function updateTopFailed(data) { return; } var txt = '<table>'; + txt += '<tr><th align="right">' + txt += 'Image</th><th>User</th><th>Reload</th></tr>' for(var i = 0; i < data.length; i++) { txt += '<tr><th align="right">' + data[i].prettyname + '</th><td>' + data[i].count + + '</td><td>' + + data[i].reloadcount + '</td></tr>'; } txt += '</table>'; @@ -244,6 +230,74 @@ function updateNewReservations(data) { obj.innerHTML = txt; } +function updateFailedImaging(data) { + var obj = dojo.byId('failedimaging'); + var txt = '<table>'; + txt += '<tr>' + + '<td></td>' + + '<th>Start</th>' + + '<th>ReqID</th>' + + '<th>Computer</th>' + + '<th>VM Host</th>' + + '<th>Image</th>' + + '<th>Owner</th>' + + '<th>Management Node</th>' + + '</tr>'; + for(var i = 0; i < data.length; i++) { + if(i % 2) + txt += '<tr style=\"background-color: #D8D8D8;\">'; + else + txt += '<tr style=\"background-color: #EEEEEE;\">'; + txt += '<td style=\"padding: 1px; border-right: 1px solid;\">' + + '<button id=\"imgbtn' + data[i].id + '\" type=\"button\"></button>' + + '<input type=\"hidden\" id=\"iptimgbtn' + data[i].id + '\">' + + '</td><td style=\"padding: 1px; border-right: 1px solid;\">' + + data[i].start + + '</td><td style=\"padding: 1px; border-right: 1px solid;\">' + + data[i].id + + '</td><td style=\"padding: 1px; border-right: 1px solid;\">' + + data[i].computer + + '</td><td style=\"padding: 1px; border-right: 1px solid;\">' + + data[i].vmhost + + '</td><td style=\"padding: 1px; border-right: 1px solid;\">' + + data[i].image + + '</td><td style=\"padding: 1px; border-right: 1px solid;\">' + //+ data[i].installtype + + data[i].owner + + '</td><td style=\"padding: 1px; border-right: 1px solid;\">' + + data[i].managementnode + + '</td></tr>'; + } + txt += '</table>'; + obj.innerHTML = txt; + for(var i = 0; i < data.length; i++) { + var btnid = 'imgbtn' + data[i].id + if(dijit.byId(btnid)) + dijit.byId(btnid).destroy(true); + dojo.byId('ipt' + btnid).value = data[i].contid; + var btn = new dijit.form.Button({ + label: "Restart Imaging", + onClick: function() { + var contid = dojo.byId('ipt' + this.id).value; + RPCwrapper({continuation: contid}, restartImagingCB, 1); + } + }, btnid); + } +} + +function restartImagingCB(data, ioArgs) { + if(data.items.status == 'noaccess') { + alert('You do not have access to restart the imaging process for this reservation'); + return; + } + else if(data.items.status == 'wrongstate') { + alert('The state of this reservation changed and is no longer valid for restarting the reservation'); + return; + } + clearTimeout(refreshtimer); + updateDashboard(); +} + function timestampToTime(val) { if(! dijit.byId('reschart').chart.labeldata) return ''; Modified: vcl/trunk/web/js/privileges.js URL: http://svn.apache.org/viewvc/vcl/trunk/web/js/privileges.js?rev=1624325&r1=1624324&r2=1624325&view=diff ============================================================================== --- vcl/trunk/web/js/privileges.js (original) +++ vcl/trunk/web/js/privileges.js Thu Sep 11 16:01:48 2014 @@ -16,28 +16,6 @@ */ var currentOver = ''; -function RPCwrapper(data, CB, dojson) { - if(dojson) { - dojo.xhrPost({ - url: 'index.php', - load: CB, - handleAs: "json", - error: errorHandler, - content: data, - timeout: 15000 - }); - } - else { - dojo.xhrPost({ - url: 'index.php', - load: CB, - error: errorHandler, - content: data, - timeout: 15000 - }); - } -} - function generalPrivCB(data, ioArgs) { eval(data); unsetLoading2(); @@ -447,7 +425,10 @@ function submitAddUserGroup() { var obj = dijit.byId('blockgrpchk'); if(obj.checked) perms.push('block'); - for(var i = 0; obj = dijit.byId('usergrpck0:' + i); i++) { + obj = dijit.byId('usergrpck0:0'); + if(obj.checked) + perms.push('cascade'); + for(var i = 1; obj = dijit.byId('usergrpck0:' + i); i++) { if(obj.checked) perms.push(obj.name); } Modified: vcl/trunk/web/js/requests.js URL: http://svn.apache.org/viewvc/vcl/trunk/web/js/requests.js?rev=1624325&r1=1624324&r2=1624325&view=diff ============================================================================== --- vcl/trunk/web/js/requests.js (original) +++ vcl/trunk/web/js/requests.js Thu Sep 11 16:01:48 2014 @@ -17,27 +17,18 @@ var resSubmitted = 0; var suggestTimeData = {} var resbtntxt = ''; - -function RPCwrapper(data, CB, dojson) { - if(dojson) { - dojo.xhrPost({ - url: 'index.php', - load: CB, - handleAs: "json", - error: errorHandler, - content: data, - timeout: 30000 - }); - } - else { - dojo.xhrPost({ - url: 'index.php', - load: CB, - error: errorHandler, - content: data, - timeout: 30000 - }); - } +var waittimetimeout = null; +var durationchanged = 0; +var initialimageset = 0; +var resconfigmapid = 0; +var revisiongrids; +var waittimeobj; +var waittimeh; + +var profilesstoredata = { + identifier: 'id', + label: 'name', + items: [] } function generalReqCB(data, ioArgs) { @@ -45,46 +36,502 @@ function generalReqCB(data, ioArgs) { document.body.style.cursor = 'default'; } +function initViewRequests(imaging) { + if(typeof(dijit) == "undefined" || + typeof(dijit.byId) == "undefined" || + typeof(images) == "undefined") { + setTimeout(function() {initViewRequests(imaging);}, 100); + return; + } + if(dijit.byId('deployimage')) + setLastImage(); + if(imaging) { + if(imagingaccess == 0) { + var btn = new dijit.form.Button({ + label: 'Close' + }); + var dlg = new dijit.Dialog({ + id: 'noimageaccessdlg', + title: 'Create / Update an Image', + content: 'You do not have access to create or update any images.<br><br>', + style: 'width: 300px; text-align: center;', + closable: false + }); + dojo.style(dijit.byId('noimageaccessdlg').closeButtonNode, 'display', 'none'); + dlg.containerNode.appendChild(btn.domNode); + dojo.connect(btn, "onClick", function () {dlg.destroy();}); + dlg.show(); + } + else { + dojo.byId('imagingrdo').checked = true; + selectResType(); + dijit.byId('newResDlg').show(); + } + } + setTimeout(function() {initialimageset = 1;}, 1); +} + +function showNewResDlg() { + resetNewResDlg(); + if(dojo.byId('basicrdo')) { + selectResType(); + selectEnvironment(); + } + if(dijit.byId('newResDlgBtn')) + dijit.byId('newResDlgBtn').set('disabled', false); + dijit.byId('newResDlg').show(); +} + +function resetNewResDlg() { + if(! dijit.byId('deployimage')) + return; + setLastImage(); + dojo.byId('basicrdo').checked = true; + selectResType(); + dijit.byId('deployprofileid').reset(); + dijit.byId('deployname').reset(); + resetSelect('deployadmingroup'); + resetSelect('deploylogingroup'); + //dijit.byId('deployfixedMAC').reset(); + //dijit.byId('deploymonitored').reset(); + dijit.byId('deployfixedIP').reset(); + dijit.byId('deploynetmask').reset(); + dijit.byId('deployrouter').reset(); + dijit.byId('deploydns').reset(); + resetSelect('deploystartday'); + resetSelect('deployhour'); + resetSelect('deploymin'); + resetSelect('deploymeridian'); + dojo.byId('startnow').checked = true; + if(dijit.byId('deploystartdate')) { + dijit.byId('deploystartdate')._hasBeenBlurred = false; + dijit.byId('deploystartdate').reset(); + } + if(dijit.byId('deploystarttime')) { + dijit.byId('deploystarttime')._hasBeenBlurred = false; + dijit.byId('deploystarttime').reset(); + } + if(dijit.byId('deployenddate')) { + dijit.byId('deployenddate')._hasBeenBlurred = false; + dijit.byId('deployenddate').reset(); + } + if(dijit.byId('deployendtime')) { + dijit.byId('deployendtime')._hasBeenBlurred = false; + dijit.byId('deployendtime').reset(); + } + resetSelect('reqlength'); + if(dojo.byId('endduration')) + setTimeout(function() { + // have to reset again to clear warning icons + dijit.byId('deployendtime').reset(); + dijit.byId('deployenddate').reset(); + dojo.byId('endduration').checked = true; + }, 1); + dojo.byId('deployerr').innerHTML = ''; +} + +function setLastImage() { + var sel = dijit.byId('deployimage'); + sel.set('value', lastimageid); + checkSelectedInList(); +} + +function selectResType() { + if(dojo.byId('basicrdo').checked || dojo.byId('imagingrdo').checked) { + dojo.removeClass('limitstart', 'hidden'); + dojo.removeClass('durationend', 'hidden'); + dojo.addClass('whentitleserver', 'hidden'); + dojo.addClass('deployprofileslist', 'hidden'); + dojo.addClass('nrnamespan', 'hidden'); + dojo.addClass('nrservergroupspan', 'hidden'); + //dojo.addClass('nrmacaddrspan', 'hidden'); + //dojo.addClass('nrmonitoredspan', 'hidden'); + dojo.addClass('nrfixedipdiv2', 'hidden'); + dojo.addClass('anystart', 'hidden'); + dojo.addClass('indefinteend', 'hidden'); + //hideDijitButton('newResDlgShowConfigBtn'); // finishconfigs + if(dojo.byId('openend').value == 1) { + dojo.removeClass('endlbl', 'hidden'); + dojo.removeClass('specifyend', 'hidden'); + } + else { + dojo.addClass('endlbl', 'hidden'); + dojo.addClass('specifyend', 'hidden'); + } + if(dojo.byId('endat') && ! dojo.byId('endat').checked) { + dojo.byId('endduration').checked = true; + delayedUpdateWaitTime(0, 50); + } + } + if(dojo.byId('basicrdo').checked) { + dijit.byId('deployimage').set('query', {basic: 1, checkout: 1}); + checkSelectedInList(); + var imageid = getSelectValue('deployimage'); + var item = dijit.byId('deployimage').get('item'); + var max = imagestore.getValue(item, 'maxinitialtime'); + if(max) + setMaxRequestLength(max); + else + setMaxRequestLength(defaultMaxTime); + dojo.removeClass('whentitlebasic', 'hidden'); + dojo.addClass('whentitleimaging', 'hidden'); + if(! durationchanged) + dojo.byId('reqlength').value = 60; + } + if(dojo.byId('imagingrdo').checked) { + dijit.byId('deployimage').set('query', {imaging: 1}); + checkSelectedInList(); + setMaxRequestLength(maximaging); + dojo.removeClass('whentitleimaging', 'hidden'); + dojo.addClass('whentitlebasic', 'hidden'); + if(! durationchanged) + dojo.byId('reqlength').value = 480; + } + if(dojo.byId('serverrdo').checked) { + dijit.byId('deployimage').set('query', {server: 1, checkout: 1}); + checkSelectedInList(); + dijit.byId('deploystarttime').set('required', true); + dijit.byId('deploystartdate').set('required', true); + dojo.addClass('waittime', 'hidden'); + dojo.addClass('deployerr', 'hidden'); + if(dojo.hasClass('anystart', 'hidden') && + dojo.byId('startlater') && + dojo.byId('startlater').checked) { + delayedUpdateWaitTime(0, 50); + } + dojo.addClass('whentitlebasic', 'hidden'); + dojo.addClass('whentitleimaging', 'hidden'); + dojo.addClass('limitstart', 'hidden'); + dojo.addClass('durationend', 'hidden'); + dojo.removeClass('whentitleserver', 'hidden'); + if(profilesstore._arrayOfAllItems.length != 0) + dojo.removeClass('deployprofileslist', 'hidden'); + dojo.removeClass('nrnamespan', 'hidden'); + dojo.removeClass('nrservergroupspan', 'hidden'); + //dojo.removeClass('nrmacaddrspan', 'hidden'); + //dojo.removeClass('nrmonitoredspan', 'hidden'); + dojo.removeClass('nrfixedipdiv2', 'hidden'); + dojo.removeClass('anystart', 'hidden'); + dojo.removeClass('indefinteend', 'hidden'); + dojo.removeClass('endlbl', 'hidden'); + dojo.removeClass('specifyend', 'hidden'); + //showDijitButton('newResDlgShowConfigBtn'); // finishconfigs + if(dojo.byId('endat') && ! dojo.byId('endat').checked) { + dojo.byId('endindef').checked = true; + delayedUpdateWaitTime(0, 50); + } + } + resetDeployBtnLabel(); + resizeRecenterDijitDialog('newResDlg'); +} + +function checkSelectedInList() { + var sel = dijit.byId('deployimage'); + var q = new Object(); + for(v in sel.query) + q[v] = sel.query[v]; + q.id = sel.get('value'); + sel.store.fetch({ + query: q, + onComplete: function(items, request) { + if(items.length == 0) + setFirstAvailableImage(); + } + }); +} + +function setFirstAvailableImage() { + var sel = dijit.byId('deployimage'); + sel.store.fetch({ + query: sel.query, + onItem: function(item, request) { + sel.set('value', item['id']); + }, + count: 1 + }); +} + function selectEnvironment() { - var imageid = getSelectValue('imagesel'); - if(maxTimes[imageid]) - setMaxRequestLength(maxTimes[imageid]); + if(! initialimageset) + return; + var imageid = getSelectValue('deployimage'); + var item = dijit.byId('deployimage').get('item'); + var max = imagestore.getValue(item, 'maxinitialtime'); + if(max) + setMaxRequestLength(max); else setMaxRequestLength(defaultMaxTime); - updateWaitTime(1); + dijit.byId('deployname').reset(); + delayedUpdateWaitTime(1, 50); +} + +function delayedUpdateWaitTime(cleardesc, time) { + clearTimeout(waittimetimeout); + waittimetimeout = setTimeout(function() {updateWaitTime(cleardesc);}, time); } function updateWaitTime(cleardesc) { if(! dojo.byId('waittime')) return; - var desconly = 0; + dojo.addClass('waittime', 'hidden'); + if(! validateDeployInputs()) { + if(cleardesc) { + getImageDescription(); + if(dojo.byId('serverrdo').checked) + configureSystem(); + } + return; + } + dijit.byId('newResDlgBtn').set('disabled', false); if(cleardesc) dojo.byId('imgdesc').innerHTML = ''; - dojo.byId('waittime').innerHTML = ''; - if(! dojo.byId('timenow').checked) { - dojo.byId('waittime').className = 'hidden'; - desconly = 1; - } - if(dojo.byId('openend') && - dojo.byId('openend').checked) { - dojo.byId('waittime').className = 'hidden'; - desconly = 1; - } - var imageid = getSelectValue('imagesel'); - if(dojo.byId('reqlength')) - var length = dojo.byId('reqlength').value; + var data = getDeployData(1); + data.continuation = dojo.byId('waitcontinuation').value; + document.body.style.cursor = 'wait'; + /*if(typeof waittimeobj !== 'undefined') + waittimeobj.cancel(); + waittimeobj = RPCwrapper(data, generalReqCB, 0, 30000);*/ + RPCwrapper(data, generalReqCB, 0, 30000); + if(dojo.byId('serverrdo').checked) + configureSystem(); +} + +function validateDeployInputs() { + if(dijit.byId('deployimage') && + ! checkValidatedObj('deployimage')) { + dijit.byId('newResDlgBtn').set('disabled', true); + return false; + } + if(dojo.byId('endat').checked && + (! dijit.byId('deployenddate').isValid() || + ! dijit.byId('deployendtime').isValid())) { + dijit.byId('newResDlgBtn').set('disabled', true); + if(! checkValidatedObj('deployenddate', 'deployerr') || + ! checkValidatedObj('deployendtime', 'deployerr')) + return false; + } + if(dojo.byId('serverrdo').checked && + dojo.byId('startlater') && dojo.byId('startlater').checked && + (! dijit.byId('deploystartdate').isValid() || + ! dijit.byId('deploystarttime').isValid())) { + dijit.byId('newResDlgBtn').set('disabled', true); + if(! checkValidatedObj('deploystartdate', 'deployerr') || + ! checkValidatedObj('deploystarttime', 'deployerr')) + return false; + } + if(dojo.byId('serverrdo').checked && + dijit.byId('deployfixedIP') && + ! checkValidatedObj('deployfixedIP', 'deployerr')) { + return false; + } + var now = new Date(); + now.setMilliseconds(0); + var nowts = parseInt(now.getTime() / 1000); + if(dojo.byId('startlater').checked) { + if(dojo.byId('serverrdo').checked) { + var start = dijit.byId('deploystartdate').get('value'); + var time = dijit.byId('deploystarttime').get('value'); + start.setHours(time.getHours()); + start.setMinutes(time.getMinutes()); + var teststart = parseInt(start.getTime() / 1000); + if(start < now) { + dojo.byId('deployerr').innerHTML = _('The start day and time must be in the future.'); + dojo.removeClass('deployerr', 'hidden'); + dijit.byId('newResDlgBtn').set('disabled', true); + return false; + } + } + else { + var tmp = dojo.byId('deploystartday').value; + var teststart = new Date(tmp * 1000); + var hour = parseInt(dojo.byId('deployhour').value); + var m = dojo.byId('deploymeridian').value; + if(m == 'pm' && hour < 12) + hour += 12; + else if(m == 'am' && hour == 12) + hour = 0; + teststart.setHours(hour); + teststart.setMinutes(dojo.byId('deploymin').value); + teststart.setSeconds(0); + if(teststart < now) { + dojo.byId('deployerr').innerHTML = _('The start day and time must be in the future.'); + dojo.removeClass('deployerr', 'hidden'); + dijit.byId('newResDlgBtn').set('disabled', true); + return false; + } + teststart = parseInt(teststart.getTime() / 1000); + } + } + if(dojo.byId('endat') && dojo.byId('endat').checked) { + var end = dijit.byId('deployenddate').get('value'); + var time = dijit.byId('deployendtime').get('value'); + end.setHours(time.getHours()); + end.setMinutes(time.getMinutes()); + var endts = parseInt(end.getTime() / 1000); + if(nowts + 1800 > endts) { + dojo.byId('deployerr').innerHTML = _('The end time must be at least 30 minutes in the future.'); + dojo.removeClass('deployerr', 'hidden'); + dijit.byId('newResDlgBtn').set('disabled', true); + return false; + } + if(dojo.byId('startnow').checked) { + var teststart = new Date(); + teststart.setMilliseconds(0); + teststart = parseInt(teststart.getTime() / 1000); + } + if(teststart > endts) { + dojo.byId('deployerr').innerHTML = _('The end time must be after the start time.'); + dojo.removeClass('deployerr', 'hidden'); + dijit.byId('newResDlgBtn').set('disabled', true); + return false; + } + if(teststart + 1800 > endts) { + dojo.byId('deployerr').innerHTML = _('The end time is too close to the start time.'); + dojo.removeClass('deployerr', 'hidden'); + dijit.byId('newResDlgBtn').set('disabled', true); + return false; + } + } + if(! dojo.byId('serverrdo').checked) + return true; + + if(! checkValidatedObj('deployname', 'deployerr') || + ! checkValidatedObj('deployadmingroup', 'deployerr') || + ! checkValidatedObj('deploylogingroup', 'deployerr') || + //! checkValidatedObj('deployfixedMAC', 'deployerr') || + ! checkValidatedObj('deploynetmask', 'deployerr') || + ! checkValidatedObj('deployrouter', 'deployerr') || + ! checkValidatedObj('deploydns', 'deployerr')) + return false; + return true; +} + +function getDeployData(waitonly) { + var data = {imageid: getSelectValue('deployimage')} + if(dojo.byId('startlater').checked) { + if(dojo.byId('serverrdo').checked) { + var start = dijit.byId('deploystartdate').get('value'); + var time = dijit.byId('deploystarttime').get('value'); + start.setHours(time.getHours()); + start.setMinutes(time.getMinutes()); + data.start = parseInt(start.getTime() / 1000); + } + else { + var tmp = dojo.byId('deploystartday').value; + var date = new Date(tmp * 1000); + var hour = parseInt(dojo.byId('deployhour').value); + var m = dojo.byId('deploymeridian').value; + if(m == 'pm' && hour < 12) + hour += 12; + else if(m == 'am' && hour == 12) + hour = 0; + date.setHours(hour); + date.setMinutes(dojo.byId('deploymin').value); + date.setSeconds(0); + data.start = parseInt(date.getTime() / 1000); + } + } + else { + data.start = 'zero'; + } + if(dojo.byId('endindef') && dojo.byId('endindef').checked) { + data.ending = 'indefinite'; + } + else if(dojo.byId('endat') && dojo.byId('endat').checked) { + data.ending = 'endat'; + var end = dijit.byId('deployenddate').get('value'); + var time = dijit.byId('deployendtime').get('value'); + end.setHours(time.getHours()); + end.setMinutes(time.getMinutes()); + data.end = parseInt(end.getTime() / 1000); + } + else { + data.ending = 'duration'; + data.duration = dojo.byId('reqlength').value; + } + if(dojo.byId('basicrdo').checked) + data.type = 'basic'; + else if(dojo.byId('imagingrdo').checked) + data.type = 'imaging'; + else if(dojo.byId('serverrdo').checked) + data.type = 'server'; + if(dojo.byId('serverrdo').checked && + dijit.byId('deployfixedIP') && + dijit.byId('deployfixedIP').get('value') != '') { + data.fixedIP = dijit.byId('deployfixedIP').get('value'); + } + if(waitonly) + return data; + + // finishconfigs + /*if(dojo.byId('serverrdo').checked) + data.configdata = getConfigData();*/ + data.profileid = dojo.byId('appliedprofileid').value; + data.name = dijit.byId('deployname').get('value'); + data.admingroupid = getSelectValue('deployadmingroup'); + data.logingroupid = getSelectValue('deploylogingroup'); + data.ipaddr = dijit.byId('deployfixedIP').get('value'); + if(data.ipaddr != '') { + data.netmask = dijit.byId('deploynetmask').get('value'); + data.router = dijit.byId('deployrouter').get('value'); + data.dns = dijit.byId('deploydns').get('value'); + } + else { + data.netmask = ''; + data.router = ''; + data.dns = ''; + } + /*data.macaddr = dijit.byId('deployfixedMAC').get('value'); + if(dijit.byId('deploymonitored').get('value') == 'on') + data.monitored = 1; else - var length = 480; - var contid = dojo.byId('waitcontinuation').value; - var data = {continuation: contid, - imageid: imageid, - length: length, - desconly: desconly}; - if(! desconly) - dojo.byId('waittime').className = 'shown'; - //setLoading(); - document.body.style.cursor = 'wait'; - RPCwrapper(data, generalReqCB); + data.monitored = 0;*/ + return data; +} + +function getConfigData() { + var configdata = []; + var tmp = configlist.store._getItemsArray(); + for(var i = 0; i < tmp.length; i++) { + var cfg = ''; + var ids = tmp[i]['id'][0].split('/'); + cfg = '"' + tmp[i]['id']; + cfg += '":{"id":"' + tmp[i]['id']; + cfg += '","applied":"' + tmp[i]['applied']; + if(parseInt(ids[1]) < 0) { + cfg += '","configid":"' + tmp[i]['configid']; + cfg += '","configstageid":"' + tmp[i]['configstageid']; + cfg += '","imageid":"' + tmp[i]['imageid']; + } + cfg += '"}'; + configdata.push(cfg); + } + var allcfgs = configdata.join(','); + + var configvardata = []; + var tmp = dijit.byId('configvariables').store._getItemsArray(); + for(var i = 0; i < tmp.length; i++) { + var cfgvar = ''; + cfgvar = '"' + tmp[i]['id']; + cfgvar += '":{"id":"' + tmp[i]['id']; + cfgvar += '","value":"' + tmp[i]['defaultvalue'][0].replace(/\n/g, '\\n'); + cfgvar += '"}'; + configvardata.push(cfgvar); + } + var allcfgvars = configvardata.join(','); + return '{"configs":{' + allcfgs + '},"configvars":{' + allcfgvars + '}}'; + //return '{"configs":{' + allcfgs + '}}'; +} + +function getImageDescription() { + if(dijit.byId('deployimage') && + ! checkValidatedObj('deployimage')) + return; + dojo.byId('imgdesc').innerHTML = ''; + var data = {continuation: dojo.byId('waitcontinuation').value, + desconly: 1, + imageid: getSelectValue('deployimage')} + RPCwrapper(data, generalReqCB, 0, 30000); } function showSuggestedTimes() { @@ -95,10 +542,11 @@ function showSuggestedTimes() { dijit.byId('suggestedTimes').show(); dojo.byId('suggestContent').innerHTML = ''; dojo.removeClass('suggestloading', 'hidden'); + dijit.byId('suggestDlgBtn').set('disabled', true); showDijitButton('suggestDlgBtn'); dijit.byId('suggestDlgCancelBtn').set('label', _('Cancel')); var data = {continuation: dojo.byId('suggestcont').value}; - RPCwrapper(data, showSuggestedTimesCB, 1); + RPCwrapper(data, showSuggestedTimesCB, 1, 30000); document.body.style.cursor = 'wait'; } @@ -137,39 +585,67 @@ function setSuggestSlot(slot) { dijit.byId('suggestDlgBtn').set('disabled', false); } -function useSuggestedSlot() { +function useSuggestedEditSlot() { var slot = suggestTimeData[dojo.byId('selectedslot').value]; - dojo.byId('laterradio').checked = true; - var s = new Date(parseInt(slot['startts'] + '000')); - dojo.byId('reqday').value = dojox.string.sprintf('%d/%d/%d', s.getMonth() + 1, s.getDate(), s.getFullYear()); - var hm = get12from24(s.getHours()); - dojo.byId('reqhour').value = hm['hour']; - dojo.byId('reqmeridian').value = hm['meridian']; - var min = s.getMinutes(); - if(min == 0) - dojo.byId('reqmin').value = 'zero'; + var start = parseInt(slot['startts'] + '000'); + var s = new Date(start); + if(slot['startts'] == dojo.byId('selectedslot').value) + var e = new Date(start + parseInt(slot['duration'] + '000')); else - dojo.byId('reqmin').value = min; - dojo.byId('reqlength').value = slot['duration'] / 60; - dojo.byId('waittime').className = 'hidden'; + var e = new Date(parseInt(dojo.byId('selectedslot').value + '000')); + var testend = new Date(2038, 0, 1, 0, 0, 0, 0); + if(dojo.byId('deploystartday')) { + var sel = dojo.byId('deploystartday'); + for(var i = 0; i < sel.options.length; i++) { + var testdate = new Date(parseInt(sel.options[i].value + '000')); + if(s.getDay() == testdate.getDay()) { + sel.value = sel.options[i].value; + break; + } + } + var hour = s.getHours(); + if(hour == 0) { + dojo.byId('deployhour').value = 12; + dojo.byId('deploymeridian').value = 'am'; + } + else if(hour == 12) { + dojo.byId('deployhour').value = 12; + dojo.byId('deploymeridian').value = 'pm'; + } + else if(hour > 12) { + dojo.byId('deployhour').value = hour - 12; + dojo.byId('deploymeridian').value = 'pm'; + } + else { + dojo.byId('deployhour').value = hour; + dojo.byId('deploymeridian').value = 'am'; + } + dojo.byId('deploymin').value = s.getMinutes(); + dojo.byId('startlater').checked = true; + } + if(dojo.byId('endduration') && dojo.byId('endduration').checked) + dojo.byId('reqlength').value = parseInt(slot['duration'] / 60); + if(dojo.byId('endat') && dojo.byId('endat').checked) { + dijit.byId('deployenddate').set('value', e); + dijit.byId('deployendtime').set('value', e); + } + if(dojo.byId('startlater') && dojo.byId('startlater').checked) { + dijit.byId('deploystartdate').set('value', s); + dijit.byId('deploystarttime').set('value', s); + } dijit.byId('suggestedTimes').hide(); - updateWaitTime(0); + delayedUpdateWaitTime(0, 50); } function selectLater() { dojo.byId('laterradio').checked = true; - if(dojo.byId('newsubmit')) { + if(dijit.byId('newResDlgBtn')) { if(resbtntxt != '') - dojo.byId('newsubmit').value = resbtntxt; + dijit.byId('newResDlgBtn').set('label', resbtntxt); else - dojo.byId('newsubmit').value = _('Create Reservation'); + dijit.byId('newResDlgBtn').set('label', _('Create Reservation')); } - dojo.byId('waittime').innerHTML = ''; -} - -function selectDuration() { - if(dojo.byId('durationradio')) - dojo.byId('durationradio').checked = true; + dojo.addClass('waittime', 'hidden'); } function selectLength() { @@ -205,14 +681,82 @@ function setOpenEnd() { t.getMinutes()); } +function setStartNow() { + dijit.byId('deploystarttime').set('required', false); + dijit.byId('deploystartdate').set('required', false); + dojo.addClass('waittime', 'hidden'); + dojo.addClass('deployerr', 'hidden'); + delayedUpdateWaitTime(0, 1000); + resetDeployBtnLabel(); +} + +function setStartLater() { + dojo.byId('startlater').checked = true; + if(dojo.byId('basicrdo').checked) { + dijit.byId('deploystarttime').set('required', false); + dijit.byId('deploystartdate').set('required', false); + } + else { + dijit.byId('deploystarttime').set('required', true); + dijit.byId('deploystartdate').set('required', true); + } + dojo.addClass('deployerr', 'hidden'); + dojo.addClass('waittime', 'hidden'); + delayedUpdateWaitTime(0, 1000); + resetDeployBtnLabel(); +} + +function durationChange() { + durationchanged = 1; +} + +function setEndDuration() { + if(dojo.byId('endduration')) + dojo.byId('endduration').checked = true; + dijit.byId('deployendtime').set('required', false); + dijit.byId('deployenddate').set('required', false); + dojo.addClass('deployerr', 'hidden'); + dojo.addClass('waittime', 'hidden'); + delayedUpdateWaitTime(0, 1000); + resetDeployBtnLabel(); +} + +function setEndIndef() { + dijit.byId('deployendtime').set('required', false); + dijit.byId('deployenddate').set('required', false); + dojo.addClass('deployerr', 'hidden'); + dojo.addClass('waittime', 'hidden'); + delayedUpdateWaitTime(0, 1000); + resetDeployBtnLabel(); +} + +function setEndAt() { + dojo.byId('endat').checked = true; + dijit.byId('deployendtime').set('required', true); + dijit.byId('deployenddate').set('required', true); + dojo.addClass('deployerr', 'hidden'); + dojo.addClass('waittime', 'hidden'); + delayedUpdateWaitTime(0, 1000); + resetDeployBtnLabel(); +} + +function resetDeployBtnLabel() { + if(dojo.byId('basicrdo').checked) + dijit.byId('newResDlgBtn').set('label', _("Create Reservation")); + if(dojo.byId('imagingrdo').checked) + dijit.byId('newResDlgBtn').set('label', _("Create Imaging Reservation")); + if(dojo.byId('serverrdo').checked) + dijit.byId('newResDlgBtn').set('label', _("Deploy Server")); +} + function checkValidImage() { if(resSubmitted) return false; - if(dijit.byId('imagesel') && ! dijit.byId('imagesel').isValid()) { + if(dijit.byId('deployimage') && ! dijit.byId('deployimage').isValid()) { alert(_('Please select a valid environment.')); return false; } - if(dojo.byId('newsubmit').value == _('View Available Times')) { + if(dijit.byId('newResDlgBtn').get('label') == _('View Available Times')) { showSuggestedTimes(); return false; } @@ -226,6 +770,8 @@ function setMaxRequestLength(minutes) { var text; var newminutes; var tmp; + var saveduration = obj.options[obj.selectedIndex].value; + var saveindex = obj.selectedIndex; for(i = obj.length - 1; i >= 0; i--) { if(parseInt(obj.options[i].value) > minutes) obj.options[i] = null; @@ -271,6 +817,422 @@ function setMaxRequestLength(minutes) { } obj.options[i + 1] = new Option(text, newminutes); } + if(saveindex > i) + obj.value = minutes; + else + obj.value = saveduration; +} + +function configureSystem() { + return; // finishconfigs + var data = {continuation: dojo.byId('configcont').value, + imageid: getSelectValue('deployimage')}; + RPCwrapper(data, configureSystemCB, 1, 30000); +} + +function configureSystemCB(data, ioArgs) { + var vardata = {identifier: 'id', label: 'name', items: data.items.configs}; + var newstore = new dojo.data.ItemFileWriteStore({data: vardata}); + var oldstore = configlist.store; + configlist.setStore(newstore); + delete oldstore; + + var vardata2 = {identifier: 'id', label: 'name', items: data.items.variables}; + var newstore2 = new dojo.data.ItemFileWriteStore({data: vardata2}); + oldstore = dijit.byId('configvariables').store; + dijit.byId('configvariables').setStore(newstore2, '', {query: {id: ''}}); + delete oldstore; + + // finishconfigs + /*if(data.items.configs.length == 0) + dijit.byId('newResDlgShowConfigBtn').set('disabled', true); + else + dijit.byId('newResDlgShowConfigBtn').set('disabled', false);*/ + + if(dijit.byId('clustertree')) + dijit.byId('clustertree').destroy(); + if(data.items.cluster) { + dojo.removeClass('clusterdiv', 'hidden'); + var treedata = {identifier: 'id', label: 'image', items: data.items.subimages}; + var store = new dojo.data.ItemFileReadStore({data: treedata}); + var model = new dijit.tree.ForestStoreModel({ + store: store, + query: {id: '*'}, + rootId: 'root', + rootLabel: dijit.byId('deployimage').attr('displayedValue'), + childrenAttrs: ['children'] + }); + var div = document.createElement('div'); + dojo.byId('treeparent').appendChild(div); + var tree = dijit.Tree({model: model, id: 'clustertree', onClick: subimageSelected}, div); + } + else { + dojo.addClass('clusterdiv', 'hidden'); + } +} + +function showConfigureSystem() { + if(dojo.hasClass('clusterdiv', 'hidden')) + setTimeout(function() {configlist.setQuery({id: '*'});}, 1); + else + setTimeout(function() { + configlist.setQuery({id: '0/*', cluster: 0}); + var tree = dijit.byId('clustertree'); + tree.attr('path', ['root']); + var node = tree._itemNodesMap['root']; + tree.focusNode(node[0]); + }, 1); + dojo.addClass('configdatadiv', 'hidden'); + dijit.byId('newResConfigDlg').show(); +} + +function closeConfigureSystem() { + dijit.byId('newResConfigDlg').hide(); + saveSelectedConfig(); + if(configlist.selection.selectedIndex >= 0) + configlist.selection.setSelected(configlist.selection.selectedIndex, false); + dojo.byId('configtype').innerHTML = ''; + dojo.byId('configapplychk').checked = false; + dojo.byId('configkey').innerHTML = ''; + dijit.byId('configvalueint').reset(); + dijit.byId('configvaluefloat').reset(); + dijit.byId('configvaluestring').reset(); + dijit.byId('configvaluetext').reset(); + dojo.addClass('configvalint', 'hidden'); + dojo.removeClass('configvalstring', 'hidden'); + dijit.byId('configvariables').setStore(dijit.byId('configvariables').store, '', {query: {configid: ''}}); +} + +function subimageSelected(item) { + if(item.id == 'root') + var searchid = 0; + else + var searchid = item.id[0]; + configlist.setQuery({id: searchid + '/*', cluster: 0}); + configlist.selection.clear(); + dojo.byId('configtype').innerHTML = ''; + dojo.byId('configapplychk').checked = false; + dojo.addClass('configdatadiv', 'hidden'); +} + +function addReservationConfig() { + var item = dijit.byId('addconfigsel').get('item'); + var newitem = {}; + var node = dijit.byId('clustertree').selectedItem; + if(node.id == 'root') { + var subimageid = 0; + var imageid = dijit.byId('deployimage').value; + } + else { + var subimageid = node.id[0]; + var imageid = node.childimageid[0]; + } + newitem.configmaptype = 'Reservation'; + resconfigmapid--; + //newitem.configmaptypeid = '5'; // TODO rather not hard code this + newitem.configid = item.id; + newitem.id = subimageid + '/' + resconfigmapid; + newitem.config = item.name; + newitem.configdata = item.data; + newitem.subid = 1; + newitem.affiliationid = 1; + newitem.affiliation = ''; + newitem.configstageid = 1; // TODO set this from another select object + newitem.configstage = ''; + newitem.subimageid = null; + newitem.configsubimageid = null; + newitem.disabled = 0; + newitem.configmapid = resconfigmapid; + newitem.cluster = 0; + newitem.applied = true; + newitem.configdata = item.data; + newitem.ownerid = item.ownerid; + newitem.owner = item.owner; + newitem.configtype = item.configtype; + newitem.configtypeid = item.configtypeid; + newitem.imageid = imageid; + configlist.store.newItem(newitem); + setTimeout(function() {configlist.setQuery({id: subimageid + '/*', cluster: 0});}, 1); + for(var i = 0; i < item.variables.length; i++) { + var fromvar = item.variables[i]; + var newvar = {}; + newvar.id = newitem.id + '/' + fromvar.id; // configid/configvariableid - configid is of form configsubimageid/configmapid + newvar.name = fromvar.name; + newvar.description = ''; + newvar.configid = fromvar.configid; + newvar.type = ''; + newvar.datatype = fromvar.datatype; + newvar.datatypeid = fromvar.datatypeid; + newvar.defaultvalue = fromvar.defaultvalue; + newvar.required = fromvar.required; + newvar.identifier = fromvar.identifier; + newvar.ask = parseInt(fromvar.ask); + dijit.byId('configvariables').store.newItem(newvar); + } +} + +function configSelected(rowIndex) { + var item = configlist.getItem(rowIndex); + var store = configlist.store; + dojo.byId('configtype').innerHTML = store.getValue(item, 'configtype'); + var optional = store.getValue(item, 'optional'); + if(! optional) { + dojo.byId('configapplychk').checked = true; + dojo.byId('configapplychk').disabled = true; + } + else { + dojo.byId('configapplychk').disabled = false; + if(store.getValue(item, 'applied')) + dojo.byId('configapplychk').checked = true; + else + dojo.byId('configapplychk').checked = false; + } + + var configtype = store.getValue(item, 'configtype'); + if(configtype == 'VLAN' || configtype == 'Cluster') + dojo.addClass('configdatadiv', 'hidden'); + else { + dijit.byId('viewconfigdatabtn').set('disabled', false); + dijit.byId('configvariables').set('disabled', false); + dijit.byId('configvariables').setStore(dijit.byId('configvariables').store, '', {query: {id: store.getValue(item, 'id') + '/*', ask: 1}}); + if(dijit.byId('configvariables').options.length) + dojo.removeClass('configvariablediv', 'hidden'); + else + dojo.addClass('configvariablediv', 'hidden'); + dojo.removeClass('configdatadiv', 'hidden'); + } +} + +function setApplyConfig() { + var item = configlist.getItem(configlist.selection.selectedIndex); + var store = configlist.store; + if(dojo.byId('configapplychk').checked) + store.setValue(item, 'applied', true); + else + store.setValue(item, 'applied', false); +} + +function showConfigData() { + var item = configlist.getItem(configlist.selection.selectedIndex); + var store = configlist.store; + var data = store.getValue(item, 'configdata'); + dijit.byId('configdatadlg').set('content', data.replace(/\n/g, "<br>")); +} + +function selectConfigVariable() { + var store = dijit.byId('configvariables').store; + store.fetch({ + query: {id: dijit.byId('configvariables').get('value')}, + onItem: function(item, request) { + dojo.byId('configkey').innerHTML = store.getValue(item, 'identifier'); + var type = store.getValue(item, 'datatype'); + var value = store.getValue(item, 'defaultvalue'); + dojo.addClass('configvalbool', 'hidden'); + dojo.addClass('configvalint', 'hidden'); + dojo.addClass('configvalfloat', 'hidden'); + dojo.addClass('configvalstring', 'hidden'); + dojo.addClass('configvaltext', 'hidden'); + dojo.removeClass('configval' + type, 'hidden'); + dijit.byId('configvalue' + type).set('value', value); + if(store.getValue(item, 'required')) + dojo.byId('configrequired').innerHTML = 'yes'; + else + dojo.byId('configrequired').innerHTML = 'no'; + } + }); +} + +function saveSelectedConfig() { + if(configlist.selection.selectedIndex < 0) + return; + var item = configlist.getItem(configlist.selection.selectedIndex); + var store = configlist.store; + if(store.getValue(item, 'optional') && dojo.byId('configapplychk').checked) + store.setValue(item, 'applied', true); +} + +function saveSelectedConfigVar() { + var store = dijit.byId('configvariables').store; + store.fetch({ + query: {id: dijit.byId('configvariables').get('value')}, + onItem: function(item, request) { + var type = store.getValue(item, 'datatype'); + store.setValue(item, 'defaultvalue', dijit.byId('configvalue' + type).get('value')); + } + }); +} + +function promptRevisions() { + document.body.style.cursor = 'wait'; + var item = dijit.byId('deployimage').get('item'); + var imageid = imagestore.getValue(item, 'id'); + if(dijit.byId('imageRevisionDlg')) + dijit.byId('imageRevisionDlg').destroyRecursive(); + var divall = document.createElement('div'); + var div1 = document.createElement('div'); + div1.innerHTML = _("There are multiple versions of this environment available.") + "<br>" + + _("Please select the version you would like to check out:"); + divall.appendChild(div1); + var div2 = document.createElement('div'); + div2.id = 'imageRevisionContent'; + div2.style.height = "85%"; + div2.style.width = "88%"; + div2.style.overflow = "auto"; + divall.appendChild(div2); + var div3 = document.createElement('div'); + div3.style.textAlign = "center"; + var btn1 = new dijit.form.Button({ + id: 'imageRevBtn', + label: dijit.byId('newResDlgBtn').label, + }, document.createElement('div')); + dojo.connect(btn1, 'onClick', submitNewReservation); + div3.appendChild(btn1.domNode); + var btn2 = new dijit.form.Button({ + label: _('Cancel'), + }, document.createElement('div')); + dojo.connect(btn2, 'onClick', function() {dijit.byId('imageRevisionDlg').hide();}); + div3.appendChild(btn2.domNode); + divall.appendChild(div3); + var dlg = new dijit.Dialog({ + id: 'imageRevisionDlg', + title: _('Select Image Revisions'), + content: divall, + width: "50%", + style: "width: 50%", + autofocus: false + }); + detailimagestore.get(imageid).then(promptRevisionsCB); +} + +function promptRevisionsCB(item) { + revisiongrids = new Array(); + addRevisionSelection(item); + if(! dojo.byId('imagingrdo').checked && + item.imagemetaid != null && + item.subimages.length) { + for(var i = 0; i < item.subimages.length; i++) { + detailimagestore.get(item.subimages[i]).then(function(item) {addRevisionSelection(item);}); + } + } + dijit.byId('newResDlgBtn').set('disabled', false); + if(! dojo.byId('imagingrdo').checked && + item.imagemetaid != null && + item.subimages.length) + setTimeout(function() {showRevisionDlg(item.subimages.length + 1);}, 100); + else + showRevisionDlg(1); +} + +function addRevisionSelection(item) { + var mstore = new dojo.store.Memory({data: item.imagerevision}); + var wrapper = new dojo.data.ObjectStore({objectStore: mstore}); + var layout = [ + {field: 'revision', name: 'Revision', width: '60px'}, + {field: 'user', name: 'User', width: '130px'}, + {field: 'prettydate', name: 'Created', width: '110px'}, + {field: 'production', name: 'Production', width: '60px'} + ]; + var div = document.createElement('div'); + div.style.width = "100%"; + var grid = new dojox.grid.DataGrid( + { + store: wrapper, + structure: layout, + autoHeight: true + }, + div + ); + grid.startup(); + var node = document.createElement('b'); + node.innerHTML = '<br><big>' + item.prettyname + ':</big>'; + dojo.byId('imageRevisionContent').appendChild(node); + dojo.byId('imageRevisionContent').appendChild(grid.domNode); + grid.render(); + var newobj = new Object(); + newobj.grid = grid; + newobj.imageid = item.id; + revisiongrids.push(newobj); +} + +function showRevisionDlg(count) { + if(revisiongrids.length == count) { + var waiting = 0; + for(var i = 0; i < count; i++) { + revisiongrids[i].grid.render(); + if(! revisiongrids[i].grid._isLoaded) { + waiting = 1; + break; + } + } + if(! waiting) { + document.body.style.cursor = 'default'; + dijit.byId('imageRevisionDlg').show(); + dijit.byId('imageRevisionDlg').domNode.childNodes[3].style.width = "96%"; + return; + } + } + setTimeout(function() {showRevisionDlg(count);}, 100); +} + +function submitNewReservation() { + if(! validateDeployInputs()) { + return; + } + if(dijit.byId('newResDlgBtn').get('label') == _('View Available Times')) { + showSuggestedTimes(); + return; + } + if(! dijit.byId('imageRevisionDlg') || ! dijit.byId('imageRevisionDlg').open) { + var item = dijit.byId('deployimage').get('item'); + if(imagestore.getValue(item, 'revisions')) { + dijit.byId('newResDlgBtn').set('disabled', true); + promptRevisions(); + return; + } + } + var data = getDeployData(0); + if(dijit.byId('imageRevisionDlg') && dijit.byId('imageRevisionDlg').open) { + revids = new Array(); + for(var i = 0; i < revisiongrids.length; i++) { + var sel = revisiongrids[i].grid.selection.getSelected(); + if(sel.length) + revids.push(sel[0].id); + else + revids.push(0); + } + data.revisionid = revids.join(':'); + dijit.byId('imageRevBtn').set('label', _('Working...')); + dijit.byId('imageRevBtn').set('disabled', true); + } + else { + dijit.byId('newResDlgBtn').set('disabled', true); + } + data.continuation = dojo.byId('deploycont').value; + RPCwrapper(data, submitNewReservationCB, 1, 30000); +} + +function submitNewReservationCB(data, ioArgs) { + if(dijit.byId('imageRevisionDlg') && dijit.byId('imageRevisionDlg').open) { + dijit.byId('imageRevisionDlg').hide(); + dojo.byId('imageRevisionContent').innerHTML = ''; + dijit.byId('imageRevBtn').set('label', dijit.byId('newResDlgBtn').label); + dijit.byId('imageRevBtn').set('disabled', false); + } + dijit.byId('newResDlgBtn').set('disabled', false); + if(data.items.err == 1) { + dojo.removeClass('deployerr', 'hidden'); + dojo.byId('deployerr').innerHTML = data.items.errmsg; + dojo.byId('waittime').innerHTML = ''; + return; + } + else if(data.items.err == 2) { + delayedUpdateWaitTime(0, 50); + return; + } + else if(data.items.err == 0) { + resRefresh(); + dijit.byId('newResDlg').hide(); + } } function checkTimeouts() { @@ -302,7 +1264,7 @@ function resRefresh() { incdetails: incdetails}; if(dojo.byId('detailreqid')) data.reqid = dojo.byId('detailreqid').value; - RPCwrapper(data, generalReqCB); + RPCwrapper(data, generalReqCB, 0, 30000); } function showResStatusPane(reqid) { @@ -340,8 +1302,18 @@ function showWindow(name) { obj.show(); } +function connectRequest(cont) { + RPCwrapper({continuation: cont}, connectRequestCB, 1); +} + +function connectRequestCB(data, ioArgs) { + dijit.byId('connectDlgContent').set('content', data.items.html); + dijit.byId('connectDlg').show(); + setTimeout(checkConnectTimeout, 15000); +} + function endReservation(cont) { - RPCwrapper({continuation: cont}, endReservationCB, 1); + RPCwrapper({continuation: cont}, endReservationCB, 1, 30000); } function endReservationCB(data, ioArgs) { @@ -360,7 +1332,7 @@ function submitDeleteReservation() { if(dojo.byId('radioprod')) { if(dojo.byId('radioprod').checked) { var cont = dojo.byId('radioprod').value; - RPCwrapper({continuation: cont}, endReservationCB, 1); + RPCwrapper({continuation: cont}, endReservationCB, 1, 30000); return; } else if(dojo.byId('radioend').checked) @@ -374,11 +1346,11 @@ function submitDeleteReservation() { dojo.byId('endResDlgContent').innerHTML = ''; dijit.byId('endResDlg').hide(); document.body.style.cursor = 'wait'; - RPCwrapper(data, generalReqCB); + RPCwrapper(data, generalReqCB, 0, 30000); } function removeReservation(cont) { - RPCwrapper({continuation: cont}, removeReservationCB, 1); + RPCwrapper({continuation: cont}, removeReservationCB, 1, 30000); } function removeReservationCB(data, ioArgs) { @@ -398,12 +1370,12 @@ function submitRemoveReservation() { dojo.byId('remResDlgContent').innerHTML = ''; dijit.byId('remResDlg').hide(); document.body.style.cursor = 'wait'; - RPCwrapper(data, generalReqCB); + RPCwrapper(data, generalReqCB, 0, 30000); } function editReservation(cont) { document.body.style.cursor = 'wait'; - RPCwrapper({continuation: cont}, editReservationCB, 1); + RPCwrapper({continuation: cont}, editReservationCB, 1, 30000); } function editReservationCB(data, ioArgs) { @@ -421,6 +1393,14 @@ function editReservationCB(data, ioArgs) dijit.byId('editResDlgBtn').set('style', 'display: none'); dijit.byId('editResCancelBtn').set('label', _('Okay')); } + else if(data.items.status == 'noindefinite') { + dijit.byId('editResDlgBtn').set('style', 'display: inline'); + dijit.byId('editResCancelBtn').set('label', _('Cancel')); + dojo.byId('editrescont').value = data.items.cont; + dojo.byId('editresid').value = data.items.requestid; + dojo.addClass('indefinitelabel', 'disabledlabel'); + dojo.byId('indefiniteradio').disabled = true; + } else { dijit.byId('editResDlgBtn').set('style', 'display: inline'); dijit.byId('editResCancelBtn').set('label', _('Cancel')); @@ -479,44 +1459,6 @@ function editResOpenEnd() { t.getMinutes()); } -function useSuggestedEditSlot() { - var slot = suggestTimeData[dojo.byId('selectedslot').value]; - var tmp = parseInt(slot['startts'] + '000'); - var s = new Date(tmp); - if(slot['startts'] == dojo.byId('selectedslot').value) - var e = new Date(tmp + parseInt(slot['duration'] + '000')); - else - var e = new Date(parseInt(dojo.byId('selectedslot').value + '000')); - var testend = new Date(2038, 0, 1, 0, 0, 0, 0); - if(dijit.byId('day')) { - var day = dojox.string.sprintf('%d%02d%02d', s.getFullYear(), s.getMonth() + 1, s.getDate()); - dijit.byId('day').set('value', day); - } - if(dijit.byId('editstarttime')) - dijit.byId('editstarttime').set('value', s); - if(! dojo.byId('indefiniteradio') || e < testend) { - if(dijit.byId('openenddate')) - dijit.byId('openenddate').set('value', e); - if(dijit.byId('openendtime')) - dijit.byId('openendtime').set('value', e); - } - - var len = slot['duration'] / 60; - if(dojo.byId('indefiniteradio') && e >= testend) { - dojo.byId('indefiniteradio').checked = true; - } - else if(dijit.byId('length') && dijit.byId('length').getOptions(len.toString())) { - dijit.byId('length').set('value', len); - if(dojo.byId('lengthradio')) - dojo.byId('lengthradio').checked = true; - } - else if(dojo.byId('dateradio')) { - dojo.byId('dateradio').checked = true; - } - - dijit.byId('suggestedTimes').hide(); -} - function submitEditReservation() { if(dijit.byId('editResDlgBtn').get('label') == _('View Available Times')) { dijit.byId('suggestDlgBtn').set('disabled', true); @@ -574,7 +1516,7 @@ function submitEditReservation() { data.endmode = 'indefinite'; } document.body.style.cursor = 'wait'; - RPCwrapper(data, submitEditReservationCB, 1); + RPCwrapper(data, submitEditReservationCB, 1, 30000); } function submitEditReservationCB(data, ioArgs) { @@ -613,7 +1555,7 @@ function submitEditReservationCB(data, i function checkResGone(reqids) { var editresid = dojo.byId('editresid').value; - if(editresid == '') + if(editresid == '' || editresid == 'undefined') return; for(var i = 0; i < reqids.length; i++) { if(editresid == reqids[i]) @@ -658,7 +1600,7 @@ function submitRebootReservation() { else data.reboottype = 0; dijit.byId('rebootdlg').hide(); - RPCwrapper(data, generalReqCB); + RPCwrapper(data, generalReqCB, 0, 30000); } function hideReinstallResDlg() { @@ -672,7 +1614,7 @@ function showReinstallRequest(cont) { dojo.removeClass('reinstallloading', 'hidden'); dijit.byId('reinstalldlg').show(); var data = {continuation: cont}; - RPCwrapper(data, showReinstallRequestCB, 1); + RPCwrapper(data, showReinstallRequestCB, 1, 30000); document.body.style.cursor = 'wait'; } @@ -702,7 +1644,7 @@ function submitReinstallReservation() { } } document.body.style.cursor = 'wait'; - RPCwrapper(data, submitReinstallReservationCB, 1); + RPCwrapper(data, submitReinstallReservationCB, 1, 30000); } function submitReinstallReservationCB(data, ioArgs) { @@ -725,6 +1667,8 @@ function submitReinstallReservationCB(da } } +// TODO get this working +// talk to Andy about preventing vcld from deleting the connecttimeout entry until the end of the reservation function checkConnectTimeout() { var nextcheck = 15; if(! dojo.byId('timeoutvalue')) @@ -734,7 +1678,7 @@ function checkConnectTimeout() { var now = (tmp.getTime() - tmp.getMilliseconds()) / 1000; if(timeout <= now) { var cont = dojo.byId('refreshcont').value; - RPCwrapper({continuation: cont}, checkConnectTimeoutCB, 1); + RPCwrapper({continuation: cont}, checkConnectTimeoutCB, 1, 30000); return; } else if(timeout - now < nextcheck) { @@ -753,34 +1697,3 @@ function checkConnectTimeoutCB(data, ioA } } -function showRDPbutton() { - // submitted by Gerhard Harti from ODU - if(! dojo.byId('counterdiv') || ! dojo.byId('connectdiv')) - return; - var timeInterval = 2; - if(typeof timeInterval === 'undefined' || parseInt(timeInterval) <= 0) { - timeInterval = 1 - } - dojo.addClass('connectdiv', 'hidden'); - dojo.removeClass('counterdiv', 'hidden'); - if(timeInterval == 1) - dojo.byId('counterdiv').innerHTML = _(' Ready to connect in ') + timeInterval + _(' second'); - else - dojo.byId('counterdiv').innerHTML = _(' Ready to connect in ') + timeInterval + _(' seconds'); - var si = setInterval(function() { - if(timeInterval === 0) { - clearInterval(si); - } else { - timeInterval--; - if(timeInterval !== 0) { - if(timeInterval == 1) - dojo.byId('counterdiv').innerHTML = _(' Ready to connect in ') + timeInterval + _(' second'); - else - dojo.byId('counterdiv').innerHTML = _(' Ready to connect in ') + timeInterval + _(' seconds'); - } else { - dojo.addClass('counterdiv', 'hidden'); - dojo.removeClass('connectdiv', 'hidden'); - } - } - }, 1000); -}
