/**
* Global variables
*/
var topPriority = 0;
/**
* Load the service portal's provision page
*
* @param tabId Tab ID where page will reside
*/
function loadServicePage(tabId) {
// Create info bar
var infoBar = createInfoBar('Select a platform to configure, then click Ok.');
// Create self-service portal page
var tabId = 'serviceTab';
var servicePg = $('
');
$('#' + tabId).append(infoBar, servicePg);
// Create radio buttons for platforms
var hwList = $('Platforms available:');
var esx = $('
ESX
');
var kvm = $('
KVM
');
var zvm = $('
z\/VM
');
hwList.append(esx);
hwList.append(kvm);
hwList.append(zvm);
servicePg.append(hwList);
/**
* Ok
*/
var okBtn = createButton('Ok');
okBtn.bind('click', function(event) {
var configTabs = getConfigTab();
// Get hardware that was selected
var hw = $(this).parent().find('input[name="hw"]:checked').val();
var newTabId = hw + 'ProvisionTab';
if ($('#' + newTabId).size() > 0){
configTabs.select(newTabId);
} else {
var title = '';
// Create an instance of the plugin
var plugin = null;
switch (hw) {
case "kvm":
plugin = new kvmPlugin();
title = 'KVM';
break;
case "esx":
plugin = new esxPlugin();
title = 'ESX';
break;
case "zvm":
plugin = new zvmPlugin();
title = 'z/VM';
// Get zVM host names
if (!$.cookie('srv_zvm')){
$.ajax( {
url : 'lib/srv_cmd.php',
dataType : 'json',
data : {
cmd : 'webportal',
tgt : '',
args : 'lszvm',
msg : ''
},
success : function(data) {
setzVMCookies(data);
}
});
}
break;
}
// Select tab
configTabs.add(newTabId, title, '', true);
configTabs.select(newTabId);
plugin.loadConfigPage(newTabId);
}
});
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 = 'userDatatable';
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 = $('');
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 = tmp[8].replace('max-vm:', '');
maxVM = maxVM.replace(';', '');
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
*
* @param value Floating point
* @param precision Decimal precision
* @returns Floating point number
*/
function toFixed(value, precision) {
var power = Math.pow(10, precision || 0);
return String(Math.round(value * power) / power);
}