From 286cb7c4bea1c4b5bda577fe4e1d7d7dec54c0c5 Mon Sep 17 00:00:00 2001 From: bp-sawyers Date: Mon, 3 Nov 2008 21:47:38 +0000 Subject: [PATCH] Set up wizard working except for real lsslp and mkvm commands. git-svn-id: https://svn.code.sf.net/p/xcat/code/xcat-core/trunk@2456 8638fb3e-16cb-4fca-ae20-7b5d299a9bcd --- xCAT-web/config/edittab.php | 23 +- xCAT-web/lib/functions.php | 35 ++- xCAT-web/lib/style.css | 1 + xCAT-web/lib/test.php | 61 ++-- xCAT-web/lib/wizard.css | 21 ++ xCAT-web/lib/wizard.js | 63 ++++ xCAT-web/lib/wizard.php | 62 ++-- xCAT-web/machines/attributes.js | 2 +- xCAT-web/machines/attributes.php | 6 +- xCAT-web/machines/discover.css | 15 - xCAT-web/machines/discover.php | 511 ++++++++++++++++++++++++++----- 11 files changed, 623 insertions(+), 177 deletions(-) create mode 100644 xCAT-web/lib/wizard.js diff --git a/xCAT-web/config/edittab.php b/xCAT-web/config/edittab.php index 108d9e8e8..f405ac2bb 100644 --- a/xCAT-web/config/edittab.php +++ b/xCAT-web/config/edittab.php @@ -15,7 +15,7 @@ if(isset($_REQUEST['kill'])) { } if(isset($_REQUEST['save'])) { - $rsp = savexCATchanges($tab,$_SESSION["editable-$tab"]); + $rsp = doTabrestore($tab,$_SESSION["editable-$tab"]); $errors = array(); if (getXmlErrors($rsp,$errors)) { echo "

Tabrestore failed: ", implode(' ',$errors), "

\n"; } else { echo "

Changes have been saved.

\n"; } @@ -121,27 +121,6 @@ function getTabHeaders($xml){ } -//----------------------------------------------------------------------------- -function savexCATchanges($tab, & $editable){ - $request = simplexml_load_string(''); - $request->addChild('command','tabrestore'); - $usernode=$request->addChild('becomeuser'); - $usernode->addChild('username',$_SESSION["username"]); - $usernode->addChild('password',getpassword()); - foreach($editable as $line){ - foreach ($line as &$f) { if (!empty($f) && !preg_match('/^".*"$/', $f)) { $f = '"'.$f.'"'; } } - $linestr = implode(",",$line); - $linestr = str_replace('"', '"',$linestr); //todo: should we use the htmlentities function? - $linestr = str_replace("'", ''',$linestr); - //echo "

addChild:$linestr.

\n"; - $request->addChild('data', $linestr); - } - $request->addChild('table',$tab); - $resp = submit_request($request, 0); - return $resp; -} - - //----------------------------------------------------------------------------- function getTabDescription($tab) { $xml = docmd('tabdump','',array('-d')); diff --git a/xCAT-web/lib/functions.php b/xCAT-web/lib/functions.php index 2a486ac5a..854754b67 100644 --- a/xCAT-web/lib/functions.php +++ b/xCAT-web/lib/functions.php @@ -241,6 +241,28 @@ echo '\n"; // end the outer wizard pane @@ -68,10 +78,11 @@ echo "\n"; // end the outer wizard pane // Disable buttons as appropriate and set current page function configureButtons($k, $arr) { $keys = array_keys($arr); +//echo "

currentPage=", $keys[$k], ".

\n"; echo "\n"; } + + +//----------------------------------------------------------------------------- +function insertProgressTable($tasks) { +global $TOPDIR; +echo "
\n"; +} ?> \ No newline at end of file diff --git a/xCAT-web/machines/attributes.js b/xCAT-web/machines/attributes.js index afd16e34c..fd8702543 100644 --- a/xCAT-web/machines/attributes.js +++ b/xCAT-web/machines/attributes.js @@ -8,6 +8,6 @@ function loadAttrTab(panel) { var nr = ''; if (window.noderange && window.noderange != "") { nr = window.noderange; } panel.children().remove(); // get rid of previous content - panel.append('

