showexp_list.php3 22.7 KB
Newer Older
1
<?php
Leigh B. Stoller's avatar
Leigh B. Stoller committed
2 3
#
# EMULAB-COPYRIGHT
4
# Copyright (c) 2000-2008 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      = "";
Mac Newbold's avatar
Mac Newbold committed
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";
Chad Barb's avatar
 
Chad Barb committed
57 58
if (! isset($thumb)) 
    $thumb = 0;
59 60
if (! isset($noignore)) 
    $noignore = 0;
61

Chad Barb's avatar
 
Chad Barb committed
62
echo "<b>Show: ";
63

Chad Barb's avatar
 
Chad Barb committed
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;
Leigh B. Stoller's avatar
Leigh B. Stoller committed
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;
Leigh B. Stoller's avatar
Leigh B. Stoller committed
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

Chad Barb's avatar
 
Chad Barb committed
139 140 141


if (!$idle) {
Chad Barb's avatar
 
Chad Barb committed
142 143 144
    echo "<b>View: ";

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

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

    if ($thumb != 2) {
Chad Barb's avatar
 
Chad Barb committed
163
	echo "<a class='static' href='showexp_list.php3?showtype=$showtype&sortby=$sortby&thumb=2'>";
Chad Barb's avatar
 
Chad Barb committed
164 165 166 167 168 169
	echo "Brief Thumbnails";
        echo "</a>";
    } else {
        echo "Brief Thumbnails";
    }
    echo "</b><br />\n";
Chad Barb's avatar
 
Chad Barb committed
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";
}
Chad Barb's avatar
 
Chad Barb committed
211
}
212
 
Chad Barb's avatar
 
Chad Barb committed
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"))
Chad Barb's avatar
 
Chad Barb committed
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 
Leigh B. Stoller's avatar
Leigh B. Stoller committed
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

Mac Newbold's avatar
Mac Newbold committed
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
      }
Mac Newbold's avatar
Mac Newbold committed
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.
    #
Chad Barb's avatar
 
Chad Barb committed
366
if ($thumb && !$idle) {
Chad Barb's avatar
 
Chad Barb committed
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>";
    }
Chad Barb's avatar
 
Chad Barb committed
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
	$state= $row["state"];
382 383 384 385 386

	if (! ($head_user = User::Lookup($huid))) {
	    TBERROR("Could not lookup object for user $huid", 1);
	}
	$showuser_url = CreateURL("showuser", $head_user);
387 388
	$head_affil   = $head_user->affil_abbrev();
	$head_affil_text = $head_affil ? "&nbsp;($head_affil)" : "";
Chad Barb's avatar
 
Chad Barb committed
389 390
	
	if ($idle && ($str=="&nbsp;" || !$pcs)) { continue; }
Chad Barb's avatar
 
Chad Barb committed
391

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

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

	    echo "<td>".
		 "<table border=0 cellpadding=4 cellspacing=0>".
		 "<tr>".
413
		 "<td width=160 align=center>".
Chad Barb's avatar
 
Chad Barb committed
414
	         "<a href='shownsfile.php3?pid=$pid&eid=$eid'>".
415
		 "<img border=1 class='stealth' ".
416
		 " src='showthumb.php3?idx=$rsrcidx'>".
Chad Barb's avatar
 
Chad Barb committed
417 418 419 420 421 422 423 424 425 426
	         "</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";
Chad Barb's avatar
 
Chad Barb committed
427 428


Chad Barb's avatar
 
Chad Barb committed
429 430 431 432 433 434 435 436 437
	    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;
438
		    $lastlogin .= $lastexpnodelogins["shortdate"] . " " .
Chad Barb's avatar
 
Chad Barb committed
439 440 441
			"(" . $lastexpnodelogins["uid"] . ")";
		} elseif ($state=="active") {
		    $daysidle=$row["lastswap"];
442
		    $lastlogin .= "$date swapin";
Chad Barb's avatar
 
Chad Barb committed
443 444 445 446 447 448
		}
		# if ($lastlogin=="") { $lastlogin="<td>&nbsp;</td>\n"; }
		if ($lastlogin != "") {
		    echo "<font size=-2><b>Last Login:</b> $lastlogin</font><br />\n";
		}
	    }	
Chad Barb's avatar
 
Chad Barb committed
449

Chad Barb's avatar
 
Chad Barb committed
450
	    echo "<font size=-2><b>Created by:</b> ".
451
		 "<a href='$showuser_url'>$huid</a>$head_affil_text".
Chad Barb's avatar
 
Chad Barb committed
452
		 "</font><br />\n";
Chad Barb's avatar
 
Chad Barb committed
453

Chad Barb's avatar
 
Chad Barb committed
454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475
	    $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";
	    }

Chad Barb's avatar
 
Chad Barb committed
476 477
	    echo "</td></tr></table> \n";
	    echo "</td>";
Chad Barb's avatar
 
