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);
}
}