Multi curve plotting for kernel performance:
1. add machine name as well as machine type for the title. the logic could be
avoided if all the machines are included in the machines file
2. sort the kernel in the right order and get the first kernel data as the base
line for the rest.
3. add filter for the kernel version. released/experimental/rc

From: Ying Han <[email protected]>
Signed-off-by: Martin Bligh <[email protected]>



git-svn-id: http://test.kernel.org/svn/autotest/trunk@1046 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/tko/machine_aggr.cgi b/tko/machine_aggr.cgi
new file mode 100644
index 0000000..b5fb953
--- /dev/null
+++ b/tko/machine_aggr.cgi
@@ -0,0 +1,94 @@
+#!/usr/bin/python
+
+# http://test.kernel.org/perf/kernbench.elm3b6.png
+
+import cgi, cgitb, os, sys, re, subprocess
+cgitb.enable()
+Popen = subprocess.Popen
+
+tko = os.path.dirname(os.path.realpath(os.path.abspath(sys.argv[0])))
+sys.path.insert(0, tko)
+import db, display, frontend, plotgraph
+client_bin = os.path.abspath(os.path.join(tko, '../client/bin'))
+sys.path.insert(0, client_bin)
+import kernel_versions
+
+released_kernel = re.compile('2\.\d\.\d+(-smp-)[0-9]{3}\.[0-9]$')
+rc_kernel = re.compile('2\.\d\.\d+(-smp-)[0-9]{3}\.[0-9]_rc[0-9]$')
+db = db.db()
+
+def main():
+	form = cgi.FieldStorage()
+
+	benchmarks = form["benchmark"].value
+	keys = form["key"].value
+	machine_idx = form["machine"].value
+	kernel = form["kernel"].value
+	if kernel == "released":
+		kernel = released_kernel	
+	if kernel == "rc":
+		kernel = rc_kernel
+
+	benchmark_idx = benchmarks.split(',')
+	key_idx = keys.split(',')
+	machine = frontend.machine.select(db, {'hostname' : machine_idx})[0]
+
+	#get the machine type from machinename
+	for line in open('machines', 'r'):
+		words = line.rstrip().split('\t')
+		if words[0] == machine.hostname:
+			title = '%s (%s)' % (words[-1], machine.hostname)
+		else:
+			title = '%s' % machine.hostname
+
+	graph = plotgraph.gnuplot(title, 'Kernel', 'normalized throughput (%)', xsort = sort_kernels, size = "600,500")
+	for benchmark, key in zip(benchmark_idx, key_idx):
+		reference_value = None
+		data = {}
+		where = { 'subdir' : benchmark, 'machine_idx' : machine.idx }
+
+		#select the corresponding kernels and sort by the release version
+		kernels = set([])
+		kernels_sort = set([])
+		kernels_idx = set([])
+		for test in frontend.test.select(db, where):
+			if kernel == "all":
+				kernels.add(test.kernel().printable)
+				kernels_idx.add(str(test.kernel().idx))
+
+			elif kernel == "experimental":
+				if not re.match(released_kernel, test.kernel().printable)\
+				and not re.match(rc_kernel, test.kernel().printable):
+					kernels.add(test.kernel().printable)
+					kernels_idx.add(str(test.kernel().idx))
+			else:
+				if re.match(kernel, test.kernel().printable):
+					kernels.add(test.kernel().printable)
+					kernels_idx.add(str(test.kernel().idx))
+		kernels_sort = sort_kernels(list(kernels))
+
+		#get the base value for each benchmark
+		kernel_base = frontend.kernel.select(db, {'printable' : kernels_sort[0]})[0]
+		for test in frontend.test.select(db, { 'subdir' : benchmark, 'machine_idx' : machine.idx, 'kernel_idx' : kernel_base.idx}):
+			iterations = test.iterations()
+			if iterations.has_key(key):
+				reference_value = sum(iterations[key])/len(iterations[key])
+				break
+
+		wherein = { 'kernel_idx' : kernels_idx }
+		for test in frontend.test.select(db, where, wherein):
+			iterations = test.iterations()
+			if iterations.has_key(key):
+				if benchmark == "kernbench":
+					data[test.kernel().printable] = [((reference_value / i - 1)*100) for i in iterations[key]]
+				else:
+					data[test.kernel().printable] = [((i / reference_value - 1)*100) for i in iterations[key]]
+		graph.add_dataset(benchmark+' ( '+key+' ) ',data)
+
+	graph.plot(cgi_header = True)
+
+
+def sort_kernels(kernels):
+	return sorted(kernels, key = kernel_versions.version_encode)
+
+main()