You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vcl.apache.org by jf...@apache.org on 2011/04/29 17:34:23 UTC
svn commit: r1097842 [1/4] - in /incubator/vcl/trunk/web: .ht-inc/ css/ js/
Author: jfthomps
Date: Fri Apr 29 15:34:22 2011
New Revision: 1097842
URL: http://svn.apache.org/viewvc?rev=1097842&view=rev
Log:
VCL-463
VCL-30
VCL-432
VCL-458
xmlrpcWrappers.php:
-modified XMLRPCprocessBlockTime - added check for existance of 'subimages' in array before using it; default to 1 for $compsPerAlloc if it does not exist
-added XMLRPCautoCapture
privileges.php:
-modified getResourcePrivRowHTML - added code to not print manageMapping checkbox for serverprofile type
-modified AJsubmitAddResourcePriv - added checks for server profiles
vcl.css: added .rederrormsg and .noicon
states.php:
-added serverProfiles
-added connectmethodDialogContent
-added jsonImageConnectMethods
-added AJaddImageConnectMethod
-added AJremImageConnectMethod
-added AJsaveServerProfile
-added AJserverProfileData
-added AJdelServerProfile
-added jsonProfileGroupingGroups
-added jsonProfileGroupingProfiles
-added AJaddGroupToProfile
-added AJremGroupFromProfile
-added AJaddProfileToGroup
-added AJremProfileFromGroup
-added AJserverProfileStoreData
-added AJdeployServer
-added AJconfirmDeleteRequest
-added AJsubmitDeleteRequest
-added AJsetImageProduction
-added AJsubmitSetImageProduction
-added AJeditRequest
-added AJsubmitEditRequest
-added AJrebootRequest
-added AJreinstallRequest
-removed editRequest
-removed confirmEditRequest
-removed submitEditRequest
-removed confirmDeleteRequest
-removed submitDeleteRequest
-added startCheckpoint
-added submitCheckpoint
requests.php:
-added STARTMINUTEERR
-modified newReservation - added labels to now and later radiobuttons so that text can be clicked to select
-modified submitRequest - allow any users with "View Debug Information" permission to select any revision of an image
-modified viewRequests - major overhaul to allow most functions to stay on this page and popup dialogs to handle events
-changed all buttons to dijit buttons
-reservations get 3 buttons: Connect, Delete, 'More Options' - 'More Options' is a drop down menu with some subset of 'Edit', 'End Reservation & Create Image', 'Create Image', 'Reboot', and 'Reinstall'
-added handling of server requests
-collapsed debug information into a single column that displays the request id - hovering over the id pops up a box with additional info
-provide a refresh continuation for all cases except having no reservations at all
-print an end reservation dijit dialog
-print an edit reservation dijit dialog
-print a reboot/reinstall dijit dialog
-modified viewRequestInfo - use dijit dialog to confirm deleting of reservation; then send back to time table if came from there
-converted editRequest to AJeditRequest
-removed confirmEditRequest - confirmation done via javascript now
-converted submitEditRequest to AJsubmitEditRequest
-removed printEditNewUpdate - separated out into its own selectable option under 'More Options'
-converted confirmDeleteRequest to AJconfirmDeleteRequest
-converted confirmDeleteRequestProduction to AJconfirmDeleteRequestProduction
-converted submitDeleteRequest to AJsubmitDeleteRequest
-added AJrebootRequest
-added AJreinstallRequest
-modified printReserveItems:
-print startday/hour/minute errors
-added labels to duration and until radio buttons so text can be clicked
-added onChange events to automatically select radio buttons if items under that radio button are modified
-changed specify end time entry to selectable date and time widgets
-modified processRequestInput:
-added checks to minute, meridian
-added check that end time must be after start time
images.php:
-removed bits of long time commented out code
-added startCheckpoint - handles online image capture
-modified editOrAddImage - added editing of connect methods to advanced options; also added dijit dialog to confirm connect methods that much be manually added
-added connectmethodDialogContent
-added jsonImageConnectMethods
-added AJaddImageConnectMethod
-added AJremImageConnectMethod
-modified imageClickThroughAgreement - added processing of comments
-modified submitAddImage - updated so it can be called from another function without printing anything so that it can be used from the autocapture API function
-modified updateExistingImage - updated so it can be called from another function without printing anything so that it can be used from the autocapture API function
-added submitCheckpoint
-added AJsetImageProduction
-added AJsubmitSetImageProduction
-modified addImage - added autocapture field to imagerevision insert query
utils.php:
-modified initGlobals - added serverProfiles to include switch statement
-modified getImages - added installtype and connectmethods to returned data
-added getImageConnectMethods
-modified addOwnedResources - added serverprofiles
-modified getResourcesFromGroups - added serverprofiles
-modified getUsersGroupPerms - check to see if $inlist is empty, and if so return an empty array
-modified isAvailable:
-added $vmhostcheckdone flag so that the temporary table doesn't get dropped/created for each iteration of the loop for cluster reservations
-set $virtual = 0 when editing a reservation so that it will be defined later (VCL-458)
-added check to return earlier if modifying a reservation and no computers are available
-added a DROP TEMPORARY TABLE IF EXISTS before creating it to ensure we don't try to create it a 2nd time
-modified schCheckMaintenance - don't check maintenance entries that are in the past
-modified getRequestInfo:
-added $returnNULL parameter - set to 1 if just want function to return NULL if the request no longer exists
-added serverrequest to returned data - 1 if server request, 0 if not
-modified deleteRequest - also delete from serverrequest if reservation is a server request
-modified getUserRequests - added these fields to returned data: userid, server, serverowner, vmhostid, serverrequestid, fixedIP, fixedMAC, serveradmingroupid, serveradmingroup, serverlogingroupid, serverlogingroup, and monitored
-modified showTimeTable - pass additional info in viewRequestInfo continuation so that it can send user back to viewing time table
-modified requestIsReady - include current state = checkpoint, last state = inuse
-modified prettyDatetime - added flag to include year
-added getConnectMethods
-modified xmlrpccall - added XMLRPCautoCapture
-modified sendHeaders - changed shib logout iframe to be https
-modified getNavMenu - added section for server profiles
-modified getDojoHTML:
-added/updated dojo includes for newRequest, viewRequests, confirmEditOrAddImage, viewRequestInfo, startCheckpoint, and serverProfiles
-added/updated header javascript for viewRequests, viewRequestInfo, and serverProfiles
requests.js:
-modified RPCwrapper - changed handleAs from json-comment-filtered to json
-added selectLater
-added selectDuration
-added selectLength
-added selectEnding
-added setOpenEnd
-modified resRefresh - no longer reload page if detailreqid does not exist; only submit reqid with data if it exists
-added endReservation
-added endReservationCB
-added submitDeleteReservation
-added editReservation
-added editReservationCB
-added hideEditResDlg
-added editResOpenEnd
-added submitEditReservation
-added submitEditReservationCB
-added checkResGone
-added resGone
-added hideRebReinstResDlg
-added rebootRequest
-added reinstallRequest
-added submitRebReinstReservation
images.js:
-added RPCwrapper
-updated all functions using dojo.xhrPost to call RPCwrapper instead
-added addConnectMethod
-added addConnectMethod2
-added addConnectMethod3
-added addConnectMethodCB
-added remConnectMethod
-added remConnectMethodCB
-added updateConnectMethod
initial add of serverprofiles.php
initial add of serverprofiles.js
Added:
incubator/vcl/trunk/web/.ht-inc/serverprofiles.php
incubator/vcl/trunk/web/js/serverprofiles.js
Modified:
incubator/vcl/trunk/web/.ht-inc/images.php
incubator/vcl/trunk/web/.ht-inc/privileges.php
incubator/vcl/trunk/web/.ht-inc/requests.php
incubator/vcl/trunk/web/.ht-inc/states.php
incubator/vcl/trunk/web/.ht-inc/utils.php
incubator/vcl/trunk/web/.ht-inc/xmlrpcWrappers.php
incubator/vcl/trunk/web/css/vcl.css
incubator/vcl/trunk/web/js/images.js
incubator/vcl/trunk/web/js/requests.js
Modified: incubator/vcl/trunk/web/.ht-inc/images.php
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/web/.ht-inc/images.php?rev=1097842&r1=1097841&r2=1097842&view=diff
==============================================================================
--- incubator/vcl/trunk/web/.ht-inc/images.php (original)
+++ incubator/vcl/trunk/web/.ht-inc/images.php Fri Apr 29 15:34:22 2011
@@ -730,6 +730,67 @@ function startImage() {
////////////////////////////////////////////////////////////////////////////////
///
+/// \fn startCheckpoint()
+///
+/// \brief prints page prompting user for image revision comments
+///
+////////////////////////////////////////////////////////////////////////////////
+function startCheckpoint() {
+ global $user;
+ $requestid = getContinuationVar("requestid");
+
+ $data = getRequestInfo($requestid);
+ $disableUpdate = 1;
+ $imageid = '';
+ foreach($data["reservations"] as $res) {
+ if($res["forcheckout"]) {
+ $imageid = $res["imageid"];
+ $revisionid = $res['imagerevisionid'];
+ break;
+ }
+ }
+ print "<H2>Create New Revision of an Online Image</H2>\n";
+ print "This process will create a new revision of the image while ";
+ print "still keeping the reservation online and active.<br><br>\n";
+
+ # input for imagerevision comments
+ $revisions = getImageRevisions($imageid);
+ print "<h3>New Revision Comments</h3>\n";
+ print "Enter any notes for yourself and other admins about the current ";
+ print "state of the image.<br>\nThese are optional and are not visible ";
+ print "to end users:<br>\n";
+ print "<form action=\"" . BASEURL . SCRIPT . "\" method=post>\n";
+ print "<textarea dojoType=\"dijit.form.Textarea\" name=comments ";
+ print "style=\"width: 400px; text-align: left;\"\">\n\n</textarea>\n";
+ print "<h3>Previous Revision Comments</h3>\n";
+ if(array_key_exists($revisionid, $revisions))
+ $comments = $revisions[$revisionid]['comments'];
+ else {
+ $keys = array_keys($revisions);
+ if(count($keys)) {
+ $key = array_pop($keys);
+ $comments = $revisions[$key]['comments'];
+ }
+ else
+ $comments = '';
+ }
+ if(preg_match('/\w/', $comments)) {
+ print "These are the comments from the previous revision ";
+ print "({$revisions[$revisionid]['revision']}):<br>\n";
+ print "{$revisions[$revisionid]['comments']}<br><br>\n";
+ }
+ else
+ print "The previous revision did not have any comments.<br>\n";
+ $cdata = array('requestid' => $requestid,
+ 'nextmode' => 'submitCheckpoint');
+ $cont = addContinuationsEntry('imageClickThroughAgreement', $cdata, SECINDAY, 0);
+ print "<br><br><INPUT type=\"submit\" value=\"Submit\">\n";
+ print "<INPUT type=\"hidden\" name=\"continuation\" value=\"$cont\">\n";
+ print "</FORM>\n";
+}
+
+////////////////////////////////////////////////////////////////////////////////
+///
/// \fn submitImageButton
///
/// \brief wrapper for confirmDeleteImage, editOrAddImage(0), and
@@ -813,18 +874,6 @@ function editOrAddImage($state) {
printSubmitErr(IMGOWNERERR);
print "</TD>\n";
print " </TR>\n";
- /*print " <TR>\n";
- print " <TH align=right>Platform:</TH>\n";
- print " <TD>\n";
- printSelectInput("platformid", $platforms, $data["platformid"]);
- print " </TD>\n";
- print " </TR>\n";
- print " <TR>\n";
- print " <TH align=right>OS:</TH>\n";
- print " <TD>\n";
- printSelectInput("osid", $oslist, $data["osid"]);
- print " </TD>\n";
- print " </TR>\n";*/
print " <TR>\n";
print " <TD colspan=3>\n";
print "<fieldset>\n";
@@ -848,8 +897,8 @@ function editOrAddImage($state) {
print "<fieldset>\n";
print "<legend>Revision Comments</legend>\n";
print "Notes for yourself and other admins about how the image ";
- print "was setup/installed.<br>\nThese are optional and not visible to end ";
- print "users.<br>\n";
+ print "was setup/installed.<br>\nThese are optional and are not visible ";
+ print "to end users.<br>\n";
print "<textarea dojoType=\"dijit.form.Textarea\" name=comments ";
print "style=\"width: 400px; text-align: left;\"\">{$data['comments']}\n\n";
print "</textarea>\n";
@@ -913,7 +962,7 @@ function editOrAddImage($state) {
print " <TR>\n";
print " <TH align=right>Estimated Reload Time (min):</TH>\n";
print " <TD><INPUT type=text name=reloadtime value=\"";
- print $data["reloadtime"] . "\" maxlength=3></TD>\n";
+ print $data["reloadtime"] . "\" maxlength=3 size=4></TD>\n";
print " <TD>";
printSubmitErr(RELOADTIMEERR);
print "</TD>\n";
@@ -958,14 +1007,29 @@ function editOrAddImage($state) {
print " </TR>\n";
}
print " <TR>\n";
+ print " <TH style=\"vertical-align:top; text-align:right;\">Connection methods:</TH>\n";
+ print " <TD>\n";
+ print " <div id=\"connectmethodlist\">\n";
+ foreach($data['connectmethods'] AS $method)
+ print "$method<br>\n";
+ print " </div>\n";
+ $cont = addContinuationsEntry('connectmethodDialogContent', array('imageid' => $data['imageid']));
+ $url = BASEURL . SCRIPT . "?continuation=$cont";
+ print " <div dojoType=\"dijit.form.DropDownButton\" id=\"connectmethoddlg\">\n";
+ print " <span>Modify Connection Methods</span>";
+ print " <div dojoType=\"dijit.TooltipDialog\" href=\"$url\"></div>\n";
+ print " <div>\n";
+ print " </TD>\n";
+ print " </TR>\n";
+ print " <TR>\n";
print " <TD colspan=3 id=hide3><hr></TD>\n";
print " </TR>\n";
print "</TABLE>\n";
if(! $state) {
$cont = addContinuationsEntry('subimageDialogContent', array('imageid' => $data['imageid']));
+ $url = BASEURL . SCRIPT . "?continuation=$cont";
print "<div dojoType=\"dijit.form.DropDownButton\" id=\"subimagebtn\">";
print " <span>Manage Subimages</span>\n";
- $url = BASEURL . SCRIPT . "?continuation=$cont";
print " <div dojoType=\"dijit.TooltipDialog\" id=\"subimagedlg\" href=\"$url\"></div>\n";
print "</div>\n";
@@ -1007,6 +1071,35 @@ function editOrAddImage($state) {
print "<div id=revisiondiv>\n";
print getRevisionHTML($data['imageid']);
print "</div>\n";
+
+ print "<div dojoType=dijit.Dialog\n";
+ print " id=\"autoconfirmdlg\"\n";
+ print " title=\"Confirm Manual Install\"\n";
+ print " duration=250\n";
+ print " draggable=true>\n";
+ print "<strong><span id=\"autoconfirmcontent\"></span></strong><br><br>\n";
+ print "This method cannot be automatically added to the image by VCL. The<br>\n";
+ print "image must be created with the software for this method already installed.<br>\n";
+ print "If this image already has software for this method installed in it, please<br>\n";
+ print "click <strong>Software is Manually Installed</strong>. Otherwise, click cancel.<br><br>\n";
+ print " <div align=\"center\">\n";
+ print " <button dojoType=\"dijit.form.Button\">\n";
+ print " Software is Manually Installed\n";
+ print " <script type=\"dojo/method\" event=\"onClick\">\n";
+ print " dijit.byId('autoconfirmdlg').hide();\n";
+ print " addConnectMethod3();\n";
+ print " dijit.byId('connectmethoddlg').openDropDown();\n";
+ print " </script>\n";
+ print " </button>\n";
+ print " <button dojoType=\"dijit.form.Button\">\n";
+ print " Cancel\n";
+ print " <script type=\"dojo/method\" event=\"onClick\">\n";
+ print " dijit.byId('autoconfirmdlg').hide();\n";
+ print " dijit.byId('connectmethoddlg').openDropDown();\n";
+ print " </script>\n";
+ print " </button>\n";
+ print " </div>\n";
+ print "</div>\n";
}
////////////////////////////////////////////////////////////////////////////////
@@ -1093,6 +1186,220 @@ function getRevisionHTML($imageid) {
////////////////////////////////////////////////////////////////////////////////
///
+/// \fn connectmethodDialogContent()
+///
+/// \brief prints content to fill in the dojo dialog for managing subimages
+///
+////////////////////////////////////////////////////////////////////////////////
+function connectmethodDialogContent() {
+ $imageid = getContinuationVar('imageid');
+ $methods = getConnectMethods($imageid);
+ $curmethods = getImageConnectMethods($imageid);
+
+ $h = "<h3>Modify Connection Methods</h3>";
+ $cdata = array('imageid' => $imageid);
+ $cont = addContinuationsEntry('jsonImageConnectMethods', $cdata);
+ $h .= "<div dojoType=\"dojo.data.ItemFileWriteStore\" url=\"" . BASEURL;
+ $h .= SCRIPT . "?continuation=$cont\" jsid=\"cmstore\" id=\"cmstore\">";
+ $h .= "</div>\n";
+ if(count($methods) == count($curmethods))
+ $disabled = 'disabled="true"';
+ else
+ $disabled = '';
+ $h .= "<div dojoType=\"dijit.form.Select\" id=\"addcmsel\" ";
+ $h .= "store=\"cmstore\" query=\"{active: 0}\" $disabled></div>";
+ $h .= "<button dojoType=\"dijit.form.Button\" id=\"addcmbtn\" $disabled>";
+ $h .= "Add Method";
+ $h .= "<script type=\"dojo/method\" event=onClick>";
+ $h .= "addConnectMethod();";
+ $h .= "</script>";
+ $h .= "</button><br>";
+ $h .= "<h3>Current Methods</h3>";
+ $h .= "<select id=\"curmethodsel\" multiple size=5>";
+ foreach($curmethods as $id => $method)
+ $h .= "<option value=\"$id\">$method</option>";
+ $h .= "</select><br>";
+ $h .= "<button dojoType=\"dijit.form.Button\" id=\"remcmbtn\">";
+ $h .= "Remove Selected Methods(s)";
+ $h .= "<script type=\"dojo/method\" event=onClick>";
+ $h .= "remConnectMethod();";
+ $h .= "</script>";
+ $h .= "</button><br>";
+ $h .= "<div id=\"cmerror\" class=\"rederrormsg\"></div>\n";
+ $adminimages = getUserResources(array("imageAdmin"), array("administer"));
+ $adminids = array_keys($adminimages["image"]);
+ $data = array('imageid' => $imageid,
+ 'methods' => $methods);
+ $cont = addContinuationsEntry('AJaddImageConnectMethod', $data, 3600, 1, 0);
+ $h .= "<INPUT type=hidden id=addcmcont value=\"$cont\">";
+ $cont = addContinuationsEntry('AJremImageConnectMethod', $data, 3600, 1, 0);
+ $h .= "<INPUT type=hidden id=remcmcont value=\"$cont\">";
+ $h .= "NOTE: Connection Method changes take effect immediately; you do<br>";
+ $h .= "<strong>not</strong> need to click \"Confirm Changes\" to submit them.";
+ print $h;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+///
+/// \fn jsonImageConnectMethods()
+///
+/// \brief gets list of connect methods used for specified image and sends them
+/// in json format
+///
+////////////////////////////////////////////////////////////////////////////////
+function jsonImageConnectMethods() {
+ $imageid = getContinuationVar('imageid');
+ $methods = getConnectMethods($imageid);
+ $curmethods = getImageConnectMethods($imageid);
+ $items = array();
+ foreach($methods as $id => $method) {
+ if(array_key_exists($id, $curmethods))
+ $active = 1;
+ else
+ $active = 0;
+ $items[] = "{name:'$id', "
+ . "display:'{$method['description']}', "
+ . "autoprovisioned:'{$method['autoprovisioned']}', "
+ . "active:$active}";
+ }
+ $data = implode(',', $items);
+ header('Content-Type: text/json; charset=utf-8');
+ $data = "{} && {label:'display',identifier:'name',items:[$data]}";
+ print $data;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+///
+/// \fn AJaddImageConnectMethod()
+///
+/// \brief adds a subimage to an image
+///
+////////////////////////////////////////////////////////////////////////////////
+function AJaddImageConnectMethod() {
+ $imageid = getContinuationVar('imageid');
+ $methods = getContinuationVar('methods');
+ $curmethods = getImageConnectMethods($imageid);
+ $newid = processInputVar('newid', ARG_NUMERIC);
+ if(! array_key_exists($newid, $methods)) {
+ $arr = array('error' => 'invalidmethod',
+ 'msg' => 'Invalid method submitted.');
+ sendJSON($arr);
+ return;
+ }
+ # delete any current entries for method and image (including disabled)
+ $query = "DELETE FROM connectmethodmap "
+ . "WHERE imageid = $imageid AND "
+ . "connectmethodid = $newid AND "
+ . "autoprovisioned IS NULL";
+ doQuery($query, 101);
+
+ # check to see if enabled for OStype or OS
+ $query = "SELECT cm.connectmethodid "
+ . "FROM connectmethodmap cm, "
+ . "image i "
+ . "LEFT JOIN OS o ON (o.id = i.OSid) "
+ . "LEFT JOIN OStype ot ON (ot.name = o.type) "
+ . "WHERE i.id = $imageid AND "
+ . "cm.autoprovisioned IS NULL AND "
+ . "cm.connectmethodid = $newid AND "
+ . "cm.disabled = 0 AND "
+ . "(cm.OStypeid = ot.id OR "
+ . "cm.OSid = o.id)";
+ $qh = doQuery($query, 101);
+ if(! (mysql_num_rows($qh))) {
+ # add entry for method and image
+ $query = "INSERT INTO connectmethodmap "
+ . "(connectmethodid, "
+ . "imageid, "
+ . "disabled) "
+ . "VALUES "
+ . "($newid, "
+ . "$imageid, "
+ . "0)";
+ doQuery($query, 101);
+ }
+
+ # return success
+ $subimages[] = $newid;
+ $data = array('imageid' => $imageid,
+ 'methods' => $methods);
+ $addcont = addContinuationsEntry('AJaddImageConnectMethod', $data, 3600, 1, 0);
+ $remcont = addContinuationsEntry('AJremImageConnectMethod', $data, 3600, 1, 0);
+ $name = $methods[$newid]['description'];
+ $arr = array('newid' => $newid,
+ 'name' => $name,
+ 'addcont' => $addcont,
+ 'remcont' => $remcont);
+ sendJSON($arr);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+///
+/// \fn AJremImageConnectMethod()
+///
+/// \brief removes subimages from an image
+///
+////////////////////////////////////////////////////////////////////////////////
+function AJremImageConnectMethod() {
+ $imageid = getContinuationVar('imageid');
+ $methods = getContinuationVar('methods');
+ $curmethods = getImageConnectMethods($imageid);
+ $remidlist = mysql_real_escape_string(processInputVar('ids', ARG_STRING));
+ $remids = explode(',', $remidlist);
+ foreach($remids as $id) {
+ if(! is_numeric($id)) {
+ $arr = array('error' => 'invalidinput',
+ 'msg' => 'Non-numeric data was submitted for a connection method id.');
+ sendJSON($arr);
+ return;
+ }
+ }
+ # delete any current entries for method and image
+ $query = "DELETE FROM connectmethodmap "
+ . "WHERE imageid = $imageid AND "
+ . "connectmethodid IN ($remidlist) AND "
+ . "autoprovisioned IS NULL";
+ doQuery($query, 101);
+ # query to see if enabled for OStype or OS
+ $insvals = array();
+ foreach($remids as $id) {
+ $query = "SELECT cm.connectmethodid "
+ . "FROM connectmethodmap cm, "
+ . "image i "
+ . "LEFT JOIN OS o ON (o.id = i.OSid) "
+ . "LEFT JOIN OStype ot ON (ot.name = o.type) "
+ . "WHERE i.id = $imageid AND "
+ . "cm.autoprovisioned IS NULL AND "
+ . "cm.connectmethodid = $id AND "
+ . "cm.disabled = 0 AND "
+ . "(cm.OStypeid = ot.id OR "
+ . "cm.OSid = o.id)";
+ $qh = doQuery($query, 101);
+ if(mysql_num_rows($qh))
+ # if so, add disabled entry for image and method
+ $insvals[] = "($id, $imageid, 1)";
+ }
+ if(count($insvals)) {
+ $allinsvals = implode(',', $insvals);
+ $query = "INSERT INTO connectmethodmap "
+ . "(connectmethodid, "
+ . "imageid, "
+ . "disabled) "
+ . "VALUES $allinsvals";
+ doQuery($query, 101);
+ }
+
+ $data = array('imageid' => $imageid,
+ 'methods' => $methods);
+ $addcont = addContinuationsEntry('AJaddImageConnectMethod', $data, 3600, 1, 0);
+ $remcont = addContinuationsEntry('AJremImageConnectMethod', $data, 3600, 1, 0);
+ $arr = array('addcont' => $addcont,
+ 'remcont' => $remcont);
+ sendJSON($arr);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+///
/// \fn subimageDialogContent()
///
/// \brief prints content to fill in the dojo dialog for managing subimages
@@ -1372,12 +1679,6 @@ function confirmEditOrAddImage($state) {
print "<H2>$title</H2>\n";
print "$question<br><br>\n";
print "<TABLE>\n";
- if(! $state) {
- /*print " <TR>\n";
- print " <TH align=right>Short Name:</TH>\n";
- print " <TD>" . $data["name"] . "</TD>\n";
- print " </TR>\n";*/
- }
print " <TR>\n";
print " <TH align=right>Name:</TH>\n";
print " <TD>" . $data["prettyname"] . "</TD>\n";
@@ -1386,14 +1687,6 @@ function confirmEditOrAddImage($state) {
print " <TH align=right>Owner:</TH>\n";
print " <TD>" . $data["owner"] . "</TD>\n";
print " </TR>\n";
- /*print " <TR>\n";
- print " <TH align=right>Platform:</TH>\n";
- print " <TD>" . $platforms[$data["platformid"]] . "</TD>\n";
- print " </TR>\n";
- print " <TR>\n";
- print " <TH align=right>OS:</TH>\n";
- print " <TD>" . $oslist[$data["osid"]]["prettyname"] . "</TD>\n";
- print " </TR>\n";*/
print " <TR>\n";
print " <TD colspan=2>\n";
print "<br><strong>Image Description</strong>:<br>\n";
@@ -1562,6 +1855,11 @@ function imageClickThrough() {
function imageClickThroughAgreement() {
global $clickThroughText;
$data = getContinuationVar();
+ $comments = processInputVar('comments', ARG_STRING, '');
+ $comments = htmlspecialchars($comments);
+ if(get_magic_quotes_gpc())
+ $comments = stripslashes($comments);
+ $data['comments'] = mysql_real_escape_string($comments);
$nextmode = $data['nextmode'];
$multicall = getContinuationVar('multicall', 0);
unset($data['nextmode']);
@@ -1604,9 +1902,10 @@ function imageClickThroughAgreement() {
/// \brief adds the image and notifies user
///
////////////////////////////////////////////////////////////////////////////////
-function submitAddImage() {
+function submitAddImage($data=array(), $autocaptured=0) {
global $user, $clickThroughText;
- $data = getContinuationVar();
+ if(empty($data))
+ $data = getContinuationVar();
// get platformid and osid
$requestdata = getRequestInfo($data['requestid']);
@@ -1614,6 +1913,7 @@ function submitAddImage() {
$data["platformid"] = $imagedata[$requestdata["reservations"][0]["imageid"]]["platformid"];
$data["osid"] = $imagedata[$requestdata["reservations"][0]["imageid"]]["osid"];
$data["basedoffrevisionid"] = $requestdata["reservations"][0]["imagerevisionid"];
+ $data["autocaptured"] = $autocaptured;
// add estimated reload time
$data["reloadtime"] = 20;
@@ -1662,6 +1962,9 @@ function submitAddImage() {
doQuery($query, 101);
}
+ if($autocaptured)
+ return 1;
+
print "<H2>Add Image</H2>\n";
print "The image creation process has been started. It normally takes ";
print "about 25 minutes to complete (though can sometimes be more than ";
@@ -1672,6 +1975,7 @@ function submitAddImage() {
print "group on the <a href=\"" . BASEURL . SCRIPT;
print "?mode=viewImageOptions\">Manage Images</a> page if you have ";
print "sufficient access or have your computing support add it for you.<br>\n";
+ return 1;
}
////////////////////////////////////////////////////////////////////////////////
@@ -1696,8 +2000,8 @@ function updateExistingImageComments() {
print "<H2>Update Existing Image</H2>\n";
print "<h3>New Revision Comments</h3>\n";
print "Enter any notes for yourself and other admins about how the image ";
- print "was setup/installed.<br>\nThese are optional and not visible to end ";
- print "users:<br>\n";
+ print "was setup/installed.<br>\nThese are optional and are not visible ";
+ print "to end users:<br>\n";
print "<form action=\"" . BASEURL . SCRIPT . "\" method=post>\n";
print "<textarea dojoType=\"dijit.form.Textarea\" name=comments ";
print "style=\"width: 400px; text-align: left;\"\">\n\n</textarea>\n";
@@ -1736,11 +2040,11 @@ function updateExistingImageComments() {
/// notifies the user that the imaging process has started
///
////////////////////////////////////////////////////////////////////////////////
-function updateExistingImage() {
+function updateExistingImage($requestid=0, $userid=0, $comments='', $autocaptured=0) {
global $user, $clickThroughText;
- $requestid = getContinuationVar("requestid");
+ $requestid = getContinuationVar("requestid", $requestid);
$fromAgreement = getContinuationVar('fromAgreement', 0);
- $comments = processInputVar("comments", ARG_STRING);
+ $comments = processInputVar("comments", ARG_STRING, $comments);
$comments = preg_replace("/\r/", '', $comments);
$comments = htmlspecialchars($comments);
#$comments = preg_replace("/\n/", '<br>', $comments);
@@ -1749,6 +2053,9 @@ function updateExistingImage() {
$comments = stripslashes($comments);
$comments = mysql_real_escape_string($comments);
+ if($userid == 0)
+ $userid = $user['id'];
+
$data = getRequestInfo($requestid);
foreach($data["reservations"] as $res) {
if($res["forcheckout"]) {
@@ -1757,9 +2064,10 @@ function updateExistingImage() {
}
}
$imageData = getImages(0, $imageid);
- if($imageData[$imageid]['ownerid'] != $user['id']) {
- editOrAddImage(1);
- return;
+ if($imageData[$imageid]['ownerid'] != $userid) {
+ if(! $autocaptured)
+ editOrAddImage(1);
+ return 0;
}
// set the test flag on the image in the image table
$query = "UPDATE image SET test = 1 WHERE id = $imageid";
@@ -1785,15 +2093,17 @@ function updateExistingImage() {
. "deleted, "
. "production, "
. "comments, "
- . "imagename) "
+ . "imagename, "
+ . "autocaptured) "
. "VALUES ($imageid, "
. "$newrevision, "
- . "{$user['id']}, "
+ . "$userid, "
. "NOW(), "
. "1, "
. "0, "
. "'$comments', "
- . "'$newname')";
+ . "'$newname', "
+ . "$autocaptured)";
doQuery($query, 101);
$qh = doQuery("SELECT LAST_INSERT_ID() FROM imagerevision", 101);
$row = mysql_fetch_row($qh);
@@ -1818,13 +2128,16 @@ function updateExistingImage() {
. "accepted, "
. "agreement) "
. "VALUES "
- . "({$user['id']}, "
+ . "($userid, "
. "$imageid, "
. "NOW(), "
. "'$agreement')";
doQuery($query, 101);
}
+ if($autocaptured)
+ return 1;
+
print "<H2>Update Image</H2>\n";
print "The image creation process has been started. It normally takes ";
print "about 20-25 minutes to complete. You will be notified by email ";
@@ -1840,7 +2153,125 @@ function updateExistingImage() {
print "</li>\n";
print "<li>Test the environment to make sure it works correctly</li>\n";
print "<li>After you are satisfied that it works correctly, click the ";
- print "<strong>End</strong> button on the Current Reservations page</li>\n";
+ print "<strong>Delete</strong> button on the Current Reservations page</li>\n";
+ print "<li>You will be prompted to make the revision production or just end ";
+ print "the reservation</li>\n";
+ print "<li>Select the <strong>Make this the production revision</strong> ";
+ print "radio button</li> and click <strong>Submit</strong></li>\n";
+ print "</ol>\n";
+ print "Once the revision is made production, everyone that selects it will ";
+ print "get the new revision<br>\n";
+ return 1;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+///
+/// \fn submitCheckpoint()
+///
+/// \brief sets test flag on image to 1, sets state of request to 'checkpoint'
+/// and notifies the user that the imaging process has started
+///
+////////////////////////////////////////////////////////////////////////////////
+function submitCheckpoint() {
+ global $user, $clickThroughText;
+ $requestid = getContinuationVar("requestid");
+ $fromAgreement = getContinuationVar('fromAgreement', 0);
+ $comments = getContinuationVar("comments");
+ $comments = preg_replace("/\r/", '', $comments);
+ #$comments = preg_replace("/\n/", '<br>', $comments);
+ $comments = preg_replace("/\n/", '', $comments);
+
+ $data = getRequestInfo($requestid);
+ foreach($data["reservations"] as $res) {
+ if($res["forcheckout"]) {
+ $imageid = $res["imageid"];
+ break;
+ }
+ }
+ // set the test flag on the image in the image table
+ $query = "UPDATE image SET test = 1 WHERE id = $imageid";
+ doQuery($query, 101);
+
+ # add entry to imagerevision table
+ $query = "SELECT revision, "
+ . "imagename "
+ . "FROM imagerevision "
+ . "WHERE imageid = $imageid "
+ . "ORDER BY revision DESC "
+ . "LIMIT 1";
+ $qh = doQuery($query, 101);
+ $row = mysql_fetch_assoc($qh);
+ $newrevision = $row['revision'] + 1;
+ $newname = preg_replace("/{$row['revision']}$/",
+ $newrevision, $row['imagename']);
+ $query = "INSERT INTO imagerevision "
+ . "(imageid, "
+ . "revision, "
+ . "userid, "
+ . "datecreated, "
+ . "deleted, "
+ . "production, "
+ . "comments, "
+ . "imagename, "
+ . "autocaptured) "
+ . "VALUES ($imageid, "
+ . "$newrevision, "
+ . "{$user['id']}, "
+ . "NOW(), "
+ . "1, "
+ . "0, "
+ . "'$comments', "
+ . "'$newname', "
+ . "0)";
+ doQuery($query, 101);
+ $qh = doQuery("SELECT LAST_INSERT_ID() FROM imagerevision", 101);
+ $row = mysql_fetch_row($qh);
+ $imagerevisionid = $row[0];
+
+ # update request and reservation
+ $query = "UPDATE request rq, "
+ . "reservation rs "
+ . "SET rs.imagerevisionid = $imagerevisionid, "
+ . "rq.stateid = 24,"
+ . "rq.forimaging = 1 "
+ . "WHERE rq.id = $requestid AND "
+ . "rq.id = rs.requestid AND "
+ . "rs.imageid = $imageid";
+ doQuery($query, 101);
+
+ if($fromAgreement) {
+ $agreement = strip_tags(sprintf($clickThroughText, ""));
+ $query = "INSERT INTO clickThroughs "
+ . "(userid, "
+ . "imageid, "
+ . "accepted, "
+ . "agreement) "
+ . "VALUES "
+ . "({$user['id']}, "
+ . "$imageid, "
+ . "NOW(), "
+ . "'$agreement')";
+ doQuery($query, 101);
+ }
+
+ print "<H2>Create New Revision of an Online Image</H2>\n";
+ print "The image creation process has been started. It normally takes ";
+ print "about 20-25 minutes to complete. You will be notified by email ";
+ print "when the image has been created. Afterward, you have the option to ";
+ print "set the new revision be the production one. There are a few steps ";
+ print "you would need to follow to make it the production revision of the ";
+ print "image:";
+ print "<ol class=numbers>\n";
+ print "<li>Make a new reservation for the environment (it will have the ";
+ print "same name in the drop-down list).</li>\n";
+ print "<li>After clicking <strong>Submit</strong> on the New Reservations ";
+ print "page, you will be prompted to select the revision of the environment ";
+ print "you want</li>\n";
+ print "<li>Select the most recent revision and click <strong>Submit</strong>";
+ print "</li>\n";
+ print "<li>Test the environment to make sure it works correctly</li>\n";
+ print "<li>After you are satisfied that it works correctly, click the ";
+ print "<strong>Delete</strong> button on the Current Reservations page</li>\n";
print "<li>You will be prompted to make the revision production or just end ";
print "the reservation</li>\n";
print "<li>Select the <strong>Make this the production revision</strong> ";
@@ -1896,6 +2327,38 @@ function setImageProduction() {
////////////////////////////////////////////////////////////////////////////////
///
+/// \fn AJsetImageProduction()
+///
+/// \brief prompts user if really ready to set image to production
+///
+////////////////////////////////////////////////////////////////////////////////
+function AJsetImageProduction() {
+ $requestid = getContinuationVar('requestid');
+ $data = getRequestInfo($requestid);
+ foreach($data["reservations"] as $res) {
+ if($res["forcheckout"]) {
+ $prettyimage = $res["prettyimage"];
+ break;
+ }
+ }
+ $title = "<big><strong>Change Test Image to Production</strong></big><br><br>\n";
+ $text = "This will update the <b>$prettyimage</b> ";
+ $text .= "environment to be the newly created revision so that people will ";
+ $text .= "start getting it when they checkout the environment. It will also ";
+ $text .= "cause all the blades that currently have this image preloaded to be ";
+ $text .= "reloaded with this new image. Are you sure the image works ";
+ $text .= "correctly?<br>\n";
+ $cdata = array('requestid' => $requestid);
+ $cont = addContinuationsEntry('AJsubmitSetImageProduction', $cdata, SECINDAY, 0, 0);
+ $text = preg_replace("/(.{1,60}[ \n])/", '\1<br>', $text);
+ $data = array('content' => $title . $text,
+ 'cont' => $cont,
+ 'btntxt' => 'Submit');
+ sendJSON($data);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+///
/// \fn submitSetImageProduction()
///
/// \brief sets request state to 'makeproduction', notifies user that
@@ -1920,6 +2383,46 @@ function submitSetImageProduction() {
////////////////////////////////////////////////////////////////////////////////
///
+/// \fn AJsubmitSetImageProduction()
+///
+/// \brief sets request state to 'makeproduction', notifies user that
+/// "productioning" process has started
+///
+////////////////////////////////////////////////////////////////////////////////
+function AJsubmitSetImageProduction() {
+ $requestid = getContinuationVar('requestid');
+ $data = getRequestInfo($requestid);
+ foreach($data["reservations"] as $res) {
+ if($res["forcheckout"]) {
+ $prettyimage = $res["prettyimage"];
+ break;
+ }
+ }
+ $query = "UPDATE request SET stateid = 17 WHERE id = $requestid";
+ doQuery($query, 101);
+ $content = "<b>$prettyimage</b> is now in the process of being updated "
+ . "to use the newly created image revision. <br>";
+ $content = preg_replace("/(.{1,60}[ \n])/", '\1<br>', $content);
+ $a = "var dlg = new dijit.Dialog({"
+ . "title: \"Change Test Image to Production\","
+ . "id: \"toproddlg\""
+ . "});"
+ . "var content = '$content"
+ . "<div align=\"center\">"
+ . "<button dojoType=\"dijit.form.Button\">"
+ . "Close"
+ . "<script type=\"dojo/method\" event=\"onClick\">"
+ . "dijit.byId(\"toproddlg\").destroy();"
+ . "</script>"
+ . "</button>"
+ . "</div>';"
+ . "dlg.set(\"content\", content);"
+ . "dlg.show();";
+ print $a;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+///
/// \fn confirmDeleteImage()
///
/// \brief prints a form to confirm the deletion of an image
@@ -1954,10 +2457,6 @@ function confirmDeleteImage() {
print "<H2>$title</H2>\n";
print "$question<br><br>\n";
print "<TABLE>\n";
- /*print " <TR>\n";
- print " <TH align=right>Short Name:</TH>\n";
- print " <TD>" . $images[$imageid]["name"] . "</TD>\n";
- print " </TR>\n";*/
print " <TR>\n";
print " <TH align=right>Long Name:</TH>\n";
print " <TD>" . $images[$imageid]["prettyname"] . "</TD>\n";
@@ -2060,10 +2559,6 @@ function viewImageDetails() {
print "<DIV align=center>\n";
print "<H2>Image Details</H2>\n";
print "<TABLE>\n";
- /*print " <TR>\n";
- print " <TH align=right>Short Name:</TH>\n";
- print " <TD>" . $images[$imageid]["name"] . "</TD>\n";
- print " </TR>\n";*/
print " <TR>\n";
print " <TH align=right>Long Name:</TH>\n";
print " <TD>" . $images[$imageid]["prettyname"] . "</TD>\n";
@@ -2370,11 +2865,8 @@ function processImageInput($checks=1) {
$mode = processInputVar("mode", ARG_STRING);
$return["imageid"] = processInputVar("imageid" , ARG_NUMERIC, getContinuationVar('imageid'));
$return['requestid'] = getContinuationVar('requestid');
- #$return["name"] = processInputVar("name", ARG_STRING);
$return["prettyname"] = processInputVar("prettyname", ARG_STRING);
$return["owner"] = processInputVar("owner", ARG_STRING, "{$user["unityid"]}@{$user['affiliation']}");
- #$return["platformid"] = processInputVar("platformid", ARG_NUMERIC);
- #$return["osid"] = processInputVar("osid", ARG_NUMERIC);
$return["minram"] = processInputVar("minram", ARG_NUMERIC, 64);
$return["minprocnumber"] = processInputVar("minprocnumber", ARG_NUMERIC);
$return["minprocspeed"] = processInputVar("minprocspeed", ARG_NUMERIC, 500);
@@ -2406,16 +2898,6 @@ function processImageInput($checks=1) {
return $return;
}
- /*if($mode != "confirmAddImage" &&
- (strlen($return["name"]) > 30 || strlen($return["name"]) < 2)) {
- $submitErr |= NAMEERR;
- $submitErrMsg[NAMEERR] = "Short Name must be from 2 to 30 characters";
- }
- if(! ($submitErr & NAMEERR) &&
- checkForImageName($return["name"], "short", $return["imageid"])) {
- $submitErr |= NAMEERR;
- $submitErrMsg[NAMEERR] = "An image already exists with this name.";
- }*/
if(preg_match('/-/', $return["prettyname"]) ||
strlen($return["prettyname"]) > 60 || strlen($return["prettyname"]) < 2) {
$submitErr |= PRETTYNAMEERR;
@@ -2505,8 +2987,6 @@ function updateImage($data) {
$query = "UPDATE image "
. "SET prettyname = '{$data["prettyname"]}', "
. "ownerid = $ownerid, "
- /*. "platformid = {$data["platformid"]}, "
- . "OSid = {$data["osid"]}, "*/
. "minram = {$data["minram"]}, "
. "minprocnumber = {$data["minprocnumber"]}, "
. "minprocspeed = {$data["minprocspeed"]}, "
@@ -2662,13 +3142,15 @@ function addImage($data) {
. "datecreated, "
. "production, "
. "imagename, "
- . "comments) "
+ . "comments, "
+ . "autocaptured) "
. "VALUES ($imageid, "
. "{$user['id']}, "
. "NOW(), "
. "1, "
. "'$name', "
- . "'{$data['comments']}')";
+ . "'{$data['comments']}', "
+ . "{$data['autocaptured']})";
doQuery($query, 101);
// add entry in resource table
Modified: incubator/vcl/trunk/web/.ht-inc/privileges.php
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/web/.ht-inc/privileges.php?rev=1097842&r1=1097841&r2=1097842&view=diff
==============================================================================
--- incubator/vcl/trunk/web/.ht-inc/privileges.php (original)
+++ incubator/vcl/trunk/web/.ht-inc/privileges.php Fri Apr 29 15:34:22 2011
@@ -1847,8 +1847,10 @@ function getResourcePrivRowHTML($privnam
}
// if group type is schedule, don't print available or manageMapping checkboxes
// if group type is managementnode, don't print available checkbox
+ // if group type is serverprofile, don't print manageMapping checkbox
elseif(($grptype == 'schedule' && ($type == 'available' || $type == 'manageMapping')) ||
- ($grptype == 'managementnode' && $type == 'available')) {
+ ($grptype == 'managementnode' && $type == 'available') ||
+ ($grptype == 'serverprofile' && $type == 'manageMapping')) {
$text .= "<TD><img src=images/blank.gif></TD>\n";
}
else {
@@ -2505,14 +2507,16 @@ function AJsubmitAddResourcePriv() {
return;
}
$newgroupid = processInputVar("newgroupid", ARG_NUMERIC);
- $privs = array("computerAdmin","mgmtNodeAdmin", "imageAdmin", "scheduleAdmin");
+ $privs = array("computerAdmin", "mgmtNodeAdmin", "imageAdmin",
+ "scheduleAdmin", "serverProfileAdmin");
$resourcesgroups = getUserResources($privs, array("manageGroup"), 1);
if(! array_key_exists($newgroupid, $resourcesgroups['image']) &&
! array_key_exists($newgroupid, $resourcesgroups['computer']) &&
! array_key_exists($newgroupid, $resourcesgroups['managementnode']) &&
- ! array_key_exists($newgroupid, $resourcesgroups['schedule'])) {
- $text = "You do not have rights manage the specified resource group.";
+ ! array_key_exists($newgroupid, $resourcesgroups['schedule']) &&
+ ! array_key_exists($newgroupid, $resourcesgroups['serverprofile'])) {
+ $text = "You do not have rights to manage the specified resource group.";
print "addResourceGroupPaneHide(); ";
print "alert('$text');";
return;