/** * Global variables */ var diskDatatable; // zVM datatable containing disks var networkDatatable; // zVM datatable containing networks /** * Get the disk datatable * * @param Nothing * @return Data table object */ function getDiskDataTable() { return diskDatatable; } /** * Set the disk datatable * * @param table * Data table object * @return Nothing */ function setDiskDataTable(table) { diskDatatable = table; } /** * Get the network datatable * * @param Nothing * @return Data table object */ function getNetworkDataTable() { return networkDatatable; } /** * Set the network datatable * * @param table * Data table object * @return Nothing */ function setNetworkDataTable(table) { networkDatatable = table; } /** * Load user entry of a given node * * @param data * Data from HTTP request * @return Nothing */ function loadUserEntry(data) { var args = data.msg.split(';'); // Get tab ID var ueDivId = args[0].replace('out=', ''); // Get node var node = args[1].replace('node=', ''); // Get node user entry var userEntry = data.rsp[0].split(node + ':'); // Remove loader var loaderId = node + 'TabLoader'; $('#' + loaderId).remove(); var toggleLinkId = node + 'ToggleLink'; $('#' + toggleLinkId).click(function() { // Get the text within this link var lnkText = $(this).text(); // Toggle user entry division $('#' + node + 'UserEntry').toggle(); // Toggle inventory division $('#' + node + 'Inventory').toggle(); // Change text if (lnkText == 'Show user entry') { $(this).text('Show inventory'); } else { $(this).text('Show user entry'); } }); // Put user entry into a list var fieldSet = $('
'); var legend = $(''); fieldSet.append(legend); var txtArea = $(''); for ( var i = 1; i < userEntry.length; i++) { userEntry[i] = jQuery.trim(userEntry[i]); txtArea.append(userEntry[i]); if (i < userEntry.length) { txtArea.append('\n'); } } txtArea.attr('readonly', 'readonly'); fieldSet.append(txtArea); /** * Edit user entry */ txtArea.bind('dblclick', function(event) { txtArea.attr('readonly', ''); txtArea.css( { 'border-width' : '1px' }); saveBtn.show(); cancelBtn.show(); }); /** * Save */ var saveBtn = createButton('Save'); saveBtn.hide(); saveBtn.bind('click', function(event) { // Show loader var statusId = node + 'StatusBar'; var statusBarLoaderId = node + 'StatusBarLoader'; $('#' + statusBarLoaderId).show(); $('#' + statusId).show(); // Replace user entry var newUserEntry = jQuery.trim(txtArea.val()) + '\n'; // Replace user entry $.ajax( { url : 'lib/zCmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : '--replacevs', att : newUserEntry, msg : node }, success : updateZNodeStatus }); // Increment node process and save it in a cookie incrementNodeProcess(node); txtArea.attr('readonly', 'readonly'); txtArea.css( { 'border-width' : '0px' }); // Stop this function from executing again // Unbind event $(this).unbind(event); $(this).hide(); cancelBtn.hide(); }); /** * Cancel */ var cancelBtn = createButton('Cancel'); cancelBtn.hide(); cancelBtn.bind('click', function(event) { txtArea.attr('readonly', 'readonly'); txtArea.css( { 'border-width' : '0px' }); cancelBtn.hide(); saveBtn.hide(); }); // Create info bar var infoBar = createInfoBar('Double click on the user entry to edit'); // Append user entry into division $('#' + ueDivId).append(infoBar); $('#' + ueDivId).append(fieldSet); $('#' + ueDivId).append(saveBtn); $('#' + ueDivId).append(cancelBtn); } /** * Set a cookie to track the number of processes for a given node * * @param node * Node to set cookie for * @return Nothing */ function incrementNodeProcess(node) { // Set cookie for number actions performed against node var procs = $.cookie(node + 'Processes'); if (procs) { // One more process procs = parseInt(procs) + 1; $.cookie(node + 'Processes', procs); } else { $.cookie(node + 'Processes', 1); } } /** * Update the provision new node status * * @param data * Data returned from HTTP request * @return Nothing */ function updateProvisionNewStatus(data) { var rsp = data.rsp; var args = data.msg.split(';'); // Get command invoked var cmd = args[0].replace('cmd=', ''); // Get output ID var out2Id = args[1].replace('out=', ''); var statBarId = 'zProvisionStatBar' + out2Id; var tabId = 'zvmProvisionTab' + out2Id; // The tab must be open in order to get these inputs // 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 (rsp.length) { $('#' + statBarId).append( '(Error) Failed to create node definition
'); } else { $('#' + statBarId).append( 'Node definition created for ' + node + '
'); } // 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 (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;out=' + out2Id }, success : updateProvisionNewStatus }); } /** * (4) Create user entry */ else if (cmd == 'makedns') { // Reset the number of tries $.cookie('tries4' + tabId, 0); // Separate output into lines var p = $(''); for ( var i = 0; i < rsp.length; i++) { if (rsp[i]) { p.append(rsp[i]); p.append('Trying again
'); tries = tries + 1; // One more try $.cookie('tries4' + tabId, tries); // Create user entry $.ajax( { url : 'lib/zCmd.php', dataType : 'json', data : { cmd : 'mkvm', tgt : node, args : '', att : userEntry, msg : 'cmd=mkvm;out=' + out2Id }, success : updateProvisionNewStatus }); } else { // Failed - Do not continue var loaderId = 'zProvisionLoader' + out2Id; $('#' + loaderId).hide(); } } // If there were no errors else { // Reset the number of tries $.cookie('tries4' + tabId, 0); // Set cookie for number of disks var diskRows = $('#' + tabId + ' table tr'); $.cookie('zProvisionDisks2Add' + out2Id, diskRows.length); if (diskRows.length > 0) { for ( var i = 0; i < diskRows.length; i++) { var diskArgs = diskRows.eq(i).find('td'); var type = diskArgs.eq(1).find('select').val(); var address = diskArgs.eq(2).find('input').val(); var size = diskArgs.eq(3).find('input').val(); var pool = diskArgs.eq(4).find('input').val(); var password = diskArgs.eq(5).find('input').val(); // Add disk and format disk if (type == '3390') { $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : '--add3390;' + pool + ';' + address + ';' + size + ';MR;' + password + ';' + password + ';' + password, msg : 'cmd=chvm;out=' + out2Id }, 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 */ else if (cmd == 'chvm') { var failed = false; // Separate output into lines var p = $(''); for ( var i = 0; i < rsp.length; i++) { if (rsp[i]) { // Find the node name and insert a break before it rsp[i] = rsp[i].replace(new RegExp(node + ': ', 'g'), 'Trying again
'); tries = tries + 1; // One more try $.cookie('tries4' + tabId, tries); // Set cookie for number of disks var diskRows = $('#' + tabId + ' table tr'); $.cookie('zProvisionDisks2Add' + out2Id, diskRows.length); if (diskRows.length > 0) { for ( var i = 0; i < diskRows.length; i++) { 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 $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'chvm', tgt : node, args : '--add3390;' + pool + ';' + address + ';' + size + ';MR;' + password + ';' + password + ';' + password, msg : 'cmd=chvm;out=' + out2Id }, success : updateProvisionNewStatus }); } } else { // Virtual server created (no OS, no disks) var loaderId = 'zProvisionLoader' + out2Id; $('#' + loaderId).hide(); } } else { // Failed - Do not continue var loaderId = 'zProvisionLoader' + out2Id; $('#' + loaderId).remove(); } } else { // Reset the number of tries $.cookie('tries4' + tabId, 0); // Get cookie for number of disks var disks2add = $.cookie('zProvisionDisks2Add' + out2Id); // One less disk to add disks2add = disks2add - 1; // Set cookie for number of disks $.cookie('zProvisionDisks2Add' + out2Id, disks2add); // If an operating system is given if (osImage) { var tmp = osImage.split('-'); var os = tmp[0]; var arch = tmp[1]; var provisionMethod = tmp[2]; var profile = tmp[3]; // If this is the last disk added if (disks2add < 1) { // Set operating system $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'nodeadd', tgt : '', args : node + ';noderes.netboot=zvm;nodetype.os=' + os + ';nodetype.arch=' + arch + ';nodetype.profile=' + profile, msg : 'cmd=noderes;out=' + out2Id }, success : updateProvisionNewStatus }); } } else { // Virtual server created (no OS) var loaderId = 'zProvisionLoader' + out2Id; $('#' + loaderId).hide(); } } } /** * (7) Update DHCP */ else if (cmd == 'noderes') { // If no output, no errors occurred if (rsp.length) { $('#' + statBarId).append( '(Error) Failed to set operating system
'); } else { $('#' + statBarId).append( 'Operating system for ' + node + ' set
'); } // Update DHCP $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'makedhcp', tgt : '', args : '-a', msg : 'cmd=makedhcp;out=' + out2Id }, success : updateProvisionNewStatus }); } /** * (8) Prepare node for boot */ else if (cmd == 'makedhcp') { var failed = false; // Separate output into lines var p = $(''); for ( var i = 0; i < rsp.length; i++) { if (rsp[i]) { // Find the node name and insert a break before it rsp[i] = rsp[i].replace(new RegExp(node + ': ', 'g'), '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(); } } /** * Update the provision existing node status * * @param data * Data returned from HTTP request * @return Nothing */ function updateProvisionExistingStatus(data) { // Get ajax response var rsp = data.rsp; var args = data.msg.split(';'); // Get command invoked var cmd = args[0].replace('cmd=', ''); // Get provision tab instance var inst = args[1].replace('out=', ''); // Get provision tab and status bar ID var statBarId = 'zProvisionStatBar' + inst; var tabId = 'zvmProvisionTab' + inst; /** * (2) Prepare node for boot */ if (cmd == 'chtab') { // Get operating system var bootMethod = $('#' + tabId + ' select[name=bootMethod]').val(); // Get nodes that were checked var dTableId = 'nodesDatatable' + inst; var tgts = getNodesChecked(dTableId); // Prepare node for boot $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'nodeset', tgt : tgts, args : bootMethod, msg : 'cmd=nodeset;out=' + inst }, success : updateProvisionExistingStatus }); } /** * (3) Boot node from network */ else if (cmd == 'nodeset') { // 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' + inst; $('#' + loaderId).remove(); } // Get nodes that were checked var dTableId = 'nodesDatatable' + inst; var tgts = getNodesChecked(dTableId); // Boot node from network $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'rnetboot', tgt : tgts, args : 'ipl=000C', msg : 'cmd=rnetboot;out=' + inst }, success : updateProvisionExistingStatus }); } /** * (4) Done */ else if (cmd == 'rnetboot') { // Write ajax response to status bar var prg = writeRsp(rsp); $('#' + statBarId).append(prg); var loaderId = 'zProvisionLoader' + inst; $('#' + loaderId).remove(); } } /** * Update zVM node status * * @param data * Data returned from HTTP request * @return Nothing */ function updateZNodeStatus(data) { var node = data.msg; var rsp = data.rsp; // Get cookie for number processes performed against this node var actions = $.cookie(node + 'Processes'); // One less process actions = actions - 1; $.cookie(node + 'Processes', actions); if (actions < 1) { // Hide loader when there are no more processes var statusBarLoaderId = node + 'StatusBarLoader'; $('#' + statusBarLoaderId).hide(); } var statBarId = node + 'StatusBar'; var failed = false; // Separate output into lines var p = $(''); for ( var i = 0; i < rsp.length; i++) { if (rsp[i]) { // Find the node name and insert a break before it rsp[i] = rsp[i].replace(new RegExp(node + ': ', 'g'), '(Error) Failed to create node definition
'); } else { $('#' + out2Id).append( 'Node definition created for ' + node + '
'); } // 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 }); } } /** * (3) Update DNS */ else if (cmd == 'makehosts') { // If no output, no errors occurred if (rsp.length) { $('#' + out2Id) .append('(Error) Failed to update /etc/hosts
'); } else { $('#' + out2Id).append('/etc/hosts updated
'); } // Update DNS $.ajax( { url : 'lib/cmd.php', dataType : 'json', data : { cmd : 'makedns', tgt : '', args : '', msg : 'cmd=makedns;inst=' + inst + ';out=' + out2Id }, success : updateCloneStatus }); } /** * (4) Clone */ else if (cmd == 'makedns') { // Separate output into lines var p = $(''); for ( var i = 0; i < rsp.length; i++) { if (rsp[i]) { p.append(rsp[i]); p.append('