/**
* Execute when the DOM is fully loaded
*/
$(document).ready(function() {
// Load utility scripts
includeJs("js/custom/zvmUtils.js");
});
/**
* Constructor
*
* @return Nothing
*/
var zvmPlugin = function() {
};
/**
* Clone node (service page)
*
* @param node
* Node to clone
* @return Nothing
*/
zvmPlugin.prototype.serviceClone = function(node) {
var statBar = createStatusBar(node + 'CloneStat');
var loader = createLoader('');
statBar.find('div').append(loader);
statBar.prependTo($('#manageTab'));
var owner = $.cookie('srv_usrname');
var group = getUserNodeAttr(node, 'groups');
// Submit request to clone VM
// webportal clonezlinux [src node] [group] [owner]
$.ajax({
url : 'lib/srv_cmd.php',
dataType : 'json',
data : {
cmd : 'webportal',
tgt : '',
args : 'clonezlinux;' + node + ';' + group + ';' + owner,
msg : ''
},
success:function(data) {
// Remove loader
statBar.find('img').remove();
// Append output to status bar
for (var i in data.rsp) {
statBar.find('div').append($('
').append(data.rsp[i]));
}
}
});
};
/**
* Load provision page (service page)
*
* @param tabId
* Tab ID where page will reside
* @return Nothing
*/
zvmPlugin.prototype.loadServiceProvisionPage = function(tabId) {
// Create provision form
var provForm = $('
');
// Create info bar
var infoBar = createInfoBar('Provision a Linux virtual machine on System z by selecting the appropriate choices below. Once you are ready, click on Provision to provision the virtual machine.');
provForm.append(infoBar);
// Append to provision tab
$('#' + tabId).append(provForm);
// Create provision table
var provTable = $(' zVM Group Image ');
var provBody = $(' ');
var provFooter = $(' ');
provTable.append(provHeader, provBody, provFooter);
provForm.append(provTable);
provHeader.children('th').css({
'font': 'bold 12px verdana, arial, helvetica, sans-serif'
});
// Create row to contain selections
var provRow = $(' ');
provBody.append(provRow);
// Create columns for zVM, group, and image
var zvmCol = $(' ');
provRow.append(zvmCol);
var groupCol = $(' ');
provRow.append(groupCol);
var imageCol = $(' ');
provRow.append(imageCol);
provRow.children('td').css({
'min-width': '250px'
});
/**
* Provision VM
*/
var provisionBtn = createButton('Provision');
provisionBtn.bind('click', function(event) {
// Remove any warning messages
$(this).parent().find('.ui-state-error').remove();
var hcp = $('#select-table tbody tr:eq(0) td:eq(0) input[name="hcp"]:checked').val();
var group = $('#select-table tbody tr:eq(0) td:eq(1) input[name="group"]:checked').val();
var img = $('#select-table tbody tr:eq(0) td:eq(2) input[name="image"]:checked').val();
var owner = $.cookie('srv_usrname');
if(!hcp || !group || !img) {
// Show warning message
var warn = createWarnBar('You need to select an option for each column');
warn.prependTo($(this).parent());
} else {
// Begin by creating VM
createzVM(tabId, group, hcp, img, owner);
}
});
provForm.append(provisionBtn);
// Load zVMs, groups, and images into their respective columns
loadSrvGroups(groupCol);
loadOSImages(imageCol);
// Get zVM host names
if (!$.cookie('srv_zvm')){
$.ajax( {
url : 'lib/srv_cmd.php',
dataType : 'json',
data : {
cmd : 'webportal',
tgt : '',
args : 'lszvm',
msg : ''
},
success : function(data) {
setzVMCookies(data);
loadzVMs(zvmCol);
}
});
} else {
loadzVMs(zvmCol);
}
};
/**
* Show node inventory (service page)
*
* @param data
* Data from HTTP request
* @return Nothing
*/
zvmPlugin.prototype.loadServiceInventory = function(data) {
var args = data.msg.split(',');
// Get tab ID
var tabId = args[0].replace('out=', '');
// Get node
var node = args[1].replace('node=', '');
// Get node inventory
var inv = data.rsp[0].split(node + ':');
// Remove loader
$('#' + tabId).find('img').remove();
// Create array of property keys
var keys = new Array('userId', 'host', 'os', 'arch', 'hcp', 'priv', 'memory', 'proc', 'disk', 'nic');
// Create hash table for property names
var attrNames = new Object();
attrNames['userId'] = 'z/VM UserID:';
attrNames['host'] = 'z/VM Host:';
attrNames['os'] = 'Operating System:';
attrNames['arch'] = 'Architecture:';
attrNames['hcp'] = 'HCP:';
attrNames['priv'] = 'Privileges:';
attrNames['memory'] = 'Total Memory:';
attrNames['proc'] = 'Processors:';
attrNames['disk'] = 'Disks:';
attrNames['nic'] = 'NICs:';
// Create hash table for node attributes
var attrs = getAttrs(keys, attrNames, inv);
// Create division to hold inventory
var invDivId = node + 'Inventory';
var invDiv = $('
');
var infoBar = createInfoBar('Below is the inventory for the virtual machine you selected.');
invDiv.append(infoBar);
/**
* General info section
*/
var fieldSet = $(' ');
var legend = $('General ');
fieldSet.append(legend);
var oList = $(' ');
var item, label, args;
// Loop through each property
for ( var k = 0; k < 5; k++) {
// Create a list item for each property
item = $(' ');
// Create a label - Property name
label = $('' + attrNames[keys[k]] + ' ');
item.append(label);
for ( var l = 0; l < attrs[keys[k]].length; l++) {
// Create a input - Property value(s)
// Handle each property uniquely
item.append(attrs[keys[k]][l]);
}
oList.append(item);
}
// Append to inventory form
fieldSet.append(oList);
invDiv.append(fieldSet);
/**
* Monitoring section
*/
fieldSet = $(' ');
legend = $('Monitoring ');
fieldSet.append(legend);
getMonitorMetrics(node);
// Append to inventory form
invDiv.append(fieldSet);
/**
* Hardware info section
*/
var hwList, hwItem;
fieldSet = $(' ');
legend = $('Hardware');
fieldSet.append(legend);
oList = $(' ');
// Loop through each property
var label;
for (k = 5; k < keys.length; k++) {
// Create a list item
item = $(' ');
// Create a list to hold the property value(s)
hwList = $('');
hwItem = $(' ');
/**
* Privilege section
*/
if (keys[k] == 'priv') {
// Create a label - Property name
label = $('' + attrNames[keys[k]].replace(':', '') + ' ');
item.append(label);
// Loop through each line
for (l = 0; l < attrs[keys[k]].length; l++) {
// Create a new list item for each line
hwItem = $(' ');
// Determine privilege
args = attrs[keys[k]][l].split(' ');
if (args[0] == 'Directory:') {
label = $('' + args[0] + ' ');
hwItem.append(label);
hwItem.append(args[1]);
} else if (args[0] == 'Currently:') {
label = $('' + args[0] + ' ');
hwItem.append(label);
hwItem.append(args[1]);
}
hwList.append(hwItem);
}
item.append(hwList);
}
/**
* Memory section
*/
else if (keys[k] == 'memory') {
// Create a label - Property name
label = $('' + attrNames[keys[k]].replace(':', '') + ' ');
item.append(label);
// Loop through each value line
for (l = 0; l < attrs[keys[k]].length; l++) {
// Create a new list item for each line
hwItem = $(' ');
hwItem.append(attrs[keys[k]][l]);
hwList.append(hwItem);
}
item.append(hwList);
}
/**
* Processor section
*/
else if (keys[k] == 'proc') {
// Create a label - Property name
label = $('' + attrNames[keys[k]].replace(':', '') + ' ');
item.append(label);
// Create a table to hold processor data
var procTable = $('');
var procBody = $(' ');
// Table columns - Type, Address, ID, Base, Dedicated, and Affinity
var procTabRow = $('');
procTable.append(procTabRow);
var procType, procAddr, procId, procAff;
// Loop through each processor
var n, temp;
for (l = 0; l < attrs[keys[k]].length; l++) {
if (attrs[keys[k]][l]) {
args = attrs[keys[k]][l].split(' ');
// Get processor type, address, ID, and affinity
n = 3;
temp = args[args.length - n];
while (!jQuery.trim(temp)) {
n = n + 1;
temp = args[args.length - n];
}
procType = $('' + temp + ' ');
procAddr = $('' + args[1] + ' ');
procId = $('' + args[5] + ' ');
procAff = $('' + args[args.length - 1] + ' ');
// Base processor
if (args[6] == '(BASE)') {
baseProc = $('' + true + ' ');
} else {
baseProc = $('' + false + ' ');
}
// Dedicated processor
if (args[args.length - 3] == 'DEDICATED') {
dedicatedProc = $('' + true + ' ');
} else {
dedicatedProc = $('' + false + ' ');
}
// Create a new row for each processor
procTabRow = $(' ');
procTabRow.append(procType);
procTabRow.append(procAddr);
procTabRow.append(procId);
procTabRow.append(baseProc);
procTabRow.append(dedicatedProc);
procTabRow.append(procAff);
procBody.append(procTabRow);
}
}
procTable.append(procBody);
item.append(procTable);
}
/**
* Disk section
*/
else if (keys[k] == 'disk') {
// Create a label - Property name
label = $('' + attrNames[keys[k]].replace(':', '') + ' ');
item.append(label);
// Create a table to hold disk (DASD) data
var dasdTable = $('');
var dasdBody = $(' ');
// Table columns - Virtual Device, Type, VolID, Type of Access, and Size
var dasdTabRow = $('');
dasdTable.append(dasdTabRow);
var dasdVDev, dasdType, dasdVolId, dasdAccess, dasdSize;
// Loop through each DASD
for (l = 0; l < attrs[keys[k]].length; l++) {
if (attrs[keys[k]][l]) {
args = attrs[keys[k]][l].split(' ');
// Get DASD virtual device, type, volume ID, access, and size
dasdVDev = $('' + args[1] + ' ');
dasdType = $('' + args[2] + ' ');
dasdVolId = $('' + args[3] + ' ');
dasdAccess = $('' + args[4] + ' ');
dasdSize = $('' + args[args.length - 9] + ' ' + args[args.length - 8] + ' ');
// Create a new row for each DASD
dasdTabRow = $(' ');
dasdTabRow.append(dasdVDev);
dasdTabRow.append(dasdType);
dasdTabRow.append(dasdVolId);
dasdTabRow.append(dasdAccess);
dasdTabRow.append(dasdSize);
dasdBody.append(dasdTabRow);
}
}
dasdTable.append(dasdBody);
item.append(dasdTable);
}
/**
* NIC section
*/
else if (keys[k] == 'nic') {
// Create a label - Property name
label = $('' + attrNames[keys[k]].replace(':', '') + ' ');
item.append(label);
// Create a table to hold NIC data
var nicTable = $('');
var nicBody = $(' ');
// Table columns - Virtual device, Adapter Type, Port Name, # of Devices, MAC Address, and LAN Name
var nicTabRow = $('');
nicTable.append(nicTabRow);
var nicVDev, nicType, nicPortName, nicNumOfDevs, nicLanName;
// Loop through each NIC (Data contained in 2 lines)
for (l = 0; l < attrs[keys[k]].length; l = l + 2) {
if (attrs[keys[k]][l]) {
args = attrs[keys[k]][l].split(' ');
// Get NIC virtual device, type, port name, and number of devices
nicVDev = $('' + args[1] + ' ');
nicType = $('' + args[3] + ' ');
nicPortName = $('' + args[10] + ' ');
nicNumOfDevs = $('' + args[args.length - 1] + ' ');
args = attrs[keys[k]][l + 1].split(' ');
nicLanName = $('' + args[args.length - 2] + ' ' + args[args.length - 1] + ' ');
// Create a new row for each DASD
nicTabRow = $(' ');
nicTabRow.append(nicVDev);
nicTabRow.append(nicType);
nicTabRow.append(nicPortName);
nicTabRow.append(nicNumOfDevs);
nicTabRow.append(nicLanName);
nicBody.append(nicTabRow);
}
}
nicTable.append(nicBody);
item.append(nicTable);
}
oList.append(item);
}
// Append inventory to division
fieldSet.append(oList);
invDiv.append(fieldSet);
invDiv.find('th').css({
'padding': '5px 10px',
'font-weight': 'bold'
});
// Append to tab
$('#' + tabId).append(invDiv);
};
/**
* Load clone page
*
* @param node
* Source node to clone
* @return Nothing
*/
zvmPlugin.prototype.loadClonePage = function(node) {
// Get nodes tab
var tab = getNodesTab();
var newTabId = node + 'CloneTab';
// If there is no existing clone tab
if (!$('#' + newTabId).length) {
// Get table headers
var tableId = $('#' + node).parents('table').attr('id');
var headers = $('#' + tableId).parents('.dataTables_scroll').find('.dataTables_scrollHead thead tr:eq(0) th');
var cols = new Array();
for ( var i = 0; i < headers.length; i++) {
var col = headers.eq(i).text();
cols.push(col);
}
// Get hardware control point column
var hcpCol = $.inArray('hcp', cols);
// Get hardware control point
var nodeRow = $('#' + node).parent().parent();
var datatable = $('#' + getNodesTableId()).dataTable();
var rowPos = datatable.fnGetPosition(nodeRow.get(0));
var aData = datatable.fnGetData(rowPos);
var hcp = aData[hcpCol];
// Create status bar and hide it
var statBarId = node + 'CloneStatusBar';
var statBar = createStatusBar(statBarId).hide();
// Create info bar
var infoBar = createInfoBar('Clone a zVM node.');
// Create clone form
var cloneForm = $('
');
cloneForm.append(statBar);
cloneForm.append(infoBar);
cloneForm.append('Target node range:
');
cloneForm.append('Target user ID range:
');
cloneForm.append('Clone source:
');
cloneForm.append('Hardware control point:
');
// Create group input
var group = $('
');
var groupLabel = $('Group: ');
var groupInput = $(' ');
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);
cloneForm.append(group);
// Get list of disk pools
var temp = hcp.split('.');
var diskPools = $.cookie(temp[0] + 'diskpools');
// Create disk pool input
var poolDiv = $('
');
var poolLabel = $('Disk pool: ');
var poolInput = $(' ').autocomplete({
source: diskPools.split(',')
});
poolDiv.append(poolLabel);
poolDiv.append(poolInput);
cloneForm.append(poolDiv);
cloneForm.append('Disk password:
');
// Generate tooltips
cloneForm.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"
}
});
/**
* Clone node
*/
var cloneBtn = createButton('Clone');
cloneBtn.bind('click', function(event) {
// Remove any warning messages
$(this).parent().parent().find('.ui-state-error').remove();
var ready = true;
var errMsg = '';
// Check node name, userId, hardware control point, group, and password
var inputs = $('#' + newTabId + ' input');
for ( var i = 0; i < inputs.length; i++) {
if (!inputs.eq(i).val()
&& inputs.eq(i).attr('name') != 'diskPw'
&& inputs.eq(i).attr('name') != 'diskPool') {
inputs.eq(i).css('border', 'solid #FF0000 1px');
ready = false;
} else {
inputs.eq(i).css('border', 'solid #BDBDBD 1px');
}
}
// Write error message
if (!ready) {
errMsg = errMsg + 'You are missing some inputs. ';
}
// Get target node
var nodeRange = $('#' + newTabId + ' input[name=tgtNode]').val();
// Get target user ID
var userIdRange = $('#' + newTabId + ' input[name=tgtUserId]').val();
// Check node range and user ID range
if (nodeRange.indexOf('-') > -1 || userIdRange.indexOf('-') > -1) {
if (nodeRange.indexOf('-') < 0 || userIdRange.indexOf('-') < 0) {
errMsg = errMsg + 'A user ID range and node range needs to be given. ';
ready = false;
} else {
var tmp = nodeRange.split('-');
// Get node base name
var nodeBase = tmp[0].match(/[a-zA-Z]+/);
// Get starting index
var nodeStart = parseInt(tmp[0].match(/\d+/));
// Get ending index
var nodeEnd = parseInt(tmp[1].match(/\d+/));
tmp = userIdRange.split('-');
// Get user ID base name
var userIdBase = tmp[0].match(/[a-zA-Z]+/);
// Get starting index
var userIdStart = parseInt(tmp[0].match(/\d+/));
// Get ending index
var userIdEnd = parseInt(tmp[1].match(/\d+/));
// If starting and ending index do not match
if (!(nodeStart == userIdStart) || !(nodeEnd == userIdEnd)) {
// Not ready to provision
errMsg = errMsg + 'The node range and user ID range does not match. ';
ready = false;
}
}
}
// Get source node, hardware control point, group, disk pool, and disk password
var srcNode = $('#' + newTabId + ' input[name=srcNode]').val();
var hcp = $('#' + newTabId + ' input[name=newHcp]').val();
var group = $('#' + newTabId + ' input[name=newGroup]').val();
var diskPool = $('#' + newTabId + ' input[name=diskPool]').val();
var diskPw = $('#' + newTabId + ' input[name=diskPw]').val();
// If a value is given for every input
if (ready) {
// Disable all inputs
var inputs = $('#' + newTabId + ' input');
inputs.attr('disabled', 'disabled');
// If a node range is given
if (nodeRange.indexOf('-') > -1) {
var tmp = nodeRange.split('-');
// Get node base name
var nodeBase = tmp[0].match(/[a-zA-Z]+/);
// Get starting index
var nodeStart = parseInt(tmp[0].match(/\d+/));
// Get ending index
var nodeEnd = parseInt(tmp[1].match(/\d+/));
tmp = userIdRange.split('-');
// Get user ID base name
var userIdBase = tmp[0].match(/[a-zA-Z]+/);
// Get starting index
var userIdStart = parseInt(tmp[0].match(/\d+/));
// Get ending index
var userIdEnd = parseInt(tmp[1].match(/\d+/));
// Loop through each node in the node range
for ( var i = nodeStart; i <= nodeEnd; i++) {
var node = nodeBase + i.toString();
var userId = userIdBase + i.toString();
var inst = i + '/' + nodeEnd;
/**
* (1) Define node
*/
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'nodeadd',
tgt : '',
args : node + ';zvm.hcp=' + hcp
+ ';zvm.userid=' + userId
+ ';nodehm.mgt=zvm'
+ ';groups=' + group,
msg : 'cmd=nodeadd;inst=' + inst
+ ';out=' + statBarId
+ ';node=' + node
},
success : updateZCloneStatus
});
}
} else {
/**
* (1) Define node
*/
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'nodeadd',
tgt : '',
args : nodeRange + ';zvm.hcp=' + hcp
+ ';zvm.userid=' + userIdRange
+ ';nodehm.mgt=zvm'
+ ';groups=' + group,
msg : 'cmd=nodeadd;inst=1/1;out=' + statBarId
+ ';node=' + nodeRange
},
success : updateZCloneStatus
});
}
// Create loader
var loader = createLoader('');
$('#' + statBarId).find('div').append(loader);
$('#' + statBarId).show();
// Disable clone button
$(this).attr('disabled', 'true');
} else {
// Show warning message
var warn = createWarnBar(errMsg);
warn.prependTo($(this).parent().parent());
}
});
cloneForm.append(cloneBtn);
// Add clone tab
tab.add(newTabId, 'Clone', cloneForm, true);
}
tab.select(newTabId);
};
/**
* Load node inventory
*
* @param data
* Data from HTTP request
* @return Nothing
*/
zvmPlugin.prototype.loadInventory = function(data) {
var args = data.msg.split(',');
// Get tab ID
var tabId = args[0].replace('out=', '');
// Get node
var node = args[1].replace('node=', '');
// Get node inventory
var inv = data.rsp[0].split(node + ':');
// Remove loader
$('#' + tabId).find('img').remove();
// Create status bar
var statBarId = node + 'StatusBar';
var statBar = createStatusBar(statBarId);
// Add loader to status bar and hide it
var loader = createLoader(node + 'StatusBarLoader').hide();
statBar.find('div').append(loader);
statBar.hide();
// Create array of property keys
var keys = new Array('userId', 'host', 'os', 'arch', 'hcp', 'priv', 'memory', 'proc', 'disk', 'nic');
// Create hash table for property names
var attrNames = new Object();
attrNames['userId'] = 'z/VM UserID:';
attrNames['host'] = 'z/VM Host:';
attrNames['os'] = 'Operating System:';
attrNames['arch'] = 'Architecture:';
attrNames['hcp'] = 'HCP:';
attrNames['priv'] = 'Privileges:';
attrNames['memory'] = 'Total Memory:';
attrNames['proc'] = 'Processors:';
attrNames['disk'] = 'Disks:';
attrNames['nic'] = 'NICs:';
// Create hash table for node attributes
var attrs = getAttrs(keys, attrNames, inv);
// Create division to hold user entry
var ueDivId = node + 'UserEntry';
var ueDiv = $('
');
// Create division to hold inventory
var invDivId = node + 'Inventory';
var invDiv = $('
');
/**
* Show user entry
*/
var toggleLinkId = node + 'ToggleLink';
var toggleLink = $('Show directory entry ');
toggleLink.one('click', function(event) {
// Toggle inventory division
$('#' + invDivId).toggle();
// Create loader
var loader = createLoader(node + 'TabLoader');
loader = $(' ').append(loader);
ueDiv.append(loader);
// Get user entry
var msg = 'out=' + ueDivId + ';node=' + node;
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'lsvm',
tgt : node,
args : '',
msg : msg
},
success : loadUserEntry
});
// Change text
$(this).text('Show inventory');
// Disable toggle link
$(this).unbind(event);
});
// Align toggle link to the right
var toggleLnkDiv = $('
').css( {
'text-align' : 'right'
});
toggleLnkDiv.append(toggleLink);
/**
* General info section
*/
var fieldSet = $(' ');
var legend = $('General ');
fieldSet.append(legend);
var oList = $(' ');
var item, label, input, args;
// Loop through each property
for ( var k = 0; k < 5; k++) {
// Create a list item for each property
item = $(' ');
// Create a label - Property name
label = $('' + attrNames[keys[k]] + ' ');
item.append(label);
for ( var l = 0; l < attrs[keys[k]].length; l++) {
// Create a input - Property value(s)
// Handle each property uniquely
item.append(attrs[keys[k]][l]);
}
oList.append(item);
}
// Append to inventory form
fieldSet.append(oList);
invDiv.append(fieldSet);
/**
* Hardware info section
*/
var hwList, hwItem;
fieldSet = $(' ');
legend = $('Hardware');
fieldSet.append(legend);
oList = $(' ');
// Loop through each property
var label;
for (k = 5; k < keys.length; k++) {
// Create a list item
item = $(' ');
// Create a list to hold the property value(s)
hwList = $('');
hwItem = $(' ');
/**
* Privilege section
*/
if (keys[k] == 'priv') {
// Create a label - Property name
label = $('' + attrNames[keys[k]].replace(':', '') + ' ');
item.append(label);
// Loop through each line
for (l = 0; l < attrs[keys[k]].length; l++) {
// Create a new list item for each line
hwItem = $(' ');
// Determine privilege
args = attrs[keys[k]][l].split(' ');
if (args[0] == 'Directory:') {
label = $('' + args[0] + ' ');
hwItem.append(label);
hwItem.append(args[1]);
} else if (args[0] == 'Currently:') {
label = $('' + args[0] + ' ');
hwItem.append(label);
hwItem.append(args[1]);
}
hwList.append(hwItem);
}
item.append(hwList);
}
/**
* Memory section
*/
else if (keys[k] == 'memory') {
// Create a label - Property name
label = $('' + attrNames[keys[k]].replace(':', '') + ' ');
item.append(label);
// Loop through each value line
for (l = 0; l < attrs[keys[k]].length; l++) {
// Create a new list item for each line
hwItem = $(' ');
hwItem.append(attrs[keys[k]][l]);
hwList.append(hwItem);
}
item.append(hwList);
}
/**
* Processor section
*/
else if (keys[k] == 'proc') {
// Create a label - Property name
label = $('' + attrNames[keys[k]].replace(':', '') + ' ');
item.append(label);
// Create a table to hold processor data
var procTable = $('');
var procBody = $(' ');
var procFooter = $(' ');
// Table columns - Type, Address, ID, Base, Dedicated, and Affinity
var procTabRow = $('');
procTable.append(procTabRow);
var procType, procAddr, procId, procAff;
/**
* Remove processor
*/
var contextMenu = [{
'Remove' : function(menuItem, menu) {
var addr = $(this).text();
// Open dialog to confirm
var confirmDialog = $('Are you sure you want to remove this processor?
');
confirmDialog.dialog({
modal: true,
width: 300,
buttons: {
"Ok": function(){
removeProcessor(node, addr);
$(this).dialog("close");
},
"Cancel": function() {
$(this).dialog("close");
}
}
});
}
}];
// Loop through each processor
var closeBtn;
var n, temp;
var procType, procAddr, procLink;
for (l = 0; l < attrs[keys[k]].length; l++) {
if (attrs[keys[k]][l]) {
args = attrs[keys[k]][l].split(' ');
// Get processor type, address, ID, and affinity
n = 3;
temp = args[args.length - n];
while (!jQuery.trim(temp)) {
n = n + 1;
temp = args[args.length - n];
}
procType = $('' + temp + ' ');
procAddr = $(' ');
procLink = $('' + args[1] + ' ');
// Append context menu to link
procLink.contextMenu(contextMenu, {
theme : 'vista'
});
procAddr.append(procLink);
procId = $('' + args[5] + ' ');
procAff = $('' + args[args.length - 1] + ' ');
// Base processor
if (args[6] == '(BASE)') {
baseProc = $('' + true + ' ');
} else {
baseProc = $('' + false + ' ');
}
// Dedicated processor
if (args[args.length - 3] == 'DEDICATED') {
dedicatedProc = $('' + true + ' ');
} else {
dedicatedProc = $('' + false + ' ');
}
// Create a new row for each processor
procTabRow = $(' ');
procTabRow.append(procType);
procTabRow.append(procAddr);
procTabRow.append(procId);
procTabRow.append(baseProc);
procTabRow.append(dedicatedProc);
procTabRow.append(procAff);
procBody.append(procTabRow);
}
}
procTable.append(procBody);
/**
* Add processor
*/
var addProcLink = $('Add temporary processor ');
addProcLink.bind('click', function(event) {
openAddProcDialog(node);
});
procFooter.append(addProcLink);
procTable.append(procFooter);
item.append(procTable);
}
/**
* Disk section
*/
else if (keys[k] == 'disk') {
// Create a label - Property name
label = $('' + attrNames[keys[k]].replace(':', '') + ' ');
item.append(label);
// Create a table to hold disk (DASD) data
var dasdTable = $('');
var dasdBody = $(' ');
var dasdFooter = $(' ');
/**
* Remove disk
*/
contextMenu = [{
'Remove' : function(menuItem, menu) {
var addr = $(this).text();
// Open dialog to confirm
var confirmDialog = $('Are you sure you want to remove this disk?
');
confirmDialog.dialog({
modal: true,
width: 300,
buttons: {
"Ok": function(){
removeDisk(node, addr);
$(this).dialog("close");
},
"Cancel": function() {
$(this).dialog("close");
}
}
});
}
}];
// Table columns - Virtual Device, Type, VolID, Type of Access, and Size
var dasdTabRow = $('');
dasdTable.append(dasdTabRow);
var dasdVDev, dasdType, dasdVolId, dasdAccess, dasdSize;
// Loop through each DASD
for (l = 0; l < attrs[keys[k]].length; l++) {
if (attrs[keys[k]][l]) {
args = attrs[keys[k]][l].split(' ');
// Get DASD virtual device, type, volume ID, access, and size
dasdVDev = $(' ');
dasdLink = $('' + args[1] + ' ');
// Append context menu to link
dasdLink.contextMenu(contextMenu, {
theme : 'vista'
});
dasdVDev.append(dasdLink);
dasdType = $('' + args[2] + ' ');
dasdVolId = $('' + args[3] + ' ');
dasdAccess = $('' + args[4] + ' ');
dasdSize = $('' + args[args.length - 9] + ' ' + args[args.length - 8] + ' ');
// Create a new row for each DASD
dasdTabRow = $(' ');
dasdTabRow.append(dasdVDev);
dasdTabRow.append(dasdType);
dasdTabRow.append(dasdVolId);
dasdTabRow.append(dasdAccess);
dasdTabRow.append(dasdSize);
dasdBody.append(dasdTabRow);
}
}
dasdTable.append(dasdBody);
/**
* Add disk
*/
var addDasdLink = $('Add disk ');
addDasdLink.bind('click', function(event) {
var hcp = attrs['hcp'][0].split('.');
openAddDiskDialog(node, hcp[0]);
});
dasdFooter.append(addDasdLink);
dasdTable.append(dasdFooter);
item.append(dasdTable);
}
/**
* NIC section
*/
else if (keys[k] == 'nic') {
// Create a label - Property name
label = $('' + attrNames[keys[k]].replace(':', '') + ' ');
item.append(label);
// Create a table to hold NIC data
var nicTable = $('');
var nicBody = $(' ');
var nicFooter = $(' ');
/**
* Remove NIC
*/
contextMenu = [ {
'Remove' : function(menuItem, menu) {
var addr = $(this).text();
// Open dialog to confirm
var confirmDialog = $('Are you sure you want to remove this NIC?
');
confirmDialog.dialog({
modal: true,
width: 300,
buttons: {
"Ok": function(){
removeNic(node, addr);
$(this).dialog("close");
},
"Cancel": function() {
$(this).dialog("close");
}
}
});
}
} ];
// Table columns - Virtual device, Adapter Type, Port Name, # of Devices, MAC Address, and LAN Name
var nicTabRow = $('');
nicTable.append(nicTabRow);
var nicVDev, nicType, nicPortName, nicNumOfDevs, nicMacAddr, nicLanName;
// Loop through each NIC (Data contained in 2 lines)
for (l = 0; l < attrs[keys[k]].length; l = l + 2) {
if (attrs[keys[k]][l]) {
args = attrs[keys[k]][l].split(' ');
// Get NIC virtual device, type, port name, and number of devices
nicVDev = $(' ');
nicLink = $('' + args[1] + ' ');
// Append context menu to link
nicLink.contextMenu(contextMenu, {
theme : 'vista'
});
nicVDev.append(nicLink);
nicType = $('' + args[3] + ' ');
nicPortName = $('' + args[10] + ' ');
nicNumOfDevs = $('' + args[args.length - 1] + ' ');
args = attrs[keys[k]][l + 1].split(' ');
nicLanName = $('' + args[args.length - 2] + ' ' + args[args.length - 1] + ' ');
// Create a new row for each DASD
nicTabRow = $(' ');
nicTabRow.append(nicVDev);
nicTabRow.append(nicType);
nicTabRow.append(nicPortName);
nicTabRow.append(nicNumOfDevs);
nicTabRow.append(nicLanName);
nicBody.append(nicTabRow);
}
}
nicTable.append(nicBody);
/**
* Add NIC
*/
var addNicLink = $('Add NIC ');
addNicLink.bind('click', function(event) {
var hcp = attrs['hcp'][0].split('.');
openAddNicDialog(node, hcp[0]);
});
nicFooter.append(addNicLink);
nicTable.append(nicFooter);
item.append(nicTable);
}
oList.append(item);
}
// Append inventory to division
fieldSet.append(oList);
invDiv.append(fieldSet);
// Append to tab
$('#' + tabId).append(statBar);
$('#' + tabId).append(toggleLnkDiv);
$('#' + tabId).append(ueDiv);
$('#' + tabId).append(invDiv);
};
/**
* Load provision page
*
* @param tabId
* The provision tab ID
* @return Nothing
*/
zvmPlugin.prototype.loadProvisionPage = function(tabId) {
// Get OS image names
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'tabdump',
tgt : '',
args : 'osimage',
msg : ''
},
success : setOSImageCookies
});
// Get groups
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'extnoderange',
tgt : '/.*',
args : 'subgroups',
msg : ''
},
success : setGroupsCookies
});
// Error message string
var errMsg;
// Get provision tab instance
var inst = tabId.replace('zvmProvisionTab', '');
// Create provision form
var provForm = $('
');
// Create status bar
var statBarId = 'zProvisionStatBar' + inst;
var statBar = createStatusBar(statBarId).hide();
provForm.append(statBar);
// Create loader
var loader = createLoader('zProvisionLoader' + inst).hide();
statBar.find('div').append(loader);
// Create info bar
var infoBar = createInfoBar('Provision a node on System z.');
provForm.append(infoBar);
// Append to provision tab
$('#' + tabId).append(provForm);
// Create provision type drop down
var provType = $('
');
var typeLabel = $('Provision: ');
var typeSelect = $(' ');
var provNewNode = $('New node ');
var provExistNode = $('Existing node ');
typeSelect.append(provNewNode);
typeSelect.append(provExistNode);
provType.append(typeLabel);
provType.append(typeSelect);
provForm.append(provType);
/**
* Create provision new node division
*/
var provNew = createZProvisionNew(inst);
provForm.append(provNew);
/**
* Create provision existing node division
*/
var provExisting = createZProvisionExisting(inst);
provForm.append(provExisting);
// Toggle provision new/existing on select
typeSelect.change(function(){
var selected = $(this).val();
if (selected == 'new') {
provNew.toggle();
provExisting.toggle();
} else {
provNew.toggle();
provExisting.toggle();
}
});
};
/**
* Load the resources
*
* @return Nothing
*/
zvmPlugin.prototype.loadResources = function() {
// Reset resource table
setDiskDataTable('');
setNetworkDataTable('');
// Get hardware control points
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'nodels',
tgt : 'mgt==zvm',
args : 'zvm.hcp',
msg : ''
},
success : getZResources
});
};
/**
* Add node range
*
* @return Nothing
*/
zvmPlugin.prototype.addNode = function() {
// Create form to add node range
var addNodeForm = $('
');
var info = createInfoBar('Add a node range');
addNodeForm.append(info);
addNodeForm.append('Node range:
');
addNodeForm.append('User ID range:
');
addNodeForm.append('Hardware control point:
');
addNodeForm.append('Group:
');
// Open form as a dialog
addNodeForm.dialog({
title: 'Add node',
modal: true,
width: 400,
buttons: {
"Ok": function(){
// Remove any warning messages
$(this).find('.ui-state-error').remove();
// Get inputs
var nodeRange = $(this).find('input[name=node]').val();
var userIdRange = $(this).find('input[name=userId]').val();
var group = $(this).find('input[name=group]').val();
var hcp = $(this).find('input[name=hcp]').val();
// Show warning message if inputs are not complete
if (!nodeRange || !userIdRange || !group || !hcp) {
var warn = createWarnBar('You are missing inputs.');
warn.prependTo($(this));
} else {
// Check node range and user ID range
// Range can be given as gpok10-gpok20, gpok[10-20], or gpok10+10
var errMsg = '';
var ready = true;
if (nodeRange.indexOf('-') > -1 || userIdRange.indexOf('-') > -1) {
if (nodeRange.indexOf('-') < 0 || userIdRange.indexOf('-') < 0) {
errMsg = errMsg + 'A user ID range and node range needs to be given. ';
ready = false;
} else {
var tmp = nodeRange.split('-');
// Get node base name
var nodeBase = tmp[0].match(/[a-zA-Z]+/);
// Get starting index
var nodeStart = parseInt(tmp[0].match(/\d+/));
// Get ending index
var nodeEnd = parseInt(tmp[1].match(/\d+/));
tmp = userIdRange.split('-');
// Get user ID base name
var userIdBase = tmp[0].match(/[a-zA-Z]+/);
// Get starting index
var userIdStart = parseInt(tmp[0].match(/\d+/));
// Get ending index
var userIdEnd = parseInt(tmp[1].match(/\d+/));
// If starting and ending index do not match
if (!(nodeStart == userIdStart) || !(nodeEnd == userIdEnd)) {
// Not ready
errMsg = errMsg + 'The node range and user ID range does not match. ';
ready = false;
}
}
}
// If there are no errors
if (ready) {
// If a node range is given
if (nodeRange.indexOf('-') > -1 && userIdRange.indexOf('-') > -1) {
var tmp = nodeRange.split('-');
// Get node base name
var nodeBase = tmp[0].match(/[a-zA-Z]+/);
// Get starting index
var nodeStart = parseInt(tmp[0].match(/\d+/));
// Get ending index
var nodeEnd = parseInt(tmp[1].match(/\d+/));
tmp = userIdRange.split('-');
// Get user ID base name
var userIdBase = tmp[0].match(/[a-zA-Z]+/);
// Get starting index
var userIdStart = parseInt(tmp[0].match(/\d+/));
// Get ending index
var userIdEnd = parseInt(tmp[1].match(/\d+/));
// Loop through each node in the node range
for ( var i = nodeStart; i <= nodeEnd; i++) {
var node = nodeBase + i.toString();
var userId = userIdBase + i.toString();
var inst = i + '/' + nodeEnd;
/**
* (1) Define node
*/
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'nodeadd',
tgt : '',
args : node + ';zvm.hcp=' + hcp
+ ';zvm.userid=' + userId
+ ';nodehm.mgt=zvm' + ';groups=' + group,
msg : 'cmd=addnewnode;inst=' + inst + ';noderange=' + nodeRange
},
/**
* Return function on successful AJAX call
*
* @param data
* Data returned from HTTP request
* @return Nothing
*/
success : function (data) {
// Get ajax response
var rsp = data.rsp;
var args = data.msg.split(';');
// Get command invoked
var cmd = args[0].replace('cmd=', '');
var inst = args[1].replace('inst=', '');
var nodeRange = args[2].replace('noderange=', '');
// If the last node was added
var tmp = inst.split('/');
if (tmp[0] == tmp[1]) {
// If there was an error, do not continue
if (rsp.length) {
openDialog('warn', '(Error) Failed to create node definitions');
} else {
openDialog('info', 'Node definitions created for ' + nodeRange);
}
}
}
});
}
} else {
// Only one node to add
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'nodeadd',
tgt : '',
args : nodeRange + ';zvm.hcp=' + hcp
+ ';zvm.userid=' + userIdRange
+ ';nodehm.mgt=zvm' + ';groups=' + group,
msg : 'cmd=addnewnode;node=' + nodeRange
},
/**
* Return function on successful AJAX call
*
* @param data
* Data returned from HTTP request
* @return Nothing
*/
success : function (data) {
// Get ajax response
var rsp = data.rsp;
var args = data.msg.split(';');
// Get command invoked
var cmd = args[0].replace('cmd=', '');
var node = args[1].replace('node=', '');
// If there was an error, do not continue
if (rsp.length) {
openDialog('warn', '(Error) Failed to create node definition');
} else {
openDialog('info', 'Node definitions created for ' + node);
}
}
});
}
// Close dialog
$(this).dialog( "close" );
} else {
// Show warning message
var warn = createWarnBar(errMsg);
warn.prependTo($(this));
}
} // End of else
},
"Cancel": function(){
$(this).dialog( "close" );
}
}
});
};