From bb4ed3aebd62b84019e5ab711b044ebd52d91fe8 Mon Sep 17 00:00:00 2001 From: phamt Date: Thu, 29 Jul 2010 17:32:24 +0000 Subject: [PATCH] Split nodes page into nodeset, rnetboot, and updatenode pages. Cleaned up code. git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@6908 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-UI/js/custom/zvmUtils.js | 346 ++++++------ xCAT-UI/js/nodes/nodes.js | 847 +----------------------------- xCAT-UI/js/nodes/nodeset.js | 355 +++++++++++++ xCAT-UI/js/nodes/rnetboot.js | 173 ++++++ xCAT-UI/js/nodes/updatenode.js | 255 +++++++++ xCAT-UI/js/provision/provision.js | 6 +- xCAT-UI/js/ui.js | 18 +- 7 files changed, 963 insertions(+), 1037 deletions(-) create mode 100644 xCAT-UI/js/nodes/nodeset.js create mode 100644 xCAT-UI/js/nodes/rnetboot.js create mode 100644 xCAT-UI/js/nodes/updatenode.js diff --git a/xCAT-UI/js/custom/zvmUtils.js b/xCAT-UI/js/custom/zvmUtils.js index 1e0928bc9..5bab6def3 100644 --- a/xCAT-UI/js/custom/zvmUtils.js +++ b/xCAT-UI/js/custom/zvmUtils.js @@ -60,7 +60,7 @@ function loadUserEntry(data) { var ueDivId = args[0].replace('out=', ''); // Get node var node = args[1].replace('node=', ''); - // Get node user entry + // Get user entry var userEntry = data.rsp[0].split(node + ':'); // Remove loader @@ -69,7 +69,7 @@ function loadUserEntry(data) { var toggleLinkId = node + 'ToggleLink'; $('#' + toggleLinkId).click(function() { - // Get the text within this link + // Get text within this link var lnkText = $(this).text(); // Toggle user entry division @@ -114,11 +114,12 @@ function loadUserEntry(data) { saveBtn.show(); cancelBtn.show(); }); - + /** * Save */ var saveBtn = createButton('Save'); + saveBtn.css('display', 'inline-table'); saveBtn.hide(); saveBtn.bind('click', function(event) { // Show loader @@ -153,8 +154,7 @@ function loadUserEntry(data) { 'border-width' : '0px' }); - // Stop this function from executing again - // Unbind event + // Disable save button $(this).unbind(event); $(this).hide(); cancelBtn.hide(); @@ -164,6 +164,7 @@ function loadUserEntry(data) { * Cancel */ var cancelBtn = createButton('Cancel'); + cancelBtn.css('display', 'inline-table'); cancelBtn.hide(); cancelBtn.bind('click', function(event) { txtArea.attr('readonly', 'readonly'); @@ -186,14 +187,14 @@ function loadUserEntry(data) { } /** - * Set a cookie to track the number of processes for a given node + * Increment number of processes running against a node * * @param node - * Node to set cookie for + * Node to increment running processes * @return Nothing */ function incrementNodeProcess(node) { - // Set cookie for number actions performed against node + // Get current processes var procs = $.cookie(node + 'Processes'); if (procs) { // One more process @@ -205,7 +206,7 @@ function incrementNodeProcess(node) { } /** - * Update the provision new node status + * Update provision new node status * * @param data * Data returned from HTTP request @@ -220,87 +221,83 @@ function updateProvisionNewStatus(data) { var cmd = args[0].replace('cmd=', ''); // Get output ID var out2Id = args[1].replace('out=', ''); - // Get status bar and provision tab ID + + // Get status bar ID var statBarId = 'zProvisionStatBar' + out2Id; + // Get provision tab ID var tabId = 'zvmProvisionTab' + out2Id; + // Get loader ID + var loaderId = 'zProvisionLoader' + out2Id; // Get node name var node = $('#' + tabId + ' input[name=nodeName]').val(); - // Get userId - var userId = $('#' + tabId + ' input[name=userId]').val(); - // Get hardware control point - var hcp = $('#' + tabId + ' input[name=hcp]').val(); - // Get group - var group = $('#' + tabId + ' input[name=group]').val(); - // Get user entry - var userEntry = $('#' + tabId + ' textarea').val(); - // Get operating system - var osImage = $('#' + tabId + ' input[name=os]').val(); /** * (2) Update /etc/hosts */ if (cmd == 'nodeadd') { - // If no output, no errors occurred + // If there was an error + // Do not continue if (rsp.length) { + $('#' + loaderId).hide(); $('#' + statBarId).append('

(Error) Failed to create node definition

'); } else { $('#' + statBarId).append('

Node definition created for ' + node + '

'); + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'makehosts', + tgt : '', + args : '', + msg : 'cmd=makehosts;out=' + out2Id + }, + + success : updateProvisionNewStatus + }); } - - // Update /etc/hosts - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'makehosts', - tgt : '', - args : '', - msg : 'cmd=makehosts;out=' + out2Id - }, - - success : updateProvisionNewStatus - }); } /** * (3) Update DNS */ else if (cmd == 'makehosts') { - // If no output, no errors occurred + // If there was an error + // Do not continue if (rsp.length) { - $('#' + statBarId).append( - '

(Error) Failed to update /etc/hosts

'); + $('#' + loaderId).hide(); + $('#' + statBarId).append('

(Error) Failed to update /etc/hosts

'); } else { $('#' + statBarId).append('

/etc/hosts updated

'); - } + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'makedns', + tgt : '', + args : '', + msg : 'cmd=makedns;out=' + out2Id + }, - // Update DNS - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'makedns', - tgt : '', - args : '', - msg : 'cmd=makedns;out=' + out2Id - }, - - success : updateProvisionNewStatus - }); + success : updateProvisionNewStatus + }); + } } /** * (4) Create user entry */ - else if (cmd == 'makedns') { - // Reset the number of tries + else if (cmd == 'makedns') { + // Reset number of tries $.cookie('tries4' + tabId, 0); // Write ajax response to status bar var prg = writeRsp(rsp, ''); $('#' + statBarId).append(prg); + // Get user entry + var userEntry = $('#' + tabId + ' textarea').val(); + // Create user entry $.ajax( { url : 'lib/zCmd.php', @@ -320,7 +317,7 @@ function updateProvisionNewStatus(data) { /** * (5) Add disk */ - else if (cmd == 'mkvm') { + else if (cmd == 'mkvm') { // Write ajax response to status bar var prg = writeRsp(rsp, ''); $('#' + statBarId).append(prg); @@ -328,10 +325,7 @@ function updateProvisionNewStatus(data) { // If there was an error // Do not continue if (prg.html().indexOf('Error') > -1) { - var loaderId = 'zProvisionLoader' + inst; - $('#' + loaderId).remove(); - - // Try again (at least 2 times) + // Try again var tries = parseInt($.cookie('tries4' + tabId)); if (tries < 2) { $('#' + statBarId).append('

Trying again

'); @@ -340,6 +334,8 @@ function updateProvisionNewStatus(data) { // One more try $.cookie('tries4' + tabId, tries); + // Get user entry + var userEntry = $('#' + tabId + ' textarea').val(); // Create user entry $.ajax( { url : 'lib/zCmd.php', @@ -355,14 +351,10 @@ function updateProvisionNewStatus(data) { success : updateProvisionNewStatus }); } else { - // Failed - Do not continue - var loaderId = 'zProvisionLoader' + out2Id; $('#' + loaderId).hide(); } - } - // If there were no errors - else { - // Reset the number of tries + } else { + // Reset number of tries $.cookie('tries4' + tabId, 0); // Set cookie for number of disks @@ -370,6 +362,7 @@ function updateProvisionNewStatus(data) { $.cookie('zProvisionDisks2Add' + out2Id, diskRows.length); if (diskRows.length > 0) { for ( var i = 0; i < diskRows.length; i++) { + // Get disk type, address, size, pool, and password var diskArgs = diskRows.eq(i).find('td'); var type = diskArgs.eq(1).find('select').val(); var address = diskArgs.eq(2).find('input').val(); @@ -377,7 +370,7 @@ function updateProvisionNewStatus(data) { var pool = diskArgs.eq(4).find('input').val(); var password = diskArgs.eq(5).find('input').val(); - // Add disk and format disk + // Add disk if (type == '3390') { $.ajax( { url : 'lib/cmd.php', @@ -394,21 +387,17 @@ function updateProvisionNewStatus(data) { success : updateProvisionNewStatus }); } else { - // Virtual server created - var loaderId = 'zProvisionLoader' + out2Id; $('#' + loaderId).hide(); } } } else { - // Virtual server created (no OS, no disks) - var loaderId = 'zProvisionLoader' + out2Id; $('#' + loaderId).hide(); } } } /** - * (6) Set the operating system for given node + * (6) Set operating system for given node */ else if (cmd == 'chvm') { // Write ajax response to status bar @@ -418,10 +407,9 @@ function updateProvisionNewStatus(data) { // If there was an error // Do not continue if (prg.html().indexOf('Error') > -1) { - var loaderId = 'zProvisionLoader' + inst; - $('#' + loaderId).remove(); + $('#' + loaderId).hide(); - // Try again (at least 2 times) + // Try again var tries = parseInt($.cookie('tries4' + tabId)); if (tries < 2) { $('#' + statBarId).append('

Trying again

'); @@ -435,13 +423,14 @@ function updateProvisionNewStatus(data) { $.cookie('zProvisionDisks2Add' + out2Id, diskRows.length); if (diskRows.length > 0) { for ( var i = 0; i < diskRows.length; i++) { + // Get disk type, address, size, pool, and password var diskArgs = diskRows.eq(i).find('td'); var address = diskArgs.eq(1).find('input').val(); var size = diskArgs.eq(2).find('input').val(); var pool = diskArgs.eq(3).find('input').val(); var password = diskArgs.eq(4).find('input').val(); - // Add disk and format disk + // Add disk $.ajax( { url : 'lib/cmd.php', dataType : 'json', @@ -458,18 +447,18 @@ function updateProvisionNewStatus(data) { }); } } else { - // Virtual server created (no OS, no disks) - var loaderId = 'zProvisionLoader' + out2Id; $('#' + loaderId).hide(); } } else { - var loaderId = 'zProvisionLoader' + out2Id; - $('#' + loaderId).remove(); + $('#' + loaderId).hide(); } } else { - // Reset the number of tries + // Reset number of tries $.cookie('tries4' + tabId, 0); - + + // Get operating system image + var osImage = $('#' + tabId + ' input[name=os]').val(); + // Get cookie for number of disks var disks2add = $.cookie('zProvisionDisks2Add' + out2Id); // One less disk to add @@ -477,17 +466,18 @@ function updateProvisionNewStatus(data) { // Set cookie for number of disks $.cookie('zProvisionDisks2Add' + out2Id, disks2add); - // If an operating system is given + // If an operating system image is given if (osImage) { var tmp = osImage.split('-'); + + // Get operating system, architecture, provision method, and profile var os = tmp[0]; var arch = tmp[1]; var provisionMethod = tmp[2]; var profile = tmp[3]; - // If this is the last disk added + // If the last disk is added if (disks2add < 1) { - // Set operating system $.ajax( { url : 'lib/cmd.php', dataType : 'json', @@ -504,8 +494,6 @@ function updateProvisionNewStatus(data) { }); } } else { - // Virtual server created (no OS) - var loaderId = 'zProvisionLoader' + out2Id; $('#' + loaderId).hide(); } } @@ -515,36 +503,32 @@ function updateProvisionNewStatus(data) { * (7) Update DHCP */ else if (cmd == 'noderes') { - // If no output, no errors occurred + // If there was an error + // Do not continue if (rsp.length) { - $('#' + statBarId).append( - '

(Error) Failed to set operating system

'); + $('#' + loaderId).hide(); + $('#' + statBarId).append('

(Error) Failed to set operating system

'); } else { - $('#' + statBarId).append( - '

Operating system for ' + node + ' set

'); - } + $('#' + statBarId).append('

Operating system for ' + node + ' set

'); + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'makedhcp', + tgt : '', + args : '-a', + msg : 'cmd=makedhcp;out=' + out2Id + }, - // Update DHCP - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'makedhcp', - tgt : '', - args : '-a', - msg : 'cmd=makedhcp;out=' + out2Id - }, - - success : updateProvisionNewStatus - }); + success : updateProvisionNewStatus + }); + } } /** * (8) Prepare node for boot */ else if (cmd == 'makedhcp') { - var failed = false; - // Write ajax response to status bar var prg = writeRsp(rsp, ''); $('#' + statBarId).append(prg); @@ -568,8 +552,6 @@ function updateProvisionNewStatus(data) { * (9) Boot node to network */ else if (cmd == 'nodeset') { - var failed = false; - // Write ajax response to status bar var prg = writeRsp(rsp, ''); $('#' + statBarId).append(prg); @@ -577,11 +559,8 @@ function updateProvisionNewStatus(data) { // If there was an error // Do not continue if (prg.html().indexOf('Error') > -1) { - var loaderId = 'zProvisionLoader' + out2Id; - $('#' + loaderId).remove(); - failed = true; + $('#' + loaderId).hide(); } else { - // Boot node from network $.ajax( { url : 'lib/cmd.php', dataType : 'json', @@ -601,24 +580,15 @@ function updateProvisionNewStatus(data) { * (10) Done */ else if (cmd == 'rnetboot') { - var failed = false; - // Write ajax response to status bar var prg = writeRsp(rsp, ''); $('#' + statBarId).append(prg); - - // If there was an error - // Do not continue - if (prg.html().indexOf('Error') > -1) { - var loaderId = 'zProvisionLoader' + out2Id; - $('#' + loaderId).remove(); - failed = true; - } else { + if (prg.html().indexOf('Error') < 0) { $('#' + statBarId).append('

Open a VNC viewer to see the installation progress. It might take a couple of minutes before you can connect.

'); } // Hide loader - $('#' + statBarId).find('img').hide(); + $('#' + loaderId).hide(); } } @@ -748,19 +718,21 @@ function updateZNodeStatus(data) { } /** - * Update the clone status + * Update clone status * * @param data * Data returned from HTTP request * @return Nothing */ function updateZCloneStatus(data) { + // Get ajax response var rsp = data.rsp; var args = data.msg.split(';'); var cmd = args[0].replace('cmd=', ''); // Get provision instance var inst = args[1].replace('inst=', ''); + // Get output division ID var out2Id = args[2].replace('out=', ''); /** @@ -769,59 +741,57 @@ function updateZCloneStatus(data) { if (cmd == 'nodeadd') { var node = args[3].replace('node=', ''); - // If no output, no errors occurred + // If there was an error + // Do not continue if (rsp.length) { - $('#' + out2Id).append( - '

(Error) Failed to create node definition

'); + $('#' + out2Id).find('img').hide(); + $('#' + out2Id).append('

(Error) Failed to create node definition

'); } else { - $('#' + out2Id).append( - '

Node definition created for ' + node + '

'); - } + $('#' + out2Id).append('

Node definition created for ' + node + '

'); + + // If last node definition was created + var tmp = inst.split('/'); + if (tmp[0] == tmp[1]) { + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'makehosts', + tgt : '', + args : '', + msg : 'cmd=makehosts;inst=' + inst + ';out=' + out2Id + }, - // Is this the last instance - var tmp = inst.split('/'); - if (tmp[0] == tmp[1]) { - // Update /etc/hosts - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'makehosts', - tgt : '', - args : '', - msg : 'cmd=makehosts;inst=' + inst + ';out=' + out2Id - }, - - success : updateCloneStatus - }); - } + success : updateZCloneStatus + }); + } + } } /** * (3) Update DNS */ else if (cmd == 'makehosts') { - // If no output, no errors occurred + // If there was an error + // Do not continue if (rsp.length) { - $('#' + out2Id) - .append('

(Error) Failed to update /etc/hosts

'); + $('#' + out2Id).find('img').hide(); + $('#' + out2Id).append('

(Error) Failed to update /etc/hosts

'); } else { $('#' + out2Id).append('

/etc/hosts updated

'); - } + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'makedns', + tgt : '', + args : '', + msg : 'cmd=makedns;inst=' + inst + ';out=' + out2Id + }, - // Update DNS - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'makedns', - tgt : '', - args : '', - msg : 'cmd=makedns;inst=' + inst + ';out=' + out2Id - }, - - success : updateCloneStatus - }); + success : updateZCloneStatus + }); + } } /** @@ -847,7 +817,6 @@ function updateZCloneStatus(data) { var nodeStart = parseInt(tmp[0].match(/\d+/)); // Get the ending index var nodeEnd = parseInt(tmp[1]); - for ( var i = nodeStart; i <= nodeEnd; i++) { // Do not append comma for last node if (i == nodeEnd) { @@ -881,7 +850,7 @@ function updateZCloneStatus(data) { msg : 'cmd=mkvm;inst=' + inst + ';out=' + out2Id }, - success : updateCloneStatus + success : updateZCloneStatus }); } @@ -1046,7 +1015,7 @@ function addProcessor(v, m, f) { success : updateZNodeStatus }); - // Increment node process and save it in a cookie + // Increment node process incrementNodeProcess(node); // Show loader @@ -1095,7 +1064,7 @@ function addDisk(v, m, f) { success : updateZNodeStatus }); - // Increment node process and save it in a cookie + // Increment node process incrementNodeProcess(node); // Show loader @@ -1135,7 +1104,6 @@ function addNic(v, m, f) { var lanName = temp[1]; var lanOwner = temp[0]; - // Add NIC $.ajax( { url : 'lib/cmd.php', dataType : 'json', @@ -1157,7 +1125,6 @@ function addNic(v, m, f) { var temp = f.nicVSwitchName.split(' '); var vswitchName = temp[1]; - // Add NIC $.ajax( { url : 'lib/cmd.php', dataType : 'json', @@ -1173,7 +1140,7 @@ function addNic(v, m, f) { }); } - // Increment node process and save it in a cookie + // Increment node process incrementNodeProcess(node); // Show loader @@ -1194,7 +1161,6 @@ function addNic(v, m, f) { * @return Nothing */ function removeProcessor(node, address) { - // Remove processor $.ajax( { url : 'lib/cmd.php', dataType : 'json', @@ -1208,7 +1174,7 @@ function removeProcessor(node, address) { success : updateZNodeStatus }); - // Increment node process and save it in a cookie + // Increment node process incrementNodeProcess(node); // Show loader @@ -1228,7 +1194,6 @@ function removeProcessor(node, address) { * @return Nothing */ function removeDisk(node, address) { - // Remove disk $.ajax( { url : 'lib/cmd.php', dataType : 'json', @@ -1242,7 +1207,7 @@ function removeDisk(node, address) { success : updateZNodeStatus }); - // Increment node process and save it in a cookie + // Increment node process incrementNodeProcess(node); // Show loader @@ -1265,7 +1230,6 @@ function removeNic(node, nic) { var args = nic.split('.'); var address = args[0]; - // Remove NIC $.ajax( { url : 'lib/cmd.php', dataType : 'json', @@ -1279,7 +1243,7 @@ function removeNic(node, nic) { success : updateZNodeStatus }); - // Set cookie for number actions performed against node + // Increment node process incrementNodeProcess(node); // Show loader @@ -1290,14 +1254,13 @@ function removeNic(node, nic) { } /** - * Set a cookie for the disk pool names of a given node + * Set a cookie for disk pool names of a given node * * @param data * Data from HTTP request * @return Nothing */ function setDiskPoolCookies(data) { - // Do not set cookie if there is no output if (data.rsp) { var node = data.msg; var pools = data.rsp[0].split(node + ': '); @@ -1313,7 +1276,6 @@ function setDiskPoolCookies(data) { * @return Nothing */ function setNetworkCookies(data) { - // Do not set cookie if there is no output if (data.rsp) { var node = data.msg; var networks = data.rsp[0].split(node + ': '); @@ -1322,7 +1284,7 @@ function setNetworkCookies(data) { } /** - * Get the contents of each disk pool + * Get contents of each disk pool * * @param data * HTTP request data @@ -1333,7 +1295,7 @@ function getDiskPool(data) { var hcp = data.msg; var pools = data.rsp[0].split(hcp + ': '); - // Get the contents of each disk pool + // Get contents of each disk pool for ( var i in pools) { if (pools[i]) { // Get used space @@ -1370,7 +1332,7 @@ function getDiskPool(data) { } /** - * Get the details of each network + * Get details of each network * * @param data * HTTP request data @@ -1381,7 +1343,7 @@ function getNetwork(data) { var hcp = data.msg; var networks = data.rsp[0].split(hcp + ': '); - // Get the network details + // Loop through each network for ( var i = 1; i < networks.length; i++) { var args = networks[i].split(' '); var type = args[0]; @@ -1405,7 +1367,7 @@ function getNetwork(data) { } /** - * Load the disk pool contents into a table + * Load disk pool contents into a table * * @param data * HTTP request data @@ -1427,7 +1389,7 @@ function loadDiskPoolTable(data) { // Resource tab ID var tabID = 'zvmResourceTab'; - // Get datatable (if any) + // Get datatable var dTable = getDiskDataTable(); if (!dTable) { // Create disks section @@ -1439,8 +1401,7 @@ function loadDiskPoolTable(data) { var tableID = 'zDiskDataTable'; var table = new DataTable(tableID); // Resource headers: volume ID, device type, start address, and size - table.init( [ 'Hardware control point', 'Pool', 'Status', 'Volume ID', - 'Device type', 'Start address', 'Size' ]); + table.init( [ 'Hardware control point', 'Pool', 'Status', 'Volume ID', 'Device type', 'Start address', 'Size' ]); // Append datatable to tab fieldSet.append(table.object()); @@ -1454,13 +1415,12 @@ function loadDiskPoolTable(data) { // Skip index 0 and 1 because it contains nothing for ( var i = 2; i < tmp.length; i++) { var diskAttrs = tmp[i].split(' '); - dTable.fnAddData( [ hcp, pool, stat, diskAttrs[0], diskAttrs[1], - diskAttrs[2], diskAttrs[3] ]); + dTable.fnAddData( [ hcp, pool, stat, diskAttrs[0], diskAttrs[1], diskAttrs[2], diskAttrs[3] ]); } } /** - * Load the network details into a table + * Load network details into a table * * @param data * HTTP request data @@ -1482,7 +1442,7 @@ function loadNetworkTable(data) { // Resource tab ID var tabID = 'zvmResourceTab'; - // Get datatable (if any) + // Get datatable var dTable = getNetworkDataTable(); if (!dTable) { // Create networks section diff --git a/xCAT-UI/js/nodes/nodes.js b/xCAT-UI/js/nodes/nodes.js index 8be49aaef..6a67bfece 100644 --- a/xCAT-UI/js/nodes/nodes.js +++ b/xCAT-UI/js/nodes/nodes.js @@ -109,7 +109,6 @@ function loadGroups(data) { for ( var i = groups.length; i--;) { var subItem = $('
  • '); var link = $('' + groups[i] + ''); - subItem.append(link); subUL.append(subItem); } @@ -118,11 +117,11 @@ function loadGroups(data) { $('#groups').append(ul); $('#groups').tree( { callback : { - // Open the group onclick + // Open group onclick onselect : function(node, tree) { var thisGroup = tree.get_text(node); if (thisGroup) { - // Clear the nodes DIV + // Clear nodes division $('#nodes').children().remove(); // Create loader var loader = $('
    ').append(createLoader()); @@ -202,8 +201,7 @@ function loadNodes(data) { sorted.sort(); // Add column for check box, node, ping, and power - sorted.unshift('', 'node', 'ping', 'power'); - sorted[0] = ''; + sorted.unshift('', 'node', 'ping', 'power'); // Create a datatable var dTable = new DataTable('nodesDataTable'); @@ -216,9 +214,7 @@ function loadNodes(data) { // Create a check box var checkBx = ''; // Open node onclick - var nodeLink = $( - '' + node + '') - .bind('click', loadNode); + var nodeLink = $('' + node + '').bind('click', loadNode); row.push(checkBx, nodeLink, '', ''); // Go through each header @@ -442,15 +438,14 @@ function loadNodes(data) { }); /** - * Only for zVM + * Additional ajax requests need to be made for zVM */ // Get the index of the HCP column var i = $.inArray('hcp', sorted); if (i) { + // Get hardware control point var rows = dTable.object().find('tbody tr'); - - // Get HCP var hcps = new Object(); for ( var j = 0; j < rows.length; j++) { var val = rows.eq(j).find('td').eq(i).html(); @@ -494,7 +489,7 @@ function loadNodes(data) { } /** - * Load the power status for each node + * Load power status for each node * * @param data * Data returned from HTTP request @@ -521,7 +516,7 @@ function loadPowerStatus(data) { } /** - * Load the ping status for each node + * Load ping status for each node * * @param data * Data returned from HTTP request @@ -668,7 +663,7 @@ function loadUnlockPage(tgtNodes) { */ var okBtn = createButton('Ok'); okBtn.bind('click', function(event) { - // If the form is complete + // If form is complete var ready = formComplete(newTabId); if (ready) { var password = $('#' + newTabId + ' input[name=password]').val(); @@ -690,8 +685,7 @@ function loadUnlockPage(tgtNodes) { // Show status bar statusBar.show(); - // Stop this function from executing again - // Unbind event + // Disable Ok button $(this).unbind(event); $(this).css( { 'background-color' : '#F2F2F2', @@ -814,648 +808,6 @@ function loadScriptPage(tgtNodes) { tab.select(newTabId); } -/** - * Load nodeset page - * - * @param trgtNodes - * Targets to run nodeset against - * @return Nothing - */ -function loadNodesetPage(trgtNodes) { - // Get the OS images - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'tabdump', - tgt : '', - args : 'osimage', - msg : '' - }, - - success : setOSImageCookies - }); - - // Get nodes tab - var tab = getNodesTab(); - - // Generate new tab ID - var inst = 0; - var tabId = 'nodesetTab' + inst; - while ($('#' + tabId).length) { - // If one already exists, generate another one - inst = inst + 1; - tabId = 'nodesetTab' + inst; - } - - // Open new tab - // Create nodeset form - var nodesetForm = $('
    '); - - // Create status bar - var statBarId = 'nodesetStatusBar' + inst; - var statBar = createStatusBar(statBarId); - statBar.hide(); - nodesetForm.append(statBar); - - // Create loader - var loader = createLoader('nodesetLoader'); - statBar.append(loader); - - // Create info bar - var infoBar = createInfoBar('Set the boot state for a node range'); - nodesetForm.append(infoBar); - - // Target node or group - var tgt = $('
    '); - nodesetForm.append(tgt); - - // Boot method (boot, install, stat, iscsiboot, netboot, statelite) - var method = $('
    '); - var methodLabel = $(''); - var methodSelect = $(''); - methodSelect.append(''); - methodSelect.append(''); - methodSelect.append(''); - methodSelect.append(''); - methodSelect.append(''); - method.append(methodLabel); - method.append(methodSelect); - nodesetForm.append(method); - - // Boot type (zvm, pxe, yaboot) - var type = $('
    '); - var typeLabel = $(''); - var typeSelect = $(''); - typeSelect.append(''); - typeSelect.append(''); - typeSelect.append(''); - type.append(typeLabel); - type.append(typeSelect); - nodesetForm.append(type); - - // Operating system - var os = $('
    '); - var osLabel = $(''); - var osInput = $(''); - - // Get the OS versions on-focus - var tmp; - osInput.one('focus', function(){ - tmp = $.cookie('OSVers'); - - // If there are any, turn on auto-complete - if (tmp) { - $(this).autocomplete(tmp.split(',')); - } - }); - os.append(osLabel); - os.append(osInput); - nodesetForm.append(os); - - // Architecture - var arch = $('
    '); - var archLabel = $(''); - var archInput = $(''); - - // Get the OS architectures on-focus - archInput.one('focus', function(){ - tmp = $.cookie('OSArchs'); - - // If there are any, turn on auto-complete - if (tmp) { - $(this).autocomplete(tmp.split(',')); - } - }); - arch.append(archLabel); - arch.append(archInput); - nodesetForm.append(arch); - - // Profiles - var profile = $('
    '); - var profileLabel = $(''); - var profileInput = $(''); - - // Get the profiles on-focus - profileInput.one('focus', function(){ - tmp = $.cookie('Profiles'); - - // If there are any, turn on auto-complete - if (tmp) { - $(this).autocomplete(tmp.split(',')); - } - }); - profile.append(profileLabel); - profile.append(profileInput); - nodesetForm.append(profile); - - /** - * Ok - */ - var okBtn = createButton('Ok'); - okBtn.bind('click', function(event) { - var ready = true; - - // Check state, OS, arch, and profile - var inputs = $('#' + tabId + ' input'); - for ( var i = 0; i < inputs.length; i++) { - if (!inputs.eq(i).val() && inputs.eq(i).attr('name') != 'diskPw') { - inputs.eq(i).css('border', 'solid #FF0000 1px'); - ready = false; - } else { - inputs.eq(i).css('border', 'solid #BDBDBD 1px'); - } - } - - // If no inputs are empty - if (ready) { - // Get nodes - var tgts = $('#' + tabId + ' input[name=target]').val(); - - // Get boot method - var method = $('#' + tabId + ' select[id=bootMethod]').val(); - - // Get boot type - var type = $('#' + tabId + ' select[id=bootType]').val(); - - // Get OS, arch, and profile - var os = $('#' + tabId + ' input[name=os]').val(); - var arch = $('#' + tabId + ' input[name=arch]').val(); - var profile = $('#' + tabId + ' input[name=profile]').val(); - - // Stop this function from executing again - // Unbind event - $(this).unbind(event); - $(this).css( { - 'background-color' : '#F2F2F2', - 'color' : '#424242' - }); - - /** - * (1) Set the OS, arch, and profile - */ - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'nodeadd', - tgt : '', - args : tgts + ';noderes.netboot=' + type + ';nodetype.os=' - + os + ';nodetype.arch=' + arch + ';nodetype.profile=' - + profile, - msg : 'cmd=nodeadd;inst=' + inst - }, - - success : updateNodesetStatus - }); - - // Show status bar - statBar.show(); - } else { - alert('You are missing some values'); - } - }); - nodesetForm.append(okBtn); - - // Append to discover tab - tab.add(tabId, 'Nodeset', nodesetForm); - - // Select new tab - tab.select(tabId); -} - -/** - * Load netboot page - * - * @param tgtNodes - * Targets to run rnetboot against - * @return Nothing - */ -function loadNetbootPage(tgtNodes) { - // Get nodes tab - var tab = getNodesTab(); - - // Generate new tab ID - var inst = 0; - var newTabId = 'netbootTab' + inst; - while ($('#' + newTabId).length) { - // If one already exists, generate another one - inst = inst + 1; - newTabId = 'netbootTab' + inst; - } - - // Open new tab - // Create netboot form - var netbootForm = $('
    '); - - // Create status bar - var barId = 'netbootStatusBar' + inst; - var statusBar = createStatusBar(barId); - statusBar.hide(); - netbootForm.append(statusBar); - - // Create loader - var loader = createLoader('netbootLoader'); - statusBar.append(loader); - - // Create info bar - var infoBar = createInfoBar('Cause the range of nodes to boot to network'); - netbootForm.append(infoBar); - - // Target node or group - var target = $('
    '); - netbootForm.append(target); - - // Create options - var optsDIV = $('
    '); - var optsLabel = $(''); - var optsList = $(''); - var opt = $('
  • '); - optsList.append(opt); - optsDIV.append(optsLabel); - optsDIV.append(optsList); - netbootForm.append(optsDIV); - - // Boot order - var bootOrderChkBox = $(''); - opt.append(bootOrderChkBox); - opt.append('Set the boot device order'); - var bootOrder = $('
  • '); - bootOrder.hide(); - optsList.append(bootOrder); - // Force reboot - optsList.append('
  • Force reboot
  • '); - // Force shutdown - optsList.append('
  • Force immediate shutdown of the partition
  • '); - // Iscsi dump - optsList.append('
  • Do a iscsi dump on AIX
  • '); - - // Show boot order when checkbox is checked - bootOrderChkBox.bind('click', function(event) { - if ($(this).is(':checked')) { - bootOrder.show(); - } else { - bootOrder.hide(); - } - }); - - // Determine plugin - var tmp = tgtNodes.split(','); - for ( var i = 0; i < tmp.length; i++) { - var mgt = getNodeMgt(tmp[i]); - // If it is zvm - if (mgt == 'zvm') { - // Add IPL input - netbootForm.append('
    '); - break; - } - } - - /** - * Ok - */ - var okBtn = createButton('Ok'); - okBtn.bind('click', function(event) { - var ready = true; - - // Check inputs - var inputs = $("#" + newTabId + " input[type='text']:visible"); - for ( var i = 0; i < inputs.length; i++) { - if (!inputs.eq(i).val()) { - inputs.eq(i).css('border', 'solid #FF0000 1px'); - ready = false; - } else { - inputs.eq(i).css('border', 'solid #BDBDBD 1px'); - } - } - - // Generate arguments - var chkBoxes = $("#" + newTabId + " input[type='checkbox']:checked"); - var optStr = ''; - var opt; - for ( var i = 0; i < chkBoxes.length; i++) { - opt = chkBoxes.eq(i).attr('name'); - optStr += '-' + opt; - - // If it is the boot order - if (opt == 's') { - // Get the boot order - optStr += ';' + $('#' + newTabId + ' input[name=bootOrder]').val(); - } - - // Append ; to end of string - if (i < (chkBoxes.length - 1)) { - optStr += ';'; - } - } - - // If no inputs are empty - if (ready) { - // Get nodes - var tgts = $('#' + newTabId + ' input[name=target]').val(); - - // Get IPL address - var ipl = $('#' + newTabId + ' input[name=ipl]'); - if (ipl) { - optStr += 'ipl=' + ipl.val(); - } - - // Stop this function from executing again - // Unbind event - $(this).unbind(event); - $(this).css( { - 'background-color' : '#F2F2F2', - 'color' : '#424242' - }); - - /** - * (1) Boot to network - */ - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'rnetboot', - tgt : tgts, - args : optStr, - msg : 'out=' + barId + ';cmd=rnetboot;tgt=' + tgts - }, - - success : updateStatusBar - }); - - // Show status bar - statusBar.show(); - } else { - alert('You are missing some values'); - } - }); - netbootForm.append(okBtn); - - // Append to discover tab - tab.add(newTabId, 'Netboot', netbootForm); - - // Select new tab - tab.select(newTabId); -} - -/** - * Load updatenode page - * - * @param tgtNodes - * Targets to run updatenode against - * @return Nothing - */ -function loadUpdatenodePage(tgtNodes) { - // Get nodes tab - var tab = getNodesTab(); - - // Generate new tab ID - var inst = 0; - var newTabId = 'updatenodeTab' + inst; - while ($('#' + newTabId).length) { - // If one already exists, generate another one - inst = inst + 1; - newTabId = 'updatenodeTab' + inst; - } - - // Open new tab - // Create updatenode form - var updatenodeForm = $('
    '); - - // Create status bar - var statBarId = 'updatenodeStatusBar' + inst; - var statusBar = createStatusBar(statBarId); - statusBar.hide(); - updatenodeForm.append(statusBar); - - // Create loader - var loader = createLoader('updatenodeLoader'); - statusBar.append(loader); - - // Create info bar - var infoBar = createInfoBar('Update nodes in an xCAT environment'); - updatenodeForm.append(infoBar); - - // Target node or group - var target = $('
    '); - updatenodeForm.append(target); - - // Create options - var optsDIV = $('
    '); - var optsLabel = $(''); - var optsList = $(''); - optsDIV.append(optsLabel); - optsDIV.append(optsList); - updatenodeForm.append(optsDIV); - - // Update all software - var updateAllChkBox = $(''); - var updateAllOpt = $('
  • '); - optsList.append(updateAllOpt); - updateAllOpt.append(updateAllChkBox); - updateAllOpt.append('Install or update all software contained in the source directory'); - - var allSwScrDirectory = $('
  • '); - allSwScrDirectory.hide(); - optsList.append(allSwScrDirectory); - - // Show alternate source directory when checked - updateAllChkBox.bind('click', function(event) { - if ($(this).is(':checked')) { - allSwScrDirectory.show(); - } else { - allSwScrDirectory.hide(); - } - }); - - // Update software - var updateChkBox = $(''); - var updateOpt = $('
  • '); - optsList.append(updateOpt); - updateOpt.append(updateChkBox); - updateOpt.append('Update software'); - - var scrDirectory = $('
  • '); - scrDirectory.hide(); - optsList.append(scrDirectory); - - var otherPkgs = $('
  • '); - otherPkgs.hide(); - optsList.append(otherPkgs); - - var rpmFlags = $('
  • '); - rpmFlags.hide(); - optsList.append(rpmFlags); - - var installPFlags = $('
  • '); - installPFlags.hide(); - optsList.append(installPFlags); - - // Show alternate source directory when checked - updateChkBox.bind('click', function(event) { - if ($(this).is(':checked')) { - scrDirectory.show(); - otherPkgs.show(); - rpmFlags.show(); - installPFlags.show(); - } else { - scrDirectory.hide(); - otherPkgs.hide(); - rpmFlags.hide(); - installPFlags.hide(); - } - }); - - // Postscripts - var postChkBox = $(''); - var postOpt = $('
  • '); - optsList.append(postOpt); - postOpt.append(postChkBox); - postOpt.append('Run postscripts'); - var postscripts = $('
  • '); - postscripts.hide(); - optsList.append(postscripts); - - // Show alternate source directory when checked - postChkBox.bind('click', function(event) { - if ($(this).is(':checked')) { - postscripts.show(); - } else { - postscripts.hide(); - } - }); - - optsList.append('
  • Distribute and synchronize files
  • '); - optsList.append('
  • Update the ssh keys and host keys for the service nodes and compute nodes
  • '); - - // Update OS - var osChkBox = $(''); - var osOpt = $('
  • '); - optsList.append(osOpt); - osOpt.append(osChkBox); - osOpt.append('Update the operating system'); - var os = $('
  • '); - os.hide(); - optsList.append(os); - - // Show alternate source directory when checked - osChkBox.bind('click', function(event) { - if ($(this).is(':checked')) { - os.show(); - } else { - os.hide(); - } - }); - - /** - * Ok - */ - var okBtn = createButton('Ok'); - okBtn.bind('click', function(event) { - var ready = true; - - // Generate arguments - var chkBoxes = $("#" + newTabId + " input[type='checkbox']:checked"); - var optStr = ''; - var opt; - for ( var i = 0; i < chkBoxes.length; i++) { - opt = chkBoxes.eq(i).attr('name'); - optStr += '-' + opt; - - // If update all software is checked - if (opt == 'S') { - var srcDir = $('#' + newTabId + ' input[name=allSwSrcDirectory]').val(); - if (srcDir) { - optStr += ';-d ' + srcDir; - } - } - - // If update software is checked - if (opt == 'S') { - var srcDir = $('#' + newTabId + ' input[name=srcDirectory]').val(); - if (srcDir) { - optStr += ';-d;' + srcDir; - } - - var otherpkgs = $('#' + newTabId + ' input[name=otherpkgs]').val(); - if (otherpkgs) { - optStr += ';otherpkgs=' + otherpkgs; - } - - var rpm_flags = $('#' + newTabId + ' input[name=rpm_flags]').val(); - if (rpm_flags) { - optStr += ';rpm_flags=' + rpm_flags; - } - - var installp_flags = $('#' + newTabId + ' input[name=installp_flags]').val(); - if (installp_flags) { - optStr += ';installp_flags=' + installp_flags; - } - } - - // If postscripts is checked - if (opt == 'P') { - // Get postscripts - optStr += ';' + $('#' + newTabId + ' input[name=postscripts]').val(); - } - - // If operating system is checked - if (opt == 'o') { - // Get the OS - optStr += ';' + $('#' + newTabId + ' input[name=os]').val(); - } - - // Append ; to end of string - if (i < (chkBoxes.length - 1)) { - optStr += ';'; - } - } - - // If no inputs are empty - if (ready) { - // Get nodes - var tgts = $('#' + newTabId + ' input[name=target]').val(); - - // Stop this function from executing again - // Unbind event - $(this).unbind(event); - $(this).css( { - 'background-color' : '#F2F2F2', - 'color' : '#424242' - }); - - /** - * (1) Boot to network - */ - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'updatenode', - tgt : tgts, - args : optStr, - msg : 'out=' + statBarId + ';cmd=updatenode;tgt=' + tgts - }, - - success : updateStatusBar - }); - - // Show status bar - statusBar.show(); - } else { - alert('You are missing some values'); - } - }); - updatenodeForm.append(okBtn); - - // Append to discover tab - tab.add(newTabId, 'Updatenode', updatenodeForm); - - // Select new tab - tab.select(newTabId); -} - /** * Sort a list * @@ -1480,8 +832,6 @@ function sortAlpha(a, b) { */ function powerNode(node, power2) { node = node.replace('Power', ''); - - // Power on/off node $.ajax( { url : 'lib/cmd.php', dataType : 'json', @@ -1603,179 +953,14 @@ function deleteNode(tgtNodes) { } /** - * Update nodeset status - * - * @param data - * Data returned from HTTP request - * @return Nothing - */ -function updateNodesetStatus(data) { - var rsp = data.rsp; - var args = data.msg.split(';'); - var cmd = args[0].replace('cmd=', ''); - - // Get nodeset instance - var inst = args[1].replace('inst=', ''); - var statBarId = 'nodesetStatusBar' + inst; - var tabId = 'nodesetTab' + inst; - - // Get nodes - var tgts = $('#' + tabId + ' input[name=target]').val(); - - // Get boot method - var method = $('#' + tabId + ' select[id=bootMethod]').val(); - - /** - * (2) Update /etc/hosts - */ - if (cmd == 'nodeadd') { - // If no output, no errors occurred - if (rsp.length) { - $('#' + statBarId).append( - '

    (Error) Failed to create node definition

    '); - } else { - // Create target nodes string - var tgtNodesStr = ''; - var nodes = tgts.split(','); - // Loop through each node - for ( var i in nodes) { - // If it is the 1st and only node - if (i == 0 && i == nodes.length - 1) { - tgtNodesStr += nodes[i]; - } - // If it is the 1st node of many nodes - else if (i == 0 && i != nodes.length - 1) { - // Append a comma to the string - tgtNodesStr += nodes[i] + ', '; - } else { - // If it is the last node - if (i == nodes.length - 1) { - // Append nothing to the string - tgtNodesStr += nodes[i]; - } else { - // For every 10 nodes, append a break - if ((i % 10) > 0) { - tgtNodesStr += nodes[i] + ', '; - } else { - tgtNodesStr += nodes[i] + ',
    '; - } - } - } - } - - $('#' + statBarId).append( - '

    Node definition created for ' + tgtNodesStr + '

    '); - } - - // Update /etc/hosts - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'makehosts', - tgt : '', - args : '', - msg : 'cmd=makehosts;inst=' + inst - }, - - success : updateNodesetStatus - }); - } - - /** - * (4) Update DNS - */ - else if (cmd == 'makehosts') { - // If no output, no errors occurred - if (rsp.length) { - $('#' + statBarId).append( - '

    (Error) Failed to update /etc/hosts

    '); - } else { - $('#' + statBarId).append('

    /etc/hosts updated

    '); - } - - // Update DNS - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'makedns', - tgt : '', - args : '', - msg : 'cmd=makedns;inst=' + inst - }, - - success : updateNodesetStatus - }); - } - - /** - * (5) Update DHCP - */ - else if (cmd == 'makedns') { - // Write ajax response to status bar - var prg = writeRsp(rsp, ''); - $('#' + statBarId).append(prg); - - // Update DHCP - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'makedhcp', - tgt : '', - args : '-a', - msg : 'cmd=makedhcp;inst=' + inst - }, - - success : updateNodesetStatus - }); - } - - /** - * (6) Prepare node for boot - */ - else if (cmd == 'makedhcp') { - // Write ajax response to status bar - var prg = writeRsp(rsp, ''); - $('#' + statBarId).append(prg); - - // Prepare node for boot - $.ajax( { - url : 'lib/cmd.php', - dataType : 'json', - data : { - cmd : 'nodeset', - tgt : tgts, - args : method, - msg : 'cmd=nodeset;inst=' + inst - }, - - success : updateNodesetStatus - }); - } - - /** - * (7) Boot node from network - */ - else if (cmd == 'nodeset') { - // Write ajax response to status bar - var prg = writeRsp(rsp, ''); - $('#' + statBarId).append(prg); - - // Hide loader - $('#' + statBarId).find('img').hide(); - } -} - -/** - * Update the status bar of a given tab + * Update status bar of a given tab * * @param data * Data returned from HTTP request * @return Nothing */ function updateStatusBar(data) { + // Get ajax response var rsp = data.rsp; var args = data.msg.split(';'); var statBarId = args[0].replace('out=', ''); @@ -1855,7 +1040,7 @@ function formComplete(tabId) { } /** - * Update the power status of a node in the datatable + * Update power status of a node in the datatable * * @param data * Data from HTTP request @@ -2031,13 +1216,11 @@ function setOSImageCookies(data) { */ function setGroupsCookies(data) { var rsp = data.rsp; - - // Save groups names in a cookie $.cookie('Groups', rsp); } /** - * Get the row element that contains the given node + * Get row element that contains given node * * @param tgtNode * Node to find @@ -2065,7 +1248,7 @@ function getNodeRow(tgtNode, rows) { } /** - * Get the nodes that are checked in a given datatable + * Get nodes that are checked in a given datatable * * @param datatableId * The datatable ID diff --git a/xCAT-UI/js/nodes/nodeset.js b/xCAT-UI/js/nodes/nodeset.js new file mode 100644 index 000000000..582131857 --- /dev/null +++ b/xCAT-UI/js/nodes/nodeset.js @@ -0,0 +1,355 @@ +/** + * Load nodeset page + * + * @param trgtNodes + * Targets to run nodeset against + * @return Nothing + */ +function loadNodesetPage(trgtNodes) { + // Get OS images + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'tabdump', + tgt : '', + args : 'osimage', + msg : '' + }, + + success : setOSImageCookies + }); + + // Get nodes tab + var tab = getNodesTab(); + + // Generate new tab ID + var inst = 0; + var tabId = 'nodesetTab' + inst; + while ($('#' + tabId).length) { + // If one already exists, generate another one + inst = inst + 1; + tabId = 'nodesetTab' + inst; + } + + // Open new tab + // Create nodeset form + var nodesetForm = $('
    '); + + // Create status bar + var statBarId = 'nodesetStatusBar' + inst; + var statBar = createStatusBar(statBarId); + statBar.hide(); + nodesetForm.append(statBar); + + // Create loader + var loader = createLoader('nodesetLoader'); + statBar.append(loader); + + // Create info bar + var infoBar = createInfoBar('Set the boot state for a node range'); + nodesetForm.append(infoBar); + + // Create target node or group + var tgt = $('
    '); + nodesetForm.append(tgt); + + // Create boot method drop down + var method = $('
    '); + var methodLabel = $(''); + var methodSelect = $(''); + methodSelect.append(''); + methodSelect.append(''); + methodSelect.append(''); + methodSelect.append(''); + methodSelect.append(''); + method.append(methodLabel); + method.append(methodSelect); + nodesetForm.append(method); + + // Create boot type drop down + var type = $('
    '); + var typeLabel = $(''); + var typeSelect = $(''); + typeSelect.append(''); + typeSelect.append(''); + typeSelect.append(''); + type.append(typeLabel); + type.append(typeSelect); + nodesetForm.append(type); + + // Create operating system input + var os = $('
    '); + var osLabel = $(''); + var osInput = $(''); + osInput.one('focus', function(){ + var tmp = $.cookie('OSVers'); + if (tmp) { + // Turn on auto complete + $(this).autocomplete(tmp.split(',')); + } + }); + os.append(osLabel); + os.append(osInput); + nodesetForm.append(os); + + // Create architecture input + var arch = $('
    '); + var archLabel = $(''); + var archInput = $(''); + archInput.one('focus', function(){ + var tmp = $.cookie('OSArchs'); + if (tmp) { + // Turn on auto complete + $(this).autocomplete(tmp.split(',')); + } + }); + arch.append(archLabel); + arch.append(archInput); + nodesetForm.append(arch); + + // Create profiles input + var profile = $('
    '); + var profileLabel = $(''); + var profileInput = $(''); + profileInput.one('focus', function(){ + tmp = $.cookie('Profiles'); + if (tmp) { + // Turn on auto complete + $(this).autocomplete(tmp.split(',')); + } + }); + profile.append(profileLabel); + profile.append(profileInput); + nodesetForm.append(profile); + + /** + * Ok + */ + var okBtn = createButton('Ok'); + okBtn.bind('click', function(event) { + // Check state, OS, arch, and profile + var ready = true; + var inputs = $('#' + tabId + ' input'); + for ( var i = 0; i < inputs.length; i++) { + if (!inputs.eq(i).val() && inputs.eq(i).attr('name') != 'diskPw') { + inputs.eq(i).css('border', 'solid #FF0000 1px'); + ready = false; + } else { + inputs.eq(i).css('border', 'solid #BDBDBD 1px'); + } + } + + if (ready) { + // Get nodes + var tgts = $('#' + tabId + ' input[name=target]').val(); + // Get boot method + var method = $('#' + tabId + ' select[id=bootMethod]').val(); + // Get boot type + var type = $('#' + tabId + ' select[id=bootType]').val(); + + // Get OS, arch, and profile + var os = $('#' + tabId + ' input[name=os]').val(); + var arch = $('#' + tabId + ' input[name=arch]').val(); + var profile = $('#' + tabId + ' input[name=profile]').val(); + + // Disable Ok button + $(this).unbind(event); + $(this).css( { + 'background-color' : '#F2F2F2', + 'color' : '#424242' + }); + + /** + * (1) Set the OS, arch, and profile + */ + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'nodeadd', + tgt : '', + args : tgts + ';noderes.netboot=' + type + + ';nodetype.os=' + os + + ';nodetype.arch=' + arch + + ';nodetype.profile=' + profile, + msg : 'cmd=nodeadd;inst=' + inst + }, + + success : updateNodesetStatus + }); + + // Show status bar + statBar.show(); + } else { + alert('You are missing some values'); + } + }); + nodesetForm.append(okBtn); + + // Append to discover tab + tab.add(tabId, 'Nodeset', nodesetForm); + + // Select new tab + tab.select(tabId); +} + +/** + * Update nodeset status + * + * @param data + * Data returned from HTTP request + * @return Nothing + */ +function updateNodesetStatus(data) { + // Get ajax response + var rsp = data.rsp; + var args = data.msg.split(';'); + var cmd = args[0].replace('cmd=', ''); + + // Get nodeset instance + var inst = args[1].replace('inst=', ''); + // Get status bar ID + var statBarId = 'nodesetStatusBar' + inst; + // Get tab ID + var tabId = 'nodesetTab' + inst; + + // Get nodes + var tgts = $('#' + tabId + ' input[name=target]').val(); + // Get boot method + var method = $('#' + tabId + ' select[id=bootMethod]').val(); + + /** + * (2) Update /etc/hosts + */ + if (cmd == 'nodeadd') { + if (rsp.length) { + $('#' + statBarId).find('img').hide(); + $('#' + statBarId).append('

    (Error) Failed to create node definition

    '); + } else { + // Create target nodes string + var tgtNodesStr = ''; + // Loop through each node + for ( var i in nodes) { + // If it is the 1st and only node + if (i == 0 && i == nodes.length - 1) { + tgtNodesStr += nodes[i]; + } + // If it is the 1st node of many nodes + else if (i == 0 && i != nodes.length - 1) { + // Append a comma to the string + tgtNodesStr += nodes[i] + ', '; + } else { + // If it is the last node + if (i == nodes.length - 1) { + // Append nothing to the string + tgtNodesStr += nodes[i]; + } else { + // Append a comma to the string + tgtNodesStr += nodes[i] + ', '; + } + } + } + + $('#' + statBarId).append('

    Node definition created for ' + tgtNodesStr + '

    '); + } + + // Update /etc/hosts + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'makehosts', + tgt : '', + args : '', + msg : 'cmd=makehosts;inst=' + inst + }, + + success : updateNodesetStatus + }); + } + + /** + * (4) Update DNS + */ + else if (cmd == 'makehosts') { + // If no output, no errors occurred + if (rsp.length) { + $('#' + statBarId).append('

    (Error) Failed to update /etc/hosts

    '); + } else { + $('#' + statBarId).append('

    /etc/hosts updated

    '); + } + + // Update DNS + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'makedns', + tgt : '', + args : '', + msg : 'cmd=makedns;inst=' + inst + }, + + success : updateNodesetStatus + }); + } + + /** + * (5) Update DHCP + */ + else if (cmd == 'makedns') { + // Write ajax response to status bar + var prg = writeRsp(rsp, ''); + $('#' + statBarId).append(prg); + + // Update DHCP + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'makedhcp', + tgt : '', + args : '-a', + msg : 'cmd=makedhcp;inst=' + inst + }, + + success : updateNodesetStatus + }); + } + + /** + * (6) Prepare node for boot + */ + else if (cmd == 'makedhcp') { + // Write ajax response to status bar + var prg = writeRsp(rsp, ''); + $('#' + statBarId).append(prg); + + // Prepare node for boot + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'nodeset', + tgt : tgts, + args : method, + msg : 'cmd=nodeset;inst=' + inst + }, + + success : updateNodesetStatus + }); + } + + /** + * (7) Boot node from network + */ + else if (cmd == 'nodeset') { + // Write ajax response to status bar + var prg = writeRsp(rsp, ''); + $('#' + statBarId).append(prg); + + // Hide loader + $('#' + statBarId).find('img').hide(); + } +} \ No newline at end of file diff --git a/xCAT-UI/js/nodes/rnetboot.js b/xCAT-UI/js/nodes/rnetboot.js new file mode 100644 index 000000000..705113d90 --- /dev/null +++ b/xCAT-UI/js/nodes/rnetboot.js @@ -0,0 +1,173 @@ +/** + * Load netboot page + * + * @param tgtNodes + * Targets to run rnetboot against + * @return Nothing + */ +function loadNetbootPage(tgtNodes) { + // Get nodes tab + var tab = getNodesTab(); + + // Generate new tab ID + var inst = 0; + var newTabId = 'netbootTab' + inst; + while ($('#' + newTabId).length) { + // If one already exists, generate another one + inst = inst + 1; + newTabId = 'netbootTab' + inst; + } + + // Create netboot form + var netbootForm = $('
    '); + + // Create status bar + var barId = 'netbootStatusBar' + inst; + var statusBar = createStatusBar(barId); + statusBar.hide(); + netbootForm.append(statusBar); + + // Create loader + var loader = createLoader('netbootLoader'); + statusBar.append(loader); + + // Create info bar + var infoBar = createInfoBar('Cause the range of nodes to boot to network'); + netbootForm.append(infoBar); + + // Create target node or group input + var target = $('
    '); + netbootForm.append(target); + + // Create options + var optsDIV = $('
    '); + var optsLabel = $(''); + var optsList = $(''); + var opt = $('
  • '); + optsList.append(opt); + optsDIV.append(optsLabel); + optsDIV.append(optsList); + netbootForm.append(optsDIV); + + // Create boot order checkbox + var bootOrderChkBox = $(''); + opt.append(bootOrderChkBox); + opt.append('Set the boot device order'); + // Create boot order input + var bootOrder = $('
  • '); + bootOrder.hide(); + optsList.append(bootOrder); + + // Create force reboot checkbox + optsList.append('
  • Force reboot
  • '); + // Create force shutdown checkbox + optsList.append('
  • Force immediate shutdown of the partition
  • '); + // Create iscsi dump checkbox + optsList.append('
  • Do a iscsi dump on AIX
  • '); + + // Show boot order when checkbox is checked + bootOrderChkBox.bind('click', function(event) { + if ($(this).is(':checked')) { + bootOrder.show(); + } else { + bootOrder.hide(); + } + }); + + // Determine plugin + var tmp = tgtNodes.split(','); + for ( var i = 0; i < tmp.length; i++) { + var mgt = getNodeMgt(tmp[i]); + // If it is zvm + if (mgt == 'zvm') { + // Add IPL input + netbootForm.append('
    '); + break; + } + } + + /** + * Ok + */ + var okBtn = createButton('Ok'); + okBtn.bind('click', function(event) { + // Check inputs + var ready = true; + var inputs = $("#" + newTabId + " input[type='text']:visible"); + for ( var i = 0; i < inputs.length; i++) { + if (!inputs.eq(i).val()) { + inputs.eq(i).css('border', 'solid #FF0000 1px'); + ready = false; + } else { + inputs.eq(i).css('border', 'solid #BDBDBD 1px'); + } + } + + // Generate arguments + var chkBoxes = $("#" + newTabId + " input[type='checkbox']:checked"); + var optStr = ''; + var opt; + for ( var i = 0; i < chkBoxes.length; i++) { + opt = chkBoxes.eq(i).attr('name'); + optStr += '-' + opt; + + // If it is the boot order + if (opt == 's') { + // Get the boot order + optStr += ';' + $('#' + newTabId + ' input[name=bootOrder]').val(); + } + + // Append ; to end of string + if (i < (chkBoxes.length - 1)) { + optStr += ';'; + } + } + + // If no inputs are empty + if (ready) { + // Get nodes + var tgts = $('#' + newTabId + ' input[name=target]').val(); + + // Get IPL address + var ipl = $('#' + newTabId + ' input[name=ipl]'); + if (ipl) { + optStr += 'ipl=' + ipl.val(); + } + + // Disable Ok button + $(this).unbind(event); + $(this).css( { + 'background-color' : '#F2F2F2', + 'color' : '#424242' + }); + + /** + * (1) Boot to network + */ + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'rnetboot', + tgt : tgts, + args : optStr, + msg : 'out=' + barId + ';cmd=rnetboot;tgt=' + tgts + }, + + success : updateStatusBar + }); + + // Show status bar + statusBar.show(); + } else { + alert('You are missing some values'); + } + }); + netbootForm.append(okBtn); + + // Append to discover tab + tab.add(newTabId, 'Netboot', netbootForm); + + // Select new tab + tab.select(newTabId); +} \ No newline at end of file diff --git a/xCAT-UI/js/nodes/updatenode.js b/xCAT-UI/js/nodes/updatenode.js new file mode 100644 index 000000000..662ea26b7 --- /dev/null +++ b/xCAT-UI/js/nodes/updatenode.js @@ -0,0 +1,255 @@ +/** + * Load updatenode page + * + * @param tgtNodes + * Targets to run updatenode against + * @return Nothing + */ +function loadUpdatenodePage(tgtNodes) { + // Get nodes tab + var tab = getNodesTab(); + + // Generate new tab ID + var inst = 0; + var newTabId = 'updatenodeTab' + inst; + while ($('#' + newTabId).length) { + // If one already exists, generate another one + inst = inst + 1; + newTabId = 'updatenodeTab' + inst; + } + + // Create updatenode form + var updatenodeForm = $('
    '); + + // Create status bar + var statBarId = 'updatenodeStatusBar' + inst; + var statusBar = createStatusBar(statBarId); + statusBar.hide(); + updatenodeForm.append(statusBar); + + // Create loader + var loader = createLoader('updatenodeLoader'); + statusBar.append(loader); + + // Create info bar + var infoBar = createInfoBar('Update nodes in an xCAT environment'); + updatenodeForm.append(infoBar); + + // Create target node or group input + var target = $('
    '); + updatenodeForm.append(target); + + // Create options + var optsDIV = $('
    '); + var optsLabel = $(''); + var optsList = $(''); + optsDIV.append(optsLabel); + optsDIV.append(optsList); + updatenodeForm.append(optsDIV); + + // Create update all software checkbox + var updateAllChkBox = $(''); + var updateAllOpt = $('
  • '); + optsList.append(updateAllOpt); + updateAllOpt.append(updateAllChkBox); + updateAllOpt.append('Install or update all software contained in the source directory'); + var allSwScrDirectory = $('
  • '); + allSwScrDirectory.hide(); + optsList.append(allSwScrDirectory); + + // Show alternate source directory when checked + updateAllChkBox.bind('click', function(event) { + if ($(this).is(':checked')) { + allSwScrDirectory.show(); + } else { + allSwScrDirectory.hide(); + } + }); + + // Create update software checkbox + var updateChkBox = $(''); + var updateOpt = $('
  • '); + optsList.append(updateOpt); + updateOpt.append(updateChkBox); + updateOpt.append('Update software'); + + // Create source directory input + var scrDirectory = $('
  • '); + scrDirectory.hide(); + optsList.append(scrDirectory); + + // Create other packages input + var otherPkgs = $('
  • '); + otherPkgs.hide(); + optsList.append(otherPkgs); + + // Create RPM flags input + var rpmFlags = $('
  • '); + rpmFlags.hide(); + optsList.append(rpmFlags); + + // Create installp flags input + var installPFlags = $('
  • '); + installPFlags.hide(); + optsList.append(installPFlags); + + // Show alternate source directory when checked + updateChkBox.bind('click', function(event) { + if ($(this).is(':checked')) { + scrDirectory.show(); + otherPkgs.show(); + rpmFlags.show(); + installPFlags.show(); + } else { + scrDirectory.hide(); + otherPkgs.hide(); + rpmFlags.hide(); + installPFlags.hide(); + } + }); + + // Create postscripts input + var postChkBox = $(''); + var postOpt = $('
  • '); + optsList.append(postOpt); + postOpt.append(postChkBox); + postOpt.append('Run postscripts'); + var postscripts = $('
  • '); + postscripts.hide(); + optsList.append(postscripts); + // Show alternate source directory when checked + postChkBox.bind('click', function(event) { + if ($(this).is(':checked')) { + postscripts.show(); + } else { + postscripts.hide(); + } + }); + optsList.append('
  • Distribute and synchronize files
  • '); + optsList.append('
  • Update the ssh keys and host keys for the service nodes and compute nodes
  • '); + + // Create update OS checkbox + var osChkBox = $(''); + var osOpt = $('
  • '); + optsList.append(osOpt); + osOpt.append(osChkBox); + osOpt.append('Update the operating system'); + var os = $('
  • '); + os.hide(); + optsList.append(os); + + // Show alternate source directory when checked + osChkBox.bind('click', function(event) { + if ($(this).is(':checked')) { + os.show(); + } else { + os.hide(); + } + }); + + /** + * Ok + */ + var okBtn = createButton('Ok'); + okBtn.bind('click', function(event) { + var ready = true; + + // Generate arguments + var chkBoxes = $("#" + newTabId + " input[type='checkbox']:checked"); + var optStr = ''; + var opt; + for ( var i = 0; i < chkBoxes.length; i++) { + opt = chkBoxes.eq(i).attr('name'); + optStr += '-' + opt; + + // If update all software is checked + if (opt == 'S') { + var srcDir = $('#' + newTabId + ' input[name=allSwSrcDirectory]').val(); + if (srcDir) { + optStr += ';-d ' + srcDir; + } + } + + // If update software is checked + if (opt == 'S') { + var srcDir = $('#' + newTabId + ' input[name=srcDirectory]').val(); + if (srcDir) { + optStr += ';-d;' + srcDir; + } + + var otherpkgs = $('#' + newTabId + ' input[name=otherpkgs]').val(); + if (otherpkgs) { + optStr += ';otherpkgs=' + otherpkgs; + } + + var rpm_flags = $('#' + newTabId + ' input[name=rpm_flags]').val(); + if (rpm_flags) { + optStr += ';rpm_flags=' + rpm_flags; + } + + var installp_flags = $('#' + newTabId + ' input[name=installp_flags]').val(); + if (installp_flags) { + optStr += ';installp_flags=' + installp_flags; + } + } + + // If postscripts is checked + if (opt == 'P') { + // Get postscripts + optStr += ';' + $('#' + newTabId + ' input[name=postscripts]').val(); + } + + // If operating system is checked + if (opt == 'o') { + // Get the OS + optStr += ';' + $('#' + newTabId + ' input[name=os]').val(); + } + + // Append ; to end of string + if (i < (chkBoxes.length - 1)) { + optStr += ';'; + } + } + + // If no inputs are empty + if (ready) { + // Get nodes + var tgts = $('#' + newTabId + ' input[name=target]').val(); + + // Disable Ok button + $(this).unbind(event); + $(this).css( { + 'background-color' : '#F2F2F2', + 'color' : '#424242' + }); + + /** + * (1) Boot to network + */ + $.ajax( { + url : 'lib/cmd.php', + dataType : 'json', + data : { + cmd : 'updatenode', + tgt : tgts, + args : optStr, + msg : 'out=' + statBarId + ';cmd=updatenode;tgt=' + tgts + }, + + success : updateStatusBar + }); + + // Show status bar + statusBar.show(); + } else { + alert('You are missing some values'); + } + }); + updatenodeForm.append(okBtn); + + // Append to discover tab + tab.add(newTabId, 'Updatenode', updatenodeForm); + + // Select new tab + tab.select(newTabId); +} \ No newline at end of file diff --git a/xCAT-UI/js/provision/provision.js b/xCAT-UI/js/provision/provision.js index e0df3284e..2b18e8aaf 100644 --- a/xCAT-UI/js/provision/provision.js +++ b/xCAT-UI/js/provision/provision.js @@ -38,8 +38,7 @@ function loadProvisionPage() { // Create status bar, hide on load var statBarId = 'ProvisionStatusBar'; - var statBar = $('
    ') - .hide(); + var statBar = $('
    ').hide(); // Create info bar var infoBar = createInfoBar('Provision a node'); @@ -56,8 +55,7 @@ function loadProvisionPage() { tab.init(); $('#content').append(tab.object()); - // Create drop-down menu - // Hardware available to provision - ipmi, blade, hmc, ivm, fsp, and zvm + // Create drop down menu for platforms var div = $('
    '); provForm.append(div); diff --git a/xCAT-UI/js/ui.js b/xCAT-UI/js/ui.js index fa95bf6ac..3f35d11da 100644 --- a/xCAT-UI/js/ui.js +++ b/xCAT-UI/js/ui.js @@ -29,10 +29,9 @@ Tab.prototype.init = function() { this.tab.append(tabList); // Create a template with close button - var tabs = this.tab - .tabs( { - tabTemplate : "
  • #{label}
  • " - }); + var tabs = this.tab.tabs( { + tabTemplate : "
  • #{label}
  • " + }); // Remove dummy tab this.tab.tabs("remove", 0); @@ -103,7 +102,6 @@ Tab.prototype.select = function(id) { * @return Nothing */ Tab.prototype.remove = function(id) { - // To be continued var selectorStr = 'a[href="\#' + id + '"]'; var selectTab = $(selectorStr, this.tab).parent(); var index = ($('li', this.tab).index(selectTab)); @@ -391,8 +389,6 @@ function createMenu(items) { */ function initPage() { // Load javascripts - // TODO: We need to determine which page needs which script - // and load less includeJs("js/jquery/jquery.dataTables.min.js"); includeJs("js/jquery/jquery.form.js"); includeJs("js/jquery/jquery.jeditable.js"); @@ -427,6 +423,10 @@ function initPage() { // Show the page $("#content").children().remove(); if (page == 'index.php') { + includeJs("js/nodes/nodeset.js"); + includeJs("js/nodes/rnetboot.js"); + includeJs("js/nodes/updatenode.js"); + headers.eq(0).css('background-color', '#A9D0F5'); loadNodesPage(); } else if (page == 'configure.php') { @@ -473,7 +473,7 @@ function includeJs(file) { * @param rsp * Ajax response * @param pattern - * Pattern to insert a break in between + * Pattern to replace with a break * @return Paragraph containing ajax response */ function writeRsp(rsp, pattern) { @@ -481,6 +481,8 @@ function writeRsp(rsp, pattern) { var prg = $('

    '); for ( var i in rsp) { if (rsp[i]) { + // Create regular expression for given pattern + // Replace pattern with break if (pattern) { rsp[i] = rsp[i].replace(new RegExp(pattern, 'g'), '
    '); }