You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@vcl.apache.org by jf...@apache.org on 2012/03/15 15:00:34 UTC

svn commit: r1300987 - /incubator/vcl/trunk/web/.ht-inc/statistics.php

Author: jfthomps
Date: Thu Mar 15 14:00:33 2012
New Revision: 1300987

URL: http://svn.apache.org/viewvc?rev=1300987&view=rev
Log:
added ability to select to view statistics by provisioning engine (requires "View Stats by Affiliation" user group permissions
-modified selectStatistics - allow selection of provisioning engine
-modified viewStatistics - process selection of provisioning engine and get appropriate data
-modified AJgetStatData to pass additional information about extra mode and provisioning engine to functions that generate graph data
-modified getStatGraphDayData, getStatGraphHourData, getStatGraphDatConUsersData, getStatGraphConBladeUserData, and getStatGraphConVMUserData to accept $mode and $provid as additional arguments and to generate the appropriate data accordingly
-modified addToStatGraphCache - added $provid as additional argument

Modified:
    incubator/vcl/trunk/web/.ht-inc/statistics.php

Modified: incubator/vcl/trunk/web/.ht-inc/statistics.php
URL: http://svn.apache.org/viewvc/incubator/vcl/trunk/web/.ht-inc/statistics.php?rev=1300987&r1=1300986&r2=1300987&view=diff
==============================================================================
--- incubator/vcl/trunk/web/.ht-inc/statistics.php (original)
+++ incubator/vcl/trunk/web/.ht-inc/statistics.php Thu Mar 15 14:00:33 2012
@@ -100,8 +100,11 @@ function selectStatistics() {
 	printSelectInput("day2", $days, $daykey2);
 	printSelectInput("year2", $years, $yearkey2);
 	print "<br>\n";
+	$cont = addContinuationsEntry('viewstats');
 	if(checkUserHasPerm('View Statistics by Affiliation')) {
-		print "Select an affiliation:<br>\n";
+		print "<input type=radio id=stattype1 name=continuation value=\"$cont\" checked>\n";
+		print "<label for=stattype1>View General Statistics</label> - \n";
+		print "Select an affiliation:\n";
 		$affils = getAffiliations();
 		if(! array_key_exists($affilid, $affils))
 			$affilid = $user['affiliationid'];
@@ -110,9 +113,25 @@ function selectStatistics() {
 		$affils = array_reverse($affils, TRUE);
 		printSelectInput("affilid", $affils, $affilid);
 		print "<br>\n";
+
+		$query = "SELECT id, "
+		       .        "prettyname "
+		       . "FROM provisioning "
+		       . "ORDER BY prettyname";
+		$qh = doQuery($query);
+		$provs = array();
+		while($row = mysql_fetch_assoc($qh))
+			$provs[$row['id']] = $row['prettyname'];
+		$cdata = array('mode' => 'provisioning',
+		               'provs' => $provs);
+		$cont2 = addContinuationsEntry('viewstats', $cdata);
+		print "<input type=radio id=stattype3 name=continuation value=\"$cont2\">\n";
+		print "<label for=stattype3>View Statistics by provisioning engine</label>:\n";
+		printSelectInput("provid", $provs);
+		print "<br>\n";
 	}
-	$cont = addContinuationsEntry('viewstats');
-	print "<INPUT type=hidden name=continuation value=\"$cont\">\n";
+	else
+		print "<INPUT type=hidden name=continuation value=\"$cont\">\n";
 	print "<INPUT type=submit value=Submit>\n";
 	print "</FORM>\n";
 }
@@ -137,6 +156,18 @@ function viewStatistics() {
 	$day2 = processInputVar("day2", ARG_NUMERIC);
 	$year2 = processInputVar("year2", ARG_NUMERIC);
 	$affilid = processInputVar("affilid", ARG_NUMERIC, $user['affiliationid']);
+	$mode2 = getContinuationVar('mode', 'default');
+	$provid = processInputVar('provid', ARG_NUMERIC, 0);
+	if($mode2 == 'provisioning') {
+		$affilid = 0;
+		$provs = getContinuationVar('provs');
+		if(! array_key_exists($provid, $provs)) {
+			$ids = array_keys($provs);
+			$provid = $ids[0];
+		}
+	}
+	else
+		$provid = 0;
 
 	$affils = getAffiliations();
 	if(! checkUserHasPerm('View Statistics by Affiliation') ||
@@ -172,29 +203,65 @@ function viewStatistics() {
 	}
 
 	$timestart = microtime(1);
-	print "<H2>Statistic Information for $statsfor</H2>\n";
+	if($mode2 == 'default')
+		print "<H2>Statistic Information for $statsfor</H2>\n";
+	elseif($mode2 == 'provisioning')
+		print "<H2>Statistic Information for {$provs[$provid]}</H2>\n";
 	print "<H3>Reservation information between $month1/$day1/$year1 and ";
 	print "$month2/$day2/$year2:\n";
 	print "</H3>\n";
-	$reloadid = getUserlistID('vclreload@Local');
-	$query = "SELECT l.userid, "
-	       .        "l.nowfuture, "
-	       .        "UNIX_TIMESTAMP(l.start) AS start, "
-	       .        "(UNIX_TIMESTAMP(l.loaded) - UNIX_TIMESTAMP(l.start)) AS loadtime, "
-	       .        "UNIX_TIMESTAMP(l.finalend) AS finalend, "
-	       .        "l.wasavailable, "
-	       .        "l.ending, "
-	       .        "i.prettyname, "
-	       .        "o.prettyname AS OS "
-	       . "FROM log l, "
-	       .      "image i, "
-	       .      "user u, "
-	       .      "OS o "
-	       . "WHERE l.start >= '$start' AND "
-	       .       "l.finalend <= '$end' AND "
-	       .       "i.id = l.imageid AND "
-	       .       "i.OSid = o.id AND "
-	       .       "l.userid != $reloadid AND ";
+	$reloadid = getUserlistID('vclreload@local');
+	if($mode2 == 'default') {
+		$query = "SELECT l.userid, "
+		       .        "u.affiliationid, "
+		       .        "l.nowfuture, "
+		       .        "UNIX_TIMESTAMP(l.start) AS start, "
+		       .        "(UNIX_TIMESTAMP(l.loaded) - UNIX_TIMESTAMP(l.start)) AS loadtime, "
+		       .        "UNIX_TIMESTAMP(l.finalend) AS finalend, "
+		       .        "l.wasavailable, "
+		       .        "l.ending, "
+		       .        "i.prettyname, "
+		       .        "o.prettyname AS OS "
+		       . "FROM log l, "
+		       .      "image i, "
+		       .      "user u, "
+		       .      "OS o "
+		       . "WHERE l.start >= '$start' AND "
+		       .       "l.finalend <= '$end' AND "
+		       .       "i.id = l.imageid AND "
+		       .       "i.OSid = o.id AND "
+		       .       "l.userid != $reloadid AND ";
+	}
+	elseif($mode2 == 'provisioning') {
+		$query = "SELECT l.userid, "
+		       .        "u.affiliationid, "
+		       .        "l.nowfuture, "
+		       .        "UNIX_TIMESTAMP(l.start) AS start, "
+		       .        "(UNIX_TIMESTAMP(l.loaded) - UNIX_TIMESTAMP(l.start)) AS loadtime, "
+		       .        "UNIX_TIMESTAMP(l.finalend) AS finalend, "
+		       .        "l.wasavailable, "
+		       .        "l.ending, "
+		       .        "i.prettyname, "
+		       .        "o.prettyname AS OS "
+		       . "FROM image i, "
+		       .      "user u, "
+		       .      "OS o, "
+		       .      "log l "
+		       . "JOIN ("
+		       .       "SELECT s.logid, "
+		       .              "MIN(s.computerid) AS computerid "
+		       .       "FROM sublog s, "
+		       .            "computer c "
+		       .       "WHERE s.computerid = c.id AND "
+		       .             "c.provisioningid = $provid "
+		       .       "GROUP BY logid "
+		       .       ") AS s ON (s.logid = l.id) "
+		       . "WHERE l.start >= '$start' AND "
+		       .       "l.finalend <= '$end' AND "
+		       .       "i.id = l.imageid AND "
+		       .       "i.OSid = o.id AND "
+		       .       "l.userid != $reloadid AND ";
+	}
 	if($affilid != 0)
 		$query .=   "u.affiliationid = $affilid AND ";
 	$query .=      "l.userid = u.id "
@@ -460,7 +527,9 @@ function viewStatistics() {
 	$end = date('Y-m-d', $unixend);
 	$cdata = array('start' => $start,
 	               'end' => $end,
-	               'affilid' => $affilid);
+	               'affilid' => $affilid,
+	               'mode' => $mode2,
+	               'provid' => $provid);
 	print "<H2>Reservations by Day</H2>\n";
 	print "<small>(Reservations with start time on given day)</small><br>\n";
 	$cdata['divid'] = 'resbyday';
@@ -510,27 +579,40 @@ function AJgetStatData() {
 	$end = getContinuationVar("end");
 	$affilid = getContinuationVar("affilid");
 	$divid = getContinuationVar('divid');
+	$mode = getContinuationVar('mode');
+	$provid = getContinuationVar('provid');
 	if($divid == 'resbyday')
-		$data = getStatGraphDayData($start, $end, $affilid);
+		$data = getStatGraphDayData($start, $end, $affilid, $mode, $provid);
 	elseif($divid == 'maxconcurresday')
-		$data = getStatGraphDayConUsersData($start, $end, $affilid);
+		$data = getStatGraphDayConUsersData($start, $end, $affilid, $mode, $provid);
 	elseif($divid == 'maxconcurbladeday')
-		$data = getStatGraphConBladeUserData($start, $end, $affilid);
+		$data = getStatGraphConBladeUserData($start, $end, $affilid, $mode, $provid);
 	elseif($divid == 'maxconcurvmday')
-		$data = getStatGraphConVMUserData($start, $end, $affilid);
+		$data = getStatGraphConVMUserData($start, $end, $affilid, $mode, $provid);
 	elseif($divid == 'resbyhour')
-		$data = getStatGraphHourData($start, $end, $affilid);
+		$data = getStatGraphHourData($start, $end, $affilid, $mode, $provid);
+	elseif(preg_match('/^resbyday/', $divid))
+		$data = getStatGraphDayData($start, $end, $affilid, $mode, $provid);
+	elseif(preg_match('/^maxconcurresday/', $divid))
+		$data = getStatGraphDayConUsersData($start, $end, $affilid, $mode, $provid);
+	elseif(preg_match('/^maxconcurbladeday/', $divid))
+		$data = getStatGraphConBladeUserData($start, $end, $affilid, $mode, $provid);
+	elseif(preg_match('/^maxconcurvmday/', $divid))
+		$data = getStatGraphConVMUserData($start, $end, $affilid, $mode, $provid);
 	$data['id'] = $divid;
 	sendJSON($data);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 ///
-/// \fn getStatGraphDayData($start, $end, $affilid)
+/// \fn getStatGraphDayData($start, $end, $affilid, $mode, $provid)
 ///
 /// \param $start - starting day in YYYY-MM-DD format
 /// \param $end - ending day in YYYY-MM-DD format
 /// \param $affilid - affiliationid of data to gather
+/// \param $mode - stat mode - 'default' or 'provisioning'
+/// \param $provid - provisioning id - set to 0 for $mode = 'default', set to
+/// > 0 otherwise
 ///
 /// \return an array with three keys:\n
 /// \b points - an array with y and tooltip keys that have the same value which
@@ -544,7 +626,7 @@ function AJgetStatData() {
 /// and creates an array with the number of reservations on each day
 ///
 ////////////////////////////////////////////////////////////////////////////////
-function getStatGraphDayData($start, $end, $affilid) {
+function getStatGraphDayData($start, $end, $affilid, $mode, $provid) {
 	$startunix = datetimeToUnix($start . " 00:00:00");
 	$endunix = datetimeToUnix($end . " 23:59:59");
 
@@ -562,7 +644,8 @@ function getStatGraphDayData($start, $en
 	       . "WHERE graphtype = 'totalres' AND "
 			 .       "affiliationid = $affilid AND "
 	       .       "statdate >= '$start' AND "
-	       .       "statdate <= '$end'";
+	       .       "statdate <= '$end' AND "
+	       .       "provisioningid = $provid";
 	$qh = doQuery($query, 101);
 	while($row = mysql_fetch_assoc($qh))
 		$cachepts[$row['statdate']] = $row['value'];
@@ -587,12 +670,31 @@ function getStatGraphDayData($start, $en
 				       .       "u.affiliationid = $affilid";
 			}
 			else {
-				$query = "SELECT count(l.id) "
-				       . "FROM log l "
-				       . "WHERE l.start >= '$startdt' AND "
-				       .       "l.start < '$enddt' AND "
-				       .       "l.userid != $reloadid AND "
-				       .       "l.wasavailable = 1";
+				if($mode == 'default') {
+					$query = "SELECT count(l.id) "
+					       . "FROM log l "
+					       . "WHERE l.start >= '$startdt' AND "
+					       .       "l.start < '$enddt' AND "
+					       .       "l.userid != $reloadid AND "
+					       .       "l.wasavailable = 1";
+				}
+				elseif($mode == 'provisioning') {
+					$query = "SELECT count(l.id) "
+					       . "FROM log l "
+					       . "JOIN ("
+					       .       "SELECT s.logid, "
+					       .              "MIN(s.computerid) AS computerid "
+					       .       "FROM sublog s, "
+					       .            "computer c "
+					       .       "WHERE s.computerid = c.id AND "
+					       .             "c.provisioningid = $provid "
+					       .       "GROUP BY logid "
+					       .       ") AS s ON (s.logid = l.id) "
+					       . "WHERE l.start >= '$startdt' AND "
+					       .       "l.start < '$enddt' AND "
+					       .       "l.userid != $reloadid AND "
+					       .       "l.wasavailable = 1";
+				}
 			}
 			$qh = doQuery($query, 295);
 			if($row = mysql_fetch_row($qh))
@@ -608,17 +710,19 @@ function getStatGraphDayData($start, $en
 		$data['xlabels'][] = array('value' => $cnt, 'text' => $label);
 	}
 	if(count($addcache))
-		addToStatGraphCache('totalres', $addcache, $affilid);
+		addToStatGraphCache('totalres', $addcache, $affilid, $provid);
 	return($data);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 ///
-/// \fn getStatGraphHourData($start, $end, $affilid)
+/// \fn getStatGraphHourData($start, $end, $affilid, $mode, $provid)
 ///
 /// \param $start - starting day in YYYY-MM-DD format
 /// \param $end - ending day in YYYY-MM-DD format
 /// \param $affilid - affiliationid of data to gather
+/// \param $mode - stat mode - 'default' or 'provisioning'
+/// \param $provid - provisioning id - ignored unless $mode is 'provisioning'
 ///
 /// \return an array with two keys:\n
 /// \b points - an array with 5 keys:\n
@@ -637,7 +741,7 @@ function getStatGraphDayData($start, $en
 /// and creates an array with the number of reservations on each day
 ///
 ////////////////////////////////////////////////////////////////////////////////
-function getStatGraphHourData($start, $end, $affilid) {
+function getStatGraphHourData($start, $end, $affilid, $mode, $provid) {
 	$startdt = $start . " 00:00:00";
 	$enddt = $end . " 23:59:59";
 	$startunix = datetimeToUnix($startdt);
@@ -668,15 +772,37 @@ function getStatGraphHourData($start, $e
 		       .       "u.affiliationid = $affilid";
 	}
 	else {
-		$query = "SELECT DATE_FORMAT(l.start, '%k') AS shour, "
-		       .        "DATE_FORMAT(l.start, '%i') AS smin, "
-		       .        "DATE_FORMAT(l.finalend, '%k') AS ehour, "
-		       .        "DATE_FORMAT(l.finalend, '%i') AS emin "
-		       . "FROM log l "
-		       . "WHERE l.start < '$enddt' AND "
-		       .       "l.finalend > '$startdt' AND "
-		       .       "l.userid != $reloadid AND "
-		       .       "l.wasavailable = 1";
+		if($mode == 'default') {
+			$query = "SELECT DATE_FORMAT(l.start, '%k') AS shour, "
+			       .        "DATE_FORMAT(l.start, '%i') AS smin, "
+			       .        "DATE_FORMAT(l.finalend, '%k') AS ehour, "
+			       .        "DATE_FORMAT(l.finalend, '%i') AS emin "
+			       . "FROM log l "
+			       . "WHERE l.start < '$enddt' AND "
+			       .       "l.finalend > '$startdt' AND "
+			       .       "l.userid != $reloadid AND "
+			       .       "l.wasavailable = 1";
+		}
+		else {
+			$query = "SELECT DATE_FORMAT(l.start, '%k') AS shour, "
+			       .        "DATE_FORMAT(l.start, '%i') AS smin, "
+			       .        "DATE_FORMAT(l.finalend, '%k') AS ehour, "
+			       .        "DATE_FORMAT(l.finalend, '%i') AS emin "
+			       . "FROM log l "
+			       . "JOIN ("
+			       .       "SELECT s.logid, "
+			       .              "MIN(s.computerid) AS computerid "
+			       .       "FROM sublog s, "
+			       .            "computer c "
+			       .       "WHERE s.computerid = c.id AND "
+			       .             "c.provisioningid = $provid "
+			       .       "GROUP BY logid "
+			       .       ") AS s ON (s.logid = l.id) "
+			       . "WHERE l.start < '$enddt' AND "
+			       .       "l.finalend > '$startdt' AND "
+			       .       "l.userid != $reloadid AND "
+			       .       "l.wasavailable = 1";
+		}
 	}
 	$qh = doQuery($query, 296);
 	while($row = mysql_fetch_assoc($qh)) {
@@ -735,11 +861,13 @@ function statHourFormatX($val) {
 
 ////////////////////////////////////////////////////////////////////////////////
 ///
-/// \fn getStatGraphDayConUsersData($start, $end, $affilid)
+/// \fn getStatGraphDayConUsersData($start, $end, $affilid, $mode, $provid)
 ///
 /// \param $start - starting day in YYYY-MM-DD format
 /// \param $end - ending day in YYYY-MM-DD format
 /// \param $affilid - affiliationid of data to gather
+/// \param $mode - stat mode - 'default' or 'provisioning'
+/// \param $provid - provisioning id - ignored unless $mode is 'provisioning'
 ///
 /// \return an array with three keys:\n
 /// \b points - an array with y and tooltip keys that have the same value which
@@ -753,7 +881,7 @@ function statHourFormatX($val) {
 /// and creates an array with the max concurrent users per day
 ///
 ////////////////////////////////////////////////////////////////////////////////
-function getStatGraphDayConUsersData($start, $end, $affilid) {
+function getStatGraphDayConUsersData($start, $end, $affilid, $mode, $provid) {
 	$startdt = $start . " 00:00:00";
 	$enddt = $end . " 23:59:59";
 	$startunix = datetimeToUnix($startdt);
@@ -782,7 +910,8 @@ function getStatGraphDayConUsersData($st
 	       . "WHERE graphtype = 'concurres' AND "
 			 .       "affiliationid = $affilid AND "
 	       .       "statdate >= '$start' AND "
-	       .       "statdate <= '$end'";
+	       .       "statdate <= '$end' AND "
+	       .       "provisioningid = $provid";
 	$qh = doQuery($query, 101);
 	while($row = mysql_fetch_assoc($qh))
 		$cachepts[$row['statdate']] = $row['value'];
@@ -814,12 +943,31 @@ function getStatGraphDayConUsersData($st
 					    .       "u.affiliationid = $affilid";
 			}
 			else {
-				$query = "SELECT UNIX_TIMESTAMP(l.start) AS start, "
-				       .        "UNIX_TIMESTAMP(l.finalend) AS end "
-				       . "FROM log l "
-				       . "WHERE l.start < '$enddt' AND "
-				       .       "l.finalend > '$startdt' AND "
-				       .       "l.userid != $reloadid";
+				if($mode == 'default') {
+					$query = "SELECT UNIX_TIMESTAMP(l.start) AS start, "
+					       .        "UNIX_TIMESTAMP(l.finalend) AS end "
+					       . "FROM log l "
+					       . "WHERE l.start < '$enddt' AND "
+					       .       "l.finalend > '$startdt' AND "
+					       .       "l.userid != $reloadid";
+				}
+				elseif($mode == 'provisioning') {
+					$query = "SELECT UNIX_TIMESTAMP(l.start) AS start, "
+					       .        "UNIX_TIMESTAMP(l.finalend) AS end "
+					       . "FROM log l "
+					       . "JOIN ("
+					       .       "SELECT s.logid, "
+					       .              "MIN(s.computerid) AS computerid "
+					       .       "FROM sublog s, "
+					       .            "computer c "
+					       .       "WHERE s.computerid = c.id AND "
+					       .             "c.provisioningid = $provid "
+					       .       "GROUP BY logid "
+					       .       ") AS s ON (s.logid = l.id) "
+					       . "WHERE l.start < '$enddt' AND "
+					       .       "l.finalend > '$startdt' AND "
+					       .       "l.userid != $reloadid";
+				}
 			}
 			$qh = doQuery($query, 101);
 			while($row = mysql_fetch_assoc($qh)) {
@@ -851,17 +999,19 @@ function getStatGraphDayConUsersData($st
 		$data['xlabels'][] = array('value' => $cnt, 'text' => $label);
 	}
 	if(count($addcache))
-		addToStatGraphCache('concurres', $addcache, $affilid);
+		addToStatGraphCache('concurres', $addcache, $affilid, $provid);
 	return($data);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 ///
-/// \fn getStatGraphConBladeUserData($start, $end, $affilid)
+/// \fn getStatGraphConBladeUserData($start, $end, $affilid, $mode, $provid)
 ///
 /// \param $start - starting day in YYYY-MM-DD format
 /// \param $end - ending day in YYYY-MM-DD format
 /// \param $affilid - affiliationid of data to gather
+/// \param $mode - stat mode - 'default' or 'provisioning'
+/// \param $provid - provisioning id - ignored unless $mode is 'provisioning'
 ///
 /// \return an array with three keys:\n
 /// \b points - an array with y and tooltip keys that have the same value which
@@ -875,7 +1025,7 @@ function getStatGraphDayConUsersData($st
 /// and creates an array with the max concurrent users of blades per day
 ///
 ////////////////////////////////////////////////////////////////////////////////
-function getStatGraphConBladeUserData($start, $end, $affilid) {
+function getStatGraphConBladeUserData($start, $end, $affilid, $mode, $provid) {
 	$startdt = $start . " 00:00:00";
 	$enddt = $end . " 23:59:59";
 	$startunix = datetimeToUnix($startdt);
@@ -904,7 +1054,8 @@ function getStatGraphConBladeUserData($s
 	       . "WHERE graphtype = 'concurblade' AND "
 			 .       "affiliationid = $affilid AND "
 	       .       "statdate >= '$start' AND "
-	       .       "statdate <= '$end'";
+	       .       "statdate <= '$end' AND "
+	       .       "provisioningid = $provid";
 	$qh = doQuery($query, 101);
 	while($row = mysql_fetch_assoc($qh))
 		$cachepts[$row['statdate']] = $row['value'];
@@ -945,21 +1096,49 @@ function getStatGraphConBladeUserData($s
 						 .       "u.affiliationid = $affilid";
 			}
 			else {
-				$query = "SELECT s.hostcomputerid, "
-				       .        "l.start AS start, "
-				       .        "l.finalend AS end, "
-				       .        "c.type "
-						 . "FROM log l, "
-				       .      "sublog s "
-				       . "LEFT JOIN computer c ON (s.computerid = c.id) "
-				       . "LEFT JOIN computer c2 ON (s.hostcomputerid = c2.id) "
-				       . "WHERE l.start < '$enddt' AND "
-				       .       "l.finalend > '$startdt' AND "
-				       .       "s.logid = l.id AND "
-				       .       "l.wasavailable = 1 AND "
-				       .       "l.userid != $reloadid AND "
-						 .       "(c.type = 'blade' OR "
-				       .       " (c.type = 'virtualmachine' AND c2.type = 'blade'))";
+				if($mode == 'default') {
+					$query = "SELECT s.hostcomputerid, "
+					       .        "l.start AS start, "
+					       .        "l.finalend AS end, "
+					       .        "c.type "
+							 . "FROM log l, "
+					       .      "sublog s "
+					       . "LEFT JOIN computer c ON (s.computerid = c.id) "
+					       . "LEFT JOIN computer c2 ON (s.hostcomputerid = c2.id) "
+					       . "WHERE l.start < '$enddt' AND "
+					       .       "l.finalend > '$startdt' AND "
+					       .       "s.logid = l.id AND "
+					       .       "l.wasavailable = 1 AND "
+					       .       "l.userid != $reloadid AND "
+							 .       "(c.type = 'blade' OR "
+					       .       " (c.type = 'virtualmachine' AND c2.type = 'blade'))";
+				}
+				elseif($mode == 'provisioning') {
+					$query = "SELECT s.hostcomputerid, "
+					       .        "l.start AS start, "
+					       .        "l.finalend AS end, "
+					       .        "c.type "
+							 . "FROM log l "
+					       . "JOIN ("
+					       .       "SELECT s.logid, "
+					       .              "MIN(s.computerid) AS computerid "
+					       .       "FROM sublog s, "
+					       .            "computer c "
+					       .       "WHERE s.computerid = c.id AND "
+					       .             "c.provisioningid = $provid "
+					       .       "GROUP BY logid "
+					       .       ") AS s2 ON (s2.logid = l.id), "
+					       .      "sublog s "
+					       . "LEFT JOIN computer c ON (s.computerid = c.id) "
+					       . "LEFT JOIN computer c2 ON (s.hostcomputerid = c2.id) "
+					       . "WHERE l.start < '$enddt' AND "
+					       .       "l.finalend > '$startdt' AND "
+					       .       "s.logid = l.id AND "
+					       .       "l.wasavailable = 1 AND "
+					       .       "l.userid != $reloadid AND "
+							 .       "(c.type = 'blade' OR "
+					       .       " (c.type = 'virtualmachine' AND c2.type = 'blade'))";
+				}
 			}
 			$qh = doQuery($query, 101);
 			$comps = array();
@@ -998,17 +1177,19 @@ function getStatGraphConBladeUserData($s
 		$data['xlabels'][] = array('value' => $cnt, 'text' => $label);
 	}
 	if(count($addcache))
-		addToStatGraphCache('concurblade', $addcache, $affilid);
+		addToStatGraphCache('concurblade', $addcache, $affilid, $provid);
 	return($data);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 ///
-/// \fn getStatGraphConVMUserData($start, $end, $affilid)
+/// \fn getStatGraphConVMUserData($start, $end, $affilid, $mode, $provid)
 ///
 /// \param $start - starting day in YYYY-MM-DD format
 /// \param $end - ending day in YYYY-MM-DD format
 /// \param $affilid - affiliationid of data to gather
+/// \param $mode - stat mode - 'default' or 'provisioning'
+/// \param $provid - provisioning id - ignored unless $mode is 'provisioning'
 ///
 /// \return an array with three keys:\n
 /// \b points - an array with y and tooltip keys that have the same value which
@@ -1022,7 +1203,7 @@ function getStatGraphConBladeUserData($s
 /// and creates an array with the max concurrent users of vms per day
 ///
 ////////////////////////////////////////////////////////////////////////////////
-function getStatGraphConVMUserData($start, $end, $affilid) {
+function getStatGraphConVMUserData($start, $end, $affilid, $mode, $provid) {
 	$startdt = $start . " 00:00:00";
 	$enddt = $end . " 23:59:59";
 	$startunix = datetimeToUnix($startdt);
@@ -1051,7 +1232,8 @@ function getStatGraphConVMUserData($star
 	       . "WHERE graphtype = 'concurvm' AND "
 			 .       "affiliationid = $affilid AND "
 	       .       "statdate >= '$start' AND "
-	       .       "statdate <= '$end'";
+	       .       "statdate <= '$end' AND "
+	       .       "provisioningid = $provid";
 	$qh = doQuery($query, 101);
 	while($row = mysql_fetch_assoc($qh))
 		$cachepts[$row['statdate']] = $row['value'];
@@ -1089,18 +1271,43 @@ function getStatGraphConVMUserData($star
 						 .       "u.affiliationid = $affilid";
 			}
 			else {
-				$query = "SELECT l.start AS start, "
-				       .        "l.finalend AS end "
-				       . "FROM log l, "
-				       .      "sublog s, "
-				       .      "computer c "
-				       . "WHERE l.start < '$enddt' AND "
-				       .       "l.finalend > '$startdt' AND "
-				       .       "s.logid = l.id AND "
-				       .       "s.computerid = c.id AND "
-				       .       "l.wasavailable = 1 AND "
-				       .       "c.type = 'virtualmachine' AND "
-				       .       "l.userid != $reloadid";
+				if($mode == 'default') {
+					$query = "SELECT l.start AS start, "
+					       .        "l.finalend AS end "
+					       . "FROM log l, "
+					       .      "sublog s, "
+					       .      "computer c "
+					       . "WHERE l.start < '$enddt' AND "
+					       .       "l.finalend > '$startdt' AND "
+					       .       "s.logid = l.id AND "
+					       .       "s.computerid = c.id AND "
+					       .       "l.wasavailable = 1 AND "
+					       .       "c.type = 'virtualmachine' AND "
+					       .       "l.userid != $reloadid";
+				}
+				elseif($mode == 'provisioning') {
+					$query = "SELECT l.start AS start, "
+					       .        "l.finalend AS end "
+					       . "FROM computer c, "
+					       .      "sublog s, "
+					       .      "log l "
+					       . "JOIN ("
+					       .       "SELECT s.logid, "
+					       .              "MIN(s.computerid) AS computerid "
+					       .       "FROM sublog s, "
+					       .            "computer c "
+					       .       "WHERE s.computerid = c.id AND "
+					       .             "c.provisioningid = $provid "
+					       .       "GROUP BY logid "
+					       .       ") AS s2 ON (s2.logid = l.id) "
+					       . "WHERE l.start < '$enddt' AND "
+					       .       "l.finalend > '$startdt' AND "
+					       .       "s.logid = l.id AND "
+					       .       "s.computerid = c.id AND "
+					       .       "l.wasavailable = 1 AND "
+					       .       "c.type = 'virtualmachine' AND "
+					       .       "l.userid != $reloadid";
+				}
 			}
 			$qh = doQuery($query, 101);
 			while($row = mysql_fetch_assoc($qh)) {
@@ -1132,24 +1339,25 @@ function getStatGraphConVMUserData($star
 		$data['xlabels'][] = array('value' => $cnt, 'text' => $label);
 	}
 	if(count($addcache))
-		addToStatGraphCache('concurvm', $addcache, $affilid);
+		addToStatGraphCache('concurvm', $addcache, $affilid, $provid);
 	return($data);
 }
 
 ////////////////////////////////////////////////////////////////////////////////
 ///
-/// \fn addToStatGraphCache($type, $addcache, $affilid)
+/// \fn addToStatGraphCache($type, $addcache, $affilid, $provid)
 ///
 /// \param $type - type of data to add, one of totalres, concurres, concurblade,
 /// or concurvm
 /// \param $addcache - array of data where the keys are a date and the values
 /// are the stat value for that date
 /// \param $affilid - affiliation id for which the data is associated
+/// \param $provid - provisioning id - 0 for all provisioning ids, > 0 otherwise
 ///
 /// \brief adds passed in data to statgraphcache table
 ///
 ////////////////////////////////////////////////////////////////////////////////
-function addToStatGraphCache($type, $addcache, $affilid) {
+function addToStatGraphCache($type, $addcache, $affilid, $provid) {
 	$nosave = time() - SECINDAY;
 	$values = array();
 	foreach($addcache as $date => $value) {
@@ -1157,13 +1365,13 @@ function addToStatGraphCache($type, $add
 		if($startts < $nosave) {
 			$tmp = explode(' ', $date);
 			$statdate = $tmp[0];
-			$values[] = "('$type', '$statdate', $affilid, $value)";
+			$values[] = "('$type', '$statdate', $affilid, $value, $provid)";
 		}
 	}
 	if(count($values)) {
 		$insval = implode(',', $values);
-		$query = "INSERT INTO statgraphcache "
-		       . "(graphtype, statdate, affiliationid, value) "
+		$query = "INSERT IGNORE INTO statgraphcache "
+		       . "(graphtype, statdate, affiliationid, value, provisioningid) "
 		       . "VALUES $insval";
 		doQuery($query, 101);
 	}