177a2971fb
git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@10491 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd
1499 lines
42 KiB
JavaScript
1499 lines
42 KiB
JavaScript
/*associate the step name with step number*/
|
|
var steps = ['Platform',
|
|
'Patterns',
|
|
'Supernode',
|
|
'More patterns',
|
|
'Power on hardware',
|
|
'Discover frames',
|
|
'Management node',
|
|
'Update',
|
|
'LPARs',
|
|
'Complete'];
|
|
|
|
/*associate the function with step number*/
|
|
var initFunctions = [initSelectPlatform,
|
|
initBasicPattern,
|
|
initSupernode,
|
|
initSiteTable,
|
|
initPoweronHardware,
|
|
initDiscoverFrames,
|
|
initConfig,
|
|
initUpdateDefinition,
|
|
initCreateLpar,
|
|
complete];
|
|
|
|
/*associate the function witch should be called before the page changed(when click next or back)
|
|
*if there is no need to call functions, use undefined.*/
|
|
var nextFunctions = [getPlatform,
|
|
checkBasicPattern,
|
|
checkSupernode,
|
|
checkSiteTable,
|
|
undefined,
|
|
checkFrameMtms,
|
|
undefined,
|
|
undefined,
|
|
collectInputValue,
|
|
undefined];
|
|
/*save current step number*/
|
|
var currentStep = 0;
|
|
|
|
/*save user's input*/
|
|
var discoverEnv;
|
|
|
|
/**
|
|
* create the discover page
|
|
*
|
|
* @return nothing
|
|
*/
|
|
function loadDiscoverPage(){
|
|
currentStep = 0;
|
|
discoverEnv = new Object();
|
|
$('#discoverTab').append('<div class="discoverstep" id="discoverStepDiv"></div>');
|
|
updateDiscoverStep();
|
|
|
|
$('#discoverTab').append('<div class="discovercontent" id="discoverContentDiv"><div>');
|
|
initSelectPlatform();
|
|
}
|
|
|
|
/**
|
|
* update the step show are on the left side of discover page
|
|
*
|
|
* @return nothing
|
|
*/
|
|
function updateDiscoverStep(){
|
|
$('#discoverStepDiv').empty();
|
|
|
|
for (var index in steps){
|
|
if (currentStep == index){
|
|
$('#discoverStepDiv').append($('<span class="discovercurrentstep" style="display: inline-block; float: none; padding: 0px 5px;">' + steps[index] + '</span>'));
|
|
} else {
|
|
$('#discoverStepDiv').append($('<span style="display: inline-block; float: none; padding: 0px 5px;">' + steps[index] + '</span>'));
|
|
}
|
|
$('#discoverStepDiv').append($('<span style="display: inline-block; float: none; vertical-align: middle;" class="ui-icon ui-icon-arrowthick-1-e"/>'));
|
|
}
|
|
|
|
//remove last arrow
|
|
$('#discoverStepDiv span:last-child').remove();
|
|
}
|
|
|
|
/**
|
|
* create the navigator buttons on the bottom of discover page
|
|
*
|
|
* @return nothing
|
|
*/
|
|
function createDiscoverButtons(){
|
|
var buttonDiv = $('<div style="text-align:center;padding:20px 0px 10px 0px;"></div>');
|
|
var backButton = createBackButton();
|
|
var nextButton = createNextButton();
|
|
var cancelButton = createButton('Cancel');
|
|
cancelButton.bind('click', function(){
|
|
$('#discoverTab').empty();
|
|
for (var name in discoverEnv){
|
|
removeDiscoverEnv(name);
|
|
}
|
|
loadDiscoverPage();
|
|
});
|
|
|
|
if (backButton){
|
|
buttonDiv.append(backButton);
|
|
}
|
|
|
|
if (nextButton){
|
|
buttonDiv.append(nextButton);
|
|
}
|
|
|
|
buttonDiv.append(cancelButton);
|
|
$('#discoverContentDiv').append(buttonDiv);
|
|
}
|
|
|
|
/**
|
|
* create the next button base on the currentStep, the last step does not need this button
|
|
*
|
|
* @return nothing
|
|
*/
|
|
function createNextButton(){
|
|
var tempFlag = true;
|
|
if ((steps.length - 1) == currentStep){
|
|
return undefined;
|
|
}
|
|
|
|
var nextButton = createButton('Next');
|
|
nextButton.bind('click', function(){
|
|
if (nextFunctions[currentStep]){
|
|
tempFlag = nextFunctions[currentStep]('next');
|
|
}
|
|
|
|
if (!tempFlag){
|
|
return;
|
|
}
|
|
currentStep ++;
|
|
updateDiscoverStep();
|
|
initFunctions[currentStep]('next');
|
|
});
|
|
|
|
return nextButton;
|
|
}
|
|
|
|
/**
|
|
* create the next button base on the currentStep, the first step does not need this button
|
|
*
|
|
* @return nothing
|
|
*/
|
|
function createBackButton(){
|
|
var tempFlag = true;
|
|
if (0 == currentStep){
|
|
return undefined;
|
|
}
|
|
|
|
var backButton = createButton('Back');
|
|
backButton.bind('click', function(){
|
|
if (nextFunctions[currentStep]){
|
|
tempFlag = nextFunctions[currentStep]('back');
|
|
}
|
|
|
|
if (!tempFlag){
|
|
return;
|
|
}
|
|
|
|
currentStep--;
|
|
updateDiscoverStep();
|
|
initFunctions[currentStep]('back');
|
|
});
|
|
|
|
return backButton;
|
|
}
|
|
|
|
/**
|
|
* get the input value on discover page
|
|
*
|
|
* @param envName
|
|
* value's name(discoverEnv's key)
|
|
* @return
|
|
* if there is assciate value, return the value.
|
|
* else return null.
|
|
*/
|
|
function getDiscoverEnv(envName){
|
|
if (discoverEnv[envName]){
|
|
return discoverEnv[envName];
|
|
}
|
|
else{
|
|
return '';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* set the input value on discover page
|
|
*
|
|
* @param envName
|
|
* value's name(discoverEnv's key)
|
|
* @param envValue
|
|
* value
|
|
* @return nothing
|
|
*/
|
|
function setDiscoverEnv(envName, envValue){
|
|
if (envName){
|
|
discoverEnv[envName] = envValue;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* delete the input value on discover page
|
|
*
|
|
* @param envName
|
|
* value's name(discoverEnv's key)
|
|
* @return nothing
|
|
*/
|
|
function removeDiscoverEnv(envName){
|
|
if (discoverEnv[envName]){
|
|
delete discoverEnv[envName];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Expand the noderange into node names.
|
|
*
|
|
* @param nodeRange
|
|
* @return node names array
|
|
*/
|
|
function expandNR(nodeRange){
|
|
var retArray = new Array();
|
|
var tempResult;
|
|
if ('' == nodeRange){
|
|
return retArray;
|
|
}
|
|
|
|
tempResult = nodeRange.match(/(.*?)\[(.*?)\](.*)/);
|
|
if (null != tempResult){
|
|
var parts = tempResult[2].split('-');
|
|
if (2 > parts.length){
|
|
return retArray;
|
|
}
|
|
|
|
var start = Number(parts[0]);
|
|
var end = Number(parts[1]);
|
|
var len = parts[0].length;
|
|
for (var i = parts[0]; i <= parts[1]; i++){
|
|
var ts = i.toString();
|
|
if (ts.length < len){
|
|
ts = "000000".substring(0, (len - ts.length)) + ts;
|
|
}
|
|
retArray = retArray.concat(expandNR(tempResult[1] + ts + tempResult[3]));
|
|
}
|
|
return retArray;
|
|
}
|
|
|
|
var tempArray = nodeRange.split('-');
|
|
if (2 > tempArray.length){
|
|
retArray.push(nodeRange);
|
|
return retArray;
|
|
}
|
|
|
|
var begin = tempArray[0].match(/^(\D+)(\d+)$/);
|
|
if (2 > begin){
|
|
retArray.push(nodeRange);
|
|
return retArray;
|
|
}
|
|
|
|
var end = tempArray[1].match(/^(\D+)(\d+)$/);
|
|
if (2 > end){
|
|
retArray.push(nodeRange);
|
|
return retArray;
|
|
}
|
|
|
|
if (begin[1] != end[1]){
|
|
retArray.push(nodeRange);
|
|
return retArray;
|
|
}
|
|
|
|
var prefix = begin[1];
|
|
var len = begin[2].length;
|
|
for (var i = begin[2]; i <= end[2]; i++){
|
|
var ts = i.toString();
|
|
if (ts.length < len){
|
|
ts = "000000".substring(0, (len - ts.length)) + ts;
|
|
}
|
|
retArray.push(prefix + ts);
|
|
}
|
|
|
|
return retArray;
|
|
}
|
|
|
|
/**
|
|
* collect all inputs' value from the page
|
|
*
|
|
* @return true: this step is correct, can go to the next page
|
|
* false: this step contains error.
|
|
*/
|
|
function collectInputValue(){
|
|
$('#discoverContentDiv input[type=text]').each(function(){
|
|
var name = $(this).attr('name');
|
|
var value = $(this).attr('value');
|
|
if ('' != value){
|
|
setDiscoverEnv(name, value);
|
|
}
|
|
else{
|
|
removeDiscoverEnv(name);
|
|
}
|
|
});
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Step 1: show the wizard's function
|
|
* platform selector(system P or system X)
|
|
*
|
|
* @return nothing
|
|
*/
|
|
function initSelectPlatform(){
|
|
var temp = '';
|
|
var type = '';
|
|
$('#discoverContentDiv').empty();
|
|
$('.tooltip').remove();
|
|
temp += '<div style="min-height:360px"><h2>' + steps[currentStep] + '</h2>';
|
|
temp += '<p>This wizard will guide you through the process of defining the naming conventions within' +
|
|
'your cluster, discovering the hardware on your network, and automatically defining it in the xCAT' +
|
|
'database.<br/>Choose which type of hardware you want to discover, and then click Next.</p>';
|
|
temp += '<input type="radio" name="platform" disabled="true"><span style="color:gray;"> System x hardware (not implemented yet)</span></input><br/>';
|
|
temp += '<input type="radio" name="platform" id="ih"> System p hardware (P7 IH)</input><br/>';
|
|
temp += '<input type="radio" name="platform" id="nonih"> System p hardware (Non P7 IH)</input><br/>';
|
|
temp += '</div>';
|
|
$('#discoverContentDiv').append(temp);
|
|
|
|
if (getDiscoverEnv('machineType')){
|
|
type = getDiscoverEnv('machineType');
|
|
}
|
|
else{
|
|
type = 'ih';
|
|
}
|
|
|
|
$('#discoverContentDiv #' + type).attr('checked', 'checked');
|
|
createDiscoverButtons();
|
|
}
|
|
|
|
/**
|
|
* Step 1: Get the platform type
|
|
*
|
|
* @return true
|
|
*/
|
|
function getPlatform(){
|
|
var radioValue = $('#discoverContentDiv :checked').attr('id');
|
|
setDiscoverEnv('machineType', radioValue);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 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
|
|
* @return nothing
|
|
*/
|
|
function initBasicPattern(){
|
|
$('#discoverContentDiv').empty();
|
|
$('.tooltip').remove();
|
|
var showString = '<div style="min-height:360px" id="patternDiv"><h2>' + steps[currentStep] + '</h2>';
|
|
showString += '<table><tbody>';
|
|
|
|
//Frame title
|
|
showString += '<tr><td><h3>Frames:</h3></td></tr>';
|
|
//Frame Name
|
|
showString += '<tr><td>Name Range:</td><td><input type="text" title="Format: Frame[1-6] or F1-F6" ' +
|
|
'name="frameName" value="' + getDiscoverEnv('frameName') + '"></td>';
|
|
//use the super node configure file to calculate the cec's number
|
|
showString += '<td></td><td></td></tr>';
|
|
|
|
//CEC title
|
|
showString += '<tr><td><h3>Drawers:</h3></td></tr>';
|
|
//CEC name
|
|
showString += '<tr><td>Name Range:</td><td><input type="text" title="Format: CEC[1-60] or F[1-6]C[1-10]" ' +
|
|
'name="cecName" value="' + getDiscoverEnv('cecName') + '"></td>';
|
|
//Number of LPARs per Drawer:
|
|
showString += '<td>Number of LPARs per Drawer:</td><td><input type="text" name="lparNumPerCec" value="' +
|
|
getDiscoverEnv('lparNumPerCec') + '"></td></tr>';
|
|
|
|
//Lpar title
|
|
showString += '<tr><td><h3>Lpars:</h3></td></tr>';
|
|
//lpar name
|
|
showString += '<tr><td>Name Range:</td><td><input type="text" title="Format: F[1-6]C[1-10]L[1-8]" ' +
|
|
'name="lparName" value="' + getDiscoverEnv('lparName') + '"></td><td></td><td></td></tr>';
|
|
|
|
//hmc title
|
|
showString += '<tr><td><h3>HMCs:</h3></td></tr>';
|
|
//hmc name
|
|
showString += '<tr id="hmcTr"><td>Name Range:</td><td><input type="text" title="Format: HMC[01-10] or HMC01-HMC10" name="hmcName" value="' + getDiscoverEnv('hmcName') + '"></td>';
|
|
//Number of Frames per HMC
|
|
showString += '<td>Number of Frames per HMC:</td><td><input type="text" name="frameNumPerHmc" value="' +
|
|
getDiscoverEnv('frameNumPerHmc') + '"></td></tr>';
|
|
showString += '<tr><td>Hardware Managment:</td><td><input type="radio" name="managetype" value="hmc" title="Hardware Management Console">HMC ';
|
|
showString += '<input type="radio" name="managetype" value="dfm" title="Direct FSP Management">DFM</td></tr>';
|
|
showString += '</tbody></table></div>';
|
|
|
|
$('#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 operType
|
|
* type of operation
|
|
* @return true or false
|
|
*/
|
|
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.<br/>';
|
|
}
|
|
else{
|
|
frameNum = expandNR(tempName).length;
|
|
}
|
|
|
|
//check the cec name
|
|
tempName = getDiscoverEnv('cecName');
|
|
if (!tempName){
|
|
errMessage += 'Input the CEC Name Range.<br/>';
|
|
}
|
|
else{
|
|
cecNum = expandNR(tempName).length;
|
|
}
|
|
|
|
//lpar number per cec
|
|
if (!lparNumPerCec){
|
|
errMessage += 'Input the Lpar Number Per Drawer.<br/>';
|
|
}
|
|
|
|
//check the lpar name
|
|
tempName = getDiscoverEnv('lparName');
|
|
if (!tempName){
|
|
errMessage += 'Input the Lpar Name Range.<br/>';
|
|
}
|
|
else{
|
|
lparNum = expandNR(tempName).length;
|
|
}
|
|
|
|
//check the hmc name
|
|
tempName = getDiscoverEnv('hmcName');
|
|
if (!tempName){
|
|
errMessage += 'Input the HMC Name Range.<br/>';
|
|
}
|
|
else{
|
|
hmcNum = expandNR(tempName).length;
|
|
}
|
|
|
|
//frame number per hmc
|
|
if (!frameNumPerHmc){
|
|
errMessage += 'Input the Frame Number Per HMC.<br/>';
|
|
}
|
|
|
|
//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
|
|
*
|
|
* @return nothing
|
|
*/
|
|
function initSupernode(){
|
|
$('#discoverContentDiv').empty();
|
|
$('.tooltip').remove();
|
|
$('#discoverContentDiv').append('<div style="min-height:360px" id="supernodeDiv"><h2>' + steps[currentStep] + '</h2></div>');
|
|
createDiscoverButtons();
|
|
|
|
//add the introduction about the page
|
|
var infoStr = '<div>The supernode-list file lists what supernode numbers should be ';
|
|
infoStr += 'given to each CEC in each frame. Here is a sample file:<br/>';
|
|
infoStr += 'frame1: 0, 1, 16<br/>frame2: 17, 32<br/>frame3: 33, 48, 49<br/>';
|
|
infoStr += 'frame4: 64 , 65, 80<br/>frame5: 81, 96<br/>frame6: 97(1), 112(1), 113(1), 37(1), 55, 71<br/>';
|
|
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.</div>';
|
|
var InfoBar = createInfoBar(infoStr);
|
|
$('#discoverContentDiv #supernodeDiv').append(InfoBar);
|
|
|
|
var frameArray = expandNR(getDiscoverEnv('frameName'));
|
|
var showStr = '<center><table><tbody>';
|
|
for (var i in frameArray){
|
|
showStr += '<tr><td>' + frameArray[i] + ':</td><td><input type="text" name="sp_' + frameArray[i] +
|
|
'" value="' + getDiscoverEnv('sp_' + frameArray[i]) + '"></td></tr>';
|
|
}
|
|
showStr += '</tbody></table></center>';
|
|
$('#discoverContentDiv #supernodeDiv').append(showStr);
|
|
}
|
|
|
|
/**
|
|
* Step 3: check the super node configure file
|
|
*
|
|
* @param operType
|
|
* type of operation
|
|
* @return true or false
|
|
*/
|
|
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] + '<br/>';
|
|
}
|
|
}
|
|
|
|
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/systemcmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'echo -e "' + args + '" > /tmp/websupernode.txt'
|
|
}
|
|
});
|
|
|
|
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 operType
|
|
* type of operation
|
|
* @return nothing
|
|
*/
|
|
function initSiteTable(operType){
|
|
$('#discoverContentDiv').empty();
|
|
$('.tooltip').remove();
|
|
var showDiv = $('<div style="min-height:360px" id="siteDiv"><h2>' + steps[currentStep] + '(Site info)</h2></div>');
|
|
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
|
|
*
|
|
* @return nothing
|
|
*/
|
|
function showSiteArea(){
|
|
var showString = '<table><tbody>';
|
|
|
|
//domain name:
|
|
showString += '<tr><td>Domain Name:</td><td><input type="text" name="domainname" value="' + getDiscoverEnv('domainname') +
|
|
'" title="The DNS domain name used for the cluster."></td></tr>';
|
|
|
|
//Name server
|
|
showString += '<tr><td>Name server:</td><td><input type="text" name="nameserver" value="' + getDiscoverEnv('nameserver') +
|
|
'" title="A comma delimited list of DNS servers that each node in the cluster should use - often the xCAT management node."></td></tr>';
|
|
|
|
//ntp server
|
|
showString += '<tr><td>DHCP Dynamic Range:</td><td><input type="text" name="ipStart" value="' + getDiscoverEnv('ipStart') +
|
|
'" title="A start Ip address for DHCP dynamic range.">-<input type="text" name="ipEnd" disabled="disabled" value="' +
|
|
getDiscoverEnv('ipEnd') + '"></td></tr>';
|
|
showString += '</tbody></table>';
|
|
|
|
$('#discoverContentDiv div').eq(0).append(showString);
|
|
|
|
$('#discoverContentDiv [title]').tooltip({
|
|
position: "center right",
|
|
offset: [-2, 10],
|
|
effect: "fade",
|
|
opacity: 1
|
|
});
|
|
|
|
$('#discoverContentDiv input[name=ipStart]').bind('change', function(){
|
|
var reg = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-4])$/;
|
|
if (reg.test($(this).attr('value'))){
|
|
var tempNum = Number(getDiscoverEnv('frameNum')) * 4 + Number(getDiscoverEnv('cecNum')) * 4 +
|
|
Number(getDiscoverEnv('lparNum')) + Number(getDiscoverEnv('hmcNum'));
|
|
var ipEnd = calcEndIp($(this).attr('value'), tempNum);
|
|
if (!reg.test(ipEnd)){
|
|
ipEnd = '';
|
|
}
|
|
$('#discoverContentDiv input[name=ipEnd]').attr('value', ipEnd);
|
|
}
|
|
else{
|
|
$('#discoverContentDiv input[name=ipEnd]').attr('value', '');
|
|
}
|
|
});
|
|
|
|
//show the current network interface configure
|
|
$.ajax({
|
|
url : 'lib/systemcmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'ifconfig | grep -E "encap|Mask"'
|
|
},
|
|
|
|
success : function(data){
|
|
$('#discoverContentDiv #siteTableStat div').html('Current network interface configuration:<br/><pre>' +
|
|
data.rsp + '</pre>');
|
|
}
|
|
});
|
|
createDiscoverButtons();
|
|
}
|
|
|
|
function calcEndIp(ipStart, num){
|
|
var sum = 0;
|
|
var tempNum = Number(num);
|
|
var temp = /(\d+)\.(\d+)\.(\d+)\.(\d+)/;
|
|
var ipArray = temp.exec(ipStart);
|
|
|
|
ipArray.shift();
|
|
sum = Number(ipArray[3]) + tempNum;
|
|
if (sum <= 254){
|
|
ipArray[3] = sum;
|
|
return (ipArray.join('.'));
|
|
}
|
|
|
|
ipArray[3] = sum % 254;
|
|
|
|
sum = Number(ipArray[2]) + parseInt(sum / 254);
|
|
if (sum <= 255){
|
|
ipArray[2] = sum;
|
|
return (ipArray.join('.'));
|
|
}
|
|
|
|
ipArray[2] = sum % 255;
|
|
|
|
sum = Number(ipArray[1]) + parseInt(sum / 255);
|
|
if (sum <= 255){
|
|
ipArray[1] = sum;
|
|
return (ipArray.join('.'));
|
|
}
|
|
|
|
ipArray[1] = sum % 255;
|
|
ipArray[0] = ipArray[0] + parseInt(sum / 255);
|
|
return (ipArray.join('.'));
|
|
}
|
|
|
|
/**
|
|
* Step 4: check the input are all filled
|
|
*
|
|
* @param operType
|
|
* type of operation
|
|
* @return true or false
|
|
*/
|
|
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.<br/>';
|
|
}
|
|
|
|
if (!getDiscoverEnv('nameserver')){
|
|
errMessage += 'Input the name server.<br/>';
|
|
}
|
|
|
|
if (!getDiscoverEnv('ipEnd')){
|
|
errMessage += 'Input the DHCP Dynamic Range.<br/>';
|
|
}
|
|
|
|
if ('' == errMessage){
|
|
return true;
|
|
}
|
|
|
|
var warnBar = createWarnBar(errMessage);
|
|
$('#discoverContentDiv #siteDiv').prepend(warnBar);
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Step 5: told users to power on machines
|
|
*
|
|
* @return nothing
|
|
*/
|
|
function initPoweronHardware(){
|
|
$('#discoverContentDiv').empty();
|
|
$('.tooltip').remove();
|
|
var showStr = '<div style="min-height:360px"><h2>' + steps[currentStep] +
|
|
'</h2><h3>Do the following manual steps now:</h3>';
|
|
showStr += '<ul><li>1. Power on all of the HMCs.</li>';
|
|
showStr += '<li>2. Power on all of frames.</li>';
|
|
showStr += '<li>3. Click Next to discover the hardware on the service network.</li></ul></div>';
|
|
|
|
$('#discoverContentDiv').append(showStr);
|
|
|
|
createDiscoverButtons();
|
|
}
|
|
|
|
/**
|
|
* Step 6: discover all frames from the cluster and map all mtms with frame name
|
|
*
|
|
* @return nothing
|
|
*/
|
|
function initDiscoverFrames(){
|
|
$('#discoverContentDiv').empty();
|
|
$('.tooltip').remove();
|
|
var showDiv = $('<div style="min-height:360px" id="discoverShow"><h2>' + steps[currentStep] + '</h2>');
|
|
var statBar = createStatusBar('framedisc');
|
|
showDiv.append(statBar);
|
|
$('#discoverContentDiv').append(showDiv);
|
|
$('#discoverShow').append('<center><table><tr><td id="frameTd">'
|
|
+ '</td><td style="width:20px"></td><td id="mtmsTd"></td></tr></table></center>');
|
|
|
|
if (getDiscoverEnv('framemtmsmap')){
|
|
$('#framedisc div').html('Mapping the frame name and mtms which discovered by lsslp.<br\>' +
|
|
'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] + '-' + tempArray[2]);
|
|
}
|
|
|
|
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.<br\>' +
|
|
'Select the frame name, then select the mtms.');
|
|
|
|
for (var i in frameArray){
|
|
$('#frameTd').append('<p><input name="frameradio" type="radio" onclick="createMap(this)"><span>' +
|
|
frameArray[i] + '</span></p>');
|
|
}
|
|
|
|
for (var i in mtmsArray){
|
|
$('#mtmsTd').append('<p><input name="mtmsradio" type="radio" onclick="createMap(this)"><span>' +
|
|
mtmsArray[i] + '</span></p>');
|
|
}
|
|
|
|
createDiscoverButtons();
|
|
}
|
|
});
|
|
}
|
|
|
|
function createMap(obj){
|
|
var fname = '';
|
|
var mname = '';
|
|
|
|
if ($('#discoverShow :checked').size() < 2){
|
|
return;
|
|
}
|
|
|
|
if('frameradio' == $(obj).attr('name')){
|
|
fname = $(obj).next().html();
|
|
mname = $('#discoverShow input[name=mtmsradio]:checked').next().html();
|
|
}
|
|
else{
|
|
fname = $('#discoverShow input[name=frameradio]:checked').next().html();
|
|
mname = $(obj).next().html();
|
|
}
|
|
|
|
$('#discoverShow :checked').parent().remove();
|
|
showMap(fname, mname);
|
|
}
|
|
|
|
function showMap(fname, mname){
|
|
var rowClass = '';
|
|
|
|
if ($('#discoverShow fieldset').size() < 1){
|
|
$('#discoverShow').append('<fieldset><legend>Frame and MTMS map</legend><center><table></table></center></fieldset>');
|
|
}
|
|
|
|
if (0 == $('#discoverShow fieldset tr').size() % 2){
|
|
rowClass = 'odd';
|
|
}
|
|
else{
|
|
rowClass = 'even';
|
|
}
|
|
|
|
$('#discoverShow fieldset table').append('<tr class="' + rowClass + '"><td>' + fname +
|
|
'</td><td width="20px"><----></td><td>' + mname +
|
|
'</td><td><span class="ui-icon ui-icon-trash" style="cursor:pointer;" onclick="deleteMap(this)"></span></td></tr>');
|
|
}
|
|
|
|
function deleteMap(obj){
|
|
var mname = $(obj).parent().prev().html();
|
|
var fname = $(obj).parent().prev().prev().prev().html();
|
|
|
|
$(obj).parent().parent().remove();
|
|
|
|
$('#frameTd').append('<p><input name="frameradio" type="radio" onclick="createMap(this)"><span>' + fname + '</span></p>');
|
|
$('#mtmsTd').append('<p><input name="mtmsradio" type="radio" onclick="createMap(this)"><span>' + mname + '</span></p>');
|
|
}
|
|
|
|
/**
|
|
* Step 6: write the frame and mtms map file
|
|
*
|
|
* @param operType
|
|
* type of operation
|
|
* @return true or false
|
|
*/
|
|
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('-');
|
|
|
|
maps += (fname + ',' + mtms.substring(0, pos) + ',' + mtms.substring(pos + 1) + ':');
|
|
vpdFileCon += fname + ':\n';
|
|
vpdFileCon += ' objtype=node\n serial=' + mtms.substring(pos + 1) + '\n';
|
|
vpdFileCon += ' mtm=' + mtms.substring(0, 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/systemcmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'echo -e "' + vpdFileCon + '" > /tmp/webvpd.stanza'
|
|
}
|
|
});
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Step 7: create the xcatsetup configure file and run xcatsetup to define all objects
|
|
* in xcat database.
|
|
*
|
|
* @param operType
|
|
* type of operation
|
|
* @return
|
|
*/
|
|
function initConfig(operType){
|
|
$('#discoverContentDiv').empty();
|
|
$('.tooltip').remove();
|
|
var showStr = '<div style="min-height:360px"><h2>' + steps[currentStep] + '<br/><br/></h2>';
|
|
var iconClass = '';
|
|
if ('back' == operType){
|
|
iconClass = 'ui-icon-check';
|
|
}
|
|
else{
|
|
iconClass = 'ui-icon-wrench';
|
|
}
|
|
showStr += '<ul>';
|
|
showStr += '<li id="fileLine"><span class="ui-icon ' + iconClass + '"></span>Create configure file for xcatsetup.</li>';
|
|
showStr += '<li id="setupLine"><span class="ui-icon ' + iconClass + '"></span>Wrote Objects into xCAT database by xcatsetup.</li>';
|
|
showStr += '<li id="dhcpLine"><span class="ui-icon ' + iconClass + '"></span>Configured DHCP.</li>';
|
|
showStr += '</ul></div>';
|
|
|
|
$('#discoverContentDiv').append(showStr);
|
|
|
|
if ('back' == operType){
|
|
createDiscoverButtons();
|
|
return;
|
|
}
|
|
|
|
createSetupFile();
|
|
}
|
|
|
|
/**
|
|
* Step 7: create the xcat configure file
|
|
*
|
|
* @return nothing
|
|
*/
|
|
function createSetupFile(){
|
|
var fileContent = '';
|
|
|
|
$('#fileLine').append(createLoader());
|
|
//site info
|
|
fileContent += 'xcat-site:\n';
|
|
fileContent += ' domain = ' + getDiscoverEnv('domainname') + '\n';
|
|
if (getDiscoverEnv('hmcFlag')){
|
|
//do nothing
|
|
}
|
|
else{
|
|
fileContent += ' use-direct-fsp-control = 1\n';
|
|
}
|
|
|
|
//dhcp ip range
|
|
fileContent += 'xcat-service-lan:\n';
|
|
fileContent += ' dhcp-dynamic-range = ' + getDiscoverEnv('ipStart') + '-' + getDiscoverEnv('ipEnd') + '\n';
|
|
|
|
//hmc
|
|
if (getDiscoverEnv('hmcName')){
|
|
fileContent += 'xcat-hmcs:\n';
|
|
fileContent += ' hostname-range = ' + getDiscoverEnv('hmcName') + '\n';
|
|
}
|
|
|
|
//frame
|
|
fileContent += 'xcat-frames:\n';
|
|
fileContent += ' hostname-range = ' + getDiscoverEnv('frameName') + '\n';
|
|
fileContent += ' num-frames-per-hmc = ' + getDiscoverEnv('frameNumPerHmc') + '\n';
|
|
fileContent += ' vpd-file = /tmp/webvpd.stanza\n';
|
|
|
|
//cec
|
|
fileContent += 'xcat-cecs:\n';
|
|
fileContent += ' hostname-range = ' + getDiscoverEnv('cecName') + '\n';
|
|
fileContent += ' delete-unused-cecs = 1\n';
|
|
fileContent += ' supernode-list = /tmp/websupernode.txt\n';
|
|
|
|
//lpar
|
|
fileContent += 'xcat-lpars:\n';
|
|
fileContent += ' num-lpars-per-cec = ' + getDiscoverEnv('lparNumPerCec') + '\n';
|
|
fileContent += ' hostname-range = ' + getDiscoverEnv('lparName') + '\n';
|
|
|
|
$.ajax({
|
|
url : 'lib/systemcmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'echo -e "' + fileContent + '" > /tmp/webxcat.conf'
|
|
},
|
|
|
|
success : function(){
|
|
$('#fileLine img').remove();
|
|
var tempSpan = $('#fileLine').find('span');
|
|
tempSpan.removeClass('ui-icon-wrench');
|
|
tempSpan.addClass('ui-icon-check');
|
|
runSetup();
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Step 7: run the xcatsetup command
|
|
*
|
|
* @return nothing
|
|
*/
|
|
function runSetup(){
|
|
$('#setupLine').append(createLoader());
|
|
$.ajax({
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'xcatsetup',
|
|
tgt : '',
|
|
args : '/tmp/webxcat.conf',
|
|
msg : ''
|
|
},
|
|
|
|
success : function(){
|
|
$('#setupLine img').remove();
|
|
var tempSpan = $('#setupLine').find('span');
|
|
tempSpan.removeClass('ui-icon-wrench');
|
|
tempSpan.addClass('ui-icon-check');
|
|
configDHCP();
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Step 7: create the dhcp configure file
|
|
*
|
|
* @return nothing
|
|
*/
|
|
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-wrench');
|
|
tempSpan.addClass('ui-icon-check');
|
|
createDiscoverButtons();
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Step 8: discover all hmc,cec in cluster and update into xcat database
|
|
*
|
|
* @param operType
|
|
* type of operation
|
|
* @return nothing
|
|
*/
|
|
function initUpdateDefinition(operType){
|
|
$('#discoverContentDiv').empty();
|
|
$('.tooltip').remove();
|
|
var showStr = '<div style="min-height:360px"><h2>' + steps[currentStep] + '<br/><br/></h2>';
|
|
showStr += '<ul>';
|
|
showStr += '<li id="frameLine"><span class="ui-icon ui-icon-wrench"></span>Update Frames into xCAT database.</li>';
|
|
showStr += '<li id="hmcLine1"><span class="ui-icon ui-icon-wrench"></span>Discover HMCs.</li>';
|
|
showStr += '<li id="hmcLine2"><span class="ui-icon ui-icon-wrench"></span>Update HMCs into xCAT database.</li>';
|
|
showStr += '<li id="cecLine"><span class="ui-icon ui-icon-wrench"></span>Discover CECs and update into xCAT database.</li>';
|
|
showStr += '</ul></div>';
|
|
|
|
$('#discoverContentDiv').append(showStr);
|
|
|
|
if ('back' == operType){
|
|
createDiscoverButtons();
|
|
return;
|
|
}
|
|
|
|
lsslpWriteFrame();
|
|
}
|
|
|
|
/**
|
|
* Step 8: write all the lsslp -s FRAME info into database
|
|
*
|
|
* @return nothing
|
|
*/
|
|
function lsslpWriteFrame(){
|
|
$('#frameLine').append(createLoader());
|
|
$.ajax({
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'lsslp',
|
|
tgt : '',
|
|
args : '-s;BPA;-w',
|
|
msg : ''
|
|
},
|
|
|
|
success : function(){
|
|
$('#frameLine img').remove();
|
|
var tempSpan = $('#frameLine').find('span');
|
|
tempSpan.removeClass('ui-icon-wrench');
|
|
tempSpan.addClass('ui-icon-check');
|
|
lsslpWriteHMC();
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Step 8: write all the lsslp -s HMC info into database
|
|
*
|
|
* @return nothing
|
|
*/
|
|
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-wrench');
|
|
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('-');
|
|
if ('' == tempPar){
|
|
tempPar += hmcArray[i] + ',' + mtmsArray[i].substring(0, tPos) + ',' +mtmsArray[i].substring(tPos + 1);
|
|
}
|
|
else{
|
|
tempPar += ':' + hmcArray[i] + ',' + mtmsArray[i].substring(0, 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-wrench');
|
|
tempSpan.addClass('ui-icon-check');
|
|
lsslpWriteCec();
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Step 8: write all the lsslp -s cec info into database
|
|
*
|
|
* @return nothing
|
|
*/
|
|
function lsslpWriteCec(){
|
|
$('#cecLine').append(createLoader());
|
|
$.ajax({
|
|
url : 'lib/cmd.php',
|
|
dataType : 'json',
|
|
data : {
|
|
cmd : 'lsslp',
|
|
tgt : '',
|
|
args : '-s;FSP;-w',
|
|
msg : ''
|
|
},
|
|
success: function(){
|
|
$('#cecLine img').remove();
|
|
var tempSpan = $('#cecLine').find('span');
|
|
tempSpan.removeClass('ui-icon-wrench');
|
|
tempSpan.addClass('ui-icon-check');
|
|
createDiscoverButtons();
|
|
}
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Step 9: create lpars
|
|
*
|
|
* @return nothing
|
|
*/
|
|
function initCreateLpar(){
|
|
$('#discoverContentDiv').empty();
|
|
$('.tooltip').remove();
|
|
var showDiv = $('<div style="min-height:360px" id="createlparDiv"><h2>' + steps[currentStep] + '</h2>');
|
|
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:<br/>' +
|
|
'If all the octants configuration value are same in one CEC, it will be " -r 0-7:value".<br/>' +
|
|
'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".<br/>' +
|
|
'The octants configuration value for one Octant could be 1, 2, 3, 4, 5 . The meanings of the octants configuration value are as following:<br/>' +
|
|
'1 - 1 partition with all cpus and memory of the octant<br/>' +
|
|
'2 - 2 partitions with a 50/50 split of cpus and memory<br/>' +
|
|
'3 - 3 partitions with a 25/25/50 split of cpus and memory<br/>' +
|
|
'4 - 4 partitions with a 25/25/25/25 split of cpus and memory<br/>' +
|
|
'5 - 2 partitions with a 25/75 split of cpus and memory<br/>' +
|
|
'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('<div><center><table><tr><td>Partition Configuration:</td>' +
|
|
'<td><input name="partconf" type="text" value="' + getDiscoverEnv('partconf')+
|
|
'"></td><td></td></tr></table></center></div>');
|
|
|
|
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 = $('<div id="createLparDiv"></div>');
|
|
diaDiv.append('<ul></ul>');
|
|
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('<li>Creating lpars on ' + cecname + ' competed.</li>');
|
|
|
|
if (cecNum != $('#createLparDiv li').size()){
|
|
return;
|
|
}
|
|
|
|
$('#createLparDiv').empty();
|
|
$('#createLparDiv').append('<p>All lpars are created. You must:<br/>1. reboot the all CECS. <br/>'+
|
|
'2.use chvm to assign the I/O slots to the new LPAR.</p>');
|
|
|
|
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;
|
|
}
|
|
|
|
/**
|
|
* Step 10: complete
|
|
*
|
|
* @return nothing
|
|
*/
|
|
function complete(){
|
|
$('#discoverContentDiv').empty();
|
|
$('.tooltip').remove();
|
|
var showStr = '<div style="min-height:360px"><h2>' + steps[currentStep] + '<br/><br/></h2>';
|
|
showStr += 'You can go to the <a href="index.php">nodes page</a> to check nodes which were defined just now.';
|
|
$('#discoverContentDiv').append(showStr);
|
|
|
|
createDiscoverButtons();
|
|
} |