Loading node attributes...

'); + panel.append('

Loading node attributes...

'); panel.load('attributes.php?noderange='+nr); } \ No newline at end of file diff --git a/xCAT-web/machines/attributes.php b/xCAT-web/machines/attributes.php index bdb7807ef..8d70df912 100644 --- a/xCAT-web/machines/attributes.php +++ b/xCAT-web/machines/attributes.php @@ -68,7 +68,11 @@ $ooe = 0; // alternates the background of the table //$item = 0; // the column # //$line = 0; //$editable = array(); -foreach ($attrs as $node => $attrarray) { +$keys = array_keys($attrs); +natsort($keys); // natsort sorts 10 after 2 +//foreach ($attrs as $node => $attrarray) { +foreach ($keys as $node) { + $attrarray = & $attrs[$node]; $cl = "ListLine$ooe"; // 1st the column for the node name diff --git a/xCAT-web/machines/discover.css b/xCAT-web/machines/discover.css index b5524fc22..404cad195 100644 --- a/xCAT-web/machines/discover.css +++ b/xCAT-web/machines/discover.css @@ -8,21 +8,6 @@ P#wizardDone {font-weight : bold; } -.WizardProgressTable { - margin: 10px 0px; - text-align: left; -} - -.WizardProgressTable UL { list-style-type: none; } - -.WizardProgressTable LI { - /* list-style-image: url('../images/checked-box.gif'); */ - margin-top: 1em; - margin-bottom: 1em; -} - -.WizardProgressTable IMG { margin-right: 1em; } - .WizardListTable { margin: 10px 0px; text-align: left; diff --git a/xCAT-web/machines/discover.php b/xCAT-web/machines/discover.php index 589f6b235..7fce551f3 100644 --- a/xCAT-web/machines/discover.php +++ b/xCAT-web/machines/discover.php @@ -10,6 +10,7 @@ require_once "$TOPDIR/lib/wizard.php"; // This array controls the order of pages in the wizard $pages = array('intro' => 'Discover Hardware', 'patterns' => 'Cluster Patterns', + 'patterns1b' => 'Switch Ports', 'patterns2' => 'More Cluster Patterns', 'preparemn' => 'Prepare Management Node', 'prediscover' => 'Power On Hardware', @@ -17,14 +18,14 @@ $pages = array('intro' => 'Discover Hardware', 'updatedefs' => 'Update Definitions', 'configurehcps' => 'Configure HW Control Points', 'createnodes' => 'Create Nodes', - 'testhcps' => 'Test HW Control', + /* 'testhcps' => 'Test HW Control', */ 'done' => 'Complete', ); if (isset($_REQUEST['page'])) { displayWizard($pages); } else { // initial display of the wizard, show the whole page -insertHeader('Discover New Nodes', array('discover.css',"$TOPDIR/lib/wizard.css"), NULL, array('machines','discover')); +insertHeader('Discover New Nodes', array('discover.css',"$TOPDIR/lib/wizard.css"), array("$TOPDIR/lib/wizard.js"), array('machines','discover')); echo "
\n"; displayWizard($pages); echo "
\n"; // end the content div @@ -33,74 +34,271 @@ insertFooter(); //----------------------------------------------------------------------------- -function intro() { -echo "

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

\n"; -// The least hacky way to get this list left justified, but have the block in the center, is to use a table. CSS snobs, just deal with it. -echo "
    \n"; -echo "
  • \n"; -echo "
  • \n"; -echo "
