mbligh | 9bb92fe | 2007-09-12 15:54:23 +0000 | [diff] [blame] | 1 | #!/usr/bin/python |
mbligh | 2aaeb67 | 2007-10-01 14:54:18 +0000 | [diff] [blame^] | 2 | import os, re, db, sys |
mbligh | 9bb92fe | 2007-09-12 15:54:23 +0000 | [diff] [blame] | 3 | |
mbligh | 8e1ab17 | 2007-09-13 17:29:56 +0000 | [diff] [blame] | 4 | # Pulling hierarchy: |
| 5 | # |
| 6 | # test pulls in (kernel, job, attributes, iterations) |
| 7 | # kernel pulls in (patches) |
| 8 | # |
| 9 | # Note that job does put pull test - test is the primary object. |
mbligh | 9bb92fe | 2007-09-12 15:54:23 +0000 | [diff] [blame] | 10 | |
mbligh | 2aaeb67 | 2007-10-01 14:54:18 +0000 | [diff] [blame^] | 11 | tko = os.path.dirname(os.path.realpath(os.path.abspath(sys.argv[0]))) |
| 12 | root_url_file = os.path.join(tko, '.root_url') |
| 13 | if os.path.exists(root_url_file): |
| 14 | html_root = open(root_url_file, 'r').readline().rstrip() |
| 15 | else: |
| 16 | html_root = 'http://test.kernel.org/google/' |
| 17 | |
| 18 | |
| 19 | class machine: |
| 20 | @classmethod |
| 21 | def select(klass, db, where = {}): |
| 22 | fields = ['machine_idx', 'hostname', 'machine_group', 'owner'] |
| 23 | machines = [] |
| 24 | for row in db.select(','.join(fields), 'machines', where): |
| 25 | machines.append(klass(db, *row)) |
| 26 | return machines |
| 27 | |
| 28 | |
| 29 | def __init__(self, db, idx, hostname, group, owner): |
| 30 | self.db = db |
| 31 | self.idx = idx |
| 32 | self.hostname = hostname |
| 33 | self.group = group |
| 34 | self.owner = owner |
| 35 | |
mbligh | 250300e | 2007-09-18 00:50:57 +0000 | [diff] [blame] | 36 | |
mbligh | 9bb92fe | 2007-09-12 15:54:23 +0000 | [diff] [blame] | 37 | class kernel: |
mbligh | 8e1ab17 | 2007-09-13 17:29:56 +0000 | [diff] [blame] | 38 | @classmethod |
| 39 | def select(klass, db, where = {}): |
| 40 | fields = ['kernel_idx', 'kernel_hash', 'base', 'printable'] |
| 41 | kernels = [] |
| 42 | for row in db.select(','.join(fields), 'kernels', where): |
| 43 | kernels.append(klass(db, *row)) |
| 44 | return kernels |
mbligh | 9bb92fe | 2007-09-12 15:54:23 +0000 | [diff] [blame] | 45 | |
mbligh | 8e1ab17 | 2007-09-13 17:29:56 +0000 | [diff] [blame] | 46 | |
| 47 | def __init__(self, db, idx, hash, base, printable): |
mbligh | 9bb92fe | 2007-09-12 15:54:23 +0000 | [diff] [blame] | 48 | self.db = db |
mbligh | 8e1ab17 | 2007-09-13 17:29:56 +0000 | [diff] [blame] | 49 | self.idx = idx |
mbligh | 9bb92fe | 2007-09-12 15:54:23 +0000 | [diff] [blame] | 50 | self.hash = hash |
mbligh | 8e1ab17 | 2007-09-13 17:29:56 +0000 | [diff] [blame] | 51 | self.base = base |
| 52 | self.printable = printable |
| 53 | self.patches = [] # THIS SHOULD PULL IN PATCHES! |
mbligh | 9bb92fe | 2007-09-12 15:54:23 +0000 | [diff] [blame] | 54 | |
| 55 | |
| 56 | class test: |
mbligh | 8e1ab17 | 2007-09-13 17:29:56 +0000 | [diff] [blame] | 57 | @classmethod |
mbligh | 31d29c4 | 2007-09-27 00:51:33 +0000 | [diff] [blame] | 58 | def select(klass, db, where = {}, distinct = False): |
mbligh | 8e1ab17 | 2007-09-13 17:29:56 +0000 | [diff] [blame] | 59 | fields = ['test_idx', 'job_idx', 'test', 'subdir', |
mbligh | 2aaeb67 | 2007-10-01 14:54:18 +0000 | [diff] [blame^] | 60 | 'kernel_idx', 'status', 'reason', 'machine_idx'] |
mbligh | 8e1ab17 | 2007-09-13 17:29:56 +0000 | [diff] [blame] | 61 | tests = [] |
mbligh | 31d29c4 | 2007-09-27 00:51:33 +0000 | [diff] [blame] | 62 | for row in db.select(','.join(fields), 'tests', where, distinct): |
mbligh | 8e1ab17 | 2007-09-13 17:29:56 +0000 | [diff] [blame] | 63 | tests.append(klass(db, *row)) |
| 64 | return tests |
| 65 | |
| 66 | |
mbligh | 2aaeb67 | 2007-10-01 14:54:18 +0000 | [diff] [blame^] | 67 | def __init__(self, db, test_idx, job_idx, testname, subdir, kernel_idx, status_num, reason, machine_idx): |
mbligh | 8e1ab17 | 2007-09-13 17:29:56 +0000 | [diff] [blame] | 68 | self.idx = test_idx |
mbligh | 250300e | 2007-09-18 00:50:57 +0000 | [diff] [blame] | 69 | self.job = job(db, job_idx) |
mbligh | de7335d | 2007-09-26 16:53:20 +0000 | [diff] [blame] | 70 | self.testname = testname |
mbligh | 8e1ab17 | 2007-09-13 17:29:56 +0000 | [diff] [blame] | 71 | self.subdir = subdir |
mbligh | 50a2525 | 2007-09-27 15:26:17 +0000 | [diff] [blame] | 72 | self.kernel_idx = kernel_idx |
| 73 | self.__kernel = None |
| 74 | self.__iterations = None |
mbligh | 2aaeb67 | 2007-10-01 14:54:18 +0000 | [diff] [blame^] | 75 | self.machine_idx = machine_idx |
| 76 | self.__machine = None |
mbligh | 8e1ab17 | 2007-09-13 17:29:56 +0000 | [diff] [blame] | 77 | self.status_num = status_num |
| 78 | self.status_word = db.status_word[status_num] |
mbligh | 9bb92fe | 2007-09-12 15:54:23 +0000 | [diff] [blame] | 79 | self.reason = reason |
mbligh | 50a2525 | 2007-09-27 15:26:17 +0000 | [diff] [blame] | 80 | self.db = db |
mbligh | de7335d | 2007-09-26 16:53:20 +0000 | [diff] [blame] | 81 | if self.subdir: |
| 82 | self.url = html_root + self.job.tag + '/' + self.subdir |
| 83 | else: |
mbligh | 676510c | 2007-09-28 01:28:12 +0000 | [diff] [blame] | 84 | self.url = None |
mbligh | 16ae926 | 2007-09-21 00:53:08 +0000 | [diff] [blame] | 85 | |
mbligh | 50a2525 | 2007-09-27 15:26:17 +0000 | [diff] [blame] | 86 | |
| 87 | |
| 88 | def iterations(self): |
| 89 | """ |
| 90 | Caching function for iterations |
| 91 | """ |
| 92 | if not self.__iterations: |
| 93 | self.__iterations = {} |
| 94 | # A dictionary - dict{key} = [value1, value2, ....] |
| 95 | where = {'test_idx' : self.idx} |
| 96 | for i in iteration.select(self.db, where): |
| 97 | if self.__iterations.has_key(i.key): |
| 98 | self.__iterations[i.key].append(i.value) |
| 99 | else: |
| 100 | self.__iterations[i.key] = [i.value] |
| 101 | return self.__iterations |
| 102 | |
| 103 | |
| 104 | def kernel(self): |
| 105 | """ |
| 106 | Caching function for kernels |
| 107 | """ |
| 108 | if not self.__kernel: |
| 109 | where = {'kernel_idx' : self.kernel_idx} |
| 110 | self.__kernel = kernel.select(self.db, where)[0] |
| 111 | return self.__kernel |
| 112 | |
mbligh | 250300e | 2007-09-18 00:50:57 +0000 | [diff] [blame] | 113 | |
mbligh | 2aaeb67 | 2007-10-01 14:54:18 +0000 | [diff] [blame^] | 114 | def machine(self): |
| 115 | """ |
| 116 | Caching function for kernels |
| 117 | """ |
| 118 | if not self.__machine: |
| 119 | where = {'machine_idx' : self.machine_idx} |
| 120 | self.__machine = machine.select(self.db, where)[0] |
| 121 | return self.__machine |
| 122 | |
| 123 | |
mbligh | 250300e | 2007-09-18 00:50:57 +0000 | [diff] [blame] | 124 | class job: |
| 125 | def __init__(self, db, job_idx): |
| 126 | where = {'job_idx' : job_idx} |
mbligh | 2aaeb67 | 2007-10-01 14:54:18 +0000 | [diff] [blame^] | 127 | rows = db.select('tag, machine_idx', 'jobs', where) |
mbligh | 250300e | 2007-09-18 00:50:57 +0000 | [diff] [blame] | 128 | if not rows: |
| 129 | return None |
mbligh | 2aaeb67 | 2007-10-01 14:54:18 +0000 | [diff] [blame^] | 130 | (self.tag, self.machine_idx) = rows[0] |
mbligh | 250300e | 2007-09-18 00:50:57 +0000 | [diff] [blame] | 131 | |
mbligh | 8e1ab17 | 2007-09-13 17:29:56 +0000 | [diff] [blame] | 132 | |
mbligh | 16ae926 | 2007-09-21 00:53:08 +0000 | [diff] [blame] | 133 | class iteration: |
| 134 | @classmethod |
| 135 | def select(klass, db, where): |
| 136 | fields = ['iteration', 'attribute', 'value'] |
| 137 | iterations = [] |
| 138 | rows = db.select(','.join(fields), 'iteration_result', where) |
| 139 | for row in rows: |
| 140 | iterations.append(klass(*row)) |
| 141 | return iterations |
| 142 | |
| 143 | |
| 144 | def __init__(self, iteration, key, value): |
| 145 | self.iteration = iteration |
| 146 | self.key = key |
| 147 | self.value = value |
| 148 | |
mbligh | 8e1ab17 | 2007-09-13 17:29:56 +0000 | [diff] [blame] | 149 | # class patch: |
| 150 | # def __init__(self): |
| 151 | # self.spec = None |