/*associate the step name with step number*/ var steps = ['Platform', 'Complete']; /*associate the function with step number*/ var initFunctions = [initSelectPlatform, 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, 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('
'); initSelectPlatform(); } /** * create the navigator buttons on the bottom of discover page * * @param * * @return nothing */ function createDiscoverButtons(){ var buttonDiv = $('
'); 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 ++; 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--; 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; } /** * verify the ip address, * * @param * * @return true: for valid IP address * false : for invalid IP address */ function verifyIp(ip){ 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])$/; return reg.test(ip); } /** * transfer ip into decimal * * @param * * @return decimal type ip address */ function ip2Decimal(ip){ if (!verifyIp(ip)){ return 0; } var retIp = 0; var tempArray = ip.split('.'); for (var i = 0; i < 4; i++){ retIp = (retIp << 8) | parseInt(tempArray[i]); } //change the int into unsigned int type retIp = retIp >>> 0; return retIp; } /** * calculate the end IP address by start IP and the number of IP range. * * @param * * @return */ 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 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 += '

' + steps[currentStep] + '

'; temp += '

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.
Choose which type of hardware you want to discover, and then click Next.

'; temp += '
'; temp += ' Blade Center
'; temp += ' System p hardware (P7 IH)
'; temp += ' System p hardware (Non P7 IH)
'; temp += '
'; $('#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'); var platformObj; switch(radioValue){ case 'ih': case 'nonih':{ platformObj = new hmcPlugin(); } break; case 'idataplex':{ platformObj = new ipmiPlugin(); } break; case 'blade':{ } break; } steps = ['Platform'].concat(platformObj.getStep(), 'compelte'); initFunctions = [initSelectPlatform].concat(platformObj.getInitFunction(), complete); nextFunctions = [getPlatform].concat(platformObj.getNextFunction(), undefined); setDiscoverEnv('machineType', radioValue); return true; } /** * last step: complete * * @param * * @return */ function complete(){ $('#discoverContentDiv').empty(); $('.tooltip').remove(); var showStr = '

' + steps[currentStep] + '

'; showStr += 'You can go to the nodes page to check nodes which were defined just now.'; $('#discoverContentDiv').append(showStr); createDiscoverButtons(); }