\n"; +// Save the values sent up from the previous wizard page into the session. +function savePostVars() { +foreach ($_POST as $k => $v) { + if ($k != 'action' && $k != 'page') { $_SESSION[$k] = $v; } + } } //----------------------------------------------------------------------------- -function patterns() { -echo "\n"; +// Expand the noderange for non-existing nodes +function expandNR($nr) { +//todo: use xcatd to expand this. Change xcatd around line 998: } elsif ($req->{command}->[0] eq "noderange" and $req->{noderange}) { +// see pping as an example of the client/server for noderange expansion +$a = array(); +if (empty($nr)) return $a; +list($begin, $end) = explode('-', $nr); +$begParts = array(); +if (!preg_match('/^(\D+)(\d+)$/', $begin, $begParts)) { msg('E',"Error in noderange syntax: $nr"); return NULL; } +$endParts = array(); +if (!preg_match('/^(\D+)(\d+)$/', $end, $endParts)) { msg('E',"Error in noderange syntax: $nr"); return NULL; } +if ($begParts[1] != $endParts[1]) { msg('E',"Error in noderange syntax: $nr"); return NULL; } +$numlen = strlen($begParts[2]); +for ($i=$begParts[2]; $i<=$endParts[2]; $i++) { + $istr = "$i"; + if (strlen($istr) < $numlen) { $istr = substr('000000',0,$numlen-strlen($istr)) . $istr; } + $a[] = "$begParts[1]$istr"; + } +return $a; +} + +//----------------------------------------------------------------------------- +function intro($action, $step) { +echo "

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

\n"; +// The least hacky way to get this list left justified, but have the block in the center, is to use a table. CSS snobs, just deal with it. +echo "
    \n"; +echo "
  • \n"; +echo "
  • \n"; +echo "
\n"; +} + + +//----------------------------------------------------------------------------- +function patterns($action, $step) { +echo "
\n"; echo "\n"; -echo "\n"; -echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; echo "\n"; -echo "\n"; -echo "\n"; -echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; echo "\n"; -echo "\n"; -echo "\n"; +echo "\n"; +echo "\n"; echo "\n"; -echo "\n"; -echo "\n"; -echo "

Switch Patterns

HMCs

Frame (BPA) Patterns

Drawer (FSP/CEC) Patterns

\n"; +echo "\n"; +echo "\n"; +echo "
\n"; //todo: get HCP userids/pws from the user } //----------------------------------------------------------------------------- -function patterns2() { -echo "\n"; -echo "\n"; -echo "\n"; -echo ""; -echo "\n"; -echo "\n"; -echo "\n"; -echo "\n"; -echo "\n"; +function patterns1b($action, $step) { +//todo: do validation of all pages that have input +savePostVars(); + +// Figure out how many switches there need to be +$hmcs = expandNR($_SESSION['hmcHostname']); +$bpas = expandNR($_SESSION['bpaHostname']); +$fsps = expandNR($_SESSION['fspHostname']); +//echo "

", implode(',',$hmcs), "

\n"; +$total = count($hmcs) + count($bpas) + count($fsps); +if (!$_SESSION['portsPerSwitch']) { $numswitches = 1; } +else { $numswitches = (integer) ((($total-1) / $_SESSION['portsPerSwitch']) + 1); } +//echo "

$numswitches

\n"; + +echo "

Building Blocks

(Subnet address in each Building Block)
\n"; +echo "\n"; + +$switches = expandNR($_SESSION['switchHostname']); +//todo: if count($switches) != $numswitches, then we have a problem +foreach ($switches as $k => $sw) { + $num = $k + 1; + echo "\n"; + } + +echo "\n"; +echo "\n"; +echo "

Switch Port Assignments

Discovery Information

\n"; +} + + +//----------------------------------------------------------------------------- +function patterns2($action, $step) { +savePostVars(); +echo "
\n"; + +// For now, many of the BB fields are disabled +echo "\n"; +echo "\n"; +echo ""; +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; +echo "\n"; echo "\n"; -echo "\n"; -echo "

Building Blocks

(Subnet address for nodes in each Building Block)

LPAR Information

