/**
* Execute when the DOM is fully loaded
*/
$(document).ready(function() {
// Load utility scripts
});
/**
* Constructor
*
* @return Nothing
*/
var hmcPlugin = function() {
};
/**
* Steps for hardware discovery wizard
*
* @return Discovery steps
*/
hmcPlugin.prototype.getStep = function(){
return ['Basic patterns',
'Supernode',
'More patterns',
'Power on hardware',
'Discover frames',
'Management node',
'Update definitions',
'Create LPARs'];
};
hmcPlugin.prototype.getInitFunction = function(){
return [powerInitBasicPattern,
powerInitSupernode,
powerInitSiteTable,
powerInitPoweronHardware,
powerInitDiscoverFrames,
powerInitConfig,
powerInitUpdateDefinition,
powerInitCreateLpar];
};
hmcPlugin.prototype.getNextFunction = function(){
return [checkBasicPattern,
checkSupernode,
checkSiteTable,
undefined,
checkFrameMtms,
undefined,
undefined,
collectInputValue];
};
/**
* Clone node (service page)
*
* @param node
* Node to clone
* @return Nothing
*/
hmcPlugin.prototype.serviceClone = function(node) {
};
/**
* Load provision page (service page)
*
* @param tabId
* Tab ID where page will reside
* @return Nothing
*/
hmcPlugin.prototype.loadServiceProvisionPage = function(tabId) {
};
/**
* Show node inventory (service page)
*
* @param data
* Data from HTTP request
* @return Nothing
*/
hmcPlugin.prototype.loadServiceInventory = function(data) {
};
/**
* Load node inventory
*
* @param data
* Data from HTTP request
* @return Nothing
*/
hmcPlugin.prototype.loadInventory = function(data) {
// Get arguments
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;
// Remove loader
$('#' + tabId).find('img').remove();
// Create division to hold inventory
var invDivId = tabId + 'Inventory';
var invDiv = $('
');
// Loop through each line
var fieldSet, legend, oList, item;
for (var k = 0; k < inv.length; k++) {
// Remove node name in front
var str = inv[k].replace(node + ': ', '');
str = jQuery.trim(str);
// If string is a header
if (str.indexOf('I/O Bus Information') > -1 || str.indexOf('Machine Configuration Info') > -1) {
// Create a fieldset
fieldSet = $('');
legend = $('');
fieldSet.append(legend);
oList = $('');
fieldSet.append(oList);
invDiv.append(fieldSet);
} else {
// If no fieldset is defined
if (!fieldSet) {
// Define general fieldset
fieldSet = $('');
legend = $('');
fieldSet.append(legend);
oList = $('');
fieldSet.append(oList);
invDiv.append(fieldSet);
}
// Append the string to a list
item = $('');
item.append(str);
oList.append(item);
}
}
// Append to inventory form
$('#' + tabId).append(invDiv);
};
/**
* Load clone page
*
* @param node
* Source node to clone
* @return Nothing
*/
hmcPlugin.prototype.loadClonePage = function(node) {
// Get nodes tab
var tab = getNodesTab();
var newTabId = node + 'CloneTab';
// If there is no existing clone tab
if (!$('#' + newTabId).length) {
// Create status bar and hide it
var statBarId = node + 'CloneStatusBar';
var statBar = $('').hide();
// Create info bar
var infoBar = createInfoBar('Not yet supported');
// Create clone form
var cloneForm = $('');
cloneForm.append(statBar);
cloneForm.append(infoBar);
// Add clone tab
tab.add(newTabId, 'Clone', cloneForm, true);
}
tab.select(newTabId);
};
/**
* Load provision page
*
* @param tabId
* The provision tab ID
* @return Nothing
*/
hmcPlugin.prototype.loadProvisionPage = function(tabId) {
// Create provision form
var provForm = $('');
// Create info bar
var infoBar = createInfoBar('Provision a node on System p');
provForm.append(infoBar);
// Append to provision tab
$('#' + tabId).append(provForm);
// Append provisioning section for HMC
appendProvisionSection('hmc', provForm);
};
/**
* Load resources
*
* @return Nothing
*/
hmcPlugin.prototype.loadResources = function() {
// Get resource tab ID
var tabId = 'hmcResourceTab';
// Remove loader
$('#' + tabId).find('img').remove();
// Create info bar
var infoBar = createInfoBar('Not yet supported');
// Create resource form
var resrcForm = $('');
resrcForm.append(infoBar);
$('#' + tabId).append(resrcForm);
};
/**
* Add node range
*/
hmcPlugin.prototype.addNode = function() {
var dialog = $('');
dialog.append(createInfoBar('Add a System p node range'));
// Create option to select node type
dialog.append('
' +
'
');
dialog.append('');
// Show dialog
dialog.dialog({
modal : true,
width : 400,
title : 'Add node',
close : function(){$('#addHmc').remove();}
});
// Bind to select change event
$('#nodeType').bind('change', function() {
// Remove existing warnings
$('#addHmc .ui-state-error').remove();
// Clear settings section
$('#nodeSettings').empty();
if ($(this).val() == 'HMC') {
$('#addHmc').dialog('option', 'width', '400');
$('#nodeSettings').append('');
$('#nodeSettings').append('');
$('#nodeSettings').append('');
$('#nodeSettings').append('');
// Change dialog buttons
$('#addHmc').dialog('option', 'buttons', {
'Add': function() {addHmcNode();},
'Cancel': function() {$('#addHmc').dialog('close');}
});
} else {
// Add loader
$('#nodeSettings').append(createLoader());
// Change dialog buttons
$('#addHmc').dialog('option', 'buttons', {
'Cancel': function() {$('#addHmc').dialog('close');}
});
// Set to longer dialog width
$('#addHmc').dialog('option', 'width', '650');
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'nodels',
tgt : 'all',
args : 'nodetype.nodetype==hmc',
msg : ''
},
success : function(data) {
// Remove loader
$('#nodeSettings img').remove();
drawHmcSelector(data.rsp);
}
});
}
});
// Trigger select event change
$('#nodeType').trigger('change');
};
/**
* Add HMC node
*/
function addHmcNode(){
// Remove existing warnings
$('#addHmc .ui-state-error').remove();
var errorMessage = '';
var args = '';
$('#nodeSettings input').each(function(){
if (!$(this).val())
errorMessage = 'Please provide a value for each missing field!';
args += $(this).val() + ',';
});
// Do no continue if an error is found
if (errorMessage){
$('#addHmc').prepend(createWarnBar(errorMessage));
return;
}
// Disabled button
$('.ui-dialog-buttonpane button').attr('disabled', 'disabled');
// Remove last comma
args = args.substr(0, args.length - 1);
// Append loader
$('#nodeSettings').append(createLoader());
// Send request to add HMC
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'webrun',
tgt : '',
args : 'addnode;hmc;' + args,
msg : ''
},
success : function(data){
$('#addHmc').dialog('close');
}
});
}
/**
* Add HMCs into dialog
*
* @param hmcs
* HMCs
* @return Nothing
*/
function drawHmcSelector(hmcs){
// Remove existing warnings
$('#addHmc .ui-state-error').remove();
// Do not continue if no HMCs are given
if (hmcs.length < 1) {
$('#addHmc').prepend(createWarnBar('Please define an HMC node first!'));
return;
}
// Add HMCs into a dropdown and add scan button
var hmcSelect = $('');
var scanButton = createButton('Scan');
for (var i in hmcs) {
hmcSelect.append('');
}
$('#nodeSettings').append($('').append(hmcSelect, scanButton));
scanButton.bind('click', function() {
var hmcname = $('#nodeSettings select').val();
$('#nodeSettings').append(createLoader());
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'rscan',
tgt : hmcname,
args : '',
msg : ''
},
success : function(data) {
// Remove loader
$('#nodeSettings img').remove();
// Draw table with checkboxes
drawRscanResult(data.rsp[0]);
// Add the add button
$('#addHmc').dialog('option', 'buttons', {
'Add': function(){addPNode();},
'Cancel': function(){$('#addHmc').dialog('close');}
});
}
});
});
}
/**
* Draw table showing HMC rscan results
*
* @param results
* Data returned from rscan
* @return Nothing
*/
function drawRscanResult(results) {
var tmpRegex = /\S+/g;
var idRegex = /^\d+$/;
var rSection = $('');
var rTable = $('
');
// Empty node settings section
$('#nodeSettings div').remove();
if (!results)
return;
var lines = results.split("\n");
// Do not continue if no results are found
if (lines.length < 2) {
return;
}
var fields = lines[0].match(tmpRegex);
var cols = fields.length;
// Add table header
var tHead = $('').append('
');
for(var i in fields) {
tHead.append('
' + fields[i] + '
');
}
rTable.append(tHead);
// Add table body
var tBody = $('');
rTable.append(tBody);
for (var i = 1; i < lines.length; i++) {
var row = $('
');
// Go to next row if there is nothing
if (!lines[i])
continue;
fields = lines[i].match(tmpRegex);
// Go to next row if this row is the HMC
if (fields[0] == 'hmc')
continue;
// If the 3rd field is empty, create an empty column
if (!idRegex.test(fields[2]))
fields = [fields[0], fields[1], ''].concat(fields.slice(2));
row.append('
');
// Go through each field and add it to the row as a column
for(var j = 0; j < cols; j++) {
var col = $('
');
if (fields[j]) {
if (j == 1)
col.append('');
else
col.append(fields[j]);
}
}
tBody.append(row);
}
rSection.append(rTable);
$('#nodeSettings').append(rSection);
}
/**
* Add System p node, contains frame, cec, lpar
*
* @return Nothing
*/
function addPNode(){
// Get the HMC name
var hmcname = $('#nodeSettings select').val();
var nodename = '';
// Get checked nodes
$('#nodeSettings :checked').each(function() {
if ($(this).attr('name')) {
nodename += $(this).attr('name') + ',';
nodename += $(this).parents('tr').find('input').eq(1).val() + ',';
}
});
if (!nodename) {
alert('You should select nodes first!');
return;
}
// Disabled the button
$('.ui-dialog-buttonpane button').attr('disabled', 'disabled');
nodename = nodename.substr(0, nodename.length - 1);
$('#nodeSettings').append(createLoader());
// Send the add request
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'webrun',
tgt : '',
args : 'addnode;node;' + hmcname + ',' + nodename,
msg : ''
},
success : function(data) {
// Refresh the area on the right side
$('#addHmc').dialog('close');
$('.selectgroup').trigger('click');
}
});
}
/**
* Select all checkbox in a table
*
* @return Nothing
*/
function selectAllRscanNode(obj){
var status = $(obj).attr('checked');
$(obj).parents('table').find(':checkbox').attr('checked', status);
}
/**
* Step 2: Cluster basic patterns
* users can input the switches' name range, the number of port, start ip and port prefix
* hmcs' name range, number and start ip
* frames' name range, number and start ip
* drawers' name range, number and start ip
*
* @param
*
* @return
*/
function powerInitBasicPattern(){
$('#discoverContentDiv').empty();
$('.tooltip').remove();
var showString = '
' + steps[currentStep] + '
';
showString += '
';
//Frame title
showString += '
Frames:
';
//Frame Name
showString += '
Name Range:
';
//use the super node configure file to calculate the cec's number
showString += '
';
//CEC title
showString += '
Drawers:
';
//CEC name
showString += '
Name Range:
';
//Number of LPARs per Drawer:
showString += '
Number of LPARs per Drawer:
';
//Lpar title
showString += '
Lpars:
';
//lpar name
showString += '
Name Range:
';
//hmc title
showString += '
HMCs:
';
//hmc name
showString += '
Name Range:
';
//Number of Frames per HMC
showString += '
Number of Frames per HMC:
';
showString += '
Hardware Managment:
HMC ';
showString += 'DFM
';
showString += '
';
$('#discoverContentDiv').append(showString);
$('#discoverContentDiv [title]').tooltip({
position: "center right",
offset: [-2, 10],
effect: "fade",
opacity: 1
});
//change the radio inputs' checked status
if (getDiscoverEnv('hmcFlag')){
$('#discoverContentDiv :radio[value=hmc]').attr('checked', 'checked');
}
else{
$('#discoverContentDiv :radio[value=dfm]').attr('checked', 'checked');
}
createDiscoverButtons();
}
/**
* Step 2: check basic patterns
* when user input the basic patterns, we should check if the input is correct.
* @param
*
* @return
*/
function checkBasicPattern(operType){
collectInputValue();
//click back button, do not need check, only collect input value is ok.
if ('back' == operType){
return true;
}
$('#patternDiv .ui-state-error').remove();
var errMessage = '';
var tempName = '';
var frameNum = 0;
var cecNum = 0;
var lparNum = 0;
var hmcNum = 0;
var cecNumPerFrame = getDiscoverEnv('cecNumPerFrame');
var frameNumPerHmc = getDiscoverEnv('frameNumPerHmc');
var lparNumPerCec = getDiscoverEnv('lparNumPerCec');
//check the frame name
tempName = getDiscoverEnv('frameName');
if (!tempName){
errMessage += 'Input the Frame Name Range. ';
}
else{
frameNum = expandNR(tempName).length;
}
//check the cec name
tempName = getDiscoverEnv('cecName');
if (!tempName){
errMessage += 'Input the CEC Name Range. ';
}
else{
cecNum = expandNR(tempName).length;
}
//lpar number per cec
if (!lparNumPerCec){
errMessage += 'Input the Lpar Number Per Drawer. ';
}
//check the lpar name
tempName = getDiscoverEnv('lparName');
if (!tempName){
errMessage += 'Input the Lpar Name Range. ';
}
else{
lparNum = expandNR(tempName).length;
}
//check the hmc name
tempName = getDiscoverEnv('hmcName');
if (!tempName){
errMessage += 'Input the HMC Name Range. ';
}
else{
hmcNum = expandNR(tempName).length;
}
//frame number per hmc
if (!frameNumPerHmc){
errMessage += 'Input the Frame Number Per HMC. ';
}
//the hardware management type is hmc.
if ('hmc' == $('#discoverContentDiv :checked').attr('value')){
setDiscoverEnv('hmcFlag', true);
}
else{
removeDiscoverEnv('hmcFlag');
}
//the input value check is finished.
if ('' != errMessage){
var warnBar = createWarnBar(errMessage);
$('#patternDiv').prepend(warnBar);
return false;
}
//check the connections between all numbers.
if (getDiscoverEnv('hmcFlag')){
if ((Number(frameNumPerHmc) * hmcNum) < frameNum){
errMessage += 'The frame number should less than ' + Number(cecNumPerFrame) * frameNum +
' ("the number of hmc" * "the number of frame managed by per hmc")';
}
}
if ((Number(lparNumPerCec) * cecNum) != lparNum){
errMessage += 'The number of Lpars calculate by Name Range should be ' + Number(lparNumPerCec) * cecNum +
'("the number of Drawers" * "the number of lpar per drawer")';
}
if ('' != errMessage){
var warnBar = createWarnBar(errMessage);
$('#patternDiv').prepend(warnBar);
return false;
}
setDiscoverEnv('cecNum', cecNum);
setDiscoverEnv('frameNum', frameNum);
setDiscoverEnv('lparNum', lparNum);
setDiscoverEnv('hmcNum', hmcNum);
return true;
}
/**
* Step 3: allowed the users to edit the super node condigure file
*
* @param
*
* @return
*/
function powerInitSupernode(){
$('#discoverContentDiv').empty();
$('.tooltip').remove();
$('#discoverContentDiv').append('
' + steps[currentStep] + '
');
createDiscoverButtons();
//add the introduction about the page
var infoStr = '
The supernode-list file lists what supernode numbers should be ';
infoStr += 'given to each CEC in each frame. Here is a sample file: ';
infoStr += 'frame1: 0, 1, 16 frame2: 17, 32 frame3: 33, 48, 49 ';
infoStr += 'frame4: 64 , 65, 80 frame5: 81, 96 frame6: 97(1), 112(1), 113(1), 37(1), 55, 71 ';
infoStr += 'The name before the colon is the node name of the frame BPC. The numbers after the colon ' +
'are the supernode numbers to assign to the groups of CECs in that frame from bottom to top. ' +
'Each supernode contains 4 CECs, unless it is immediately followed by "(#)", in which case the ' +
'number in parenthesis indicates how many CECs are in this supernode.
';
var InfoBar = createInfoBar(infoStr);
$('#discoverContentDiv #supernodeDiv').append(InfoBar);
var frameArray = expandNR(getDiscoverEnv('frameName'));
var showStr = '
';
for (var i in frameArray){
showStr += '
' + frameArray[i] + ':
';
}
showStr += '
';
$('#discoverContentDiv #supernodeDiv').append(showStr);
}
/**
* Step 3: check the super node configure file
*
* @param
*
* @return
*/
function checkSupernode(operType){
collectInputValue();
if ('back' == operType){
return true;
}
$('#supernodeDiv .ui-state-error').remove();
var errString = '';
var eceNum = 0;
var args = '';
var frameArray = expandNR(getDiscoverEnv('frameName'));
for (var i in frameArray){
var sp_config = getDiscoverEnv('sp_' + frameArray[i]);
if (sp_config){
eceNum += calcCec(sp_config);
if (0 == i){
args += frameArray[i] + ': ' + sp_config;
}
else{
args += '\n' + frameArray[i] + ': ' + sp_config;
}
}
else{
errString += 'Input the super node configure for ' + frameArray[i] + ' ';
}
}
args += '\n';
var warnBar;
if (errString){
warnBar = createWarnBar(errString);
$('#supernodeDiv').prepend(warnBar);
return false;
}
var cecArray = expandNR(getDiscoverEnv('cecName'));
if (eceNum != cecArray.length){
errString += 'The number of CEC calculated from supernode configure is ' + eceNum + ', but the number ' +
'calculated from CECs\' Name Range is ' + cecArray.length + '. Reconfigure the supernode please.';
warnBar = createWarnBar(errString);
$('#supernodeDiv').prepend(warnBar);
return false;
}
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'webrun',
tgt : '',
args : 'writeconfigfile;/tmp/websupernode.txt;' + args,
msg : ''
}
});
return true;
}
function calcCec(spConfigStr){
var tempArray = spConfigStr.split(',');
var num = 0;
var reg = /\(([1-4])\)/;
for (var i in tempArray){
var regRes = reg.exec(tempArray[i]);
if (regRes && regRes[1]){
num += Number(regRes[1]);
}
else{
num += 4;
}
}
return num;
}
/**
* Step 4: show the field which need to be configured in site table
*
* @param
*
* @return
*/
function powerInitSiteTable(operType){
$('#discoverContentDiv').empty();
$('.tooltip').remove();
var showDiv = $('
' + steps[currentStep] + '(Site info)
');
var statBar = createStatusBar('siteTableStat');
statBar.find('div').append(createLoader());
showDiv.append(statBar);
$('#discoverContentDiv').append(showDiv);
if (getDiscoverEnv('domainname')){
showSiteArea();
return;
}
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'tabdump',
tgt : '',
args : 'site',
msg : ''
},
success : function(data){
setDiscoverEnv('domainname', '');
setDiscoverEnv('nameserver','');
for (var i in data.rsp){
var tempArray = data.rsp[i].split(',');
var tempValue = tempArray[1];
switch (tempArray[0]){
case '"domain"':{
setDiscoverEnv('domainname', tempValue.substr(1, tempValue.length - 2));
}
break;
case '"nameservers"':{
setDiscoverEnv('nameserver', tempValue.substr(1, tempValue.length - 2));
}
break;
}
}
showSiteArea();
}
});
}
/**
* Step 4: when the values are ready, create the table
*
* @param
*
* @return
*/
function showSiteArea(){
var showString = '
');
}
});
createDiscoverButtons();
}
/**
* Step 4: check the input are all filled
*
* @param
*
* @return
*/
function checkSiteTable(operType){
$('#discoverContentDiv input[name=ipStart]').trigger('change');
collectInputValue();
if ('back' == operType){
return true;
}
$('#discoverContentDiv .ui-state-error').remove();
var errMessage = '';
if (!getDiscoverEnv('domainname')){
errMessage += 'Input the domain name. ';
}
if (!getDiscoverEnv('nameserver')){
errMessage += 'Input the name server. ';
}
if (!getDiscoverEnv('ipEnd')){
errMessage += 'Input the DHCP Dynamic Range. ';
}
if ('' == errMessage){
//update the dynamic ip to xcat db by xcatsetup and run makedhcp
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'webrun',
tgt : '',
args : 'dynamiciprange;' + getDiscoverEnv('ipStart') + '-' + getDiscoverEnv('ipEnd'),
msg : ''
}
});
return true;
}
var warnBar = createWarnBar(errMessage);
$('#discoverContentDiv #siteDiv').prepend(warnBar);
return false;
}
/**
* Step 5: told users to power on machines
*
* @param
*
* @return
*/
function powerInitPoweronHardware(){
$('#discoverContentDiv').empty();
$('.tooltip').remove();
var showStr = '
' + steps[currentStep] +
'
Do the following manual steps now:
';
showStr += '
1. Power on the HMCs.
';
showStr += '
2. Configure the HMC\'s static IP and enable the SLP & SSH ports by HMC GUI
';
showStr += '
3. Power on all of Frames.
';
showStr += '
4. Click Next to discover the hardware on the service network.
';
$('#discoverContentDiv').append(showStr);
createDiscoverButtons();
}
/**
* Step 6: discover all frames from the cluster and map all mtms with frame name
*
* @param
*
* @return
*/
function powerInitDiscoverFrames(){
$('#discoverContentDiv').empty();
$('.tooltip').remove();
var showDiv = $('
' + steps[currentStep] + '
');
var statBar = createStatusBar('framedisc');
showDiv.append(statBar);
$('#discoverContentDiv').append(showDiv);
$('#discoverShow').append('
'
+ '
');
if (getDiscoverEnv('framemtmsmap')){
$('#framedisc div').html('Mapping the frame name and mtms which discovered by lsslp. ' +
'Select the frame name, then select the mtms.');
var mapArray = getDiscoverEnv('framemtmsmap').split(';');
for(var i in mapArray){
var tempArray = mapArray[i].split(',');
showMap(tempArray[0], tempArray[1]);
}
createDiscoverButtons();
return;
}
statBar.find('div').append('Discovering all Frames by lsslp.').append(createLoader());
//use lsslp to find all bpas in cluster
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'webrun',
tgt : '',
args : 'discover;frame',
msg : ''
},
success : function(data){
var tempInfo = data.rsp[0];
if (-1 != tempInfo.indexOf('Error')){
$('#framedisc div').html(tempInfo);
createDiscoverButtons();
return;
}
var mtmsArray = tempInfo.split(';');
var frameArray = expandNR(getDiscoverEnv('frameName'));
//chech the defined number and discovered number
if (mtmsArray.length != frameArray.length){
$('#framedisc div').html('Error: Definded Number is ' + frameArray.length +
', but lsslp discovered Number is ' + mtmsArray.length + ', please check your configure!');
createDiscoverButtons();
return;
}
$('#framedisc div').html('Mapping the frame name and mtms which discovered by lsslp. ' +
'Select the frame name, then select the mtms.');
for (var i in frameArray){
$('#frameTd').append('
' +
frameArray[i] + '
');
}
for (var i in mtmsArray){
$('#mtmsTd').append('
');
}
function deleteMap(obj){
var mname = $(obj).parent().prev().html();
var fname = $(obj).parent().prev().prev().prev().html();
$(obj).parent().parent().remove();
$('#frameTd').append('
' + fname + '
');
$('#mtmsTd').append('
' + mname + '
');
}
/**
* Step 6: write the frame and mtms map file
*
* @param
*
* @return
*/
function checkFrameMtms(operType){
//check the number of radio button
var vpdFileCon = '';
$('#discoverShow .ui-state-error').remove();
if (0 < $('#discoverShow :radio').size()){
var warnBar = createWarnBar('Map all of the frame with mtms.');
$('#discoverContentDiv #discoverShow').prepend(warnBar);
return false;
}
//find out all maps
var maps = '';
$('#discoverShow fieldset tr').each(function(){
var fname = $(this).children().eq(0).html();
var mtms = $(this).children().eq(2).html();
var pos = mtms.lastIndexOf('-');
var startpos = mtms.indexOf(':');
maps += (fname + ',' + mtms + ';');
vpdFileCon += fname + ':\n';
vpdFileCon += ' objtype=node\n serial=' + mtms.substring(pos + 1) + '\n';
vpdFileCon += ' mtm=' + mtms.substring(startpos + 1, pos) + '\n side=A\n';
});
maps = maps.substr(0, maps.length - 1);
setDiscoverEnv('framemtmsmap', maps);
if ('back' == operType){
return true;
}
//write the maps into vpd table
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'webrun',
tgt : '',
args : 'writeconfigfile;/tmp/webvpd.stanza;' + vpdFileCon,
msg : ''
}
});
return true;
}
/**
* Step 7: create the xcatsetup configure file and run xcatsetup to define all objects
* in xcat database.
*
* @param
*
* @return
*/
function powerInitConfig(operType){
$('#discoverContentDiv').empty();
$('.tooltip').remove();
var showStr = '
';
$('#discoverContentDiv').append(showStr);
if ('back' == operType){
createDiscoverButtons();
return;
}
lsslpWriteFrame();
}
/**
* Step 8: write all the lsslp -s FRAME info into database
*
* @param
*
* @return
*/
function lsslpWriteFrame(){
$('#frameLine').append(createLoader());
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'lsslp',
tgt : '',
args : '-s;FRAME;-w',
msg : ''
},
success : function(){
$('#frameLine img').remove();
var tempSpan = $('#frameLine').find('span');
tempSpan.removeClass('ui-icon-gear');
tempSpan.addClass('ui-icon-check');
lsslpWriteHMC();
}
});
}
/**
* Step 8: write all the lsslp -s HMC info into database
*
* @param
*
* @return
*/
function lsslpWriteHMC(){
$('#hmcLine1').append(createLoader());
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'webrun',
tgt : '',
args : 'discover;hmc',
msg : ''
},
success : function(data){
//modify the page elements
$('#hmcLine1 img').remove();
var tempSpan = $('#hmcLine1').find('span');
tempSpan.removeClass('ui-icon-gear');
tempSpan.addClass('ui-icon-check');
$('#hmcLine2').append(createLoader());
var hmcArray = expandNR(getDiscoverEnv('hmcName'));
var mtmsArray = data.rsp[0].split(';');
var tempPar = '';
if (hmcArray.length != mtmsArray.length){
//error info
$('#hmcLine2 img').remove();
var warnBar = createWarnBar('Error: Defined ' + hmcArray.length + ' HMCs, but discovered ' + mtmsArray.length +
' HMCs. Please check the configuration.');
$('#discoverContentDiv div').prepend(warnBar);
createDiscoverButtons();
return;
}
//create the hmc and mtms pair string
for (var i in hmcArray){
var tPos = mtmsArray[i].lastIndexOf('-');
var startPos= mtmsArray[i].indexOf(':');
if ('' == tempPar){
tempPar += hmcArray[i] + ',' + mtmsArray[i].substring(startPos + 1, tPos) + ',' +mtmsArray[i].substring(tPos + 1);
}
else{
tempPar += ':' + hmcArray[i] + ',' + mtmsArray[i].substring(startPos + 1, tPos) + ',' +mtmsArray[i].substring(tPos + 1);
}
}
//write the mtms and hmcname pair into vpd table
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'webrun',
tgt : '',
args : 'updatevpd;' + tempPar,
msg : ''
},
success: function(){
//run lsslp and write all infomation into datatable
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'lsslp',
tgt : '',
args : '-s;HMC;-w',
msg : ''
},
success: function(){
$('#hmcLine2 img').remove();
var tempSpan = $('#hmcLine2').find('span');
tempSpan.removeClass('ui-icon-gear');
tempSpan.addClass('ui-icon-check');
mkhwconnFrame();
}
});
}
});
}
});
}
/**
* Step 8: make the hardware connection for frames.
*
* @param
*
* @return
*/
function mkhwconnFrame(){
$('#frameLine2').append(createLoader());
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'mkhwconn',
tgt : 'frame',
args : '-t',
msg : ''
},
success: function(){
$('#frameLine2 img').remove();
var tempSpan = $('#frameLine2').find('span');
tempSpan.removeClass('ui-icon-gear');
tempSpan.addClass('ui-icon-check');
lsslpWriteCec();
}
});
}
/**
* Step 8: write all the lsslp -s cec info into database
*
* @param
*
* @return
*/
function lsslpWriteCec(){
$('#cecLine').append(createLoader());
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'lsslp',
tgt : '',
args : '-s;CEC;-w',
msg : ''
},
success: function(){
$('#cecLine img').remove();
var tempSpan = $('#cecLine').find('span');
tempSpan.removeClass('ui-icon-gear');
tempSpan.addClass('ui-icon-check');
mkhwconnCec();
}
});
}
/**
* Step 8: make hardware connection for cecs
*
* @param
*
* @return
*/
function mkhwconnCec(){
$('#cecLine2').append(createLoader());
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'mkhwconn',
tgt : 'cec',
args : '-t',
msg : ''
},
success: function(){
$('#cecLine2 img').remove();
var tempSpan = $('#cecLine2').find('span');
tempSpan.removeClass('ui-icon-gear');
tempSpan.addClass('ui-icon-check');
configDHCP();
}
});
}
/**
* Step 8: create the dhcp configure file
*
* @param
*
* @return
*/
function configDHCP(){
$('#dhcpLine').append(createLoader());
$.ajax({
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'makedhcp',
tgt : '',
args : '-n',
msg : ''
},
success : function(){
$('#dhcpLine img').remove();
var tempSpan = $('#dhcpLine').find('span');
tempSpan.removeClass('ui-icon-gear');
tempSpan.addClass('ui-icon-check');
createDiscoverButtons();
}
});
}
/**
* Step 9: create lpars
*
* @param
*
* @return
*/
function powerInitCreateLpar(){
$('#discoverContentDiv').empty();
$('.tooltip').remove();
var showDiv = $('
' + steps[currentStep] + '
');
switch (getDiscoverEnv('machineType')){
case 'ih':{
ihCreateLpar(showDiv);
}
break;
case 'nonih':{
nonihCreateLpar(showDiv);
}
break;
default:
break;
}
$('#discoverContentDiv').append(showDiv);
createDiscoverButtons();
}
function ihCreateLpar(parentDiv){
var showStr = 'Partition Rule: ' +
'If all the octants configuration value are same in one CEC, it will be " -r 0-7:value". ' +
'If the octants use the different configuration value in one cec, it will be "-r 0:value1,1:value2,...7:value7", or "-r 0:value1,1-7:value2". ' +
'The octants configuration value for one Octant could be 1, 2, 3, 4, 5 . The meanings of the octants configuration value are as following: ' +
'1 - 1 partition with all cpus and memory of the octant ' +
'2 - 2 partitions with a 50/50 split of cpus and memory ' +
'3 - 3 partitions with a 25/25/50 split of cpus and memory ' +
'4 - 4 partitions with a 25/25/25/25 split of cpus and memory ' +
'5 - 2 partitions with a 25/75 split of cpus and memory ' +
'Define the configuration rule for one CEC, and create all Lpars on all CECs by this rule. Or ignore this step.';
parentDiv.append(createInfoBar(showStr));
parentDiv.append('
Partition Configuration:
' +
'
');
var lparButton = createButton('Create Lpars');
parentDiv.find('td').eq(2).append(lparButton);
lparButton.bind('click', function(){
var reg = /(([0-7]|[0-7]-[0-7]):[1-5],)*(([0-7]|[0-7]-[0-7]):[1-5])$/g;
var lparCount = 0;
$('#discoverContentDiv .ui-state-error').remove();
collectInputValue();
var inputStr = getDiscoverEnv('partconf');
var testArray = reg.exec(inputStr);
if (!testArray || inputStr != testArray[0]){
var warnBar = createWarnBar('Input the correct configuration rule.');
$('#discoverContentDiv').prepend(warnBar);
return;
}
var ruleArray = inputStr.split(',');
for (var i in ruleArray){
var octantCount = 0;
var octantArray = ruleArray[i].split(':');
var octantRule = Number(octantArray[1]);
var pos = octantArray[0].indexOf('-');
if (5 == octantRule){
octantRule = 2;
}
if (-1 == pos){
octantCount = 1;
}
else{
var startIndex = Number(octantArray[0].substring(0, pos));
var endIndex = Number(octantArray[0].substring(pos + 1));
octantCount = endIndex - startIndex + 1;
}
lparCount += octantCount * octantRule;
}
if (getDiscoverEnv('lparNumPerCec') != lparCount){
var warnBar = createWarnBar('The LPAR number per CEC is ' + getDiscoverEnv('lparNumPerCec') + ', but the configuration ' +
'rule calculation is ' + lparCount + '.');
$('#discoverContentDiv').prepend(warnBar);
return;
}
var diaDiv = $('');
diaDiv.append('
');
diaDiv.append(createLoader());
diaDiv.dialog({
modal: true,
width: 600,
title: 'Creating Lpars...'
});
$('.ui-dialog-titlebar-close').hide();
var cecArray = expandNR(getDiscoverEnv('cecName'));
for (var i in cecArray){
$.ajax( {
url : 'lib/cmd.php',
dataType : 'json',
data : {
cmd : 'mkvm',
tgt : cecArray[i] + 'nodes',
args : '-i;1;-m;non-interleaved;-r;' + inputStr,
msg : cecArray[i] + ';' + cecArray.length
},
success : function(data) {
//update the dialogure
var tempArray = data.msg.split(';');
updateCreateLparDia(tempArray[0], Number(tempArray[1]));
}
});
}
});
}
function updateCreateLparDia(cecname, cecNum){
$('#createLparDiv ul').append('
Creating lpars on ' + cecname + ' competed.
');
if (cecNum != $('#createLparDiv li').size()){
return;
}
$('#createLparDiv').empty();
$('#createLparDiv').append('
All lpars are created. You must: 1. reboot the all CECS. '+
'2.use chvm to assign the I/O slots to the new LPAR.
');
var chvmButton = createButton('OK');
$('#createLparDiv').append(chvmButton);
chvmButton.bind('click', function(){
$('#createLparDiv').dialog('destroy');
$('#createLparDiv').remove();
});
}
function nonihCreateLpar(parentDiv){
var showStr = 'The machine type is not P7 IH, so you had to create lpars by command line manually.';
parentDiv.append(createInfoBar(showStr));
return;
}