/**
* Global variables
*/
var diskDatatable; // zVM datatable containing disks
var zfcpDatatable; // zVM datatable containing zFCP devices
var networkDatatable; // zVM datatable containing networks
/**
* Get the disk datatable
*
* @return Data table object
*/
function getDiskDataTable() {
return diskDatatable;
}
/**
* Set the disk datatable
*
* @param table Data table object
*/
function setDiskDataTable(table) {
diskDatatable = table;
}
/**
* Get the zFCP datatable
*
* @return Data table object
*/
function getZfcpDataTable() {
return zfcpDatatable;
}
/**
* Set the zFCP datatable
*
* @param table Data table object
*/
function setZfcpDataTable(table) {
zfcpDatatable = table;
}
/**
* Get the network datatable
*
* @return Data table object
*/
function getNetworkDataTable() {
return networkDatatable;
}
/**
* Set the network datatable
*
* @param table Data table object
*/
function setNetworkDataTable(table) {
networkDatatable = table;
}
/**
* Load HCP specific info
*
* @param data Data from HTTP request
*/
function loadHcpInfo(data) {
var args = data.msg.split(';');
// Get group
var group = args[0].replace('group=', '');
// Get hardware control point
var hcp = args[1].replace('hcp=', '');
// Get user directory entry
var userEntry = data.rsp;
if (!userEntry.length)
return;
if (userEntry[0].indexOf('Failed') < 0) {
if (hcp) {
// If there is no cookie for the disk pool names
if (!$.cookie(hcp + 'diskpools')) {
// Get disk pools
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'lsvm',
tgt : hcp,
args : '--diskpoolnames',
msg : hcp
},
success : setDiskPoolCookies
});
}
// If there is no cookie for the zFCP pool names
if (!$.cookie(hcp + 'zfcppools')) {
// Get disk pools
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'lsvm',
tgt : hcp,
args : '--zfcppoolnames',
msg : hcp
},
success : setZfcpPoolCookies
});
}
// If there is no cookie for the network names
if (!$.cookie(hcp + 'networks')) {
// Get network names
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'lsvm',
tgt : hcp,
args : '--getnetworknames',
msg : hcp
},
success : setNetworkCookies
});
}
} // End of if (hcp)
} else {
// Create warning dialog
var warning = createWarnBar('z/VM SMAPI is not responding to ' + hcp + '. It needs to be reset.');
var warnDialog = $('
').append(warning);
// Open dialog
warnDialog.dialog({
title:'Warning',
modal: true,
close: function(){
$(this).remove();
},
width: 400,
buttons: {
"Ok": function() {
$(this).dialog("close");
}
}
});
}
}
/**
* Load user entry of a given node
*
* @param data Data from HTTP request
*/
function loadUserEntry(data) {
var args = data.msg.split(';');
// Get tab ID
var ueDivId = args[0].replace('out=', '');
// Get node
var node = args[1].replace('node=', '');
// Get user directory entry
var userEntry = data.rsp[0].split(node + ':');
// Remove loader
$('#' + node + 'TabLoader').remove();
var toggleLinkId = node + 'ToggleLink';
$('#' + toggleLinkId).click(function() {
// Get text within this link
var lnkText = $(this).text();
// Toggle user entry division
$('#' + node + 'UserEntry').toggle();
// Toggle inventory division
$('#' + node + 'Inventory').toggle();
// Change text
if (lnkText == 'Show directory entry') {
$(this).text('Show inventory');
} else {
$(this).text('Show directory entry');
}
});
// Put user entry into a list
var fieldSet = $('');
var legend = $('');
fieldSet.append(legend);
var txtArea = $('');
for ( var i = 1; i < userEntry.length; i++) {
userEntry[i] = jQuery.trim(userEntry[i]);
txtArea.append(userEntry[i]);
if (i < userEntry.length) {
txtArea.append('\n');
}
}
txtArea.attr('readonly', 'readonly');
fieldSet.append(txtArea);
/**
* Edit user entry
*/
txtArea.bind('dblclick', function(event) {
txtArea.attr('readonly', '');
txtArea.css( {
'border-width' : '1px'
});
saveBtn.show();
cancelBtn.show();
saveBtn.css('display', 'inline-table');
cancelBtn.css('display', 'inline-table');
});
/**
* Save
*/
var saveBtn = createButton('Save').hide();
saveBtn.bind('click', function(event) {
// Show loader
$('#' + node + 'StatusBarLoader').show();
$('#' + node + 'StatusBar').show();
// Replace user entry
var newUserEntry = jQuery.trim(txtArea.val()) + '\n';
// Replace user entry
$.ajax( {
url : 'lib/zCmd.php',
dataType : 'json',
data : {
cmd : 'chvm',
tgt : node,
args : '--replacevs',
att : newUserEntry,
msg : node
},
success : updateZNodeStatus
});
// Increment node process and save it in a cookie
incrementNodeProcess(node);
txtArea.attr('readonly', 'readonly');
txtArea.css( {
'border-width' : '0px'
});
// Disable save button
$(this).hide();
cancelBtn.hide();
});
/**
* Cancel
*/
var cancelBtn = createButton('Cancel').hide();
cancelBtn.bind('click', function(event) {
txtArea.attr('readonly', 'readonly');
txtArea.css( {
'border-width' : '0px'
});
cancelBtn.hide();
saveBtn.hide();
});
// Create info bar
var infoBar = createInfoBar('Double click on the directory entry to edit it.');
// Append user entry into division
$('#' + ueDivId).append(infoBar);
$('#' + ueDivId).append(fieldSet);
$('#' + ueDivId).append(saveBtn);
$('#' + ueDivId).append(cancelBtn);
}
/**
* Increment number of processes running against a node
*
* @param node Node to increment running processes
*/
function incrementNodeProcess(node) {
// Get current processes
var procs = $.cookie(node + 'processes');
if (procs) {
// One more process
procs = parseInt(procs) + 1;
$.cookie(node + 'processes', procs);
} else {
$.cookie(node + 'processes', 1);
}
}
/**
* Update provision new node status
*
* @param data Data returned from HTTP request
*/
function updateZProvisionNewStatus(data) {
// Parse ajax response
var rsp = data.rsp;
var args = data.msg.split(';');
var lastCmd = args[0].replace('cmd=', '');
var out2Id = args[1].replace('out=', '');
// IDs for status bar, tab, and loader
var statBarId = 'zProvisionStatBar' + out2Id;
var tabId = 'zvmProvisionTab' + out2Id;
var loaderId = 'zProvisionLoader' + out2Id;
var node = $('#' + tabId + ' input[name=nodeName]').val();
/**
* (2) Create user entry
*/
if (lastCmd == 'nodeadd') {
if (rsp.length) {
$('#' + loaderId).hide();
$('#' + statBarId).find('div').append('
');
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'makedhcp',
tgt : '',
args : '-a',
msg : 'cmd=makedhcp;out=' + out2Id
},
success : updateZProvisionNewStatus
});
}
}
/**
* (8) Prepare node for boot
*/
else if (lastCmd == 'makedhcp') {
// Prepare node for boot
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'nodeset',
tgt : node,
args : 'install',
msg : 'cmd=nodeset;out=' + out2Id
},
success : updateZProvisionNewStatus
});
}
/**
* (9) Boot node to network
*/
else if (lastCmd == 'nodeset') {
// Write ajax response to status bar
var prg = writeRsp(rsp, '');
$('#' + statBarId).find('div').append(prg);
// If there was an error
// Do not continue
if (containErrors(prg.html())) {
$('#' + loaderId).hide();
} else {
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'rnetboot',
tgt : node,
args : 'ipl=000C',
msg : 'cmd=rnetboot;out=' + out2Id
},
success : updateZProvisionNewStatus
});
}
}
/**
* (10) Done
*/
else if (lastCmd == 'rnetboot') {
// Write ajax response to status bar
var prg = writeRsp(rsp, '');
$('#' + statBarId).find('div').append(prg);
if (prg.html().indexOf('Error') < 0) {
$('#' + statBarId).find('div').append('
Open a VNC viewer to see the installation progress. It might take a couple of minutes before you can connect.
');
}
// Hide loader
$('#' + loaderId).hide();
}
}
/**
* Update the provision existing node status
*
* @param data Data returned from HTTP request
*/
function updateZProvisionExistingStatus(data) {
// Get ajax response
var rsp = data.rsp;
var args = data.msg.split(';');
// Get command invoked
var cmd = args[0].replace('cmd=', '');
// Get provision tab instance
var inst = args[1].replace('out=', '');
// Get provision tab and status bar ID
var statBarId = 'zProvisionStatBar' + inst;
var tabId = 'zvmProvisionTab' + inst;
/**
* (2) Prepare node for boot
*/
if (cmd == 'nodeadd') {
// Get operating system
var bootMethod = $('#' + tabId + ' select[name=bootMethod]').val();
// Get nodes that were checked
var dTableId = 'zNodesDatatable' + inst;
var tgts = getNodesChecked(dTableId);
// Prepare node for boot
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'nodeset',
tgt : tgts,
args : bootMethod,
msg : 'cmd=nodeset;out=' + inst
},
success : updateZProvisionExistingStatus
});
}
/**
* (3) Boot node from network
*/
else if (cmd == 'nodeset') {
// Write ajax response to status bar
var prg = writeRsp(rsp, '');
$('#' + statBarId).find('div').append(prg);
// If there was an error, do not continue
if (containErrors(prg.html())) {
var loaderId = 'zProvisionLoader' + inst;
$('#' + loaderId).remove();
return;
}
// Get nodes that were checked
var dTableId = 'zNodesDatatable' + inst;
var tgts = getNodesChecked(dTableId);
// Boot node from network
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'rnetboot',
tgt : tgts,
args : 'ipl=000C',
msg : 'cmd=rnetboot;out=' + inst
},
success : updateZProvisionExistingStatus
});
}
/**
* (4) Done
*/
else if (cmd == 'rnetboot') {
// Write ajax response to status bar
var prg = writeRsp(rsp, '');
$('#' + statBarId).find('div').append(prg);
var loaderId = 'zProvisionLoader' + inst;
$('#' + loaderId).remove();
}
}
/**
* Update zVM node status
*
* @param data Data returned from HTTP request
*/
function updateZNodeStatus(data) {
var node = data.msg;
var rsp = data.rsp;
// Get cookie for number processes performed against this node
var actions = $.cookie(node + 'processes');
// One less process
actions = actions - 1;
$.cookie(node + 'processes', actions);
if (actions < 1) {
// Hide loader when there are no more processes
var statusBarLoaderId = node + 'StatusBarLoader';
$('#' + statusBarLoaderId).hide();
}
var statBarId = node + 'StatusBar';
// Write ajax response to status bar
var prg = writeRsp(rsp, node + ': ');
$('#' + statBarId).find('div').append(prg);
}
/**
* Update clone status
*
* @param data Data returned from HTTP request
*/
function updateZCloneStatus(data) {
// Get ajax response
var rsp = data.rsp;
var args = data.msg.split(';');
var cmd = args[0].replace('cmd=', '');
// Get provision instance
var inst = args[1].replace('inst=', '');
// Get output division ID
var out2Id = args[2].replace('out=', '');
/**
* (2) Update /etc/hosts
*/
if (cmd == 'nodeadd') {
var node = args[3].replace('node=', '');
// If there was an error, do not continue
if (rsp.length) {
$('#' + out2Id).find('img').hide();
$('#' + out2Id).find('div').append('
(Error) Failed to create node definition
');
} else {
$('#' + out2Id).find('div').append('
Node definition created for ' + node + '
');
// If last node definition was created
var tmp = inst.split('/');
if (tmp[0] == tmp[1]) {
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'makehosts',
tgt : '',
args : '',
msg : 'cmd=makehosts;inst=' + inst + ';out=' + out2Id
},
success : updateZCloneStatus
});
}
}
}
/**
* (3) Update DNS
*/
else if (cmd == 'makehosts') {
// If there was an error, do not continue
if (rsp.length) {
$('#' + out2Id).find('img').hide();
$('#' + out2Id).find('div').append('
(Error) Failed to update /etc/hosts
');
} else {
$('#' + out2Id).find('div').append('
/etc/hosts updated
');
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'makedns',
tgt : '',
args : '',
msg : 'cmd=makedns;inst=' + inst + ';out=' + out2Id
},
success : updateZCloneStatus
});
}
}
/**
* (4) Clone
*/
else if (cmd == 'makedns') {
// Write ajax response to status bar
var prg = writeRsp(rsp, '');
$('#' + out2Id).find('div').append(prg);
// Get clone tab
var tabId = out2Id.replace('CloneStatusBar', 'CloneTab');
// If a node range is given
var tgtNodeRange = $('#' + tabId + ' input[name=tgtNode]').val();
var tgtNodes = '';
if (tgtNodeRange.indexOf('-') > -1) {
var tmp = tgtNodeRange.split('-');
// Get node base name
var nodeBase = tmp[0].match(/[a-zA-Z]+/);
// Get the starting index
var nodeStart = parseInt(tmp[0].match(/\d+/));
// Get the ending index
var nodeEnd = parseInt(tmp[1].match(/\d+/));
for ( var i = nodeStart; i <= nodeEnd; i++) {
// Do not append comma for last node
if (i == nodeEnd) {
tgtNodes += nodeBase + i.toString();
} else {
tgtNodes += nodeBase + i.toString() + ',';
}
}
} else {
tgtNodes = tgtNodeRange;
}
// Get other inputs
var srcNode = $('#' + tabId + ' input[name=srcNode]').val();
hcp = $('#' + tabId + ' input[name=newHcp]').val();
var group = $('#' + tabId + ' input[name=newGroup]').val();
var diskPool = $('#' + tabId + ' input[name=diskPool]').val();
var diskPw = $('#' + tabId + ' input[name=diskPw]').val();
if (!diskPw) {
diskPw = '';
}
// Clone
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'mkvm',
tgt : tgtNodes,
args : srcNode + ';pool=' + diskPool + ';pw=' + diskPw,
msg : 'cmd=mkvm;inst=' + inst + ';out=' + out2Id
},
success : updateZCloneStatus
});
}
/**
* (5) Done
*/
else if (cmd == 'mkvm') {
// Write ajax response to status bar
var prg = writeRsp(rsp, '');
$('#' + out2Id).find('div').append(prg);
// Hide loader
$('#' + out2Id).find('img').hide();
}
}
/**
* Get zVM resources
*
* @param data Data from HTTP request
*/
function getZResources(data) {
var tabId = 'zvmResourceTab';
var info = createInfoBar('Manage storage and networks');
$('#' + tabId).append(info);
// Do not continue if there is no output
if (data.rsp.length) {
// Push hardware control points into an array
var node, hcp;
var hcpHash = new Object();
for (var i in data.rsp) {
node = data.rsp[i][0];
hcp = data.rsp[i][1];
hcpHash[hcp] = 1;
}
// Create an array for hardware control points
var hcps = new Array();
for (var key in hcpHash) {
// Get the short host name
hcp = key.split('.')[0];
hcps.push(hcp);
}
// Set hardware control point cookie
$.cookie('hcp', hcps);
// Delete loader
$('#' + tabId).find('img[src="images/loader.gif"]').remove();
// Create accordion panel for disk
var resourcesAccordion = $('');
var diskSection = $('');
var diskLnk = $('
').click(function () {
// Do not load panel again if it is already loaded
if ($('#zvmDiskResource').children().length)
return;
else
$('#zvmDiskResource').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'));
// 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 accordion panel for zFCP devices
var zfcpSection = $('');
var zfcpLnk = $('
').click(function () {
// Do not load panel again if it is already loaded
if ($('#zfcpResource').children().length)
return;
else
$('#zfcpResource').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 : '--zfcppoolnames',
msg : hcps[i]
},
success : getZfcpPool
});
}
});
// Create accordion panel for network
var networkSection = $('');
var networkLnk = $('
').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();
networkLnk.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);
// Generate tooltips
addProcForm.find('div input[title],select[title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "fade",
opacity: 0.8,
delay: 0,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
},
// Change z index to show tooltip in front
onBeforeShow: function() {
this.getTip().css('z-index', $.topZIndex());
}
});
// 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 = new Array();
if (cookie) {
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('');
// Generate tooltips
addDiskForm.find('div input[title],select[title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "fade",
opacity: 0.8,
delay: 0,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
},
// Change z index to show tooltip in front
onBeforeShow: function() {
this.getTip().css('z-index', $.topZIndex());
}
});
// 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
* @param zvm The z/VM system of node
*/
function openAddZfcpDialog(node, hcp, zvm) {
// Get list of disk pools
var cookie = $.cookie(hcp + 'zfcppools');
var pools = new Array();
if (cookie) {
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();
});
// Generate tooltips
addZfcpForm.find('div input[title],select[title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "fade",
opacity: 0.8,
delay: 0,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
},
// Change z index to show tooltip in front
onBeforeShow: function() {
this.getTip().css('z-index', $.topZIndex());
}
});
// 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" );
}
},
"Cancel": function() {
$(this).dialog( "close" );
}
}
});
}
/**
* Create dedicate device dialog
*
* @param node Node to dedicate device to
* @param hcp Hardware control point of node
*/
function openDedicateDeviceDialog(node, hcp) {
// Create form to add disk
var dedicateForm = $('');
// Create info bar
var info = createInfoBar('Add a dedicated device to the configuration');
dedicateForm.append(info);
dedicateForm.append('');
dedicateForm.append('');
dedicateForm.append('');
dedicateForm.append('
');
// Generate tooltips
dedicateForm.find('div input[title],select[title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "fade",
opacity: 0.8,
delay: 0,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
},
// Change z index to show tooltip in front
onBeforeShow: function() {
this.getTip().css('z-index', $.topZIndex());
}
});
// Open dialog to add dedicated device
dedicateForm.dialog({
title:'Add dedicated 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 vAddress = $(this).find('input[name=virtualAddress]').val();
var rAddress = $(this).find('input[name=realAddress]').val()
var mode = $(this).find('select[name=mode]').val();
// If inputs are not complete, show warning message
if (!node || !vAddress || !rAddress || !mode) {
var warn = createWarnBar('Please provide a value for each missing field.');
warn.prependTo($(this));
} else {
var args = '--dedicatedevice;' + vAddress + ';' + rAddress + ';' + mode;
// 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" );
}
},
"Cancel": function() {
$(this).dialog( "close" );
}
}
});
}
/**
* Create add ECKD to system dialog
*
* @param hcp Hardware control point of node
*/
function openAddEckd2SystemDialog(hcp) {
var dialogId = 'zvmAddEckd2System';
// Create form to add disk
var addE2SForm = $('');
// Obtain mapping for zHCP to zVM system
var hcp2zvm = new Object();
hcp2zvm = getHcpZvmHash();
var system = $('');
var systemSelect = $('');
system.append(systemSelect);
// Append options for hardware control points
systemSelect.append($(''));
for (var hcp in hcp2zvm) {
systemSelect.append($(''));
}
// Create info bar
var info = createInfoBar('Dynamically add an ECKD disk to a running z/VM system.');
addE2SForm.append(info);
addE2SForm.append(system);
addE2SForm.append('');
// Generate tooltips
addE2SForm.find('div input[title],select[title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "fade",
opacity: 0.8,
delay: 0,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
},
// Change z index to show tooltip in front
onBeforeShow: function() {
this.getTip().css('z-index', $.topZIndex());
}
});
// Open dialog to add disk
addE2SForm.dialog({
title:'Add ECKD to system',
modal: true,
close: function(){
$(this).remove();
},
width: 420,
buttons: {
"Ok": function(){
// Remove any warning messages
$(this).find('.ui-state-error').remove();
var system = $(this).find('select[name=system]').val();
var devnum = $(this).find('input[name=devNum]').val();
// If inputs are not complete, show warning message
var ready = true;
var args = new Array('select[name=system]', 'input[name=devNum]');
for (var i in args) {
if (!$(this).find(args[i]).val()) {
$(this).find(args[i]).css('border', 'solid #FF0000 1px');
ready = false;
} else {
$(this).find(args[i]).css('border', 'solid #BDBDBD 1px');
}
}
if (!ready) {
// Show warning message
var warn = createWarnBar('Please provide a value for each required field.');
warn.prependTo($(this));
return;
}
// Change dialog buttons
$(this).dialog('option', 'buttons', {
'Close': function() {$(this).dialog("close");}
});
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'chhypervisor',
tgt : system,
args : "--addeckd;" + devnum,
msg : dialogId
},
success : updateResourceDialog
});
},
"Cancel": function() {
$(this).dialog( "close" );
}
}
});
}
/**
* Create add page or spool dialog
*
* @param hcp Hardware control point of node
*/
function openAddPageSpoolDialog(hcp) {
var dialogId = 'zvmAddPageSpool';
// Create form to add disk
var addPageSpoolForm = $('');
// Obtain mapping for zHCP to zVM system
var hcp2zvm = new Object();
hcp2zvm = getHcpZvmHash();
var system = $('');
var systemSelect = $('');
system.append(systemSelect);
// Append options for hardware control points
systemSelect.append($(''));
for (var hcp in hcp2zvm) {
systemSelect.append($(''));
}
// Create info bar
var info = createInfoBar('Indicate a full-pack minidisk is to be shared by the users of many real and virtual systems.');
addPageSpoolForm.append(info);
var diskFS = $('');
addPageSpoolForm.append(diskFS);
var diskAttr = $('');
diskFS.append($(''));
diskFS.append(diskAttr);
diskAttr.append(system);
diskAttr.append('');
diskAttr.append('');
diskAttr.append('');
// Generate tooltips
addPageSpoolForm.find('div input[title],select[title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "fade",
opacity: 0.8,
delay: 0,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
},
// Change z index to show tooltip in front
onBeforeShow: function() {
this.getTip().css('z-index', $.topZIndex());
}
});
// Open dialog to add disk
addPageSpoolForm.dialog({
title:'Add page or spool',
modal: true,
close: function(){
$(this).remove();
},
width: 500,
buttons: {
"Ok": function(){
// Remove any warning messages
$(this).find('.ui-state-error').remove();
var system = $(this).find('select[name=system]').val();
var volAddr = $(this).find('input[name=volAddr]').val();
var volLabel = $(this).find('input[name=volLabel]').val();
var volUse = $(this).find('select[name=volUse]').val();
// If inputs are not complete, show warning message
var ready = true;
var args = new Array('select[name=system]', 'input[name=volAddr]', 'input[name=volLabel]', 'select[name=volUse]');
for (var i in args) {
if (!$(this).find(args[i]).val()) {
$(this).find(args[i]).css('border', 'solid #FF0000 1px');
ready = false;
} else {
$(this).find(args[i]).css('border', 'solid #BDBDBD 1px');
}
}
if (!ready) {
// Show warning message
var warn = createWarnBar('Please provide a value for each required field.');
warn.prependTo($(this));
return;
}
// Change dialog buttons
$(this).dialog('option', 'buttons', {
'Close': function() {$(this).dialog("close");}
});
var pageSpoolArgs = volAddr + ";" + volLabel + ";" + volUse;
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'chvm',
tgt : system,
args : '--addpagespool;' + pageSpoolArgs,
msg : dialogId
},
success : updateResourceDialog
});
},
"Cancel": function() {
$(this).dialog( "close" );
}
}
});
}
/**
* Open dialog to share disk
*
* @param disks2share Disks selected in table
*/
function openShareDiskDialog(disks2share) {
// Create form to share disk
var dialogId = 'zvmShareDisk';
var shareDiskForm = $('');
var args = disks2share.split(';');
var tgtHcp = args[0];
var tgtVol = args[1];
if (!tgtVol || tgtVol == "undefined")
tgtVol = "";
// Create info bar
var info = createInfoBar('Indicate a full-pack minidisk is to be shared by the users of many real and virtual systems.');
shareDiskForm.append(info);
// Set region input based on those selected on table (if any)
var node = $('');
var volAddr = $('');
var shareEnable = $('');
shareDiskForm.append(node, volAddr, shareEnable);
// Generate tooltips
shareDiskForm.find('div input[title],select[title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "fade",
opacity: 0.8,
delay: 0,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
},
// Change z index to show tooltip in front
onBeforeShow: function() {
this.getTip().css('z-index', $.topZIndex());
}
});
// Open dialog to delete disk
shareDiskForm.dialog({
title:'Share disk',
modal: true,
close: function(){
$(this).remove();
},
width: 500,
buttons: {
"Ok": function(){
// Remove any warning messages
$(this).find('.ui-state-error').remove();
// Get inputs
var node = $(this).find('input[name=node]').val();
var volAddr = $(this).find('input[name=volAddr]').val();
var shareEnable = $(this).find('select[name=shareEnable]').val();
// If inputs are not complete, show warning message
var ready = true;
var args = new Array('input[name=node]', 'input[name=volAddr]', 'select[name=shareEnable]');
for (var i in args) {
if (!$(this).find(args[i]).val()) {
$(this).find(args[i]).css('border', 'solid #FF0000 1px');
ready = false;
} else {
$(this).find(args[i]).css('border', 'solid #BDBDBD 1px');
}
}
if (!ready) {
// Show warning message
var warn = createWarnBar('Please provide a value for each required field.');
warn.prependTo($(this));
return;
}
// Change dialog buttons
$(this).dialog('option', 'buttons', {
'Close': function() {$(this).dialog("close");}
});
// Remove disk from pool
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'chvm',
tgt : node,
args : "--sharevolume;" + volAddr + ";" + shareEnable,
msg : dialogId
},
success : updateResourceDialog
});
},
"Cancel": function() {
$(this).dialog( "close" );
}
}
});
}
/**
* Create add SCSI 2 system dialog
*
* @param hcp Hardware control point of node
*/
function openAddScsi2SystemDialog(hcp) {
var dialogId = 'zvmAddScsi2System';
// Create form to add disk
var addS2SForm = $('');
// Obtain mapping for zHCP to zVM system
var hcp2zvm = new Object();
hcp2zvm = getHcpZvmHash();
// Create info bar
var info = createInfoBar('Dynamically add an SCSI disk to a running z/VM system as an EDEV.');
addS2SForm.append(info);
var system = $('');
var systemSelect = $('');
system.append(systemSelect);
// Append options for hardware control points
systemSelect.append($(''));
for (var hcp in hcp2zvm) {
systemSelect.append($(''));
}
var devNo = $('');
var devPathLabel = $('');
var devPathCount = 1;
var pathDiv = $('');
var devPathDiv = $('');
var devPathTable = $('
');
var devPathHeader = $('
FCP Device
WWPN
LUN
');
// Adjust header width
devPathHeader.find('th').css({
'width' : '120px'
});
devPathHeader.find('th').eq(0).css({
'width' : '20px'
});
var devPathBody = $('');
var devPathFooter = $('');
// Create a row
var devPathRow = $('
');
devPathRow.append(fcpWwpn);
if ($.cookie('zvms')) {
zvms = $.cookie('zvms').split(',');
var zvm;
for (var i in zvms) {
var args = zvms[i].split(':');
var zvm = args[0].toLowerCase();
var iHcp = args[1];
}
}
// Create FCP LUN input
var fcpLun = $('
');
devPathRow.append(fcpLun);
devPathBody.append(devPathRow);
var addDevPathLink = $('+ Add path');
addDevPathLink.bind('click', function(event){
devPathCount = devPathCount + 1;
// Create a row
var devPathRow = $('
');
// Add remove button
var removeBtn = $('').css({
"float": "left",
"cursor": "pointer"
});
var col = $('
').append(removeBtn);
removeBtn.bind('click', function(event) {
$(this).parent().parent().remove();
});
devPathRow.append(col);
// Create FCP device number input
var fcpDevNum = $('
');
devPathRow.append(fcpLun);
devPathBody.append(devPathRow);
// Generate tooltips
addS2SForm.find('div input[title],select[title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "fade",
opacity: 0.8,
delay: 0,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
},
// Change z index to show tooltip in front
onBeforeShow: function() {
this.getTip().css('z-index', $.topZIndex());
}
});
});
devPathFooter.append(addDevPathLink);
devPathTable.append(devPathHeader);
devPathTable.append(devPathBody);
devPathTable.append(devPathFooter);
devPathDiv.append(devPathLabel);
devPathDiv.append(devPathTable);
var option = $('');
var persist = $('');
addS2SForm.append(system, devNo, devPathDiv, option, persist);
// Generate tooltips
addS2SForm.find('div input[title],select[title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "fade",
opacity: 0.8,
delay: 0,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
},
// Change z index to show tooltip in front
onBeforeShow: function() {
this.getTip().css('z-index', $.topZIndex());
}
});
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 system = $(this).find('select[name=system]').val();
var devNo = $(this).find('input[name=devNo]').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() + ';';
});
var option = $(this).find('select[name=option]').val();
var persist = $(this).find('select[name=persist]').val();
// If inputs are not complete, show warning message
var ready = true;
var args = new Array('select[name=system]', 'input[name=devNum]', 'select[name=option]', 'select[name=persist]');
for (var i in args) {
if (!$(this).find(args[i]).val()) {
$(this).find(args[i]).css('border', 'solid #FF0000 1px');
ready = false;
} else {
$(this).find(args[i]).css('border', 'solid #BDBDBD 1px');
}
}
// Show warning message
if (!ready || !pathArray) {
var warn = createWarnBar('Please provide a value for each required field.');
warn.prependTo($(this));
return;
}
// Change dialog buttons
$(this).dialog('option', 'buttons', {
'Close': function() {$(this).dialog("close");}
});
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'chhypervisor',
tgt : system,
args : "--addscsi||" + devNo + "||'" + 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 = $('');
// Obtain mapping for zHCP to zVM system
var hcp2zvm = new Object();
hcp2zvm = getHcpZvmHash();
var system = $('');
var systemSelect = $('');
system.append(systemSelect);
// Append options for hardware control points
systemSelect.append($(''));
for (var hcp in hcp2zvm) {
systemSelect.append($(''));
}
// Create info bar
var info = createInfoBar('Delete a real SCSI disk');
removeScsiForm.append(info, system);
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());
}
}
});
// Generate tooltips
addNicForm.find('div input[title],select[title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "fade",
opacity: 0.8,
delay: 0,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
},
// Change z index to show tooltip in front
onBeforeShow: function() {
this.getTip().css('z-index', $.topZIndex());
}
});
// 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 system = $('');
var systemSelect = $('');
system.append(systemSelect);
netAttr.append(system);
// Obtain mapping for zHCP to zVM system
var hcp2zvm = new Object();
hcp2zvm = getHcpZvmHash();
systemSelect.append($(''));
for (var hcp in hcp2zvm) {
systemSelect.append($(''));
}
var typeAttr = $('');
typeFS.append($(''));
typeFS.append(typeAttr);
// Create vSwitch parameters
var vswitchOptions = $('').hide();
vswitchOptions.append($(''));
vswitchOptions.append($(''));
vswitchOptions.append($(''));
// Create an advanced link to configure optional network settings
var advancedLnk = $('');
vswitchOptions.append(advancedLnk);
var advanced = $('').hide();
vswitchOptions.append(advanced);
// Show IP address and hostname inputs on-click
advancedLnk.click(function() {
advanced.toggle();
});
advanced.append($(''));
advanced.append($(''));
advanced.append($(''));
advanced.append($(''));
advanced.append($(''));
advanced.append($(''));
advanced.append($(''));
advanced.append($(''));
advanced.append($(''));
// Create VLAN parameters
var vlanOptions = $('').hide();
vlanOptions.append($(''));
vlanOptions.append($(''));
vlanOptions.append($(''));
vlanOptions.append($(''));
typeAttr.append(vswitchOptions, vlanOptions);
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();
}
});
// Generate tooltips
addVswitchForm.find('div input[title],select[title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "fade",
opacity: 0.8,
delay: 0,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
},
// Change z index to show tooltip in front
onBeforeShow: function() {
this.getTip().css('z-index', $.topZIndex());
}
});
// 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 system = $(this).find('select[name=system]').val();
var switchName = $(this).find('input[name=switchName]').val();
var deviceAddress = $(this).find('input[name=deviceAddress]').val();
var portName = switchName;
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 inputs are not complete, show warning message
var ready = true;
var args = new Array('select[name=system]', 'input[name=switchName]', 'input[name=deviceAddress]', 'input[name=controllerName]');
for (var i in args) {
if (!$(this).find(args[i]).val()) {
$(this).find(args[i]).css('border', 'solid #FF0000 1px');
ready = false;
} else {
$(this).find(args[i]).css('border', 'solid #BDBDBD 1px');
}
}
// Show warning message
if (!ready) {
var warn = createWarnBar('Please provide a value for each required field.');
warn.prependTo($(this));
return;
}
if (switchName)
networkArgs += switchName + ";";
if (deviceAddress)
networkArgs += deviceAddress + ";";
if (portName)
networkArgs += portName + ";";
if (controllerName)
networkArgs += controllerName + ";";
// Optional parameters
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 += gvrp + ";";
if (nativeVlanId)
networkArgs += nativeVlanId + ";";
networkArgs = networkArgs.substring(0, networkArgs.length - 1);
// Change dialog buttons
$(this).dialog('option', 'buttons', {
'Close': function() {$(this).dialog("close");}
});
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'chhypervisor',
tgt : system,
args : networkArgs,
msg : dialogId
},
success : updateResourceDialog
});
} else if (networkType == "vlan") {
var networkArgs = "--addvlan;";
var system = $(this).find('select[name=system]').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 inputs are not complete, show warning message
var ready = true;
var args = new Array('select[name=system]', 'input[name=vlanName]', 'input[name=vlanOwner]', 'select[name=vlanType]', 'select[name=vlanTransport]');
for (var i in args) {
if (!$(this).find(args[i]).val()) {
$(this).find(args[i]).css('border', 'solid #FF0000 1px');
ready = false;
} else {
$(this).find(args[i]).css('border', 'solid #BDBDBD 1px');
}
}
// Show warning message
if (!ready) {
var warn = createWarnBar('Please provide a value for each required field.');
warn.prependTo($(this));
return;
}
// Ethernet Hipersockets are not supported
if (vlanTransport == "2") {
var warn = createWarnBar('Ethernet Hipersockets are not supported');
warn.prependTo($(this));
return;
}
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 : system,
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]);
var owner = networkArgs[3];
if (type.indexOf("VSWITCH") != -1) {
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'chhypervisor',
tgt : node,
args : '--removevswitch;' + name,
msg : ''
},
success: function(data) {
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;
}
openDialog("info", infoMsg);
}
});
} else if (type.indexOf("LAN") != -1) {
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'chhypervisor',
tgt : node,
args : '--removevlan;' + name + ';' + owner,
msg : ''
},
success: function(data) {
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;
}
openDialog("info", infoMsg);
}
});
}
}
$(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
} else {
// Load empty table
loadDiskPoolTable();
}
}
/**
* 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();
}
}
/**
* 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();
var hcp2zvm = new Object();
var args, hcp, pool, stat, tmp;
if (data) {
// Do not continue if the call failed
if (!data.rsp.length && data.rsp[0].indexOf("Failed") > 0) {
return;
}
// Obtain mapping for zHCP to zVM system
hcp2zvm = getHcpZvmHash();
args = data.msg.split(';');
hcp = args[0].replace('hcp=', '');
pool = args[1].replace('pool=', '');
stat = args[2].replace('stat=', '');
tmp = data.rsp[0].split(hcp + ': ');
} else {
// Provide empty values so the table will be generated
hcp = '';
pool = '';
stat = '';
tmp = new Array();
}
// 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( [ '', 'z/VM', 'Pool', 'Status', 'Volume', '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(' ');
var key = hcp2zvm[hcp] + "-" + pool + "-" + diskAttrs[0];
dTable.fnAddData( [ '', hcp2zvm[hcp], pool, stat, diskAttrs[0], diskAttrs[1], diskAttrs[2], diskAttrs[3] ]);
}
// Create actions menu
if (!$('#zvmDiskResourceActions').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);
});
// Add EDEV to system
var addEdevLnk = $('Add EDEV');
addEdevLnk.bind('click', function(event){
openAddScsi2SystemDialog(hcp);
});
// Remove EDEV
var removeEdevLnk = $('Remove EDEV');
removeEdevLnk.bind('click', function(event){
openRemoveScsiDialog(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, addEdevLnk, removeEdevLnk, shareLnk]);
// Create action bar
var actionBar = $('').css("width", "450px");
// Create an action menu
var actionsMenu = createMenu([refreshLnk, addLnk, removeLnk, [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();
var hcp2zvm = new Object();
var args, hcp, pool, tmp;
if (data) {
// Do not continue if the call failed
if (!data.rsp.length && data.rsp[0].indexOf("Failed") > 0) {
return;
}
// Obtain mapping for zHCP to zVM system
hcp2zvm = getHcpZvmHash();
args = data.msg.split(';');
hcp = args[0].replace('hcp=', '');
pool = args[1].replace('pool=', '');
tmp = data.rsp[0].split(hcp + ': ');
} else {
// Provide empty values so the table will be generated
hcp = '';
pool = ''
tmp = new Array();
}
// 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( [ '', 'z/VM', '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 = hcp2zvm[hcp] + '-' + pool + '-' + diskAttrs[2];
dTable.fnAddData( [ '', hcp2zvm[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
});
}
});
// 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');
}
/**
* 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 = $('');
// Obtain mapping for zHCP to zVM system
var hcp2zvm = new Object();
hcp2zvm = getHcpZvmHash();
var disks = new Array();
if (disks2remove.indexOf(',') > -1)
disks = disks2remove.split(',');
else
disks.push(disks2remove);
// Pick the last zHCP and pool it finds
var args, tgtHcp = "", tgtPool = "", tgtVol = "";
for (var i in disks) {
args = disks[i].split('-');
tgtHcp = args[0];
tgtPool = args[1];
tgtVol += args[2] + ',';
}
// Strip out last comma
tgtVol = tgtVol.slice(0, -1);
// 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 system = $('');
var systemSelect = $('');
system.append(systemSelect);
// Set region input based on those selected on table (if any)
var region = $('');
var group = $('');
deleteDiskForm.append(action, system, region, group);
// Append options for hardware control points
systemSelect.append($(''));
for (var hcp in hcp2zvm) {
systemSelect.append($(''));
}
systemSelect.val(tgtHcp);
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();
}
});
// Generate tooltips
deleteDiskForm.find('div input[title],select[title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "fade",
opacity: 0.8,
delay: 0,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
},
// Change z index to show tooltip in front
onBeforeShow: function() {
this.getTip().css('z-index', $.topZIndex());
}
});
// 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 system = $(this).find('select[name=system]').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
var ready = true;
var args = new Array('select[name=system]', 'select[name=action]', 'input[name=region]', 'input[name=group]');
for (var i in args) {
if (!$(this).find(args[i]).val()) {
$(this).find(args[i]).css('border', 'solid #FF0000 1px');
ready = false;
} else {
$(this).find(args[i]).css('border', 'solid #BDBDBD 1px');
}
}
if (!ready) {
// Show warning message
var warn = createWarnBar('Please provide a value for each required field.');
warn.prependTo($(this));
return;
}
// 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 : 'chhypervisor',
tgt : system,
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 = $('');
// Obtain mapping for zHCP to zVM system
var hcp2zvm = new Object();
hcp2zvm = getHcpZvmHash();
// 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 system = $('');
var systemSelect = $('');
system.append(systemSelect);
var volume = $('');
var group = $('');
addDiskForm.append(action, system, volume, group);
// Append options for hardware control points
systemSelect.append($(''));
for (var hcp in hcp2zvm) {
systemSelect.append($(''));
}
// Generate tooltips
addDiskForm.find('div input[title],select[title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "fade",
opacity: 0.8,
delay: 0,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
},
// Change z index to show tooltip in front
onBeforeShow: function() {
this.getTip().css('z-index', $.topZIndex());
}
});
// 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 system = $(this).find('select[name=system]').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
var ready = true;
var args = new Array('select[name=system]', 'select[name=action]', 'input[name=volume]', 'input[name=group]');
for (var i in args) {
if (!$(this).find(args[i]).val()) {
$(this).find(args[i]).css('border', 'solid #FF0000 1px');
ready = false;
} else {
$(this).find(args[i]).css('border', 'solid #BDBDBD 1px');
}
}
if (!ready) {
// Show warning message
var warn = createWarnBar('Please provide a value for each required field.');
warn.prependTo($(this));
return;
}
// Change dialog buttons
$(this).dialog('option', 'buttons', {
'Close': function() {$(this).dialog("close");}
});
var args;
if (action == '4')
args = volume + ';' + volume + ';' + group;
else
args = volume + ';' + group;
// Add disk to pool
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'chhypervisor',
tgt : system,
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 = $('');
// Obtain mapping for zHCP to zVM system
var hcp2zvm = new Object();
hcp2zvm = getHcpZvmHash();
// 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 system = $('');
var systemSelect = $('');
system.append(systemSelect);
var pool = $('');
var unitNo = $('');
var portName = $('');
deleteDiskForm.append(system, pool, unitNo, portName);
// Append options for hardware control points
systemSelect.append($(''));
for (var hcp in hcp2zvm) {
systemSelect.append($(''));
}
systemSelect.val(tgtHcp);
// Generate tooltips
deleteDiskForm.find('div input[title],select[title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "fade",
opacity: 0.8,
delay: 0,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
},
// Change z index to show tooltip in front
onBeforeShow: function() {
this.getTip().css('z-index', $.topZIndex());
}
});
// 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 system = $(this).find('select[name=system]').val();
var pool = $(this).find('input[name=zfcpPool]').val();
var unitNo = $(this).find('input[name=zfcpUnitNo]').val();
var portName = $(this).find('input[name=zfcpPortName]').val();
// If inputs are not complete, show warning message
var ready = true;
var args = new Array('select[name=system]', 'input[name=zfcpPool]', 'input[name=zfcpUnitNo]');
for (var i in args) {
if (!$(this).find(args[i]).val()) {
$(this).find(args[i]).css('border', 'solid #FF0000 1px');
ready = false;
} else {
$(this).find(args[i]).css('border', 'solid #BDBDBD 1px');
}
}
if (!ready) {
// Show warning message
var warn = createWarnBar('Please provide a value for each required field.');
warn.prependTo($(this));
return;
}
// Change dialog buttons
$(this).dialog('option', 'buttons', {
'Close': function() {$(this).dialog("close");}
});
var args = '--removezfcpfrompool;' + pool + ';' + unitNo;
if (portName) {
args += ';' + portName;
}
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'chhypervisor',
tgt : system,
args : args,
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);
// Obtain mapping for zHCP to zVM system
var hcp2zvm = new Object();
hcp2zvm = getHcpZvmHash();
var system = $('');
var systemSelect = $('');
system.append(systemSelect);
var pool = $('');
var status = $('');
var portName = $('');
var unitNo = $('');
var size = $('');
var range = $('');
var owner = $('');
addDiskForm.append(system, pool, status, portName, unitNo, size, range, owner);
// Create a array for hardware control points
systemSelect.append($(''));
// Append options for hardware control points
for (var hcp in hcp2zvm) {
systemSelect.append($(''));
}
// Generate tooltips
addDiskForm.find('div input[title],select[title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "fade",
opacity: 0.8,
delay: 0,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
},
// Change z index to show tooltip in front
onBeforeShow: function() {
this.getTip().css('z-index', $.topZIndex());
}
});
// 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 tgtSystem = $(this).find('select[name=system]').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
var ready = true;
var args = new Array('select[name=system]', 'input[name=zfcpPool]', 'select[name=zfcpStatus]', 'input[name=zfcpPortName]', 'input[name=zfcpUnitNo]');
for (var i in args) {
if (!$(this).find(args[i]).val()) {
$(this).find(args[i]).css('border', 'solid #FF0000 1px');
ready = false;
} else {
$(this).find(args[i]).css('border', 'solid #BDBDBD 1px');
}
}
if (!ready) {
// Show warning message
var warn = createWarnBar('Please provide a value for each required field.');
warn.prependTo($(this));
return;
}
// Change dialog buttons
$(this).dialog('option', 'buttons', {
'Close': function() {$(this).dialog("close");}
});
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'chhypervisor',
tgt : tgtSystem,
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();
// Get zVM host names
if (!$.cookie('zvms')) {
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
async: false,
data : {
cmd : 'webportal',
tgt : '',
args : 'lszvm',
msg : ''
},
success : function(data) {
setzVMCookies(data);
}
});
}
var zvms = $.cookie('zvms').split(',');
var hcp2zvm = new Object();
var args, zvm, iHcp, tmp;
for (var i in zvms) {
args = zvms[i].split(':');
zvm = args[0].toLowerCase();
if (args[1].indexOf('.') != -1) {
tmp = args[1].split('.');
iHcp = tmp[0];
} else {
iHcp = args[1];
}
hcp2zvm[iHcp] = zvm;
}
var args = data.msg.split(';');
var hcp = args[0].replace('hcp=', '');
var type = args[1].replace('type=', '');
var name = jQuery.trim(args[2].replace('network=', ''));
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( [ '', 'z/VM', 'Type', 'Name', 'Layer', 'Owner', 'Controller', '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 += '
';
// Determine the OSI layer
var layer = "3";
if (details.indexOf("ETHERNET") != -1) {
layer = "2";
}
// Find the vSwitch/VLAN owner
var regex = /(LAN|VSWITCH) (.*?)(?:\s|$)/g;
var owner = "";
var match = "";
owner = regex.exec(details)[2];
// Find the vSwitch controller
regex = /(?:^|\s)Controller: (.*?)(?:\s|$)/g;
var controllers = "";
match = "";
while (match = regex.exec(details)) {
controllers += match[1] + ",";
}
controllers = controllers.substring(0, controllers.length - 1); // Delete last two characters
dTable.fnAddData(['', '
' + hcp2zvm[hcp] + '
', '
' + type + '
', '
' + name + '
', '
' + layer + '
', '
' + owner + '
', '
' + controllers + '
', 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],select[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 = $('
');
// Adjust header width
zfcpHeader.find('th').css( {
'width' : '80px'
});
zfcpHeader.find('th').eq(0).css( {
'width' : '20px'
});
var zfcpBody = $('');
var zfcpFooter = $('');
/**
* Add zFCP devices
*/
var addZfcpLink = $('Add zFCP');
addZfcpLink.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] + 'zfcppools').split(',');
}
// Create a row
var zfcpRow = $('
');
// Add remove button
var removeBtn = $('');
var col = $('
').append(removeBtn);
removeBtn.bind('click', function(event) {
zfcpRow.remove();
});
zfcpRow.append(col);
// Create disk address input
var zfcpAddr = $('
');
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 = $('
');
zfcpRow.append(zfcpUnitNo);
// Create LOADDEV checkbox
var zfcpLoaddev = $('
');
zfcpRow.append(zfcpLoaddev);
zfcpBody.append(zfcpRow);
// Generate tooltips
zfcpBody.find('td input[title],select[title]').tooltip({
position: "top right",
offset: [-4, 4],
effect: "fade",
opacity: 0.7,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
}
});
});
zfcpFooter.append(addZfcpLink);
zfcpTable.append(zfcpHeader);
zfcpTable.append(zfcpBody);
zfcpTable.append(zfcpFooter);
zfcpDiv.append(zfcpLabel);
zfcpDiv.append(zfcpTable);
hwAttr.append(zfcpDiv);
// Generate tooltips
provNew.find('div input[title],select[title],textarea[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 new
*/
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 tab ID
var thisTabId = $(this).parents('.ui-tabs-panel').attr('id');
// Get provision tab instance
var inst = thisTabId.replace('zvmProvisionTab', '');
// Check node name, userId, hardware control point, and group
// Check disks and zFCP devices
var inputs = $('#' + thisTabId + ' input:visible');
for ( var i = 0; i < inputs.length; i++) {
// Do not check some inputs
if (!inputs.eq(i).val()
&& inputs.eq(i).attr('type') != 'password'
&& inputs.eq(i).attr('name') != 'zfcpTag'
&& inputs.eq(i).attr('name') != 'zfcpPortName'
&& inputs.eq(i).attr('name') != 'zfcpUnitNo') {
inputs.eq(i).css('border', 'solid #FF0000 1px');
ready = false;
} else {
inputs.eq(i).css('border', 'solid #BDBDBD 1px');
}
}
var selects = $('#' + thisTabId + ' select:visible');
for ( var i = 0; i < selects.length; i++) {
if (!selects.eq(i).val() && selects.eq(i).attr('name') != 'os') {
selects.eq(i).css('border', 'solid #FF0000 1px');
ready = false;
} else {
selects.eq(i).css('border', 'solid #BDBDBD 1px');
}
}
// Check user entry
var thisUserEntry = $('#' + thisTabId + ' textarea:visible');
thisUserEntry.val(thisUserEntry.val().toUpperCase());
if (!thisUserEntry.val()) {
thisUserEntry.css('border', 'solid #FF0000 1px');
ready = false;
} else {
thisUserEntry.css('border', 'solid #BDBDBD 1px');
}
// Show error message for missing inputs
if (!ready) {
errMsg = errMsg + 'Please provide a value for each missing field. ';
}
// Check if user entry contains user ID
var thisUserId = $('#' + thisTabId + ' input[name=userId]:visible');
var pos = thisUserEntry.val().indexOf('USER ' + thisUserId.val().toUpperCase());
if (pos < 0) {
pos = thisUserEntry.val().indexOf('IDENTITY ' + thisUserId.val().toUpperCase());
if (pos < 0) {
errMsg = errMsg + 'The directory entry does not contain the correct user/identity ID. ';
ready = false;
}
}
// If no operating system is specified, create only user entry
os = $('#' + thisTabId + ' select[name=os]:visible');
// Check number of disks
var diskRows = $('#' + thisTabId + ' table tr');
// If an OS is given, disks are needed
if (os.val() && (diskRows.length < 1)) {
errMsg = errMsg + 'You need to add at some disks. ';
ready = false;
}
// If inputs are valid, ready to provision
if (ready) {
if (!os.val()) {
// If no OS is given, create a virtual server
var msg = '';
if (diskRows.length > 0) {
msg = 'Do you want to create a virtual server without an operating system?';
} else {
// If no disks are given, create a virtual server (no disk)
msg = 'Do you want to create a virtual server without an operating system or disks?';
}
// Open dialog to confirm
var confirmDialog = $('
' + msg + '
');
confirmDialog.dialog({
title:'Confirm',
modal: true,
close: function(){
$(this).remove();
},
width: 400,
buttons: {
"Ok": function(){
// Disable provision button
provisionBtn.attr('disabled', 'true');
// Show loader
$('#zProvisionStatBar' + inst).show();
$('#zProvisionLoader' + inst).show();
// Disable add disk button
addDiskLink.attr('disabled', 'true');
// Disable close button on disk table
$('#' + thisTabId + ' table span').unbind('click');
// Disable all inputs
var inputs = $('#' + thisTabId + ' input');
inputs.attr('disabled', 'disabled');
// Disable all selects
var selects = $('#' + thisTabId + ' select');
selects.attr('disabled', 'disabled');
// Add a new line at the end of the user entry
var textarea = $('#' + thisTabId + ' textarea');
var tmp = jQuery.trim(textarea.val());
textarea.val(tmp + '\n');
textarea.attr('readonly', 'readonly');
textarea.css( {
'background-color' : '#F2F2F2'
});
// Get node name
var node = $('#' + thisTabId + ' input[name=nodeName]').val();
// Get userId
var userId = $('#' + thisTabId + ' input[name=userId]').val();
// Get hardware control point
var hcp = $('#' + thisTabId + ' input[name=hcp]').val();
// Get group
var group = $('#' + thisTabId + ' input[name=group]').val();
// Get IP address and hostname
var ip = $('#' + thisTabId + ' input[name=ip]').val();
var hostname = $('#' + thisTabId + ' input[name=hostname]').val();
// Generate arguments to sent
var args = node + ';zvm.hcp=' + hcp
+ ';zvm.userid=' + userId
+ ';nodehm.mgt=zvm'
+ ';groups=' + group;
if (ip)
args += ';hosts.ip=' + ip;
if (hostname)
args += ';hosts.hostnames=' + hostname;
/**
* (1) Define node
*/
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'nodeadd',
tgt : '',
args : args,
msg : 'cmd=nodeadd;out=' + inst
},
success : updateZProvisionNewStatus
});
$(this).dialog("close");
},
"Cancel": function() {
$(this).dialog("close");
}
}
});
} else {
/**
* Create a virtual server and install OS
*/
// Disable provision button
$(this).attr('disabled', 'true');
// Show loader
$('#zProvisionStatBar' + inst).show();
$('#zProvisionLoader' + inst).show();
// Disable add disk button
addDiskLink.attr('disabled', 'true');
// Disable close button on disk table
$('#' + thisTabId + ' table span').unbind('click');
// Disable all inputs
var inputs = $('#' + thisTabId + ' input');
inputs.attr('disabled', 'disabled');
inputs.css( {
'background-color' : '#F2F2F2'
});
// Disable all selects
var selects = $('#' + thisTabId + ' select');
selects.attr('disabled', 'disabled');
selects.css( {
'background-color' : '#F2F2F2'
});
// Add a new line at the end of the user entry
var textarea = $('#' + thisTabId + ' textarea');
var tmp = jQuery.trim(textarea.val());
textarea.val(tmp + '\n');
textarea.attr('readonly', 'readonly');
textarea.css( {
'background-color' : '#F2F2F2'
});
// Get node name
var node = $('#' + thisTabId + ' input[name=nodeName]').val();
// Get userId
var userId = $('#' + thisTabId + ' input[name=userId]').val();
// Get hardware control point
var hcp = $('#' + thisTabId + ' input[name=hcp]').val();
// Get group
var group = $('#' + thisTabId + ' input[name=group]').val();
// Get IP address and hostname
var ip = $('#' + thisTabId + ' input[name=ip]').val();
var hostname = $('#' + thisTabId + ' input[name=hostname]').val();
// Generate arguments to sent
var args = node + ';zvm.hcp=' + hcp
+ ';zvm.userid=' + userId
+ ';nodehm.mgt=zvm'
+ ';groups=' + group;
if (ip)
args += ';hosts.ip=' + ip;
if (hostname)
args += ';hosts.hostnames=' + hostname;
/**
* (1) Define node
*/
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'nodeadd',
tgt : '',
args : args,
msg : 'cmd=nodeadd;out=' + inst
},
success : updateZProvisionNewStatus
});
}
} else {
// Show warning message
var warn = createWarnBar(errMsg);
warn.prependTo($(this).parent().parent());
}
});
provNew.append(provisionBtn);
return provNew;
}
/**
* Load zVMs into column (service page)
*
* @param col Table column where OS images will be placed
*/
function loadzVMs(col) {
// Get group names and description and append to group column
if (!$.cookie('zvms')) {
var infoBar = createInfoBar('No selectable z/VM available');
col.append(infoBar);
return;
}
var zNames = $.cookie('zvms').split(',');
var radio, zBlock, args, zvm, hcp;
for (var i in zNames) {
args = zNames[i].split(':');
zvm = args[0];
hcp = args[1];
// Create block for each group
zBlock = $('').css({
'border': '1px solid',
'max-width': '200px',
'margin': '5px auto',
'padding': '5px',
'display': 'block',
'vertical-align': 'middle',
'cursor': 'pointer',
'white-space': 'normal'
}).click(function(){
$(this).children('input:radio').attr('checked', 'checked');
$(this).parents('td').find('div').attr('class', 'ui-state-default');
$(this).attr('class', 'ui-state-active');
});
radio = $('').css('display', 'none');
zBlock.append(radio, $('' + zvm + ' managed by ' + hcp + ''));
zBlock.children('span').css({
'display': 'block',
'margin': '5px',
'text-align': 'left'
});
col.append(zBlock);
}
}
/**
* Load groups into column
*
* @param col Table column where OS images will be placed
*/
function loadSrvGroups(col) {
// Get group names and description and append to group column
if (!$.cookie('srv_groups')) {
var infoBar = createInfoBar('No selectable group available');
col.append(infoBar);
return;
}
var groupNames = $.cookie('srv_groups').split(',');
var groupBlock, radio, args, name, ip, hostname, desc;
for (var i in groupNames) {
args = groupNames[i].split(':');
name = args[0];
ip = args[1];
hostname = args[2];
desc = args[3];
// Create block for each group
groupBlock = $('').css({
'border': '1px solid',
'max-width': '200px',
'margin': '5px auto',
'padding': '5px',
'display': 'block',
'vertical-align': 'middle',
'cursor': 'pointer',
'white-space': 'normal'
}).click(function(){
$(this).children('input:radio').attr('checked', 'checked');
$(this).parents('td').find('div').attr('class', 'ui-state-default');
$(this).attr('class', 'ui-state-active');
});
radio = $('').css('display', 'none');
groupBlock.append(radio, $('' + name + ': ' + desc + ''));
groupBlock.children('span').css({
'display': 'block',
'margin': '5px',
'text-align': 'left'
});
col.append(groupBlock);
}
}
/**
* Load OS images into column
*
* @param col Table column where OS images will be placed
*/
function loadOSImages(col) {
// Get group names and description and append to group column
if (!$.cookie('srv_imagenames')) {
var infoBar = createInfoBar('No selectable image available');
col.append(infoBar);
return;
}
var imgNames = $.cookie('srv_imagenames').split(',');
var imgBlock, radio, args, name, desc;
for (var i in imgNames) {
args = imgNames[i].split(':');
name = args[0];
desc = args[1];
// Create block for each image
imgBlock = $('').css({
'border': '1px solid',
'max-width': '200px',
'margin': '5px auto',
'padding': '5px',
'display': 'block',
'vertical-align': 'middle',
'cursor': 'pointer',
'white-space': 'normal'
}).click(function(){
$(this).children('input:radio').attr('checked', 'checked');
$(this).parents('td').find('div').attr('class', 'ui-state-default');
$(this).attr('class', 'ui-state-active');
$('#select-table tbody tr:eq(0) td:eq(3) input[name="master"]').attr('checked', '');
$('#select-table tbody tr:eq(0) td:eq(3) input[name="master"]').parents('td').find('div').attr('class', 'ui-state-default');
});
radio = $('').css('display', 'none');
imgBlock.append(radio, $('' + name + ': ' + desc + ''));
imgBlock.children('span').css({
'display': 'block',
'margin': '5px',
'text-align': 'left'
});
col.append(imgBlock);
}
}
/**
* Load golden images into column
*
* @param col Table column where master copies will be placed
*/
function loadGoldenImages(col) {
// Get group names and description and append to group column
if (!$.cookie('srv_goldenimages')) {
var infoBar = createInfoBar('No selectable master copies available');
col.append(infoBar);
return;
}
var imgNames = $.cookie('srv_goldenimages').split(',');
var imgBlock, radio, args, name, desc;
for (var i in imgNames) {
args = imgNames[i].split(':');
name = args[0];
desc = args[1];
// Create block for each image
imgBlock = $('').css({
'border': '1px solid',
'max-width': '200px',
'margin': '5px auto',
'padding': '5px',
'display': 'block',
'vertical-align': 'middle',
'cursor': 'pointer',
'white-space': 'normal'
}).click(function(){
$(this).children('input:radio').attr('checked', 'checked');
$(this).parents('td').find('div').attr('class', 'ui-state-default');
$(this).attr('class', 'ui-state-active');
// Un-select zVM and image
$('#select-table tbody tr:eq(0) td:eq(2) input[name="image"]').attr('checked', '');
$('#select-table tbody tr:eq(0) td:eq(2) input[name="image"]').parents('td').find('div').attr('class', 'ui-state-default');
$('#select-table tbody tr:eq(0) td:eq(0) input[name="hcp"]').attr('checked', '');
$('#select-table tbody tr:eq(0) td:eq(0) input[name="hcp"]').parents('td').find('div').attr('class', 'ui-state-default');
});
radio = $('').css('display', 'none');
imgBlock.append(radio, $('' + name + ': ' + desc + ''));
imgBlock.children('span').css({
'display': 'block',
'margin': '5px',
'text-align': 'left'
});
col.append(imgBlock);
}
}
/**
* Set a cookie for zVM host names (service page)
*
* @param data Data from HTTP request
*/
function setzVMCookies(data) {
if (data.rsp[0].length) {
var zvms = new Array();
var hosts = data.rsp[0].split("\n");
for ( var i = 0; i < hosts.length; i++) {
if (hosts[i] != null && hosts[i] != "") {
zvms.push(hosts[i]);
}
}
// Set cookie to expire in 60 minutes
var exDate = new Date();
exDate.setTime(exDate.getTime() + (240 * 60 * 1000));
$.cookie('zvms', zvms, { expires: exDate });
}
}
/**
* Set a cookie for master copies (service page)
*
* @param data Data from HTTP request
*/
function setGoldenImagesCookies(data) {
if (data.rsp[0].length) {
var copies = new Array();
var tmp = data.rsp[0].split(",");
for ( var i = 0; i < tmp.length; i++) {
if (tmp[i] != null && tmp[i] != "") {
copies.push(tmp[i]);
}
}
// Set cookie to expire in 60 minutes
var exDate = new Date();
exDate.setTime(exDate.getTime() + (240 * 60 * 1000));
$.cookie('srv_goldenimages', copies, { expires: exDate });
}
}
/**
* Set a cookie for disk pool names of a given node
*
* @param data Data from HTTP request
*/
function setDiskPoolCookies(data) {
if (data.rsp[0].length) {
var node = data.msg;
var pools = data.rsp[0].split(node + ': ');
for (var i in pools) {
pools[i] = jQuery.trim(pools[i]);
}
// Set cookie to expire in 60 minutes
var exDate = new Date();
exDate.setTime(exDate.getTime() + (240 * 60 * 1000));
$.cookie(node + 'diskpools', pools, { expires: exDate });
}
}
/**
* Set a cookie for zFCP pool names of a given node
*
* @param data Data from HTTP request
*/
function setZfcpPoolCookies(data) {
if (data.rsp[0].length) {
var node = data.msg;
var pools = data.rsp[0].split(node + ': ');
for (var i in pools) {
pools[i] = jQuery.trim(pools[i]);
}
// Set cookie to expire in 60 minutes
var exDate = new Date();
exDate.setTime(exDate.getTime() + (240 * 60 * 1000));
$.cookie(node + 'zfcppools', pools, { expires: exDate });
}
}
/**
* Create virtual machine (service page)
*
* @param tabId Tab ID
* @param group Group
* @param hcp Hardware control point
* @param img OS image
*/
function createzVM(tabId, group, hcp, img, owner) {
// Submit request to create VM
// webportal provzlinux [group] [hcp] [image] [owner]
var iframe = createIFrame('lib/srv_cmd.php?cmd=webportal&tgt=&args=provzlinux;' + group + ';' + hcp + ';' + img + ';' + owner + '&msg=&opts=flush');
iframe.prependTo($('#' + tabId));
}
/**
* Query the profiles that exists
*
* @param panelId Panel ID
*/
function queryProfiles(panelId) {
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'tabdump',
tgt : '',
args : 'osimage',
msg : panelId
},
success : function(data) {
var panelId = data.msg;
setOSImageCookies(data);
configProfilePanel(panelId);
}
});
}
/**
* Panel to configure directory entries and disks for a profile
*
* @param panelId Panel ID
*/
function configProfilePanel(panelId) {
// Wipe panel clean
$('#' + panelId).empty();
// Add info bar
$('#' + panelId).append(createInfoBar('Create, edit, and delete profiles for the self-service portal. It is important to note the default z/VM user ID for any profile should be LXUSR.'));
// Create table
var tableId = 'zvmProfileTable';
var table = new DataTable(tableId);
table.init(['', 'Profile', 'Disk pool', 'Disk size', 'Directory entry']);
// Insert profiles into table
var profiles = $.cookie('profiles').split(',');
profiles.push('default'); // Add default profile
for (var i in profiles) {
if (profiles[i]) {
// Columns are: profile, selectable, description, disk pool, disk size, and directory entry
var cols = new Array(profiles[i], '', '', '');
// Add remove button where id = user name
cols.unshift('');
// Add row
table.add(cols);
}
}
// Append datatable to tab
$('#' + panelId).append(table.object());
// Turn into datatable
$('#' + tableId).dataTable({
'iDisplayLength': 50,
'bLengthChange': false,
"bScrollCollapse": true,
"sScrollY": "400px",
"sScrollX": "110%",
"bAutoWidth": true,
"oLanguage": {
"oPaginate": {
"sNext": "",
"sPrevious": ""
}
}
});
// Create action bar
var actionBar = $('').css("width", "450px");
// Create a profile
var createLnk = $('Create');
createLnk.click(function() {
profileDialog();
});
// Edit a profile
var editLnk = $('Edit');
editLnk.click(function() {
var profiles = $('#' + tableId + ' input[type=checkbox]:checked');
for (var i in profiles) {
var profile = profiles.eq(i).attr('name');
if (profile) {
// Column order is: profile, selectable, disk pool, disk size, and directory entry
var cols = profiles.eq(i).parents('tr').find('td');
var pool = cols.eq(2).text();
var size = cols.eq(3).text();
var entry = cols.eq(4).html().replace(new RegExp(' ', 'g'), '\n');
editProfileDialog(profile, pool, size, entry);
}
}
});
// Delete a profile
var deleteLnk = $('Delete');
deleteLnk.click(function() {
var profiles = getNodesChecked(tableId);
if (profiles) {
deleteProfileDialog(profiles);
}
});
// Refresh profiles table
var refreshLnk = $('Refresh');
refreshLnk.click(function() {
queryProfiles(panelId);
});
// Create an action menu
var actionsMenu = createMenu([refreshLnk, createLnk, editLnk, deleteLnk]);
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);
// Resize accordion
$('#' + tableId).parents('.ui-accordion').accordion('resize');
// Query directory entries and disk pool/size for each profile
for (var i in profiles) {
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'webrun',
tgt : '',
args : 'getdefaultuserentry;' + profiles[i],
msg : 'out=' + panelId + ';profile=' + profiles[i]
},
success: insertDirectoryEntry
});
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'webrun',
tgt : '',
args : 'getzdiskinfo;' + profiles[i],
msg : 'out=' + panelId + ';profile=' + profiles[i]
},
success: insertDiskInfo
});
}
}
/**
* Insert the directory entry into the profile table
*
* @param data Data from HTTP request
*/
function insertDirectoryEntry(data) {
var tableId = 'zvmProfileTable';
var args = data.msg.split(';');
var profile = args[1].replace('profile=', '');
// Do not continue if there is nothing
if (!data.rsp.length)
return;
var entry = data.rsp[0].replace(new RegExp('\n', 'g'), ' ');
// Get the row containing the profile
var rowPos = findRow(profile, '#' + tableId, 1);
if (rowPos < 0)
return;
// Update the directory entry column
var dTable = $('#' + tableId).dataTable();
dTable.fnUpdate(entry, rowPos, 4, false);
// Adjust table styling
$('#' + tableId + ' td:nth-child(5)').css({
'text-align': 'left'
});
adjustColumnSize(tableId);
}
/**
* Insert the disk info into the profile table
*
* @param data Data from HTTP request
*/
function insertDiskInfo(data) {
var tableId = 'zvmProfileTable';
var args = data.msg.split(';');
var profile = args[1].replace('profile=', '');
// Do not continue if there is nothing
if (!data.rsp.length)
return;
// Get the row containing the profile
var rowPos = findRow(profile, '#' + tableId, 1);
if (rowPos < 0)
return;
// Update the disk info columns
var dTable = $('#' + tableId).dataTable();
var tmp = "";
var pool = "";
var eckdSize = 0;
var info = data.rsp[0].split('\n');
for (var i in info) {
if (info[i].indexOf('diskpool') > -1) {
tmp = info[i].split('=');
pool = jQuery.trim(tmp[1]);
dTable.fnUpdate(pool, rowPos, 2, false);
} if (info[i].indexOf('eckd_size') > -1) {
tmp = info[i].split('=');
eckdSize = jQuery.trim(tmp[1]);
dTable.fnUpdate(eckdSize, rowPos, 3, false);
}
}
// Adjust table styling
adjustColumnSize(tableId);
}
/**
* Open profile dialog
*/
function profileDialog() {
// Create form to add profile
var dialogId = 'zvmCreateProfile';
var profileForm = $('');
// Create info bar
var info = createInfoBar('Configure the default settings for a profile');
profileForm.append(info);
// Insert profiles into select
var profileSelect = $('');
var profiles = $.cookie('profiles').split(',');
profiles.push('default'); // Add default profile
for (var i in profiles) {
if (profiles[i]) {
profileSelect.append($(''));
}
}
profileForm.append($('').append(profileSelect));
profileForm.append('');
profileForm.append('');
profileForm.append('');
// Generate tooltips
profileForm.find('div input[title],textarea[title],select[title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "fade",
opacity: 0.8,
delay: 0,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
},
// Change z index to show tooltip in front
onBeforeShow: function() {
this.getTip().css('z-index', $.topZIndex());
}
});
// Open dialog to add processor
profileForm.dialog({
title:'Configure profile',
modal: true,
close: function(){
$(this).remove();
},
width: 600,
buttons: {
"Ok": function(){
// Remove any warning messages
$(this).find('.ui-state-error').remove();
// Find profile attributes
var profile = $(this).find('select[name=profile]').val();
var pool = $(this).find('input[name=disk_pool]').val();
var size = $(this).find('input[name=disk_size_eckd]').val();
var entry = $(this).find('textarea[name=directory_entry]').val();
// If inputs are not complete, show warning message
if (!profile || !pool || !size || !entry) {
var warn = createWarnBar('Please provide a value for each missing field.');
warn.prependTo($(this));
} else {
// Change dialog buttons
$('#' + dialogId).dialog('option', 'buttons', {
'Close':function(){
$(this).dialog('destroy').remove();
}
});
// Write file to /var/tmp
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'write',
tgt : '/var/tmp/' + profile + '.direct',
args : '',
cont : entry,
msg : dialogId + ';' + profile + ';' + pool + ';' + size
},
success : function(data) {
var args = data.msg.split(';');
// Create profile in xCAT
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'webrun',
tgt : '',
args : 'mkzprofile;' + args[1] + ';' + args[2] + ';' + args[3],
msg : args[0]
},
success: updatePanel
});
}
});
}
},
"Cancel": function() {
$(this).dialog( "close" );
}
}
});
}
/**
* Open dialog to confirm profile delete
*
* @param profiles Profiles to delete
*/
function deleteProfileDialog(profiles) {
// Create form to delete disk to pool
var dialogId = 'zvmDeleteProfile';
var deleteForm = $('');
// Create info bar
var info = createInfoBar('Are you sure you want to delete ' + profiles.replace(new RegExp(',', 'g'), ', ') + '?');
deleteForm.append(info);
// Open dialog to delete user
deleteForm.dialog({
title:'Delete profile',
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 : 'rmzprofile;' + profiles,
msg : dialogId
},
success : updatePanel
});
},
"Cancel": function() {
$(this).dialog( "close" );
}
}
});
}
/**
* Open dialog to edit profile
*
* @param profile Profile to edit
* @param pool Disk pool
* @param size Disk size
* @param entry Directory entry
*/
function editProfileDialog(profile, pool, size, entry) {
// Create form to add profile
var dialogId = 'zvmEditProfile_' + profile;
var profileForm = $('');
// Create info bar
var info = createInfoBar('Configure the default settings for a profile');
profileForm.append(info);
// Insert profiles into select
var profileSelect = $('');
var profiles = $.cookie('profiles').split(',');
profiles.push('default'); // Add default profile
for (var i in profiles) {
if (profiles[i]) {
profileSelect.append($(''));
}
}
profileForm.append($('').append(profileSelect));
profileForm.append('');
profileForm.append('');
profileForm.append('');
// Insert profile values
profileSelect.val(profile);
profileForm.find('input[name=disk_pool]').val(pool);
profileForm.find('input[name=disk_size_eckd]').val(size);
profileForm.find('textarea[name=directory_entry]').val(entry);
// Generate tooltips
profileForm.find('div input[title],textarea[title],select[title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "toggle",
opacity: 0.8,
delay: 0,
predelay: 800,
events: {
def: "mouseover,mouseout",
input: "mouseover,mouseout",
widget: "focus mouseover,blur mouseout",
tooltip: "mouseover,mouseout"
},
// Change z index to show tooltip in front
onBeforeShow: function() {
this.getTip().css('z-index', $.topZIndex());
}
});
// Open dialog to add processor
profileForm.dialog({
title:'Configure profile',
modal: true,
close: function(){
$(this).remove();
},
width: 600,
buttons: {
"Ok": function(){
// Remove any warning messages
$(this).find('.ui-state-error').remove();
// Find profile attributes
var profile = $(this).find('select[name=profile]').val();
var pool = $(this).find('input[name=disk_pool]').val();
var size = $(this).find('input[name=disk_size_eckd]').val();
var entry = $(this).find('textarea[name=directory_entry]').val();
// If inputs are not complete, show warning message
if (!profile || !pool || !size || !entry) {
var warn = createWarnBar('Please provide a value for each missing field.');
warn.prependTo($(this));
} else {
// Change dialog buttons
$('#' + dialogId).dialog('option', 'buttons', {
'Close':function(){
$(this).dialog('destroy').remove();
}
});
// A newline at the end of directory entry is needed
entry = entry.replace(/^\s+|\s+$/g, '');
entry += '\n';
// Write file to /var/tmp
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'write',
tgt : '/var/tmp/' + profile + '.direct',
args : '',
cont : entry,
msg : dialogId + ';' + profile + ';' + pool + ';' + size
},
success : function(data) {
var args = data.msg.split(';');
// Create profile in xCAT
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'webrun',
tgt : '',
args : 'mkzprofile;' + args[1] + ';' + args[2] + ';' + args[3],
msg : args[0]
},
success: updatePanel
});
}
});
}
},
"Cancel": function() {
$(this).dialog( "close" );
}
}
});
}
/**
* Get a hash map containing the zHCP to z/VM system mapping
*
* @returns Hash map containing the zHCP to z/VM system mapping
*/
function getHcpZvmHash() {
// Get zVM host names
if (!$.cookie('zvms')) {
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
async: false,
data : {
cmd : 'webportal',
tgt : '',
args : 'lszvm',
msg : ''
},
success : function(data) {
setzVMCookies(data);
}
});
}
var zvms = $.cookie('zvms').split(',');
var hcp2zvm = new Object();
var args, zvm, iHcp, tmp;
for (var i in zvms) {
args = zvms[i].split(':');
zvm = args[0].toLowerCase();
if (args[1].indexOf('.') != -1) {
tmp = args[1].split('.');
iHcp = tmp[0];
} else {
iHcp = args[1];
}
hcp2zvm[iHcp] = zvm;
}
return hcp2zvm;
}