\n"; +echo "\n"; +echo "
\n"; // do we need to get any info about the resources that should be in each lpar, or do we just divide them evenly? } - //----------------------------------------------------------------------------- -function preparemn() { +function preparemn($action, $step) { global $TOPDIR; -echo "
\n"; + +if ($step == 0) { + savePostVars(); + insertProgressTable(array('Write xCAT switch table.', + 'Write xCAT hosts table.', + 'Define networks.', + 'Configure DHCP.', + )); + if ($action != 'back') { echo ""; } + } + +elseif ($step == 1) { writeSwitchTable($step); } +elseif ($step == 2) { writeHostsTable($step); } +elseif ($step == 3) { setDynRange($_SESSION["dynamicIP"], $step); } +elseif ($step == 4) { makedhcp($step); } } //----------------------------------------------------------------------------- -function prediscover() { +// Using the hcp and switch ranges, write out the switch table +//todo: maybe should not use tabrestore in case we are just discovery additional hw +function writeSwitchTable($step) { +$hmcs = expandNR($_SESSION['hmcHostname']); +$bpas = expandNR($_SESSION['bpaHostname']); +$fsps = expandNR($_SESSION['fspHostname']); +$switches = expandNR($_SESSION['switchHostname']); +$numports = $_SESSION['portsPerSwitch']; +$data = array(array('#node,switch,port,vlan,interface,comments,disable')); +//echo "

\n"; +foreach ($switches as $k => $sw) { + $num = $k + 1; + $sequence = $_SESSION["switchSequence$num"]; + $seq = preg_split('/[\s,]+/', $sequence); + $port = 1; + foreach ($seq as $s) { // each $s is something like: FSP:5 + list($type, $num) = explode(':', $s); + if (preg_match('/^hmc$/i',$type)) $ar=&$hmcs; + elseif (preg_match('/^bpa$/i',$type)) $ar=&$bpas; + elseif (preg_match('/^fsp$/i',$type)) $ar=&$fsps; + else { msg('E', "Invalid HW control point type in $s"); return; } + if ($num == '*') { $num = count($ar); } + for ($i=1; $i<=$num; $i++) { + $node = array_shift($ar); + $data[] = array($node,$sw,$port); + /* $xml = docmd('nodeadd',NULL,array($node,'groups=all',"switch.node=$node","switch.switch=$sw","switch.port=$port")); + if (getXmlErrors($xml,$errors)) { msg('E',"nodeadd failed: " . implode(' ',$errors)); return; } + else { echo "Wrote: $node,$sw,$port
\n"; }*/ + if (++$port > $numports) break 2; + } + } + } +//echo "

\n"; ob_flush(); flush(); +//array_unshift($data, array('#node,switch,port,vlan,interface,comments,disable')); +$xml = doTabrestore('switch', $data); +//$errors = array(); +if (getXmlErrors($xml,$errors)) { msg('E',"tabrestore switch failed: " . implode(' ',$errors)); return; } + +// Send JSON data back to the browser. Todo: handle the errors too. +echo json_encode(array('step' => (integer)++$step, 'done' => FALSE, 'error' => '')); +} + + +//----------------------------------------------------------------------------- +// Using the hcp ranges, write out the hosts table +function writeHostsTable($step) { +$machines = array(); +$machines[$_SESSION['switchIP']] = expandNR($_SESSION['switchHostname']); +$machines[$_SESSION['hmcIP']] = expandNR($_SESSION['hmcHostname']); +$machines[$_SESSION['bpaIP']] = expandNR($_SESSION['bpaHostname']); +$machines[$_SESSION['fspIP']] = expandNR($_SESSION['fspHostname']); +$machines[$_SESSION['subnet']] = expandNR($_SESSION['computeNodename']); +$data = array(array('#node,ip,hostnames,comments,disable')); +//echo "

\n"; +foreach ($machines as $ip => $ar) { // this loop goes thru each type of hw + foreach ($ar as $hostname) { // this loop goes thru each of the hostnames for that type of hw + $data[] = array($hostname,$ip); + //echo "Wrote: $hostname,$ip
\n"; + incrementIP($ip); + } + } +//echo "

