showexp_list.php3 22.5 KB
Newer Older
1
<?php
Leigh B. Stoller's avatar
Leigh B. Stoller committed
2 3
#
# EMULAB-COPYRIGHT
4
# Copyright (c) 2000-2007 University of Utah and the Flux Group.
Leigh B. Stoller's avatar
Leigh B. Stoller committed
5 6
# All rights reserved.
#
7 8 9 10 11
include("defs.php3");

#
# Standard Testbed Header
#
12
PAGEHEADER("Experiment Information Listing");
13 14

#
15
# Only known and logged in users.
16
#
17 18 19
$this_user = CheckLoginOrDie();
$uid       = $this_user->uid();
$isadmin   = ISADMIN();
20

21 22 23 24 25
#
# Verify Page arguments.
#
$optarg = OptionalPageArguments("showtype",   PAGEARG_STRING,
				"sortby",     PAGEARG_STRING,
Leigh B. Stoller's avatar
Leigh B. Stoller committed
26
				"thumb",      PAGEARG_INTEGER,
27 28
				"noignore",   PAGEARG_BOOLEAN);

29 30
$clause      = 0;
$having      = "";
31 32
$active      = 0;
$idle        = 0;
33

34 35 36 37 38
#
# Hack for NSDI deadline. Generalize later.
#
$openlist        = TBGetSiteVar("general/open_showexplist");
$openlist_member = 0;
39 40
$openlist_join   = "";
$openlist_clause = "";
41
if (!$isadmin && isset($openlist) && $openlist != "") {
42 43 44
    if (! ($project = Project::Lookup($openlist))) {
	TBERROR("Could not map project $openlist to its object", 1);
    }
45
    $openlist_member =
46
	TBMinTrust($project->UserTrust($this_user), $TBDB_TRUST_USER);
47 48 49 50 51 52
    $openlist_join =
	" left join group_membership as g on ".
	"     g.uid=e.expt_swap_uid and g.pid='$openlist' and g.pid=g.gid ";
    $openlist_clause = " and g.uid is not null ";
}

Leigh B. Stoller's avatar
Leigh B. Stoller committed
53 54
if (! isset($showtype))
    $showtype="active";
55 56
if (! isset($sortby))
    $sortby = "normal";
57 58
if (! isset($thumb)) 
    $thumb = 0;
59 60
if (! isset($noignore)) 
    $noignore = 0;
61

62
echo "<b>Show: ";
63

64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
if ($showtype != "active") {
    echo "<a class='static' href='showexp_list.php3?showtype=active&sortby=$sortby&thumb=$thumb'>Active</a>, ";
} else {
    echo "Active, ";
}

if ($showtype != "batch") {
    echo "<a class='static' href='showexp_list.php3?showtype=batch&sortby=$sortby&thumb=$thumb'>Batch</a>, ";
} else {
    echo "Batch, ";
}

if ($isadmin) {
    if ($showtype != "idle") {
	echo "<a class='static' href='showexp_list.php3?showtype=idle&sortby=$sortby&thumb=$thumb'>Idle</a>, ";
    } else {
	echo "Idle, ";
    }
}

if ($showtype != "all") {
    echo "<a class='static' href='showexp_list.php3?showtype=all&sortby=$sortby&thumb=$thumb'>All</a>";
} else {
    echo "All";
}

echo "</b><br />\n";

92 93
# Default value for showlastlogin is 1 for admins
$showlastlogin = $isadmin;
94
# Note: setting this to 1 for non-admins still does not make the column
95 96
# show properly... it just shows the header in the table, over the
# wrong column. 
Leigh B. Stoller's avatar
Leigh B. Stoller committed
97

98 99
# How many hours is considered idle...
$idlehours = TBGetSiteVar("idle/threshold");
100

