From 1593db7a2fad31e61313c1f4442e2e0ec14f952a Mon Sep 17 00:00:00 2001
From: phamt <phamt@8638fb3e-16cb-4fca-ae20-7b5d299a9bcd>
Date: Sat, 17 Jul 2010 13:09:04 +0000
Subject: [PATCH] Cleaned up code and added updatenode page

git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@6783 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
---
 xCAT-UI/css/style.css     |   1 +
 xCAT-UI/js/nodes/nodes.js | 281 ++++++++++++++++++++++++++++++++++++--
 2 files changed, 274 insertions(+), 8 deletions(-)

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 = $('<div class="form"></div>');
 
 	// Create status bar
@@ -1082,11 +1089,11 @@ function loadNetbootPage(tgtNodes) {
 	bootOrder.hide();
 	optsList.append(bootOrder);
 	// Force reboot
-	optsList.append('<li><input type="checkbox" id="F" name="F"/> Force reboot</li>');
+	optsList.append('<li><input type="checkbox" id="F" name="F"/>Force reboot</li>');
 	// Force shutdown
-	optsList.append('<li><input type="checkbox" id="f" name="f"/> Force immediate shutdown of the partition</li>');
+	optsList.append('<li><input type="checkbox" id="f" name="f"/>Force immediate shutdown of the partition</li>');
 	// Iscsi dump
-	optsList.append('<li><input type="checkbox" id="I" name="I"/> Do a iscsi dump on AIX</li>');
+	optsList.append('<li><input type="checkbox" id="I" name="I"/>Do a iscsi dump on AIX</li>');
 	
 	// 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 = $('<div class="form"></div>');
+
+	// 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 = $('<div><label for="target">Target node or group:</label><input type="text" name="target" value="' + tgtNodes + '"/></div>');
+	updatenodeForm.append(target);
+
+	// Create options
+	var optsDIV = $('<div></div>');
+	var optsLabel = $('<label>Options:</label>');	
+	var optsList = $('<ul></ul>');
+	optsDIV.append(optsLabel);
+	optsDIV.append(optsList);
+	updatenodeForm.append(optsDIV);
+		
+	// Update all software
+	var updateAllChkBox = $('<input type="checkbox" id="A" name="A"/>');
+	var updateAllOpt = $('<li></li>');
+	optsList.append(updateAllOpt);
+	updateAllOpt.append(updateAllChkBox);
+	updateAllOpt.append('Install or update all software contained in the source directory');
+		
+	var allSwScrDirectory = $('<li><label for="allSwSrcDirectory">Alternate source directory:</label><input type="text" name="allSwSrcDirectory"/></li>');
+	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 = $('<input type="checkbox" id="S" name="S"/>');
+	var updateOpt = $('<li></li>');
+	optsList.append(updateOpt);
+	updateOpt.append(updateChkBox);
+	updateOpt.append('Update software');
+		
+	var scrDirectory = $('<li><label for="srcDirectory">Alternate source directory:</label><input type="text" name="srcDirectory"/></li>');
+	scrDirectory.hide();
+	optsList.append(scrDirectory);
+	
+	var otherPkgs = $('<li><label for="otherpkgs">otherpkgs:</label><input type="text" name="otherpkgs"/></li>');
+	otherPkgs.hide();
+	optsList.append(otherPkgs);
+	
+	var rpmFlags = $('<li><label for="rpm_flags">rpm_flags:</label><input type="text" name="rpm_flags"/></li>');
+	rpmFlags.hide();
+	optsList.append(rpmFlags);
+	
+	var installPFlags = $('<li><label for="installp_flags">installp_flags:</label><input type="text" name="installp_flags"/></li>');
+	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 = $('<input type="checkbox" id="P" name="P"/>');
+	var postOpt = $('<li></li>');
+	optsList.append(postOpt);
+	postOpt.append(postChkBox);
+	postOpt.append('Run postscripts');
+	var postscripts = $('<li><label for="postscripts">Postscripts:</label><input type="text" name="postscripts"/></li>');
+	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('<li><input type="checkbox" id="F" name="F"/>Distribute and synchronize files</li>');
+	optsList.append('<li><input type="checkbox" id="k" name="k"/>Update the ssh keys and host keys for the service nodes and compute nodes</li>');
+	
+	// Update OS
+	var osChkBox = $('<input type="checkbox" id="o" name="o"/>');
+	var osOpt = $('<li></li>');
+	optsList.append(osOpt);
+	osOpt.append(osChkBox);
+	osOpt.append('Update the operating system');
+	var os = $('<li><label for="scripts">Operating system:</label><input type="text" name="os"/></li>');
+	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);
 			}
 		}