diff --git a/xCAT-UI/css/style.css b/xCAT-UI/css/style.css index b29b34211..b7df50484 100644 --- a/xCAT-UI/css/style.css +++ b/xCAT-UI/css/style.css @@ -263,6 +263,7 @@ span.ui-icon-info { .statusBar p { font: 12px verdana, arial, helvetica, sans-serif; + max-width: 700px; } /****************** Info bar ******************/ diff --git a/xCAT-UI/js/nodes/nodes.js b/xCAT-UI/js/nodes/nodes.js index 0dae72d7f..396a8702e 100644 --- a/xCAT-UI/js/nodes/nodes.js +++ b/xCAT-UI/js/nodes/nodes.js @@ -60,6 +60,10 @@ function loadNodesPage() { $('#content').append(groupDIV); $('#content').append(nodesDIV); + // Create loader + var loader = createLoader(); + groupDIV.append(loader); + // Create info bar var info = createInfoBar('Select a group to view its nodes'); $('#nodes').append(info); @@ -88,6 +92,9 @@ function loadNodesPage() { * @return */ function loadGroups(data) { + // Remove loader + $('#groups').find('img').remove(); + var groups = data.rsp; setGroupsCookies(data); @@ -333,7 +340,7 @@ function loadNodes(data) { updateLnk.bind('click', function(event) { var tgtNodes = getNodesChecked(); if (tgtNodes) { - + loadUpdatenodePage(tgtNodes); } }); @@ -1043,7 +1050,7 @@ function loadNetbootPage(tgtNodes) { } // Open new tab - // Create nodeset form + // Create netboot form var netbootForm = $('
'); // Create status bar @@ -1082,11 +1089,11 @@ function loadNetbootPage(tgtNodes) { bootOrder.hide(); optsList.append(bootOrder); // Force reboot - optsList.append('
  • Force reboot
  • '); + optsList.append('
  • Force reboot
  • '); // Force shutdown - optsList.append('
  • Force immediate shutdown of the partition
  • '); + optsList.append('
  • Force immediate shutdown of the partition
  • '); // Iscsi dump - optsList.append('
  • Do a iscsi dump on AIX
  • '); + optsList.append('
  • Do a iscsi dump on AIX
  • '); // Show boot order when checkbox is checked bootOrderChkBox.bind('click', function(event) { @@ -1138,7 +1145,7 @@ function loadNetbootPage(tgtNodes) { // If it is the boot order if (opt == 's') { // Get the boot order - optStr += ' ' + $('#' + newTabId + ' input[name=bootOrder]').val(); + optStr += ';' + $('#' + newTabId + ' input[name=bootOrder]').val(); } // Append ; to end of string @@ -1197,6 +1204,263 @@ function loadNetbootPage(tgtNodes) { 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 * @@ -1603,11 +1867,12 @@ function updateStatusBar(data) { $('#' + statBarId).append(p); // Update data table + var rows = dTable.fnGetNodes(); for ( var i = 0; i < tgts.length; i++) { if (!failed) { // Get the row containing the node link and delete it - var row = $('#' + tgts[i]).parent().parent(); - var rowPos = dTable.fnGetPosition(row.get(0)); + var row = getNodeRow(tgts[i], rows); + var rowPos = dTable.fnGetPosition(row); dTable.fnDeleteRow(rowPos); } }