Leigh B. Stoller's avatar
Leigh B. Stoller committed
101 102 103 104 105 106 107
#
# Handle showtype
# 
if (! strcmp($showtype, "all")) {
    $title  = "All";
}
elseif (! strcmp($showtype, "active")) {
108 109
    # Active is now defined as "having nodes reserved" - we just depend on
    # the fact that we skip expts with no nodes further down...
110 111 112
    # But for speed, explicitly exclude expts that say they are "swapped"
    # (leave in activating, swapping, etc.)
    $clause = "e.state !='$TB_EXPTSTATE_SWAPPED'";
Leigh B. Stoller's avatar
Leigh B. Stoller committed
113
    $title  = "Active";
114
    $having = "having (ncount>0)";
115
    $active = 1;
Leigh B. Stoller's avatar
Leigh B. Stoller committed
116 117
}
elseif (! strcmp($showtype, "batch")) {
118 119
    $clause = "(e.batchmode=1 and e.state!='" .
               $TB_EXPTSTATE_SWAPPED . "')";
Leigh B. Stoller's avatar
Leigh B. Stoller committed
120
    $title  = "Batch";
121
}
122
elseif ((!strcmp($showtype, "idle")) && $isadmin ) {
123
    # Do not put active in the clause for same reason as active
124 125
    # However, it takes a long time with so many swapped expts
    $clause = "e.state !='$TB_EXPTSTATE_SWAPPED'";
126
    $title  = "Idle";
127 128
    #$having = "having (lastswap>=1)"; # At least one day since swapin
    $having = "having (lastswap>=0)";
129
    $idle = 1;
130
    $showlastlogin = 0; # do not show a lastlogin column
131
}
132
else {
133
    # See active above
Leigh B. Stoller's avatar
Leigh B. Stoller committed
134
    $title  = "Active";
135
    $having = "having (ncount>0)";
136
    $active = 1;
137
}
138

139 140 141


if (!$idle) {
142 143 144
    echo "<b>View: ";

    if ($thumb != 0) {
145
	echo "<a class='static' href='showexp_list.php3?showtype=$showtype&sortby=$sortby&thumb=0'>";
146 147 148 149 150 151 152 153
	echo "List";
        echo "</a>";
    } else {
        echo "List";
    }
    echo ", ";

    if ($thumb != 1) {
154
	echo "<a class='static' href='showexp_list.php3?showtype=$showtype&sortby=$sortby&thumb=1'>";
155 156
	echo "Detailed Thumbnails";
        echo "</a>";
157
    } else {
158
        echo "Detailed Thumbnails";
159
    }
160 161 162
    echo ", ";

    if ($thumb != 2) {
163
	echo "<a class='static' href='showexp_list.php3?showtype=$showtype&sortby=$sortby&thumb=2'>";
164 165 166 167 168 169
	echo "Brief Thumbnails";
        echo "</a>";
    } else {
        echo "Brief Thumbnails";
    }
    echo "</b><br />\n";
170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210

if ($thumb && !$idle) {
    echo "<b>Sort by: ";
    if (isset($sortby) && $sortby != "normal" && $sortby != "pid") {
	echo "<a class='static' href='showexp_list.php3?showtype=$showtype&sortby=pid&thumb=$thumb'>";
	echo "Project";
        echo "</a>, ";
    } else {
        echo "Project, ";
    }	
    if ($sortby != "eid") {
	echo "<a class='static' href='showexp_list.php3?showtype=$showtype&sortby=eid&thumb=$thumb'>";
	echo "Experiment ID";
        echo "</a>, ";
    } else {
        echo "Experiment ID, ";
    }
    if ($sortby != "pcs") {
	echo "<a class='static' href='showexp_list.php3?showtype=$showtype&sortby=pcs&thumb=$thumb'>";
	echo "Node Usage";
        echo "</a>, ";
    } else {
        echo "Node Usage, ";
    }	
    if ($sortby != "name") {
	echo "<a class='static' href='showexp_list.php3?showtype=$showtype&sortby=name&thumb=$thumb'>";
	echo "Experiment Description";
        echo "</a>, ";
    } else {
        echo "Experiment Description, ";
    }	
    if ($sortby != "uid") {
	echo "<a class='static' href='showexp_list.php3?showtype=$showtype&sortby=uid&thumb=$thumb'>";
	echo "Creator";
        echo "</a>";
    } else {
        echo "Creator";
    }

    echo "</b><br />\n";
}
211
}
212
 