\n"; ob_flush(); flush(); +$xml = doTabrestore('hosts', $data); +$errors = array(); +if (getXmlErrors($xml,$errors)) { msg('E',"tabrestore hosts failed: " . implode(' ',$errors)); return; } + +// Send JSON data back to the browser. Todo: handle the errors too. +echo json_encode(array('step' => (integer)++$step, 'done' => FALSE, 'error' => '')); +} + + +//----------------------------------------------------------------------------- +function incrementIP(& $ip) { +$parts = explode('.', $ip); +$parts[3]++; +if ($parts[3] >= 255) { + $parts[2]++; $parts[3] = 1; + if ($parts[3] >= 255) { $parts[1]++; $parts[2] = 1; } // assume parts[1] is not 255, because we never increment the 1st field + } +$ip = implode('.', $parts); +} + + +//----------------------------------------------------------------------------- +//todo: we need a better way to change the networks table than tabdump/tabrestore. We can not use chtab because its not client/svr. We can not use chdef because there is no netname defined by makenetworks. +function setDynRange($range, $step) { +// Get the whole table via tabdump +$xml = docmd('tabdump','',array('networks')); +$data = array(); +foreach ($xml->children() as $response) foreach ($response->children() as $line) { + $line = (string) $line; + if(ereg("^#", $line)) { // handle the header specially + $data[] = array($line); + continue; + } + $values = splitTableFields($line); + $values[8] = '"' . $range . '"'; // dynamicrange is the 9th field + $data[] = $values; + } + +// Now restore that data back into the networks table +$xml = doTabrestore('networks', $data); +$errors = array(); +if (getXmlErrors($xml,$errors)) { msg('E',"tabrestore networks failed: " . implode(' ',$errors)); return; } + +// Send JSON data back to the browser. Todo: handle the errors too. +echo json_encode(array('step' => (integer)++$step, 'done' => FALSE, 'error' => '')); +} + + +//----------------------------------------------------------------------------- +function makedhcp($step) { +$xml = docmd('makedhcp',NULL,array('-n')); +$errors = array(); +if (getXmlErrors($xml,$errors)) { msg('E',"makedhcp failed: " . implode(' ',$errors)); return; } + +// Send JSON data back to the browser. Todo: handle the errors too. +echo json_encode(array('step' => (integer)++$step, 'done' => TRUE, 'error' => '')); +} + + +//----------------------------------------------------------------------------- +function prediscover($action, $step) { echo "
\n"; echo "

Do the following manual steps now:

\n"; echo "
  1. Power on all of the HMCs.
  2. \n"; @@ -111,64 +309,223 @@ echo "
\n"; //----------------------------------------------------------------------------- -function discover() { +function discover($action, $step) { global $TOPDIR; -//todo: run lsslp and show progress -echo "
\n"; -echo "

(This will show the list of hw discovered & located, including nodenames and IP addresses assigned, and then save all info to the DB.)

\n"; +if ($step == 0) { + insertProgressTable(array('Discover HMCs, BPAs, and FSPs.')); + if ($action != 'back') { echo ""; } + } + +elseif ($step == 1) { lsslp($step); } } //----------------------------------------------------------------------------- -function updatedefs() { -global $TOPDIR; -echo "
\n"; +//todo: we are just simulating lsslp right now +function lsslp($step) { +/* todo: show this +echo "

"; +echo "Discovered HMCs: ", $_SESSION['hmcHostname'], "
\n"; +echo "Discovered BPAs: ", $_SESSION['bpaHostname'], "
\n"; +echo "Discovered FSPs: ", $_SESSION['fspHostname'], "
\n"; +echo "

