cebb002cde
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@6763 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
3171 lines
78 KiB
JavaScript
3171 lines
78 KiB
JavaScript
/**
|
|
* Global variables
|
|
*/
|
|
var diskDataTable; // zVM datatable containing disks
|
|
var networkDataTable; // zVM datatable containing networks
|
|
|
|
/**
|
|
* Get the disk datatable
|
|
*
|
|
* @param Nothing
|
|
* @return Data table object
|
|
*/
|
|
function getDiskDataTable() {
|
|
return diskDataTable;
|
|
}
|
|
|
|
/**
|
|
* Set the disk datatable
|
|
*
|
|
* @param table
|
|
* Data table object
|
|
* @return Nothing
|
|
*/
|
|
function setDiskDataTable(table) {
|
|
diskDataTable = table;
|
|
}
|
|
|
|
/**
|
|
* Get the network datatable
|
|
*
|
|
* @param Nothing
|
|
* @return Data table object
|
|
*/
|
|
function getNetworkDataTable() {
|
|
return networkDataTable;
|
|
}
|
|
|
|
/**
|
|
* Set the network datatable
|
|
*
|
|
* @param table
|
|
* Data table object
|
|
* @return Nothing
|
|
*/
|
|
function setNetworkDataTable(table) {
|
|
networkDataTable = table;
|
|
}
|
|
|
|
/**
|
|
* Load zVM provision page
|
|
*
|
|
* @param tabId
|
|
* The provision tab ID
|
|
* @return Nothing
|
|
*/
|
|
function loadZProvisionPage(tabId) {
|
|
// Get tab area where new tab will go
|
|
var myTab = getProvisionTab();
|
|
var errMsg;
|
|
|
|
// Get the 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
|
|
});
|
|
|
|
// Generate new tab ID
|
|
var inst = tabId.replace('zvmProvisionTab', '');
|
|
|
|
// Open new tab
|
|
// Create provision form
|
|
var provForm = $('<div class="form"></div>');
|
|
|
|
// Create status bar
|
|
var barId = 'zProvisionStatBar' + inst;
|
|
var statBar = createStatusBar(barId);
|
|
statBar.hide();
|
|
provForm.append(statBar);
|
|
|
|
// Create loader
|
|
var loader = createLoader('zProvisionLoader' + inst);
|
|
loader.hide();
|
|
statBar.append(loader);
|
|
|
|
// Create info bar
|
|
var infoBar = createInfoBar('Provision a zVM node');
|
|
provForm.append(infoBar);
|
|
|
|
// Append to provision tab
|
|
$('#' + tabId).append(provForm);
|
|
|
|
// Node name
|
|
var nodeName = $('<div><label for="nodeName">Node:</label><input type="text" name="nodeName"/></div>');
|
|
provForm.append(nodeName);
|
|
|
|
// User ID
|
|
var userId = $('<div><label for="userId">User ID:</label><input type="text" name="userId"/></div>');
|
|
provForm.append(userId);
|
|
|
|
// Hardware control point
|
|
var hcpDiv = $('<div></div>');
|
|
var hcpLabel = $('<label for="hcp">Hardware control point:</label>');
|
|
hcpDiv.append(hcpLabel);
|
|
|
|
var hcpInput = $('<input type="text" name="hcp"/>');
|
|
hcpInput.blur(function() {
|
|
// If there is a HCP
|
|
if (hcpInput.val()) {
|
|
var args = hcpInput.val().split('.');
|
|
|
|
// Get disk pools
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'lsvm',
|
|
tgt : args[0],
|
|
args : '--diskpoolnames',
|
|
msg : args[0]
|
|
},
|
|
|
|
success : setDiskPoolCookies
|
|
});
|
|
}
|
|
});
|
|
hcpDiv.append(hcpInput);
|
|
provForm.append(hcpDiv);
|
|
|
|
// Group
|
|
var group = $('<div></div>');
|
|
var groupLabel = $('<label for="group">Group:</label>');
|
|
var groupInput = $('<input type="text" name="group"/>');
|
|
|
|
// Get the groups on-focus
|
|
groupInput.focus(function() {
|
|
var groupNames = $.cookie('Groups');
|
|
|
|
// If there are groups, turn on auto-complete
|
|
if (groupNames) {
|
|
$(this).autocomplete(groupNames.split(','));
|
|
}
|
|
});
|
|
|
|
group.append(groupLabel);
|
|
group.append(groupInput);
|
|
provForm.append(group);
|
|
|
|
// Operating system image
|
|
var os = $('<div></div>');
|
|
var osLabel = $('<label for="os">Operating system image:</label>');
|
|
var osInput = $('<input type="text" name="os"/>');
|
|
|
|
// Get the image names on-focus
|
|
osInput.focus(function() {
|
|
var imageNames = $.cookie('ImageNames');
|
|
|
|
// If there are image names, turn on auto-complete
|
|
if (imageNames) {
|
|
$(this).autocomplete(imageNames.split(','));
|
|
}
|
|
});
|
|
|
|
os.append(osLabel);
|
|
os.append(osInput);
|
|
provForm.append(os);
|
|
|
|
// User entry
|
|
var userEntry = $('<div><label for="userEntry">User entry:</label><textarea/></textarea>');
|
|
provForm.append(userEntry);
|
|
|
|
// Create disk table
|
|
var diskDiv = $('<div class="provision"></div>');
|
|
var diskLabel = $('<label>Disk(s):</label>');
|
|
diskDiv.append(diskLabel);
|
|
var diskTable = $('<table></table>');
|
|
var diskHeader = $('<thead> <th></th> <th>Type</th> <th>Address</th> <th>Size</th> <th>Pool</th> <th>Password</th> </thead>');
|
|
diskHeader.find('th').css( {
|
|
'width' : '80px'
|
|
});
|
|
diskHeader.find('th').eq(0).css( {
|
|
'width' : '20px'
|
|
});
|
|
var diskBody = $('<tbody></tbody>');
|
|
var diskFooter = $('<tfoot></tfoot>');
|
|
|
|
/**
|
|
* Add disks
|
|
*/
|
|
var addDiskLink = $('<a href="#">Add disk</a>');
|
|
addDiskLink.bind('click', function(event) {
|
|
var diskRow = $('<tr></tr>');
|
|
|
|
// Remove button
|
|
var removeBtn = $('<span class="ui-icon ui-icon-close"></span>');
|
|
removeBtn.bind('click', function(event) {
|
|
diskRow.remove();
|
|
});
|
|
var col = $('<td></td>').append(removeBtn);
|
|
diskRow.append(col);
|
|
|
|
// Disk type
|
|
var diskType = $('<td></td>');
|
|
var diskTypeSelect = $('<select></select>');
|
|
var diskType3390 = $('<option value="3390">3390</option>');
|
|
diskTypeSelect.append(diskType3390);
|
|
diskType.append(diskTypeSelect);
|
|
diskRow.append(diskType);
|
|
|
|
// Disk address
|
|
var diskAddr = $('<td><input type="text"/></td>');
|
|
diskRow.append(diskAddr);
|
|
|
|
// Disk size
|
|
var diskSize = $('<td><input type="text"/></td>');
|
|
diskRow.append(diskSize);
|
|
|
|
// Get list of disk pools
|
|
var thisTabId = $(this).parent().parent().parent().parent().parent()
|
|
.attr('id');
|
|
var thisHcp = $('#' + thisTabId + ' input[name=hcp]').val();
|
|
var definedPools;
|
|
if (thisHcp) {
|
|
// Get node without domain
|
|
var temp = thisHcp.split('.');
|
|
definedPools = $.cookie(temp[0] + 'DiskPools');
|
|
}
|
|
|
|
// Set auto-complete for disk pool
|
|
var diskPoolInput = $('<input type="text"/>').autocomplete(
|
|
definedPools.split(','));
|
|
var diskPool = $('<td></td>').append(diskPoolInput);
|
|
diskRow.append(diskPool);
|
|
|
|
// Disk password
|
|
var diskPw = $('<td><input type="password"/></td>');
|
|
diskRow.append(diskPw);
|
|
|
|
diskBody.append(diskRow);
|
|
});
|
|
diskFooter.append(addDiskLink);
|
|
|
|
diskTable.append(diskHeader);
|
|
diskTable.append(diskBody);
|
|
diskTable.append(diskFooter);
|
|
diskDiv.append(diskTable);
|
|
provForm.append(diskDiv);
|
|
|
|
/**
|
|
* Provision
|
|
*/
|
|
var provisionBtn = createButton('Provision');
|
|
provisionBtn
|
|
.bind('click', function(event) {
|
|
var ready = true;
|
|
errMsg = '';
|
|
|
|
// Get the tab ID
|
|
var thisTabId = $(this).parent().parent().attr('id');
|
|
var out2Id = thisTabId.replace('zvmProvisionTab', '');
|
|
|
|
// Check node name, userId, hardware control point, and
|
|
// group
|
|
var inputs = $('#' + thisTabId + ' input');
|
|
for ( var i = 0; i < inputs.length; i++) {
|
|
// Do not check OS or disk password
|
|
if (!inputs.eq(i).val() && inputs.eq(i).attr('name') != 'os'
|
|
&& inputs.eq(i).attr('type') != 'password') {
|
|
inputs.eq(i).css('border', 'solid #FF0000 1px');
|
|
ready = false;
|
|
} else {
|
|
inputs.eq(i).css('border', 'solid #BDBDBD 1px');
|
|
}
|
|
}
|
|
|
|
// Check user entry
|
|
var thisUserEntry = $('#' + thisTabId + ' textarea');
|
|
thisUserEntry.val(thisUserEntry.val().toUpperCase());
|
|
if (!thisUserEntry.val()) {
|
|
thisUserEntry.css('border', 'solid #FF0000 1px');
|
|
ready = false;
|
|
} else {
|
|
thisUserEntry.css('border', 'solid #BDBDBD 1px');
|
|
}
|
|
|
|
// Check if user entry contains user ID
|
|
var thisUserId = $('#' + thisTabId + ' input[name=userId]');
|
|
var pos = thisUserEntry.val().indexOf(
|
|
'USER ' + thisUserId.val().toUpperCase());
|
|
if (pos < 0) {
|
|
errMsg = errMsg + 'The user entry does not contain the correct user ID. ';
|
|
ready = false;
|
|
}
|
|
|
|
// If no operating system is specified, create only user
|
|
// entry
|
|
os = $('#' + thisTabId + ' input[name=os]');
|
|
|
|
// 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;
|
|
}
|
|
|
|
// Check address, size, pool, and password
|
|
var diskArgs = $('#' + thisTabId + ' table input');
|
|
for ( var i = 0; i < diskArgs.length; i++) {
|
|
if (!diskArgs.eq(i).val()
|
|
&& diskArgs.eq(i).attr('type') != 'password') {
|
|
diskArgs.eq(i).css('border', 'solid #FF0000 1px');
|
|
ready = false;
|
|
} else {
|
|
diskArgs.eq(i).css('border', 'solid #BDBDBD 1px');
|
|
}
|
|
}
|
|
|
|
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 virtual server(s) without an operating system ?';
|
|
}
|
|
|
|
// If no disks are given, create a virtual
|
|
// server (no disk)
|
|
else {
|
|
msg = 'Do you want to create virtual server(s) without an operating system or disk(s) ?';
|
|
}
|
|
|
|
// If the user clicks Ok
|
|
if (confirm(msg)) {
|
|
// Stop this function from executing again
|
|
// Unbind event
|
|
provisionBtn.unbind('click');
|
|
provisionBtn.css( {
|
|
'background-color' : '#F2F2F2',
|
|
'color' : '#BDBDBD'
|
|
});
|
|
|
|
// Show loader
|
|
$('#zProvisionStatBar' + out2Id).show();
|
|
$('#zProvisionLoader' + out2Id).show();
|
|
|
|
// Stop this function from executing again
|
|
// Unbind event
|
|
addDiskLink.unbind('click');
|
|
addDiskLink.css( {
|
|
'color' : '#BDBDBD'
|
|
});
|
|
|
|
// Disable close button on disk table
|
|
$('#' + thisTabId + ' table span').unbind('click');
|
|
|
|
// Disable all fields
|
|
var inputs = $('#' + thisTabId + ' input');
|
|
inputs.attr('readonly', 'readonly');
|
|
inputs.css( {
|
|
'background-color' : '#F2F2F2'
|
|
});
|
|
|
|
var textarea = $('#' + thisTabId + ' textarea');
|
|
|
|
// Add a new line at the end of the user entry
|
|
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();
|
|
|
|
/**
|
|
* 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;out=' + out2Id
|
|
},
|
|
|
|
success : updateProvisionStatus
|
|
});
|
|
}
|
|
} else {
|
|
/**
|
|
* Create a virtual server and install OS
|
|
*/
|
|
|
|
// Stop this function from executing again
|
|
// Unbind event
|
|
$(this).unbind(event);
|
|
$(this).css( {
|
|
'background-color' : '#F2F2F2',
|
|
'color' : '#BDBDBD'
|
|
});
|
|
|
|
// Show loader
|
|
$('#zProvisionStatBar' + out2Id).show();
|
|
$('#zProvisionLoader' + out2Id).show();
|
|
|
|
// Stop this function from executing again
|
|
// Unbind event
|
|
addDiskLink.unbind('click');
|
|
addDiskLink.css( {
|
|
'color' : '#BDBDBD'
|
|
});
|
|
|
|
// Disable close button on disk table
|
|
$('#' + thisTabId + ' table span').unbind('click');
|
|
|
|
// Disable all fields
|
|
var inputs = $('#' + thisTabId + ' input');
|
|
inputs.attr('readonly', 'readonly');
|
|
inputs.css( {
|
|
'background-color' : '#F2F2F2'
|
|
});
|
|
|
|
var textarea = $('#' + thisTabId + ' textarea');
|
|
|
|
// Add a new line at the end of the user entry
|
|
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();
|
|
|
|
/**
|
|
* 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;out=' + out2Id
|
|
},
|
|
|
|
success : updateProvisionStatus
|
|
});
|
|
}
|
|
} else {
|
|
alert('(Error) ' + errMsg);
|
|
}
|
|
});
|
|
provForm.append(provisionBtn);
|
|
}
|
|
|
|
/**
|
|
* Load netboot page
|
|
*
|
|
* @param trgtNodes
|
|
* Targets to run rnetboot against
|
|
* @return Nothing
|
|
*/
|
|
function loadZNetbootPage(trgtNodes) {
|
|
// Get nodes tab
|
|
var tab = getNodesTab();
|
|
|
|
// Generate new tab ID
|
|
var inst = 0;
|
|
var newTabId = 'netbootTab' + inst;
|
|
while ($('#' + newTabId).length) {
|
|
// If one already exists, generate another one
|
|
inst = inst + 1;
|
|
newTabId = 'netbootTab' + inst;
|
|
}
|
|
|
|
// Open new tab
|
|
// Create nodeset form
|
|
var netbootForm = $('<div class="form"></div>');
|
|
|
|
// Create status bar
|
|
var barId = 'netbootStatusBar' + inst;
|
|
var statusBar = createStatusBar(barId);
|
|
statusBar.hide();
|
|
netbootForm.append(statusBar);
|
|
|
|
// Create loader
|
|
var loader = createLoader('netbootLoader');
|
|
statusBar.append(loader);
|
|
|
|
// Create info bar
|
|
var infoBar = createInfoBar('Cause the range of nodes to boot to network');
|
|
netbootForm.append(infoBar);
|
|
|
|
// Target node or group
|
|
var target = $('<div><label for="target">Target node or group:</label><input type="text" name="target" value="' + trgtNodes + '"/></div>');
|
|
netbootForm.append(target);
|
|
|
|
// Create the rest of the form
|
|
// Include IPL address
|
|
netbootForm
|
|
.append('<div><label>IPL address:</label><input type="text" id="ipl" name="ipl"/></div>');
|
|
|
|
/**
|
|
* Ok
|
|
*/
|
|
var okBtn = createButton('Ok');
|
|
okBtn.bind('click', function(event) {
|
|
var ready = true;
|
|
|
|
// Check state, OS, arch, and profile
|
|
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).css('border', 'solid #FF0000 1px');
|
|
ready = false;
|
|
} else {
|
|
inputs.eq(i).css('border', 'solid #BDBDBD 1px');
|
|
}
|
|
}
|
|
|
|
// If no inputs are empty
|
|
if (ready) {
|
|
// Get nodes
|
|
var tgts = $('#' + newTabId + ' input[name=target]').val();
|
|
|
|
// Get IPL address
|
|
var ipl = $('#' + newTabId + ' input[name=ipl]').val();
|
|
|
|
// Stop this function from executing again
|
|
// Unbind event
|
|
$(this).unbind(event);
|
|
$(this).css( {
|
|
'background-color' : '#F2F2F2',
|
|
'color' : '#424242'
|
|
});
|
|
|
|
/**
|
|
* 1. Boot to network
|
|
*/
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'rnetboot',
|
|
tgt : tgts,
|
|
args : 'ipl=' + ipl,
|
|
msg : 'cmd=rnetboot;inst=' + inst
|
|
},
|
|
|
|
success : updateZNetbootStatus
|
|
});
|
|
|
|
// Show status bar
|
|
statusBar.show();
|
|
} else {
|
|
alert('You are missing some values');
|
|
}
|
|
});
|
|
netbootForm.append(okBtn);
|
|
|
|
// Append to discover tab
|
|
tab.add(newTabId, 'Netboot', netbootForm);
|
|
|
|
// Select new tab
|
|
tab.select(newTabId);
|
|
}
|
|
|
|
/**
|
|
* Load the clone page
|
|
*
|
|
* @param node
|
|
* Source node
|
|
* @return Nothing
|
|
*/
|
|
function loadZClonePage(node) {
|
|
// Get nodes tab
|
|
var tab = getNodesTab();
|
|
var newTabId = node + 'CloneTab';
|
|
|
|
// If there is no existing clone tab for this node
|
|
if (!$('#' + newTabId).length) {
|
|
// Get table headers
|
|
var table = $('#' + node).parent().parent().parent().parent();
|
|
var headers = table.find('thead 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 myDataTable = getNodesDataTable();
|
|
var rowPos = myDataTable.fnGetPosition(nodeRow.get(0));
|
|
var aData = myDataTable.fnGetData(rowPos);
|
|
var hcp = aData[hcpCol];
|
|
|
|
// Create status bar, hide on load
|
|
var statBarId = node + 'CloneStatusBar';
|
|
var statBar = $('<div class="statusBar" id="' + statBarId + '"></div>')
|
|
.hide();
|
|
|
|
// Create info bar
|
|
var infoBar = createInfoBar('Clone a node');
|
|
|
|
// Create clone form
|
|
var cloneForm = $('<div class="form"></div>');
|
|
cloneForm.append(statBar);
|
|
cloneForm.append(infoBar);
|
|
|
|
// Target node range
|
|
cloneForm
|
|
.append('<div><label>Target node range:</label><input type="text" id="tgtNode" name="tgtNode"/></div>');
|
|
// Target user ID range
|
|
cloneForm
|
|
.append('<div><label>Target user ID range:</label><input type="text" id="tgtUserId" name="tgtUserId"/></div>');
|
|
|
|
// Create the rest of the form
|
|
// Include clone source, hardware control point, group, disk pool, and
|
|
// disk password
|
|
cloneForm
|
|
.append('<div><label>Clone source:</label><input type="text" id="srcNode" name="srcNode" readonly="readonly" value="' + node + '"/></div>');
|
|
cloneForm
|
|
.append('<div><label>Hardware control point:</label><input type="text" id="newHcp" name="newHcp" readonly="readonly" value="' + hcp + '"/></div>');
|
|
|
|
// Group
|
|
var group = $('<div></div>');
|
|
var groupLabel = $('<label for="group">Group:</label>');
|
|
var groupInput = $('<input type="text" id="newGroup" name="newGroup"/>');
|
|
|
|
// Get the groups on-focus
|
|
groupInput.focus(function() {
|
|
var groupNames = $.cookie('Groups');
|
|
|
|
// If there are groups, turn on auto-complete
|
|
if (groupNames) {
|
|
$(this).autocomplete(groupNames.split(','));
|
|
}
|
|
});
|
|
|
|
group.append(groupLabel);
|
|
group.append(groupInput);
|
|
cloneForm.append(group);
|
|
|
|
// Get the list of disk pools
|
|
var temp = hcp.split('.');
|
|
var diskPools = $.cookie(temp[0] + 'DiskPools');
|
|
|
|
// Set autocomplete for disk pool
|
|
var poolDiv = $('<div></div>');
|
|
var poolLabel = $('<label>Disk pool:</label>');
|
|
var poolInput = $('<input type="text" id="diskPool" name="diskPool"/>')
|
|
.autocomplete(diskPools.split(','));
|
|
poolDiv.append(poolLabel);
|
|
poolDiv.append(poolInput);
|
|
cloneForm.append(poolDiv);
|
|
|
|
cloneForm
|
|
.append('<div><label>Disk password:</label><input type="password" id="diskPw" name="diskPw"/></div>');
|
|
|
|
/**
|
|
* Clone
|
|
*/
|
|
var cloneBtn = createButton('Clone');
|
|
cloneBtn
|
|
.bind('click', function(event) {
|
|
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');
|
|
}
|
|
}
|
|
|
|
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();
|
|
|
|
// Is a node range given
|
|
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 the starting index
|
|
var nodeStart = parseInt(tmp[0].match(/\d+/));
|
|
// Get the ending index
|
|
var nodeEnd = parseInt(tmp[1]);
|
|
|
|
tmp = userIdRange.split('-');
|
|
|
|
// Get user ID base name
|
|
var userIdBase = tmp[0].match(/[a-zA-Z]+/);
|
|
// Get the starting index
|
|
var userIdStart = parseInt(tmp[0].match(/\d+/));
|
|
// Get the ending index
|
|
var userIdEnd = parseInt(tmp[1]);
|
|
|
|
// Does starting and ending index match
|
|
if (!(nodeStart == userIdStart)
|
|
|| !(nodeEnd == userIdEnd)) {
|
|
errMsg = errMsg + 'The node range and user ID range does not match. ';
|
|
ready = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
var srcNode = $('#' + newTabId + ' input[name=srcNode]').val();
|
|
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 = cloneForm.find('input');
|
|
inputs.attr('readonly', 'readonly');
|
|
inputs.css( {
|
|
'background-color' : '#F2F2F2'
|
|
});
|
|
|
|
// 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 the starting index
|
|
var nodeStart = parseInt(tmp[0].match(/\d+/));
|
|
// Get the ending index
|
|
var nodeEnd = parseInt(tmp[1]);
|
|
|
|
tmp = userIdRange.split('-');
|
|
|
|
// Get user ID base name
|
|
var userIdBase = tmp[0].match(/[a-zA-Z]+/);
|
|
// Get the starting index
|
|
var userIdStart = parseInt(tmp[0].match(/\d+/));
|
|
// Get the ending index
|
|
var userIdEnd = parseInt(tmp[1]);
|
|
|
|
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 : updateCloneStatus
|
|
});
|
|
}
|
|
} 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 : updateCloneStatus
|
|
});
|
|
}
|
|
|
|
// Create loader
|
|
var loader = createLoader('');
|
|
$('#' + statBarId).append(loader);
|
|
$('#' + statBarId).show();
|
|
|
|
// Stop this function from executing again
|
|
// Unbind event
|
|
$(this).unbind(event);
|
|
$(this).css( {
|
|
'background-color' : '#F2F2F2',
|
|
'color' : '#BDBDBD'
|
|
});
|
|
} else {
|
|
alert('(Error) ' + errMsg);
|
|
}
|
|
});
|
|
cloneForm.append(cloneBtn);
|
|
|
|
// Add clone tab
|
|
tab.add(newTabId, 'Clone', cloneForm);
|
|
}
|
|
tab.select(newTabId);
|
|
}
|
|
|
|
/**
|
|
* Load node inventory
|
|
*
|
|
* @param data
|
|
* Data from HTTP request
|
|
* @return Nothing
|
|
*/
|
|
function loadZInventory(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
|
|
var loaderId = node + 'TabLoader';
|
|
$('#' + loaderId).remove();
|
|
|
|
// Create status bar
|
|
var statusBarId = node + 'StatusBar';
|
|
var statusBar = createStatusBar(statusBarId);
|
|
|
|
// Add loader to status bar, but hide it
|
|
loaderId = node + 'StatusBarLoader';
|
|
var loader = createLoader(loaderId);
|
|
statusBar.append(loader);
|
|
loader.hide();
|
|
statusBar.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 = getNodeAttrs(keys, attrNames, inv);
|
|
|
|
// Create division to hold user entry
|
|
var ueDivId = node + 'UserEntry';
|
|
var ueDiv = $('<div class="userEntry" id="' + ueDivId + '"></div>');
|
|
|
|
// Create division to hold inventory
|
|
var invDivId = node + 'Inventory';
|
|
var invDiv = $('<div class="inventory" id="' + invDivId + '"></div>');
|
|
|
|
/**
|
|
* Show user entry
|
|
*/
|
|
var toggleLinkId = node + 'ToggleLink';
|
|
var toggleLink = $('<a id="' + toggleLinkId + '" href="#">Show user entry</a>');
|
|
toggleLink.one('click', function(event) {
|
|
// Toggle inventory division
|
|
$('#' + invDivId).toggle();
|
|
|
|
// Create loader
|
|
loader = createLoader(node + 'TabLoader');
|
|
loader = $('<center></center>').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');
|
|
|
|
// Stop this function from executing again
|
|
// Unbind event
|
|
$(this).unbind(event);
|
|
});
|
|
|
|
var toggleLnkDiv = $('<div class="toggle"></div>').css( {
|
|
'text-align' : 'right'
|
|
});
|
|
toggleLnkDiv.append(toggleLink);
|
|
|
|
/**
|
|
* General inventory
|
|
*/
|
|
var fieldSet = $('<fieldset></fieldset>');
|
|
var legend = $('<legend>General</legend>');
|
|
fieldSet.append(legend);
|
|
var oList = $('<ol></ol>');
|
|
var item, label, input, args;
|
|
|
|
// Loop through each property
|
|
for ( var k = 0; k < 5; k++) {
|
|
// Create a list item for each property
|
|
item = $('<li></li>');
|
|
|
|
// Create a label - Property name
|
|
label = $('<label>' + attrNames[keys[k]] + '</label>');
|
|
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 inventory
|
|
*/
|
|
var hwList, hwItem;
|
|
fieldSet = $('<fieldset></fieldset>');
|
|
legend = $('<legend>Hardware</legent>');
|
|
fieldSet.append(legend);
|
|
oList = $('<ol></ol>');
|
|
|
|
// Loop through each property
|
|
var label;
|
|
for (k = 5; k < keys.length; k++) {
|
|
// Create a list item
|
|
item = $('<li></li>');
|
|
|
|
// Create a list to hold the property value(s)
|
|
hwList = $('<ul></ul>');
|
|
hwItem = $('<li></li>');
|
|
|
|
/**
|
|
* Privilege
|
|
*/
|
|
if (keys[k] == 'priv') {
|
|
// Create a label - Property name
|
|
label = $('<label>' + attrNames[keys[k]].replace(':', '') + '</label>');
|
|
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 = $('<li></li>');
|
|
|
|
// Determine privilege
|
|
args = attrs[keys[k]][l].split(' ');
|
|
if (args[0] == 'Directory:') {
|
|
label = $('<label>' + args[0] + '</label>');
|
|
hwItem.append(label);
|
|
hwItem.append(args[1]);
|
|
} else if (args[0] == 'Currently:') {
|
|
label = $('<label>' + args[0] + '</label>');
|
|
hwItem.append(label);
|
|
hwItem.append(args[1]);
|
|
}
|
|
|
|
hwList.append(hwItem);
|
|
}
|
|
|
|
item.append(hwList);
|
|
}
|
|
|
|
/**
|
|
* Memory
|
|
*/
|
|
else if (keys[k] == 'memory') {
|
|
// Create a label - Property name
|
|
label = $('<label>' + attrNames[keys[k]].replace(':', '') + '</label>');
|
|
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 = $('<li></li>');
|
|
hwItem.append(attrs[keys[k]][l]);
|
|
hwList.append(hwItem);
|
|
}
|
|
|
|
item.append(hwList);
|
|
}
|
|
|
|
/**
|
|
* Processor
|
|
*/
|
|
else if (keys[k] == 'proc') {
|
|
// Create a label - Property name
|
|
label = $('<label>' + attrNames[keys[k]].replace(':', '') + '</label>');
|
|
item.append(label);
|
|
|
|
// Create a table to hold processor data
|
|
var procTable = $('<table></table>');
|
|
var procBody = $('<tbody></tbody>');
|
|
var procFooter = $('<tfoot></tfoot>');
|
|
|
|
// Table columns - Type, Address, ID, Base, Dedicated, and Affinity
|
|
var procTabRow = $('<thead> <th>Type</th> <th>Address</th> <th>ID</th> <th>Base</th> <th>Dedicated</th> <th>Affinity</th> </thead>');
|
|
procTable.append(procTabRow);
|
|
var procType, procAddr, procId, procAff;
|
|
|
|
// Create context menu - Remove processor
|
|
var contextMenu = [ {
|
|
'Remove' : function(menuItem, menu) {
|
|
if (confirm('Are you sure?')) {
|
|
removeProcessor(node, $(this).text());
|
|
}
|
|
}
|
|
} ];
|
|
|
|
// Loop through each processor
|
|
var closeBtn;
|
|
var n, temp;
|
|
var procType, procAddr, procLink;
|
|
for (l = 0; l < attrs[keys[k]].length; 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 = $('<td>' + temp + '</td>');
|
|
procAddr = $('<td></td>');
|
|
procLink = $('<a href="#">' + args[1] + '</a>');
|
|
|
|
// Append context menu to link
|
|
procLink.contextMenu(contextMenu, {
|
|
theme : 'vista'
|
|
});
|
|
|
|
procAddr.append(procLink);
|
|
procId = $('<td>' + args[5] + '</td>');
|
|
procAff = $('<td>' + args[args.length - 1] + '</td>');
|
|
|
|
// Base processor
|
|
if (args[6] == '(BASE)') {
|
|
baseProc = $('<td>' + true + '</td>');
|
|
} else {
|
|
baseProc = $('<td>' + false + '</td>');
|
|
}
|
|
|
|
// Dedicated processor
|
|
if (args[args.length - 3] == 'DEDICATED') {
|
|
dedicatedProc = $('<td>' + true + '</td>');
|
|
} else {
|
|
dedicatedProc = $('<td>' + false + '</td>');
|
|
}
|
|
|
|
// Create a new row for each processor
|
|
procTabRow = $('<tr></tr>');
|
|
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 = $('<a href="#">Add processor</a>');
|
|
addProcLink
|
|
.bind(
|
|
'click',
|
|
function(event) {
|
|
var procForm = '<div class="form">'
|
|
+ '<div><label for="procNode">Processor for:</label><input type="text" readonly="readonly" id="procNode" name="procNode" value="'
|
|
+ node
|
|
+ '"/></div>'
|
|
+ '<div><label for="procAddress">Processor address:</label><input type="text" id="procAddress" name="procAddress"/></div>'
|
|
+ '<div><label for="procType">Processor type:</label>'
|
|
+ '<select id="procType" name="procType">'
|
|
+ '<option>CP</option>' + '<option>IFL</option>'
|
|
+ '<option>ZAAP</option>' + '<option>ZIIP</option>'
|
|
+ '</select>' + '</div>' + '</div>';
|
|
|
|
$.prompt(procForm, {
|
|
callback : addProcessor,
|
|
buttons : {
|
|
Ok : true,
|
|
Cancel : false
|
|
},
|
|
prefix : 'cleanblue'
|
|
});
|
|
});
|
|
procFooter.append(addProcLink);
|
|
procTable.append(procFooter);
|
|
|
|
item.append(procTable);
|
|
}
|
|
|
|
/**
|
|
* Disk
|
|
*/
|
|
else if (keys[k] == 'disk') {
|
|
// Create a label - Property name
|
|
label = $('<label>' + attrNames[keys[k]].replace(':', '') + '</label>');
|
|
item.append(label);
|
|
|
|
// Create a table to hold disk (DASD) data
|
|
var dasdTable = $('<table></table>');
|
|
var dasdBody = $('<tbody></tbody>');
|
|
var dasdFooter = $('<tfoot></tfoot>');
|
|
|
|
// Create context menu - Remove disk
|
|
contextMenu = [ {
|
|
'Remove' : function(menuItem, menu) {
|
|
if (confirm('Are you sure?')) {
|
|
removeDisk(node, $(this).text());
|
|
}
|
|
}
|
|
} ];
|
|
|
|
// Table columns - Virtual Device, Type, VolID, Type of Access, and
|
|
// Size
|
|
var dasdTabRow = $('<thead> <th>Virtual Device #</th> <th>Type</th> <th>VolID</th> <th>Type of Access</th> <th>Size</th> </thead>');
|
|
dasdTable.append(dasdTabRow);
|
|
var dasdVDev, dasdType, dasdVolId, dasdAccess, dasdSize;
|
|
|
|
// Loop through each DASD
|
|
for (l = 0; l < attrs[keys[k]].length; l++) {
|
|
args = attrs[keys[k]][l].split(' ');
|
|
|
|
// Get DASD virtual device, type, volume ID, access, and size
|
|
dasdVDev = $('<td></td>');
|
|
dasdLink = $('<a href="#">' + args[1] + '</a>');
|
|
|
|
// Append context menu to link
|
|
dasdLink.contextMenu(contextMenu, {
|
|
theme : 'vista'
|
|
});
|
|
|
|
dasdVDev.append(dasdLink);
|
|
|
|
dasdType = $('<td>' + args[2] + '</td>');
|
|
dasdVolId = $('<td>' + args[3] + '</td>');
|
|
dasdAccess = $('<td>' + args[4] + '</td>');
|
|
dasdSize = $('<td>' + args[args.length - 9] + ' '
|
|
+ args[args.length - 8] + '</td>');
|
|
|
|
// Create a new row for each DASD
|
|
dasdTabRow = $('<tr></tr>');
|
|
dasdTabRow.append(dasdVDev);
|
|
dasdTabRow.append(dasdType);
|
|
dasdTabRow.append(dasdVolId);
|
|
dasdTabRow.append(dasdAccess);
|
|
dasdTabRow.append(dasdSize);
|
|
dasdBody.append(dasdTabRow);
|
|
}
|
|
|
|
dasdTable.append(dasdBody);
|
|
|
|
/**
|
|
* Add DASD
|
|
*/
|
|
var addDasdLink = $('<a href="#">Add disk</a>');
|
|
addDasdLink
|
|
.bind('click', function(event) {
|
|
// Get list of disk pools
|
|
var temp = attrs['hcp'][0].split('.');
|
|
var cookie = $.cookie(temp[0] + 'DiskPools');
|
|
|
|
// Create drop down list for disk pool
|
|
var pools = cookie.split(',');
|
|
var selectPool = '<select id="diskPool" name="diskPool">';
|
|
for ( var i = 0; i < pools.length; i++) {
|
|
selectPool = selectPool + '<option>' + pools[i]
|
|
+ '</option>';
|
|
}
|
|
selectPool = selectPool + '</select>';
|
|
|
|
var dasdForm = '<div class="form">'
|
|
+ '<div><label for="diskNode">Disk for:</label><input type="text" readonly="readonly" id="diskNode" name="diskNode" value="'
|
|
+ node
|
|
+ '"/></div>'
|
|
+ '<div><label for="diskType">Disk type:</label><select id="diskType" name="diskType"><option value="3390">3390</option></select></div>'
|
|
+ '<div><label for="diskAddress">Disk address:</label><input type="text" id="diskAddress" name="diskAddress"/></div>'
|
|
+ '<div><label for="diskSize">Disk size:</label><input type="text" id="diskSize" name="diskSize"/></div>'
|
|
+ '<div><label for="diskPool">Disk pool:</label>'
|
|
+ selectPool
|
|
+ '</div>'
|
|
+ '<div><label for="diskPassword">Disk password:</label><input type="password" id="diskPassword" name="diskPassword"/></div>'
|
|
+ '</div>';
|
|
|
|
$.prompt(dasdForm, {
|
|
callback : addDisk,
|
|
buttons : {
|
|
Ok : true,
|
|
Cancel : false
|
|
},
|
|
prefix : 'cleanblue'
|
|
});
|
|
});
|
|
dasdFooter.append(addDasdLink);
|
|
dasdTable.append(dasdFooter);
|
|
|
|
item.append(dasdTable);
|
|
}
|
|
|
|
/**
|
|
* NIC
|
|
*/
|
|
else if (keys[k] == 'nic') {
|
|
// Create a label - Property name
|
|
label = $('<label>' + attrNames[keys[k]].replace(':', '') + '</label>');
|
|
item.append(label);
|
|
|
|
// Create a table to hold NIC data
|
|
var nicTable = $('<table></table>');
|
|
var nicBody = $('<tbody></tbody>');
|
|
var nicFooter = $('<tfoot></tfoot>');
|
|
|
|
// Create context menu - Remove NIC
|
|
contextMenu = [ {
|
|
'Remove' : function(menuItem, menu) {
|
|
if (confirm('Are you sure?')) {
|
|
removeNic(node, $(this).text());
|
|
}
|
|
}
|
|
} ];
|
|
|
|
// Table columns - Virtual device, Adapter Type, Port Name, # of
|
|
// Devices, MAC Address, and LAN Name
|
|
var nicTabRow = $('<th>Virtual Device #</th> <th>Adapter Type</th> <th>Port Name</th> <th># of Devices</th> <th>LAN Name</th>');
|
|
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) {
|
|
args = attrs[keys[k]][l].split(' ');
|
|
|
|
// Get NIC virtual device, type, port name, and number of
|
|
// devices
|
|
nicVDev = $('<td></td>');
|
|
nicLink = $('<a href="#">' + args[1] + '</a>');
|
|
|
|
// Append context menu to link
|
|
nicLink.contextMenu(contextMenu, {
|
|
theme : 'vista'
|
|
});
|
|
|
|
nicVDev.append(nicLink);
|
|
|
|
nicType = $('<td>' + args[3] + '</td>');
|
|
nicPortName = $('<td>' + args[10] + '</td>');
|
|
nicNumOfDevs = $('<td>' + args[args.length - 1] + '</td>');
|
|
|
|
args = attrs[keys[k]][l + 1].split(' ');
|
|
nicLanName = $('<td>' + args[args.length - 2] + ' '
|
|
+ args[args.length - 1] + '</td>');
|
|
|
|
// Create a new row for each DASD
|
|
nicTabRow = $('<tr></tr>');
|
|
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 = $('<a href="#">Add NIC</a>');
|
|
addNicLink
|
|
.bind('click', function(event) {
|
|
// Get network names
|
|
var temp = attrs['hcp'][0].split('.');
|
|
var networks = $.cookie(temp[0] + 'Networks').split(',');
|
|
|
|
// Create a drop down list
|
|
var gLans = '<select id="nicLanName" name="nicLanName">';
|
|
var vswitches = '<select id="nicVSwitchName" name="nicVSwitchName">';
|
|
for ( var i = 0; i < networks.length; i++) {
|
|
var network = networks[i].split(' ');
|
|
|
|
// Get VSwitches
|
|
if (network[0] == 'VSWITCH') {
|
|
vswitches = vswitches + '<option>' + network[0]
|
|
+ ' ' + network[1] + '</option>';
|
|
}
|
|
|
|
// Get Guest LAN
|
|
else if (network[0] == 'LAN') {
|
|
gLans = gLans + '<option>' + network[0] + ' '
|
|
+ network[1] + '</option>';
|
|
}
|
|
}
|
|
vswitches = vswitches + '</select>';
|
|
gLans = gLans + '</select>';
|
|
|
|
var nicTypeForm = '<div class="form">'
|
|
+ '<div><label for="nicNode">NIC for:</label><input type="text" readonly="readonly" id="nicNode" name="nicNode" value="'
|
|
+ node
|
|
+ '"/></div>'
|
|
+ '<div><label for="nicAddress">NIC address:</label><input type="text" id="nicAddress" name="nicAddress"/></div>'
|
|
+ '<div><label for="nicType">NIC type:</label>'
|
|
+ '<select id="nicType" name="nicType">'
|
|
+ '<option>QDIO</option>'
|
|
+ '<option>HiperSocket</option>'
|
|
+ '</select>'
|
|
+ '</div>'
|
|
+ '<div><label for="nicNetworkType">Network type:</label>'
|
|
+ '<select id="nicNetworkType" name="nicNetworkType">'
|
|
+ '<option>Guest LAN</option>'
|
|
+ '<option>Virtual Switch</option>' + '</select>'
|
|
+ '</div>' + '</div>';
|
|
var configGuestLanForm = '<div class="form">'
|
|
+ '<div><label for="nicLanName">Guest LAN name:</label>'
|
|
+ gLans + '</div>' + '</div>';
|
|
var configVSwitchForm = '<div class="form">'
|
|
+ '<div><label for="nicVSwitchName">VSWITCH name:</label>'
|
|
+ vswitches + '</div>' + '</div>';
|
|
|
|
var states = {
|
|
// Select NIC type
|
|
type : {
|
|
html : nicTypeForm,
|
|
buttons : {
|
|
Ok : true,
|
|
Cancel : false
|
|
},
|
|
focus : 1,
|
|
prefix : 'cleanblue',
|
|
submit : function(v, m, f) {
|
|
if (!v) {
|
|
return true;
|
|
} else {
|
|
var networkType = f.nicNetworkType;
|
|
if (networkType == 'Guest LAN')
|
|
$.prompt.goToState('configGuestLan');
|
|
else
|
|
$.prompt.goToState('configVSwitch');
|
|
return false;
|
|
}
|
|
}
|
|
},
|
|
|
|
// Configure guest LAN
|
|
configGuestLan : {
|
|
html : configGuestLanForm,
|
|
callback : addNic,
|
|
buttons : {
|
|
Ok : true,
|
|
Cancel : false
|
|
},
|
|
focus : 1,
|
|
prefix : 'cleanblue',
|
|
submit : function(v, m, f) {
|
|
if (v) {
|
|
return true;
|
|
}
|
|
}
|
|
},
|
|
|
|
// Configure VSwitch
|
|
configVSwitch : {
|
|
html : configVSwitchForm,
|
|
callback : addNic,
|
|
buttons : {
|
|
Ok : true,
|
|
Cancel : false
|
|
},
|
|
focus : 1,
|
|
prefix : 'cleanblue',
|
|
submit : function(v, m, f) {
|
|
if (v) {
|
|
return true;
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
$.prompt(states, {
|
|
callback : addNic,
|
|
prefix : 'cleanblue'
|
|
});
|
|
});
|
|
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(statusBar);
|
|
$('#' + tabId).append(toggleLnkDiv);
|
|
$('#' + tabId).append(ueDiv);
|
|
$('#' + tabId).append(invDiv);
|
|
}
|
|
|
|
/**
|
|
* Load user entry of a given node
|
|
*
|
|
* @param data
|
|
* Data from HTTP request
|
|
* @return Nothing
|
|
*/
|
|
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 node user entry
|
|
var userEntry = data.rsp[0].split(node + ':');
|
|
|
|
// Remove loader
|
|
var loaderId = node + 'TabLoader';
|
|
$('#' + loaderId).remove();
|
|
|
|
var toggleLinkId = node + 'ToggleLink';
|
|
$('#' + toggleLinkId).click(function() {
|
|
// Get the 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 user entry') {
|
|
$(this).text('Show inventory');
|
|
} else {
|
|
$(this).text('Show user entry');
|
|
}
|
|
});
|
|
|
|
// Put user entry into a list
|
|
var fieldSet = $('<fieldset></fieldset>');
|
|
var legend = $('<legend>User Entry</legend>');
|
|
fieldSet.append(legend);
|
|
|
|
var txtArea = $('<textarea></textarea>');
|
|
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();
|
|
});
|
|
|
|
// Save button
|
|
var saveBtn = createButton('Save');
|
|
saveBtn.hide();
|
|
saveBtn.bind('click', function(event) {
|
|
// Show loader
|
|
var statusId = node + 'StatusBar';
|
|
var statusBarLoaderId = node + 'StatusBarLoader';
|
|
$('#' + statusBarLoaderId).show();
|
|
$('#' + statusId).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
|
|
incrementZNodeProcess(node);
|
|
|
|
txtArea.attr('readonly', 'readonly');
|
|
txtArea.css( {
|
|
'border-width' : '0px'
|
|
});
|
|
|
|
// Stop this function from executing again
|
|
// Unbind event
|
|
$(this).unbind(event);
|
|
$(this).hide();
|
|
cancelBtn.hide();
|
|
});
|
|
|
|
// Cancel button
|
|
var cancelBtn = createButton('Cancel');
|
|
cancelBtn.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 user entry to edit');
|
|
|
|
// Append user entry into division
|
|
$('#' + ueDivId).append(infoBar);
|
|
$('#' + ueDivId).append(fieldSet);
|
|
$('#' + ueDivId).append(saveBtn);
|
|
$('#' + ueDivId).append(cancelBtn);
|
|
}
|
|
|
|
/**
|
|
* Set a cookie to track the number of processes for a given node
|
|
*
|
|
* @param node
|
|
* Node to set cookie for
|
|
* @return Nothing
|
|
*/
|
|
function incrementZNodeProcess(node) {
|
|
// Set cookie for number actions performed against node
|
|
var actions = $.cookie(node + 'Processes');
|
|
if (actions) {
|
|
// One more process
|
|
actions = parseInt(actions) + 1;
|
|
$.cookie(node + 'Processes', actions);
|
|
} else {
|
|
$.cookie(node + 'Processes', 1);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update the provision status bar
|
|
*
|
|
* @param data
|
|
* Data returned from HTTP request
|
|
* @return Nothing
|
|
*/
|
|
function updateProvisionStatus(data) {
|
|
var rsp = data.rsp;
|
|
var args = data.msg.split(';');
|
|
|
|
// Get command invoked
|
|
var cmd = args[0].replace('cmd=', '');
|
|
// Get output ID
|
|
var out2Id = args[1].replace('out=', '');
|
|
|
|
var statBarId = 'zProvisionStatBar' + out2Id;
|
|
var tabId = 'zvmProvisionTab' + out2Id;
|
|
|
|
// The tab must be open in order to get these inputs
|
|
|
|
// Get node name
|
|
var node = $('#' + tabId + ' input[name=nodeName]').val();
|
|
// Get userId
|
|
var userId = $('#' + tabId + ' input[name=userId]').val();
|
|
// Get hardware control point
|
|
var hcp = $('#' + tabId + ' input[name=hcp]').val();
|
|
// Get group
|
|
var group = $('#' + tabId + ' input[name=group]').val();
|
|
// Get user entry
|
|
var userEntry = $('#' + tabId + ' textarea').val();
|
|
// Get operating system
|
|
var osImage = $('#' + tabId + ' input[name=os]').val();
|
|
|
|
/**
|
|
* 2. Update /etc/hosts
|
|
*/
|
|
if (cmd == 'nodeadd') {
|
|
|
|
// If no output, no errors occurred
|
|
if (rsp.length) {
|
|
$('#' + statBarId).append(
|
|
'<p>(Error) Failed to create node definition</p>');
|
|
} else {
|
|
$('#' + statBarId).append(
|
|
'<p>Node definition created for ' + node + '</p>');
|
|
}
|
|
|
|
// Update /etc/hosts
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'makehosts',
|
|
tgt : '',
|
|
args : '',
|
|
msg : 'cmd=makehosts;out=' + out2Id
|
|
},
|
|
|
|
success : updateProvisionStatus
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 3. Update DNS
|
|
*/
|
|
else if (cmd == 'makehosts') {
|
|
// If no output, no errors occurred
|
|
if (rsp.length) {
|
|
$('#' + statBarId).append(
|
|
'<p>(Error) Failed to update /etc/hosts</p>');
|
|
} else {
|
|
$('#' + statBarId).append('<p>/etc/hosts updated</p>');
|
|
}
|
|
|
|
// Update DNS
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'makedns',
|
|
tgt : '',
|
|
args : '',
|
|
msg : 'cmd=makedns;out=' + out2Id
|
|
},
|
|
|
|
success : updateProvisionStatus
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 4. Create user entry
|
|
*/
|
|
else if (cmd == 'makedns') {
|
|
// Reset the number of tries
|
|
$.cookie('tries4' + tabId, 0);
|
|
|
|
// Separate output into lines
|
|
var p = $('<p></p>');
|
|
for ( var i = 0; i < rsp.length; i++) {
|
|
if (rsp[i]) {
|
|
p.append(rsp[i]);
|
|
p.append('<br>');
|
|
}
|
|
}
|
|
|
|
$('#' + statBarId).append(p);
|
|
|
|
// Create user entry
|
|
$.ajax( {
|
|
url : 'lib/zCmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'mkvm',
|
|
tgt : node,
|
|
args : '',
|
|
att : userEntry,
|
|
msg : 'cmd=mkvm;out=' + out2Id
|
|
},
|
|
|
|
success : updateProvisionStatus
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 5. Add disk and format disk
|
|
*/
|
|
else if (cmd == 'mkvm') {
|
|
var failed = false;
|
|
|
|
// Separate output into lines
|
|
var p = $('<p></p>');
|
|
for ( var i = 0; i < rsp.length; i++) {
|
|
if (rsp[i]) {
|
|
// Find the node name and insert a break before it
|
|
rsp[i] = rsp[i].replace(new RegExp(node + ': ', 'g'), '<br>');
|
|
|
|
p.append(rsp[i]);
|
|
p.append('<br>');
|
|
|
|
// If the call failed
|
|
if (rsp[i].indexOf('Failed') > -1
|
|
|| rsp[i].indexOf('Error') > -1) {
|
|
failed = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
$('#' + statBarId).append(p);
|
|
|
|
// If the call failed
|
|
if (failed) {
|
|
// Try again (at least 2 times)
|
|
var tries = parseInt($.cookie('tries4' + tabId));
|
|
if (tries < 2) {
|
|
$('#' + statBarId).append('<p>Trying again</p>');
|
|
tries = tries + 1;
|
|
|
|
// One more try
|
|
$.cookie('tries4' + tabId, tries);
|
|
|
|
// Create user entry
|
|
$.ajax( {
|
|
url : 'lib/zCmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'mkvm',
|
|
tgt : node,
|
|
args : '',
|
|
att : userEntry,
|
|
msg : 'cmd=mkvm;out=' + out2Id
|
|
},
|
|
|
|
success : updateProvisionStatus
|
|
});
|
|
} else {
|
|
// Failed - Do not continue
|
|
var loaderId = 'zProvisionLoader' + out2Id;
|
|
$('#' + loaderId).hide();
|
|
}
|
|
}
|
|
// If there were no errors
|
|
else {
|
|
|
|
// Reset the number of tries
|
|
$.cookie('tries4' + tabId, 0);
|
|
|
|
// Set cookie for number of disks
|
|
var diskRows = $('#' + tabId + ' table tr');
|
|
$.cookie('zProvisionDisks2Add' + out2Id, diskRows.length);
|
|
|
|
if (diskRows.length > 0) {
|
|
for ( var i = 0; i < diskRows.length; i++) {
|
|
var diskArgs = diskRows.eq(i).find('td');
|
|
var type = diskArgs.eq(1).find('select').val();
|
|
var address = diskArgs.eq(2).find('input').val();
|
|
var size = diskArgs.eq(3).find('input').val();
|
|
var pool = diskArgs.eq(4).find('input').val();
|
|
var password = diskArgs.eq(5).find('input').val();
|
|
|
|
// Add disk and format disk
|
|
if (type == '3390') {
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'chvm',
|
|
tgt : node,
|
|
args : '--add3390;' + pool + ';' + address
|
|
+ ';' + size + ';MR;' + password + ';'
|
|
+ password + ';' + password,
|
|
msg : 'cmd=chvm;out=' + out2Id
|
|
},
|
|
|
|
success : updateProvisionStatus
|
|
});
|
|
} else {
|
|
// Virtual server created
|
|
var loaderId = 'zProvisionLoader' + out2Id;
|
|
$('#' + loaderId).hide();
|
|
}
|
|
}
|
|
} else {
|
|
// Virtual server created (no OS, no disks)
|
|
var loaderId = 'zProvisionLoader' + out2Id;
|
|
$('#' + loaderId).hide();
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 6. Set the operating system for given node
|
|
*/
|
|
else if (cmd == 'chvm') {
|
|
var failed = false;
|
|
|
|
// Separate output into lines
|
|
var p = $('<p></p>');
|
|
for ( var i = 0; i < rsp.length; i++) {
|
|
if (rsp[i]) {
|
|
// Find the node name and insert a break before it
|
|
rsp[i] = rsp[i].replace(new RegExp(node + ': ', 'g'), '<br>');
|
|
|
|
p.append(rsp[i]);
|
|
p.append('<br>');
|
|
|
|
// If the call failed
|
|
if (rsp[i].indexOf('Failed') > -1
|
|
|| rsp[i].indexOf('Error') > -1) {
|
|
failed = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
$('#' + statBarId).append(p);
|
|
|
|
// If the call failed
|
|
if (failed) {
|
|
// Try again (at least 2 times)
|
|
var tries = parseInt($.cookie('tries4' + tabId));
|
|
if (tries < 2) {
|
|
$('#' + statBarId).append('<p>Trying again</p>');
|
|
tries = tries + 1;
|
|
|
|
// One more try
|
|
$.cookie('tries4' + tabId, tries);
|
|
|
|
// Set cookie for number of disks
|
|
var diskRows = $('#' + tabId + ' table tr');
|
|
$.cookie('zProvisionDisks2Add' + out2Id, diskRows.length);
|
|
if (diskRows.length > 0) {
|
|
for ( var i = 0; i < diskRows.length; i++) {
|
|
var diskArgs = diskRows.eq(i).find('td');
|
|
var address = diskArgs.eq(1).find('input').val();
|
|
var size = diskArgs.eq(2).find('input').val();
|
|
var pool = diskArgs.eq(3).find('input').val();
|
|
var password = diskArgs.eq(4).find('input').val();
|
|
|
|
// Add disk and format disk
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'chvm',
|
|
tgt : node,
|
|
args : '--add3390;' + pool + ';' + address
|
|
+ ';' + size + ';MR;' + password + ';'
|
|
+ password + ';' + password,
|
|
msg : 'cmd=chvm;out=' + out2Id
|
|
},
|
|
|
|
success : updateProvisionStatus
|
|
});
|
|
}
|
|
} else {
|
|
// Virtual server created (no OS, no disks)
|
|
var loaderId = 'zProvisionLoader' + out2Id;
|
|
$('#' + loaderId).hide();
|
|
}
|
|
} else {
|
|
// Failed - Do not continue
|
|
var loaderId = 'zProvisionLoader' + out2Id;
|
|
$('#' + loaderId).remove();
|
|
}
|
|
} else {
|
|
// Reset the number of tries
|
|
$.cookie('tries4' + tabId, 0);
|
|
|
|
// Get cookie for number of disks
|
|
var disks2add = $.cookie('zProvisionDisks2Add' + out2Id);
|
|
// One less disk to add
|
|
disks2add = disks2add - 1;
|
|
// Set cookie for number of disks
|
|
$.cookie('zProvisionDisks2Add' + out2Id, disks2add);
|
|
|
|
// If an operating system is given
|
|
if (osImage) {
|
|
var tmp = osImage.split('-');
|
|
var os = tmp[0];
|
|
var arch = tmp[1];
|
|
var provisionMethod = tmp[2];
|
|
var profile = tmp[3];
|
|
|
|
// If this is the last disk added
|
|
if (disks2add < 1) {
|
|
// Set operating system
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'nodeadd',
|
|
tgt : '',
|
|
args : node + ';noderes.netboot=zvm;nodetype.os='
|
|
+ os + ';nodetype.arch=' + arch
|
|
+ ';nodetype.profile=' + profile,
|
|
msg : 'cmd=noderes;out=' + out2Id
|
|
},
|
|
|
|
success : updateProvisionStatus
|
|
});
|
|
}
|
|
} else {
|
|
// Virtual server created (no OS)
|
|
var loaderId = 'zProvisionLoader' + out2Id;
|
|
$('#' + loaderId).hide();
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 7. Update DHCP
|
|
*/
|
|
else if (cmd == 'noderes') {
|
|
// If no output, no errors occurred
|
|
if (rsp.length) {
|
|
$('#' + statBarId).append(
|
|
'<p>(Error) Failed to set operating system</p>');
|
|
} else {
|
|
$('#' + statBarId).append(
|
|
'<p>Operating system for ' + node + ' set</p>');
|
|
}
|
|
|
|
// Update DHCP
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'makedhcp',
|
|
tgt : '',
|
|
args : '-a',
|
|
msg : 'cmd=makedhcp;out=' + out2Id
|
|
},
|
|
|
|
success : updateProvisionStatus
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 8. Prepare node for boot
|
|
*/
|
|
else if (cmd == 'makedhcp') {
|
|
var failed = false;
|
|
|
|
// Separate output into lines
|
|
var p = $('<p></p>');
|
|
for ( var i = 0; i < rsp.length; i++) {
|
|
if (rsp[i]) {
|
|
// Find the node name and insert a break before it
|
|
rsp[i] = rsp[i].replace(new RegExp(node + ': ', 'g'), '<br>');
|
|
|
|
p.append(rsp[i]);
|
|
p.append('<br>');
|
|
|
|
// If the call failed
|
|
if (rsp[i].indexOf('Failed') > -1
|
|
|| rsp[i].indexOf('Error') > -1) {
|
|
failed = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
$('#' + statBarId).append(p);
|
|
|
|
// Prepare node for boot
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'nodeset',
|
|
tgt : node,
|
|
args : 'install',
|
|
msg : 'cmd=nodeset;out=' + out2Id
|
|
},
|
|
|
|
success : updateProvisionStatus
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 9. Boot node from network
|
|
*/
|
|
else if (cmd == 'nodeset') {
|
|
var failed = false;
|
|
|
|
// Separate output into lines
|
|
var p = $('<p></p>');
|
|
for ( var i = 0; i < rsp.length; i++) {
|
|
if (rsp[i]) {
|
|
// Find the node name and insert a break before it
|
|
rsp[i] = rsp[i].replace(new RegExp(node + ': ', 'g'), '<br>');
|
|
|
|
p.append(rsp[i]);
|
|
p.append('<br>');
|
|
|
|
// If the call failed
|
|
if (rsp[i].indexOf('Failed') > -1
|
|
|| rsp[i].indexOf('Error') > -1) {
|
|
failed = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
$('#' + statBarId).append(p);
|
|
|
|
// If the call failed
|
|
if (failed) {
|
|
// Failed - Do not continue
|
|
var loaderId = 'zProvisionLoader' + out2Id;
|
|
$('#' + loaderId).remove();
|
|
} else {
|
|
// Boot node from network
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'rnetboot',
|
|
tgt : node,
|
|
args : 'ipl=000C',
|
|
msg : 'cmd=rnetboot;out=' + out2Id
|
|
},
|
|
|
|
success : updateProvisionStatus
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 10. Done
|
|
*/
|
|
else if (cmd == 'rnetboot') {
|
|
var failed = false;
|
|
|
|
// Separate output into lines
|
|
var p = $('<p></p>');
|
|
for ( var i = 0; i < rsp.length; i++) {
|
|
if (rsp[i]) {
|
|
// Find the node name and insert a break before it
|
|
rsp[i] = rsp[i].replace(new RegExp(node + ': ', 'g'), '<br>');
|
|
|
|
p.append(rsp[i]);
|
|
p.append('<br>');
|
|
|
|
// If the call failed
|
|
if (rsp[i].indexOf('Failed') > -1
|
|
|| rsp[i].indexOf('Error') > -1) {
|
|
failed = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
$('#' + statBarId).append(p);
|
|
|
|
// If the call was successful
|
|
if (!failed) {
|
|
$('#' + statBarId)
|
|
.append(
|
|
'<p>Open a VNC viewer to see the installation progress. It might take a couple of minutes before you can connect.</p>');
|
|
}
|
|
|
|
// Hide loader
|
|
$('#' + statBarId).find('img').hide();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update netboot status
|
|
*
|
|
* @param data
|
|
* Data returned from HTTP request
|
|
* @return Nothing
|
|
*/
|
|
function updateZNetbootStatus(data) {
|
|
var rsp = data.rsp;
|
|
var args = data.msg.split(';');
|
|
var cmd = args[0].replace('cmd=', '');
|
|
|
|
// Get nodeset instance
|
|
var inst = args[1].replace('inst=', '');
|
|
var statBarId = 'netbootStatusBar' + inst;
|
|
var tabId = 'netbootTab' + inst;
|
|
|
|
// Get nodes
|
|
var tgts = $('#' + tabId + ' input[name=target]').val();
|
|
|
|
/**
|
|
* 2. Done
|
|
*/
|
|
if (cmd == 'rnetboot') {
|
|
var tgtsArray = tgts.split(',');
|
|
|
|
// Separate output into lines
|
|
var p = $('<p></p>');
|
|
for ( var i = 0; i < rsp.length; i++) {
|
|
if (rsp[i]) {
|
|
// Find the node name and insert a break before it
|
|
for ( var j = 0; j < tgtsArray.length; j++) {
|
|
rsp[i] = rsp[i].replace(new RegExp(tgtsArray[j], 'g'),
|
|
'<br>' + tgtsArray[j]);
|
|
}
|
|
|
|
p.append(rsp[i]);
|
|
p.append('<br>');
|
|
}
|
|
}
|
|
|
|
$('#' + statBarId).append(p);
|
|
|
|
// Hide loader
|
|
$('#' + statBarId).find('img').hide();
|
|
} else {
|
|
return;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Update node status bar
|
|
*
|
|
* @param data
|
|
* Data returned from HTTP request
|
|
* @return Nothing
|
|
*/
|
|
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 statusId = node + 'StatusBar';
|
|
var failed = false;
|
|
|
|
// Separate output into lines
|
|
var p = $('<p></p>');
|
|
for ( var i = 0; i < rsp.length; i++) {
|
|
if (rsp[i]) {
|
|
// Find the node name and insert a break before it
|
|
rsp[i] = rsp[i].replace(new RegExp(node + ': ', 'g'), '<br>');
|
|
|
|
p.append(rsp[i]);
|
|
p.append('<br>');
|
|
|
|
// If the call failed
|
|
if (rsp[i].indexOf('Failed') > -1 || rsp[i].indexOf('Error') > -1) {
|
|
failed = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
$('#' + statusId).append(p);
|
|
}
|
|
|
|
/**
|
|
* Update the clone status bar
|
|
*
|
|
* @param data
|
|
* Data returned from HTTP request
|
|
* @return Nothing
|
|
*/
|
|
function updateCloneStatus(data) {
|
|
var rsp = data.rsp;
|
|
var args = data.msg.split(';');
|
|
var cmd = args[0].replace('cmd=', '');
|
|
|
|
// Get provision instance
|
|
var inst = args[1].replace('inst=', '');
|
|
var out2Id = args[2].replace('out=', '');
|
|
|
|
/**
|
|
* 2. Update /etc/hosts
|
|
*/
|
|
if (cmd == 'nodeadd') {
|
|
var node = args[3].replace('node=', '');
|
|
|
|
// If no output, no errors occurred
|
|
if (rsp.length) {
|
|
$('#' + out2Id).append(
|
|
'<p>(Error) Failed to create node definition</p>');
|
|
} else {
|
|
$('#' + out2Id).append(
|
|
'<p>Node definition created for ' + node + '</p>');
|
|
}
|
|
|
|
// Is this the last instance
|
|
var tmp = inst.split('/');
|
|
if (tmp[0] == tmp[1]) {
|
|
// Update /etc/hosts
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'makehosts',
|
|
tgt : '',
|
|
args : '',
|
|
msg : 'cmd=makehosts;inst=' + inst + ';out=' + out2Id
|
|
},
|
|
|
|
success : updateCloneStatus
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 3. Update DNS
|
|
*/
|
|
else if (cmd == 'makehosts') {
|
|
// If no output, no errors occurred
|
|
if (rsp.length) {
|
|
$('#' + out2Id)
|
|
.append('<p>(Error) Failed to update /etc/hosts</p>');
|
|
} else {
|
|
$('#' + out2Id).append('<p>/etc/hosts updated</p>');
|
|
}
|
|
|
|
// Update DNS
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'makedns',
|
|
tgt : '',
|
|
args : '',
|
|
msg : 'cmd=makedns;inst=' + inst + ';out=' + out2Id
|
|
},
|
|
|
|
success : updateCloneStatus
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 4. Clone
|
|
*/
|
|
else if (cmd == 'makedns') {
|
|
// Separate output into lines
|
|
var p = $('<p></p>');
|
|
for ( var i = 0; i < rsp.length; i++) {
|
|
if (rsp[i]) {
|
|
p.append(rsp[i]);
|
|
p.append('<br>');
|
|
}
|
|
}
|
|
|
|
$('#' + out2Id).append(p);
|
|
|
|
// 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]);
|
|
|
|
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;
|
|
}
|
|
|
|
// The tab must be opened for this to work
|
|
|
|
// 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 : updateCloneStatus
|
|
});
|
|
}
|
|
|
|
/**
|
|
* 5. Done
|
|
*/
|
|
else if (cmd == 'mkvm') {
|
|
var failed = false;
|
|
|
|
// Separate output into lines
|
|
var p = $('<p></p>');
|
|
for ( var i = 0; i < rsp.length; i++) {
|
|
if (rsp[i]) {
|
|
p.append(rsp[i]);
|
|
p.append('<br>');
|
|
|
|
// If the call failed
|
|
if (rsp[i].indexOf('Failed') > -1
|
|
|| rsp[i].indexOf('Error') > -1) {
|
|
failed = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
$('#' + out2Id).append(p);
|
|
|
|
// Hide loader
|
|
$('#' + out2Id).find('img').hide();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 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 getNodeAttrs(keys, propNames, data) {
|
|
// Create hash table for property values
|
|
var attrs = new Object();
|
|
|
|
// Go through inventory and separate each property out
|
|
var curKey; // 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;
|
|
}
|
|
|
|
/**
|
|
* Add processor
|
|
*
|
|
* @param v
|
|
* Value of the button clicked
|
|
* @param m
|
|
* jQuery object of the message within the active state when the user
|
|
* clicked the button
|
|
* @param f
|
|
* Key/value pairs of the form values
|
|
*
|
|
* @return Nothing
|
|
*/
|
|
function addProcessor(v, m, f) {
|
|
// If user clicks Ok, add processor
|
|
if (v) {
|
|
var node = f.procNode;
|
|
var type = f.procType;
|
|
var address = f.procAddress;
|
|
|
|
// 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 and save it in a cookie
|
|
incrementZNodeProcess(node);
|
|
|
|
// Show loader
|
|
var statusId = node + 'StatusBar';
|
|
var statusBarLoaderId = node + 'StatusBarLoader';
|
|
$('#' + statusBarLoaderId).show();
|
|
$('#' + statusId).show();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add disk
|
|
*
|
|
* @param v
|
|
* Value of the button clicked
|
|
* @param m
|
|
* jQuery object of the message within the active state when the user
|
|
* clicked the button
|
|
* @param f
|
|
* Key/value pairs of the form values
|
|
* @return Nothing
|
|
*/
|
|
function addDisk(v, m, f) {
|
|
// If user clicks Ok, add disk
|
|
if (v) {
|
|
var node = f.diskNode;
|
|
var type = f.diskType;
|
|
var address = f.diskAddress;
|
|
var size = f.diskSize;
|
|
var pool = f.diskPool;
|
|
var password = f.diskPassword;
|
|
|
|
// Add disk
|
|
if (type == '3390') {
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'chvm',
|
|
tgt : node,
|
|
args : '--add3390;' + pool + ';' + address + ';' + size
|
|
+ ';MR;' + password + ';' + password + ';' + password,
|
|
msg : node
|
|
},
|
|
|
|
success : updateZNodeStatus
|
|
});
|
|
|
|
// Increment node process and save it in a cookie
|
|
incrementZNodeProcess(node);
|
|
|
|
// Show loader
|
|
var statusId = node + 'StatusBar';
|
|
var statusBarLoaderId = node + 'StatusBarLoader';
|
|
$('#' + statusBarLoaderId).show();
|
|
$('#' + statusId).show();
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add NIC
|
|
*
|
|
* @param v
|
|
* Value of the button clicked
|
|
* @param m
|
|
* jQuery object of the message within the active state when the user
|
|
* clicked the button
|
|
* @param f
|
|
* Key/value pairs of the form values
|
|
* @return Nothing
|
|
*/
|
|
function addNic(v, m, f) {
|
|
// If user clicks Ok, add NIC
|
|
if (v) {
|
|
var node = f.nicNode;
|
|
var nicType = f.nicType;
|
|
var networkType = f.nicNetworkType;
|
|
var address = f.nicAddress;
|
|
|
|
/**
|
|
* Add guest LAN
|
|
*/
|
|
if (networkType == 'Guest LAN') {
|
|
var temp = f.nicLanName.split(' ');
|
|
var lanName = temp[1];
|
|
var lanOwner = temp[0];
|
|
|
|
// Add NIC
|
|
$.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') {
|
|
var temp = f.nicVSwitchName.split(' ');
|
|
var vswitchName = temp[1];
|
|
|
|
// Add NIC
|
|
$.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 and save it in a cookie
|
|
incrementZNodeProcess(node);
|
|
|
|
// Show loader
|
|
var statusId = node + 'StatusBar';
|
|
var statusBarLoaderId = node + 'StatusBarLoader';
|
|
$('#' + statusBarLoaderId).show();
|
|
$('#' + statusId).show();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Remove processor
|
|
*
|
|
* @param node
|
|
* Node where processor is attached
|
|
* @param address
|
|
* Virtual address of processor
|
|
* @return Nothing
|
|
*/
|
|
function removeProcessor(node, address) {
|
|
// Remove processor
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'chvm',
|
|
tgt : node,
|
|
args : '--removeprocessor;' + address,
|
|
msg : node
|
|
},
|
|
|
|
success : updateZNodeStatus
|
|
});
|
|
|
|
// Increment node process and save it in a cookie
|
|
incrementZNodeProcess(node);
|
|
|
|
// Show loader
|
|
var statusId = node + 'StatusBar';
|
|
var statusBarLoaderId = node + 'StatusBarLoader';
|
|
$('#' + statusBarLoaderId).show();
|
|
$('#' + statusId).show();
|
|
}
|
|
|
|
/**
|
|
* Remove disk
|
|
*
|
|
* @param node
|
|
* Node where disk is attached
|
|
* @param address
|
|
* Virtual address of disk
|
|
* @return Nothing
|
|
*/
|
|
function removeDisk(node, address) {
|
|
// Remove disk
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'chvm',
|
|
tgt : node,
|
|
args : '--removedisk;' + address,
|
|
msg : node
|
|
},
|
|
|
|
success : updateZNodeStatus
|
|
});
|
|
|
|
// Increment node process and save it in a cookie
|
|
incrementZNodeProcess(node);
|
|
|
|
// Show loader
|
|
var statusId = node + 'StatusBar';
|
|
var statusBarLoaderId = node + 'StatusBarLoader';
|
|
$('#' + statusBarLoaderId).show();
|
|
$('#' + statusId).show();
|
|
}
|
|
|
|
/**
|
|
* Remove NIC
|
|
*
|
|
* @param node
|
|
* Node where NIC is attached
|
|
* @param address
|
|
* Virtual address of NIC
|
|
* @return Nothing
|
|
*/
|
|
function removeNic(node, nic) {
|
|
var args = nic.split('.');
|
|
var address = args[0];
|
|
|
|
// Remove NIC
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'chvm',
|
|
tgt : node,
|
|
args : '--removenic;' + address,
|
|
msg : node
|
|
},
|
|
|
|
success : updateZNodeStatus
|
|
});
|
|
|
|
// Set cookie for number actions performed against node
|
|
incrementZNodeProcess(node);
|
|
|
|
// Show loader
|
|
var statusId = node + 'StatusBar';
|
|
var statusBarLoaderId = node + 'StatusBarLoader';
|
|
$('#' + statusBarLoaderId).show();
|
|
$('#' + statusId).show();
|
|
}
|
|
|
|
/**
|
|
* Set a cookie for the disk pool names of a given node
|
|
*
|
|
* @param data
|
|
* Data from HTTP request
|
|
* @return Nothing
|
|
*/
|
|
function setDiskPoolCookies(data) {
|
|
// Do not set cookie if there is no output
|
|
if (data.rsp) {
|
|
var node = data.msg;
|
|
var pools = data.rsp[0].split(node + ': ');
|
|
$.cookie(node + 'DiskPools', pools);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set a cookie for the network names of a given node
|
|
*
|
|
* @param data
|
|
* Data from HTTP request
|
|
* @return Nothing
|
|
*/
|
|
function setNetworkCookies(data) {
|
|
// Do not set cookie if there is no output
|
|
if (data.rsp) {
|
|
var node = data.msg;
|
|
var networks = data.rsp[0].split(node + ': ');
|
|
$.cookie(node + 'Networks', networks);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the resources for ZVM
|
|
*
|
|
* @param data
|
|
* Data from HTTP request
|
|
* @return Nothing
|
|
*/
|
|
function getZResources(data) {
|
|
// Do not set cookie if there is no output
|
|
if (data.rsp) {
|
|
// Loop through each line
|
|
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) {
|
|
hcps.push(key);
|
|
// Get the short host name
|
|
hcp = key.split('.')[0];
|
|
|
|
// Get disk pools
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'lsvm',
|
|
tgt : hcp,
|
|
args : '--diskpoolnames',
|
|
msg : hcp
|
|
},
|
|
|
|
success : getDiskPool
|
|
});
|
|
|
|
// Get network names
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'lsvm',
|
|
tgt : hcp,
|
|
args : '--getnetworknames',
|
|
msg : hcp
|
|
},
|
|
|
|
success : getNetwork
|
|
});
|
|
}
|
|
|
|
// Set cookie
|
|
$.cookie('HCP', hcps);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the contents of each disk pool
|
|
*
|
|
* @param data
|
|
* HTTP request data
|
|
* @return Nothing
|
|
*/
|
|
function getDiskPool(data) {
|
|
if (data.rsp) {
|
|
var hcp = data.msg;
|
|
var pools = data.rsp[0].split(hcp + ': ');
|
|
|
|
// Get the contents of each disk pool
|
|
for ( var i in pools) {
|
|
if (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
|
|
});
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get the details of each network
|
|
*
|
|
* @param data
|
|
* HTTP request data
|
|
* @return Nothing
|
|
*/
|
|
function getNetwork(data) {
|
|
if (data.rsp) {
|
|
var hcp = data.msg;
|
|
var networks = data.rsp[0].split(hcp + ': ');
|
|
|
|
// Get the network details
|
|
for ( var i = 1; i < networks.length; i++) {
|
|
var args = networks[i].split(' ');
|
|
var type = args[0];
|
|
var name = args[1];
|
|
|
|
// 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
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Load the disk pool contents into a table
|
|
*
|
|
* @param data
|
|
* HTTP request data
|
|
* @return Nothing
|
|
*/
|
|
function loadDiskPoolTable(data) {
|
|
var args = data.msg.split(';');
|
|
var hcp = args[0].replace('hcp=', '');
|
|
var pool = args[1].replace('pool=', '');
|
|
var stat = args[2].replace('stat=', '');
|
|
var tmp = data.rsp[0].split(hcp + ': ');
|
|
|
|
// Remove loader
|
|
var loaderID = 'zvmResourceLoader';
|
|
if ($('#' + loaderID).length) {
|
|
$('#' + loaderID).remove();
|
|
}
|
|
|
|
// Resource tab ID
|
|
var tabID = 'zvmResourceTab';
|
|
|
|
// Get datatable (if any)
|
|
var dTable = getDiskDataTable();
|
|
if (!dTable) {
|
|
// Create disks section
|
|
var fieldSet = $('<fieldset></fieldset>');
|
|
var legend = $('<legend>Disks</legend>');
|
|
fieldSet.append(legend);
|
|
|
|
// Create a datatable
|
|
var tableID = 'zDiskDataTable';
|
|
var table = new DataTable(tableID);
|
|
// Resource headers: volume ID, device type, start address, and size
|
|
table.init( [ 'Hardware control point', 'Pool', 'Status', 'Volume ID',
|
|
'Device type', 'Start address', 'Size' ]);
|
|
|
|
// Append datatable to tab
|
|
fieldSet.append(table.object());
|
|
$('#' + tabID).append(fieldSet);
|
|
|
|
// Turn into datatable
|
|
dTable = $('#' + tableID).dataTable();
|
|
setDiskDataTable(dTable);
|
|
}
|
|
|
|
// Skip index 0 and 1 because it contains nothing
|
|
for ( var i = 2; i < tmp.length; i++) {
|
|
var diskAttrs = tmp[i].split(' ');
|
|
dTable.fnAddData( [ hcp, pool, stat, diskAttrs[0], diskAttrs[1],
|
|
diskAttrs[2], diskAttrs[3] ]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Load the network details into a table
|
|
*
|
|
* @param data
|
|
* HTTP request data
|
|
* @return Nothing
|
|
*/
|
|
function loadNetworkTable(data) {
|
|
var args = data.msg.split(';');
|
|
var hcp = args[0].replace('hcp=', '');
|
|
var type = args[1].replace('type=', '');
|
|
var name = args[2].replace('network=', '');
|
|
var tmp = data.rsp[0].split(hcp + ': ');
|
|
|
|
// Remove loader
|
|
var loaderID = 'zvmResourceLoader';
|
|
if ($('#' + loaderID).length) {
|
|
$('#' + loaderID).remove();
|
|
}
|
|
|
|
// Resource tab ID
|
|
var tabID = 'zvmResourceTab';
|
|
|
|
// Get datatable (if any)
|
|
var dTable = getNetworkDataTable();
|
|
if (!dTable) {
|
|
// Create networks section
|
|
var fieldSet = $('<fieldset></fieldset>');
|
|
var legend = $('<legend>Networks</legend>');
|
|
fieldSet.append(legend);
|
|
|
|
// Create table
|
|
var tableID = 'zNetworkDataTable';
|
|
var table = new DataTable(tableID);
|
|
table.init( [ 'Hardware control point', 'Type', 'Name', 'Details' ]);
|
|
|
|
// Append datatable to tab
|
|
fieldSet.append(table.object());
|
|
$('#' + tabID).append(fieldSet);
|
|
|
|
// Turn into datatable
|
|
dTable = $('#' + tableID).dataTable();
|
|
setNetworkDataTable(dTable);
|
|
|
|
// Set the column width
|
|
var cols = table.object().find('thead tr th');
|
|
cols.eq(0).css('width', '20px'); // HCP column
|
|
cols.eq(1).css('width', '20px'); // Type column
|
|
cols.eq(2).css('width', '20px'); // Name column
|
|
cols.eq(3).css('width', '600px'); // Details column
|
|
}
|
|
|
|
// Skip index 0 because it contains nothing
|
|
var details = '';
|
|
for ( var i = 1; i < tmp.length; i++) {
|
|
details += tmp[i] + '<br>';
|
|
}
|
|
dTable.fnAddData( [ hcp, type, name, details ]);
|
|
}
|
|
|
|
/**
|
|
* Connect a NIC to a Guest LAN
|
|
*
|
|
* @param data
|
|
* Data from HTTP request
|
|
* @return Nothing
|
|
*/
|
|
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=', '');
|
|
|
|
var statusId = node + 'StatusBar';
|
|
var failed = false;
|
|
|
|
// Separate output into lines
|
|
var p = $('<p></p>');
|
|
for ( var i = 0; i < rsp.length; i++) {
|
|
if (rsp[i]) {
|
|
// Find the node name and insert a break before it
|
|
rsp[i] = rsp[i].replace(new RegExp(node + ': ', 'g'), '<br>');
|
|
|
|
p.append(rsp[i]);
|
|
p.append('<br>');
|
|
|
|
// If the call failed
|
|
if (rsp[i].indexOf('Failed') > -1 || rsp[i].indexOf('Error') > -1) {
|
|
failed = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
$('#' + statusId).append(p);
|
|
|
|
// 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
|
|
* @return Nothing
|
|
*/
|
|
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=', '');
|
|
|
|
var statusId = node + 'StatusBar';
|
|
var failed = false;
|
|
|
|
// Separate output into lines
|
|
var p = $('<p></p>');
|
|
for ( var i = 0; i < rsp.length; i++) {
|
|
if (rsp[i]) {
|
|
// Find the node name and insert a break before it
|
|
rsp[i] = rsp[i].replace(new RegExp(node + ': ', 'g'), '<br>');
|
|
|
|
p.append(rsp[i]);
|
|
p.append('<br>');
|
|
|
|
// If the call failed
|
|
if (rsp[i].indexOf('Failed') > -1 || rsp[i].indexOf('Error') > -1) {
|
|
failed = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
$('#' + statusId).append(p);
|
|
|
|
// Connect NIC to VSwitch
|
|
$.ajax( {
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'chvm',
|
|
tgt : node,
|
|
args : '--connectnic2vswitch;' + address + ';' + vswitchName,
|
|
msg : node
|
|
},
|
|
|
|
success : updateZNodeStatus
|
|
});
|
|
} |