Index: /trunk/web/addons/toga/image.php
===================================================================
--- /trunk/web/addons/toga/image.php (revision 116)
+++ /trunk/web/addons/toga/image.php (revision 117)
@@ -2,5 +2,5 @@
include_once "./libtoga.php";
-$httpvars = new HTTPVariables( $HTTP_GET_VARS );
+$httpvars = new HTTPVariables( $HTTP_GET_VARS, $_GET );
$view = $httpvars->getHttpVar( "view" );
$clustername = $httpvars->getClusterName();
Index: /trunk/web/addons/toga/index.php
===================================================================
--- /trunk/web/addons/toga/index.php (revision 116)
+++ /trunk/web/addons/toga/index.php (revision 117)
@@ -1,20 +1,260 @@
getClusterName();
+$view = $httpvars->getHttpVar( "view" );
+
+if( !isset($view) ) $view = "overview";
+if( !isset($sortorder) ) $sortorder = "asc";
+if( !isset($sortby) ) $sortby = "id";
+
+function makeHeader() {
+
+ global $tpl, $grid, $context, $initgrid;
+ global $jobrange, $jobstart, $title;
+ global $page, $gridwalk, $clustername;
+ global $parentgrid, $physical, $hostname;
+ global $self;
+
+ if ( $context == "control" && $controlroom < 0 )
+ $header = "header-nobanner";
+ else
+ $header = "header";
+
+ # Maintain our path through the grid tree.
+ $me = $self . "@" . $grid[$self][AUTHORITY];
+
+ if ($initgrid) {
+ $gridstack = array();
+ $gridstack[] = $me;
+ } else if ($gridwalk=="fwd") {
+ # push our info on gridstack, format is "name@url>name2@url".
+ if (end($gridstack) != $me) {
+ $gridstack[] = $me;
+ }
+ } else if ($gridwalk=="back") {
+ # pop a single grid off stack.
+ if (end($gridstack) != $me) {
+ array_pop($gridstack);
+ }
+ }
+
+ $gridstack_str = join(">", $gridstack);
+ $gridstack_url = rawurlencode($gridstack_str);
+
+ if ($initgrid or $gridwalk) {
+ # Use cookie so we dont have to pass gridstack around within this site.
+ # Cookie values are automatically urlencoded. Expires in a day.
+ setcookie("gs", $gridstack_str, time() + 86400);
+ }
+
+ # Invariant: back pointer is second-to-last element of gridstack. Grid stack never
+ # has duplicate entries.
+ list($parentgrid, $parentlink) = explode("@", $gridstack[count($gridstack)-2]);
+
+ # Setup a redirect to a remote server if you choose a grid from pulldown menu. Tell
+ # destination server that we're walking foward in the grid tree.
+ if (strstr($clustername, "http://")) {
+ $tpl->assign("refresh", "0");
+ $tpl->assign("redirect", ";URL=$clustername?gw=fwd&gs=$gridstack_url");
+ echo "
Redirecting, please wait...
";
+ $tpl->printToScreen();
+ exit;
+ }
+
+ $tpl->assign( "refresh", $default_refresh );
+ $tpl->assign( "date", date("r") );
+ $tpl->assign( "page_title", $title );
+
+ # The page to go to when "Get Fresh Data" is pressed.
+ if (isset($page))
+ $tpl->assign("page",$page);
+ else
+ $tpl->assign("page","./");
+
+ # Templated Logo image
+ $tpl->assign("images","./templates/$template_name/images");
+
+ #
+ # Used when making graphs via graph.php. Included in most URLs
+ #
+ $sort_url=rawurlencode($sort);
+ $get_metric_string = "m=$metric&r=$range&s=$sort_url&hc=$hostcols";
+
+ if ($jobrange and $jobstart)
+ $get_metric_string .= "&jr=$jobrange&js=$jobstart";
+
+ # Set the Alternate view link.
+ $cluster_url=rawurlencode($clustername);
+ $node_url=rawurlencode($hostname);
+
+ # Make some information available to templates.
+ $tpl->assign("cluster_url", $cluster_url);
+ # Build the node_menu
+ $node_menu = "";
+
+ if ($parentgrid) {
+ $node_menu .= "$parentgrid $meta_designator ";
+ $node_menu .= ">\n";
+ }
+
+ # Show grid.
+ $mygrid = ($self == "unspecified") ? "" : $self;
+ $node_menu .= "$mygrid $meta_designator ";
+ $node_menu .= ">\n";
+
+ if ($physical)
+ $node_menu .= hiddenvar("p", $physical);
+
+ if ( $clustername ) {
+ $url = rawurlencode($clustername);
+ $node_menu .= "$clustername ";
+ //$node_menu .= ">\n";
+ $node_menu .= hiddenvar("c", $clustername);
+ }
+
+ $tpl->assign("node_menu", $node_menu);
+
+ # Make sure that no data is cached..
+ header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); # Date in the past
+ header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); # always modified
+ header ("Cache-Control: no-cache, must-revalidate"); # HTTP/1.1
+ header ("Pragma: no-cache"); # HTTP/1.0
+}
+
+function makeFooter() {
+ global $tpl, $version, $parsetime;
+
+ $tpl->assign("webfrontend-version",$version["webfrontend"]);
+ $tpl->assign("togaweb-version", "0.1");
+ $tpl->assign("togaarch-version", "0.1");
+ $tpl->assign("togaplug-version", "0.1");
+
+ if ($version["gmetad"]) {
+ $tpl->assign("webbackend-component", "gmetad");
+ $tpl->assign("webbackend-version",$version["gmetad"]);
+ } else if ($version["gmond"]) {
+ $tpl->assign("webbackend-component", "gmond");
+ $tpl->assign("webbackend-version", $version["gmond"]);
+ }
+
+ $tpl->assign("parsetime", sprintf("%.4f", $parsetime) . "s");
+}
+
+function includeJobview() {
+ global $tpl;
+
+ $tpl->assignInclude( "main", "templates/jobview.tpl" );
+}
+
+function includeOverview() {
+ global $tpl;
+
+ $tpl->assignInclude( "main", "templates/overview.tpl" );
+}
+
+function makeJobview() {
+
+}
+
+//function makeOverview() {
+//
+// global $jobs, $nodes, $heartbeat, $clustername;
+
+// foreach( $jobs as $jobid => $jobattrs ) {
+//
+// $report_time = $jobattrs[reported];
+
+// if( $report_time == $heartbeat ) {
+
+// $tpl->newBlock("node");
+// $tpl->assign( "clustername", $clustername );
+// $tpl->assign("id", $jobid );
+// $tpl->assign("state", $jobattrs[status] );
+// $tpl->assign("user", $jobattrs[owner] );
+// $tpl->assign("queue", $jobattrs[queue] );
+// $tpl->assign("name", $jobattrs[name] );
+// $tpl->assign("req_cpu", $jobattrs[requested_time] );
+// $tpl->assign("req_memory", $jobattrs[requested_memory] );
+// $nodes = count( $jobattrs[nodes] );
+// $ppn = (int) $jobattrs[ppn] ? $jobattrs[ppn] : 1;
+// $cpus = $nodes * $ppn;
+// $tpl->assign("nodes", $nodes );
+// $tpl->assign("cpus", $cpus );
+// $start_time = (int) $jobattrs[start_timestamp];
+
+// if( $start_time ) {
+
+// $runningtime = makeTime( $report_time - $start_time );
+// $tpl->assign("started", makeDate( $start_time ) );
+// $tpl->assign("runningtime", $runningtime );
+// }
+// }
+// }
+//}
+
+$tpl = new TemplatePower( "templates/index.tpl" );
+
+$tpl->assignInclude( "header", "templates/header.tpl" );
+
+switch( $view ) {
+
+ case "overview":
+
+ includeOverview();
+ break;
+
+ case "jobview":
+
+ includeJobview();
+ break;
+
+ default:
+
+ includeOverview();
+ break;
+}
+
+$tpl->assignInclude( "footer", "templates/footer.tpl" );
+$tpl->prepare();
+
+$title = "Torque Report";
+makeHeader();
+
+switch( $view ) {
+
+ case "overview":
+
+ include "./overview.php";
+ makeOverview();
+ break;
+
+ case "jobview":
+
+ makeJobview();
+ break;
+
+ default:
+
+ makeOverview();
+ break;
+}
+
+makeFooter();
+
+$tpl->printToScreen();
?>
Index: /trunk/web/addons/toga/libtoga.php
===================================================================
--- /trunk/web/addons/toga/libtoga.php (revision 116)
+++ /trunk/web/addons/toga/libtoga.php (revision 117)
@@ -1,3 +1,9 @@
restvars = array();
- $this->clustername = $vars["c"] ? $vars["c"] : null;
- $this->metricname = $vars["m"] ? $vars["m"] : null;
-
- foreach( $vars as $httpvar => $httpval ) {
+ $this->clustername = $httpvars["c"] ? $httpvars["c"] : null;
+ $this->metricname = $httpvars["m"] ? $httpvars["m"] : null;
+
+ foreach( $httpvars as $httpvar => $httpval ) {
if( $httpval ) {
$this->restvars[$httpvar] = $httpval;
+ }
+ }
+
+ foreach( $getvars as $getvar => $getval ) {
+
+ if( $getval ) {
+ $this->restvars[$getvar] = $getval;
}
}
@@ -40,12 +53,22 @@
include_once "./conf.php";
-global $GANGLIA_PATH, $SMALL_CLUSTERIMAGE_MAXWIDTH, $SMALL_CLUSTERIMAGE_NODEWIDTH, $DATA_SOURCE;
-
-include_once "$GANGLIA_PATH/conf.php";
-include_once "$GANGLIA_PATH/functions.php";
-include_once "$GANGLIA_PATH/ganglia.php";
-
-global $HTTP_GET_VARS;
-$httpvars = new HTTPVariables( $HTTP_GET_VARS );
+global $GANGLIA_PATH;
+
+$my_dir = getcwd();
+
+// Load Ganglia's PHP
+chdir( $GANGLIA_PATH );
+
+include_once "./conf.php";
+include_once "./functions.php";
+include_once "./ganglia.php";
+include_once "./get_context.php";
+include_once "./get_ganglia.php";
+
+// Back to our PHP
+chdir( $my_dir );
+
+global $SMALL_CLUSTERIMAGE_MAXWIDTH, $SMALL_CLUSTERIMAGE_NODEWIDTH, $DATA_SOURCE, $HTTP_GET_VARS, $_GET;
+$httpvars = new HTTPVariables( $HTTP_GET_VARS, $_GET );
// Set cluster context so that Ganglia will
@@ -53,8 +76,6 @@
//
global $context, $clustername;
-$clustername = $httpvars->getClusterName();
-$context = 'cluster';
-
-include_once "$GANGLIA_PATH/get_ganglia.php";
+//$clustername = $httpvars->getClusterName();
+//$context = 'cluster';
// Ganglia's array of host metrics
@@ -62,9 +83,4 @@
global $metrics;
-// If php is compiled without globals
-//
-if ( !empty( $_GET ) ) {
- extract( $_GET );
-}
class DataSource {
Index: /trunk/web/addons/toga/overview.php
===================================================================
--- /trunk/web/addons/toga/overview.php (revision 116)
+++ /trunk/web/addons/toga/overview.php (revision 117)
@@ -1,30 +1,13 @@
getClusterName();
-printf( "clustername = %s\n", $clustername );
-$queue_select = $httpvars->getHttpVar( "queue" );
-printf( "queue = %s\n", $queue );
+global $GANGLIA_PATH, $clustername, $tpl;
$data_gatherer = new DataGatherer();
-$tpl = new TemplatePower("templates/overview.tpl");
-$tpl->prepare();
-
-$tpl->assign( "self", "./index.php" );
+//$tpl->assign( "self", "./index.php" );
$tpl->assign( "clustername", $clustername );
-
$tpl->assign( "clusterimage", "./image.php?c=".rawurlencode($clustername)."&view=big-clusterimage" );
$data_gatherer->parseXML();
+
$heartbeat = $data_gatherer->getHeartbeat();
$jobs = $data_gatherer->getJobs();
@@ -214,36 +197,130 @@
}
-foreach( $jobs as $jobid => $jobattrs ) {
-
- $report_time = $jobattrs[reported];
-
- if( $report_time == $heartbeat ) {
-
- $tpl->newBlock("node");
- $tpl->assign( "clustername", $clustername );
- $tpl->assign("id", $jobid );
- $tpl->assign("state", $jobattrs[status] );
- $tpl->assign("user", $jobattrs[owner] );
- $tpl->assign("queue", $jobattrs[queue] );
- $tpl->assign("name", $jobattrs[name] );
- $tpl->assign("req_cpu", $jobattrs[requested_time] );
- $tpl->assign("req_memory", $jobattrs[requested_memory] );
- $nodes = count( $jobattrs[nodes] );
- $ppn = (int) $jobattrs[ppn] ? $jobattrs[ppn] : 1;
- $cpus = $nodes * $ppn;
- $tpl->assign("nodes", $nodes );
- $tpl->assign("cpus", $cpus );
- $start_time = (int) $jobattrs[start_timestamp];
-
- if( $start_time ) {
-
- $runningtime = makeTime( $report_time - $start_time );
- $tpl->assign("started", makeDate( $start_time ) );
- $tpl->assign("runningtime", $runningtime );
+
+function sortJobs( $jobs, $sortby, $sortorder ) {
+
+ $sorted = array();
+
+ $cmp = create_function( '$a, $b',
+ "global \$sortby, \$sortorder;".
+
+ "if( \$a == \$b ) return 0;".
+
+ "if (\$sortorder==\"desc\")".
+ "return ( \$a < \$b ) ? 1 : -1;".
+ "else if (\$sortorder==\"asc\")".
+ "return ( \$a > \$b ) ? 1 : -1;" );
+
+ foreach( $jobs as $jobid => $jobattrs ) {
+
+ $state = $jobattrs[status];
+ $user = $jobattrs[owner];
+ $queue = $jobattrs[queue];
+ $name = $jobattrs[name];
+ $req_cpu = $jobattrs[requested_time];
+ $req_memory = $jobattrs[requested_memory];
+ $nodes = count( $jobattrs[nodes] );
+ $ppn = (int) $jobattrs[ppn] ? $jobattrs[ppn] : 1;
+ $cpus = $nodes * $ppn;
+ $start_time = (int) $jobattrs[start_timestamp];
+ $runningtime = $report_time - $start_time;
+
+ switch( $sortby ) {
+ case "id":
+ $sorted[$jobid] = $jobid;
+ break;
+
+ case "state":
+ $sorted[$jobid] = $state;
+ break;
+
+ case "user":
+ $sorted[$jobid] = $user;
+ break;
+
+ case "queue":
+ $sorted[$jobid] = $queue;
+ break;
+
+ case "name":
+ $sorted[$jobid] = $name;
+ break;
+
+ case "req_cpu":
+ $sorted[$jobid] = $req_cpu;
+ break;
+
+ case "req_mem":
+ $sorted[$jobid] = $req_memory;
+ break;
+
+ case "nodes":
+ $sorted[$jobid] = $nodes;
+ break;
+
+ case "cpus":
+ $sorted[$jobid] = $cpus;
+ break;
+
+ case "start":
+ $sorted[$jobid] = $start_time;
+ break;
+
+ case "runningtime":
+ $sorted[$jobid] = $runningtime;
+ break;
+
+ default:
+ break;
+
+ }
+ }
+
+ uasort( $sorted, $cmp );
+
+ return $sorted;
+}
+
+function makeOverview() {
+
+ global $jobs, $nodes, $heartbeat, $clustername, $tpl;
+ global $sortorder, $sortby;
+
+ $tpl->assign("sortorder", $sortorder );
+ $tpl->assign("sortby", $sortby );
+
+
+ $sorted_jobs = sortJobs( $jobs, $sortby, $sortorder );
+
+ foreach( $sorted_jobs as $jobid => $sortdec ) {
+
+ $report_time = $jobs[$jobid][reported];
+
+ if( $report_time == $heartbeat ) {
+
+ $tpl->newBlock("node");
+ $tpl->assign( "clustername", $clustername );
+ $tpl->assign("id", $jobid );
+ $tpl->assign("state", $jobs[$jobid][status] );
+ $tpl->assign("user", $jobs[$jobid][owner] );
+ $tpl->assign("queue", $jobs[$jobid][queue] );
+ $tpl->assign("name", $jobs[$jobid][name] );
+ $tpl->assign("req_cpu", $jobs[$jobid][requested_time] );
+ $tpl->assign("req_memory", $jobs[$jobid][requested_memory] );
+ $nodes = count( $jobs[$jobid][nodes] );
+ $ppn = (int) $jobs[$jobid][ppn] ? $jobs[$jobid][ppn] : 1;
+ $cpus = $nodes * $ppn;
+ $tpl->assign("nodes", $nodes );
+ $tpl->assign("cpus", $cpus );
+ $start_time = (int) $jobs[$jobid][start_timestamp];
+
+ if( $start_time ) {
+
+ $runningtime = makeTime( $report_time - $start_time );
+ $tpl->assign("started", makeDate( $start_time ) );
+ $tpl->assign("runningtime", $runningtime );
+ }
}
}
}
-
-$tpl->printToScreen();
-
?>
Index: /trunk/web/addons/toga/templates/header.tpl
===================================================================
--- /trunk/web/addons/toga/templates/header.tpl (revision 116)
+++ /trunk/web/addons/toga/templates/header.tpl (revision 117)
@@ -45,4 +45,5 @@
+
Index: /trunk/web/addons/toga/templates/index.tpl
===================================================================
--- /trunk/web/addons/toga/templates/index.tpl (revision 117)
+++ /trunk/web/addons/toga/templates/index.tpl (revision 117)
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
Index: /trunk/web/addons/toga/templates/overview.tpl
===================================================================
--- /trunk/web/addons/toga/templates/overview.tpl (revision 117)
+++ /trunk/web/addons/toga/templates/overview.tpl (revision 117)
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+ reported: {heartbeat}
+ |
+
+
+ |
+
+
+
+
+
+
+
+
+
+
+