|
|
|
@ -1,45 +1,9 @@
|
|
|
|
|
/**
|
|
|
|
|
* 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;
|
|
|
|
|
}
|
|
|
|
|
var diskSpace; // Hash containing the disk pool space
|
|
|
|
|
var zfcpSpace; // Hash containing the zFcp pool space
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Get the network datatable
|
|
|
|
@ -965,76 +929,160 @@ function getZResources(data) {
|
|
|
|
|
// Delete loader
|
|
|
|
|
$('#' + tabId).find('img[src="images/loader.gif"]').remove();
|
|
|
|
|
|
|
|
|
|
// Obtain mapping for zHCP to zVM system
|
|
|
|
|
var hcp2zvm = new Object();
|
|
|
|
|
hcp2zvm = getHcpZvmHash();
|
|
|
|
|
|
|
|
|
|
// Create accordion panel for disk
|
|
|
|
|
diskSpace = new Object();
|
|
|
|
|
var resourcesAccordion = $('<div id="zvmResourceAccordion"></div>');
|
|
|
|
|
var diskSection = $('<div id="zvmDiskResource"></div>');
|
|
|
|
|
var diskLnk = $('<h3><a href="#">Disks</a></h3>').click(function () {
|
|
|
|
|
// Do not load panel again if it is already loaded
|
|
|
|
|
if ($('#zvmDiskResource').children().length)
|
|
|
|
|
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)
|
|
|
|
|
if ($.cookie('hcp').indexOf(',') > -1) {
|
|
|
|
|
hcps = $.cookie('hcp').split(',');
|
|
|
|
|
else
|
|
|
|
|
} else {
|
|
|
|
|
hcps.push($.cookie('hcp'));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Query the disk pools for each
|
|
|
|
|
// Create info bar
|
|
|
|
|
var info = createInfoBar('Below are disks that are defined in the EXTENT CONTROL file.');
|
|
|
|
|
$('#zvmDiskResource').append(info);
|
|
|
|
|
|
|
|
|
|
// Create a tab for each zVM LPAR
|
|
|
|
|
var zvmDiskTab = new Tab();
|
|
|
|
|
zvmDiskTab.init();
|
|
|
|
|
$('#zvmDiskResource').append(zvmDiskTab.object());
|
|
|
|
|
for (var i in hcps) {
|
|
|
|
|
$.ajax( {
|
|
|
|
|
var tabId = hcps[i] + 'Disks';
|
|
|
|
|
var diskPanel = $('<div></div>').append(createLoader(''));
|
|
|
|
|
zvmDiskTab.add(tabId, hcp2zvm[hcps[i]], diskPanel, false);
|
|
|
|
|
|
|
|
|
|
diskSpace[hcps[i]] = new Object(); // Create a hash to contain zVM pool
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Query disk pool on-select
|
|
|
|
|
$('#zvmDiskResource').bind('tabsselect', function(event, ui) {
|
|
|
|
|
var hcp = $(ui.panel).attr('id').replace('Disks', '');
|
|
|
|
|
|
|
|
|
|
// If disk pool is already loaded, do not load again
|
|
|
|
|
if ($('#' + hcp2zvm[hcp] + 'DiskDataTable').length) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
url : 'lib/cmd.php',
|
|
|
|
|
dataType : 'json',
|
|
|
|
|
data : {
|
|
|
|
|
cmd : 'lsvm',
|
|
|
|
|
tgt : hcps[i],
|
|
|
|
|
tgt : hcp,
|
|
|
|
|
args : '--diskpoolnames',
|
|
|
|
|
msg : hcps[i]
|
|
|
|
|
msg : hcp
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
success : getDiskPool
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Select the 1st tab
|
|
|
|
|
if (!$('#' + hcp2zvm[hcps[0]] + 'DiskDataTable').length) {
|
|
|
|
|
$.ajax({
|
|
|
|
|
url : 'lib/cmd.php',
|
|
|
|
|
dataType : 'json',
|
|
|
|
|
data : {
|
|
|
|
|
cmd : 'lsvm',
|
|
|
|
|
tgt : hcps[0],
|
|
|
|
|
args : '--diskpoolnames',
|
|
|
|
|
msg : hcps[0]
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
success : getDiskPool
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Create accordion panel for zFCP devices
|
|
|
|
|
var zfcpSection = $('<div id="zfcpResource"></div>');
|
|
|
|
|
zfcpSpace = new Object();
|
|
|
|
|
var zfcpSection = $('<div id="zFcpResource"></div>');
|
|
|
|
|
var zfcpLnk = $('<h3><a href="#">zFCP</a></h3>').click(function () {
|
|
|
|
|
// Do not load panel again if it is already loaded
|
|
|
|
|
if ($('#zfcpResource').children().length)
|
|
|
|
|
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)
|
|
|
|
|
if ($.cookie('hcp').indexOf(',') > -1) {
|
|
|
|
|
hcps = $.cookie('hcp').split(',');
|
|
|
|
|
else
|
|
|
|
|
} else {
|
|
|
|
|
hcps.push($.cookie('hcp'));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for ( var i in hcps) {
|
|
|
|
|
// Gather networks from hardware control points
|
|
|
|
|
$.ajax( {
|
|
|
|
|
// Resource tab ID
|
|
|
|
|
var info = createInfoBar('Below are devices that are defined internally in the zFCP pools.');
|
|
|
|
|
$('#zFcpResource').append(info);
|
|
|
|
|
|
|
|
|
|
// Create a tab for each zVM LPAR
|
|
|
|
|
var zFcpTab = new Tab();
|
|
|
|
|
zFcpTab.init();
|
|
|
|
|
$('#zFcpResource').append(zFcpTab.object());
|
|
|
|
|
for (var i in hcps) {
|
|
|
|
|
var tabId = hcps[i] + 'Zfcps';
|
|
|
|
|
var zfcpPanel = $('<div></div>').append(createLoader(''));
|
|
|
|
|
zFcpTab.add(tabId, hcp2zvm[hcps[i]], zfcpPanel, false);
|
|
|
|
|
|
|
|
|
|
zfcpSpace[hcps[i]] = new Object(); // Create a hash to contain zVM pool
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Query zFcp pool on-select
|
|
|
|
|
$('#zFcpResource').bind('tabsselect', function(event, ui) {
|
|
|
|
|
var hcp = $(ui.panel).attr('id').replace('Zfcps', '');
|
|
|
|
|
|
|
|
|
|
// If zFcp pool is already loaded, do not load again
|
|
|
|
|
if ($('#' + hcp2zvm[hcp] + 'ZfcpDataTable').length) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$.ajax({
|
|
|
|
|
url : 'lib/cmd.php',
|
|
|
|
|
dataType : 'json',
|
|
|
|
|
data : {
|
|
|
|
|
cmd : 'lsvm',
|
|
|
|
|
tgt : hcps[i],
|
|
|
|
|
tgt : hcp,
|
|
|
|
|
args : '--zfcppoolnames',
|
|
|
|
|
msg : hcps[i]
|
|
|
|
|
msg : hcp
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
success : getZfcpPool
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Select the 1st tab
|
|
|
|
|
if (!$('#' + hcp2zvm[hcps[0]] + 'ZfcpDataTable').length) {
|
|
|
|
|
$.ajax({
|
|
|
|
|
url : 'lib/cmd.php',
|
|
|
|
|
dataType : 'json',
|
|
|
|
|
data : {
|
|
|
|
|
cmd : 'lsvm',
|
|
|
|
|
tgt : hcps[0],
|
|
|
|
|
args : '--zfcppoolnames',
|
|
|
|
|
msg : hcps[0]
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
success : getZfcpPool
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
@ -1042,22 +1090,24 @@ function getZResources(data) {
|
|
|
|
|
var networkSection = $('<div id="zvmNetworkResource"></div>');
|
|
|
|
|
var networkLnk = $('<h3><a href="#">Networks</a></h3>').click(function () {
|
|
|
|
|
// Do not load panel again if it is already loaded
|
|
|
|
|
if ($('#zvmNetworkResource').children().length)
|
|
|
|
|
if ($('#zvmNetworkResource').children().length) {
|
|
|
|
|
return;
|
|
|
|
|
else
|
|
|
|
|
} 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)
|
|
|
|
|
if ($.cookie('hcp').indexOf(',') > -1) {
|
|
|
|
|
hcps = $.cookie('hcp').split(',');
|
|
|
|
|
else
|
|
|
|
|
} else {
|
|
|
|
|
hcps.push($.cookie('hcp'));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for ( var i in hcps) {
|
|
|
|
|
for (var i in hcps) {
|
|
|
|
|
// Gather networks from hardware control points
|
|
|
|
|
$.ajax( {
|
|
|
|
|
url : 'lib/cmd.php',
|
|
|
|
@ -1078,7 +1128,7 @@ function getZResources(data) {
|
|
|
|
|
|
|
|
|
|
// Append accordion to tab
|
|
|
|
|
$('#' + tabId).append(resourcesAccordion);
|
|
|
|
|
resourcesAccordion.accordion();
|
|
|
|
|
resourcesAccordion.accordion();
|
|
|
|
|
networkLnk.trigger('click');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -3181,7 +3231,7 @@ function removeNic(node, nic) {
|
|
|
|
|
* @param data Data from HTTP request
|
|
|
|
|
*/
|
|
|
|
|
function setNetworkCookies(data) {
|
|
|
|
|
if (data.rsp.length) {
|
|
|
|
|
if (data.rsp.length && data.rsp[0].indexOf("Failed") == -1) {
|
|
|
|
|
var node = data.msg;
|
|
|
|
|
var networks = data.rsp[0].split(node + ': ');
|
|
|
|
|
|
|
|
|
@ -3203,12 +3253,13 @@ function getDiskPool(data) {
|
|
|
|
|
var pools = data.rsp[0].split(hcp + ': ');
|
|
|
|
|
|
|
|
|
|
// Get contents of each disk pool
|
|
|
|
|
for ( var i in pools) {
|
|
|
|
|
for (var i in pools) {
|
|
|
|
|
pools[i] = jQuery.trim(pools[i]);
|
|
|
|
|
if (pools[i]) {
|
|
|
|
|
pools[i] = jQuery.trim(pools[i]);
|
|
|
|
|
|
|
|
|
|
diskSpace[hcp][pools[i]] = new Object(); // Create hash to contain free and used space
|
|
|
|
|
|
|
|
|
|
// Get used space
|
|
|
|
|
$.ajax( {
|
|
|
|
|
$.ajax({
|
|
|
|
|
url : 'lib/cmd.php',
|
|
|
|
|
dataType : 'json',
|
|
|
|
|
data : {
|
|
|
|
@ -3222,7 +3273,7 @@ function getDiskPool(data) {
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Get free space
|
|
|
|
|
$.ajax( {
|
|
|
|
|
$.ajax({
|
|
|
|
|
url : 'lib/cmd.php',
|
|
|
|
|
dataType : 'json',
|
|
|
|
|
data : {
|
|
|
|
@ -3238,7 +3289,11 @@ function getDiskPool(data) {
|
|
|
|
|
} // End of for
|
|
|
|
|
} else {
|
|
|
|
|
// Load empty table
|
|
|
|
|
loadDiskPoolTable();
|
|
|
|
|
var data = {
|
|
|
|
|
msg : 'hcp=' + data.msg + ';',
|
|
|
|
|
rsp : []
|
|
|
|
|
};
|
|
|
|
|
loadDiskPoolTable(data);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -3254,11 +3309,12 @@ function getZfcpPool(data) {
|
|
|
|
|
|
|
|
|
|
// Get contents of each disk pool
|
|
|
|
|
for (var i in pools) {
|
|
|
|
|
pools[i] = jQuery.trim(pools[i]);
|
|
|
|
|
if (pools[i]) {
|
|
|
|
|
pools[i] = jQuery.trim(pools[i]);
|
|
|
|
|
|
|
|
|
|
zfcpSpace[hcp][pools[i]] = new Object(); // Create hash to contain free and used space
|
|
|
|
|
|
|
|
|
|
// Query used and free space
|
|
|
|
|
$.ajax( {
|
|
|
|
|
$.ajax({
|
|
|
|
|
url : 'lib/cmd.php',
|
|
|
|
|
dataType : 'json',
|
|
|
|
|
data : {
|
|
|
|
@ -3274,7 +3330,11 @@ function getZfcpPool(data) {
|
|
|
|
|
} // End of for
|
|
|
|
|
} else {
|
|
|
|
|
// Load empty table
|
|
|
|
|
loadZfcpPoolTable();
|
|
|
|
|
var data = {
|
|
|
|
|
msg : 'hcp=' + data.msg + ';',
|
|
|
|
|
rsp : []
|
|
|
|
|
};
|
|
|
|
|
loadZfcpPoolTable(data);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -3317,13 +3377,9 @@ function getNetwork(data) {
|
|
|
|
|
* @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) {
|
|
|
|
|
if (data.rsp.length) {
|
|
|
|
|
// Do not continue if the call failed
|
|
|
|
|
if (!data.rsp.length && data.rsp[0].indexOf("Failed") > 0) {
|
|
|
|
|
return;
|
|
|
|
@ -3335,36 +3391,36 @@ function loadDiskPoolTable(data) {
|
|
|
|
|
args = data.msg.split(';');
|
|
|
|
|
hcp = args[0].replace('hcp=', '');
|
|
|
|
|
pool = args[1].replace('pool=', '');
|
|
|
|
|
stat = args[2].replace('stat=', '');
|
|
|
|
|
stat = jQuery.trim(args[2].replace('stat=', ''));
|
|
|
|
|
tmp = data.rsp[0].split(hcp + ': ');
|
|
|
|
|
|
|
|
|
|
// Initialize free or used space in hash
|
|
|
|
|
diskSpace[hcp][pool][stat] = 0;
|
|
|
|
|
} else {
|
|
|
|
|
// Provide empty values so the table will be generated
|
|
|
|
|
hcp = '';
|
|
|
|
|
args = data.msg.split(';');
|
|
|
|
|
|
|
|
|
|
// Provide empty values so the table will be generated
|
|
|
|
|
hcp = args[0].replace('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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Remove loader
|
|
|
|
|
var panelId = hcp + 'Disks';
|
|
|
|
|
$('#' + panelId).find('img[src="images/loader.gif"]').remove();
|
|
|
|
|
|
|
|
|
|
// Get datatable
|
|
|
|
|
var tableId = 'zDiskDataTable';
|
|
|
|
|
var dTable = getDiskDataTable();
|
|
|
|
|
if (!dTable) {
|
|
|
|
|
var tableId = hcp2zvm[hcp] + 'DiskDataTable';
|
|
|
|
|
var dTable;
|
|
|
|
|
if (!$('#' + tableId).length) {
|
|
|
|
|
// Create a datatable
|
|
|
|
|
var table = new DataTable(tableId);
|
|
|
|
|
// Resource headers: volume ID, device type, start address, and size
|
|
|
|
|
table.init( [ '<input type="checkbox" onclick="selectAllDisk(event, $(this))">', 'z/VM', 'Pool', 'Status', 'Volume', 'Device type', 'Starting address', 'Size' ]);
|
|
|
|
|
|
|
|
|
|
// Append datatable to panel
|
|
|
|
|
$('#' + panelId).append(table.object());
|
|
|
|
|
$('#' + hcp + 'Disks').append(table.object());
|
|
|
|
|
|
|
|
|
|
// Turn into datatable
|
|
|
|
|
dTable = $('#' + tableId).dataTable({
|
|
|
|
@ -3380,7 +3436,8 @@ function loadDiskPoolTable(data) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
setDiskDataTable(dTable);
|
|
|
|
|
} else {
|
|
|
|
|
dTable = $('#' + tableId).dataTable();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Skip index 0 and 1 because it contains nothing
|
|
|
|
@ -3388,11 +3445,79 @@ function loadDiskPoolTable(data) {
|
|
|
|
|
tmp[i] = jQuery.trim(tmp[i]);
|
|
|
|
|
var diskAttrs = tmp[i].split(' ');
|
|
|
|
|
var key = hcp2zvm[hcp] + "-" + pool + "-" + diskAttrs[0];
|
|
|
|
|
dTable.fnAddData( [ '<input type="checkbox" name="' + key + '"/>', hcp2zvm[hcp], pool, stat, diskAttrs[0], diskAttrs[1], diskAttrs[2], diskAttrs[3] ]);
|
|
|
|
|
var type = diskAttrs[1];
|
|
|
|
|
|
|
|
|
|
// Calculate disk size
|
|
|
|
|
var size;
|
|
|
|
|
if (type.indexOf('3390') != -1) {
|
|
|
|
|
size = convertCylinders2Gb(parseInt(diskAttrs[3]));
|
|
|
|
|
} else if (type.indexOf('9336') != -1) {
|
|
|
|
|
size = convertBlocks2Gb(parseInt(diskAttrs[3]))
|
|
|
|
|
} else {
|
|
|
|
|
size = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
dTable.fnAddData( [ '<input type="checkbox" name="' + key + '"/>', hcp2zvm[hcp], pool, stat, diskAttrs[0], type, diskAttrs[2], diskAttrs[3] + " (" + size + "G)" ]);
|
|
|
|
|
|
|
|
|
|
// Add up the free or used size
|
|
|
|
|
diskSpace[hcp][pool][stat] += size;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Plot bar chart when all data is gathered
|
|
|
|
|
var plotBarChart = true;
|
|
|
|
|
for (var p in diskSpace[hcp]) {
|
|
|
|
|
if (!('free' in diskSpace[hcp][p]) || !('used' in diskSpace[hcp][p])) {
|
|
|
|
|
plotBarChart = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (plotBarChart) {
|
|
|
|
|
// Bar chart data points
|
|
|
|
|
var ticks = new Array();
|
|
|
|
|
var free = new Array();
|
|
|
|
|
var used = new Array();
|
|
|
|
|
for (var p in diskSpace[hcp]) {
|
|
|
|
|
ticks.push(p);
|
|
|
|
|
|
|
|
|
|
free.push(diskSpace[hcp][p]['free']);
|
|
|
|
|
used.push(diskSpace[hcp][p]['used']);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Create bar chart, only when there is data
|
|
|
|
|
var plot;
|
|
|
|
|
var panelId = hcp + 'Disks';
|
|
|
|
|
$('#' + panelId).prepend($('<div id="' + hcp + 'DiskChart" style="height:300px; width:500px; margin-left:auto; margin-right:auto;"></div>'));
|
|
|
|
|
plot = $.jqplot(hcp + 'DiskChart', [used, free], {
|
|
|
|
|
title: '',
|
|
|
|
|
stackSeries: true,
|
|
|
|
|
seriesDefaults: {
|
|
|
|
|
renderer: $.jqplot.BarRenderer,
|
|
|
|
|
rendererOptions: {barMargin: 25},
|
|
|
|
|
pointLabels: {show: true}
|
|
|
|
|
},
|
|
|
|
|
series: [
|
|
|
|
|
{label: 'Used'},
|
|
|
|
|
{label: 'Free'}
|
|
|
|
|
],
|
|
|
|
|
axes: {
|
|
|
|
|
xaxis: {
|
|
|
|
|
renderer: $.jqplot.CategoryAxisRenderer,
|
|
|
|
|
ticks: ticks
|
|
|
|
|
},
|
|
|
|
|
yaxis: {
|
|
|
|
|
tickOptions: {formatString: '%dG'}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
legend: {
|
|
|
|
|
show: true,
|
|
|
|
|
placement: 'outsideGrid'
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Create actions menu
|
|
|
|
|
if (!$('#zvmDiskResourceActions').length) {
|
|
|
|
|
var menuId = hcp2zvm[hcp] + 'DiskResourceActions';
|
|
|
|
|
if (!$('#' + menuId).length) {
|
|
|
|
|
// Empty filter area
|
|
|
|
|
$('#' + tableId + '_length').empty();
|
|
|
|
|
|
|
|
|
@ -3411,32 +3536,22 @@ function loadDiskPoolTable(data) {
|
|
|
|
|
|
|
|
|
|
// Refresh table
|
|
|
|
|
var refreshLnk = $('<a>Refresh</a>');
|
|
|
|
|
refreshLnk.bind('click', function(event){
|
|
|
|
|
$('#zvmDiskResource').empty().append(createLoader(''));
|
|
|
|
|
setDiskDataTable('');
|
|
|
|
|
refreshLnk.bind('click', function(event) {
|
|
|
|
|
$('#' + panelId).empty().append(createLoader(''));
|
|
|
|
|
|
|
|
|
|
// 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]
|
|
|
|
|
},
|
|
|
|
|
// Query the disk pools
|
|
|
|
|
$.ajax({
|
|
|
|
|
url : 'lib/cmd.php',
|
|
|
|
|
dataType : 'json',
|
|
|
|
|
data : {
|
|
|
|
|
cmd : 'lsvm',
|
|
|
|
|
tgt : hcp,
|
|
|
|
|
args : '--diskpoolnames',
|
|
|
|
|
msg : hcp
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
success : getDiskPool
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
success : getDiskPool
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Add ECKD to system
|
|
|
|
@ -3475,7 +3590,7 @@ function loadDiskPoolTable(data) {
|
|
|
|
|
var advancedMenu = createMenu([addEckdLnk, addPageSpoolLnk, addEdevLnk, removeEdevLnk, shareLnk]);
|
|
|
|
|
|
|
|
|
|
// Create action bar
|
|
|
|
|
var actionBar = $('<div id="zvmDiskResourceActions" class="actionBar"></div>').css("width", "450px");
|
|
|
|
|
var actionBar = $('<div id="' + menuId + '" class="actionBar"></div>').css("width", "450px");
|
|
|
|
|
|
|
|
|
|
// Create an action menu
|
|
|
|
|
var actionsMenu = createMenu([refreshLnk, addLnk, removeLnk, [advancedLnk, advancedMenu]]);
|
|
|
|
@ -3495,7 +3610,7 @@ function loadDiskPoolTable(data) {
|
|
|
|
|
$('#' + tableId + '_length').prepend(menuDiv);
|
|
|
|
|
$('#' + tableId + '_length').css({
|
|
|
|
|
'padding': '0px',
|
|
|
|
|
'width': '500px'
|
|
|
|
|
'width': '460px'
|
|
|
|
|
});
|
|
|
|
|
$('#' + tableId + '_filter').css('padding', '10px');
|
|
|
|
|
menuDiv.append(actionBar);
|
|
|
|
@ -3510,14 +3625,10 @@ function loadDiskPoolTable(data) {
|
|
|
|
|
*
|
|
|
|
|
* @param data HTTP request data
|
|
|
|
|
*/
|
|
|
|
|
function loadZfcpPoolTable(data) {
|
|
|
|
|
// Delete loader
|
|
|
|
|
var panelId = 'zfcpResource';
|
|
|
|
|
$('#' + panelId).find('img[src="images/loader.gif"]').remove();
|
|
|
|
|
|
|
|
|
|
function loadZfcpPoolTable(data) {
|
|
|
|
|
var hcp2zvm = new Object();
|
|
|
|
|
var args, hcp, pool, tmp;
|
|
|
|
|
if (data) {
|
|
|
|
|
if (data.rsp.length) {
|
|
|
|
|
// Do not continue if the call failed
|
|
|
|
|
if (!data.rsp.length && data.rsp[0].indexOf("Failed") > 0) {
|
|
|
|
|
return;
|
|
|
|
@ -3530,29 +3641,32 @@ function loadZfcpPoolTable(data) {
|
|
|
|
|
hcp = args[0].replace('hcp=', '');
|
|
|
|
|
pool = args[1].replace('pool=', '');
|
|
|
|
|
tmp = data.rsp[0].split(hcp + ': ');
|
|
|
|
|
|
|
|
|
|
// Initialize free, reserved, and used space in hash
|
|
|
|
|
zfcpSpace[hcp][pool]['free'] = 0;
|
|
|
|
|
zfcpSpace[hcp][pool]['used'] = 0;
|
|
|
|
|
zfcpSpace[hcp][pool]['reserved'] = 0;
|
|
|
|
|
} else {
|
|
|
|
|
// Provide empty values so the table will be generated
|
|
|
|
|
hcp = '';
|
|
|
|
|
pool = ''
|
|
|
|
|
args = data.msg.split(';');
|
|
|
|
|
|
|
|
|
|
// Provide empty values so the table will be generated
|
|
|
|
|
hcp = args[0].replace('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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Remove loader
|
|
|
|
|
var panelId = hcp + 'Zfcps';
|
|
|
|
|
$('#' + panelId).find('img[src="images/loader.gif"]').remove();
|
|
|
|
|
|
|
|
|
|
// Get datatable
|
|
|
|
|
var tableId = 'zFcpDataTable';
|
|
|
|
|
var dTable = getZfcpDataTable();
|
|
|
|
|
if (!dTable) {
|
|
|
|
|
// Create a datatable
|
|
|
|
|
var tableId = hcp2zvm[hcp] + 'ZfcpDataTable';
|
|
|
|
|
var dTable;
|
|
|
|
|
if (!$('#' + tableId).length) {
|
|
|
|
|
// Create a datatable
|
|
|
|
|
var table = new DataTable(tableId);
|
|
|
|
|
// Resource headers: status, WWPN, LUN, size, owner, channel, tag
|
|
|
|
|
table.init( [ '<input type="checkbox" onclick="selectAllDisk(event, $(this))">', 'z/VM', 'Pool', 'Status', 'Port name', 'Unit number', 'Size', 'Range', 'Owner', 'Channel', 'Tag' ]);
|
|
|
|
|
table.init([ '<input type="checkbox" onclick="selectAllDisk(event, $(this))">', 'z/VM', 'Pool', 'Status', 'Port name', 'Unit number', 'Size', 'Range', 'Owner', 'Channel', 'Tag' ]);
|
|
|
|
|
|
|
|
|
|
// Append datatable to panel
|
|
|
|
|
$('#' + panelId).append(table.object());
|
|
|
|
@ -3571,22 +3685,74 @@ function loadZfcpPoolTable(data) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
setZfcpDataTable(dTable);
|
|
|
|
|
} else {
|
|
|
|
|
dTable = $('#' + tableId).dataTable();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (data) {
|
|
|
|
|
if (data.rsp.length) {
|
|
|
|
|
// Skip index 0 and 1 because it contains nothing
|
|
|
|
|
var key = "";
|
|
|
|
|
for ( var i = 2; i < tmp.length; i++) {
|
|
|
|
|
for (var i = 2; i < tmp.length; i++) {
|
|
|
|
|
tmp[i] = jQuery.trim(tmp[i]);
|
|
|
|
|
var diskAttrs = tmp[i].split(',');
|
|
|
|
|
diskAttrs[0] = diskAttrs[0].toLowerCase();
|
|
|
|
|
var key = hcp2zvm[hcp] + '-' + pool + '-' + diskAttrs[2];
|
|
|
|
|
dTable.fnAddData( [ '<input type="checkbox" name="' + key + '"/>', hcp2zvm[hcp], pool, diskAttrs[0], diskAttrs[1], diskAttrs[2], diskAttrs[3], diskAttrs[4], diskAttrs[5], diskAttrs[6], diskAttrs[7] ]);
|
|
|
|
|
dTable.fnAddData([ '<input type="checkbox" name="' + key + '"/>', hcp2zvm[hcp], pool, diskAttrs[0], diskAttrs[1], diskAttrs[2], diskAttrs[3], diskAttrs[4], diskAttrs[5], diskAttrs[6], diskAttrs[7] ]);
|
|
|
|
|
|
|
|
|
|
// Add up the free or used size
|
|
|
|
|
zfcpSpace[hcp][pool][diskAttrs[0]] += convertString2Gb(diskAttrs[3]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Bar chart data points
|
|
|
|
|
var ticks = new Array();
|
|
|
|
|
var free = new Array();
|
|
|
|
|
var used = new Array();
|
|
|
|
|
for (var pool in zfcpSpace[hcp]) {
|
|
|
|
|
ticks.push(pool);
|
|
|
|
|
|
|
|
|
|
free.push(zfcpSpace[hcp][pool]['free']);
|
|
|
|
|
if ('reserved' in zfcpSpace[hcp][pool]) {
|
|
|
|
|
used.push(zfcpSpace[hcp][pool]['used'] + zfcpSpace[hcp][pool]['reserved']);
|
|
|
|
|
} else {
|
|
|
|
|
used.push(zfcpSpace[hcp][pool]['used']);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Create bar chart, only when there is data
|
|
|
|
|
if ((used.length || free.length) && ticks.length) {
|
|
|
|
|
$('#' + panelId).prepend($('<div id="' + hcp + 'ZfcpChart" style="height:300px; width:500px; margin-left:auto; margin-right:auto;"></div>'));
|
|
|
|
|
var plot = $.jqplot(hcp + 'ZfcpChart', [used, free], {
|
|
|
|
|
title: '',
|
|
|
|
|
stackSeries: true,
|
|
|
|
|
seriesDefaults: {
|
|
|
|
|
renderer: $.jqplot.BarRenderer,
|
|
|
|
|
rendererOptions: {barMargin: 25},
|
|
|
|
|
pointLabels: {show: true}
|
|
|
|
|
},
|
|
|
|
|
series: [
|
|
|
|
|
{label: 'Used'},
|
|
|
|
|
{label: 'Free'}
|
|
|
|
|
],
|
|
|
|
|
axes: {
|
|
|
|
|
xaxis: {
|
|
|
|
|
renderer: $.jqplot.CategoryAxisRenderer,
|
|
|
|
|
ticks: ticks
|
|
|
|
|
},
|
|
|
|
|
yaxis: {
|
|
|
|
|
tickOptions: {formatString: '%dG'}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
legend: {
|
|
|
|
|
show: true,
|
|
|
|
|
placement: 'outsideGrid'
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Create actions menu
|
|
|
|
|
if (!$('#zFcpResourceActions').length) {
|
|
|
|
|
var menuId = hcp2zvm[hcp] + 'ZfcpResourceActions';
|
|
|
|
|
if (!$('#' + menuId).length) {
|
|
|
|
|
// Empty filter area
|
|
|
|
|
$('#' + tableId + '_length').empty();
|
|
|
|
|
|
|
|
|
@ -3606,31 +3772,21 @@ function loadZfcpPoolTable(data) {
|
|
|
|
|
// Refresh table
|
|
|
|
|
var refreshLnk = $('<a>Refresh</a>');
|
|
|
|
|
refreshLnk.bind('click', function(event){
|
|
|
|
|
$('#zfcpResource').empty().append(createLoader(''));
|
|
|
|
|
setZfcpDataTable('');
|
|
|
|
|
$('#' + panelId).empty().append(createLoader(''));
|
|
|
|
|
|
|
|
|
|
// 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]
|
|
|
|
|
},
|
|
|
|
|
// Query the disk pools
|
|
|
|
|
$.ajax({
|
|
|
|
|
url : 'lib/cmd.php',
|
|
|
|
|
dataType : 'json',
|
|
|
|
|
data : {
|
|
|
|
|
cmd : 'lsvm',
|
|
|
|
|
tgt : hcp,
|
|
|
|
|
args : '--zfcppoolnames',
|
|
|
|
|
msg : hcp
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
success : getZfcpPool
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
success : getZfcpPool
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// Create action bar
|
|
|
|
@ -3654,7 +3810,7 @@ function loadZfcpPoolTable(data) {
|
|
|
|
|
$('#' + tableId + '_length').prepend(menuDiv);
|
|
|
|
|
$('#' + tableId + '_length').css({
|
|
|
|
|
'padding': '0px',
|
|
|
|
|
'width': '500px'
|
|
|
|
|
'width': '460px'
|
|
|
|
|
});
|
|
|
|
|
$('#' + tableId + '_filter').css('padding', '10px');
|
|
|
|
|
menuDiv.append(actionBar);
|
|
|
|
@ -5883,7 +6039,7 @@ function loadGoldenImages(col) {
|
|
|
|
|
* @param data Data from HTTP request
|
|
|
|
|
*/
|
|
|
|
|
function setzVMCookies(data) {
|
|
|
|
|
if (data.rsp[0].length) {
|
|
|
|
|
if (data.rsp[0].length && data.rsp[0].indexOf("Failed") == -1) {
|
|
|
|
|
var zvms = new Array();
|
|
|
|
|
var hosts = data.rsp[0].split("\n");
|
|
|
|
|
for ( var i = 0; i < hosts.length; i++) {
|
|
|
|
@ -5905,7 +6061,7 @@ function setzVMCookies(data) {
|
|
|
|
|
* @param data Data from HTTP request
|
|
|
|
|
*/
|
|
|
|
|
function setGoldenImagesCookies(data) {
|
|
|
|
|
if (data.rsp[0].length) {
|
|
|
|
|
if (data.rsp[0].length && data.rsp[0].indexOf("Failed") == -1) {
|
|
|
|
|
var copies = new Array();
|
|
|
|
|
var tmp = data.rsp[0].split(",");
|
|
|
|
|
for ( var i = 0; i < tmp.length; i++) {
|
|
|
|
@ -5927,7 +6083,7 @@ function setGoldenImagesCookies(data) {
|
|
|
|
|
* @param data Data from HTTP request
|
|
|
|
|
*/
|
|
|
|
|
function setDiskPoolCookies(data) {
|
|
|
|
|
if (data.rsp[0].length) {
|
|
|
|
|
if (data.rsp[0].length && data.rsp[0].indexOf("Failed") == -1) {
|
|
|
|
|
var node = data.msg;
|
|
|
|
|
var pools = data.rsp[0].split(node + ': ');
|
|
|
|
|
for (var i in pools) {
|
|
|
|
@ -5947,7 +6103,7 @@ function setDiskPoolCookies(data) {
|
|
|
|
|
* @param data Data from HTTP request
|
|
|
|
|
*/
|
|
|
|
|
function setZfcpPoolCookies(data) {
|
|
|
|
|
if (data.rsp[0].length) {
|
|
|
|
|
if (data.rsp[0].length && data.rsp[0].indexOf("Failed") == -1) {
|
|
|
|
|
var node = data.msg;
|
|
|
|
|
var pools = data.rsp[0].split(node + ': ');
|
|
|
|
|
for (var i in pools) {
|
|
|
|
@ -5981,7 +6137,7 @@ function setzHcpCookies(zhcps) {
|
|
|
|
|
* @param data Data from HTTP request
|
|
|
|
|
*/
|
|
|
|
|
function setUserProfilesCookies(data) {
|
|
|
|
|
if (data.rsp[0].length) {
|
|
|
|
|
if (data.rsp[0].length && data.rsp[0].indexOf("Failed") == -1) {
|
|
|
|
|
var node = data.msg;
|
|
|
|
|
var profiles = data.rsp[0].split(node + ': ');
|
|
|
|
|
for (var i in profiles) {
|
|
|
|
@ -6690,4 +6846,48 @@ function generateUserEntry(userId, password, memory, privilege, profile, cpuCoun
|
|
|
|
|
userDirectoryEntry += "SPOOL 000E 1403 A\n";
|
|
|
|
|
|
|
|
|
|
return userDirectoryEntry;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Convert a string (e.g. 1024M) into GB
|
|
|
|
|
*
|
|
|
|
|
* @param size The string containing the size
|
|
|
|
|
* @return Size in GB
|
|
|
|
|
*/
|
|
|
|
|
function convertString2Gb(size) {
|
|
|
|
|
var sizeGb = 0;
|
|
|
|
|
if (size.indexOf('G') != -1) {
|
|
|
|
|
sizeGb = parseInt(size);
|
|
|
|
|
} else if (size.indexOf('M') != -1) {
|
|
|
|
|
sizeGb = parseInt(size)*1024;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return sizeGb;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Convert a given number of cylinders into GB
|
|
|
|
|
*
|
|
|
|
|
* @param cylinders Number of cylinders
|
|
|
|
|
* @return Size in GB
|
|
|
|
|
*/
|
|
|
|
|
function convertCylinders2Gb(cylinders) {
|
|
|
|
|
var bytes = cylinders * 737280;
|
|
|
|
|
var sizeGb = bytes/(1024*1024*1024);
|
|
|
|
|
sizeGb = Math.round(sizeGb * 10)/10; // Round to 1 decimal place
|
|
|
|
|
|
|
|
|
|
return sizeGb;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Convert a given number of blocks into GB
|
|
|
|
|
*
|
|
|
|
|
* @param blocks Number of blocks
|
|
|
|
|
* @return Size in GB
|
|
|
|
|
*/
|
|
|
|
|
function convertBlocks2Gb(blocks) {
|
|
|
|
|
var sizeGb = blocks/(2048*1024);
|
|
|
|
|
sizeGb = Math.round(sizeGb * 10)/10; // Round to 1 decimal place
|
|
|
|
|
|
|
|
|
|
return sizeGb;
|
|
|
|
|
}
|