').append(createLoader());
-
- // Add tab to configure xCAT tables
- tab.add('configTablesTab', 'Tables', loader, false);
-
- // Add the update tab
- tab.add('updateTab', 'Update', '', false);
-
- // Add the discover tab
- tab.add('discoverTab', 'Discover', '', false);
-
- // Add the self-service tab
- tab.add('serviceTab', 'Service', '', false);
-
- // Get list of tables and their descriptions
- $.ajax({
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'tabdump',
- tgt : '',
- args : '-d',
- msg : ''
- },
-
- success : loadTableNames
- });
-
- loadUpdatePage();
- loadDiscoverPage();
- loadServicePage();
-}
-
-/**
- * Load xCAT database table names and their descriptions
- *
- * @param data Data returned from HTTP request
- */
-function loadTableNames(data) {
- // Get output
- var tables = data.rsp;
-
- // Remove loader
- var tabId = 'configTablesTab';
- $('#' + tabId).find('img').hide();
-
- // Create a groups division
- var tablesDIV = $('');
- $('#' + tabId).append(tablesDIV);
-
- // Create info bar
- var infoBar = createInfoBar('Select a table to view or edit.');
- tablesDIV.append(infoBar);
-
- // Create a list for the tables
- var list = $('
');
- // Loop through each table
- for ( var i = 0; i < tables.length; i++) {
- // Create a link for each table
- var args = tables[i].split(':');
- var link = $('' + args[0] + '');
-
- // Open table on click
- link.bind('click', function(e) {
- // Get table ID that was clicked
- var id = (e.target) ? e.target.id : e.srcElement.id;
-
- // Create loader
- var loader = $('
').append(createLoader());
-
- // Add a new tab for this table
- var configTab = getConfigTab();
- if (!$('#' + id + 'Tab').length) {
- configTab.add(id + 'Tab', id, loader, true);
-
- // Get contents of selected table
- $.ajax({
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'tabdump',
- tgt : '',
- args : id,
- msg : id
- },
-
- success : loadTable
- });
- }
-
- // Select new tab
- configTab.select(id + 'Tab');
- });
-
- var item = $('');
- item.append(link);
-
- // Append the table description
- item.append(': ' + args[1]);
-
- // Append item to list
- list.append(item);
- }
-
- tablesDIV.append(list);
-}
-
-/**
- * Load a given database table
- *
- * @param data Data returned from HTTP request
- */
-function loadTable(data) {
- // Get response
- var rsp = data.rsp;
- // Get table ID
- var id = data.msg;
-
- // Remove loader
- var tabId = id + 'Tab';
- $('#' + tabId).find('img').remove();
-
- // Create info bar
- var infoBar = createInfoBar('Click on a cell to edit. Click outside the table to write to the cell. Once you are satisfied with how the table looks, click on Save.');
- $('#' + tabId).append(infoBar);
-
- // Create action bar
- var actionBar = $('');
- $('#' + tabId).append(actionBar);
-
- // Get table headers
- var args = rsp[0].replace('#', '');
- var headers = args.split(',');
-
- // Create container for original table contents
- var origCont = new Array(); // Original table content
- origCont[0] = rsp[0].split(','); // Headers
-
- // Create container for new table contents
- var newCont = new Object();
- var tmp = new Object();
- tmp[0] = '#' + headers[0]; // Put a # in front of the header
- for ( var i = 1; i < headers.length; i++) {
- tmp[i] = headers[i];
- }
- newCont[0] = tmp;
-
- // Create a new datatable
- var tableId = id + 'Datatable';
- var table = new DataTable(tableId);
-
- // Add column for the remove row button
- headers.unshift('');
- table.init(headers);
- headers.shift();
-
- // Append datatable to tab
- $('#' + tabId).append(table.object());
-
- // Add table rows
- // Start with the 2nd row (1st row is the headers)
- for ( var i = 1; i < rsp.length; i++) {
- // Split into columns
- var cols = rsp[i].split(',');
-
- // Go through each column
- for ( var j = 0; j < cols.length; j++) {
-
- // If the column is not complete
- if (cols[j].count('"') == 1) {
- while (cols[j].count('"') != 2) {
- // Merge this column with the adjacent one
- cols[j] = cols[j] + "," + cols[j + 1];
-
- // Remove merged row
- cols.splice(j + 1, 1);
- }
- }
-
- // Replace quote
- cols[j] = cols[j].replace(new RegExp('"', 'g'), '');
- }
-
- // Add remove button
- cols.unshift('');
-
- // Add row
- table.add(cols);
-
- // Save original table content
- origCont[i] = cols;
- }
-
- // Turn table into datatable
- var dTable = $('#' + id + 'Datatable').dataTable({
- 'iDisplayLength': 50,
- 'bLengthChange': false,
- "sScrollX": "100%",
- "bAutoWidth": true
- });
-
- /**
- * Enable editable columns
- */
- // Do not make 1st column editable
- $('#' + tableId + ' td:not(td:nth-child(1))').editable(
- function(value, settings) {
- // Get column index
- var colPos = this.cellIndex;
- // Get row index
- var rowPos = dTable.fnGetPosition(this.parentNode);
-
- // Update datatable
- dTable.fnUpdate(value, rowPos, colPos);
-
- return (value);
- }, {
- onblur : 'submit', // Clicking outside editable area submits changes
- type : 'textarea',
- placeholder: ' ',
- height : '30px' // The height of the text area
- });
-
- // Create action bar
- var actionBar = $('');
-
- var saveLnk = $('Save');
- saveLnk.click(function() {
- // Get table ID and name
- var tableId = $(this).parents('.dataTables_wrapper').attr('id').replace('_wrapper', '');
- var tableName = tableId.replace('Datatable', '');
-
- // Get datatable
- var dTable = $('#' + tableId).dataTable();
- // Get the nodes from the table
- var dRows = dTable.fnGetNodes();
-
- // Go through each row
- for ( var i = 0; i < dRows.length; i++) {
- // If there is row with values
- if (dRows[i]) {
- // Go through each column
- // Ignore the 1st column because it is a button
- var cols = dRows[i].childNodes;
- var vals = new Object();
- for ( var j = 1; j < cols.length; j++) {
- var val = cols.item(j).firstChild.nodeValue;
-
- // Insert quotes
- if (val == ' ') {
- vals[j - 1] = '';
- } else {
- vals[j - 1] = val;
- }
- }
-
- // Save row
- newCont[i + 1] = vals;
- }
- }
-
- // Update xCAT table
- $.ajax({
- type : 'POST',
- url : 'lib/tabRestore.php',
- dataType : 'json',
- data : {
- table : tableName,
- cont : newCont
- },
- success : function(data) {
- // Create info message
- var dialog = $('').append(createInfoBar('Changes saved!'));
-
- // Open dialog
- dialog.dialog({
- modal: true,
- title: 'Info',
- width: 400,
- buttons: {
- "Ok": function(){
- $(this).dialog("close");
- }
- }
- });
- }
- });
- });
-
- var undoLnk = $('Undo');
- undoLnk.click(function() {
- // Get table ID
- var tableId = $(this).parents('.dataTables_wrapper').attr('id').replace('_wrapper', '');
-
- // Get datatable
- var dTable = $('#' + tableId).dataTable();
-
- // Clear entire datatable
- dTable.fnClearTable();
-
- // Add original content back into datatable
- for ( var i = 1; i < origCont.length; i++) {
- dTable.fnAddData(origCont[i], true);
- }
-
- // Enable editable columns (again)
- // Do not make 1st column editable
- $('#' + tableId + ' td:not(td:nth-child(1))').editable(
- function(value, settings) {
- // Get column index
- var colPos = this.cellIndex;
- // Get row index
- var rowPos = dTable.fnGetPosition(this.parentNode);
-
- // Update datatable
- dTable.fnUpdate(value, rowPos, colPos);
-
- return (value);
- }, {
- onblur : 'submit', // Clicking outside editable area submits changes
- type : 'textarea',
- placeholder: ' ',
- height : '30px' // The height of the text area
- });
- });
-
- var addLnk = $('Add row');
- addLnk.click(function() {
- // Create an empty row
- var row = new Array();
-
- /**
- * Remove button
- */
- row.push('');
- for ( var i = 0; i < headers.length; i++) {
- row.push('');
- }
-
- // Get table ID and name
- var tableId = $(this).parents('.dataTables_wrapper').attr('id').replace('_wrapper', '');
-
- // Get datatable
- var dTable = $('#' + tableId).dataTable();
-
- // Add the row to the data table
- dTable.fnAddData(row);
-
- // Enable editable columns (again)
- // Do not make 1st column editable
- $('#' + tableId + ' td:not(td:nth-child(1))').editable(
- function(value, settings) {
- // Get column index
- var colPos = this.cellIndex;
- // Get row index
- var rowPos = dTable.fnGetPosition(this.parentNode);
-
- // Update datatable
- dTable.fnUpdate(value, rowPos, colPos);
-
- return (value);
- }, {
- onblur : 'submit', // Clicking outside editable area submits changes
- type : 'textarea',
- placeholder: ' ',
- height : '30px' // The height of the text area
- });
- });
-
- // Create an action menu
- var actionsMenu = createMenu([saveLnk, undoLnk, addLnk]);
- actionsMenu.superfish();
- actionsMenu.css('display', 'inline-block');
- actionBar.append(actionsMenu);
-
- // Set correct theme for action menu
- actionsMenu.find('li').hover(function() {
- setMenu2Theme($(this));
- }, function() {
- setMenu2Normal($(this));
- });
-
- // Create a division to hold actions menu
- var menuDiv = $('');
- $('#' + id + 'Datatable_wrapper').prepend(menuDiv);
- menuDiv.append(actionBar);
- $('#' + id + 'Datatable_filter').appendTo(menuDiv);
-}
-
-/**
- * Delete a row in the data table
- *
- * @param obj The object that was clicked
- */
-function deleteRow(obj) {
- // Get table ID
- var tableId = $(obj).parents('table').attr('id');
-
- // Get datatable
- var dTable = $('#' + tableId).dataTable();
-
- // Get all nodes within the datatable
- var rows = dTable.fnGetNodes();
- // Get target row
- var tgtRow = $(obj).parent().parent().get(0);
-
- // Find the target row in the datatable
- for ( var i in rows) {
- // If the row matches the target row
- if (rows[i] == tgtRow) {
- // Remove row
- dTable.fnDeleteRow(i, null, true);
- break;
- }
- }
-}
-
-/**
- * Count the number of occurrences of a specific character in a string
- *
- * @param c Character to count
- * @return The number of occurrences
- */
-String.prototype.count = function(c) {
- return (this.length - this.replace(new RegExp(c, 'g'), '').length)/c.length;
-};
\ No newline at end of file
+/**
+ * Global variables
+ */
+var configTabs; // Config tabs
+var configDatatables = new Object(); // Datatables on the config page
+
+/**
+ * Set the datatable
+ *
+ * @param id The ID of the datatable
+ * @param obj Datatable object
+ */
+function setConfigDatatable(id, obj) {
+ configDatatables[id] = obj;
+}
+
+/**
+ * Get the datatable with the given ID
+ *
+ * @param id The ID of the datatable
+ * @return Datatable object
+ */
+function getConfigDatatable(id) {
+ return configDatatables[id];
+}
+
+/**
+ * Set the configure tab
+ *
+ * @param obj Tab object
+ */
+function setConfigTab(obj) {
+ configTabs = obj;
+}
+
+/**
+ * Get the configure tab
+ *
+ * @param Nothing
+ * @return Tab object
+ */
+function getConfigTab() {
+ return configTabs;
+}
+
+/**
+ * Load configure page
+ */
+function loadConfigPage() {
+ // If the configure page has already been loaded
+ if ($('#content').children().length) {
+ // Do not reload configure page
+ return;
+ }
+
+ // Create configure tab
+ var tab = new Tab();
+ setConfigTab(tab);
+ tab.init();
+ $('#content').append(tab.object());
+
+ // Create loader
+ var loader = $('
').append(createLoader());
+
+ // Add tab to configure xCAT tables
+ tab.add('configTablesTab', 'Tables', loader, false);
+
+ // Add the update tab
+ tab.add('updateTab', 'Update', '', false);
+
+ // Add the self-service tab
+ tab.add('usersTab', 'Users', '', false);
+
+ // Add the discover tab
+ tab.add('discoverTab', 'Discover', '', false);
+
+ // Add the self-service tab
+ tab.add('serviceTab', 'Service', '', false);
+
+ // Get list of tables and their descriptions
+ $.ajax({
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'tabdump',
+ tgt : '',
+ args : '-d',
+ msg : ''
+ },
+
+ success : loadTableNames
+ });
+
+ // Do not load everything at once
+ // Load when tab is shown
+ tab.object().bind('tabsshow', function(event, ui) {
+ if ($(ui.panel).children().length) {
+ return;
+ }
+
+ if (ui.index == 1) {
+ loadUpdatePage();
+ } else if (ui.index == 2) {
+ loadUserPage();
+ } else if (ui.index == 3) {
+ loadDiscoverPage();
+ } else if (ui.index == 4) {
+ loadServicePage();
+ }
+ });
+}
+
+/**
+ * Load xCAT database table names and their descriptions
+ *
+ * @param data Data returned from HTTP request
+ */
+function loadTableNames(data) {
+ // Get output
+ var tables = data.rsp;
+
+ // Remove loader
+ var tabId = 'configTablesTab';
+ $('#' + tabId).find('img').hide();
+
+ // Create a groups division
+ var tablesDIV = $('');
+ $('#' + tabId).append(tablesDIV);
+
+ // Create info bar
+ var infoBar = createInfoBar('Select a table to view or edit.');
+ tablesDIV.append(infoBar);
+
+ // Create a list for the tables
+ var list = $('
');
+ // Loop through each table
+ for ( var i = 0; i < tables.length; i++) {
+ // Create a link for each table
+ var args = tables[i].split(':');
+ var link = $('' + args[0] + '');
+
+ // Open table on click
+ link.bind('click', function(e) {
+ // Get table ID that was clicked
+ var id = (e.target) ? e.target.id : e.srcElement.id;
+
+ // Create loader
+ var loader = $('
').append(createLoader());
+
+ // Add a new tab for this table
+ var configTab = getConfigTab();
+ if (!$('#' + id + 'Tab').length) {
+ configTab.add(id + 'Tab', id, loader, true);
+
+ // Get contents of selected table
+ $.ajax({
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'tabdump',
+ tgt : '',
+ args : id,
+ msg : id
+ },
+
+ success : loadTable
+ });
+ }
+
+ // Select new tab
+ configTab.select(id + 'Tab');
+ });
+
+ var item = $('');
+ item.append(link);
+
+ // Append the table description
+ item.append(': ' + args[1]);
+
+ // Append item to list
+ list.append(item);
+ }
+
+ tablesDIV.append(list);
+}
+
+/**
+ * Load a given database table
+ *
+ * @param data Data returned from HTTP request
+ */
+function loadTable(data) {
+ // Get response
+ var rsp = data.rsp;
+ // Get table ID
+ var id = data.msg;
+
+ // Remove loader
+ var tabId = id + 'Tab';
+ $('#' + tabId).find('img').remove();
+
+ // Create info bar
+ var infoBar = createInfoBar('Click on a cell to edit. Click outside the table to write to the cell. Once you are satisfied with how the table looks, click on Save.');
+ $('#' + tabId).append(infoBar);
+
+ // Create action bar
+ var actionBar = $('');
+ $('#' + tabId).append(actionBar);
+
+ // Get table headers
+ var args = rsp[0].replace('#', '');
+ var headers = args.split(',');
+
+ // Create container for original table contents
+ var origCont = new Array(); // Original table content
+ origCont[0] = rsp[0].split(','); // Headers
+
+ // Create container for new table contents
+ var newCont = new Object();
+ var tmp = new Object();
+ tmp[0] = '#' + headers[0]; // Put a # in front of the header
+ for ( var i = 1; i < headers.length; i++) {
+ tmp[i] = headers[i];
+ }
+ newCont[0] = tmp;
+
+ // Create a new datatable
+ var tableId = id + 'Datatable';
+ var table = new DataTable(tableId);
+
+ // Add column for the remove row button
+ headers.unshift('');
+ table.init(headers);
+ headers.shift();
+
+ // Append datatable to tab
+ $('#' + tabId).append(table.object());
+
+ // Add table rows
+ // Start with the 2nd row (1st row is the headers)
+ for ( var i = 1; i < rsp.length; i++) {
+ // Split into columns
+ var cols = rsp[i].split(',');
+
+ // Go through each column
+ for ( var j = 0; j < cols.length; j++) {
+
+ // If the column is not complete
+ if (cols[j].count('"') == 1) {
+ while (cols[j].count('"') != 2) {
+ // Merge this column with the adjacent one
+ cols[j] = cols[j] + "," + cols[j + 1];
+
+ // Remove merged row
+ cols.splice(j + 1, 1);
+ }
+ }
+
+ // Replace quote
+ cols[j] = cols[j].replace(new RegExp('"', 'g'), '');
+ }
+
+ // Add remove button
+ cols.unshift('');
+
+ // Add row
+ table.add(cols);
+
+ // Save original table content
+ origCont[i] = cols;
+ }
+
+ // Turn table into datatable
+ var dTable = $('#' + id + 'Datatable').dataTable({
+ 'iDisplayLength': 50,
+ 'bLengthChange': false,
+ "bScrollCollapse": true,
+ "sScrollY": "400px",
+ "sScrollX": "110%",
+ "bAutoWidth": true,
+ "oLanguage": {
+ "oPaginate": {
+ "sNext": "",
+ "sPrevious": ""
+ }
+ }
+ });
+
+ /**
+ * Enable editable columns
+ */
+ // Do not make 1st column editable
+ $('#' + tableId + ' td:not(td:nth-child(1))').editable(
+ function(value, settings) {
+ // Get column index
+ var colPos = this.cellIndex;
+ // Get row index
+ var rowPos = dTable.fnGetPosition(this.parentNode);
+
+ // Update datatable
+ dTable.fnUpdate(value, rowPos, colPos);
+
+ return (value);
+ }, {
+ onblur : 'submit', // Clicking outside editable area submits changes
+ type : 'textarea',
+ placeholder: ' ',
+ height : '30px' // The height of the text area
+ });
+
+ // Create action bar
+ var actionBar = $('');
+
+ var saveLnk = $('Save');
+ saveLnk.click(function() {
+ // Get table ID and name
+ var tableId = $(this).parents('.dataTables_wrapper').attr('id').replace('_wrapper', '');
+ var tableName = tableId.replace('Datatable', '');
+
+ // Get datatable
+ var dTable = $('#' + tableId).dataTable();
+ // Get the nodes from the table
+ var dRows = dTable.fnGetNodes();
+
+ // Go through each row
+ for ( var i = 0; i < dRows.length; i++) {
+ // If there is row with values
+ if (dRows[i]) {
+ // Go through each column
+ // Ignore the 1st column because it is a button
+ var cols = dRows[i].childNodes;
+ var vals = new Object();
+ for ( var j = 1; j < cols.length; j++) {
+ var val = cols.item(j).firstChild.nodeValue;
+
+ // Insert quotes
+ if (val == ' ') {
+ vals[j - 1] = '';
+ } else {
+ vals[j - 1] = val;
+ }
+ }
+
+ // Save row
+ newCont[i + 1] = vals;
+ }
+ }
+
+ // Update xCAT table
+ $.ajax({
+ type : 'POST',
+ url : 'lib/tabRestore.php',
+ dataType : 'json',
+ data : {
+ table : tableName,
+ cont : newCont
+ },
+ success : function(data) {
+ // Create info message
+ var dialog = $('').append(createInfoBar('Changes saved!'));
+
+ // Open dialog
+ dialog.dialog({
+ modal: true,
+ title: 'Info',
+ width: 400,
+ buttons: {
+ "Ok": function(){
+ $(this).dialog("close");
+ }
+ }
+ });
+ }
+ });
+ });
+
+ var undoLnk = $('Undo');
+ undoLnk.click(function() {
+ // Get table ID
+ var tableId = $(this).parents('.dataTables_wrapper').attr('id').replace('_wrapper', '');
+
+ // Get datatable
+ var dTable = $('#' + tableId).dataTable();
+
+ // Clear entire datatable
+ dTable.fnClearTable();
+
+ // Add original content back into datatable
+ for ( var i = 1; i < origCont.length; i++) {
+ dTable.fnAddData(origCont[i], true);
+ }
+
+ // Enable editable columns (again)
+ // Do not make 1st column editable
+ $('#' + tableId + ' td:not(td:nth-child(1))').editable(
+ function(value, settings) {
+ // Get column index
+ var colPos = this.cellIndex;
+ // Get row index
+ var rowPos = dTable.fnGetPosition(this.parentNode);
+
+ // Update datatable
+ dTable.fnUpdate(value, rowPos, colPos);
+
+ return (value);
+ }, {
+ onblur : 'submit', // Clicking outside editable area submits changes
+ type : 'textarea',
+ placeholder: ' ',
+ height : '30px' // The height of the text area
+ });
+ });
+
+ var addLnk = $('Add row');
+ addLnk.click(function() {
+ // Create an empty row
+ var row = new Array();
+
+ /**
+ * Remove button
+ */
+ row.push('');
+ for ( var i = 0; i < headers.length; i++) {
+ row.push('');
+ }
+
+ // Get table ID and name
+ var tableId = $(this).parents('.dataTables_wrapper').attr('id').replace('_wrapper', '');
+
+ // Get datatable
+ var dTable = $('#' + tableId).dataTable();
+
+ // Add the row to the data table
+ dTable.fnAddData(row);
+
+ // Enable editable columns (again)
+ // Do not make 1st column editable
+ $('#' + tableId + ' td:not(td:nth-child(1))').editable(
+ function(value, settings) {
+ // Get column index
+ var colPos = this.cellIndex;
+ // Get row index
+ var rowPos = dTable.fnGetPosition(this.parentNode);
+
+ // Update datatable
+ dTable.fnUpdate(value, rowPos, colPos);
+
+ return (value);
+ }, {
+ onblur : 'submit', // Clicking outside editable area submits changes
+ type : 'textarea',
+ placeholder: ' ',
+ height : '30px' // The height of the text area
+ });
+ });
+
+ // Create an action menu
+ var actionsMenu = createMenu([saveLnk, undoLnk, addLnk]);
+ actionsMenu.superfish();
+ actionsMenu.css('display', 'inline-block');
+ actionBar.append(actionsMenu);
+
+ // Set correct theme for action menu
+ actionsMenu.find('li').hover(function() {
+ setMenu2Theme($(this));
+ }, function() {
+ setMenu2Normal($(this));
+ });
+
+ // Create a division to hold actions menu
+ var menuDiv = $('');
+ $('#' + id + 'Datatable_wrapper').prepend(menuDiv);
+ menuDiv.append(actionBar);
+ $('#' + id + 'Datatable_filter').appendTo(menuDiv);
+}
+
+/**
+ * Delete a row in the data table
+ *
+ * @param obj The object that was clicked
+ */
+function deleteRow(obj) {
+ // Get table ID
+ var tableId = $(obj).parents('table').attr('id');
+
+ // Get datatable
+ var dTable = $('#' + tableId).dataTable();
+
+ // Get all nodes within the datatable
+ var rows = dTable.fnGetNodes();
+ // Get target row
+ var tgtRow = $(obj).parent().parent().get(0);
+
+ // Find the target row in the datatable
+ for ( var i in rows) {
+ // If the row matches the target row
+ if (rows[i] == tgtRow) {
+ // Remove row
+ dTable.fnDeleteRow(i, null, true);
+ break;
+ }
+ }
+}
+
+/**
+ * Count the number of occurrences of a specific character in a string
+ *
+ * @param c Character to count
+ * @return The number of occurrences
+ */
+String.prototype.count = function(c) {
+ return (this.length - this.replace(new RegExp(c, 'g'), '').length)/c.length;
+};
+
+/**
+ * Update dialog
+ *
+ * @param data HTTP request data
+ */
+function updatePanel(data) {
+ var dialogId = data.msg;
+ var infoMsg;
+
+ // Create info message
+ if (jQuery.isArray(data.rsp)) {
+ infoMsg = '';
+ for (var i in data.rsp) {
+ infoMsg += data.rsp[i] + '';
+ }
+ } else {
+ infoMsg = data.rsp;
+ }
+
+ // Create info bar with close button
+ var infoBar = $('').css('margin', '5px 0px');
+ var icon = $('').css({
+ 'display': 'inline-block',
+ 'margin': '10px 5px'
+ });
+
+ // Create close button to close info bar
+ var close = $('').css({
+ 'display': 'inline-block',
+ 'float': 'right'
+ }).click(function() {
+ $(this).parent().remove();
+ });
+
+ var msg = $('
' + infoMsg + '
').css({
+ 'display': 'inline-block',
+ 'width': '85%'
+ });
+
+ infoBar.append(icon, msg, close);
+ infoBar.prependTo($('#' + dialogId));
+}
\ No newline at end of file
diff --git a/xCAT-UI/js/configure/discover.js b/xCAT-UI/js/configure/discover.js
index a99b9ad09..719c8be2e 100644
--- a/xCAT-UI/js/configure/discover.js
+++ b/xCAT-UI/js/configure/discover.js
@@ -324,10 +324,10 @@ function initSelectPlatform() {
selectPlatform.append(info);
var hwList = $('Platforms available:');
- hwList.append('');
- hwList.append('
BladeCenter
');
- hwList.append('
System p hardware (P7 IH)
');
- hwList.append('
System p hardware (Non P7 IH)
');
+ hwList.append('
iDataPlex
');
+ hwList.append('
BladeCenter
');
+ hwList.append('
System p hardware (P7 IH)
');
+ hwList.append('
System p hardware (Non P7 IH)
');
hwList.find('li').css('padding', '2px 10px');
selectPlatform.append(hwList);
diff --git a/xCAT-UI/js/configure/service.js b/xCAT-UI/js/configure/service.js
index 116932cca..c1e8b2ab9 100644
--- a/xCAT-UI/js/configure/service.js
+++ b/xCAT-UI/js/configure/service.js
@@ -19,9 +19,9 @@ function loadServicePage(tabId) {
// Create radio buttons for platforms
var hwList = $('Platforms available:');
- var esx = $('
ESX
');
- var kvm = $('
KVM
');
- var zvm = $('
z\/VM
');
+ var esx = $('
ESX
');
+ var kvm = $('
KVM
');
+ var zvm = $('
z\/VM
');
hwList.append(esx);
hwList.append(kvm);
@@ -90,433 +90,6 @@ function loadServicePage(tabId) {
servicePg.append(okBtn);
}
-/**
- * Load the user panel where users can be created, modified, or deleted
- *
- * @param panelId Panel ID
- */
-function loadUserPanel(panelId) {
- // Get users list
- $.ajax({
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'tabdump',
- tgt : '',
- args : 'passwd',
- msg : panelId
- },
-
- success : loadUserTable
- });
-}
-
-/**
- * Load user datatable
- *
- * @param data HTTP request data
- */
-function loadUserTable(data) {
- // Get response
- var rsp = data.rsp;
- // Get panel ID
- var panelId = data.msg;
-
- // Wipe panel clean
- $('#' + panelId).empty();
-
- // Add info bar
- $('#' + panelId).append(createInfoBar('Create, edit, and delete users for the self-service portal. Double-click on a cell to edit a users properties. Click outside the table to save changes. Hit the Escape key to ignore changes.'));
-
- // Get table headers
- // The table headers in the passwd table are: key, username, password, cryptmethod, comments, and disable
- var headers = new Array('priority', 'username', 'password', 'max-vm');
-
- // Create a new datatable
- var tableId = panelId + 'Datatable';
- var table = new DataTable(tableId);
-
- // Add column for the checkbox
- headers.unshift('');
- table.init(headers);
- headers.shift();
-
- // Append datatable to panel
- $('#' + panelId).append(table.object());
-
- // Add table rows
- // Start with the 2nd row (1st row is the headers)
- for ( var i = 1; i < rsp.length; i++) {
- // Split into columns
- var tmp = rsp[i].split(',');
-
- // Go through each column
- for (var j = 0; j < tmp.length; j++) {
- // Replace quote
- tmp[j] = tmp[j].replace(new RegExp('"', 'g'), '');
- }
-
- // Only add users having the key = xcat
- if (tmp[0] == 'xcat') {
- // Columns are: priority, username, password, and max-vm
- var cols = new Array('', tmp[1], tmp[2], '');
-
- // Add remove button where id = user name
- cols.unshift('');
-
- // Add row
- table.add(cols);
- }
- }
-
- // Turn table into datatable
- $('#' + tableId).dataTable({
- 'iDisplayLength': 50,
- 'bLengthChange': false,
- "sScrollX": "100%",
- "bAutoWidth": true
- });
-
- // Create action bar
- var actionBar = $('').css("width", "400px");
-
- var createLnk = $('Create');
- createLnk.click(function() {
- openCreateUserDialog();
- });
-
- var deleteLnk = $('Delete');
- deleteLnk.click(function() {
- var users = getNodesChecked(tableId);
- if (users) {
- openDeleteUserDialog(users);
- }
- });
-
- var refreshLnk = $('Refresh');
- refreshLnk.click(function() {
- loadUserPanel(panelId);
- });
-
- // Create an action menu
- var actionsMenu = createMenu([createLnk, deleteLnk, refreshLnk]);
- actionsMenu.superfish();
- actionsMenu.css('display', 'inline-block');
- actionBar.append(actionsMenu);
-
- // Set correct theme for action menu
- actionsMenu.find('li').hover(function() {
- setMenu2Theme($(this));
- }, function() {
- setMenu2Normal($(this));
- });
-
- // Create a division to hold actions menu
- var menuDiv = $('');
- $('#' + tableId + '_wrapper').prepend(menuDiv);
- menuDiv.append(actionBar);
- $('#' + tableId + '_filter').appendTo(menuDiv);
-
- // Get policy data
- $.ajax({
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'tabdump',
- tgt : '',
- args : 'policy',
- msg : tableId
- },
-
- success : loadUserTable4Policy
- });
-
- /**
- * Enable editable cells
- */
- // Do not make 1st or 2nd column editable
- $('#' + tableId + ' td:not(td:nth-child(1),td:nth-child(2))').editable(
- function(value, settings) {
- // If users did not make changes, return the value directly
- // jeditable saves the old value in this.revert
- if ($(this).attr('revert') == value){
- return value;
- }
-
- var panelId = $(this).parents('.ui-accordion-content').attr('id');
-
- // Get column index
- var colPos = this.cellIndex;
-
- // Get row index
- var dTable = $('#' + tableId).dataTable();
- var rowPos = dTable.fnGetPosition(this.parentNode);
-
- // Update datatable
- dTable.fnUpdate(value, rowPos, colPos, false);
-
- // Get table headers
- var headers = $('#' + nodesTableId).parents('.dataTables_scroll').find('.dataTables_scrollHead thead tr:eq(0) th');
-
- // Get user attributes
- var priority = $(this).parent().find('td:eq(1)').text();
- var user = $(this).parent().find('td:eq(2)').text();
- var password = $(this).parent().find('td:eq(3)').text();
- var maxVM = $(this).parent().find('td:eq(4)').text();
-
- // Send command to change user attributes
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'webrun',
- tgt : '',
- args : 'updateuser;' + priority + ';' + user + ';' + password + ';' + maxVM,
- msg : panelId
- },
- success : updatePanel
- });
-
- return value;
- }, {
- onblur : 'submit', // Clicking outside editable area submits changes
- type : 'textarea',
- placeholder: ' ',
- event : "dblclick", // Double click and edit
- height : '30px' // The height of the text area
- });
-
- // Resize accordion
- $('#' + tableId).parents('.ui-accordion').accordion('resize');
-}
-
-/**
- * Update user datatable for policy
- *
- * @param data HTTP request data
- */
-function loadUserTable4Policy(data) {
- // Get response
- var rsp = data.rsp;
- // Get datatable ID
- var tableId = data.msg;
-
- // Get datatable
- var datatable = $('#' + tableId).dataTable();
-
- // Update max-vm column
- // The data coming back contains: priority, name, host, commands, noderange, parameters, time, rule, comments, disable
-
- // Start with the 2nd row (1st row is the headers)
- topPriority = 0;
- for (var i = 1; i < rsp.length; i++) {
- // Split into columns
- var tmp = rsp[i].split(',');
-
- // Go through each column
- for (var j = 0; j < tmp.length; j++) {
- // Replace quote
- tmp[j] = tmp[j].replace(new RegExp('"', 'g'), '');
- }
-
- // Get the row containing the user name
- var rowPos = -1;
- if (tmp[1])
- rowPos = findRow(tmp[1], '#' + tableId, 2);
-
- // Update the priority and max-vm columns
- if (rowPos > -1) {
- var maxVM = 0;
- var comments = tmp[8].split(';');
- for (var k in comments) {
- if (comments[k].indexOf('max-vm:') > -1)
- maxVM = comments[k].replace('max-vm:', '');
- }
-
- datatable.fnUpdate(maxVM, rowPos, 4, false);
-
- var priority = tmp[0];
- datatable.fnUpdate(priority, rowPos, 1, false);
-
- // Set the highest priority
- if (priority > topPriority)
- topPriority = priority;
- }
- }
-
- // Adjust column sizes
- adjustColumnSize(tableId);
-
- // Resize accordion
- $('#' + tableId).parents('.ui-accordion').accordion('resize');
-}
-
-/**
- * Open a dialog to create a user
- */
-function openCreateUserDialog() {
- var dialogId = 'createUser';
- var dialog = $('');
- var info = createInfoBar('Create an xCAT user. A priority will be generated for the new user.');
- dialog.append(info);
-
- // Generate the user priority
- var userPriority = parseFloat(topPriority) + 0.01;
- userPriority = userPriority.toPrecision(3);
-
- // Create node inputs
- dialog.append($(''));
- dialog.append($(''));
- dialog.append($(''));
- dialog.append($(''));
-
- dialog.dialog({
- title: 'Create user',
- modal: true,
- width: 400,
- close: function(){
- $(this).remove();
- },
- buttons: {
- "OK" : function(){
- // Remove any warning messages
- $(this).find('.ui-state-error').remove();
-
- // Change dialog buttons
- $('#' + dialogId).dialog('option', 'buttons', {
- 'Close':function(){
- $(this).dialog('close');
- }
- });
-
- var priority = $(this).find('input[name="priority"]').val();
- var user = $(this).find('input[name="username"]').val();
- var password = $(this).find('input[name="password"]').val();
- var maxVM = $(this).find('input[name="maxvm"]').val();
-
- // Verify inputs are provided
- if (!user || !password || !maxVM) {
- var warn = createWarnBar('Please provide a value for each missing field!');
- warn.prependTo($(this));
- } else {
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'webrun',
- tgt : '',
- args : 'updateuser;' + priority + ';' + user + ';' + password + ';' + maxVM,
- msg : dialogId
- },
- success : updatePanel
- });
-
- // Update highest priority
- topPriority = priority;
- }
- },
- "Cancel": function(){
- $(this).dialog('close');
- }
- }
- });
-}
-
-/**
- * Update dialog
- *
- * @param data HTTP request data
- */
-function updatePanel(data) {
- var dialogId = data.msg;
- var infoMsg;
-
- // Create info message
- if (jQuery.isArray(data.rsp)) {
- infoMsg = '';
- for (var i in data.rsp) {
- infoMsg += data.rsp[i] + '';
- }
- } else {
- infoMsg = data.rsp;
- }
-
- // Create info bar with close button
- var infoBar = $('').css('margin', '5px 0px');
- var icon = $('').css({
- 'display': 'inline-block',
- 'margin': '10px 5px'
- });
-
- // Create close button to close info bar
- var close = $('').css({
- 'display': 'inline-block',
- 'float': 'right'
- }).click(function() {
- $(this).parent().remove();
- });
-
- var msg = $('
' + infoMsg + '
').css({
- 'display': 'inline-block',
- 'width': '85%'
- });
-
- infoBar.append(icon, msg, close);
- infoBar.prependTo($('#' + dialogId));
-}
-
-/**
- * Open dialog to confirm user delete
- *
- * @param users Users to delete
- */
-function openDeleteUserDialog(users) {
- // Create form to delete disk to pool
- var dialogId = 'deleteUser';
- var deleteForm = $('');
-
- // Create info bar
- var info = createInfoBar('Are you sure you want to delete ' + users.replace(new RegExp(',', 'g'), ', ') + '?');
- deleteForm.append(info);
-
- // Open dialog to delete user
- deleteForm.dialog({
- title:'Delete user',
- modal: true,
- width: 400,
- close: function(){
- $(this).remove();
- },
- buttons: {
- "Ok": function(){
- // Remove any warning messages
- $(this).find('.ui-state-error').remove();
-
- // Change dialog buttons
- $(this).dialog('option', 'buttons', {
- 'Close': function() {$(this).dialog("close");}
- });
-
- // Delete user
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'webrun',
- tgt : '',
- args : 'deleteuser;' + users,
- msg : dialogId
- },
- success : updatePanel
- });
- },
- "Cancel": function() {
- $(this).dialog( "close" );
- }
- }
- });
-}
-
/**
* Round a floating point to a given precision
*
@@ -680,10 +253,18 @@ function configImagePanel(data) {
// Turn into datatable
$('#' + tableId).dataTable({
- 'iDisplayLength': 50,
+ 'iDisplayLength': 50,
'bLengthChange': false,
- "sScrollX": "100%",
- "bAutoWidth": true
+ "bScrollCollapse": true,
+ "sScrollY": "400px",
+ "sScrollX": "110%",
+ "bAutoWidth": true,
+ "oLanguage": {
+ "oPaginate": {
+ "sNext": "",
+ "sPrevious": ""
+ }
+ }
});
// Create action bar
@@ -1186,10 +767,18 @@ function configGroupPanel(data) {
// Turn into datatable
$('#' + tableId).dataTable({
- 'iDisplayLength': 50,
+ 'iDisplayLength': 50,
'bLengthChange': false,
- "sScrollX": "100%",
- "bAutoWidth": true
+ "bScrollCollapse": true,
+ "sScrollY": "400px",
+ "sScrollX": "110%",
+ "bAutoWidth": true,
+ "oLanguage": {
+ "oPaginate": {
+ "sNext": "",
+ "sPrevious": ""
+ }
+ }
});
// Create action bar
diff --git a/xCAT-UI/js/configure/update.js b/xCAT-UI/js/configure/update.js
index c8e41db07..1422f1023 100644
--- a/xCAT-UI/js/configure/update.js
+++ b/xCAT-UI/js/configure/update.js
@@ -8,7 +8,6 @@ function loadUpdatePage() {
statusDiv.hide();
$('#updateTab').append(statusDiv);
- $('#updateTab').append(' ');
$('#updateTab').append(repositoryDiv);
$('#updateTab').append(rpmDiv);
diff --git a/xCAT-UI/js/configure/users.js b/xCAT-UI/js/configure/users.js
new file mode 100644
index 000000000..3781df970
--- /dev/null
+++ b/xCAT-UI/js/configure/users.js
@@ -0,0 +1,469 @@
+/**
+ * Global variables
+ */
+var userDatatable;
+var topPriority = 0;
+var tableId = 'usersTable';
+
+/**
+ * Get user access table
+ *
+ * @returns User access table
+ */
+function getUsersTable(){
+ return userDatatable;
+}
+
+/**
+ * Set user access table
+ *
+ * @param table User access table
+ */
+function setUsersTable(table){
+ userDatatable = table;
+}
+
+/**
+ * Load the user page
+ */
+function loadUserPage() {
+ // Retrieve users from policy table
+ $.ajax({
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'tabdump',
+ tgt : '',
+ args : 'policy',
+ msg : ''
+ },
+
+ success : loadUserTable
+ });
+}
+
+/**
+ * Load user table
+ *
+ * @param data Data returned from HTTP request
+ */
+function loadUserTable(data){
+ var tabId = 'usersTab';
+
+ $('#' + tabId).empty();
+
+ // Set padding for page
+ $('#' + tabId).css('padding', '20px 60px');
+
+ // Create info bar
+ var info = $('#' + tabId).find('.ui-state-highlight');
+ // If there is no info bar
+ if (!info.length) {
+ var infoBar = createInfoBar('Configure access given to users.');
+
+ // Create users page
+ var userPg = $('');
+ $('#' + tabId).append(infoBar, userPg);
+ }
+
+ if (data.rsp) {
+ // Create a datatable if one does not exist
+ var table = new DataTable(tableId);
+ var headers = new Array('Priority', 'Name', 'Host', 'Commands', 'Noderange', 'Parameters', 'Time', 'Rule', 'Comments', 'Disable');
+
+ // Add column for the checkbox
+ headers.unshift('');
+ table.init(headers);
+ headers.shift();
+
+ // Append datatable to panel
+ $('#' + tabId).append(table.object());
+
+ topPriority = 0;
+
+ // Add table rows
+ // Start with the 2nd row (1st row is the headers)
+ for (var i = 1; i < data.rsp.length; i++) {
+ // Trim returned data
+ data.rsp[i] = jQuery.trim(data.rsp[i]);
+ // Split data into columns
+ var cols = data.rsp[i].split(',');
+
+ // Go through each column
+ // Column names are: priority, name, host, commands, noderange, parameters, time, rule, comments, disable
+ for (var j = 0; j < cols.length; j++) {
+ // Replace quote
+ cols[j] = cols[j].replace(/"/g, '');
+ }
+
+ // Set the highest priority
+ priority = cols[0];
+ if (priority > topPriority)
+ topPriority = priority;
+
+ // Add check box where name = user name
+ cols.unshift('');
+
+ // Add row
+ table.add(cols);
+ }
+
+ // Turn table into datatable
+ var dTable = $('#' + tableId).dataTable({
+ 'iDisplayLength': 50,
+ 'bLengthChange': false,
+ "bScrollCollapse": true,
+ "sScrollY": "400px",
+ "sScrollX": "100%",
+ "bAutoWidth": true,
+ "oLanguage": {
+ "oPaginate": {
+ "sNext": "",
+ "sPrevious": ""
+ }
+ }
+ });
+ setUsersTable(dTable); // Cache user access table
+ }
+
+ // Create action bar
+ var actionBar = $('').css("width", "450px");
+
+ var createLnk = $('Create');
+ createLnk.click(function() {
+ openCreateUserDialog("");
+ });
+
+ var editLnk = $('Edit');
+ editLnk.click(function() {
+ // Should only allow 1 user to be edited at a time
+ var users = getNodesChecked(tableId).split(',')
+ for (var i in users) {
+ openCreateUserDialog(users[i]);
+ }
+ });
+
+ var deleteLnk = $('Delete');
+ deleteLnk.click(function() {
+ // Find the user name from datatable
+ var usersList = "";
+ var users = $('#' + tableId + ' input[type=checkbox]:checked');
+ for (var i in users) {
+ var user = users.eq(i).parents('tr').find('td:eq(2)').text();
+ if (user && user != "undefined") {
+ usersList += user;
+ if (i < users.length - 1) {
+ usersList += ',';
+ }
+ }
+ }
+
+ if (usersList) {
+ openDeleteUserDialog(usersList);
+ }
+ });
+
+ var refreshLnk = $('Refresh');
+ refreshLnk.click(function() {
+ loadUserPage();
+ });
+
+ // Create an action menu
+ var actionsMenu = createMenu([createLnk, editLnk, deleteLnk, refreshLnk]);
+ actionsMenu.superfish();
+ actionsMenu.css('display', 'inline-block');
+ actionBar.append(actionsMenu);
+
+ // Set correct theme for action menu
+ actionsMenu.find('li').hover(function() {
+ setMenu2Theme($(this));
+ }, function() {
+ setMenu2Normal($(this));
+ });
+
+ // Create a division to hold actions menu
+ var menuDiv = $('');
+ $('#' + tableId + '_wrapper').prepend(menuDiv);
+ menuDiv.append(actionBar);
+ $('#' + tableId + '_filter').appendTo(menuDiv);
+}
+
+/**
+ * Open create user dialog
+ *
+ * @param data User data (only during edit)
+ */
+function openCreateUserDialog(data) {
+ var dialogId = 'createUser';
+
+ // Generate the user priority
+ var priority = parseFloat(topPriority) + 0.01;
+ priority = priority.toPrecision(3);
+
+ // Create form to create user
+ var createUserForm = $('');
+
+ // Create info bar
+ var info = createInfoBar('Create a user and configure access to xCAT.');
+
+ var userFS = $('');
+ var userLegend = $('');
+ userFS.append(userLegend);
+
+ var userAttr = $('');
+ userFS.append($(''));
+ userFS.append(userAttr);
+
+ var optionFS = $('');
+ var optionLegend = $('');
+ optionFS.append(optionLegend);
+
+ var optionAttr = $('');
+ optionFS.append($(''));
+ optionFS.append(optionAttr);
+
+ createUserForm.append(info, userFS, optionFS);
+
+ userAttr.append($(''));
+ userAttr.append($(''));
+ userAttr.append($(''));
+ userAttr.append($(''));
+ optionAttr.append($(''));
+ optionAttr.append($(''));
+ optionAttr.append($(''));
+ optionAttr.append($(''));
+ optionAttr.append($(''));
+ var rootPrivilege = $('');
+ var accessCheckbox = $('');
+ optionAttr.append(rootPrivilege);
+ rootPrivilege.append(accessCheckbox);
+
+ optionAttr.append($(''));
+ optionAttr.append($(''));
+
+ // Open dialog to add disk
+ createUserForm.dialog({
+ title:'Configure user',
+ modal: true,
+ close: function(){
+ $(this).remove();
+ },
+ width: 600,
+ buttons: {
+ "Ok": function(){
+ // Remove any warning messages
+ $(this).find('.ui-state-error').remove();
+
+ // Get inputs
+ var priority = $(this).find('input[name=priority]').val();
+ var usrName = $(this).find('input[name=name]').val();
+ var password = $(this).find('input[name=password]').val();
+ var confirmPassword = $(this).find('input[name=confirm_password]').val();
+ var host = $(this).find('input[name=host]').val();
+ var commands = $(this).find('input[name=commands]').val();
+ var parameters = $(this).find('input[name=parameters]').val();
+ var nodeRange = $(this).find('input[name=nodeRange]').val();
+ var rule = $(this).find('select[name=rule]').val();
+ var comments = $(this).find('input[name=comments]').val();
+ var disable = $(this).find('select[name=disable]').val();
+
+ // Verify user name and passwords are supplied
+ if (!usrName) {
+ var warn = createWarnBar('Please provide a user name');
+ warn.prependTo($(this));
+ return;
+ }
+
+ // Verify passwords match
+ if (password != confirmPassword) {
+ var warn = createWarnBar('Passwords do not match');
+ warn.prependTo($(this));
+ return;
+ }
+
+ var args = "";
+ if (usrName) {
+ args += ' policy.name=' + usrName;
+ } if (host) {
+ args += " policy.host='" + host + "'";
+ } if (commands) {
+ args += " policy.commands='" + commands + "'";
+ } if (parameters) {
+ args += " policy.parameters='" + parameters + "'";
+ } if (nodeRange) {
+ args += " policy.noderange='" + nodeRange + "'";
+ } if (rule) {
+ args += ' policy.rule=' + rule;
+ } if (disable) {
+ args += ' policy.disable=' + disable;
+ } if (comments) {
+ args += " policy.comments='" + comments + "'";
+ }
+
+ // Trim any extra spaces
+ args = jQuery.trim(args);
+
+ // Change dialog buttons
+ $(this).dialog('option', 'buttons', {
+ 'Close': function() {$(this).dialog("close");}
+ });
+
+ // Submit request to update policy and passwd tables
+ $.ajax({
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'webrun',
+ tgt : '',
+ args : 'policy|' + priority + '|' + args,
+ msg : dialogId
+ },
+
+ success : updatePanel
+ });
+
+ if (password) {
+ $.ajax({
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'webrun',
+ tgt : '',
+ args : 'passwd|' + usrName + '|' + password,
+ msg : dialogId
+ },
+
+ success : updatePanel
+ });
+ }
+
+ // Update highest priority
+ topPriority = priority;
+ },
+ "Cancel": function() {
+ $(this).dialog( "close" );
+ }
+ }
+ });
+
+ // Change comments if access checkbox is checked
+ accessCheckbox.click( function(){
+ var comments = createUserForm.find('input[name=comments]').val();
+ var tag = "privilege:root";
+ comments = jQuery.trim(comments);
+
+ // Append tag to comments
+ if (accessCheckbox.is(':checked')) {
+ if (comments && comments.charAt(comments.length - 1) != ";") {
+ comments += ";";
+ }
+
+ comments += tag;
+ createUserForm.find('input[name=comments]').val(comments);
+ } else {
+ comments = comments.replace(tag, "");
+ comments = comments.replace(";;", ";");
+ createUserForm.find('input[name=comments]').val(comments);
+ }
+
+ // Strip off leading semi-colon
+ if (comments.charAt(0) == ";") {
+ comments = comments.substr(1, comments.length);
+ createUserForm.find('input[name=comments]').val(comments);
+ }
+ });
+
+ // Set the user data (on edit)
+ if (data) {
+ var checkBox = $('#' + tableId + ' input[name="' + data + '"]');
+
+ var priority = data;
+ var name = checkBox.parents('tr').find('td:eq(2)').text();
+ var host = checkBox.parents('tr').find('td:eq(3)').text();
+ var commands = checkBox.parents('tr').find('td:eq(4)').text();
+ var noderange = checkBox.parents('tr').find('td:eq(5)').text();
+ var parameters = checkBox.parents('tr').find('td:eq(6)').text();
+ var time = checkBox.parents('tr').find('td:eq(7)').text();
+ var rule = checkBox.parents('tr').find('td:eq(8)').text();
+ var comments = checkBox.parents('tr').find('td:eq(9)').text();
+ var disable = checkBox.parents('tr').find('td:eq(10)').text();
+
+ createUserForm.find('input[name=priority]').val(priority);
+ createUserForm.find('input[name=name]').val(name);
+
+ // Do not show password (security)
+ createUserForm.find('input[name=password]').val();
+ createUserForm.find('input[name=confirm_password]').val();
+
+ createUserForm.find('input[name=host]').val(host);
+ createUserForm.find('input[name=commands]').val(commands);
+ createUserForm.find('input[name=parameters]').val(parameters);
+ createUserForm.find('input[name=nodeRange]').val(noderange);
+ createUserForm.find('select[name=rule]').val(rule);
+ createUserForm.find('input[name=comments]').val(comments);
+ createUserForm.find('select[name=disable]').val(disable);
+
+ if (comments.indexOf("privilege:root") > -1) {
+ accessCheckbox.attr("checked", true);
+ }
+ }
+}
+/**
+ * Open dialog to confirm user delete
+ *
+ * @param users Users to delete
+ */
+function openDeleteUserDialog(users) {
+ // Create form to delete disk to pool
+ var dialogId = 'deleteUser';
+ var deleteForm = $('');
+
+ // Create info bar
+ var info = createInfoBar('Are you sure you want to delete ' + users.replace(new RegExp(',', 'g'), ', ') + '?');
+ deleteForm.append(info);
+
+ // Open dialog to delete user
+ deleteForm.dialog({
+ title:'Delete user',
+ modal: true,
+ width: 400,
+ close: function(){
+ $(this).remove();
+ },
+ buttons: {
+ "Ok": function(){
+ // Remove any warning messages
+ $(this).find('.ui-state-error').remove();
+
+ // Change dialog buttons
+ $(this).dialog('option', 'buttons', {
+ 'Close': function() {$(this).dialog("close");}
+ });
+
+ // Delete user
+ $.ajax({
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'webrun',
+ tgt : '',
+ args : 'deleteuser|' + users,
+ msg : dialogId
+ },
+ success : updatePanel
+ });
+ },
+ "Cancel": function() {
+ $(this).dialog( "close" );
+ }
+ }
+ });
+}
\ No newline at end of file
diff --git a/xCAT-UI/js/custom/blade.js b/xCAT-UI/js/custom/blade.js
index 8c119fcc7..bf3d761f1 100644
--- a/xCAT-UI/js/custom/blade.js
+++ b/xCAT-UI/js/custom/blade.js
@@ -584,7 +584,7 @@ function createBladeProvisionExisting(inst) {
// Create group input
var group = $('');
- var groupLabel = $('');
+ var groupLabel = $('');
group.append(groupLabel);
// Turn on auto complete for group
@@ -622,7 +622,7 @@ function createBladeProvisionExisting(inst) {
// Create node input
var node = $('');
- var nodeLabel = $('');
+ var nodeLabel = $('');
var nodeDatatable = $('
Select a group to view its nodes
');
node.append(nodeLabel);
node.append(nodeDatatable);
@@ -630,7 +630,7 @@ function createBladeProvisionExisting(inst) {
// Create boot method drop down
var method = $('');
- var methodLabel = $('');
+ var methodLabel = $('');
var methodSelect = $('');
methodSelect.append(''
+ ''
@@ -645,7 +645,7 @@ function createBladeProvisionExisting(inst) {
// Create operating system input
var os = $('');
- var osLabel = $('');
+ var osLabel = $('');
var osInput = $('');
osInput.one('focus', function() {
var tmp = $.cookie('osvers');
@@ -662,7 +662,7 @@ function createBladeProvisionExisting(inst) {
// Create architecture input
var arch = $('');
- var archLabel = $('');
+ var archLabel = $('');
var archInput = $('');
archInput.one('focus', function() {
var tmp = $.cookie('osarchs');
@@ -679,7 +679,7 @@ function createBladeProvisionExisting(inst) {
// Create profile input
var profile = $('');
- var profileLabel = $('');
+ var profileLabel = $('');
var profileInput = $('');
profileInput.one('focus', function() {
var tmp = $.cookie('profiles');
diff --git a/xCAT-UI/js/custom/customUtils.js b/xCAT-UI/js/custom/customUtils.js
index add88765e..51ab0498b 100644
--- a/xCAT-UI/js/custom/customUtils.js
+++ b/xCAT-UI/js/custom/customUtils.js
@@ -67,7 +67,10 @@ function createNodesDatatable(group, outId) {
// Sort headers
var sorted = new Array();
for ( var key in headers) {
- sorted.push(key);
+ // Do not put in status or comments
+ if (key.indexOf("status") < 0 && key.indexOf("usercomment") < 0) {
+ sorted.push(key);
+ }
}
sorted.sort();
@@ -103,7 +106,23 @@ function createNodesDatatable(group, outId) {
}
$('#' + outId).append(dTable.object());
- $('#' + dTableId).dataTable();
+ $('#' + dTableId).dataTable({
+ 'iDisplayLength': 50,
+ 'bLengthChange': false,
+ "bScrollCollapse": true,
+ "sScrollY": "400px",
+ "sScrollX": "110%",
+ "bAutoWidth": true,
+ "oLanguage": {
+ "oPaginate": {
+ "sNext": "",
+ "sPrevious": ""
+ }
+ }
+ });
+
+ // Fix table styling
+ $('#' + dTableId + '_wrapper .dataTables_filter label').css('width', '250px');
} // End of function(data)
});
}
@@ -121,7 +140,7 @@ function createProvisionExisting(plugin, inst) {
// Create group input
var group = $('');
- var groupLabel = $('');
+ var groupLabel = $('');
group.append(groupLabel);
// Turn on auto complete for group
@@ -159,7 +178,7 @@ function createProvisionExisting(plugin, inst) {
// Create node input
var node = $('');
- var nodeLabel = $('');
+ var nodeLabel = $('');
var nodeDatatable = $('
Select a group to view its nodes
');
node.append(nodeLabel);
node.append(nodeDatatable);
@@ -167,7 +186,7 @@ function createProvisionExisting(plugin, inst) {
// Create boot method drop down
var method = $('');
- var methodLabel = $('');
+ var methodLabel = $('');
var methodSelect = $('');
methodSelect.append(''
+ ''
@@ -181,7 +200,7 @@ function createProvisionExisting(plugin, inst) {
// Create boot type drop down
var type = $('');
- var typeLabel = $('');
+ var typeLabel = $('');
var typeSelect = $('');
typeSelect.append(''
+ ''
@@ -193,7 +212,7 @@ function createProvisionExisting(plugin, inst) {
// Create operating system input
var os = $('');
- var osLabel = $('');
+ var osLabel = $('');
var osInput = $('');
osInput.one('focus', function() {
var tmp = $.cookie('osvers');
@@ -210,7 +229,7 @@ function createProvisionExisting(plugin, inst) {
// Create architecture input
var arch = $('');
- var archLabel = $('');
+ var archLabel = $('');
var archInput = $('');
archInput.one('focus', function() {
var tmp = $.cookie('osarchs');
@@ -227,7 +246,7 @@ function createProvisionExisting(plugin, inst) {
// Create profile input
var profile = $('');
- var profileLabel = $('');
+ var profileLabel = $('');
var profileInput = $('');
profileInput.one('focus', function() {
var tmp = $.cookie('profiles');
@@ -266,12 +285,12 @@ function createProvisionNew(plugin, inst) {
var provNew = $('');
// Create node input
- var nodeName = $('');
+ var nodeName = $('');
provNew.append(nodeName);
// Create group input
var group = $('');
- var groupLabel = $('');
+ var groupLabel = $('');
var groupInput = $('');
groupInput.one('focus', function() {
var groupNames = $.cookie('groups');
@@ -288,7 +307,7 @@ function createProvisionNew(plugin, inst) {
// Create boot method drop down
var method = $('');
- var methodLabel = $('');
+ var methodLabel = $('');
var methodSelect = $('');
methodSelect.append(''
+ ''
@@ -302,7 +321,7 @@ function createProvisionNew(plugin, inst) {
// Create boot type drop down
var type = $('');
- var typeLabel = $('');
+ var typeLabel = $('');
var typeSelect = $('');
typeSelect.append(''
+ ''
@@ -314,7 +333,7 @@ function createProvisionNew(plugin, inst) {
// Create operating system input
var os = $('');
- var osLabel = $('');
+ var osLabel = $('');
var osInput = $('');
osInput.one('focus', function() {
var tmp = $.cookie('osvers');
@@ -331,7 +350,7 @@ function createProvisionNew(plugin, inst) {
// Create architecture input
var arch = $('');
- var archLabel = $('');
+ var archLabel = $('');
var archInput = $('');
archInput.one('focus', function() {
var tmp = $.cookie('osarchs');
@@ -348,7 +367,7 @@ function createProvisionNew(plugin, inst) {
// Create profile input
var profile = $('');
- var profileLabel = $('');
+ var profileLabel = $('');
var profileInput = $('');
profileInput.one('focus', function() {
var tmp = $.cookie('profiles');
diff --git a/xCAT-UI/js/custom/esx.js b/xCAT-UI/js/custom/esx.js
index d5e229ea2..92b084c90 100644
--- a/xCAT-UI/js/custom/esx.js
+++ b/xCAT-UI/js/custom/esx.js
@@ -19,18 +19,6 @@ var esxPlugin = function() {
*/
esxPlugin.prototype.loadConfigPage = function(tabId) {
var configAccordion = $('');
-
- // Create accordion panel for user
- var userSection = $('');
- var userLnk = $('
').click(function () {
- // Do not load panel again if it is already loaded
- if ($('#kvmConfigUser').find('.dataTables_wrapper').length)
- return;
- else
- $('#kvmConfigUser').append(createLoader(''));
-
- loadUserPanel('kvmConfigUser');
- });
-
// Create accordion panel for profiles
var profileSection = $('');
var profileLnk = $('
').click(function () {
- // Do not load panel again if it is already loaded
- if ($('#zvmNetworkResource').children().length)
- return;
- else
- $('#zvmNetworkResource').append(createLoader(''));
-
- // Resize accordion
- $('#zvmResourceAccordion').accordion('resize');
-
- // Create a array for hardware control points
- var hcps = new Array();
- if ($.cookie('hcp').indexOf(',') > -1)
- hcps = $.cookie('hcp').split(',');
- else
- hcps.push($.cookie('hcp'));
-
- for ( var i in hcps) {
- // Gather networks from hardware control points
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'lsvm',
- tgt : hcps[i],
- args : '--getnetworknames',
- msg : hcps[i]
- },
-
- success : getNetwork
- });
- }
- });
-
- resourcesAccordion.append(diskLnk, diskSection, zfcpLnk, zfcpSection, networkLnk, networkSection);
-
- // Append accordion to tab
- $('#' + tabId).append(resourcesAccordion);
- resourcesAccordion.accordion();
- diskLnk.trigger('click');
- }
-}
-
-/**
- * Get node attributes from HTTP request data
- *
- * @param propNames Hash table of property names
- * @param keys Property keys
- * @param data Data from HTTP request
- * @return Hash table of property values
- */
-function getAttrs(keys, propNames, data) {
- // Create hash table for property values
- var attrs = new Object();
-
- // Go through inventory and separate each property out
- var curKey = null; // Current property key
- var addLine; // Add a line to the current property?
- for ( var i = 1; i < data.length; i++) {
- addLine = true;
-
- // Loop through property keys
- // Does this line contains one of the properties?
- for ( var j = 0; j < keys.length; j++) {
- // Find property name
- if (data[i].indexOf(propNames[keys[j]]) > -1) {
- attrs[keys[j]] = new Array();
-
- // Get rid of property name in the line
- data[i] = data[i].replace(propNames[keys[j]], '');
- // Trim the line
- data[i] = jQuery.trim(data[i]);
-
- // Do not insert empty line
- if (data[i].length > 0) {
- attrs[keys[j]].push(data[i]);
- }
-
- curKey = keys[j];
- addLine = false; // This line belongs to a property
- }
- }
-
- // Line does not contain a property
- // Must belong to previous property
- if (addLine && data[i].length > 1) {
- data[i] = jQuery.trim(data[i]);
- attrs[curKey].push(data[i]);
- }
- }
-
- return attrs;
-}
-
-/**
- * Create add processor dialog
- *
- * @param node Node to add processor to
- */
-function openAddProcDialog(node) {
- // Create form to add processor
- var addProcForm = $('');
- // Create info bar
- var info = createInfoBar('Add a temporary processor to this virtual server.');
- addProcForm.append(info);
- addProcForm.append('');
- addProcForm.append('');
-
- // Create drop down for processor type
- var procType = $('');
- procType.append('');
- var typeSelect = $('');
- typeSelect.append(''
- + ''
- + ''
- + ''
- );
- procType.append(typeSelect);
- addProcForm.append(procType);
-
- // Open dialog to add processor
- addProcForm.dialog({
- title:'Add processor',
- modal: true,
- close: function(){
- $(this).remove();
- },
- width: 400,
- buttons: {
- "Ok": function(){
- // Remove any warning messages
- $(this).find('.ui-state-error').remove();
-
- // Get inputs
- var node = $(this).find('input[name=procNode]').val();
- var address = $(this).find('input[name=procAddress]').val();
- var type = $(this).find('select[name=procType]').val();
-
- // If inputs are not complete, show warning message
- if (!node || !address || !type) {
- var warn = createWarnBar('Please provide a value for each missing field.');
- warn.prependTo($(this));
- } else {
- // Add processor
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'chvm',
- tgt : node,
- args : '--addprocessoractive;' + address + ';' + type,
- msg : node
- },
-
- success : updateZNodeStatus
- });
-
- // Increment node process
- incrementNodeProcess(node);
-
- // Show loader
- var statusId = node + 'StatusBar';
- var statusBarLoaderId = node + 'StatusBarLoader';
- $('#' + statusBarLoaderId).show();
- $('#' + statusId).show();
-
- // Close dialog
- $(this).dialog( "close" );
- }
- },
- "Cancel": function() {
- $(this).dialog( "close" );
- }
- }
- });
-}
-
-/**
- * Create add disk dialog
- *
- * @param node Node to add disk to
- * @param hcp Hardware control point of node
- */
-function openAddDiskDialog(node, hcp) {
- // Get list of disk pools
- var cookie = $.cookie(hcp + 'diskpools');
- var pools = cookie.split(',');
-
- // Create form to add disk
- var addDiskForm = $('');
- // Create info bar
- var info = createInfoBar('Add a ECKD|3390 or FBA|9336 disk to this virtual server.');
- addDiskForm.append(info);
- addDiskForm.append('');
- addDiskForm.append('');
- addDiskForm.append('');
- addDiskForm.append('');
-
- // Create drop down for disk pool
- var diskPool = $('');
- diskPool.append('');
- var poolSelect = $('');
- for ( var i = 0; i < pools.length; i++) {
- poolSelect.append('');
- }
- diskPool.append(poolSelect);
- addDiskForm.append(diskPool);
-
- // Create drop down for disk mode
- var diskMode = $('');
- diskMode.append('');
- var modeSelect = $('');
- modeSelect.append(''
- + ''
- + ''
- + ''
- + ''
- + ''
- + ''
- );
- diskMode.append(modeSelect);
- addDiskForm.append(diskMode);
-
- addDiskForm.append('');
-
- // Open dialog to add disk
- addDiskForm.dialog({
- title:'Add disk',
- modal: true,
- close: function(){
- $(this).remove();
- },
- width: 400,
- buttons: {
- "Ok": function(){
- // Remove any warning messages
- $(this).find('.ui-state-error').remove();
-
- // Get inputs
- var node = $(this).find('input[name=diskNode]').val();
- var type = $(this).find('select[name=diskType]').val();
- var address = $(this).find('input[name=diskAddress]').val();
- var size = $(this).find('input[name=diskSize]').val();
- var pool = $(this).find('select[name=diskPool]').val();
- var mode = $(this).find('select[name=diskMode]').val();
- var password = $(this).find('input[name=diskPassword]').val();
-
- // If inputs are not complete, show warning message
- if (!node || !type || !address || !size || !pool || !mode) {
- var warn = createWarnBar('Please provide a value for each missing field.');
- warn.prependTo($(this));
- } else {
- // Add disk
- if (type == '3390') {
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'chvm',
- tgt : node,
- args : '--add3390;' + pool + ';' + address + ';' + size
- + ';' + mode + ';' + password + ';' + password + ';' + password,
- msg : node
- },
-
- success : updateZNodeStatus
- });
-
- // Increment node process
- incrementNodeProcess(node);
-
- // Show loader
- var statusId = node + 'StatusBar';
- var statusBarLoaderId = node + 'StatusBarLoader';
- $('#' + statusBarLoaderId).show();
- $('#' + statusId).show();
- } else if (type == '9336') {
- // Default block size for FBA volumes = 512
- var blkSize = '512';
-
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'chvm',
- tgt : node,
- args : '--add9336;' + pool + ';' + address + ';' + blkSize + ';' + size
- + ';' + mode + ';' + password + ';' + password + ';' + password,
- msg : node
- },
-
- success : updateZNodeStatus
- });
-
- // Increment node process
- incrementNodeProcess(node);
-
- // Show loader
- var statusId = node + 'StatusBar';
- var statusBarLoaderId = node + 'StatusBarLoader';
- $('#' + statusBarLoaderId).show();
- $('#' + statusId).show();
- }
-
- // Close dialog
- $(this).dialog( "close" );
- } // End of else
- },
- "Cancel": function() {
- $(this).dialog( "close" );
- }
- }
- });
-}
-
-/**
- * Create add zFCP device dialog
- *
- * @param node Node to add disk to
- * @param hcp Hardware control point of node
- */
-function openAddZfcpDialog(node, hcp) {
- // Get list of disk pools
- var cookie = $.cookie(hcp + 'zfcppools');
- var pools = cookie.split(',');
-
- // Create form to add disk
- var addZfcpForm = $('');
- // Create info bar
- var info = createInfoBar('Add a SCSI|FCP disk to this virtual server.');
- addZfcpForm.append(info);
- addZfcpForm.append('');
- addZfcpForm.append('');
- addZfcpForm.append('');
- addZfcpForm.append('');
-
- // Create drop down for disk pool
- var diskPool = $('');
- diskPool.append('');
- var poolSelect = $('');
- for ( var i = 0; i < pools.length; i++) {
- poolSelect.append('');
- }
- diskPool.append(poolSelect);
- addZfcpForm.append(diskPool);
-
- // Tag to identify where device will be used
- addZfcpForm.append('');
-
- // Create advanced link to set advanced zFCP properties
- var advancedLnk = $('');
- addZfcpForm.append(advancedLnk);
- var advanced = $('').hide();
- addZfcpForm.append(advanced);
-
- var portName = $('');
- var unitNo = $('');
- advanced.append(portName, unitNo);
-
- // Toggle port name and unit number when clicking on advanced link
- advancedLnk.click(function() {
- advanced.toggle();
- });
-
- // Open dialog to add disk
- addZfcpForm.dialog({
- title:'Add zFCP device',
- modal: true,
- close: function(){
- $(this).remove();
- },
- width: 400,
- buttons: {
- "Ok": function(){
- // Remove any warning messages
- $(this).find('.ui-state-error').remove();
-
- // Get inputs
- var node = $(this).find('input[name=diskNode]').val();
- var address = $(this).find('input[name=diskAddress]').val();
- var loaddev = $(this).find('input[name=diskLoaddev]');
- var size = $(this).find('input[name=diskSize]').val();
- var pool = $(this).find('select[name=diskPool]').val();
- var tag = $(this).find('select[name=diskTag]').val();
- var portName = $(this).find('select[name=diskPortName]').val();
- var unitNo = $(this).find('select[name=diskUnitNo]').val();
-
- // If inputs are not complete, show warning message
- if (!node || !address || !size || !pool) {
- var warn = createWarnBar('Please provide a value for each missing field.');
- warn.prependTo($(this));
- } else {
- if (loaddev.attr('checked')) {
- loaddev = 1;
- } else {
- loaddev = 0;
- }
-
- var args = '--addzfcp;' + pool + ';' + address + ';' + loaddev + ';' + size;
-
- if (tag && tag != "null") {
- args += ';' + tag;
- } if (portName && tag != "null") {
- args += ';' + portName;
- } if (unitNo && tag != "null") {
- args += ';' + unitNo;
- }
-
- // Add zFCP device
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'chvm',
- tgt : node,
- args : args,
- msg : node
- },
-
- success : updateZNodeStatus
- });
-
- // Increment node process
- incrementNodeProcess(node);
-
- // Show loader
- var statusId = node + 'StatusBar';
- var statusBarLoaderId = node + 'StatusBarLoader';
- $('#' + statusBarLoaderId).show();
- $('#' + statusId).show();
-
- // Close dialog
- $(this).dialog( "close" );
- } // End of else
- },
- "Cancel": function() {
- $(this).dialog( "close" );
- }
- }
- });
-}
-
-/**
- * Create add NIC dialog
- *
- * @param node Node to add NIC to
- * @param hcp Hardware control point of node
- */
-function openAddNicDialog(node, hcp) {
- // Get network names
- var networks = $.cookie(hcp + 'networks').split(',');
-
- // Create form to add NIC
- var addNicForm = $('');
- // Create info bar
- var info = createInfoBar('Add a NIC to this virtual server.');
- addNicForm.append(info);
- addNicForm.append('');
- addNicForm.append('');
-
- // Create drop down for NIC types
- var nicType = $('');
- nicType.append('');
- var nicTypeSelect = $('');
- nicTypeSelect.append(''
- + ''
- + ''
- );
- nicType.append(nicTypeSelect);
- addNicForm.append(nicType);
-
- // Create drop down for network types
- var networkType = $('');
- networkType.append('');
- var networkTypeSelect = $('');
- networkTypeSelect.append(''
- + ''
- + ''
- );
- networkType.append(networkTypeSelect);
- addNicForm.append(networkType);
-
- // Create drop down for network names
- var gLansQdioSelect = $('');
- var gLansHipersSelect = $('');
- var vswitchSelect = $('');
- for ( var i = 0; i < networks.length; i++) {
- var network = networks[i].split(' ');
- var networkOption = $('');
- if (network[0] == 'VSWITCH') {
- vswitchSelect.append(networkOption);
- } else if (network[0] == 'LAN:QDIO') {
- gLansQdioSelect.append(networkOption);
- } else if (network[0] == 'LAN:HIPERS') {
- gLansHipersSelect.append(networkOption);
- }
- }
-
- // Hide network name drop downs until the NIC type and network type is selected
- // QDIO Guest LAN drop down
- var guestLanQdio = $('').hide();
- guestLanQdio.append('');
- guestLanQdio.append(gLansQdioSelect);
- addNicForm.append(guestLanQdio);
-
- // HIPERS Guest LAN drop down
- var guestLanHipers = $('').hide();
- guestLanHipers.append('');
- guestLanHipers.append(gLansHipersSelect);
- addNicForm.append(guestLanHipers);
-
- // VSWITCH drop down
- var vswitch = $('').hide();
- vswitch.append('');
- vswitch.append(vswitchSelect);
- addNicForm.append(vswitch);
-
- // Show network names on change
- networkTypeSelect.change(function(){
- // Remove any warning messages
- $(this).parent().parent().find('.ui-state-error').remove();
-
- // Get NIC type and network type
- var nicType = $(this).parent().parent().find('select[name=nicType]').val();
- var networkType = $(this).val();
-
- // Hide network name drop downs
- var guestLanQdio = $(this).parent().parent().find('select[name=nicLanQdioName]').parent();
- var guestLanHipers = $(this).parent().parent().find('select[name=nicLanHipersName]').parent();
- var vswitch = $(this).parent().parent().find('select[name=nicVSwitchName]').parent();
- guestLanQdio.hide();
- guestLanHipers.hide();
- vswitch.hide();
-
- // Show correct network name
- if (networkType == 'Guest LAN' && nicType == 'QDIO') {
- guestLanQdio.show();
- } else if (networkType == 'Guest LAN' && nicType == 'HiperSockets') {
- guestLanHipers.show();
- } else if (networkType == 'Virtual Switch') {
- if (nicType == 'QDIO') {
- vswitch.show();
- } else {
- // No such thing as HIPERS VSWITCH
- var warn = createWarnBar('The selected choices are not valid.');
- warn.prependTo($(this).parent().parent());
- }
- }
- });
-
- // Show network names on change
- nicTypeSelect.change(function(){
- // Remove any warning messages
- $(this).parent().parent().find('.ui-state-error').remove();
-
- // Get NIC type and network type
- var nicType = $(this).val();
- var networkType = $(this).parent().parent().find('select[name=nicNetworkType]').val();
-
- // Hide network name drop downs
- var guestLanQdio = $(this).parent().parent().find('select[name=nicLanQdioName]').parent();
- var guestLanHipers = $(this).parent().parent().find('select[name=nicLanHipersName]').parent();
- var vswitch = $(this).parent().parent().find('select[name=nicVSwitchName]').parent();
- guestLanQdio.hide();
- guestLanHipers.hide();
- vswitch.hide();
-
- // Show correct network name
- if (networkType == 'Guest LAN' && nicType == 'QDIO') {
- guestLanQdio.show();
- } else if (networkType == 'Guest LAN' && nicType == 'HiperSockets') {
- guestLanHipers.show();
- } else if (networkType == 'Virtual Switch') {
- if (nicType == 'QDIO') {
- vswitch.show();
- } else {
- // No such thing as HIPERS VSWITCH
- var warn = createWarnBar('The selected choices are not valid.');
- warn.prependTo($(this).parent().parent());
- }
- }
- });
-
- // Open dialog to add NIC
- addNicForm.dialog({
- title:'Add NIC',
- modal: true,
- close: function(){
- $(this).remove();
- },
- width: 400,
- buttons: {
- "Ok": function(){
- // Remove any warning messages
- $(this).find('.ui-state-error').remove();
-
- var ready = true;
- var errMsg = '';
-
- // Get inputs
- var node = $(this).find('input[name=nicNode]').val();
- var nicType = $(this).find('select[name=nicType]').val();
- var networkType = $(this).find('select[name=nicNetworkType]').val();
- var address = $(this).find('input[name=nicAddress]').val();
-
- // If inputs are not complete, show warning message
- if (!node || !nicType || !networkType || !address) {
- errMsg = 'Please provide a value for each missing field. ';
- ready = false;
- }
-
- // If a HIPERS VSWITCH is selected, show warning message
- if (nicType == 'HiperSockets' && networkType == 'Virtual Switch') {
- errMsg += 'The selected choices are not valid.';
- ready = false;
- }
-
- // If there are errors
- if (!ready) {
- // Show warning message
- var warn = createWarnBar(errMsg);
- warn.prependTo($(this));
- } else {
- // Add guest LAN
- if (networkType == 'Guest LAN') {
- var temp;
- if (nicType == 'QDIO') {
- temp = $(this).find('select[name=nicLanQdioName]').val().split(' ');
- } else {
- temp = $(this).find('select[name=nicLanHipersName]').val().split(' ');
- }
-
- var lanOwner = temp[0];
- var lanName = temp[1];
-
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'chvm',
- tgt : node,
- args : '--addnic;' + address + ';' + nicType + ';3',
- msg : 'node=' + node + ';addr=' + address + ';lan='
- + lanName + ';owner=' + lanOwner
- },
- success : connect2GuestLan
- });
- }
-
- // Add virtual switch
- else if (networkType == 'Virtual Switch' && nicType == 'QDIO') {
- var temp = $(this).find('select[name=nicVSwitchName]').val().split(' ');
- var vswitchName = temp[1];
-
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'chvm',
- tgt : node,
- args : '--addnic;' + address + ';' + nicType + ';3',
- msg : 'node=' + node + ';addr=' + address + ';vsw='
- + vswitchName
- },
-
- success : connect2VSwitch
- });
- }
-
- // Increment node process
- incrementNodeProcess(node);
-
- // Show loader
- $('#' + node + 'StatusBarLoader').show();
- $('#' + node + 'StatusBar').show();
-
- // Close dialog
- $(this).dialog( "close" );
- } // End of else
- },
- "Cancel": function(){
- $(this).dialog( "close" );
- }
- }
- });
-}
-
-/**
- * Remove processor
- *
- * @param node Node where processor is attached
- * @param address Virtual address of processor
- */
-function removeProcessor(node, address) {
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'chvm',
- tgt : node,
- args : '--removeprocessor;' + address,
- msg : node
- },
-
- success : updateZNodeStatus
- });
-
- // Increment node process
- incrementNodeProcess(node);
-
- // Show loader
- $('#' + node + 'StatusBarLoader').show();
- $('#' + node + 'StatusBar').show();
-}
-
-/**
- * Remove disk
- *
- * @param node Node where disk is attached
- * @param address Virtual address of disk
- */
-function removeDisk(node, address) {
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'chvm',
- tgt : node,
- args : '--removedisk;' + address,
- msg : node
- },
-
- success : updateZNodeStatus
- });
-
- // Increment node process
- incrementNodeProcess(node);
-
- // Show loader
- $('#' + node + 'StatusBarLoader').show();
- $('#' + node + 'StatusBar').show();
-}
-
-/**
- * Remove zFCP device
- *
- * @param node Node where disk is attached
- * @param address Virtual address of zFCP device
- * @param wwpn World wide port name of zFCP device
- * @param lun Logical unit number of zFCP device
- */
-function removeZfcp(node, address, wwpn, lun) {
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'chvm',
- tgt : node,
- args : '--removezfcp;' + address + ';' + wwpn + ';' + lun,
- msg : node
- },
-
- success : updateZNodeStatus
- });
-
- // Increment node process
- incrementNodeProcess(node);
-
- // Show loader
- $('#' + node + 'StatusBarLoader').show();
- $('#' + node + 'StatusBar').show();
-}
-
-/**
- * Remove NIC
- *
- * @param node Node where NIC is attached
- * @param address Virtual address of NIC
- */
-function removeNic(node, nic) {
- var args = nic.split('.');
- var address = args[0];
-
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'chvm',
- tgt : node,
- args : '--removenic;' + address,
- msg : node
- },
-
- success : updateZNodeStatus
- });
-
- // Increment node process
- incrementNodeProcess(node);
-
- // Show loader
- $('#' + node + 'StatusBarLoader').show();
- $('#' + node + 'StatusBar').show();
-}
-
-/**
- * Set a cookie for the network names of a given node
- *
- * @param data Data from HTTP request
- */
-function setNetworkCookies(data) {
- if (data.rsp) {
- var node = data.msg;
- var networks = data.rsp[0].split(node + ': ');
-
- // Set cookie to expire in 60 minutes
- var exDate = new Date();
- exDate.setTime(exDate.getTime() + (60 * 60 * 1000));
- $.cookie(node + 'networks', networks, { expires: exDate });
- }
-}
-
-/**
- * Get contents of each disk pool
- *
- * @param data HTTP request data
- */
-function getDiskPool(data) {
- if (data.rsp) {
- var hcp = data.msg;
- var pools = data.rsp[0].split(hcp + ': ');
-
- // Get contents of each disk pool
- for ( var i in pools) {
- if (pools[i]) {
- pools[i] = jQuery.trim(pools[i]);
-
- // Get used space
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'lsvm',
- tgt : hcp,
- args : '--diskpool;' + pools[i] + ';used',
- msg : 'hcp=' + hcp + ';pool=' + pools[i] + ';stat=used'
- },
-
- success : loadDiskPoolTable
- });
-
- // Get free space
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'lsvm',
- tgt : hcp,
- args : '--diskpool;' + pools[i] + ';free',
- msg : 'hcp=' + hcp + ';pool=' + pools[i] + ';stat=free'
- },
-
- success : loadDiskPoolTable
- });
- } // End of if
- } // End of for
- }
-}
-
-/**
- * Get contents of each zFCP pool
- *
- * @param data HTTP request data
- */
-function getZfcpPool(data) {
- if (data.rsp.length) {
- var hcp = data.msg;
- var pools = data.rsp[0].split(hcp + ': ');
-
- // Get contents of each disk pool
- for ( var i in pools) {
- if (pools[i]) {
- pools[i] = jQuery.trim(pools[i]);
-
- // Query used and free space
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'lsvm',
- tgt : hcp,
- args : '--zfcppool;' + pools[i] + ';all',
- msg : 'hcp=' + hcp + ';pool=' + pools[i]
- },
-
- success : loadZfcpPoolTable
- });
- } // End of if
- } // End of for
- } else {
- // Load empty table
- loadZfcpPoolTable(null);
- }
-}
-
-/**
- * Get details of each network
- *
- * @param data HTTP request data
- */
-function getNetwork(data) {
- if (data.rsp) {
- var hcp = data.msg;
- var networks = data.rsp[0].split(hcp + ': ');
-
- // Loop through each network
- for ( var i = 1; i < networks.length; i++) {
- var args = networks[i].split(' ');
- var type = args[0];
- var name = args[2];
-
- // Get network details
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'lsvm',
- tgt : hcp,
- args : '--getnetwork;' + name,
- msg : 'hcp=' + hcp + ';type=' + type + ';network=' + name
- },
-
- success : loadNetworkTable
- });
- } // End of for
- } // End of if
-}
-
-/**
- * Load disk pool contents into a table
- *
- * @param data HTTP request data
- */
-function loadDiskPoolTable(data) {
- // Remove loader
- var panelId = 'zvmDiskResource';
- $('#' + panelId).find('img[src="images/loader.gif"]').remove();
-
- var args = data.msg.split(';');
- var hcp = args[0].replace('hcp=', '');
- var pool = args[1].replace('pool=', '');
- var stat = args[2].replace('stat=', '');
- var tmp = data.rsp[0].split(hcp + ': ');
-
- // Resource tab ID
- var info = $('#' + panelId).find('.ui-state-highlight');
- // If there is no info bar
- if (!info.length) {
- // Create info bar
- info = createInfoBar('Below are disks that are defined in the EXTENT CONTROL file.');
- $('#' + panelId).append(info);
- }
-
- // Get datatable
- var tableId = 'zDiskDataTable';
- var dTable = getDiskDataTable();
- if (!dTable) {
- // Create a datatable
- var table = new DataTable(tableId);
- // Resource headers: volume ID, device type, start address, and size
- table.init( [ '', 'zHCP', 'Pool', 'Status', 'Region', 'Device type', 'Starting address', 'Size' ]);
-
- // Append datatable to panel
- $('#' + panelId).append(table.object());
-
- // Turn into datatable
- dTable = $('#' + tableId).dataTable();
- setDiskDataTable(dTable);
- }
-
- // Skip index 0 and 1 because it contains nothing
- for ( var i = 2; i < tmp.length; i++) {
- tmp[i] = jQuery.trim(tmp[i]);
- var diskAttrs = tmp[i].split(' ');
- dTable.fnAddData( [ '', hcp, pool, stat, diskAttrs[0], diskAttrs[1], diskAttrs[2], diskAttrs[3] ]);
- }
-
- // Create actions menu
- if (!$('#zvmResourceActions').length) {
- // Empty filter area
- $('#' + tableId + '_length').empty();
-
- // Add disk to pool
- var addLnk = $('Add');
- addLnk.bind('click', function(event){
- openAddDisk2PoolDialog();
- });
-
- // Delete disk from pool
- var removeLnk = $('Remove');
- removeLnk.bind('click', function(event){
- var disks = getNodesChecked(tableId);
- openRemoveDiskFromPoolDialog(disks);
- });
-
- // Refresh table
- var refreshLnk = $('Refresh');
- refreshLnk.bind('click', function(event){
- $('#zvmDiskResource').empty().append(createLoader(''));
- setDiskDataTable('');
-
- // Create a array for hardware control points
- var hcps = new Array();
- if ($.cookie('hcp').indexOf(',') > -1)
- hcps = $.cookie('hcp').split(',');
- else
- hcps.push($.cookie('hcp'));
-
- // Query the disk pools for each
- for (var i in hcps) {
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'lsvm',
- tgt : hcps[i],
- args : '--diskpoolnames',
- msg : hcps[i]
- },
-
- success : getDiskPool
- });
- }
- });
-
- // Create action bar
- var actionBar = $('').css("width", "400px");
-
- // Create an action menu
- var actionsMenu = createMenu([addLnk, removeLnk, refreshLnk]);
- actionsMenu.superfish();
- actionsMenu.css('display', 'inline-block');
- actionBar.append(actionsMenu);
-
- // Set correct theme for action menu
- actionsMenu.find('li').hover(function() {
- setMenu2Theme($(this));
- }, function() {
- setMenu2Normal($(this));
- });
-
- // Create a division to hold actions menu
- var menuDiv = $('');
- $('#' + tableId + '_length').prepend(menuDiv);
- $('#' + tableId + '_length').css({
- 'padding': '0px',
- 'width': '500px'
- });
- $('#' + tableId + '_filter').css('padding', '10px');
- menuDiv.append(actionBar);
- }
-
- // Resize accordion
- $('#zvmResourceAccordion').accordion('resize');
-}
-
-/**
- * Load zFCP pool contents into a table
- *
- * @param data HTTP request data
- */
-function loadZfcpPoolTable(data) {
- // Delete loader
- var panelId = 'zfcpResource';
- $('#' + panelId).find('img[src="images/loader.gif"]').remove();
-
- var args, hcp, pool, tmp;
- if (data) {
- args = data.msg.split(';');
- hcp = args[0].replace('hcp=', '');
- pool = args[1].replace('pool=', '');
- tmp = data.rsp[0].split(hcp + ': ');
- }
-
- // Resource tab ID
- var info = $('#' + panelId).find('.ui-state-highlight');
- // If there is no info bar, create info bar
- if (!info.length) {
- info = createInfoBar('Below are devices that are defined internally in the zFCP pools.');
- $('#' + panelId).append(info);
- }
-
- // Get datatable
- var tableId = 'zFcpDataTable';
- var dTable = getZfcpDataTable();
- if (!dTable) {
- // Create a datatable
- var table = new DataTable(tableId);
- // Resource headers: status, WWPN, LUN, size, owner, channel, tag
- table.init( [ '', 'zHCP', 'Pool', 'Status', 'Port name', 'Unit number', 'Size', 'Owner', 'Channel', 'Tag' ]);
-
- // Append datatable to panel
- $('#' + panelId).append(table.object());
-
- // Turn into datatable
- dTable = $('#' + tableId).dataTable({
- "sScrollX": "100%",
- "bAutoWidth": true
- });
- setZfcpDataTable(dTable);
- }
-
- if (data) {
- // Skip index 0 and 1 because it contains nothing
- for ( var i = 2; i < tmp.length; i++) {
- tmp[i] = jQuery.trim(tmp[i]);
- var diskAttrs = tmp[i].split(',');
- dTable.fnAddData( [ '', hcp, pool, diskAttrs[0], diskAttrs[1], diskAttrs[2], diskAttrs[3], diskAttrs[4], diskAttrs[5], diskAttrs[6] ]);
- }
- }
-
- // Create actions menu
- if (!$('#zFcpResourceActions').length) {
- // Empty filter area
- $('#' + tableId + '_length').empty();
-
- // Add disk to pool
- var addLnk = $('Add');
- addLnk.bind('click', function(event){
- openAddZfcp2PoolDialog();
- });
-
- // Delete disk from pool
- var removeLnk = $('Remove');
- removeLnk.bind('click', function(event){
- var disks = getNodesChecked(tableId);
- openRemoveZfcpFromPoolDialog(disks);
- });
-
- // Refresh table
- var refreshLnk = $('Refresh');
- refreshLnk.bind('click', function(event){
- $('#zfcpResource').empty().append(createLoader(''));
- setZfcpDataTable('');
-
- // Create a array for hardware control points
- var hcps = new Array();
- if ($.cookie('hcp').indexOf(',') > -1)
- hcps = $.cookie('hcp').split(',');
- else
- hcps.push($.cookie('hcp'));
-
- // Query the disk pools for each
- for (var i in hcps) {
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'lsvm',
- tgt : hcps[i],
- args : '--zfcppoolnames',
- msg : hcps[i]
- },
-
- success : getZfcpPool
- });
- }
- });
-
- // Create action bar
- var actionBar = $('').css("width", "400px");
-
- // Create an action menu
- var actionsMenu = createMenu([addLnk, removeLnk, refreshLnk]);
- actionsMenu.superfish();
- actionsMenu.css('display', 'inline-block');
- actionBar.append(actionsMenu);
-
- // Set correct theme for action menu
- actionsMenu.find('li').hover(function() {
- setMenu2Theme($(this));
- }, function() {
- setMenu2Normal($(this));
- });
-
- // Create a division to hold actions menu
- var menuDiv = $('');
- $('#' + tableId + '_length').prepend(menuDiv);
- $('#' + tableId + '_length').css({
- 'padding': '0px',
- 'width': '500px'
- });
- $('#' + tableId + '_filter').css('padding', '10px');
- menuDiv.append(actionBar);
- }
-
- // Resize accordion
- $('#zvmResourceAccordion').accordion('resize');
-}
-
-/**
- * Open dialog to remove disk from pool
- *
- * @param disks2remove Disks selected in table
- */
-function openRemoveDiskFromPoolDialog(disks2remove) {
- // Create form to delete disk from pool
- var dialogId = 'zvmDeleteDiskFromPool';
- var deleteDiskForm = $('');
-
- // Create info bar
- var info = createInfoBar('Remove a disk from a disk pool defined in the EXTENT CONTROL.');
- deleteDiskForm.append(info);
- var action = $('');
- var actionSelect = $('');
- action.append(actionSelect);
-
- var hcp = $('');
- var hcpSelect = $('');
- hcp.append(hcpSelect);
-
- // Set region input based on those selected on table (if any)
- var region = $('');
- var group = $('');
- deleteDiskForm.append(action, hcp, region, group);
-
- // Create a array for hardware control points
- var hcps = new Array();
- if ($.cookie('hcp').indexOf(',') > -1)
- hcps = $.cookie('hcp').split(',');
- else
- hcps.push($.cookie('hcp'));
-
- // Append options for hardware control points
- for (var i in hcps) {
- hcpSelect.append($(''));
- }
-
- actionSelect.change(function() {
- if ($(this).val() == '1' || $(this).val() == '3') {
- region.show();
- group.hide();
- } else if ($(this).val() == '2') {
- region.show();
- group.show();
- } else if ($(this).val() == '7') {
- region.val('FOOBAR');
- region.hide();
- group.show();
- }
- });
-
- // Open dialog to delete disk
- deleteDiskForm.dialog({
- title:'Delete disk from pool',
- modal: true,
- close: function(){
- $(this).remove();
- },
- width: 500,
- buttons: {
- "Ok": function(){
- // Remove any warning messages
- $(this).find('.ui-state-error').remove();
-
- // Get inputs
- var action = $(this).find('select[name=action]').val();
- var hcp = $(this).find('select[name=hcp]').val();
- var region = $(this).find('input[name=region]').val();
- var group = $(this).find('input[name=group]').val();
-
- // If inputs are not complete, show warning message
- if (!action || !hcp) {
- var warn = createWarnBar('Please provide a value for each missing field.');
- warn.prependTo($(this));
- } else {
- // Change dialog buttons
- $(this).dialog('option', 'buttons', {
- 'Close': function() {$(this).dialog("close");}
- });
-
- var args;
- if (action == '2' || action == '7')
- args = region + ';' + group;
- else
- args = group;
-
- // Remove disk from pool
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'chvm',
- tgt : hcp,
- args : '--removediskfrompool;' + action + ';' + args,
- msg : dialogId
- },
-
- success : updateResourceDialog
- });
- }
- },
- "Cancel": function() {
- $(this).dialog( "close" );
- }
- }
- });
-}
-
-/**
- * Open dialog to add disk to pool
- */
-function openAddDisk2PoolDialog() {
- // Create form to add disk to pool
- var dialogId = 'zvmAddDisk2Pool';
- var addDiskForm = $('');
- // Create info bar
- var info = createInfoBar('Add a disk to a disk pool defined in the EXTENT CONTROL. The disk has to already be attached to SYSTEM.');
- addDiskForm.append(info);
- var action = $('');
- var actionSelect = $('');
- action.append(actionSelect);
-
- var hcp = $('');
- var hcpSelect = $('');
- hcp.append(hcpSelect);
- var region = $('');
- var volume = $('');
- var group = $('');
- addDiskForm.append(action, hcp, region, volume, group);
-
- // Create a array for hardware control points
- var hcps = new Array();
- if ($.cookie('hcp').indexOf(',') > -1)
- hcps = $.cookie('hcp').split(',');
- else
- hcps.push($.cookie('hcp'));
-
- // Append options for hardware control points
- for (var i in hcps) {
- hcpSelect.append($(''));
- }
-
- actionSelect.change(function() {
- if ($(this).val() == '4') {
- volume.show();
- } else if ($(this).val() == '5') {
- volume.hide();
- }
- });
-
- // Open dialog to add disk
- addDiskForm.dialog({
- title:'Add disk to pool',
- modal: true,
- close: function(){
- $(this).remove();
- },
- width: 500,
- buttons: {
- "Ok": function(){
- // Remove any warning messages
- $(this).find('.ui-state-error').remove();
-
- // Get inputs
- var action = $(this).find('select[name=action]').val();
- var hcp = $(this).find('select[name=hcp]').val();
- var region = $(this).find('input[name=region]').val();
- var volume = $(this).find('input[name=volume]').val();
- var group = $(this).find('input[name=group]').val();
-
- // If inputs are not complete, show warning message
- if (!action || !hcp || !region || !group) {
- var warn = createWarnBar('Please provide a value for each missing field.');
- warn.prependTo($(this));
- } else {
- // Change dialog buttons
- $(this).dialog('option', 'buttons', {
- 'Close': function() {$(this).dialog("close");}
- });
-
- var args;
- if (action == '4')
- args = region + ';' + volume + ';' + group;
- else
- args = region + ';' + group;
-
- // Add disk to pool
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'chvm',
- tgt : hcp,
- args : '--adddisk2pool;' + action + ';' + args,
- msg : dialogId
- },
-
- success : updateResourceDialog
- });
- }
- },
- "Cancel": function() {
- $(this).dialog( "close" );
- }
- }
- });
-}
-
-/**
- * Open dialog to remove zFCP from pool
- *
- * @param devices2remove Comman separated devices selected in table
- */
-function openRemoveZfcpFromPoolDialog(devices2remove) {
- // Create form to delete device from pool
- var dialogId = 'zvmDeleteZfcpFromPool';
- var deleteDiskForm = $('');
-
- // Verify disks are in the same zFCP pool
- var devices = devices2remove.split(',');
- var tmp, tgtPool;
- var tgtUnitNo = "";
- for (var i in devices) {
- tmp = devices[i].split('-');
-
- if (tgtPool && tmp[0] != tgtPool) {
- openDialog("warn", "Please select devices in the same zFCP");
- return;
- } else {
- tgtPool = tmp[0];
- }
-
- tgtUnitNo += tmp[1] + ",";
- }
-
- // Strip out last comma
- tgtUnitNo = tgtUnitNo.slice(0, -1);
-
- // Create info bar
- var info = createInfoBar('Remove a zFCP device that is defined in a zFCP pool.');
- deleteDiskForm.append(info);
-
- var hcp = $('');
- var hcpSelect = $('');
- hcp.append(hcpSelect);
-
- var pool = $('');
- var unitNo = $('');
- deleteDiskForm.append(hcp, pool, unitNo);
-
- // Create a array for hardware control points
- var hcps = new Array();
- if ($.cookie('hcp').indexOf(',') > -1) {
- hcps = $.cookie('hcp').split(',');
- } else {
- hcps.push($.cookie('hcp'));
- }
-
- // Append options for hardware control points
- for (var i in hcps) {
- hcpSelect.append($(''));
- }
-
- // Open dialog to delete device
- deleteDiskForm.dialog({
- title:'Delete device from pool',
- modal: true,
- close: function(){
- $(this).remove();
- },
- width: 500,
- buttons: {
- "Ok": function(){
- // Remove any warning messages
- $(this).find('.ui-state-error').remove();
-
- var hcp = $(this).find('select[name=hcp]').val();
- var pool = $(this).find('input[name=zfcpPool]').val();
- var unitNo = $(this).find('input[name=unitNo]').val();
-
- // If inputs are not complete, show warning message
- if (!hcp || !pool || !unitNo) {
- var warn = createWarnBar('Please provide a value for each missing field.');
- warn.prependTo($(this));
- } else {
- // Change dialog buttons
- $(this).dialog('option', 'buttons', {
- 'Close': function() {$(this).dialog("close");}
- });
-
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'chvm',
- tgt : hcp,
- args : '--removezfcpfrompool;' + pool + ';' + unitNo,
- msg : dialogId
- },
-
- success : updateResourceDialog
- });
- }
- },
- "Cancel": function() {
- $(this).dialog( "close" );
- }
- }
- });
-}
-
-/**
- * Open dialog to add zFCP to pool
- */
-function openAddZfcp2PoolDialog() {
- // Create form to add disk to pool
- var dialogId = 'zvmAddDisk2Pool';
- var addDiskForm = $('');
- var info = createInfoBar('Add a device to a zFCP pool defined in xCAT.');
- addDiskForm.append(info);
-
- var hcp = $('');
- var hcpSelect = $('');
- hcp.append(hcpSelect);
-
- var pool = $('');
- var status = $('');
- var portName = $('');
- var unitNo = $('');
- var size = $('');
- var owner = $('');
- addDiskForm.append(hcp, pool, status, portName, unitNo, size, owner);
-
- // Create a array for hardware control points
- var hcps = new Array();
- if ($.cookie('hcp').indexOf(',') > -1) {
- hcps = $.cookie('hcp').split(',');
- } else {
- hcps.push($.cookie('hcp'));
- }
-
- for (var i in hcps) {
- hcpSelect.append($(''));
- }
-
- // Open dialog to add disk
- addDiskForm.dialog({
- title:'Add device to pool',
- modal: true,
- close: function(){
- $(this).remove();
- },
- width: 500,
- buttons: {
- "Ok": function(){
- // Delete any warning messages
- $(this).find('.ui-state-error').remove();
-
- var tgtHcp = $(this).find('select[name=hcp]').val();
- var tgtPool = $(this).find('input[name=zfcpPool]').val();
- var tgtStatus = $(this).find('select[name=zfcpStatus]').val();
- var tgtPortName = $(this).find('input[name=zfcpPortName]').val();
- var tgtUnitNo = $(this).find('input[name=zfcpUnitNo]').val();
- var tgtSize = $(this).find('input[name=zfcpSize]').val();
-
- // Device owner is optional
- var tgtOwner = "";
- if ($(this).find('input[name=zfcpOwner]').val()) {
- tgtOwner = $(this).find('input[name=zfcpOwner]').val();
- }
-
- // If inputs are not complete, show warning message
- if (!tgtHcp || !tgtPool || !tgtStatus || !tgtPortName || !tgtUnitNo || !tgtSize) {
- var warn = createWarnBar('Please provide a value for each missing field.');
- warn.prependTo($(this));
- } else {
- // Change dialog buttons
- $(this).dialog('option', 'buttons', {
- 'Close': function() {$(this).dialog("close");}
- });
-
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'chvm',
- tgt : tgtHcp,
- args : '--addzfcp2pool;' + tgtPool + ';' + tgtStatus + ';' + tgtPortName + ';' + tgtUnitNo + ';' + tgtSize + ';' + tgtOwner,
- msg : dialogId
- },
-
- success : updateResourceDialog
- });
- }
- },
- "Cancel": function() {
- $(this).dialog( "close" );
- }
- }
- });
-}
-
-/**
- * Update resource dialog
- *
- * @param data HTTP request data
- */
-function updateResourceDialog(data) {
- var dialogId = data.msg;
- var infoMsg;
-
- // Create info message
- if (jQuery.isArray(data.rsp)) {
- infoMsg = '';
- for (var i in data.rsp) {
- infoMsg += data.rsp[i] + '';
- }
- } else {
- infoMsg = data.rsp;
- }
-
- // Create info bar with close button
- var infoBar = $('').css('margin', '5px 0px');
- var icon = $('').css({
- 'display': 'inline-block',
- 'margin': '10px 5px'
- });
-
- // Create close button to close info bar
- var close = $('').css({
- 'display': 'inline-block',
- 'float': 'right'
- }).click(function() {
- $(this).parent().remove();
- });
-
- var msg = $('
' + infoMsg + '
').css({
- 'display': 'inline-block',
- 'width': '90%'
- });
-
- infoBar.append(icon, msg, close);
- infoBar.prependTo($('#' + dialogId));
-}
-
-/**
- * Select all checkboxes in the datatable
- *
- * @param event Event on element
- * @param obj Object triggering event
- */
-function selectAllDisk(event, obj) {
- // This will ascend from
- var tableObj = obj.parents('.datatable');
- var status = obj.attr('checked');
- tableObj.find(' :checkbox').attr('checked', status);
-
- // Handle datatable scroll
- tableObj = obj.parents('.dataTables_scroll');
- if (tableObj.length) {
- tableObj.find(' :checkbox').attr('checked', status);
- }
-
- event.stopPropagation();
-}
-
-/**
- * Load network details into a table
- *
- * @param data HTTP request data
- */
-function loadNetworkTable(data) {
- // Remove loader
- var panelId = 'zvmNetworkResource';
- $('#' + panelId).find('img[src="images/loader.gif"]').remove();
-
- var args = data.msg.split(';');
- var hcp = args[0].replace('hcp=', '');
- var type = args[1].replace('type=', '');
- var name = args[2].replace('network=', '');
- var tmp = data.rsp[0].split(hcp + ': ');
-
- // Resource tab ID
- var info = $('#' + panelId).find('.ui-state-highlight');
- // If there is no info bar
- if (!info.length) {
- // Create info bar
- info = createInfoBar('Below are LANs/VSWITCHes available to use.');
- $('#' + panelId).append(info);
- }
-
- // Get datatable
- var dTable = getNetworkDataTable();
- if (!dTable) {
- // Create table
- var tableId = 'zNetworkDataTable';
- var table = new DataTable(tableId);
- table.init( [ 'HCP', 'Type', 'Name', 'Details' ]);
-
- // Append datatable to tab
- $('#' + panelId).append(table.object());
-
- // Turn into datatable
- dTable = $('#' + tableId).dataTable();
- setNetworkDataTable(dTable);
-
- // Set the column width
- var cols = table.object().find('thead tr th');
- cols.eq(0).css('width', '20px'); // HCP column
- cols.eq(1).css('width', '20px'); // Type column
- cols.eq(2).css('width', '20px'); // Name column
- cols.eq(3).css({'width': '600px'}); // Details column
- }
-
- // Skip index 0 because it contains nothing
- var details = '
';
- for ( var i = 1; i < tmp.length; i++) {
- details += tmp[i];
- }
- details += '
';
-
- dTable.fnAddData([ '
' + hcp + '
', '
' + type + '
', '
' + name + '
', details ]);
-
- // Resize accordion
- $('#zvmResourceAccordion').accordion('resize');
-}
-
-/**
- * Connect a NIC to a Guest LAN
- *
- * @param data Data from HTTP request
- */
-function connect2GuestLan(data) {
- var rsp = data.rsp;
- var args = data.msg.split(';');
- var node = args[0].replace('node=', '');
- var address = args[1].replace('addr=', '');
- var lanName = args[2].replace('lan=', '');
- var lanOwner = args[3].replace('owner=', '');
-
- // Write ajax response to status bar
- var prg = writeRsp(rsp, node + ': ');
- $('#' + node + 'StatusBar').find('div').append(prg);
-
- // Connect NIC to Guest LAN
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'chvm',
- tgt : node,
- args : '--connectnic2guestlan;' + address + ';' + lanName + ';'
- + lanOwner,
- msg : node
- },
-
- success : updateZNodeStatus
- });
-}
-
-/**
- * Connect a NIC to a VSwitch
- *
- * @param data Data from HTTP request
- */
-function connect2VSwitch(data) {
- var rsp = data.rsp;
- var args = data.msg.split(';');
- var node = args[0].replace('node=', '');
- var address = args[1].replace('addr=', '');
- var vswitchName = args[2].replace('vsw=', '');
-
- // Write ajax response to status bar
- var prg = writeRsp(rsp, node + ': ');
- $('#' + node + 'StatusBar').find('div').append(prg);
-
- // Connect NIC to VSwitch
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'chvm',
- tgt : node,
- args : '--connectnic2vswitch;' + address + ';' + vswitchName,
- msg : node
- },
-
- success : updateZNodeStatus
- });
-}
-
-/**
- * Create provision existing node division
- *
- * @param inst Provision tab instance
- * @return Provision existing node division
- */
-function createZProvisionExisting(inst) {
- // Create provision existing and hide it
- var provExisting = $('').hide();
-
- var vmFS = $('');
- var vmLegend = $('');
- vmFS.append(vmLegend);
- provExisting.append(vmFS);
-
- var vmAttr = $('');
- vmFS.append($(''));
- vmFS.append(vmAttr);
-
- var osFS = $('');
- var osLegend = $('');
- osFS.append(osLegend);
- provExisting.append(osFS);
-
- var osAttr = $('');
- osFS.append($(''));
- osFS.append(osAttr);
-
- // Create group input
- var group = $('');
- var groupLabel = $('');
- group.append(groupLabel);
-
- // Turn on auto complete for group
- var groupNames = $.cookie('groups');
- if (groupNames) {
- // Split group names into an array
- var tmp = groupNames.split(',');
-
- // Create drop down for groups
- var groupSelect = $('');
- groupSelect.append('');
- for (var i in tmp) {
- // Add group into drop down
- var opt = $('');
- groupSelect.append(opt);
- }
- group.append(groupSelect);
-
- // Create node datatable
- groupSelect.change(function(){
- // Get group selected
- var thisGroup = $(this).val();
- // If a valid group is selected
- if (thisGroup) {
- createNodesDatatable(thisGroup, 'zNodesDatatableDIV' + inst);
- }
- });
- } else {
- // If no groups are cookied
- var groupInput = $('');
- group.append(groupInput);
- }
- vmAttr.append(group);
-
- // Create node input
- var node = $('');
- var nodeLabel = $('');
- var nodeDatatable = $('
Select a group to view its nodes
');
- node.append(nodeLabel);
- node.append(nodeDatatable);
- vmAttr.append(node);
-
- // Create operating system image input
- var os = $('');
- var osLabel = $('');
- var osInput = $('');
- // Get image names on focus
- osInput.one('focus', function(){
- var imageNames = $.cookie('imagenames');
- if (imageNames) {
- // Turn on auto complete
- $(this).autocomplete({
- source: imageNames.split(',')
- });
- }
- });
- os.append(osLabel);
- os.append(osInput);
- osAttr.append(os);
-
- // Create boot method drop down
- var bootMethod = $('');
- var methoddLabel = $('');
- var methodSelect = $('');
- methodSelect.append(''
- + ''
- + ''
- + ''
- + ''
- );
- bootMethod.append(methoddLabel);
- bootMethod.append(methodSelect);
- osAttr.append(bootMethod);
-
- // Generate tooltips
- provExisting.find('div input[title]').tooltip({
- position: "center right",
- offset: [-2, 10],
- effect: "fade",
- opacity: 0.7,
- predelay: 800,
- events: {
- def: "mouseover,mouseout",
- input: "mouseover,mouseout",
- widget: "focus mouseover,blur mouseout",
- tooltip: "mouseover,mouseout"
- }
- });
-
- /**
- * Provision existing
- */
- var provisionBtn = createButton('Provision');
- provisionBtn.bind('click', function(event) {
- // Remove any warning messages
- $(this).parent().parent().find('.ui-state-error').remove();
-
- var ready = true;
- var errMsg = '';
-
- // Get provision tab ID
- var thisTabId = $(this).parent().parent().parent().attr('id');
- // Get provision tab instance
- var inst = thisTabId.replace('zvmProvisionTab', '');
-
- // Get nodes that were checked
- var dTableId = 'zNodesDatatable' + inst;
- var tgts = getNodesChecked(dTableId);
- if (!tgts) {
- errMsg += 'You need to select a node. ';
- ready = false;
- }
-
- // Check operating system image
- var os = $('#' + thisTabId + ' input[name=os]:visible');
- if (!os.val()) {
- errMsg += 'You need to select a operating system image.';
- os.css('border', 'solid #FF0000 1px');
- ready = false;
- } else {
- os.css('border', 'solid #BDBDBD 1px');
- }
-
- // If all inputs are valid, ready to provision
- if (ready) {
- // Disable provision button
- $(this).attr('disabled', 'true');
-
- // Show loader
- $('#zProvisionStatBar' + inst).show();
- $('#zProvisionLoader' + inst).show();
-
- // Disable all inputs
- var inputs = $('#' + thisTabId + ' input:visible');
- inputs.attr('disabled', 'disabled');
-
- // Disable all selects
- var selects = $('#' + thisTabId + ' select');
- selects.attr('disabled', 'disabled');
-
- // Get operating system image
- var osImage = $('#' + thisTabId + ' input[name=os]:visible').val();
- var tmp = osImage.split('-');
- var os = tmp[0];
- var arch = tmp[1];
- var profile = tmp[3];
-
- /**
- * (1) Set operating system
- */
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'nodeadd',
- tgt : '',
- args : tgts + ';noderes.netboot=zvm;nodetype.os=' + os + ';nodetype.arch=' + arch + ';nodetype.profile=' + profile,
- msg : 'cmd=nodeadd;out=' + inst
- },
-
- success : updateZProvisionExistingStatus
- });
- } else {
- // Show warning message
- var warn = createWarnBar(errMsg);
- warn.prependTo($(this).parent().parent());
- }
- });
- provExisting.append(provisionBtn);
-
- return provExisting;
-}
-
-/**
- * Create provision new node division
- *
- * @param inst Provision tab instance
- * @return Provision new node division
- */
-function createZProvisionNew(inst) {
- // Create provision new node division
- var provNew = $('');
-
- // Create VM fieldset
- var vmFS = $('');
- var vmLegend = $('');
- vmFS.append(vmLegend);
- provNew.append(vmFS);
-
- var vmAttr = $('');
- vmFS.append($(''));
- vmFS.append(vmAttr);
-
- // Create OS fieldset
- var osFS = $('');
- var osLegend = $('');
- osFS.append(osLegend);
- provNew.append(osFS);
-
- // Create hardware fieldset
- var hwFS = $('');
- var hwLegend = $('');
- hwFS.append(hwLegend);
- provNew.append(hwFS);
-
- var hwAttr = $('');
- hwFS.append($(''));
- hwFS.append(hwAttr);
-
- var osAttr = $('');
- osFS.append($(''));
- osFS.append(osAttr);
-
- // Create group input
- var group = $('');
- var groupLabel = $('');
- var groupInput = $('');
- // Get groups on-focus
- groupInput.one('focus', function(){
- var groupNames = $.cookie('groups');
- if (groupNames) {
- // Turn on auto complete
- $(this).autocomplete({
- source: groupNames.split(',')
- });
- }
- });
- group.append(groupLabel);
- group.append(groupInput);
- vmAttr.append(group);
-
- // Create node input
- var nodeName = $('');
- var nodeLabel = $('');
- var nodeInput = $('');
- nodeName.append(nodeLabel);
- nodeName.append(nodeInput);
- vmAttr.append(nodeName);
-
- // Create user ID input
- var userId = $('');
- vmAttr.append(userId);
-
- // Create hardware control point input
- var hcpDiv = $('');
- var hcpLabel = $('');
- var hcpInput = $('');
- hcpInput.blur(function() {
- if ($(this).val()) {
- var args = $(this).val().split('.');
- if (!$.cookie(args[0] + 'diskpools')) {
- // Get disk pools
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'lsvm',
- tgt : args[0],
- args : '--diskpoolnames',
- msg : args[0]
- },
-
- success : setDiskPoolCookies
- });
- }
-
- if (!$.cookie(args[0] + 'zfcppools')) {
- // Get zFCP pools
- $.ajax( {
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'lsvm',
- tgt : args[0],
- args : '--zfcppoolnames',
- msg : args[0]
- },
-
- success : setZfcpPoolCookies
- });
- }
- }
- });
- hcpDiv.append(hcpLabel);
- hcpDiv.append(hcpInput);
- vmAttr.append(hcpDiv);
-
- // Create an advanced link to set IP address and hostname
- var advancedLnk = $('');
- vmAttr.append(advancedLnk);
- var advanced = $('').hide();
- vmAttr.append(advanced);
-
- var ip = $('');
- advanced.append(ip);
- var hostname = $('');
- advanced.append(hostname);
-
- // Show IP address and hostname inputs on-click
- advancedLnk.click(function() {
- advanced.toggle();
- });
-
- // Create operating system image input
- var os = $('');
- var osLabel = $('');
- var osSelect = $('');
- osSelect.append($(''));
-
- var imageNames = $.cookie('imagenames').split(',');
- if (imageNames) {
- imageNames.sort();
- for (var i in imageNames) {
- osSelect.append($(''));
- }
- }
- os.append(osLabel);
- os.append(osSelect);
- osAttr.append(os);
-
- // Create user entry input
- var defaultChkbox = $('').click(function() {
- // Remove any warning messages
- $(this).parents('.form').find('.ui-state-error').remove();
-
- // Get tab ID
- var thisTabId = $(this).parents('.ui-tabs-panel').attr('id');
-
- // Get objects for HCP, user ID, and OS
- var userId = $('#' + thisTabId + ' input[name=userId]');
- var os = $('#' + thisTabId + ' select[name=os]');
-
- // Get default user entry when clicked
- if ($(this).attr('checked')) {
- if (!os.val() || !userId.val()) {
- // Show warning message
- var warn = createWarnBar('Please specify the operating system and user ID before checking this box');
- warn.prependTo($(this).parents('.form'));
-
- // Highlight empty fields
- jQuery.each([os, userId], function() {
- if (!$(this).val()) {
- $(this).css('border', 'solid #FF0000 1px');
- }
- });
- } else {
- // Un-highlight empty fields
- jQuery.each([os, userId], function() {
- $(this).css('border', 'solid #BDBDBD 1px');
- });
-
- // Get profile name
- var tmp = os.val().split('-');
- var profile = tmp[3];
-
- $.ajax({
- url : 'lib/cmd.php',
- dataType : 'json',
- data : {
- cmd : 'webrun',
- tgt : '',
- args : 'getdefaultuserentry;' + profile,
- msg : thisTabId
- },
-
- success:function(data) {
- // Populate user entry
- var tabId = data.msg;
- var entry = new String(data.rsp);
- var userId = $('#' + tabId + ' input[name=userId]').val();
- entry = entry.replace(new RegExp('LXUSR', 'g'), userId);
- $('#' + tabId + ' textarea:visible').val(entry);
- }
- });
- }
- } else {
- $('#' + thisTabId + ' textarea:visible').val('');
-
- // Un-highlight empty fields
- jQuery.each([os, userId], function() {
- $(this).css('border', 'solid #BDBDBD 1px');
- });
- }
- });
- var userEntry = $('');
- userEntry.append($('').append(defaultChkbox, 'Use default'));
- hwAttr.append(userEntry);
-
- // Create disk table
- var diskDiv = $('');
- var diskLabel = $('');
- var diskTable = $('
');
- var diskHeader = $('
Type
Address
Size
Mode
Pool
Password
');
- // Adjust header width
- diskHeader.find('th').css( {
- 'width' : '80px'
- });
- diskHeader.find('th').eq(0).css( {
- 'width' : '20px'
- });
- var diskBody = $('');
- var diskFooter = $('');
-
- /**
- * Add disks
- */
- var addDiskLink = $('Add disk');
- addDiskLink.bind('click', function(event) {
- // Get list of disk pools
- var thisTabId = $(this).parents('.tab').attr('id');
- var thisHcp = $('#' + thisTabId + ' input[name=hcp]').val();
- var definedPools = null;
- if (thisHcp) {
- // Get node without domain name
- var temp = thisHcp.split('.');
- definedPools = $.cookie(temp[0] + 'diskpools').split(',');
- }
-
- // Create a row
- var diskRow = $('
');
-
- // Add remove button
- var removeBtn = $('');
- var col = $('
').append(removeBtn);
- removeBtn.bind('click', function(event) {
- diskRow.remove();
- });
- diskRow.append(col);
-
- // Create disk type drop down
- var diskType = $('
');
- var diskTypeSelect = $('');
- diskTypeSelect.append(''
- + ''
- );
- diskType.append(diskTypeSelect);
- diskRow.append(diskType);
-
- // Create disk address input
- var diskAddr = $('
');
- diskRow.append(diskAddr);
-
- // Create disk size input
- var diskSize = $('
');
- diskRow.append(diskSize);
-
- // Create disk mode input
- var diskMode = $('
');
- var diskModeSelect = $('');
- diskModeSelect.append(''
- + ''
- + ''
- + ''
- + ''
- + ''
- + ''
- );
- diskMode.append(diskModeSelect);
- diskRow.append(diskMode);
-
- // Create disk pool drop down
- var diskPool = $('
');
- var diskPoolSelect = $('');
- for (var i in definedPools) {
- diskPoolSelect.append('');
- }
- diskPool.append(diskPoolSelect);
- diskRow.append(diskPool);
-
- // Create disk password input
- var diskPw = $('
');
- zfcpRow.append(zfcpAddr);
-
- // Create disk size input
- var zfcpSize = $('
');
- zfcpRow.append(zfcpSize);
-
- // Create zFCP pool drop down
- var zfcpPool = $('
');
- var zfcpPoolSelect = $('');
- for (var i in definedPools) {
- zfcpPoolSelect.append('');
- }
- zfcpPool.append(zfcpPoolSelect);
- zfcpRow.append(zfcpPool);
-
- // Create disk tag
- var zfcpTag = $('
');
- zfcpRow.append(zfcpTag);
-
- // Create device port name
- var zfcpPortName = $('
');
- zfcpRow.append(zfcpPortName);
-
- // Create device unit number
- var zfcpUnitNo = $('
');
+ devPathRow.append(fcpLun);
+
+ devPathBody.append(devPathRow);
+ });
+ devPathFooter.append(addDevPathLink);
+ devPathTable.append(devPathHeader);
+ devPathTable.append(devPathBody);
+ devPathTable.append(devPathFooter);
+ devPathDiv.append(devPathLabel);
+ devPathDiv.append(devPathTable);
+
+ var option = $('');
+ var persist = $('');
+ addS2SForm.append(devNum, devPathDiv, option, persist);
+
+ addS2SForm.find('div input[title]').tooltip({
+ position: "center right",
+ offset: [-2, 10],
+ effect: "fade",
+ opacity: 0.7,
+ predelay: 800,
+ events: {
+ def: "mouseover,mouseout",
+ input: "mouseover,mouseout",
+ widget: "focus mouseover,blur mouseout",
+ tooltip: "mouseover,mouseout"
+ }
+ });
+
+ // Open dialog to add disk
+ addS2SForm.dialog({
+ title:'Add SCSI to running system',
+ modal: true,
+ close: function(){
+ $(this).remove();
+ },
+ width: 675,
+ buttons: {
+ "Ok": function(){
+ // Remove any warning messages
+ $(this).find('.ui-state-error').remove();
+
+ var num = $(this).find('input[name=devNum]').val();
+ var pathArray = "";
+ $('.devPath').each(function(index) {
+ pathArray += $(this).find('input[name=fcpDevNum]').val() + ' ';
+ pathArray += $(this).find('input[name=fcpWwpn]').val() + ' ';
+ pathArray += $(this).find('input[name=fcpLun]').val() + '; ';
+ });
+ path_Array = pathArray + "'";
+ var option = $(this).find('select[name=option]').val();
+ var persist = $(this).find('select[name=persist]').val();
+
+ // If inputs are not complete, show warning message
+ if (!num || !pathArray || !option || !persist) {
+ var warn = createWarnBar('Please provide a value for each missing field.');
+ warn.prependTo($(this));
+ } else {
+ // Change dialog buttons
+ $(this).dialog('option', 'buttons', {
+ 'Close': function() {$(this).dialog("close");}
+ });
+
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'chhypervisor',
+ tgt : hcp,
+ args : "--addscsi|" + num + "|" + pathArray + "|" + option + "|" + persist,
+ msg : dialogId
+ },
+
+ success : updateResourceDialog
+ });
+
+ }
+ },
+ "Cancel": function() {
+ $(this).dialog( "close" );
+ }
+ }
+ });
+}
+
+/**
+ * Delete a real SCSI disk
+ *
+ * @param hcp Hardware control point of node
+ */
+function openRemoveScsiDialog(hcp) {
+ var dialogId = 'zvmRemoveScsiDialog';
+ // Create form to add disk
+ var removeScsiForm = $('');
+ // Create info bar
+ var info = createInfoBar('Delete a real SCSI disk');
+ removeScsiForm.append(info);
+ removeScsiForm.append('');
+ removeScsiForm.append('');
+ // Create info bar
+ var info = createInfoBar('Add a NIC to this virtual server.');
+ addNicForm.append(info);
+ addNicForm.append('');
+ addNicForm.append('');
+
+ // Create drop down for NIC types
+ var nicType = $('');
+ nicType.append('');
+ var nicTypeSelect = $('');
+ nicTypeSelect.append(''
+ + ''
+ + ''
+ );
+ nicType.append(nicTypeSelect);
+ addNicForm.append(nicType);
+
+ // Create drop down for network types
+ var networkType = $('');
+ networkType.append('');
+ var networkTypeSelect = $('');
+ networkTypeSelect.append(''
+ + ''
+ + ''
+ );
+ networkType.append(networkTypeSelect);
+ addNicForm.append(networkType);
+
+ // Create drop down for network names
+ var gLansQdioSelect = $('');
+ var gLansHipersSelect = $('');
+ var vswitchSelect = $('');
+ for ( var i = 0; i < networks.length; i++) {
+ var network = networks[i].split(' ');
+ var networkOption = $('');
+ if (network[0] == 'VSWITCH') {
+ vswitchSelect.append(networkOption);
+ } else if (network[0] == 'LAN:QDIO') {
+ gLansQdioSelect.append(networkOption);
+ } else if (network[0] == 'LAN:HIPERS') {
+ gLansHipersSelect.append(networkOption);
+ }
+ }
+
+ // Hide network name drop downs until the NIC type and network type is selected
+ // QDIO Guest LAN drop down
+ var guestLanQdio = $('').hide();
+ guestLanQdio.append('');
+ guestLanQdio.append(gLansQdioSelect);
+ addNicForm.append(guestLanQdio);
+
+ // HIPERS Guest LAN drop down
+ var guestLanHipers = $('').hide();
+ guestLanHipers.append('');
+ guestLanHipers.append(gLansHipersSelect);
+ addNicForm.append(guestLanHipers);
+
+ // VSWITCH drop down
+ var vswitch = $('').hide();
+ vswitch.append('');
+ vswitch.append(vswitchSelect);
+ addNicForm.append(vswitch);
+
+ // Show network names on change
+ networkTypeSelect.change(function(){
+ // Remove any warning messages
+ $(this).parent().parent().find('.ui-state-error').remove();
+
+ // Get NIC type and network type
+ var nicType = $(this).parent().parent().find('select[name=nicType]').val();
+ var networkType = $(this).val();
+
+ // Hide network name drop downs
+ var guestLanQdio = $(this).parent().parent().find('select[name=nicLanQdioName]').parent();
+ var guestLanHipers = $(this).parent().parent().find('select[name=nicLanHipersName]').parent();
+ var vswitch = $(this).parent().parent().find('select[name=nicVSwitchName]').parent();
+ guestLanQdio.hide();
+ guestLanHipers.hide();
+ vswitch.hide();
+
+ // Show correct network name
+ if (networkType == 'Guest LAN' && nicType == 'QDIO') {
+ guestLanQdio.show();
+ } else if (networkType == 'Guest LAN' && nicType == 'HiperSockets') {
+ guestLanHipers.show();
+ } else if (networkType == 'Virtual Switch') {
+ if (nicType == 'QDIO') {
+ vswitch.show();
+ } else {
+ // No such thing as HIPERS VSWITCH
+ var warn = createWarnBar('The selected choices are not valid.');
+ warn.prependTo($(this).parent().parent());
+ }
+ }
+ });
+
+ // Show network names on change
+ nicTypeSelect.change(function(){
+ // Remove any warning messages
+ $(this).parent().parent().find('.ui-state-error').remove();
+
+ // Get NIC type and network type
+ var nicType = $(this).val();
+ var networkType = $(this).parent().parent().find('select[name=nicNetworkType]').val();
+
+ // Hide network name drop downs
+ var guestLanQdio = $(this).parent().parent().find('select[name=nicLanQdioName]').parent();
+ var guestLanHipers = $(this).parent().parent().find('select[name=nicLanHipersName]').parent();
+ var vswitch = $(this).parent().parent().find('select[name=nicVSwitchName]').parent();
+ guestLanQdio.hide();
+ guestLanHipers.hide();
+ vswitch.hide();
+
+ // Show correct network name
+ if (networkType == 'Guest LAN' && nicType == 'QDIO') {
+ guestLanQdio.show();
+ } else if (networkType == 'Guest LAN' && nicType == 'HiperSockets') {
+ guestLanHipers.show();
+ } else if (networkType == 'Virtual Switch') {
+ if (nicType == 'QDIO') {
+ vswitch.show();
+ } else {
+ // No such thing as HIPERS VSWITCH
+ var warn = createWarnBar('The selected choices are not valid.');
+ warn.prependTo($(this).parent().parent());
+ }
+ }
+ });
+
+ // Open dialog to add NIC
+ addNicForm.dialog({
+ title:'Add NIC',
+ modal: true,
+ close: function(){
+ $(this).remove();
+ },
+ width: 400,
+ buttons: {
+ "Ok": function(){
+ // Remove any warning messages
+ $(this).find('.ui-state-error').remove();
+
+ var ready = true;
+ var errMsg = '';
+
+ // Get inputs
+ var node = $(this).find('input[name=nicNode]').val();
+ var nicType = $(this).find('select[name=nicType]').val();
+ var networkType = $(this).find('select[name=nicNetworkType]').val();
+ var address = $(this).find('input[name=nicAddress]').val();
+
+ // If inputs are not complete, show warning message
+ if (!node || !nicType || !networkType || !address) {
+ errMsg = 'Please provide a value for each missing field. ';
+ ready = false;
+ }
+
+ // If a HIPERS VSWITCH is selected, show warning message
+ if (nicType == 'HiperSockets' && networkType == 'Virtual Switch') {
+ errMsg += 'The selected choices are not valid.';
+ ready = false;
+ }
+
+ // If there are errors
+ if (!ready) {
+ // Show warning message
+ var warn = createWarnBar(errMsg);
+ warn.prependTo($(this));
+ } else {
+ // Add guest LAN
+ if (networkType == 'Guest LAN') {
+ var temp;
+ if (nicType == 'QDIO') {
+ temp = $(this).find('select[name=nicLanQdioName]').val().split(' ');
+ } else {
+ temp = $(this).find('select[name=nicLanHipersName]').val().split(' ');
+ }
+
+ var lanOwner = temp[0];
+ var lanName = temp[1];
+
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'chvm',
+ tgt : node,
+ args : '--addnic;' + address + ';' + nicType + ';3',
+ msg : 'node=' + node + ';addr=' + address + ';lan='
+ + lanName + ';owner=' + lanOwner
+ },
+ success : connect2GuestLan
+ });
+ }
+
+ // Add virtual switch
+ else if (networkType == 'Virtual Switch' && nicType == 'QDIO') {
+ var temp = $(this).find('select[name=nicVSwitchName]').val().split(' ');
+ var vswitchName = temp[1];
+
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'chvm',
+ tgt : node,
+ args : '--addnic;' + address + ';' + nicType + ';3',
+ msg : 'node=' + node + ';addr=' + address + ';vsw='
+ + vswitchName
+ },
+
+ success : connect2VSwitch
+ });
+ }
+
+ // Increment node process
+ incrementNodeProcess(node);
+
+ // Show loader
+ $('#' + node + 'StatusBarLoader').show();
+ $('#' + node + 'StatusBar').show();
+
+ // Close dialog
+ $(this).dialog( "close" );
+ } // End of else
+ },
+ "Cancel": function(){
+ $(this).dialog( "close" );
+ }
+ }
+ });
+}
+
+/**
+ * Create add vSwitch/VLAN dialog
+ *
+ * @param hcp Hardware control point of node
+ */
+function openAddVswitchVlanDialog(hcp) {
+ var dialogId = 'zvmAddVswitchVlan';
+
+ // Create form to add disk
+ var addVswitchForm = $('');
+
+ // Create info bar
+ var info = createInfoBar('Create a virtual switch or virtual network LAN.');
+
+ var netFS = $('');
+ var netLegend = $('');
+ netFS.append(netLegend);
+
+ var typeFS = $('').hide();
+ var typeLegend = $('');
+ typeFS.append(typeLegend);
+
+ addVswitchForm.append(info, netFS, typeFS);
+ var netAttr = $('');
+ netFS.append($(''));
+ netFS.append(netAttr);
+
+ var networkTypeDiv = $('
');
+ var networkType = $('
');
+ networkTypeDiv.append(networkType)
+ netAttr.append(networkTypeDiv);
+
+ var hcp = $('');
+ var hcpSelect = $('');
+ hcp.append(hcpSelect);
+ netAttr.append(hcp);
+
+ var typeAttr = $('');
+ typeFS.append($(''));
+ typeFS.append(typeAttr);
+
+ // Create vSwitch parameters
+ var vswitchOptions = $('').hide();
+ vswitchOptions.append($(''));
+ vswitchOptions.append($(''));
+ vswitchOptions.append($(''));
+ vswitchOptions.append($(''));
+ vswitchOptions.append($(''));
+ vswitchOptions.append($(''));
+ vswitchOptions.append($(''));
+ vswitchOptions.append($(''));
+ vswitchOptions.append($(''));
+ vswitchOptions.append($(''));
+ vswitchOptions.append($(''));
+ vswitchOptions.append($(''));
+ vswitchOptions.append($(''));
+
+ // Create VLAN parameters
+ var vlanOptions = $('').hide();
+ vlanOptions.append($(''));
+ vlanOptions.append($(''));
+ vlanOptions.append($(''));
+ vlanOptions.append($(''));
+
+ typeAttr.append(vswitchOptions, vlanOptions);
+
+ // Create a array for hardware control points
+ var hcps = new Array();
+ if ($.cookie('hcp').indexOf(',') > -1)
+ hcps = $.cookie('hcp').split(',');
+ else
+ hcps.push($.cookie('hcp'));
+
+ // Append options for hardware control points
+ for (var i in hcps) {
+ hcpSelect.append($(''));
+ }
+
+ networkType.change(function() {
+ typeFS.show();
+ if ($(this).val() == "vswitch") {
+ typeFS.find("legend").text("vSwitch");
+ vswitchOptions.show();
+ vlanOptions.hide();
+ } else if ($(this).val() == "vlan") {
+ typeFS.find("legend").text("VLAN");
+ vswitchOptions.hide();
+ vlanOptions.show();
+ } else {
+ typeFS.find("legend").text("");
+ vswitchOptions.hide();
+ vlanOptions.hide();
+ typeFS.hide();
+ }
+ });
+
+ // Open dialog to add vSwitch or VLAN
+ addVswitchForm.dialog({
+ title:'Add vSwitch or VLAN',
+ modal: true,
+ close: function() {
+ $(this).remove();
+ },
+ width: 750,
+ buttons: {
+ "Ok": function(){
+ // Remove any warning messages
+ $(this).find('.ui-state-error').remove();
+
+ var networkType = $(this).find('select[name=networkType]').val();
+ if (networkType == "vswitch"){
+ var networkArgs = "--addvswitch;";
+ var hcp = $(this).find('select[name=hcp]').val();
+ var switchName = $(this).find('input[name=switchName]').val();
+ var deviceAddress = $(this).find('input[name=deviceAddress]').val();
+ var portName = $(this).find('input[name=switchName]').val();
+ var controllerName = $(this).find('input[name=controllerName]').val();
+ var connection = $(this).find('select[name=connection]').val();
+ var queueMemoryLimit = $(this).find('input[name=queueMemoryLimit]').val();
+ var routingValue = $(this).find('select[name=routingValue]').val();
+ var transportType = $(this).find('select[name=transportType]').val();
+ var vlanId = $(this).find('input[name=vlanId]').val();
+ var portType = $(this).find('select[name=portType]').val();
+ var updateSysConfig = $(this).find('select[name=updateSysConfig]').val();
+ var gvrp = $(this).find('select[name=gvrp]').val();
+ var nativeVlanId = $(this).find('input[name=nativeVlanId]').val();
+
+ if (switchName)
+ networkArgs += ";" + switchName;
+ if (deviceAddress)
+ networkArgs += ";" + deviceAddress;
+ if (portName)
+ networkArgs += ";" + portName;
+ if (controllerName)
+ networkArgs += ";" + controllerName;
+ if (connection)
+ networkArgs += ";" + connection;
+ if (queueMemoryLimit)
+ networkArgs += ";" + queueMemoryLimit;
+ if (routingValue)
+ networkArgs += ";" + routingValue;
+ if (transportType)
+ networkArgs += ";" + transportType;
+ if (vlanId)
+ networkArgs += ";" + vlanId;
+ if (portType)
+ networkArgs += ";" + portType;
+ if (updateSysConfig)
+ networkArgs += ";" + updateSysConfig;
+ if (gvrp)
+ networkArgs += ";" + gvrpValue;
+ if (nativeVlanId)
+ networkArgs += ";" + nativeVlanId;
+
+ // Change dialog buttons
+ $(this).dialog('option', 'buttons', {
+ 'Close': function() {$(this).dialog("close");}
+ });
+
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'chhypervisor',
+ tgt : hcp,
+ args : networkArgs,
+ msg : dialogId
+ },
+
+ success : updateResourceDialog
+ });
+ } else if (networkType == "vlan") {
+ var networkArgs = "--addvlan;";
+ var hcp = $(this).find('select[name=hcp]').val();
+ var vlanName = $(this).find('input[name=vlanName]').val();
+ var vlanOwner = $(this).find('input[name=vlanOwner]').val();
+ var vlanType = $(this).find('select[name=vlanType]').val();
+ var vlanTransport = $(this).find('select[name=vlanTransport]').val();
+
+ if (!vlanName || !vlanOwner || !vlanType || !vlanTransport) {
+ var warn = createWarnBar('Please provide a value for each missing field.');
+ warn.prependTo($(this));
+ } else {
+ networkArgs += ";" + vlanName;
+ networkArgs += ";" + vlanOwner;
+ networkArgs += ";" + vlanType;
+ networkArgs += ";" + vlanTransport;
+
+ // Change dialog buttons
+ $(this).dialog('option', 'buttons', {
+ 'Close': function() {$(this).dialog("close");}
+ });
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'chhypervisor',
+ tgt : hcp,
+ args : networkArgs,
+ msg : dialogId
+ },
+
+ success : updateResourceDialog
+ });
+ }
+ } // End of else if
+ },
+ "Cancel": function() {
+ $(this).dialog( "close" );
+ }
+ }
+ });
+}
+
+/**
+ * Open dialog to delete network
+ *
+ * @param node type name for removing network
+ */
+function openRemoveVswitchVlanDialog(networkList) {
+ var names = '';
+ for (var i in networkList) {
+ var networkArgs = networkList[i].split(';');
+ networkArgs[2] = jQuery.trim(networkArgs[2]);
+ names += networkArgs[2] + ', ';
+ }
+ names = names.substring(0, names.length - 2); // Delete last two characters
+
+ var confirmDialog = $('
Are you sure you want to remove ' + names + '?
');
+ confirmDialog.dialog({
+ title: "Confirm",
+ modal: true,
+ width: 400,
+ buttons: {
+ "Ok": function() {
+ for (var i in networkList) {
+ var networkArgs = networkList[i].split(';');
+ var node = networkArgs[0];
+ var type = networkArgs[1];
+ var name = jQuery.trim(networkArgs[2]);
+
+ if (type.toLowerCase() == "vswitch") {
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'chhypervisor',
+ tgt : node,
+ args : '--removevswitch;' + name,
+ msg : ''
+ }
+ });
+ } else if (type.toLowerCase() == "vlan") {
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'chhypervisor',
+ tgt : node,
+ args : '--removevlan;' + name + ';' + owner,
+ msg : ''
+ }
+ });
+ }
+ }
+ $(this).dialog("close");
+ },
+ "Cancel": function() {
+ $(this).dialog("close");
+ }
+ }
+ });
+}
+
+/**
+ * Remove processor
+ *
+ * @param node Node where processor is attached
+ * @param address Virtual address of processor
+ */
+function removeProcessor(node, address) {
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'chvm',
+ tgt : node,
+ args : '--removeprocessor;' + address,
+ msg : node
+ },
+
+ success : updateZNodeStatus
+ });
+
+ // Increment node process
+ incrementNodeProcess(node);
+
+ // Show loader
+ $('#' + node + 'StatusBarLoader').show();
+ $('#' + node + 'StatusBar').show();
+}
+
+/**
+ * Remove disk
+ *
+ * @param node Node where disk is attached
+ * @param address Virtual address of disk
+ */
+function removeDisk(node, address) {
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'chvm',
+ tgt : node,
+ args : '--removedisk;' + address,
+ msg : node
+ },
+
+ success : updateZNodeStatus
+ });
+
+ // Increment node process
+ incrementNodeProcess(node);
+
+ // Show loader
+ $('#' + node + 'StatusBarLoader').show();
+ $('#' + node + 'StatusBar').show();
+}
+
+/**
+ * Remove zFCP device
+ *
+ * @param node Node where disk is attached
+ * @param address Virtual address of zFCP device
+ * @param wwpn World wide port name of zFCP device
+ * @param lun Logical unit number of zFCP device
+ */
+function removeZfcp(node, address, wwpn, lun) {
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'chvm',
+ tgt : node,
+ args : '--removezfcp;' + address + ';' + wwpn + ';' + lun,
+ msg : node
+ },
+
+ success : updateZNodeStatus
+ });
+
+ // Increment node process
+ incrementNodeProcess(node);
+
+ // Show loader
+ $('#' + node + 'StatusBarLoader').show();
+ $('#' + node + 'StatusBar').show();
+}
+
+/**
+ * Remove NIC
+ *
+ * @param node Node where NIC is attached
+ * @param address Virtual address of NIC
+ */
+function removeNic(node, nic) {
+ var args = nic.split('.');
+ var address = args[0];
+
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'chvm',
+ tgt : node,
+ args : '--removenic;' + address,
+ msg : node
+ },
+
+ success : updateZNodeStatus
+ });
+
+ // Increment node process
+ incrementNodeProcess(node);
+
+ // Show loader
+ $('#' + node + 'StatusBarLoader').show();
+ $('#' + node + 'StatusBar').show();
+}
+
+/**
+ * Set a cookie for the network names of a given node
+ *
+ * @param data Data from HTTP request
+ */
+function setNetworkCookies(data) {
+ if (data.rsp.length) {
+ var node = data.msg;
+ var networks = data.rsp[0].split(node + ': ');
+
+ // Set cookie to expire in 60 minutes
+ var exDate = new Date();
+ exDate.setTime(exDate.getTime() + (60 * 60 * 1000));
+ $.cookie(node + 'networks', networks, { expires: exDate });
+ }
+}
+
+/**
+ * Get contents of each disk pool
+ *
+ * @param data HTTP request data
+ */
+function getDiskPool(data) {
+ if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) {
+ var hcp = data.msg;
+ var pools = data.rsp[0].split(hcp + ': ');
+
+ // Get contents of each disk pool
+ for ( var i in pools) {
+ if (pools[i]) {
+ pools[i] = jQuery.trim(pools[i]);
+
+ // Get used space
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'lsvm',
+ tgt : hcp,
+ args : '--diskpool;' + pools[i] + ';used',
+ msg : 'hcp=' + hcp + ';pool=' + pools[i] + ';stat=used'
+ },
+
+ success : loadDiskPoolTable
+ });
+
+ // Get free space
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'lsvm',
+ tgt : hcp,
+ args : '--diskpool;' + pools[i] + ';free',
+ msg : 'hcp=' + hcp + ';pool=' + pools[i] + ';stat=free'
+ },
+
+ success : loadDiskPoolTable
+ });
+ } // End of if
+ } // End of for
+ }
+}
+
+/**
+ * Get contents of each zFCP pool
+ *
+ * @param data HTTP request data
+ */
+function getZfcpPool(data) {
+ if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) {
+ var hcp = data.msg;
+ var pools = data.rsp[0].split(hcp + ': ');
+
+ // Get contents of each disk pool
+ for ( var i in pools) {
+ if (pools[i]) {
+ pools[i] = jQuery.trim(pools[i]);
+
+ // Query used and free space
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'lsvm',
+ tgt : hcp,
+ args : '--zfcppool;' + pools[i] + ';all',
+ msg : 'hcp=' + hcp + ';pool=' + pools[i]
+ },
+
+ success : loadZfcpPoolTable
+ });
+ } // End of if
+ } // End of for
+ } else {
+ // Load empty table
+ loadZfcpPoolTable(null);
+ }
+}
+
+/**
+ * Get details of each network
+ *
+ * @param data HTTP request data
+ */
+function getNetwork(data) {
+ if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) {
+ var hcp = data.msg;
+ var networks = data.rsp[0].split(hcp + ': ');
+
+ // Loop through each network
+ for ( var i = 1; i < networks.length; i++) {
+ var args = networks[i].split(' ');
+ var type = args[0];
+ var name = args[2];
+
+ // Get network details
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'lsvm',
+ tgt : hcp,
+ args : '--getnetwork;' + name,
+ msg : 'hcp=' + hcp + ';type=' + type + ';network=' + name
+ },
+
+ success : loadNetworkTable
+ });
+ } // End of for
+ } // End of if
+}
+
+/**
+ * Load disk pool contents into a table
+ *
+ * @param data HTTP request data
+ */
+function loadDiskPoolTable(data) {
+ // Remove loader
+ var panelId = 'zvmDiskResource';
+ $('#' + panelId).find('img[src="images/loader.gif"]').remove();
+
+ // Do not continue if the call failed
+ if (!data.rsp.length && data.rsp[0].indexOf("Failed") > 0) {
+ return;
+ }
+
+ var args = data.msg.split(';');
+ var hcp = args[0].replace('hcp=', '');
+ var pool = args[1].replace('pool=', '');
+ var stat = args[2].replace('stat=', '');
+ var tmp = data.rsp[0].split(hcp + ': ');
+
+ // Resource tab ID
+ var info = $('#' + panelId).find('.ui-state-highlight');
+ // If there is no info bar
+ if (!info.length) {
+ // Create info bar
+ info = createInfoBar('Below are disks that are defined in the EXTENT CONTROL file.');
+ $('#' + panelId).append(info);
+ }
+
+ // Get datatable
+ var tableId = 'zDiskDataTable';
+ var dTable = getDiskDataTable();
+ if (!dTable) {
+ // Create a datatable
+ var table = new DataTable(tableId);
+ // Resource headers: volume ID, device type, start address, and size
+ table.init( [ '', 'zHCP', 'Pool', 'Status', 'Region', 'Device type', 'Starting address', 'Size' ]);
+
+ // Append datatable to panel
+ $('#' + panelId).append(table.object());
+
+ // Turn into datatable
+ dTable = $('#' + tableId).dataTable({
+ 'iDisplayLength': 50,
+ "bScrollCollapse": true,
+ "sScrollY": "400px",
+ "sScrollX": "110%",
+ "bAutoWidth": true,
+ "oLanguage": {
+ "oPaginate": {
+ "sNext": "",
+ "sPrevious": ""
+ }
+ }
+ });
+ setDiskDataTable(dTable);
+ }
+
+ // Skip index 0 and 1 because it contains nothing
+ for ( var i = 2; i < tmp.length; i++) {
+ tmp[i] = jQuery.trim(tmp[i]);
+ var diskAttrs = tmp[i].split(' ');
+ dTable.fnAddData( [ '', hcp, pool, stat, diskAttrs[0], diskAttrs[1], diskAttrs[2], diskAttrs[3] ]);
+ }
+
+ // Create actions menu
+ if (!$('#zvmResourceActions').length) {
+ // Empty filter area
+ $('#' + tableId + '_length').empty();
+
+ // Add disk to pool
+ var addLnk = $('Add');
+ addLnk.bind('click', function(event){
+ openAddDisk2PoolDialog();
+ });
+
+ // Delete disk from pool
+ var removeLnk = $('Remove');
+ removeLnk.bind('click', function(event){
+ var disks = getNodesChecked(tableId);
+ openRemoveDiskFromPoolDialog(disks);
+ });
+
+ // Refresh table
+ var refreshLnk = $('Refresh');
+ refreshLnk.bind('click', function(event){
+ $('#zvmDiskResource').empty().append(createLoader(''));
+ setDiskDataTable('');
+
+ // Create a array for hardware control points
+ var hcps = new Array();
+ if ($.cookie('hcp').indexOf(',') > -1)
+ hcps = $.cookie('hcp').split(',');
+ else
+ hcps.push($.cookie('hcp'));
+
+ // Query the disk pools for each
+ for (var i in hcps) {
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'lsvm',
+ tgt : hcps[i],
+ args : '--diskpoolnames',
+ msg : hcps[i]
+ },
+
+ success : getDiskPool
+ });
+ }
+ });
+
+ // Add ECKD to system
+ var addEckdLnk = $('Add ECKD');
+ addEckdLnk.bind('click', function(event){
+ openAddEckd2SystemDialog(hcp);
+ });
+
+ // Add Page or Spool
+ var addPageSpoolLnk = $('Add page/spool')
+ addPageSpoolLnk.bind('click', function(event){
+ openAddPageSpoolDialog(hcp);
+ });
+
+ // Indicate disk is to be shared with various users
+ var shareLnk = $('Share disk');
+ shareLnk.bind('click', function(event){
+ var disks = getNodesChecked(tableId);
+ openShareDiskDialog(disks);
+ });
+
+ // Advanced menu
+ var advancedLnk = 'Advanced';
+ var advancedMenu = createMenu([addEckdLnk, addPageSpoolLnk, shareLnk]);
+
+ // Create action bar
+ var actionBar = $('').css("width", "450px");
+
+ // Create an action menu
+ var actionsMenu = createMenu([addLnk, removeLnk, refreshLnk, [advancedLnk, advancedMenu]]);
+ actionsMenu.superfish();
+ actionsMenu.css('display', 'inline-block');
+ actionBar.append(actionsMenu);
+
+ // Set correct theme for action menu
+ actionsMenu.find('li').hover(function() {
+ setMenu2Theme($(this));
+ }, function() {
+ setMenu2Normal($(this));
+ });
+
+ // Create a division to hold actions menu
+ var menuDiv = $('');
+ $('#' + tableId + '_length').prepend(menuDiv);
+ $('#' + tableId + '_length').css({
+ 'padding': '0px',
+ 'width': '500px'
+ });
+ $('#' + tableId + '_filter').css('padding', '10px');
+ menuDiv.append(actionBar);
+ }
+
+ // Resize accordion
+ $('#zvmResourceAccordion').accordion('resize');
+}
+
+/**
+ * Load zFCP pool contents into a table
+ *
+ * @param data HTTP request data
+ */
+function loadZfcpPoolTable(data) {
+ // Delete loader
+ var panelId = 'zfcpResource';
+ $('#' + panelId).find('img[src="images/loader.gif"]').remove();
+
+ // Do not continue if the call failed
+ if (!data.rsp.length && data.rsp[0].indexOf("Failed") > 0) {
+ return;
+ }
+
+ var args, hcp, pool, tmp;
+ args = data.msg.split(';');
+ hcp = args[0].replace('hcp=', '');
+ pool = args[1].replace('pool=', '');
+ tmp = data.rsp[0].split(hcp + ': ');
+
+ // Resource tab ID
+ var info = $('#' + panelId).find('.ui-state-highlight');
+ // If there is no info bar, create info bar
+ if (!info.length) {
+ info = createInfoBar('Below are devices that are defined internally in the zFCP pools.');
+ $('#' + panelId).append(info);
+ }
+
+ // Get datatable
+ var tableId = 'zFcpDataTable';
+ var dTable = getZfcpDataTable();
+ if (!dTable) {
+ // Create a datatable
+ var table = new DataTable(tableId);
+ // Resource headers: status, WWPN, LUN, size, owner, channel, tag
+ table.init( [ '', 'zHCP', 'Pool', 'Status', 'Port name', 'Unit number', 'Size', 'Range', 'Owner', 'Channel', 'Tag' ]);
+
+ // Append datatable to panel
+ $('#' + panelId).append(table.object());
+
+ // Turn into datatable
+ dTable = $('#' + tableId).dataTable({
+ 'iDisplayLength': 50,
+ "bScrollCollapse": true,
+ "sScrollY": "400px",
+ "sScrollX": "110%",
+ "bAutoWidth": true,
+ "oLanguage": {
+ "oPaginate": {
+ "sNext": "",
+ "sPrevious": ""
+ }
+ }
+ });
+ setZfcpDataTable(dTable);
+ }
+
+ if (data) {
+ // Skip index 0 and 1 because it contains nothing
+ var key = "";
+ for ( var i = 2; i < tmp.length; i++) {
+ tmp[i] = jQuery.trim(tmp[i]);
+ var diskAttrs = tmp[i].split(',');
+ var key = hcp + '-' + pool + '-' + diskAttrs[2];
+ dTable.fnAddData( [ '', hcp, pool, diskAttrs[0], diskAttrs[1], diskAttrs[2], diskAttrs[3], diskAttrs[4], diskAttrs[5], diskAttrs[6], diskAttrs[7] ]);
+ }
+ }
+
+ // Create actions menu
+ if (!$('#zFcpResourceActions').length) {
+ // Empty filter area
+ $('#' + tableId + '_length').empty();
+
+ // Add disk to pool
+ var addLnk = $('Add');
+ addLnk.bind('click', function(event){
+ openAddZfcp2PoolDialog();
+ });
+
+ // Delete disk from pool
+ var removeLnk = $('Remove');
+ removeLnk.bind('click', function(event){
+ var disks = getNodesChecked(tableId);
+ openRemoveZfcpFromPoolDialog(disks);
+ });
+
+ // Refresh table
+ var refreshLnk = $('Refresh');
+ refreshLnk.bind('click', function(event){
+ $('#zfcpResource').empty().append(createLoader(''));
+ setZfcpDataTable('');
+
+ // Create a array for hardware control points
+ var hcps = new Array();
+ if ($.cookie('hcp').indexOf(',') > -1)
+ hcps = $.cookie('hcp').split(',');
+ else
+ hcps.push($.cookie('hcp'));
+
+ // Query the disk pools for each
+ for (var i in hcps) {
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'lsvm',
+ tgt : hcps[i],
+ args : '--zfcppoolnames',
+ msg : hcps[i]
+ },
+
+ success : getZfcpPool
+ });
+ }
+ });
+
+ // Add SCSI to system
+ var addScsiLnk = $('Add SCSI');
+ addScsiLnk.bind('click', function(event){
+ openAddScsi2SystemDialog(hcp);
+ });
+
+ // Remove SCSI
+ var removeScsiLnk = $('Remove SCSI');
+ removeScsiLnk.bind('click', function(event){
+ openRemoveScsiDialog(hcp);
+ });
+
+ // Advanced menu
+ var advancedLnk = 'Advanced';
+ var advancedMenu = createMenu([addScsiLnk, removeScsiLnk]);
+
+ // Create action bar
+ var actionBar = $('').css("width", "450px");
+
+ // Create an action menu
+ var actionsMenu = createMenu([addLnk, removeLnk, refreshLnk, [advancedLnk, advancedMenu]]);
+ actionsMenu.superfish();
+ actionsMenu.css('display', 'inline-block');
+ actionBar.append(actionsMenu);
+
+ // Set correct theme for action menu
+ actionsMenu.find('li').hover(function() {
+ setMenu2Theme($(this));
+ }, function() {
+ setMenu2Normal($(this));
+ });
+
+ // Create a division to hold actions menu
+ var menuDiv = $('');
+ $('#' + tableId + '_length').prepend(menuDiv);
+ $('#' + tableId + '_length').css({
+ 'padding': '0px',
+ 'width': '500px'
+ });
+ $('#' + tableId + '_filter').css('padding', '10px');
+ menuDiv.append(actionBar);
+ }
+
+ // Resize accordion
+ $('#zvmResourceAccordion').accordion('resize');
+}
+
+/**
+ * Open dialog to remove disk from pool
+ *
+ * @param disks2remove Disks selected in table
+ */
+function openRemoveDiskFromPoolDialog(disks2remove) {
+ // Create form to delete disk from pool
+ var dialogId = 'zvmDeleteDiskFromPool';
+ var deleteDiskForm = $('');
+
+ // Create info bar
+ var info = createInfoBar('Remove a disk from a disk pool defined in the EXTENT CONTROL.');
+ deleteDiskForm.append(info);
+ var action = $('');
+ var actionSelect = $('');
+ action.append(actionSelect);
+
+ var hcp = $('');
+ var hcpSelect = $('');
+ hcp.append(hcpSelect);
+
+ // Set region input based on those selected on table (if any)
+ var region = $('');
+ var group = $('');
+ deleteDiskForm.append(action, hcp, region, group);
+
+ // Create a array for hardware control points
+ var hcps = new Array();
+ if ($.cookie('hcp').indexOf(',') > -1)
+ hcps = $.cookie('hcp').split(',');
+ else
+ hcps.push($.cookie('hcp'));
+
+ // Append options for hardware control points
+ for (var i in hcps) {
+ hcpSelect.append($(''));
+ }
+
+ actionSelect.change(function() {
+ if ($(this).val() == '1' || $(this).val() == '3') {
+ region.show();
+ group.hide();
+ } else if ($(this).val() == '2') {
+ region.show();
+ group.show();
+ } else if ($(this).val() == '7') {
+ region.val('FOOBAR');
+ region.hide();
+ group.show();
+ }
+ });
+
+ // Open dialog to delete disk
+ deleteDiskForm.dialog({
+ title:'Delete disk from pool',
+ modal: true,
+ close: function(){
+ $(this).remove();
+ },
+ width: 500,
+ buttons: {
+ "Ok": function(){
+ // Remove any warning messages
+ $(this).find('.ui-state-error').remove();
+
+ // Get inputs
+ var action = $(this).find('select[name=action]').val();
+ var hcp = $(this).find('select[name=hcp]').val();
+ var region = $(this).find('input[name=region]').val();
+ var group = $(this).find('input[name=group]').val();
+
+ // If inputs are not complete, show warning message
+ if (!action || !hcp) {
+ var warn = createWarnBar('Please provide a value for each missing field.');
+ warn.prependTo($(this));
+ } else {
+ // Change dialog buttons
+ $(this).dialog('option', 'buttons', {
+ 'Close': function() {$(this).dialog("close");}
+ });
+
+ var args;
+ if (action == '2' || action == '7')
+ args = region + ';' + group;
+ else
+ args = group;
+
+ // Remove disk from pool
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'chvm',
+ tgt : hcp,
+ args : '--removediskfrompool;' + action + ';' + args,
+ msg : dialogId
+ },
+
+ success : updateResourceDialog
+ });
+ }
+ },
+ "Cancel": function() {
+ $(this).dialog( "close" );
+ }
+ }
+ });
+}
+
+/**
+ * Open dialog to add disk to pool
+ */
+function openAddDisk2PoolDialog() {
+ // Create form to add disk to pool
+ var dialogId = 'zvmAddDisk2Pool';
+ var addDiskForm = $('');
+ // Create info bar
+ var info = createInfoBar('Add a disk to a disk pool defined in the EXTENT CONTROL. The disk has to already be attached to SYSTEM.');
+ addDiskForm.append(info);
+ var action = $('');
+ var actionSelect = $('');
+ action.append(actionSelect);
+
+ var hcp = $('');
+ var hcpSelect = $('');
+ hcp.append(hcpSelect);
+ var region = $('');
+ var volume = $('');
+ var group = $('');
+ addDiskForm.append(action, hcp, region, volume, group);
+
+ // Create a array for hardware control points
+ var hcps = new Array();
+ if ($.cookie('hcp').indexOf(',') > -1)
+ hcps = $.cookie('hcp').split(',');
+ else
+ hcps.push($.cookie('hcp'));
+
+ // Append options for hardware control points
+ for (var i in hcps) {
+ hcpSelect.append($(''));
+ }
+
+ actionSelect.change(function() {
+ if ($(this).val() == '4') {
+ volume.show();
+ } else if ($(this).val() == '5') {
+ volume.hide();
+ }
+ });
+
+ // Open dialog to add disk
+ addDiskForm.dialog({
+ title:'Add disk to pool',
+ modal: true,
+ close: function(){
+ $(this).remove();
+ },
+ width: 500,
+ buttons: {
+ "Ok": function(){
+ // Remove any warning messages
+ $(this).find('.ui-state-error').remove();
+
+ // Get inputs
+ var action = $(this).find('select[name=action]').val();
+ var hcp = $(this).find('select[name=hcp]').val();
+ var region = $(this).find('input[name=region]').val();
+ var volume = $(this).find('input[name=volume]').val();
+ var group = $(this).find('input[name=group]').val();
+
+ // If inputs are not complete, show warning message
+ if (!action || !hcp || !region || !group) {
+ var warn = createWarnBar('Please provide a value for each missing field.');
+ warn.prependTo($(this));
+ } else {
+ // Change dialog buttons
+ $(this).dialog('option', 'buttons', {
+ 'Close': function() {$(this).dialog("close");}
+ });
+
+ var args;
+ if (action == '4')
+ args = region + ';' + volume + ';' + group;
+ else
+ args = region + ';' + group;
+
+ // Add disk to pool
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'chvm',
+ tgt : hcp,
+ args : '--adddisk2pool;' + action + ';' + args,
+ msg : dialogId
+ },
+
+ success : updateResourceDialog
+ });
+ }
+ },
+ "Cancel": function() {
+ $(this).dialog( "close" );
+ }
+ }
+ });
+}
+
+/**
+ * Open dialog to remove zFCP from pool
+ *
+ * @param devices2remove Comman separated devices selected in table
+ */
+function openRemoveZfcpFromPoolDialog(devices2remove) {
+ // Create form to delete device from pool
+ var dialogId = 'zvmDeleteZfcpFromPool';
+ var deleteDiskForm = $('');
+
+ // Verify disks are in the same zFCP pool
+ var devices = devices2remove.split(',');
+ var tmp, tgtPool, tgtHcp;
+ var tgtUnitNo = "";
+ for (var i in devices) {
+ tmp = devices[i].split('-');
+
+ if (tgtPool && tmp[1] != tgtPool) {
+ openDialog("warn", "Please select devices in the same zFCP");
+ return;
+ } else {
+ tgtPool = tmp[1];
+ }
+
+ tgtHcp = tmp[0]; // Assume it is just one zHCP. Otherwise, this cannot be done on multiple zHCPs.
+ tgtUnitNo += tmp[2] + ",";
+ }
+
+ // Strip out last comma
+ tgtUnitNo = tgtUnitNo.slice(0, -1);
+
+ // Create info bar
+ var info = createInfoBar('Remove a zFCP device that is defined in a zFCP pool.');
+ deleteDiskForm.append(info);
+
+ var hcp = $('');
+ var hcpSelect = $('');
+ hcp.append(hcpSelect);
+
+ var pool = $('');
+ var unitNo = $('');
+ deleteDiskForm.append(hcp, pool, unitNo);
+
+ // Create a array for hardware control points
+ var hcps = new Array();
+ if ($.cookie('hcp').indexOf(',') > -1) {
+ hcps = $.cookie('hcp').split(',');
+ } else {
+ hcps.push($.cookie('hcp'));
+ }
+
+ // Append options for hardware control points
+ for (var i in hcps) {
+ hcpSelect.append($(''));
+ }
+ hcpSelect.val(tgtHcp);
+
+ // Open dialog to delete device
+ deleteDiskForm.dialog({
+ title:'Delete device from pool',
+ modal: true,
+ close: function(){
+ $(this).remove();
+ },
+ width: 500,
+ buttons: {
+ "Ok": function(){
+ // Remove any warning messages
+ $(this).find('.ui-state-error').remove();
+
+ var hcp = $(this).find('select[name=hcp]').val();
+ var pool = $(this).find('input[name=zfcpPool]').val();
+ var unitNo = $(this).find('input[name=unitNo]').val();
+
+ // If inputs are not complete, show warning message
+ if (!hcp || !pool || !unitNo) {
+ var warn = createWarnBar('Please provide a value for each missing field.');
+ warn.prependTo($(this));
+ } else {
+ // Change dialog buttons
+ $(this).dialog('option', 'buttons', {
+ 'Close': function() {$(this).dialog("close");}
+ });
+
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'chvm',
+ tgt : hcp,
+ args : '--removezfcpfrompool;' + pool + ';' + unitNo,
+ msg : dialogId
+ },
+
+ success : updateResourceDialog
+ });
+ }
+ },
+ "Cancel": function() {
+ $(this).dialog( "close" );
+ }
+ }
+ });
+}
+
+/**
+ * Open dialog to add zFCP to pool
+ */
+function openAddZfcp2PoolDialog() {
+ // Create form to add disk to pool
+ var dialogId = 'zvmAddDisk2Pool';
+ var addDiskForm = $('');
+ var info = createInfoBar('Add a device to a zFCP pool defined in xCAT.');
+ addDiskForm.append(info);
+
+ var hcp = $('');
+ var hcpSelect = $('');
+ hcp.append(hcpSelect);
+
+ var pool = $('');
+ var status = $('');
+ var portName = $('');
+ var unitNo = $('');
+ var size = $('');
+ var range = $('');
+ var owner = $('');
+ addDiskForm.append(hcp, pool, status, portName, unitNo, size, range, owner);
+
+ // Create a array for hardware control points
+ var hcps = new Array();
+ if ($.cookie('hcp').indexOf(',') > -1) {
+ hcps = $.cookie('hcp').split(',');
+ } else {
+ hcps.push($.cookie('hcp'));
+ }
+
+ hcpSelect.append($(''));
+ for (var i in hcps) {
+ hcpSelect.append($(''));
+ }
+
+ // Open dialog to add disk
+ addDiskForm.dialog({
+ title:'Add device to pool',
+ modal: true,
+ close: function(){
+ $(this).remove();
+ },
+ width: 500,
+ buttons: {
+ "Ok": function(){
+ // Delete any warning messages
+ $(this).find('.ui-state-error').remove();
+
+ var tgtHcp = $(this).find('select[name=hcp]').val();
+ var tgtPool = $(this).find('input[name=zfcpPool]').val();
+ var tgtStatus = $(this).find('select[name=zfcpStatus]').val();
+ var tgtPortName = $(this).find('input[name=zfcpPortName]').val();
+ var tgtUnitNo = $(this).find('input[name=zfcpUnitNo]').val();
+ var tgtSize = $(this).find('input[name=zfcpSize]').val();
+ var tgtRange = $(this).find('input[name=zfcpRange]').val();
+
+ // Device owner is optional
+ var tgtOwner = "";
+ if ($(this).find('input[name=zfcpOwner]').val()) {
+ tgtOwner = $(this).find('input[name=zfcpOwner]').val();
+ }
+
+ // If inputs are not complete, show warning message
+ if (!tgtHcp || !tgtPool || !tgtStatus || !tgtPortName || !tgtUnitNo || !tgtSize) {
+ var warn = createWarnBar('Please provide a value for each missing field.');
+ warn.prependTo($(this));
+ } else {
+ // Change dialog buttons
+ $(this).dialog('option', 'buttons', {
+ 'Close': function() {$(this).dialog("close");}
+ });
+
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'chvm',
+ tgt : tgtHcp,
+ args : '--addzfcp2pool|' + tgtPool + '|' + tgtStatus + '|"' + tgtPortName + '"|' + tgtUnitNo + '|' + tgtSize + "| " + tgtRange + '|' + tgtOwner,
+ msg : dialogId
+ },
+
+ success : updateResourceDialog
+ });
+ }
+ },
+ "Cancel": function() {
+ $(this).dialog( "close" );
+ }
+ }
+ });
+}
+
+/**
+ * Update resource dialog
+ *
+ * @param data HTTP request data
+ */
+function updateResourceDialog(data) {
+ var dialogId = data.msg;
+ var infoMsg;
+
+ // Create info message
+ if (jQuery.isArray(data.rsp)) {
+ infoMsg = '';
+ for (var i in data.rsp) {
+ infoMsg += data.rsp[i] + '';
+ }
+ } else {
+ infoMsg = data.rsp;
+ }
+
+ // Create info bar with close button
+ var infoBar = $('').css('margin', '5px 0px');
+ var icon = $('').css({
+ 'display': 'inline-block',
+ 'margin': '10px 5px'
+ });
+
+ // Create close button to close info bar
+ var close = $('').css({
+ 'display': 'inline-block',
+ 'float': 'right'
+ }).click(function() {
+ $(this).parent().remove();
+ });
+
+ var msg = $('
' + infoMsg + '
').css({
+ 'display': 'inline-block',
+ 'width': '90%'
+ });
+
+ infoBar.append(icon, msg, close);
+ infoBar.prependTo($('#' + dialogId));
+}
+
+/**
+ * Select all checkboxes in the datatable
+ *
+ * @param event Event on element
+ * @param obj Object triggering event
+ */
+function selectAllDisk(event, obj) {
+ // This will ascend from
+ var tableObj = obj.parents('.datatable');
+ var status = obj.attr('checked');
+ tableObj.find(' :checkbox').attr('checked', status);
+
+ // Handle datatable scroll
+ tableObj = obj.parents('.dataTables_scroll');
+ if (tableObj.length) {
+ tableObj.find(' :checkbox').attr('checked', status);
+ }
+
+ event.stopPropagation();
+}
+
+/**
+ * Load network details into a table
+ *
+ * @param data HTTP request data
+ */
+function loadNetworkTable(data) {
+ // Remove loader
+ var panelId = 'zvmNetworkResource';
+ $('#' + panelId).find('img[src="images/loader.gif"]').remove();
+
+ var args = data.msg.split(';');
+ var hcp = args[0].replace('hcp=', '');
+ var type = args[1].replace('type=', '');
+ var name = args[2].replace('network=', '');
+ var tmp = data.rsp[0].split(hcp + ': ');
+
+ // Resource tab ID
+ var info = $('#' + panelId).find('.ui-state-highlight');
+ // If there is no info bar
+ if (!info.length) {
+ // Create info bar
+ info = createInfoBar('Below are LANs/VSWITCHes available to use.');
+ $('#' + panelId).append(info);
+ }
+
+ // Get datatable
+ var dTable = getNetworkDataTable();
+ if (!dTable) {
+ // Create table
+ var tableId = 'zNetworkDataTable';
+ var table = new DataTable(tableId);
+ table.init( [ '', 'HCP', 'Type', 'Name', 'Details' ]);
+
+ // Append datatable to tab
+ $('#' + panelId).append(table.object());
+
+ // Turn into datatable
+ dTable = $('#' + tableId).dataTable({
+ 'iDisplayLength': 50,
+ "bScrollCollapse": true,
+ "sScrollY": "400px",
+ "sScrollX": "110%",
+ "bAutoWidth": true,
+ "oLanguage": {
+ "oPaginate": {
+ "sNext": "",
+ "sPrevious": ""
+ }
+ }
+ });
+ setNetworkDataTable(dTable);
+
+ // Set the column width
+ var cols = table.object().find('thead tr th');
+ cols.eq(0).css('width', '20px'); // HCP column
+ cols.eq(1).css('width', '20px'); // Type column
+ cols.eq(2).css('width', '20px'); // Name column
+ cols.eq(3).css({'width': '600px'}); // Details column
+ }
+
+ // Skip index 0 because it contains nothing
+ var details = '
';
+ for ( var i = 1; i < tmp.length; i++) {
+ details += tmp[i];
+ }
+ details += '
';
+
+ dTable.fnAddData([ '', '
' + hcp + '
', '
' + type + '
', '
' + name + '
', details ]);
+
+ // Create actions menu
+ if (!$('#networkResourceActions').length) {
+ // Empty filter area
+ $('#' + tableId + '_length').empty();
+
+ // Add Vswitch/Vlan
+ var addLnk = $('Add');
+ addLnk.bind('click', function(event){
+ openAddVswitchVlanDialog();
+ });
+
+ // Remove Vswitch/Vlan
+ var removeLnk = $('Remove');
+ removeLnk.bind('click', function(event){
+ var networkList = getNodesChecked(tableId).split(',');
+ if (networkList) {
+ openRemoveVswitchVlanDialog(networkList);
+ }
+ });
+
+ // Refresh table
+ var refreshLnk = $('Refresh');
+ refreshLnk.bind('click', function(event){
+ $('#zvmNetworkResource').empty().append(createLoader(''));
+ setNetworkDataTable('');
+
+ // Create a array for hardware control points
+ var hcps = new Array();
+ if ($.cookie('hcp').indexOf(',') > -1)
+ hcps = $.cookie('hcp').split(',');
+ else
+ hcps.push($.cookie('hcp'));
+
+ // Query networks
+ for (var i in hcps) {
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'lsvm',
+ tgt : hcps[i],
+ args : '--getnetworknames',
+ msg : hcps[i]
+ },
+
+ success : getNetwork
+ });
+ }
+ });
+
+ // Create action bar
+ var actionBar = $('').css("width", "450px");
+
+ // Create an action menu
+ var actionsMenu = createMenu([addLnk, removeLnk, refreshLnk]);
+ actionsMenu.superfish();
+ actionsMenu.css('display', 'inline-block');
+ actionBar.append(actionsMenu);
+
+ // Set correct theme for action menu
+ actionsMenu.find('li').hover(function() {
+ setMenu2Theme($(this));
+ }, function() {
+ setMenu2Normal($(this));
+ });
+
+ // Create a division to hold actions menu
+ var menuDiv = $('');
+ $('#' + tableId + '_length').prepend(menuDiv);
+ $('#' + tableId + '_length').css({
+ 'padding': '0px',
+ 'width': '500px'
+ });
+ $('#' + tableId + '_filter').css('padding', '10px');
+ menuDiv.append(actionBar);
+ }
+
+ // Resize accordion
+ $('#zvmResourceAccordion').accordion('resize');
+}
+
+/**
+ * Connect a NIC to a Guest LAN
+ *
+ * @param data Data from HTTP request
+ */
+function connect2GuestLan(data) {
+ var rsp = data.rsp;
+ var args = data.msg.split(';');
+ var node = args[0].replace('node=', '');
+ var address = args[1].replace('addr=', '');
+ var lanName = args[2].replace('lan=', '');
+ var lanOwner = args[3].replace('owner=', '');
+
+ // Write ajax response to status bar
+ var prg = writeRsp(rsp, node + ': ');
+ $('#' + node + 'StatusBar').find('div').append(prg);
+
+ // Connect NIC to Guest LAN
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'chvm',
+ tgt : node,
+ args : '--connectnic2guestlan;' + address + ';' + lanName + ';'
+ + lanOwner,
+ msg : node
+ },
+
+ success : updateZNodeStatus
+ });
+}
+
+/**
+ * Connect a NIC to a VSwitch
+ *
+ * @param data Data from HTTP request
+ */
+function connect2VSwitch(data) {
+ var rsp = data.rsp;
+ var args = data.msg.split(';');
+ var node = args[0].replace('node=', '');
+ var address = args[1].replace('addr=', '');
+ var vswitchName = args[2].replace('vsw=', '');
+
+ // Write ajax response to status bar
+ var prg = writeRsp(rsp, node + ': ');
+ $('#' + node + 'StatusBar').find('div').append(prg);
+
+ // Connect NIC to VSwitch
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'chvm',
+ tgt : node,
+ args : '--connectnic2vswitch;' + address + ';' + vswitchName,
+ msg : node
+ },
+
+ success : updateZNodeStatus
+ });
+}
+
+/**
+ * Create provision existing node division
+ *
+ * @param inst Provision tab instance
+ * @return Provision existing node division
+ */
+function createZProvisionExisting(inst) {
+ // Create provision existing and hide it
+ var provExisting = $('').hide();
+
+ var vmFS = $('');
+ var vmLegend = $('');
+ vmFS.append(vmLegend);
+ provExisting.append(vmFS);
+
+ var vmAttr = $('');
+ vmFS.append($(''));
+ vmFS.append(vmAttr);
+
+ var osFS = $('');
+ var osLegend = $('');
+ osFS.append(osLegend);
+ provExisting.append(osFS);
+
+ var osAttr = $('');
+ osFS.append($(''));
+ osFS.append(osAttr);
+
+ // Create group input
+ var group = $('');
+ var groupLabel = $('');
+ group.append(groupLabel);
+
+ // Turn on auto complete for group
+ var groupNames = $.cookie('groups');
+ if (groupNames) {
+ // Split group names into an array
+ var tmp = groupNames.split(',');
+
+ // Create drop down for groups
+ var groupSelect = $('');
+ groupSelect.append('');
+ for (var i in tmp) {
+ // Add group into drop down
+ var opt = $('');
+ groupSelect.append(opt);
+ }
+ group.append(groupSelect);
+
+ // Create node datatable
+ groupSelect.change(function(){
+ // Get group selected
+ var thisGroup = $(this).val();
+ // If a valid group is selected
+ if (thisGroup) {
+ createNodesDatatable(thisGroup, 'zNodesDatatableDIV' + inst);
+ }
+ });
+ } else {
+ // If no groups are cookied
+ var groupInput = $('');
+ group.append(groupInput);
+ }
+ vmAttr.append(group);
+
+ // Create node input
+ var node = $('');
+ var nodeLabel = $('');
+ var nodeDatatable = $('
Select a group to view its nodes
');
+ node.append(nodeLabel);
+ node.append(nodeDatatable);
+ vmAttr.append(node);
+
+ // Create operating system image input
+ var os = $('');
+ var osLabel = $('');
+ var osSelect = $('');
+ osSelect.append($(''));
+
+ var imageNames = $.cookie('imagenames').split(',');
+ if (imageNames) {
+ imageNames.sort();
+ for (var i in imageNames) {
+ osSelect.append($(''));
+ }
+ }
+ os.append(osLabel);
+ os.append(osSelect);
+ osAttr.append(os);
+
+ // Create boot method drop down
+ var bootMethod = $('');
+ var methoddLabel = $('');
+ var methodSelect = $('');
+ methodSelect.append(''
+ + ''
+ + ''
+ + ''
+ + ''
+ );
+ bootMethod.append(methoddLabel);
+ bootMethod.append(methodSelect);
+ osAttr.append(bootMethod);
+
+ // Generate tooltips
+ provExisting.find('div input[title]').tooltip({
+ position: "center right",
+ offset: [-2, 10],
+ effect: "fade",
+ opacity: 0.7,
+ predelay: 800,
+ events: {
+ def: "mouseover,mouseout",
+ input: "mouseover,mouseout",
+ widget: "focus mouseover,blur mouseout",
+ tooltip: "mouseover,mouseout"
+ }
+ });
+
+ /**
+ * Provision existing
+ */
+ var provisionBtn = createButton('Provision');
+ provisionBtn.bind('click', function(event) {
+ // Remove any warning messages
+ $(this).parent().parent().find('.ui-state-error').remove();
+
+ var ready = true;
+ var errMsg = '';
+
+ // Get provision tab ID
+ var thisTabId = $(this).parent().parent().parent().attr('id');
+ // Get provision tab instance
+ var inst = thisTabId.replace('zvmProvisionTab', '');
+
+ // Get nodes that were checked
+ var dTableId = 'zNodesDatatable' + inst;
+ var tgts = getNodesChecked(dTableId);
+ if (!tgts) {
+ errMsg += 'You need to select a node. ';
+ ready = false;
+ }
+
+ // Check operating system image
+ var os = $('#' + thisTabId + ' select[name=os]:visible');
+ if (!os.val()) {
+ errMsg += 'You need to select a operating system image.';
+ os.css('border', 'solid #FF0000 1px');
+ ready = false;
+ } else {
+ os.css('border', 'solid #BDBDBD 1px');
+ }
+
+ // If all inputs are valid, ready to provision
+ if (ready) {
+ // Disable provision button
+ $(this).attr('disabled', 'true');
+
+ // Show loader
+ $('#zProvisionStatBar' + inst).show();
+ $('#zProvisionLoader' + inst).show();
+
+ // Disable all inputs
+ var inputs = $('#' + thisTabId + ' input:visible');
+ inputs.attr('disabled', 'disabled');
+
+ // Disable all selects
+ var selects = $('#' + thisTabId + ' select');
+ selects.attr('disabled', 'disabled');
+
+ // Get operating system image
+ var osImage = $('#' + thisTabId + ' select[name=os]:visible').val();
+ var tmp = osImage.split('-');
+ var os = tmp[0];
+ var arch = tmp[1];
+ var profile = tmp[3];
+
+ /**
+ * (1) Set operating system
+ */
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'nodeadd',
+ tgt : '',
+ args : tgts + ';noderes.netboot=zvm;nodetype.os=' + os + ';nodetype.arch=' + arch + ';nodetype.profile=' + profile,
+ msg : 'cmd=nodeadd;out=' + inst
+ },
+
+ success : updateZProvisionExistingStatus
+ });
+ } else {
+ // Show warning message
+ var warn = createWarnBar(errMsg);
+ warn.prependTo($(this).parent().parent());
+ }
+ });
+ provExisting.append(provisionBtn);
+
+ return provExisting;
+}
+
+/**
+ * Create provision new node division
+ *
+ * @param inst Provision tab instance
+ * @return Provision new node division
+ */
+function createZProvisionNew(inst) {
+ // Create provision new node division
+ var provNew = $('');
+
+ // Create VM fieldset
+ var vmFS = $('');
+ var vmLegend = $('');
+ vmFS.append(vmLegend);
+ provNew.append(vmFS);
+
+ var vmAttr = $('');
+ vmFS.append($(''));
+ vmFS.append(vmAttr);
+
+ // Create OS fieldset
+ var osFS = $('');
+ var osLegend = $('');
+ osFS.append(osLegend);
+ provNew.append(osFS);
+
+ // Create hardware fieldset
+ var hwFS = $('');
+ var hwLegend = $('');
+ hwFS.append(hwLegend);
+ provNew.append(hwFS);
+
+ var hwAttr = $('');
+ hwFS.append($(''));
+ hwFS.append(hwAttr);
+
+ var osAttr = $('');
+ osFS.append($(''));
+ osFS.append(osAttr);
+
+ // Create group input
+ var group = $('');
+ var groupLabel = $('');
+ var groupInput = $('');
+ // Get groups on-focus
+ groupInput.one('focus', function(){
+ var groupNames = $.cookie('groups');
+ if (groupNames) {
+ // Turn on auto complete
+ $(this).autocomplete({
+ source: groupNames.split(',')
+ });
+ }
+ });
+ group.append(groupLabel);
+ group.append(groupInput);
+ vmAttr.append(group);
+
+ // Create node input
+ var nodeName = $('');
+ var nodeLabel = $('');
+ var nodeInput = $('');
+ nodeName.append(nodeLabel);
+ nodeName.append(nodeInput);
+ vmAttr.append(nodeName);
+
+ // Create user ID input
+ var userId = $('');
+ vmAttr.append(userId);
+
+ // Create hardware control point input
+ var hcpDiv = $('');
+ var hcpLabel = $('');
+ var hcpInput = $('');
+ hcpInput.blur(function() {
+ if ($(this).val()) {
+ var args = $(this).val().split('.');
+ if (!$.cookie(args[0] + 'diskpools')) {
+ // Get disk pools
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'lsvm',
+ tgt : args[0],
+ args : '--diskpoolnames',
+ msg : args[0]
+ },
+
+ success : setDiskPoolCookies
+ });
+ }
+
+ if (!$.cookie(args[0] + 'zfcppools')) {
+ // Get zFCP pools
+ $.ajax( {
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'lsvm',
+ tgt : args[0],
+ args : '--zfcppoolnames',
+ msg : args[0]
+ },
+
+ success : setZfcpPoolCookies
+ });
+ }
+ }
+ });
+ hcpDiv.append(hcpLabel);
+ hcpDiv.append(hcpInput);
+ vmAttr.append(hcpDiv);
+
+ // Create an advanced link to set IP address and hostname
+ var advancedLnk = $('');
+ vmAttr.append(advancedLnk);
+ var advanced = $('').hide();
+ vmAttr.append(advanced);
+
+ var ip = $('');
+ advanced.append(ip);
+ var hostname = $('');
+ advanced.append(hostname);
+
+ // Show IP address and hostname inputs on-click
+ advancedLnk.click(function() {
+ advanced.toggle();
+ });
+
+ // Create operating system image input
+ var os = $('');
+ var osLabel = $('');
+ var osSelect = $('');
+ osSelect.append($(''));
+
+ var imageNames = $.cookie('imagenames').split(',');
+ if (imageNames) {
+ imageNames.sort();
+ for (var i in imageNames) {
+ osSelect.append($(''));
+ }
+ }
+ os.append(osLabel);
+ os.append(osSelect);
+ osAttr.append(os);
+
+ // Create user entry input
+ var defaultChkbox = $('').click(function() {
+ // Remove any warning messages
+ $(this).parents('.form').find('.ui-state-error').remove();
+
+ // Get tab ID
+ var thisTabId = $(this).parents('.ui-tabs-panel').attr('id');
+
+ // Get objects for HCP, user ID, and OS
+ var userId = $('#' + thisTabId + ' input[name=userId]');
+ var os = $('#' + thisTabId + ' select[name=os]');
+
+ // Get default user entry when clicked
+ if ($(this).attr('checked')) {
+ if (!os.val() || !userId.val()) {
+ // Show warning message
+ var warn = createWarnBar('Please specify the operating system and user ID before checking this box');
+ warn.prependTo($(this).parents('.form'));
+
+ // Highlight empty fields
+ jQuery.each([os, userId], function() {
+ if (!$(this).val()) {
+ $(this).css('border', 'solid #FF0000 1px');
+ }
+ });
+ } else {
+ // Un-highlight empty fields
+ jQuery.each([os, userId], function() {
+ $(this).css('border', 'solid #BDBDBD 1px');
+ });
+
+ // Get profile name
+ var tmp = os.val().split('-');
+ var profile = tmp[3];
+
+ $.ajax({
+ url : 'lib/cmd.php',
+ dataType : 'json',
+ data : {
+ cmd : 'webrun',
+ tgt : '',
+ args : 'getdefaultuserentry;' + profile,
+ msg : thisTabId
+ },
+
+ success:function(data) {
+ // Populate user entry
+ var tabId = data.msg;
+ var entry = new String(data.rsp);
+ var userId = $('#' + tabId + ' input[name=userId]').val();
+ entry = entry.replace(new RegExp('LXUSR', 'g'), userId);
+ $('#' + tabId + ' textarea:visible').val(entry);
+ }
+ });
+ }
+ } else {
+ $('#' + thisTabId + ' textarea:visible').val('');
+
+ // Un-highlight empty fields
+ jQuery.each([os, userId], function() {
+ $(this).css('border', 'solid #BDBDBD 1px');
+ });
+ }
+ });
+ var userEntry = $('');
+ userEntry.append($('').append(defaultChkbox, 'Use default'));
+ hwAttr.append(userEntry);
+
+ // Create disk table
+ var diskDiv = $('');
+ var diskLabel = $('');
+ var diskTable = $('
');
+ var diskHeader = $('
Type
Address
Size
Mode
Pool
Password
');
+ // Adjust header width
+ diskHeader.find('th').css( {
+ 'width' : '80px'
+ });
+ diskHeader.find('th').eq(0).css( {
+ 'width' : '20px'
+ });
+ var diskBody = $('');
+ var diskFooter = $('');
+
+ /**
+ * Add disks
+ */
+ var addDiskLink = $('Add disk');
+ addDiskLink.bind('click', function(event) {
+ // Get list of disk pools
+ var thisTabId = $(this).parents('.tab').attr('id');
+ var thisHcp = $('#' + thisTabId + ' input[name=hcp]').val();
+ var definedPools = null;
+ if (thisHcp) {
+ // Get node without domain name
+ var temp = thisHcp.split('.');
+ definedPools = $.cookie(temp[0] + 'diskpools').split(',');
+ }
+
+ // Create a row
+ var diskRow = $('
');
+
+ // Add remove button
+ var removeBtn = $('');
+ var col = $('
').append(removeBtn);
+ removeBtn.bind('click', function(event) {
+ diskRow.remove();
+ });
+ diskRow.append(col);
+
+ // Create disk type drop down
+ var diskType = $('
');
+ var diskTypeSelect = $('');
+ diskTypeSelect.append(''
+ + ''
+ );
+ diskType.append(diskTypeSelect);
+ diskRow.append(diskType);
+
+ // Create disk address input
+ var diskAddr = $('
');
+ diskRow.append(diskAddr);
+
+ // Create disk size input
+ var diskSize = $('
');
+ diskRow.append(diskSize);
+
+ // Create disk mode input
+ var diskMode = $('
');
+ var diskModeSelect = $('');
+ diskModeSelect.append(''
+ + ''
+ + ''
+ + ''
+ + ''
+ + ''
+ + ''
+ );
+ diskMode.append(diskModeSelect);
+ diskRow.append(diskMode);
+
+ // Create disk pool drop down
+ var diskPool = $('
');
+ var diskPoolSelect = $('');
+ for (var i in definedPools) {
+ diskPoolSelect.append('');
+ }
+ diskPool.append(diskPoolSelect);
+ diskRow.append(diskPool);
+
+ // Create disk password input
+ var diskPw = $('
');
+ zfcpRow.append(zfcpAddr);
+
+ // Create disk size input
+ var zfcpSize = $('
');
+ zfcpRow.append(zfcpSize);
+
+ // Create zFCP pool drop down
+ var zfcpPool = $('
');
+ var zfcpPoolSelect = $('');
+ for (var i in definedPools) {
+ zfcpPoolSelect.append('');
+ }
+ zfcpPool.append(zfcpPoolSelect);
+ zfcpRow.append(zfcpPool);
+
+ // Create disk tag
+ var zfcpTag = $('
');
+ zfcpRow.append(zfcpTag);
+
+ // Create device port name
+ var zfcpPortName = $('
');
+ zfcpRow.append(zfcpPortName);
+
+ // Create device unit number
+ var zfcpUnitNo = $('
'));
- monTableBody.append(pcpMon);
-
// Do not word wrap
monTableBody.find('td:nth-child(1)').css('white-space', 'nowrap');
monTableBody.find('td:nth-child(3)').css({
@@ -166,85 +159,7 @@ function loadMonitorPage() {
loadMonitorTab($(this).attr('name'));
});
}
- });
-
- // Create resources tab
- var resrcForm = $('');
-
- // Create info bar
- var resrcInfoBar = createInfoBar('Select a platform to view its current resources.');
- resrcForm.append(resrcInfoBar);
-
- // Create radio buttons for platforms
- var hwList = $('Platforms available:');
- var esx = $('
ESX
');
- var kvm = $('
KVM
');
- var zvm = $('
z\/VM
');
- var ipmi = $('
iDataPlex
');
- var blade = $('
BladeCenter
');
- var hmc = $('
System p
');
-
- hwList.append(esx);
- hwList.append(kvm);
- hwList.append(zvm);
- hwList.append(blade);
- hwList.append(ipmi);
- hwList.append(hmc);
-
- resrcForm.append(hwList);
-
- var okBtn = createButton('Ok');
- okBtn.bind('click', function(event) {
- // Get hardware that was selected
- var hw = $(this).parent().find('input[name="hw"]:checked').val();
-
- // Generate new tab ID
- var newTabId = hw + 'ResourceTab';
- if (!$('#' + newTabId).length) {
- // Create loader
- var loader = $('
').append(createLoader(hw + 'ResourceLoader'));
-
- // Create an instance of the plugin
- var plugin = null;
- var displayName = "";
- switch (hw) {
- case "kvm":
- plugin = new kvmPlugin();
- displayName = "KVM";
- break;
- case "esx":
- plugin = new esxPlugin();
- displayName = "ESX";
- break;
- case "blade":
- plugin = new bladePlugin();
- displayName = "BladeCenter";
- break;
- case "hmc":
- plugin = new hmcPlugin();
- displayName = "System p";
- break;
- case "ipmi":
- plugin = new ipmiPlugin();
- displayName = "iDataPlex";
- break;
- case "zvm":
- plugin = new zvmPlugin();
- displayName = "z\/VM";
- break;
- }
-
- // Add resource tab and load resources
- tab.add(newTabId, displayName, loader, true);
- plugin.loadResources();
- }
-
- // Select tab
- tab.select(newTabId);
- });
-
- resrcForm.append(okBtn);
- tab.add('resourceTab', 'Resources', resrcForm, false);
+ });
}
/**
@@ -277,9 +192,6 @@ function loadMonitorTab(name) {
tab.add(name, 'RMC Event', '', true);
loadRmcEvent();
break;
- case 'pcpmon':
- loadUnfinish(name, tab);
- break;
}
tab.select(name);
diff --git a/xCAT-UI/js/monitor/rmcmon.js b/xCAT-UI/js/monitor/rmcmon.js
index 82c620ec8..932b9544d 100644
--- a/xCAT-UI/js/monitor/rmcmon.js
+++ b/xCAT-UI/js/monitor/rmcmon.js
@@ -617,11 +617,19 @@ function showEventLog(data) {
}
eventDiv.append(eventTable.object());
- $('#lsEventTable').dataTable({
- 'iDisplayLength' : 50,
- 'bLengthChange' : false,
- "sScrollX" : "100%",
- "bAutoWidth" : true
+ $('#lsEventTable').dataTable({
+ 'iDisplayLength': 50,
+ 'bLengthChange': false,
+ "bScrollCollapse": true,
+ "sScrollY": "400px",
+ "sScrollX": "110%",
+ "bAutoWidth": true,
+ "oLanguage": {
+ "oPaginate": {
+ "sNext": "",
+ "sPrevious": ""
+ }
+ }
});
// Add the configure button
diff --git a/xCAT-UI/js/monitor/xcatmon.js b/xCAT-UI/js/monitor/xcatmon.js
index d34787e36..8458b393c 100644
--- a/xCAT-UI/js/monitor/xcatmon.js
+++ b/xCAT-UI/js/monitor/xcatmon.js
@@ -28,6 +28,9 @@ function loadXcatMon() {
function loadXcatMonSetting(data) {
var apps = ""; // Contains the xcatmon config
var rsp = data.rsp;
+ if (!rsp.length)
+ return;
+
var apps_flag = 0;
var ping; // xcatmon ping interval
var ping_flag = 0;
@@ -196,10 +199,18 @@ function loadXcatMonSetting(data) {
// Save datatable
dTable = $('#' + xcatMonTableId).dataTable({
- 'iDisplayLength' : 50,
- 'bLengthChange' : false,
- "sScrollX" : "100%",
- "bAutoWidth" : true
+ 'iDisplayLength': 50,
+ 'bLengthChange': false,
+ "bScrollCollapse": true,
+ "sScrollY": "400px",
+ "sScrollX": "110%",
+ "bAutoWidth": true,
+ "oLanguage": {
+ "oPaginate": {
+ "sNext": "",
+ "sPrevious": ""
+ }
+ }
});
// Create action bar
diff --git a/xCAT-UI/js/nodes/nodes.js b/xCAT-UI/js/nodes/nodes.js
index 8543705bc..074d5d520 100644
--- a/xCAT-UI/js/nodes/nodes.js
+++ b/xCAT-UI/js/nodes/nodes.js
@@ -349,7 +349,7 @@ function drawNodesArea(targetgroup, cmdargs, message){
*/
function mkAddNodeLink() {
// Create link to add nodes
- var addNodeLink = $('+ Add Node');
+ var addNodeLink = $('+ Add node');
addNodeLink.click(function() {
// Create info bar
var info = createInfoBar('Select the hardware management for the new node range');
@@ -357,8 +357,8 @@ function mkAddNodeLink() {
// Create form to add node
var addNodeForm = $('');
addNodeForm.append(info);
- addNodeForm.append('