\n"; +*/ + +//$errors = array(); +$xml = docmd('nodeadd',NULL,array($_SESSION['hmcHostname'],'groups=hmc,all','nodetype.nodetype=hmc')); +if (getXmlErrors($xml,$errors)) { msg('E',"nodeadd hmc failed: " . implode(' ',$errors)); return; } + +$xml = docmd('nodeadd',NULL,array($_SESSION['bpaHostname'],'groups=bpa,all','nodetype.nodetype=bpa','nodehm.mgt=hmc','nodehm.power=hmc','ppc.comments=bpa','vpd.serial=|(\D+)(\d+)|($2)|','vpd.mtm=|(\D+)(\d+)|($1)|')); +if (getXmlErrors($xml,$errors)) { msg('E',"nodeadd bpa failed: " . implode(' ',$errors)); return; } + +// We are assuming there are 4 fsps in each bpa +$xml = docmd('nodeadd',NULL,array($_SESSION['fspHostname'],'groups=fsp,all','nodetype.nodetype=fsp','nodehm.mgt=hmc','nodehm.power=hmc','ppc.id=|\D+(\d+)|((($1-1)%4)+1)|','ppc.parent=|(\D+)(\d+)|b((($2-1)/4)+1)|','vpd.serial=|(\D+)(\d+)|($2)|','vpd.mtm=|(\D+)(\d+)|($1)|')); +if (getXmlErrors($xml,$errors)) { msg('E',"nodeadd fsp failed: " . implode(' ',$errors)); return; } + +/* +$xml = docmd('chdef',NULL,array('-t','group','bpa','serial=|(\D+)(\d+)|($2)|','mtm=|(\D+)(\d+)|($1)|')); +if (getXmlErrors($xml,$errors)) { msg('E',"chdef bpa failed: " . implode(' ',$errors)); return; } +$xml = docmd('chdef',NULL,array('-t','group','fsp','serial=|(\D+)(\d+)|($2)|','mtm=|(\D+)(\d+)|($1)|')); +if (getXmlErrors($xml,$errors)) { msg('E',"chdef fsp failed: " . implode(' ',$errors)); return; } +*/ + +// Send JSON data back to the browser. Todo: handle the errors too. +echo json_encode(array('step' => (integer)++$step, 'done' => TRUE, 'error' => '')); } //----------------------------------------------------------------------------- -function configurehcps() { +function updatedefs($action, $step) { global $TOPDIR; -echo "
\n"; +if ($step == 0) { + insertProgressTable(array('Determine which CECs each HMC should manage.', + 'Create HW control point node groups.', + 'Assign frame numbers.', + /* 'Assign supernode numbers and building block numbers.', + 'Assign building block subnets.', */ + 'Update name resolution.', + )); + if ($action != 'back') { echo ""; } + } + +elseif ($step == 1) { assigncecs($step); } +elseif ($step == 2) { createhcpgroups($step); } +elseif ($step == 3) { assignframenums($step); } +elseif ($step == 4) { nameres($step); } +} + + +//----------------------------------------------------------------------------- +function assigncecs($step) { +$numCECs = $_SESSION['numCECs']; +$hmcs = expandNR($_SESSION['hmcHostname']); +$bpas = expandNR($_SESSION['bpaHostname']); +$fsps = expandNR($_SESSION['fspHostname']); +$h = 0; // start with the 1st hmc +$f = 0; +$errors = array(); +// Go thru the fsps taking groups of numCECs and assigning them to the next hmc +while (TRUE) { + // Get the next group of fsps + $length = min($numCECs, count($fsps)-$f); + $fslice = array_slice($fsps, $f, $length); + $xml = docmd('nodech',implode(',',$fslice),array("ppc.hcp=$hmcs[$h]")); + if (getXmlErrors($xml,$errors)) { msg('E',"nodech fsp failed: " . implode(' ',$errors)); return; } + + // Decide if we are all out of fsps + $h++; + $f += $length; + if ($h>=count($hmcs) || $f>=count($fsps)) break; + } +//todo: how do we decide what bpas to assign to which hmcs? + +// Send JSON data back to the browser. Todo: handle the errors too. +echo json_encode(array('step' => (integer)++$step, 'done' => FALSE, 'error' => '')); +} + + +//----------------------------------------------------------------------------- +function createhcpgroups($step) { +//todo: may need to do this once we are using the real lsslp + +// Send JSON data back to the browser. Todo: handle the errors too. +echo json_encode(array('step' => (integer)++$step, 'done' => FALSE, 'error' => '')); +} + + +//----------------------------------------------------------------------------- +// Give frame numbers to each bpa +function assignframenums($step) { +$errors = array(); +$xml = docmd('nodech','bpa',array('ppc.id=|\D+(\d+)|($1)|')); +if (getXmlErrors($xml,$errors)) { msg('E',"nodech bpa failed: " . implode(' ',$errors)); return; } + +// Send JSON data back to the browser. Todo: handle the errors too. +echo json_encode(array('step' => (integer)++$step, 'done' => FALSE, 'error' => '')); +} + + +//----------------------------------------------------------------------------- +// Run makehosts and makedns +function nameres($step) { +$errors = array(); +$xml = docmd('makehosts',NULL,NULL); +if (getXmlErrors($xml,$errors)) { msg('E',"makehosts failed: " . implode(' ',$errors)); return; } +$xml = docmd('makedns',NULL,NULL); +if (getXmlErrors($xml,$errors)) { msg('E',"makedns failed: " . implode(' ',$errors)); return; } + +// Send JSON data back to the browser. Todo: handle the errors too. +echo json_encode(array('step' => (integer)++$step, 'done' => TRUE, 'error' => '')); +} + + +//----------------------------------------------------------------------------- +function configurehcps($action, $step) { +global $TOPDIR; +if ($step == 0) { + insertProgressTable(array('Assign CECs to their HMC.', + 'Set frame numbers in BPAs.', + 'Power on CECs to Standby.', + )); + if ($action != 'back') { echo ""; } + } + +elseif ($step == 1) { cecs2hmcs($step); } +elseif ($step == 2) { setframenum($step); } +elseif ($step == 3) { cecs2standby($step); } //todo: set HCP userids/pws } +function cecs2hmcs($step) {echo json_encode(array('step' => (integer)++$step, 'done' => FALSE, 'error' => ''));} +function setframenum($step) {echo json_encode(array('step' => (integer)++$step, 'done' => FALSE, 'error' => ''));} +function cecs2standby($step) {echo json_encode(array('step' => (integer)++$step, 'done' => TRUE, 'error' => ''));} + //----------------------------------------------------------------------------- -function createnodes() { +function createnodes($action, $step) { +global $TOPDIR; +//todo: need to show progress for each CEC +if ($step == 0) { + insertProgressTable(array('Create LPARs in each CEC and save node definitions in xCAT database.')); + if ($action != 'back') { echo ""; } + } + +elseif ($step == 1) { createlpars($step); } +} + + +//----------------------------------------------------------------------------- +function createlpars($step) { +$numlpars = $_SESSION['numLPARs']; +$fsps = expandNR($_SESSION['fspHostname']); +$nodes = expandNR($_SESSION['computeNodename']); +$samplenode = ''; //todo: ??? +$errors = array(); +$n = 0; // index into the nodes array +foreach ($fsps as $f) { + $length = min($numlpars, count($nodes)-$n); + $nslice = array_slice($nodes, $n, $length); + //todo: actually make the lpars + //$xml = docmd('mkvm',NULL,array($samplenode,'-i','1','-n',implode(',',$nslice))); + //if (getXmlErrors($xml,$errors)) { msg('E',"mkvm failed: " . implode(' ',$errors)); return; } + + // Decide if we are all out of nodes + $n += $length; + if ($n >= count($nodes)) break; + } + +//todo: Change this when mkvm is creating the base node definition. +// Also, the following assumes the node range starts with 1 and the fsp node range is simple. +// Really need to do individual nodeadd for each node. +$parts = array(); +preg_match('/^(\D+)/', $_SESSION['fspHostname'], $parts); +$fsp = $parts[1]; +$xml = docmd('nodeadd',NULL,array($_SESSION['computeNodename'],'groups=lpar,all','nodetype.nodetype=lpar,osi', + 'nodehm.mgt=hmc','nodehm.power=hmc','nodehm.cons=hmc','noderes.netboot=yaboot', + 'nodetype.arch=ppc64','ppc.id=|\D+(\d+)|((($1-1)%'.$numlpars.')+1)|', + 'ppc.parent=|(\D+)(\d+)|'.$fsp.'((($2-1)/'.$numlpars.')+1)|')); +if (getXmlErrors($xml,$errors)) { msg('E',"nodeadd nodes failed: " . implode(' ',$errors)); return; } + +echo json_encode(array('step' => (integer)++$step, 'done' => TRUE, 'error' => '')); +} + + + +//----------------------------------------------------------------------------- +// Currently not used. +function testhcps($action, $step) { global $TOPDIR; echo "
\n"; } //----------------------------------------------------------------------------- -function testhcps() { -global $TOPDIR; -echo "
\n"; -} - - -//----------------------------------------------------------------------------- -function done() { +function done($action, $step) { global $TOPDIR; echo "

Cluster set up successfully completed!

\n"; echo "

You can now view your node definitions and start to deploy nodes.

\n";