213 214
echo "<br />\n";

Leigh B. Stoller's avatar
Leigh B. Stoller committed
215 216 217
#
# Handle sortby.
# 
218 219 220 221 222 223 224 225 226
if (! strcmp($sortby, "normal") ||
    ! strcmp($sortby, "pid"))
    $order = "e.pid,e.eid";
elseif (! strcmp($sortby, "eid"))
    $order = "e.eid,e.expt_head_uid";
elseif (! strcmp($sortby, "uid"))
    $order = "e.expt_head_uid,e.pid,e.eid";
elseif (! strcmp($sortby, "name"))
    $order = "e.expt_name";
227
elseif (! strcmp($sortby, "pcs"))
228
    $order = "ncount DESC,e.pid,e.eid";
229 230
elseif (! strcmp($sortby, "idle"))
    $order = "canbeidle desc,idle_ignore,idlesec DESC,ncount desc,e.pid,e.eid";
231 232 233
else 
    $order = "e.pid,e.eid";

234 235 236 237
#
# Show a menu of all experiments for all projects that this uid
# is a member of. Or, if an admin type person, show them all!
#
238 239 240 241 242
if ($clause) {
    $clause = "and ($clause)";
} else {
    $clause = "";
}
243 244 245

# Notes about the queries below:
# - idle is fudged by 121 seconds so that in the five minutes between 
246
#   slothd reports we do not get active expts showing up as idle for 0.1 hrs
247

