kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 1 | # Copyright 2011 Google Inc. All Rights Reserved. |
| 2 | |
| 3 | __author__ = 'kbaclawski@google.com (Krystian Baclawski)' |
| 4 | |
| 5 | import os.path |
kbaclawski | a71f1c7 | 2013-02-15 21:28:26 +0000 | [diff] [blame] | 6 | import time |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 7 | |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 8 | from automation.clients.helper import jobs |
| 9 | from automation.clients.helper import perforce |
kbaclawski | cc113a4 | 2013-02-15 21:20:07 +0000 | [diff] [blame] | 10 | from automation.common import command as cmd |
| 11 | from automation.common import job |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 12 | |
| 13 | |
| 14 | class JobsFactory(object): |
Luis Lozano | f2a3ef4 | 2015-12-15 13:49:30 -0800 | [diff] [blame] | 15 | |
kbaclawski | f81c60d | 2013-02-15 21:15:08 +0000 | [diff] [blame] | 16 | def __init__(self): |
| 17 | self.commands = CommandsFactory() |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 18 | |
kbaclawski | 23b34d4 | 2013-02-15 22:48:52 +0000 | [diff] [blame] | 19 | def CheckoutCrosstool(self, target): |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 20 | command = self.commands.CheckoutCrosstool() |
kbaclawski | 23b34d4 | 2013-02-15 22:48:52 +0000 | [diff] [blame] | 21 | new_job = jobs.CreateLinuxJob('CheckoutCrosstool(%s)' % target, command) |
Luis Lozano | f2a3ef4 | 2015-12-15 13:49:30 -0800 | [diff] [blame] | 22 | checkout_dir_dep = job.FolderDependency(new_job, |
| 23 | CommandsFactory.CHECKOUT_DIR) |
kbaclawski | 23b34d4 | 2013-02-15 22:48:52 +0000 | [diff] [blame] | 24 | manifests_dir_dep = job.FolderDependency( |
| 25 | new_job, os.path.join(self.commands.buildit_path, target), 'manifests') |
| 26 | return new_job, checkout_dir_dep, manifests_dir_dep |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 27 | |
| 28 | def BuildRelease(self, checkout_dir, target): |
| 29 | command = self.commands.BuildRelease(target) |
kbaclawski | f81c60d | 2013-02-15 21:15:08 +0000 | [diff] [blame] | 30 | new_job = jobs.CreateLinuxJob('BuildRelease(%s)' % target, command) |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 31 | new_job.DependsOnFolder(checkout_dir) |
Luis Lozano | f2a3ef4 | 2015-12-15 13:49:30 -0800 | [diff] [blame] | 32 | build_tree_dep = job.FolderDependency(new_job, |
| 33 | self.commands.buildit_work_dir_path) |
kbaclawski | 23b34d4 | 2013-02-15 22:48:52 +0000 | [diff] [blame] | 34 | return new_job, build_tree_dep |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 35 | |
kbaclawski | 569534a | 2013-02-15 22:49:27 +0000 | [diff] [blame] | 36 | def RunTests(self, checkout_dir, build_tree_dir, target, board, component): |
| 37 | command = self.commands.RunTests(target, board, component) |
Luis Lozano | f2a3ef4 | 2015-12-15 13:49:30 -0800 | [diff] [blame] | 38 | new_job = jobs.CreateLinuxJob('RunTests(%s, %s, %s)' % |
| 39 | (target, component, board), command) |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 40 | new_job.DependsOnFolder(checkout_dir) |
| 41 | new_job.DependsOnFolder(build_tree_dir) |
kbaclawski | 23b34d4 | 2013-02-15 22:48:52 +0000 | [diff] [blame] | 42 | testrun_dir_dep = job.FolderDependency( |
| 43 | new_job, self.commands.dejagnu_output_path, board) |
| 44 | return new_job, testrun_dir_dep |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 45 | |
kbaclawski | 23b34d4 | 2013-02-15 22:48:52 +0000 | [diff] [blame] | 46 | def GenerateReport(self, testrun_dirs, manifests_dir, target, boards): |
| 47 | command = self.commands.GenerateReport(boards) |
kbaclawski | e78cbd4 | 2013-02-15 21:20:04 +0000 | [diff] [blame] | 48 | new_job = jobs.CreateLinuxJob('GenerateReport(%s)' % target, command) |
kbaclawski | 23b34d4 | 2013-02-15 22:48:52 +0000 | [diff] [blame] | 49 | new_job.DependsOnFolder(manifests_dir) |
| 50 | for testrun_dir in testrun_dirs: |
| 51 | new_job.DependsOnFolder(testrun_dir) |
kbaclawski | e78cbd4 | 2013-02-15 21:20:04 +0000 | [diff] [blame] | 52 | return new_job |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 53 | |
kbaclawski | cc113a4 | 2013-02-15 21:20:07 +0000 | [diff] [blame] | 54 | |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 55 | class CommandsFactory(object): |
| 56 | CHECKOUT_DIR = 'crosstool-checkout-dir' |
| 57 | |
kbaclawski | f81c60d | 2013-02-15 21:15:08 +0000 | [diff] [blame] | 58 | def __init__(self): |
Luis Lozano | f2a3ef4 | 2015-12-15 13:49:30 -0800 | [diff] [blame] | 59 | self.buildit_path = os.path.join(self.CHECKOUT_DIR, 'gcctools', 'crosstool', |
| 60 | 'v15') |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 61 | |
kbaclawski | f81c60d | 2013-02-15 21:15:08 +0000 | [diff] [blame] | 62 | self.buildit_work_dir = 'buildit-tmp' |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 63 | self.buildit_work_dir_path = os.path.join('$JOB_TMP', self.buildit_work_dir) |
Luis Lozano | f2a3ef4 | 2015-12-15 13:49:30 -0800 | [diff] [blame] | 64 | self.dejagnu_output_path = os.path.join(self.buildit_work_dir_path, |
| 65 | 'dejagnu-output') |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 66 | |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 67 | paths = { |
| 68 | 'gcctools': [ |
Luis Lozano | f2a3ef4 | 2015-12-15 13:49:30 -0800 | [diff] [blame] | 69 | 'crosstool/v15/...', 'scripts/...' |
| 70 | ], |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 71 | 'gcctools/google_vendor_src_branch': [ |
Luis Lozano | f2a3ef4 | 2015-12-15 13:49:30 -0800 | [diff] [blame] | 72 | 'binutils/binutils-2.21/...', 'gdb/gdb-7.2.x/...', |
| 73 | 'zlib/zlib-1.2.3/...' |
| 74 | ], |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 75 | 'gcctools/vendor_src': [ |
Luis Lozano | f2a3ef4 | 2015-12-15 13:49:30 -0800 | [diff] [blame] | 76 | 'gcc/google/gcc-4_6/...' |
| 77 | ] |
| 78 | } |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 79 | |
kbaclawski | 1c5658c | 2013-02-15 20:23:41 +0000 | [diff] [blame] | 80 | p4view = perforce.View('depot2', |
| 81 | perforce.PathMapping.ListFromPathDict(paths)) |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 82 | |
kbaclawski | f81c60d | 2013-02-15 21:15:08 +0000 | [diff] [blame] | 83 | self.p4client = perforce.CommandsFactory(self.CHECKOUT_DIR, p4view) |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 84 | |
| 85 | def CheckoutCrosstool(self): |
kbaclawski | 085ff81 | 2013-02-15 20:44:50 +0000 | [diff] [blame] | 86 | p4client = self.p4client |
| 87 | |
| 88 | return p4client.SetupAndDo(p4client.Sync(), |
| 89 | p4client.SaveCurrentCLNumber('CLNUM'), |
| 90 | p4client.Remove()) |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 91 | |
| 92 | def BuildRelease(self, target): |
kbaclawski | 23b34d4 | 2013-02-15 22:48:52 +0000 | [diff] [blame] | 93 | clnum_path = os.path.join('$JOB_TMP', self.CHECKOUT_DIR, 'CLNUM') |
kbaclawski | 5023b00 | 2013-02-15 20:18:02 +0000 | [diff] [blame] | 94 | |
Luis Lozano | f2a3ef4 | 2015-12-15 13:49:30 -0800 | [diff] [blame] | 95 | toolchain_root = os.path.join('/google/data/rw/projects/toolchains', target, |
| 96 | 'unstable') |
kbaclawski | 23b34d4 | 2013-02-15 22:48:52 +0000 | [diff] [blame] | 97 | toolchain_path = os.path.join(toolchain_root, '${CLNUM}') |
kbaclawski | a71f1c7 | 2013-02-15 21:28:26 +0000 | [diff] [blame] | 98 | |
kbaclawski | 4497d2d | 2013-02-15 21:28:38 +0000 | [diff] [blame] | 99 | build_toolchain = cmd.Wrapper( |
| 100 | cmd.Chain( |
Luis Lozano | f2a3ef4 | 2015-12-15 13:49:30 -0800 | [diff] [blame] | 101 | cmd.MakeDir(toolchain_path), |
| 102 | cmd.Shell('buildit', |
| 103 | '--keep-work-dir', |
| 104 | '--build-type=release', |
| 105 | '--work-dir=%s' % self.buildit_work_dir_path, |
| 106 | '--results-dir=%s' % toolchain_path, |
| 107 | '--force-release=%s' % '${CLNUM}', |
| 108 | target, |
| 109 | path='.')), |
kbaclawski | 23b34d4 | 2013-02-15 22:48:52 +0000 | [diff] [blame] | 110 | cwd=self.buildit_path, |
| 111 | umask='0022', |
| 112 | env={'CLNUM': '$(< %s)' % clnum_path}) |
kbaclawski | a71f1c7 | 2013-02-15 21:28:26 +0000 | [diff] [blame] | 113 | |
kbaclawski | 23b34d4 | 2013-02-15 22:48:52 +0000 | [diff] [blame] | 114 | # remove all but 10 most recent directories |
kbaclawski | a71f1c7 | 2013-02-15 21:28:26 +0000 | [diff] [blame] | 115 | remove_old_toolchains_from_x20 = cmd.Wrapper( |
| 116 | cmd.Pipe( |
Luis Lozano | f2a3ef4 | 2015-12-15 13:49:30 -0800 | [diff] [blame] | 117 | cmd.Shell('ls', '-1', '-r'), cmd.Shell('sed', '-e', '1,10d'), |
kbaclawski | a71f1c7 | 2013-02-15 21:28:26 +0000 | [diff] [blame] | 118 | cmd.Shell('xargs', 'rm', '-r', '-f')), |
| 119 | cwd=toolchain_root) |
| 120 | |
kbaclawski | 4497d2d | 2013-02-15 21:28:38 +0000 | [diff] [blame] | 121 | return cmd.Chain(build_toolchain, remove_old_toolchains_from_x20) |
kbaclawski | f81c60d | 2013-02-15 21:15:08 +0000 | [diff] [blame] | 122 | |
kbaclawski | 569534a | 2013-02-15 22:49:27 +0000 | [diff] [blame] | 123 | def RunTests(self, target, board, component='gcc'): |
kbaclawski | 23b34d4 | 2013-02-15 22:48:52 +0000 | [diff] [blame] | 124 | dejagnu_flags = ['--outdir=%s' % self.dejagnu_output_path, |
kbaclawski | ef80001 | 2013-02-15 21:19:59 +0000 | [diff] [blame] | 125 | '--target_board=%s' % board] |
kbaclawski | f81c60d | 2013-02-15 21:15:08 +0000 | [diff] [blame] | 126 | |
kbaclawski | 6b97025 | 2013-02-15 21:20:39 +0000 | [diff] [blame] | 127 | # Look for {pandaboard,qemu}.exp files in |
| 128 | # //depot/google3/experimental/users/kbaclawski/dejagnu/boards |
| 129 | |
kbaclawski | f81c60d | 2013-02-15 21:15:08 +0000 | [diff] [blame] | 130 | site_exp_file = os.path.join('/google/src/head/depot/google3', |
| 131 | 'experimental/users/kbaclawski', |
| 132 | 'dejagnu/site.exp') |
| 133 | |
Luis Lozano | f2a3ef4 | 2015-12-15 13:49:30 -0800 | [diff] [blame] | 134 | build_dir_path = os.path.join(target, 'rpmbuild/BUILD/crosstool*-0.0', |
| 135 | 'build-%s' % component) |
kbaclawski | f81c60d | 2013-02-15 21:15:08 +0000 | [diff] [blame] | 136 | |
kbaclawski | ef80001 | 2013-02-15 21:19:59 +0000 | [diff] [blame] | 137 | run_dejagnu = cmd.Wrapper( |
kbaclawski | f81c60d | 2013-02-15 21:15:08 +0000 | [diff] [blame] | 138 | cmd.Chain( |
kbaclawski | 23b34d4 | 2013-02-15 22:48:52 +0000 | [diff] [blame] | 139 | cmd.MakeDir(self.dejagnu_output_path), |
Luis Lozano | f2a3ef4 | 2015-12-15 13:49:30 -0800 | [diff] [blame] | 140 | cmd.Shell('make', |
| 141 | 'check', |
| 142 | '-k', |
kbaclawski | cc113a4 | 2013-02-15 21:20:07 +0000 | [diff] [blame] | 143 | '-j $(grep -c processor /proc/cpuinfo)', |
| 144 | 'RUNTESTFLAGS="%s"' % ' '.join(dejagnu_flags), |
| 145 | 'DEJAGNU="%s"' % site_exp_file, |
| 146 | ignore_error=True)), |
kbaclawski | 569534a | 2013-02-15 22:49:27 +0000 | [diff] [blame] | 147 | cwd=os.path.join(self.buildit_work_dir_path, build_dir_path), |
kbaclawski | 6b97025 | 2013-02-15 21:20:39 +0000 | [diff] [blame] | 148 | env={'REMOTE_TMPDIR': 'job-$JOB_ID'}) |
kbaclawski | ef80001 | 2013-02-15 21:19:59 +0000 | [diff] [blame] | 149 | |
Luis Lozano | f2a3ef4 | 2015-12-15 13:49:30 -0800 | [diff] [blame] | 150 | save_results = cmd.Copy(self.dejagnu_output_path, |
| 151 | to_dir='$JOB_TMP/results', |
| 152 | recursive=True) |
kbaclawski | ef80001 | 2013-02-15 21:19:59 +0000 | [diff] [blame] | 153 | |
kbaclawski | e78cbd4 | 2013-02-15 21:20:04 +0000 | [diff] [blame] | 154 | return cmd.Chain(run_dejagnu, save_results) |
| 155 | |
kbaclawski | 23b34d4 | 2013-02-15 22:48:52 +0000 | [diff] [blame] | 156 | def GenerateReport(self, boards): |
| 157 | sumfiles = [os.path.join('$JOB_TMP', board, '*.sum') for board in boards] |
| 158 | |
kbaclawski | e78cbd4 | 2013-02-15 21:20:04 +0000 | [diff] [blame] | 159 | return cmd.Wrapper( |
Luis Lozano | f2a3ef4 | 2015-12-15 13:49:30 -0800 | [diff] [blame] | 160 | cmd.Shell('dejagnu.sh', |
| 161 | 'report', |
| 162 | '-m', |
| 163 | '$JOB_TMP/manifests/*.xfail', |
| 164 | '-o', |
| 165 | '$JOB_TMP/results/report.html', |
kbaclawski | 23b34d4 | 2013-02-15 22:48:52 +0000 | [diff] [blame] | 166 | *sumfiles, |
kbaclawski | e78cbd4 | 2013-02-15 21:20:04 +0000 | [diff] [blame] | 167 | path='.'), |
| 168 | cwd='$HOME/automation/clients/report') |