Chad Barb committed
478

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

    echo "</tr></table>";
} else {
486 487 488

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

512 513 514 515 516 517 518 519 520
    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'>
Chad Barb's avatar
 
Chad Barb committed
521
                  Head UID</a></th>
522 523
            </tr>\n";

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

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

545 546 547 548
	if (! ($head_user = User::Lookup($huid))) {
	    TBERROR("Could not lookup object for user $huid", 1);
	}
	$showuser_url = CreateURL("showuser", $head_user);
549 550 551
	$head_affil = $head_user->affil_abbrev();
	$head_affil_text = $head_affil ? "&nbsp;($head_affil)" : "";

552 553 554
	
	if ($swapreqs && !$isidle) {
	    $swapreqs = "";
555 556 557 558
	    mysql_query("update experiments set swap_requests='' ".
			"where pid='$pid' and eid='$eid'");
	}

559
	if ($isadmin) {
560 561 562
	    $swappable= $row["swappable"];
	    $swapreq=$row["swap_requests"];
	    $lastswapreq=$row["lastreq"];
563 564 565 566 567 568
	    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;
	    }
569 570
	    $idlemailinterval = TBGetSiteVar("idle/mailinterval");
	    # Is it toosoon to send another mail?
571
	    $toosoon = ($swapreq>0 && ($lastswapreq < $idlemailinterval));
572
	    $lastlogin = "<td>";
573
	    if ($lastexpnodelogins = TBExpUidLastLogins($pid, $eid)) {
574
	        $daysidle=$lastexpnodelogins["daysidle"];
575 576
	        #if ($idle && $daysidle < 1)
		#  continue;
577
		$lastlogin .= $lastexpnodelogins["shortdate"] . " " .
578
		 "(" . $lastexpnodelogins["uid"] . ")";
579
	    } elseif ($state=="active") {
580
	        $daysidle=$row["lastswap"];
581
	        $lastlogin .= "$date swapin";
582
	    }
583 584
	    $lastlogin.="</td>\n";
	    if ($lastlogin=="<td></td>\n") { $lastlogin="<td>&nbsp;</td>\n"; }
585
	}
586
	
587
	if ($idle) {
588
	    # If it is ignored, skip it now.
589
	    if ($ignore && !$noignore) { continue; }
590
	    #$lastlogin .= "<td align=center>$daysidle</td>\n";
591 592 593
	    if (isset($perexp_usage["$pid:$eid"]) &&
		isset($perexp_usage["$pid:$eid"]["pc"])) {
	      $pcs = $perexp_usage["$pid:$eid"]["pc"];
594
	    }
595 596
	    $foo = "<td align=center valign=center>\n";
	    #$label = "";
Leigh B. Stoller's avatar
Leigh B. Stoller committed
597
	    # Probably do not need this when we are using stalemark
598
	    #if ($stale) { $label .= "stale "; }
Leigh B. Stoller's avatar
Leigh B. Stoller committed
599
	    # Do not really need this if we are marking ignore with ()
600 601 602 603 604 605 606 607 608 609 610 611
	    #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;"; }
	    #}
612
	    if ($swapreq > 0) {
613
	      $foo .= "$swapreq&nbsp;sent<br>".
614
	              "<font size=-2>(${lastswapreq}&nbsp;hrs&nbsp;ago)</font>\n";
615
	    }
616 617 618
	    #$foo .= "</td>".$fooswap."\n"; 
	    if (!$swappable) { $foo .= "unswap.\n"; }
	    
619
	}
620

621
	if ($idle && (!$pcs || !$isidle)) { continue; }
622

623 624
	$nodes   = 0;
	$special = 0;
625 626 627 628
	reset($perexp_usage);
	if (isset($perexp_usage["$pid:$eid"])) {
	    while (list ($class, $count) = each($perexp_usage["$pid:$eid"])) {
		$nodes += $count;
629
		if (strcmp($class, "pc")) {
630
		    $special = 1;
631 632 633 634
		} else {
		    $pcs = $count;
		}

635 636 637 638 639 640
		# 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;
641
	    }
642
	}
643

644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661
	$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')\"";
	}

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

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

699 700 701 702
	if (! $openlist_member) {
	    echo "<td>$name</td>\n";
	}
	
703
        echo "<td><A href='$showuser_url'>$huid</A>$head_affil_text</td>\n";
704
	echo "</tr>\n";
705 706
    }
    echo "</table>\n";
707

708 709
    
    echo "<font size=-1><ol>
710
             <li><font color=red>Red</font> indicates nodes other than PCs.
711
                 A $idlemark mark by the node count indicates that the
Leigh B. Stoller's avatar
Leigh B. Stoller committed
712 713
                 experiment is currently considered idle. The number of
                 local pcs is indicated in the parens. 
714 715 716 717 718 719 720 721 722
             <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";
723 724
    
    echo "<center><b>Node Totals</b></center>\n";
725 726 727
    echo "<table border=0
                 cellpadding=1 cellspacing=1 align=center>\n";
    $total = 0;
728
    ksort($total_usage);
729 730 731 732
    while (list($type, $count) = each($total_usage)) {
	    $total += $count;
	    echo "<tr>
                    <td align=right>${type}:</td>
733
                    <td>&nbsp; &nbsp; &nbsp; &nbsp;</td>
734 735 736 737 738
                    <td align=center>$count</td>
                  </tr>\n";
    }
    echo "<tr>
             <td align=right><hr></td>
739
             <td>&nbsp; &nbsp; &nbsp; &nbsp;</td>
740 741 742 743
             <td align=center><hr></td>
          </tr>\n";
    echo "<tr>
             <td align=right><b>Total</b>:</td>
744
             <td>&nbsp; &nbsp; &nbsp; &nbsp;</td>
745 746 747 748
             <td align=center>$total</td>
          </tr>\n";
    
    echo "</table>\n";
Chad Barb's avatar
 
Chad Barb committed
749 750
} # if ($thumb && !$idle)
} # if (mysql_num_rows($experiments_result))
751 752 753 754 755 756

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