248
if ($isadmin || $openlist_member) {
Leigh B. Stoller's avatar
Leigh B. Stoller committed
249
    $experiments_result =
250 251 252 253 254 255 256 257
	DBQueryFatal("
select e.*, date_format(expt_swapped,'%Y-%m-%d') as d, 
date_format(expt_swapped,'%c/%e') as dshort, 
(to_days(now())-to_days(expt_swapped)) as lastswap, 
count(r.node_id) as ncount, swap_requests, 
round((unix_timestamp(now())-unix_timestamp(last_swap_req))/3600,1) as lastreq,
(unix_timestamp(now()) - unix_timestamp(max(greatest(
last_tty_act,last_net_act,last_cpu_act,last_ext_act)))) as idlesec,
258
(max(last_report) is not null) as canbeidle, s.rsrcidx
259
from experiments as e 
260 261
left join reserved as r on e.pid=r.pid and e.eid=r.eid
left join experiment_stats as s on e.idx=s.exptidx
262 263
left join nodes as n on r.node_id=n.node_id
left join node_activity as na on r.node_id=na.node_id
264 265
$openlist_join
where (n.type!='dnard' or n.type is null) $clause $openlist_clause
266
group by e.pid,e.eid $having order by $order");
267 268
}
else {
Leigh B. Stoller's avatar
Leigh B. Stoller committed
269
    $experiments_result =
270 271 272 273 274
	DBQueryFatal("
select distinct e.*, date_format(expt_swapped,'%Y-%m-%d') as d, 
date_format(expt_swapped,'%c/%e') as dshort, count(r.node_id) as ncount, 
(unix_timestamp(now()) - unix_timestamp(max(greatest(
last_tty_act,last_net_act,last_cpu_act,last_ext_act)))) as idlesec,
275
(max(last_report) is not null) as canbeidle, s.rsrcidx
276 277
from group_membership as g 
left join experiments as e on g.pid=e.pid and g.pid=g.gid 
278
left join experiment_stats as s on e.idx=s.exptidx
279 280 281 282 283 284
left join reserved as r on e.pid=r.pid and e.eid=r.eid 
left join nodes as n on r.node_id=n.node_id 
left join node_activity as na on r.node_id=na.node_id
where (n.type!='dnard' or n.type is null) and 
 g.uid='$uid' and e.pid is not null and e.eid is not null $clause 
group by e.pid,e.eid $having order by $order");    
285
}
286
if (! mysql_num_rows($experiments_result)) {
287 288
    USERERROR("There are no experiments running in any of the projects ".
              "you are a member of.", 1);
289 290
}

291 292
if (mysql_num_rows($experiments_result)) {
    echo "<center>
Leigh B. Stoller's avatar
Leigh B. Stoller committed
293
           <h2>$title Experiments</h2>
294
          </center>\n";
295

296
    if ($idle) {
297
      echo "<p><center><b>Experiments that have been idle at least 
298 299 300 301 302 303
$idlehours hours</b><br>\n";
      if ($noignore) {
        echo "<a class='static' href='showexp_list.php3?showtype=idle&sortby=$sortby&thumb=$thumb'>\n
Exclude idle-ignore experiments</a></center></p><br />\n";
      } else {
        echo "<a class='static' href='showexp_list.php3?showtype=idle&sortby=$sortby&thumb=$thumb&noignore=1'>\n
304
Include idle-ignore experiments</a></center></p><br />\n";
305
      }
306
    }
307
    
308
    $idlemark = "<b>*</b>";
309 310 311
    $stalemark = "<b>?</b>";
    $parens = 0;
    
312 313 314 315 316 317 318
    #
    # Okay, I decided to do this as one big query instead of a zillion
    # per-exp queries in the loop below. No real reason, except my personal
    # desire not to churn the DB.
    # 
    $total_usage  = array();
    $perexp_usage = array();
319
    $perexp_types = array();
320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341

    #
    # Geta all the classes of nodes each experiment is using, and create
    # a two-D array with their counts.
    # 
    $usage_query =
	DBQueryFatal("select r.pid,r.eid,nt.class, ".
		     "  count(nt.class) as ncount ".
		     "from reserved as r ".
		     "left join nodes as n on r.node_id=n.node_id ".
		     "left join node_types as nt on n.type=nt.type ".
		     "where n.type!='dnard' ".
		     "group by r.pid,r.eid,nt.class");

    while ($row = mysql_fetch_array($usage_query)) {
	$pid   = $row[0];
	$eid   = $row[1];
	$class = $row[2];
	$count = $row[3];
	
	$perexp_usage["$pid:$eid"][$class] = $count;
    }
342

343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362
    #
    # Geta all the types of nodes each experiment is using, and create
    # a two-D array with their counts.
    # 
    $usage_query =
	DBQueryFatal("select r.pid,r.eid,n.type, ".
		     "  count(n.type) as ncount ".
		     "from reserved as r ".
		     "left join nodes as n on r.node_id=n.node_id ".
		     "group by r.pid,r.eid,n.type");

    while ($row = mysql_fetch_array($usage_query)) {
	$pid   = $row[0];
	$eid   = $row[1];
	$type  = $row[2];
	$count = $row[3];
	
	$perexp_types["$pid:$eid"][$type] = $count;
    }

363 364 365
    #
    # Now shove out the column headers.
    #
366
if ($thumb && !$idle) {
367 368 369 370 371
    if ($thumb == 2) {
	echo "<table border=2 cols=4 cellpadding=2 cellspacing=2 align=center><tr>";
    } else {
	echo "<table border=2 cols=2 cellpadding=2 cellspacing=2 align=center><tr>";
    }
372 373 374 375 376 377 378
    $thumbCount = 0;
 
    while ($row = mysql_fetch_array($experiments_result)) {	
	$pid  = $row["pid"];
	$eid  = $row["eid"]; 
	$huid = $row["expt_head_uid"];
	$name = stripslashes($row["expt_name"]);
379
	$date = $row["dshort"];
380
        $rsrcidx = $row["rsrcidx"];
381 382 383 384 385

	if (! ($head_user = User::Lookup($huid))) {
	    TBERROR("Could not lookup object for user $huid", 1);
	}
	$showuser_url = CreateURL("showuser", $head_user);
386 387
	
	if ($idle && ($str=="&nbsp;" || !$pcs)) { continue; }
388

389 390 391 392
	if ($thumb == 2) {
	    if ($pid != "emulab-ops") {
		echo "<td align=center>".
		     "<a href='shownsfile.php3?pid=$pid&eid=$eid'>".
393
		     "<img border=1 class='stealth' ".
394 395
		     " src='showthumb.php3?idx=$rsrcidx'>".
		     "<br>\n".
396 397 398 399 400
		     "<b>".
		     "<a href='showproject.php3?pid=$pid'>$pid</a>/<br />".
		     "<a href='showexp.php3?pid=$pid&eid=$eid'>$eid</a>".
		     "</b>".
		     "</td>";
401

Leigh B. Stoller's avatar
Leigh B. Stoller committed
402 403
		$thumbCount++;
		if (($thumbCount % 4) == 0) { echo "</tr><tr>\n"; }
404 405 406 407 408 409
	    }
	} else {

	    echo "<td>".
		 "<table border=0 cellpadding=4 cellspacing=0>".
		 "<tr>".
410
		 "<td width=160 align=center>".
411
	         "<a href='shownsfile.php3?pid=$pid&eid=$eid'>".
412
		 "<img border=1 class='stealth' ".
413
		 " src='showthumb.php3?idx=$rsrcidx'>".
414 415 416 417 418 419 420 421 422 423
	         "</a>".
                 "</td>".
	         "<td align=left class='paddedcell'>".
	         "<b>".
 	         "<a href='showproject.php3?pid=$pid'>$pid</a>/".
                 "<a href='showexp.php3?pid=$pid&eid=$eid'>$eid</a>".
	         "</b>".
	         "<br />\n".
	         "<b><font size=-1>$name</font></b>".
                 "<br />\n";
424 425


426 427 428 429 430 431 432 433 434
	    if ($isadmin) {
		$swappable= $row["swappable"];
		$swapreq=$row["swap_requests"];
		$lastswapreq=$row["lastreq"];
		$lastlogin = "";
		if ($lastexpnodelogins = TBExpUidLastLogins($pid, $eid)) {
		    $daysidle=$lastexpnodelogins["daysidle"];
		    #if ($idle && $daysidle < 1)
		    #  continue;
435
		    $lastlogin .= $lastexpnodelogins["shortdate"] . " " .
436 437 438
			"(" . $lastexpnodelogins["uid"] . ")";
		} elseif ($state=="active") {
		    $daysidle=$row["lastswap"];
439
		    $lastlogin .= "$date swapin";
440 441 442 443 444 445
		}
		# if ($lastlogin=="") { $lastlogin="<td>&nbsp;</td>\n"; }
		if ($lastlogin != "") {
		    echo "<font size=-2><b>Last Login:</b> $lastlogin</font><br />\n";
		}
	    }	
446

447
	    echo "<font size=-2><b>Created by:</b> ".
448
		 "<a href='$showuser_url'>$huid</a>".
449
		 "</font><br />\n";
450

451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472
	    $special = 0;
	    $pcs     = 0;
	    reset($perexp_usage);
	    if (isset($perexp_usage["$pid:$eid"])) {
		while (list ($class, $count) = each($perexp_usage["$pid:$eid"])) {
		    if (strcmp($class, "pc")) {
			$special += $count;
		    } else {
			$pcs += $count;
		    }
		}
	    }

	    if ($pcs) {
		if ($pcs == 1) { $plural = ""; } else { $plural = "s"; }  
		echo "<font size=-1><b>Using <font color=red>$pcs PC</font> Node$plural</b></font><br />\n";
	    }
	    if ($special) {
		if ($special == 1) { $plural = ""; } else { $plural = "s"; }  
		echo "<font size=-1><b>Using <font color=red>$special Special</font> Node$plural</b></font><br />\n";
	    }

473 474
	    echo "</td></tr></table> \n";
	    echo "</td>";
475

Leigh B. Stoller's avatar
Leigh B. Stoller committed
476 477
	    $thumbCount++;
	    if (($thumbCount % 2) == 0) { echo "</tr><tr>\n"; }
478
	}
479 480 481 482
    }

    echo "</tr></table>";
} else {
483 484 485

    $ni = ($noignore ? "&noignore=$noignore" : "");
    
486 487 488
    echo "<table border=2 cols=0
                 cellpadding=0 cellspacing=2 align=center>
            <tr>
Chad Barb's avatar
Chad Barb committed
489
              <th width=8%>
490
               <a class='static' href='showexp_list.php3?showtype=$showtype&sortby=pid$ni'>
491
                  PID</a></th>
Chad Barb's avatar
Chad Barb committed
492
              <th width=8%>
493
               <a class='static' href='showexp_list.php3?showtype=$showtype&sortby=eid$ni'>
494
                  EID</a></th>
Chad Barb's avatar
Chad Barb committed
495
              <th align=center width=3%>
496
               <a class='static' href='showexp_list.php3?showtype=$showtype&sortby=pcs$ni'>
497
                  PCs</a> [1]</th>
498
              <th align=center width=3%>
499
               <a class='static' href='showexp_list.php3?showtype=$showtype&sortby=idle$ni'>
500
               Hours Idle</a> [2]</th>\n";
501
    
502
    if ($showlastlogin)
Chad Barb's avatar
Chad Barb committed
503
        echo "<th width=17% align=center>Last Login</th>\n";
504
    if ($idle) {
505 506
	#echo "<th width=4% align=center colspan=2>Swap Requests</th>\n";
	echo "<th width=4% align=center>Swap Requests</th>\n";
507
    }
508

509 510 511 512 513 514 515 516 517
    if (! $openlist_member) {
	echo "<th width=60%>
                  <a class='static' ".
                     "href='showexp_list.php3?showtype=$showtype".
                     "&sortby=name$ni'>Description</a></th>\n";
    }
    echo "  <th width=4%>
               <a class='static' ".
                  "href='showexp_list.php3?showtype=$showtype&sortby=uid$ni'>
518
                  Head UID</a></th>
519 520
            </tr>\n";

521
    while ($row = mysql_fetch_array($experiments_result)) {
522 523 524
	$pid  = $row["pid"];
	$eid  = $row["eid"]; 
	$huid = $row["expt_head_uid"];
Leigh B. Stoller's avatar
Leigh B. Stoller committed
525
	$name = stripslashes($row["expt_name"]);
526
	$date = $row["dshort"];
527
	$state= $row["state"];
528 529 530 531
	$ignore = $row['idle_ignore'];
	$idlesec= $row["idlesec"];
	$swapreqs = $row["swap_requests"];
	$isidle = ($idlesec >= 3600*$idlehours);
532
	$daysidle=0;
533
	$idletime = ($idlesec > 300 ? round($idlesec/3600,1) : 0);
534 535
	# reset pcs
	$pcs=0;
536

537 538 539 540 541
	if (! ($experiment = Experiment::LookupByPidEid($pid, $eid))) {
	    TBERROR("Could not map $pid/$eid to its object", 1);
	}
	$stale = $experiment->IdleStale();

542 543 544 545
	if (! ($head_user = User::Lookup($huid))) {
	    TBERROR("Could not lookup object for user $huid", 1);
	}
	$showuser_url = CreateURL("showuser", $head_user);
546 547 548
	
	if ($swapreqs && !$isidle) {
	    $swapreqs = "";
549 550 551 552
	    mysql_query("update experiments set swap_requests='' ".
			"where pid='$pid' and eid='$eid'");
	}

553
	if ($isadmin) {
554 555 556
	    $swappable= $row["swappable"];
	    $swapreq=$row["swap_requests"];
	    $lastswapreq=$row["lastreq"];
557 558 559 560 561 562
	    if ($lastswapreq > $idletime) {
		# My last request was from _before_ it was idle this time
		mysql_query("update experiments set swap_requests='' ".
			    "where pid='$pid' and eid='$eid'");
		$swapreq=0;
	    }
563 564
	    $idlemailinterval = TBGetSiteVar("idle/mailinterval");
	    # Is it toosoon to send another mail?
565
	    $toosoon = ($swapreq>0 && ($lastswapreq < $idlemailinterval));
566
	    $lastlogin = "<td>";
567
	    if ($lastexpnodelogins = TBExpUidLastLogins($pid, $eid)) {
568
	        $daysidle=$lastexpnodelogins["daysidle"];
569 570
	        #if ($idle && $daysidle < 1)
		#  continue;
571
		$lastlogin .= $lastexpnodelogins["shortdate"] . " " .
572
		 "(" . $lastexpnodelogins["uid"] . ")";
573
	    } elseif ($state=="active") {
574
	        $daysidle=$row["lastswap"];
575
	        $lastlogin .= "$date swapin";
576
	    }
577 578
	    $lastlogin.="</td>\n";
	    if ($lastlogin=="<td></td>\n") { $lastlogin="<td>&nbsp;</td>\n"; }
579
	}
580
	
581
	if ($idle) {
582
	    # If it is ignored, skip it now.
583
	    if ($ignore && !$noignore) { continue; }
584
	    #$lastlogin .= "<td align=center>$daysidle</td>\n";
585 586 587
	    if (isset($perexp_usage["$pid:$eid"]) &&
		isset($perexp_usage["$pid:$eid"]["pc"])) {
	      $pcs = $perexp_usage["$pid:$eid"]["pc"];
588
	    }
589 590
	    $foo = "<td align=center valign=center>\n";
	    #$label = "";
591
	    # Probably do not need this when we are using stalemark
592
	    #if ($stale) { $label .= "stale "; }
593
	    # Do not really need this if we are marking ignore with ()
594 595 596 597 598 599 600 601 602 603 604 605
	    #if ($ignore) { $label .= "ignore "; }
	    #if (!$swappable) { $label .= "unswap. "; }
 	    #if ($isidle && !$stale && !$ignore && !$toosoon && $pcs) {
	    #    $fooswap = "<td><a ".
	    #       "href=\"request_swapexp.php3?pid=$pid&eid=$eid\">".
	    #       "<img border=0 src=\"redball.gif\"></a> $label</td>\n" ;
	    #} else {
	    #   if ($label == "") { $label = "&nbsp;"; }
	    #   $fooswap = "<td>$label</td>";
	    #   if (!$pcs) { $foo .= "(no PCs)\n"; }
	    #   else { $foo .="&nbsp;"; }
	    #}
606
	    if ($swapreq > 0) {
607
	      $foo .= "$swapreq&nbsp;sent<br>".
608
	              "<font size=-2>(${lastswapreq}&nbsp;hrs&nbsp;ago)</font>\n";
609
	    }
610 611 612
	    #$foo .= "</td>".$fooswap."\n"; 
	    if (!$swappable) { $foo .= "unswap.\n"; }
	    
613
	}
614

615
	if ($idle && (!$pcs || !$isidle)) { continue; }
616

617 618
	$nodes   = 0;
	$special = 0;
619 620 621 622
	reset($perexp_usage);
	if (isset($perexp_usage["$pid:$eid"])) {
	    while (list ($class, $count) = each($perexp_usage["$pid:$eid"])) {
		$nodes += $count;
623
		if (strcmp($class, "pc")) {
624
		    $special = 1;
625 626 627 628
		} else {
		    $pcs = $count;
		}

629 630 631 632 633 634
		# Summary counts for just the experiments in the projects
		# the user is a member of.
		if (!isset($total_usage[$class]))
		    $total_usage[$class] = 0;
			
		$total_usage[$class] += $count;
635
	    }
636
	}
637

638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655
	$onmouseover = "";
	reset($perexp_types);
	if (isset($perexp_types["$pid:$eid"])) {
	    $mouseover  = "<table align=center ";
	    $mouseover .= " cellpadding=2 cellspacing=2 border=2> ";
	    $mouseover .= "<tr><th>Node Type</th><th>Count</th></tr> ";

	    while (list ($type, $count) = each($perexp_types["$pid:$eid"])) {
		$mouseover .= "<tr><td class=pad4>$type</td>";
		$mouseover .= "    <td class=pad4>$count</td></tr> ";

	    }
	    $mouseover .= "</table>";
	    $onmouseover  = "onmouseover=\"this.T_WIDTH=175; ";
	    $onmouseover .= "this.T_FONTSIZE='16px'; this.T_OFFSETX=0; ";
	    $onmouseover .= "return escape('$mouseover')\"";
	}

656 657
	# in idle or active, skip experiments with no nodes.
	if (($idle || $active) && $nodes == 0) { continue; }
658 659
	if ($nodes==0) { $nodes = "&nbsp;"; }
	
660 661
	echo "<tr>
                <td><A href='showproject.php3?pid=$pid'>$pid</A></td>
Leigh B. Stoller's avatar
Leigh B. Stoller committed
662
                <td><A href='showexp.php3?pid=$pid&eid=$eid'>
663
                       $eid</A></td>\n";
664
	
665
	if ($isidle && !$ignore) { $nodes = $nodes.$idlemark; }
666 667
	# If multiple classes, then hightlight the number and show pcs/nodes.
	if ($special) {
668
	    echo "<td nowrap $onmouseover><font color=red>$nodes</font>";
669
	    if ($pcs)
670 671
		echo " ($pcs)";
	    echo "</td>\n";	    
672
	}
673
	else
674
            echo "<td $onmouseover>$nodes</td>\n";
675

Chad Barb's avatar
Chad Barb committed
676
	if ($idletime == -1) {
677
	    $idlestr = "&nbsp;";
Chad Barb's avatar
Chad Barb committed
678
	} else {
679 680 681 682
	    $idlestr = "$idletime";
	    # Order between the next two lines determines if the
	    # stalemark goes inside or outside the parens
	    if ($stale && $pcs > 0) { $idlestr .= $stalemark; }
683
	    if ($ignore && $idletime !=0) {
684 685
		$idlestr = "($idlestr)";
		$parens = 1;
686
	    }
Chad Barb's avatar
Chad Barb committed
687
	}
688
	echo "<td>$idlestr</td>";
689 690
	
	if ($showlastlogin) echo "$lastlogin\n";
691
	if ($idle) echo "$foo\n";
692

693 694 695 696
	if (! $openlist_member) {
	    echo "<td>$name</td>\n";
	}
	
697
        echo "<td><A href='$showuser_url'>$huid</A></td>\n";
698
	echo "</tr>\n";
699 700
    }
    echo "</table>\n";
701

702 703
    
    echo "<font size=-1><ol>
704
             <li><font color=red>Red</font> indicates nodes other than PCs.
705
                 A $idlemark mark by the node count indicates that the
706 707
                 experiment is currently considered idle. The number of
                 local pcs is indicated in the parens. 
708 709 710 711 712 713 714 715 716
             <li>A $stalemark indicates that the data is stale, and
		 at least one node in the experiment has not reported
		 on its proper schedule.\n";
    if ($parens) {
	# don't show this unless we did it... most users shouldn't ever
	# need to know that you can set expts to have their idleness ignored
	echo "Values are in parenthesis for idle-ignore experiments.\n";
    }
    echo "</ol></font>\n";
717 718
    
    echo "<center><b>Node Totals</b></center>\n";
719 720 721
    echo "<table border=0
                 cellpadding=1 cellspacing=1 align=center>\n";
    $total = 0;
722
    ksort($total_usage);
723 724 725 726
    while (list($type, $count) = each($total_usage)) {
	    $total += $count;
	    echo "<tr>
                    <td align=right>${type}:</td>
727
                    <td>&nbsp; &nbsp; &nbsp; &nbsp;</td>
728 729 730 731 732
                    <td align=center>$count</td>
                  </tr>\n";
    }
    echo "<tr>
             <td align=right><hr></td>
733
             <td>&nbsp; &nbsp; &nbsp; &nbsp;</td>
734 735 736 737
             <td align=center><hr></td>
          </tr>\n";
    echo "<tr>
             <td align=right><b>Total</b>:</td>
738
             <td>&nbsp; &nbsp; &nbsp; &nbsp;</td>
739 740 741 742
             <td align=center>$total</td>
          </tr>\n";
    
    echo "</table>\n";
743 744
} # if ($thumb && !$idle)
} # if (mysql_num_rows($experiments_result))
745 746 747 748 749 750

#
# Standard Testbed Footer
# 
PAGEFOOTER();
?>