Merge lp:~mwhudson/lava-dispatcher/config-clients-merge into lp:lava-dispatcher
- config-clients-merge
- Merge into trunk
Status: | Merged |
---|---|
Merged at revision: | 105 |
Proposed branch: | lp:~mwhudson/lava-dispatcher/config-clients-merge |
Merge into: | lp:lava-dispatcher |
Diff against target: |
1191 lines (+446/-296) 24 files modified
.bzrignore (+3/-0) MANIFEST.in (+2/-0) lava_dispatcher/__init__.py (+36/-6) lava_dispatcher/actions/android_basic.py (+2/-2) lava_dispatcher/actions/android_deploy.py (+7/-4) lava_dispatcher/actions/deploy.py (+10/-8) lava_dispatcher/actions/launch_control.py (+39/-39) lava_dispatcher/actions/lava-test.py (+7/-9) lava_dispatcher/android_client.py (+7/-10) lava_dispatcher/android_config.py (+0/-65) lava_dispatcher/android_util.py (+3/-4) lava_dispatcher/client.py (+50/-28) lava_dispatcher/config.py (+69/-110) lava_dispatcher/default-config/lava-dispatcher/README (+41/-0) lava_dispatcher/default-config/lava-dispatcher/device-defaults.conf (+50/-0) lava_dispatcher/default-config/lava-dispatcher/device-types/beagle-xm.conf (+20/-0) lava_dispatcher/default-config/lava-dispatcher/device-types/mx51evk.conf (+10/-0) lava_dispatcher/default-config/lava-dispatcher/device-types/mx53loco.conf (+9/-0) lava_dispatcher/default-config/lava-dispatcher/device-types/panda.conf (+19/-0) lava_dispatcher/default-config/lava-dispatcher/device-types/snowball.conf (+12/-0) lava_dispatcher/default-config/lava-dispatcher/lava-dispatcher.conf (+19/-0) lava_dispatcher/tests/test_config.py (+9/-5) lava_dispatcher/utils.py (+13/-6) setup.py (+9/-0) |
To merge this branch: | bzr merge lp:~mwhudson/lava-dispatcher/config-clients-merge |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Paul Larson (community) | Approve | ||
Spring Zhang (community) | Needs Fixing | ||
Review via email: mp+74712@code.launchpad.net |
Commit message
Description of the change
Finally, ready enough for a review! I need to update some things in the doc/ directory, hopefully I'll get to that later today.
Reviewers should start by looking at the lava_scheduler/
I'm more or less happy with the rest of the code. The config.py changes are rather hackish, but heck, they work.
I will prepare branches adding the qemu and ssh clients when I've managed to get them to work :-)
Spring Zhang (qzhang) wrote : | # |
> 156 - data_path = download_
> 157 + boot_path = download_
> lava_cachedir)
> But download_with_cache API seems no change.
Sorry for mistake, it changes.
Paul Larson (pwlars) wrote : | # |
Minor nitpick, let's rename "serial" as a client type to "conmux". I think that's more accurate, and opens the possibility of other serial clients in the future if we ever decide to dispense with conmux for some other solution.
Paul Larson (pwlars) wrote : | # |
We should probably include an example device config file, or at least put a full example (since it's short) including hostname in the README
Paul Larson (pwlars) wrote : | # |
Otherwise, looking good. Let's merge it so that we don't have this big merge looming over us still, and I know spring has some things he wants to merge too. Then we can start testing it and tweak it as needed with plenty of time to spare before the release :) Thanks for pulling this together!
Paul Larson (pwlars) : | # |
Spring Zhang (qzhang) wrote : | # |
i'll test it in my bug fixing branch
Preview Diff
1 | === modified file '.bzrignore' |
2 | --- .bzrignore 2011-04-07 01:21:51 +0000 |
3 | +++ .bzrignore 2011-09-09 01:07:35 +0000 |
4 | @@ -3,3 +3,6 @@ |
5 | ./.virtualenv |
6 | ./bin |
7 | ./lava.egg-info |
8 | +./dist |
9 | +./lava_dispatcher.egg-info |
10 | +./build |
11 | |
12 | === added file 'MANIFEST.in' |
13 | --- MANIFEST.in 1970-01-01 00:00:00 +0000 |
14 | +++ MANIFEST.in 2011-09-09 01:07:35 +0000 |
15 | @@ -0,0 +1,2 @@ |
16 | +include README |
17 | +recursive-include lava_dispatcher/default-config *.conf |
18 | \ No newline at end of file |
19 | |
20 | === modified file 'lava_dispatcher/__init__.py' |
21 | --- lava_dispatcher/__init__.py 2011-09-08 22:12:27 +0000 |
22 | +++ lava_dispatcher/__init__.py 2011-09-09 01:07:35 +0000 |
23 | @@ -27,16 +27,19 @@ |
24 | import pexpect |
25 | |
26 | from lava_dispatcher.actions import get_all_cmds |
27 | +from lava_dispatcher.config import get_config, get_device_config |
28 | from lava_dispatcher.client import LavaClient, CriticalError, GeneralError |
29 | from lava_dispatcher.android_client import LavaAndroidClient |
30 | |
31 | -__version__ = "0.2.2" |
32 | +__version__ = "0.3a1" |
33 | |
34 | class LavaTestJob(object): |
35 | def __init__(self, job_json, oob_file): |
36 | self.job_status = 'pass' |
37 | self.load_job_data(job_json) |
38 | - self.context = LavaContext(self.target, self.image_type, oob_file) |
39 | + dispatcher_config = get_config("lava-dispatcher") |
40 | + self.context = LavaContext( |
41 | + self.target, self.image_type, dispatcher_config, oob_file) |
42 | |
43 | def load_job_data(self, job_json): |
44 | self.job_data = json.loads(job_json) |
45 | @@ -76,6 +79,7 @@ |
46 | else: |
47 | status = 'pass' |
48 | finally: |
49 | + err_msg = "" |
50 | if status == 'fail': |
51 | err_msg = "Lava failed at action %s with error: %s\n" %\ |
52 | (cmd['command'], err) |
53 | @@ -102,11 +106,17 @@ |
54 | |
55 | |
56 | class LavaContext(object): |
57 | - def __init__(self, target, image_type, oob_file): |
58 | - if image_type != "android": |
59 | - self._client = LavaClient(target) |
60 | + def __init__(self, target, image_type, dispatcher_config, oob_file): |
61 | + self.config = dispatcher_config |
62 | + device_config = get_device_config(target) |
63 | + if device_config.get('client_type') != 'serial': |
64 | + raise RuntimeError( |
65 | + "this version of lava-dispatcher only supports serial " |
66 | + "clients, not %r" % device_config.get('client_type')) |
67 | + if image_type == "android": |
68 | + self._client = LavaAndroidClient(self, device_config) |
69 | else: |
70 | - self._client = LavaAndroidClient(target) |
71 | + self._client = LavaClient(self, device_config) |
72 | self.test_data = LavaTestData() |
73 | self.oob_file = oob_file |
74 | |
75 | @@ -114,6 +124,26 @@ |
76 | def client(self): |
77 | return self._client |
78 | |
79 | + @property |
80 | + def lava_server_ip(self): |
81 | + return self.config.get("LAVA_SERVER_IP") |
82 | + |
83 | + @property |
84 | + def lava_image_tmpdir(self): |
85 | + return self.config.get("LAVA_IMAGE_TMPDIR") |
86 | + |
87 | + @property |
88 | + def lava_image_url(self): |
89 | + return self.config.get("LAVA_IMAGE_URL") |
90 | + |
91 | + @property |
92 | + def lava_result_dir(self): |
93 | + return self.config.get("LAVA_RESULT_DIR") |
94 | + |
95 | + @property |
96 | + def lava_cachedir(self): |
97 | + return self.config.get("LAVA_CACHEDIR") |
98 | + |
99 | |
100 | class LavaTestData(object): |
101 | def __init__(self, test_id='lava'): |
102 | |
103 | === modified file 'lava_dispatcher/actions/android_basic.py' |
104 | --- lava_dispatcher/actions/android_basic.py 2011-09-02 03:00:59 +0000 |
105 | +++ lava_dispatcher/actions/android_basic.py 2011-09-09 01:07:35 +0000 |
106 | @@ -60,7 +60,7 @@ |
107 | test_case_result['result'] = "fail" |
108 | |
109 | results['test_results'].append(test_case_result) |
110 | - savebundlefile("monkey", results, timestring) |
111 | + savebundlefile("monkey", results, timestring, self.context.lava_result_dir) |
112 | self.client.proc.sendline("") |
113 | |
114 | |
115 | @@ -146,5 +146,5 @@ |
116 | test_case_result['result'] = "fail" |
117 | |
118 | results['test_results'].append(test_case_result) |
119 | - savebundlefile("basic", results, timestring) |
120 | + savebundlefile("basic", results, timestring, self.context.lava_result_dir) |
121 | self.client.proc.sendline("") |
122 | |
123 | === modified file 'lava_dispatcher/actions/android_deploy.py' |
124 | --- lava_dispatcher/actions/android_deploy.py 2011-09-05 21:52:35 +0000 |
125 | +++ lava_dispatcher/actions/android_deploy.py 2011-09-09 01:07:35 +0000 |
126 | @@ -20,7 +20,6 @@ |
127 | # along with this program; if not, see <http://www.gnu.org/licenses>. |
128 | |
129 | from lava_dispatcher.actions import BaseAction |
130 | -from lava_dispatcher.config import LAVA_IMAGE_TMPDIR, LAVA_IMAGE_URL |
131 | import os |
132 | import sys |
133 | import shutil |
134 | @@ -31,6 +30,8 @@ |
135 | |
136 | class cmd_deploy_linaro_android_image(BaseAction): |
137 | def run(self, boot, system, data, use_cache=True): |
138 | + LAVA_IMAGE_TMPDIR = self.context.lava_image_tmpdir |
139 | + LAVA_IMAGE_URL = self.context.lava_image_url |
140 | client = self.client |
141 | print "deploying Android on %s" % client.hostname |
142 | print " boot: %s" % boot |
143 | @@ -85,14 +86,16 @@ |
144 | :param data_url: url of the Linaro Android data tarball to download |
145 | :param use_cache: whether or not to use the cached copy (if it exists) |
146 | """ |
147 | + lava_cachedir = self.context.lava_cachedir |
148 | + LAVA_IMAGE_TMPDIR = self.context.lava_image_tmpdir |
149 | self.tarball_dir = mkdtemp(dir=LAVA_IMAGE_TMPDIR) |
150 | tarball_dir = self.tarball_dir |
151 | os.chmod(tarball_dir, 0755) |
152 | |
153 | if use_cache: |
154 | - boot_path = download_with_cache(boot_url, tarball_dir) |
155 | - system_path = download_with_cache(system_url, tarball_dir) |
156 | - data_path = download_with_cache(data_url, tarball_dir) |
157 | + boot_path = download_with_cache(boot_url, tarball_dir, lava_cachedir) |
158 | + system_path = download_with_cache(system_url, tarball_dir, lava_cachedir) |
159 | + data_path = download_with_cache(data_url, tarball_dir, lava_cachedir) |
160 | else: |
161 | boot_path = download(boot_url, tarball_dir) |
162 | system_path = download(system_url, tarball_dir) |
163 | |
164 | === modified file 'lava_dispatcher/actions/deploy.py' |
165 | --- lava_dispatcher/actions/deploy.py 2011-09-08 04:23:59 +0000 |
166 | +++ lava_dispatcher/actions/deploy.py 2011-09-09 01:07:35 +0000 |
167 | @@ -26,13 +26,14 @@ |
168 | from tempfile import mkdtemp |
169 | |
170 | from lava_dispatcher.actions import BaseAction |
171 | -from lava_dispatcher.config import LAVA_IMAGE_TMPDIR, LAVA_IMAGE_URL |
172 | from lava_dispatcher.utils import download, download_with_cache |
173 | from lava_dispatcher.client import CriticalError |
174 | |
175 | |
176 | class cmd_deploy_linaro_image(BaseAction): |
177 | def run(self, hwpack, rootfs, use_cache=True): |
178 | + LAVA_IMAGE_TMPDIR = self.context.lava_image_tmpdir |
179 | + LAVA_IMAGE_URL = self.context.lava_image_url |
180 | client = self.client |
181 | print "deploying on %s" % client.hostname |
182 | print " hwpack: %s" % hwpack |
183 | @@ -112,30 +113,31 @@ |
184 | :param hwpack_url: url of the Linaro hwpack to download |
185 | :param rootfs_url: url of the Linaro image to download |
186 | """ |
187 | + lava_cachedir = self.context.lava_cachedir |
188 | + LAVA_IMAGE_TMPDIR = self.context.lava_image_tmpdir |
189 | client = self.client |
190 | self.tarball_dir = mkdtemp(dir=LAVA_IMAGE_TMPDIR) |
191 | tarball_dir = self.tarball_dir |
192 | os.chmod(tarball_dir, 0755) |
193 | if use_cache: |
194 | - hwpack_path = download_with_cache(hwpack_url, tarball_dir) |
195 | - rootfs_path = download_with_cache(rootfs_url, tarball_dir) |
196 | + hwpack_path = download_with_cache(hwpack_url, tarball_dir, lava_cachedir) |
197 | + rootfs_path = download_with_cache(rootfs_url, tarball_dir, lava_cachedir) |
198 | else: |
199 | hwpack_path = download(hwpack_url, tarball_dir) |
200 | rootfs_path = download(rootfs_url, tarball_dir) |
201 | |
202 | image_file = os.path.join(tarball_dir, "lava.img") |
203 | - board = client.board |
204 | cmd = ("sudo linaro-media-create --hwpack-force-yes --dev %s " |
205 | "--image_file %s --binary %s --hwpack %s --image_size 3G" % |
206 | - (board.type, image_file, rootfs_path, hwpack_path)) |
207 | + (client.device_type, image_file, rootfs_path, hwpack_path)) |
208 | rc, output = getstatusoutput(cmd) |
209 | if rc: |
210 | shutil.rmtree(tarball_dir) |
211 | tb = traceback.format_exc() |
212 | client.sio.write(tb) |
213 | raise RuntimeError("linaro-media-create failed: %s" % output) |
214 | - boot_offset = self._get_partition_offset(image_file, board.boot_part) |
215 | - root_offset = self._get_partition_offset(image_file, board.root_part) |
216 | + boot_offset = self._get_partition_offset(image_file, client.boot_part) |
217 | + root_offset = self._get_partition_offset(image_file, client.root_part) |
218 | boot_tgz = os.path.join(tarball_dir, "boot.tgz") |
219 | root_tgz = os.path.join(tarball_dir, "root.tgz") |
220 | try: |
221 | @@ -159,7 +161,7 @@ |
222 | client.run_cmd_master('mount /dev/disk/by-label/testrootfs /mnt/root') |
223 | client.run_cmd_master( |
224 | 'wget -qO- %s |tar --numeric-owner -C /mnt/root -xzf -' % rootfs, |
225 | - timeout = 3600) |
226 | + timeout=3600) |
227 | client.run_cmd_master('echo linaro > /mnt/root/etc/hostname') |
228 | #DO NOT REMOVE - diverting flash-kernel and linking it to /bin/true |
229 | #prevents a serious problem where packages getting installed that |
230 | |
231 | === modified file 'lava_dispatcher/actions/launch_control.py' (properties changed: +x to -x) |
232 | --- lava_dispatcher/actions/launch_control.py 2011-09-06 09:35:13 +0000 |
233 | +++ lava_dispatcher/actions/launch_control.py 2011-09-09 01:07:35 +0000 |
234 | @@ -25,8 +25,6 @@ |
235 | import shutil |
236 | import tarfile |
237 | from lava_dispatcher.actions import BaseAction |
238 | -from lava_dispatcher.config import LAVA_RESULT_DIR |
239 | -from lava_dispatcher.config import LAVA_IMAGE_TMPDIR |
240 | from lava_dispatcher.client import NetworkError |
241 | from lava_dispatcher.utils import download |
242 | from tempfile import mkdtemp |
243 | @@ -40,9 +38,9 @@ |
244 | allow_none=True, use_datetime=True) |
245 | |
246 | #Upload bundle files to dashboard |
247 | - bundle_list = os.listdir("/tmp/%s" % LAVA_RESULT_DIR) |
248 | + bundle_list = os.listdir("/tmp/%s" % self.context.lava_result_dir) |
249 | for bundle_name in bundle_list: |
250 | - bundle = "/tmp/%s/%s" % (LAVA_RESULT_DIR, bundle_name) |
251 | + bundle = "/tmp/%s/%s" % (self.context.lava_result_dir, bundle_name) |
252 | f = open(bundle) |
253 | content = f.read() |
254 | f.close() |
255 | @@ -53,6 +51,7 @@ |
256 | print "xmlrpclib.Fault occurred" |
257 | print "Fault code: %d" % err.faultCode |
258 | print "Fault string: %s" % err.faultString |
259 | + |
260 | # After uploading, remove the bundle file at the host side |
261 | os.remove(bundle) |
262 | |
263 | @@ -79,49 +78,50 @@ |
264 | client.run_cmd_master('mkdir -p /mnt/root') |
265 | client.run_cmd_master( |
266 | 'mount /dev/disk/by-label/%s /mnt/root' % result_disk) |
267 | - client.run_cmd_master('mkdir -p /tmp/%s' % LAVA_RESULT_DIR) |
268 | + client.run_cmd_master('mkdir -p /tmp/%s' % self.context.lava_result_dir) |
269 | client.run_cmd_master( |
270 | - 'cp /mnt/root/%s/*.bundle /tmp/%s' % (LAVA_RESULT_DIR, |
271 | - LAVA_RESULT_DIR)) |
272 | + 'cp /mnt/root/%s/*.bundle /tmp/%s' % (self.context.lava_result_dir, |
273 | + self.context.lava_result_dir)) |
274 | client.run_cmd_master('umount /mnt/root') |
275 | |
276 | #Create tarball of all results |
277 | client.run_cmd_master('cd /tmp') |
278 | client.run_cmd_master( |
279 | - 'tar czf /tmp/lava_results.tgz -C /tmp/%s .' % LAVA_RESULT_DIR) |
280 | + 'tar czf /tmp/lava_results.tgz -C /tmp/%s .' % self.context.lava_result_dir) |
281 | |
282 | master_ip = client.get_master_ip() |
283 | - if master_ip != None: |
284 | - # Set 80 as server port |
285 | - client.run_cmd_master('python -m SimpleHTTPServer 80 &> /dev/null &') |
286 | - time.sleep(3) |
287 | - |
288 | - result_tarball = "http://%s/lava_results.tgz" % master_ip |
289 | - tarball_dir = mkdtemp(dir=LAVA_IMAGE_TMPDIR) |
290 | - os.chmod(tarball_dir, 0755) |
291 | - |
292 | - # download test result with a retry mechanism |
293 | - # set retry timeout to 2mins |
294 | - now = time.time() |
295 | - timeout = 120 |
296 | - while time.time() < now+timeout: |
297 | - try: |
298 | - result_path = download(result_tarball, tarball_dir) |
299 | - except: |
300 | - if time.time() >= now+timeout: |
301 | - raise |
302 | - |
303 | - client.run_cmd_master('kill %1') |
304 | - |
305 | - tar = tarfile.open(result_path) |
306 | - for tarinfo in tar: |
307 | - if os.path.splitext(tarinfo.name)[1] == ".bundle": |
308 | - f = tar.extractfile(tarinfo) |
309 | - content = f.read() |
310 | - f.close() |
311 | - self.all_bundles.append(json.loads(content)) |
312 | - tar.close() |
313 | - shutil.rmtree(tarball_dir) |
314 | + if master_ip == None: |
315 | + raise NetworkError("Getting master image IP address failed") |
316 | + # Set 80 as server port |
317 | + client.run_cmd_master('python -m SimpleHTTPServer 80 &> /dev/null &') |
318 | + time.sleep(3) |
319 | + |
320 | + result_tarball = "http://%s/lava_results.tgz" % master_ip |
321 | + tarball_dir = mkdtemp(dir=self.context.lava_image_tmpdir) |
322 | + os.chmod(tarball_dir, 0755) |
323 | + |
324 | + # download test result with a retry mechanism |
325 | + # set retry timeout to 2mins |
326 | + now = time.time() |
327 | + timeout = 120 |
328 | + while time.time() < now+timeout: |
329 | + try: |
330 | + result_path = download(result_tarball, tarball_dir) |
331 | + except: |
332 | + if time.time() >= now+timeout: |
333 | + raise |
334 | + |
335 | + client.run_cmd_master('kill %1') |
336 | + |
337 | + tar = tarfile.open(result_path) |
338 | + for tarinfo in tar: |
339 | + if os.path.splitext(tarinfo.name)[1] == ".bundle": |
340 | + f = tar.extractfile(tarinfo) |
341 | + content = f.read() |
342 | + f.close() |
343 | + self.all_bundles.append(json.loads(content)) |
344 | + tar.close() |
345 | + shutil.rmtree(tarball_dir) |
346 | |
347 | #flush the serial log |
348 | client.run_shell_command("") |
349 | |
350 | === modified file 'lava_dispatcher/actions/lava-test.py' (properties changed: +x to -x) |
351 | --- lava_dispatcher/actions/lava-test.py 2011-09-08 04:23:59 +0000 |
352 | +++ lava_dispatcher/actions/lava-test.py 2011-09-09 01:07:35 +0000 |
353 | @@ -24,7 +24,7 @@ |
354 | import traceback |
355 | from lava_dispatcher.actions import BaseAction |
356 | from lava_dispatcher.client import OperationFailed |
357 | -from lava_dispatcher.config import LAVA_RESULT_DIR, MASTER_STR |
358 | + |
359 | |
360 | |
361 | def _setup_testrootfs(client): |
362 | @@ -50,10 +50,9 @@ |
363 | 'cp -f /mnt/root/etc/resolv.conf.bak /mnt/root/etc/resolv.conf') |
364 | cmd = ('cat /proc/mounts | awk \'{print $2}\' | grep "^/mnt/root/dev"' |
365 | '| sort -r | xargs umount') |
366 | - client.run_cmd_master( |
367 | - cmd) |
368 | - client.run_cmd_master( |
369 | - 'umount /mnt/root') |
370 | + client.run_cmd_master(cmd) |
371 | + client.run_cmd_master('umount /mnt/root') |
372 | + |
373 | |
374 | |
375 | def _install_lava_test(client): |
376 | @@ -73,11 +72,10 @@ |
377 | client.run_shell_command( |
378 | 'chroot /mnt/root lava-test help', |
379 | response="list-test", timeout=10) |
380 | - client.proc.expect(MASTER_STR, timeout=10) |
381 | + client.proc.expect(client.master_str, timeout=10) |
382 | except: |
383 | tb = traceback.format_exc() |
384 | client.sio.write(tb) |
385 | - _teardown_testrootfs(client) |
386 | raise OperationFailed("lava-test deployment failed") |
387 | |
388 | |
389 | @@ -86,12 +84,12 @@ |
390 | #Make sure in test image now |
391 | client = self.client |
392 | client.in_test_shell() |
393 | - client.run_cmd_tester('mkdir -p %s' % LAVA_RESULT_DIR) |
394 | + client.run_cmd_tester('mkdir -p %s' % self.context.lava_result_dir) |
395 | client.export_display() |
396 | bundle_name = test_name + "-" + datetime.now().strftime("%H%M%S") |
397 | client.run_cmd_tester( |
398 | 'lava-test run %s -o %s/%s.bundle' % ( |
399 | - test_name, LAVA_RESULT_DIR, bundle_name), |
400 | + test_name, self.context.lava_result_dir, bundle_name), |
401 | timeout=timeout) |
402 | |
403 | |
404 | |
405 | === modified file 'lava_dispatcher/android_client.py' |
406 | --- lava_dispatcher/android_client.py 2011-09-08 04:23:59 +0000 |
407 | +++ lava_dispatcher/android_client.py 2011-09-09 01:07:35 +0000 |
408 | @@ -20,12 +20,9 @@ |
409 | import pexpect |
410 | import sys |
411 | from lava_dispatcher.client import LavaClient, OperationFailed |
412 | -from lava_dispatcher.android_config import BOARDS, TESTER_STR |
413 | +from utils import string_to_list |
414 | |
415 | class LavaAndroidClient(LavaClient): |
416 | - def __init__(self, hostname): |
417 | - super(LavaAndroidClient, self).__init__(hostname) |
418 | - self.board = BOARDS[hostname] |
419 | |
420 | def run_adb_shell_command(self, dev_id, cmd, response, timeout=-1): |
421 | adb_cmd = "adb -s %s shell %s" % (dev_id, cmd) |
422 | @@ -42,7 +39,7 @@ |
423 | """ Check that we are in a shell on the test image |
424 | """ |
425 | self.proc.sendline("") |
426 | - id = self.proc.expect([TESTER_STR , pexpect.TIMEOUT]) |
427 | + id = self.proc.expect([self.tester_str , pexpect.TIMEOUT]) |
428 | if id == 1: |
429 | raise OperationFailed |
430 | |
431 | @@ -55,11 +52,11 @@ |
432 | except: |
433 | self.hard_reboot() |
434 | self.enter_uboot() |
435 | - uboot_cmds = self.board.uboot_cmds |
436 | - self.proc.sendline(uboot_cmds[0]) |
437 | - for line in range(1, len(uboot_cmds)): |
438 | + boot_cmds = string_to_list(self.config.get('boot_cmds_android')) |
439 | + self.proc.sendline(boot_cmds[0]) |
440 | + for line in range(1, len(boot_cmds)): |
441 | self.proc.expect("#") |
442 | - self.proc.sendline(uboot_cmds[line]) |
443 | + self.proc.sendline(boot_cmds[line]) |
444 | self.in_test_shell() |
445 | self.proc.sendline("export PS1=\"root@linaro: \"") |
446 | |
447 | @@ -106,7 +103,7 @@ |
448 | |
449 | def check_adb_status(self): |
450 | # XXX: IP could be assigned in other way in the validation farm |
451 | - network_interface = self.board.default_network_interface |
452 | + network_interface = self.default_network_interface |
453 | try: |
454 | self.run_cmd_tester( |
455 | 'netcfg %s dhcp' % network_interface, timeout=60) |
456 | |
457 | === removed file 'lava_dispatcher/android_config.py' |
458 | --- lava_dispatcher/android_config.py 2011-08-16 00:15:08 +0000 |
459 | +++ lava_dispatcher/android_config.py 1970-01-01 00:00:00 +0000 |
460 | @@ -1,65 +0,0 @@ |
461 | -# Copyright (C) 2011 Linaro Limited |
462 | -# |
463 | -# Author: Linaro Validation Team <linaro-dev@lists.linaro.org> |
464 | -# |
465 | -# This file is part of LAVA Dispatcher. |
466 | -# |
467 | -# LAVA Dispatcher is free software; you can redistribute it and/or modify |
468 | -# it under the terms of the GNU General Public License as published by |
469 | -# the Free Software Foundation; either version 2 of the License, or |
470 | -# (at your option) any later version. |
471 | -# |
472 | -# LAVA Dispatcher is distributed in the hope that it will be useful, |
473 | -# but WITHOUT ANY WARRANTY; without even the implied warranty of |
474 | -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
475 | -# GNU General Public License for more details. |
476 | -# |
477 | -# You should have received a copy of the GNU General Public License |
478 | -# along with this program; if not, see <http://www.gnu.org/licenses>. |
479 | - |
480 | -from lava_dispatcher.config import Board |
481 | - |
482 | -class BeagleBoard(Board): |
483 | - uboot_cmds = ["mmc init", |
484 | - "mmc part 0", |
485 | - "setenv bootcmd 'fatload mmc 0:3 0x80000000 uImage;" |
486 | - "fatload mmc 0:3 0x81600000 uInitrd;" |
487 | - "bootm 0x80000000 0x81600000'", |
488 | - "setenv bootargs 'console=tty0 console=ttyO2,115200n8 " |
489 | - "rootwait rw earlyprintk fixrtc nocompcache " |
490 | - "vram=12M omapfb.debug=y omapfb.mode=dvi:1280x720MR-16@60 " |
491 | - "init=/init androidboot.console=ttyO2'", |
492 | - "boot"] |
493 | - type = "beagle" |
494 | - |
495 | - |
496 | -class PandaBoard(Board): |
497 | - uboot_cmds = ["mmc init", |
498 | - "mmc part 0", |
499 | - "setenv bootcmd 'fatload mmc 0:3 0x80200000 uImage;" |
500 | - "fatload mmc 0:3 0x81600000 uInitrd;" |
501 | - "bootm 0x80200000 0x81600000'", |
502 | - "setenv bootargs 'console=tty0 console=ttyO2,115200n8 " |
503 | - "rootwait rw earlyprintk fixrtc nocompcache vram=32M " |
504 | - "omapfb.vram=0:8M mem=456M@0x80000000 mem=512M@0xA0000000 " |
505 | - "omapfb.debug=y omapfb.mode=dvi:1280x720MR-16@60 " |
506 | - "init=/init androidboot.console=ttyO2'", |
507 | - "boot"] |
508 | - type = "panda" |
509 | - |
510 | - |
511 | -#Here, it still needs to maintain a map from boardid to board, for there is only |
512 | -#boardid in jobfile.json |
513 | -BOARDS = { |
514 | - "beagle01": BeagleBoard, |
515 | - "beagle02": BeagleBoard, |
516 | - "beagle03": BeagleBoard, |
517 | - "beagle04": BeagleBoard, |
518 | - "panda01": PandaBoard, |
519 | - "panda02": PandaBoard, |
520 | - "panda03": PandaBoard, |
521 | - "panda04": PandaBoard, |
522 | - } |
523 | - |
524 | -#Test image recognization string |
525 | -TESTER_STR = "root@linaro:" |
526 | |
527 | === modified file 'lava_dispatcher/android_util.py' |
528 | --- lava_dispatcher/android_util.py 2011-06-27 04:55:08 +0000 |
529 | +++ lava_dispatcher/android_util.py 2011-09-09 01:07:35 +0000 |
530 | @@ -22,11 +22,10 @@ |
531 | from datetime import datetime |
532 | import json |
533 | import subprocess |
534 | -from lava_dispatcher.config import LAVA_RESULT_DIR |
535 | import time |
536 | |
537 | # TODO: Result saving could be replaced by linaro_dashboard_bundle probably. |
538 | -def savebundlefile(testname, results, starttime): |
539 | +def savebundlefile(testname, results, starttime, lava_result_dir): |
540 | """ |
541 | Save results as .bundle file under /tmp/LAVA_RESULT_DIR/ |
542 | """ |
543 | @@ -42,9 +41,9 @@ |
544 | testdata['test_runs'] = test_runs |
545 | testdata['test_runs'][0].update(results) |
546 | bundle = testdata |
547 | - subprocess.call(["mkdir", "-p", "/tmp/%s" % LAVA_RESULT_DIR]) |
548 | + subprocess.call(["mkdir", "-p", "/tmp/%s" % lava_result_dir]) |
549 | # The file name should be unique to be distinguishable from others |
550 | - filename = "/tmp/%s/" % LAVA_RESULT_DIR + testname + \ |
551 | + filename = "/tmp/%s/" % lava_result_dir + testname + \ |
552 | str(time.mktime(datetime.utcnow().timetuple())) + ".bundle" |
553 | with open(filename, "wt") as stream: |
554 | json.dump(bundle, stream) |
555 | |
556 | === modified file 'lava_dispatcher/client.py' |
557 | --- lava_dispatcher/client.py 2011-09-08 04:23:59 +0000 |
558 | +++ lava_dispatcher/client.py 2011-09-09 01:07:35 +0000 |
559 | @@ -22,35 +22,56 @@ |
560 | import sys |
561 | import time |
562 | from cStringIO import StringIO |
563 | - |
564 | -from lava_dispatcher.config import ( |
565 | - BOARDS, |
566 | - LAVA_SERVER_IP, |
567 | - MASTER_STR, |
568 | - TESTER_STR, |
569 | - ) |
570 | - |
571 | +from utils import string_to_list |
572 | |
573 | class LavaClient(object): |
574 | - def __init__(self, hostname): |
575 | - self._master_str = MASTER_STR |
576 | - self._tester_str = TESTER_STR |
577 | - cmd = "conmux-console %s" % hostname |
578 | + def __init__(self, context, config): |
579 | + self.context = context |
580 | + self.config = config |
581 | + cmd = "conmux-console %s" % self.hostname |
582 | self.sio = SerialIO(sys.stdout) |
583 | self.proc = pexpect.spawn(cmd, timeout=3600, logfile=self.sio) |
584 | #serial can be slow, races do funny things if you don't increase delay |
585 | self.proc.delaybeforesend=1 |
586 | - self.hostname = hostname |
587 | - # will eventually come from the database |
588 | - self.board = BOARDS[hostname] |
589 | + |
590 | + def device_option(self, option_name): |
591 | + return self.config.get(option_name) |
592 | + |
593 | + def device_option_int(self, option_name): |
594 | + return self.config.getint(option_name) |
595 | + |
596 | + @property |
597 | + def hostname(self): |
598 | + return self.device_option("hostname") |
599 | + |
600 | + @property |
601 | + def tester_str(self): |
602 | + return self.device_option("TESTER_STR") |
603 | |
604 | @property |
605 | def master_str(self): |
606 | - return self._master_str |
607 | - |
608 | - @property |
609 | - def tester_str(self): |
610 | - return self._tester_str |
611 | + return self.device_option("MASTER_STR") |
612 | + |
613 | + @property |
614 | + def boot_cmds(self): |
615 | + uboot_str = self.device_option("boot_cmds") |
616 | + return string_to_list(uboot_str) |
617 | + |
618 | + @property |
619 | + def device_type(self): |
620 | + return self.device_option("device_type") |
621 | + |
622 | + @property |
623 | + def boot_part(self): |
624 | + return self.device_option_int("boot_part") |
625 | + |
626 | + @property |
627 | + def root_part(self): |
628 | + return self.device_option_int("root_part") |
629 | + |
630 | + @property |
631 | + def default_network_interface(self): |
632 | + return self.device_option("default_network_interface") |
633 | |
634 | def in_master_shell(self): |
635 | """ Check that we are in a shell on the master image |
636 | @@ -91,16 +112,16 @@ |
637 | except: |
638 | self.hard_reboot() |
639 | self.enter_uboot() |
640 | - uboot_cmds = self.board.uboot_cmds |
641 | - self.proc.sendline(uboot_cmds[0]) |
642 | - for line in range(1, len(uboot_cmds)): |
643 | - if self.board.type in ["mx51evk", "mx53loco"]: |
644 | + boot_cmds = self.boot_cmds |
645 | + self.proc.sendline(boot_cmds[0]) |
646 | + for line in range(1, len(boot_cmds)): |
647 | + if self.device_type in ["mx51evk", "mx53loco"]: |
648 | self.proc.expect(">", timeout=300) |
649 | - elif self.board.type == "snowball_sd": |
650 | + elif self.device_type == "snowball_sd": |
651 | self.proc.expect("\$", timeout=300) |
652 | else: |
653 | self.proc.expect("#", timeout=300) |
654 | - self.proc.sendline(uboot_cmds[line]) |
655 | + self.proc.sendline(boot_cmds[line]) |
656 | self.in_test_shell() |
657 | |
658 | def enter_uboot(self): |
659 | @@ -131,7 +152,8 @@ |
660 | self.run_shell_command(cmd, self.tester_str, timeout) |
661 | |
662 | def check_network_up(self): |
663 | - self.proc.sendline("LC_ALL=C ping -W4 -c1 %s" % LAVA_SERVER_IP) |
664 | + lava_server_ip = self.context.lava_server_ip |
665 | + self.proc.sendline("LC_ALL=C ping -W4 -c1 %s" % lava_server_ip) |
666 | id = self.proc.expect(["1 received", "0 received", |
667 | "Network is unreachable"], timeout=5) |
668 | self.proc.expect(self.master_str) |
669 | @@ -154,7 +176,7 @@ |
670 | #pattern1 = ".*\n(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})" |
671 | pattern1 = "(\d?\d?\d?\.\d?\d?\d?\.\d?\d?\d?\.\d?\d?\d?)" |
672 | cmd = ("ifconfig %s | grep 'inet addr' | awk -F: '{print $2}' |" |
673 | - "awk '{print $1}'" % self.board.default_network_interface) |
674 | + "awk '{print $1}'" % self.default_network_interface) |
675 | self.proc.sendline(cmd) |
676 | #if running from ipython, it needs another Enter, don't know why: |
677 | #self.proc.sendline("") |
678 | |
679 | === modified file 'lava_dispatcher/config.py' |
680 | --- lava_dispatcher/config.py 2011-08-16 00:15:08 +0000 |
681 | +++ lava_dispatcher/config.py 2011-09-09 01:07:35 +0000 |
682 | @@ -18,113 +18,72 @@ |
683 | # along |
684 | # with this program; if not, see <http://www.gnu.org/licenses>. |
685 | |
686 | -""" |
687 | -This is an ugly hack, the uboot commands for a given board type and the board |
688 | -type of a test machine need to come from the device registry. This is an |
689 | -easy way to look it up for now though, just to show the rest of the code |
690 | -around it |
691 | -""" |
692 | - |
693 | -class Board: |
694 | - uboot_cmds = None |
695 | - type = None |
696 | - # boot partition number, counting from 1 |
697 | - boot_part = 1 |
698 | - # root partition number, counting from 1 |
699 | - root_part = 2 |
700 | - default_network_interface = "eth0" |
701 | - |
702 | -class BeagleBoard(Board): |
703 | - uboot_cmds = ["mmc init", |
704 | - "mmc part 0", |
705 | - "setenv bootcmd 'fatload mmc 0:3 0x80000000 uImage; fatload mmc " |
706 | - "0:3 0x81600000 uInitrd; bootm 0x80000000 0x81600000'", |
707 | - "setenv bootargs ' console=tty0 console=ttyO2,115200n8 " |
708 | - "root=LABEL=testrootfs rootwait ro earlyprintk fixrtc nocompcache " |
709 | - "vram=12M omapfb.debug=y omapfb.mode=dvi:1280x720MR-16@60'", |
710 | - "boot"] |
711 | - type = "beagle" |
712 | - |
713 | -class PandaBoard(Board): |
714 | - uboot_cmds = ["mmc init", |
715 | - "mmc part 0", |
716 | - "setenv bootcmd 'fatload mmc 0:3 0x80200000 uImage; fatload mmc " |
717 | - "0:3 0x81600000 uInitrd; bootm 0x80200000 0x81600000'", |
718 | - "setenv bootargs ' console=tty0 console=ttyO2,115200n8 " |
719 | - "root=LABEL=testrootfs rootwait ro earlyprintk fixrtc nocompcache " |
720 | - "vram=48M omapfb.vram=0:24M mem=456M@0x80000000 mem=512M@0xA0000000'", |
721 | - "boot"] |
722 | - type = "panda" |
723 | - |
724 | -class Snowball(Board): |
725 | - uboot_cmds = ["mmc init", |
726 | - "mmc rescan 1", |
727 | - "setenv bootcmd 'fat load mmc 1:3 0x00100000 /uImage;" |
728 | - "bootm 0x00100000'", |
729 | - "setenv bootargs 'console=tty0 console=ttyAMA2,115200n8 " |
730 | - "root=LABEL=testrootfs rootwait ro earlyprintk rootdelay=1 " |
731 | - "fixrtc nocompcache mem=96M@0 mem_modem=32M@96M mem=44M@128M " |
732 | - "pmem=22M@172M mem=30M@194M mem_mali=32M@224M pmem_hwb=54M@256M " |
733 | - "hwmem=48M@302M mem=152M@360M'", |
734 | - "boot"] |
735 | - type = "snowball_sd" |
736 | - |
737 | -class Mx51evkBoard(Board): |
738 | - boot_part = 2 |
739 | - root_part = 3 |
740 | - uboot_cmds = ["mmc init", |
741 | - "mmc part 0", |
742 | - "setenv bootcmd 'fatload mmc 0:5 0x90000000 uImage; fatload mmc 0:5 " |
743 | - "0x92000000 uInitrd; fatload mmc 0:5 0x91ff0000 board.dtb; bootm " |
744 | - "0x90000000 0x92000000 0x91ff0000'", |
745 | - "setenv bootargs ' console=tty0 console=ttymxc0,115200n8 " |
746 | - "root=LABEL=testrootfs rootwait ro'", |
747 | - "boot"] |
748 | - type = "mx51evk" |
749 | - |
750 | -class Mx53locoBoard(Board): |
751 | - boot_part = 2 |
752 | - root_part = 3 |
753 | - uboot_cmds = ["mmc init", |
754 | - "mmc part 0", |
755 | - "setenv bootcmd 'fatload mmc 0:5 0x70800000 uImage; fatload mmc " |
756 | - "0:5 0x71800000 uInitrd; bootm 0x70800000 0x71800000'", |
757 | - "setenv bootargs ' console=tty0 console=ttymxc0,115200n8 " |
758 | - "root=LABEL=testrootfs rootwait ro'", |
759 | - "boot"] |
760 | - type = "mx53loco" |
761 | - |
762 | -#Here, it still needs to maintain a map from boardid to board, for there is |
763 | -#only boardid in jobfile.json |
764 | -BOARDS = { |
765 | - "panda01": PandaBoard, |
766 | - "panda02": PandaBoard, |
767 | - "panda03": PandaBoard, |
768 | - "panda04": PandaBoard, |
769 | - "beaglexm01": BeagleBoard, |
770 | - "beaglexm02": BeagleBoard, |
771 | - "beaglexm03": BeagleBoard, |
772 | - "beaglexm04": BeagleBoard, |
773 | - "mx51evk01": Mx51evkBoard, |
774 | - "mx53loco01": Mx53locoBoard, |
775 | - "snowball01": Snowball, |
776 | - "snowball02": Snowball, |
777 | - "snowball03": Snowball, |
778 | - "snowball04": Snowball, |
779 | - } |
780 | - |
781 | -#Main LAVA server IP in the boards farm |
782 | -LAVA_SERVER_IP = "192.168.1.10" |
783 | -#Location for hosting rootfs/boot tarballs extracted from images |
784 | -LAVA_IMAGE_TMPDIR = "/linaro/images/tmp" |
785 | -#URL where LAVA_IMAGE_TMPDIR can be accessed remotely |
786 | -LAVA_IMAGE_URL = "http://%s/images/tmp" % LAVA_SERVER_IP |
787 | -#Default test result storage path |
788 | -LAVA_RESULT_DIR = "/lava/results" |
789 | -#Location for caching downloaded artifacts such as hwpacks and images |
790 | -LAVA_CACHEDIR = "/linaro/images/cache" |
791 | - |
792 | -#Master image recognization string |
793 | -MASTER_STR = "root@master:" |
794 | -#Test image recognization string |
795 | -TESTER_STR = "root@linaro:" |
796 | +from ConfigParser import ConfigParser |
797 | +import os |
798 | +import StringIO |
799 | + |
800 | + |
801 | +default_config_path = os.path.join( |
802 | + os.path.dirname(__file__), 'default-config') |
803 | + |
804 | + |
805 | +def load_config_paths(name): |
806 | + for directory in [os.path.expanduser("~/.config"), |
807 | + "/etc/xdg", default_config_path]: |
808 | + path = os.path.join(directory, name) |
809 | + if os.path.isdir(path): |
810 | + yield path |
811 | + |
812 | + |
813 | +def _read_into(path, cp): |
814 | + s = StringIO.StringIO() |
815 | + s.write('[DEFAULT]\n') |
816 | + s.write(open(path).read()) |
817 | + s.seek(0) |
818 | + cp.readfp(s) |
819 | + |
820 | + |
821 | +def _get_config(name, cp=None): |
822 | + """Read a config file named name + '.conf'. |
823 | + |
824 | + This checks and loads files from the source tree, site wide location and |
825 | + home directory -- in that order, so home dir settings override site |
826 | + settings which override source settings. |
827 | + """ |
828 | + config_files = [] |
829 | + for directory in load_config_paths('lava-dispatcher'): |
830 | + path = os.path.join(directory, '%s.conf' % name) |
831 | + if os.path.exists(path): |
832 | + config_files.append(path) |
833 | + if not config_files: |
834 | + raise Exception("no config files named %r found" % (name + ".conf")) |
835 | + config_files.reverse() |
836 | + if cp is None: |
837 | + cp = ConfigParser() |
838 | + print "About to read %s" % str(config_files) |
839 | + for path in config_files: |
840 | + _read_into(path, cp) |
841 | + return cp |
842 | + |
843 | + |
844 | +class ConfigWrapper(object): |
845 | + def __init__(self, cp): |
846 | + self.cp = cp |
847 | + def get(self, key): |
848 | + return self.cp.get("DEFAULT", key) |
849 | + def getint(self, key): |
850 | + return self.cp.getint("DEFAULT", key) |
851 | + |
852 | + |
853 | +def get_config(name): |
854 | + return ConfigWrapper(_get_config(name)) |
855 | + |
856 | + |
857 | +def get_device_config(name): |
858 | + device_config = _get_config("devices/%s" % name) |
859 | + cp = _get_config("device-defaults") |
860 | + _get_config( |
861 | + "device-types/%s" % device_config.get('DEFAULT', 'device_type'), cp) |
862 | + _get_config("devices/%s" % name, cp) |
863 | + cp.set("DEFAULT", "hostname", name) |
864 | + return ConfigWrapper(cp) |
865 | |
866 | === added directory 'lava_dispatcher/default-config' |
867 | === added directory 'lava_dispatcher/default-config/lava-dispatcher' |
868 | === added file 'lava_dispatcher/default-config/lava-dispatcher/README' |
869 | --- lava_dispatcher/default-config/lava-dispatcher/README 1970-01-01 00:00:00 +0000 |
870 | +++ lava_dispatcher/default-config/lava-dispatcher/README 2011-09-09 01:07:35 +0000 |
871 | @@ -0,0 +1,41 @@ |
872 | +Configuration files for lava-dispatcher |
873 | +======================================= |
874 | + |
875 | +lava-dispatcher looks for files in: |
876 | + |
877 | + * Alongside the installation/source tree for the default values |
878 | + (i.e. this directory). |
879 | + |
880 | + * /etc/xdg/lava-dispatcher for system-wide settings. |
881 | + |
882 | + * ~/.config/lava-dispatcher for user settings. |
883 | + |
884 | +Each config directory can contain two files and two directories: |
885 | + |
886 | + * lava-dispatcher.conf |
887 | + |
888 | + This file defines global settings of the dispatcher. You will |
889 | + almost certainly need to customize LAVA_SERVER_IP for your install. |
890 | + |
891 | + * device-defaults.conf |
892 | + |
893 | + This file defines default values for all devices. You probably |
894 | + won't need to customize it. |
895 | + |
896 | + * device-types/ |
897 | + |
898 | + This directory contains a config file for each device type. You |
899 | + probably won't need to customize the settings for device types that |
900 | + are already supported by lava-dispatcher, but if you are working on |
901 | + supporting a new class of device, you will need to add a file here. |
902 | + |
903 | + Note that the device-type name must match the --dev argument to |
904 | + linaro-media-create. |
905 | + |
906 | + * devices/ |
907 | + |
908 | + This directory contains a file per device that can be targeted by |
909 | + lava-dispatcher. For the most part this file just needs to contain |
910 | + a line "device_type = <device type>", although other settings can |
911 | + be included here. You will definitely need to tell lava-dispatcher |
912 | + about the devices you have! |
913 | |
914 | === added file 'lava_dispatcher/default-config/lava-dispatcher/device-defaults.conf' |
915 | --- lava_dispatcher/default-config/lava-dispatcher/device-defaults.conf 1970-01-01 00:00:00 +0000 |
916 | +++ lava_dispatcher/default-config/lava-dispatcher/device-defaults.conf 2011-09-09 01:07:35 +0000 |
917 | @@ -0,0 +1,50 @@ |
918 | +# The default device settings. |
919 | + |
920 | +# All device settings default to these values unless they are |
921 | +# overwritten by the specific device type file |
922 | +# (device-types/${TYPE}.conf) or the specific device file |
923 | +# (devices/${DEVICE}.conf). |
924 | + |
925 | +# The client_type. Only 'serial' (meaning we communicate with the |
926 | +# device over a serial line via conmux) is supported today but 'qemu' |
927 | +# and 'ssh' are coming. |
928 | +client_type = serial |
929 | + |
930 | +# The bootloader commands to boot the device into the test image (we |
931 | +# assume that the device boots into the master image without bootloader |
932 | +# intervention). |
933 | +# |
934 | +# XXX should be called # boot_test_image_commands ? |
935 | +boot_cmds = |
936 | + |
937 | +# The bootloader commands to boot the device into an android-based test |
938 | +# image. |
939 | +# |
940 | +# XXX should be called # boot_android_test_image_commands ? |
941 | +boot_cmds_android = |
942 | + |
943 | +# The device type. Settings in device-types/${TYPE}.conf override |
944 | +# settings in this file, but are overridden by the |
945 | +# devices/${DEVICE}.conf file. |
946 | +type = |
947 | + |
948 | +# The network interface that comes up by default |
949 | +default_network_interface = eth0 |
950 | + |
951 | +# boot partition number, counting from 1 |
952 | +# |
953 | +# This is used to divide up the image produced by linaro-media-create |
954 | +# into sections to write onto the device. |
955 | +boot_part = 1 |
956 | + |
957 | +# root partition number, counting from 1 |
958 | +# |
959 | +# This is used to divide up the image produced by linaro-media-create |
960 | +# into sections to write onto the device. |
961 | +root_part = 2 |
962 | + |
963 | +# Master image recognization string |
964 | +MASTER_STR = root@master: |
965 | + |
966 | +# Test image recognization string |
967 | +TESTER_STR = root@linaro: |
968 | |
969 | === added directory 'lava_dispatcher/default-config/lava-dispatcher/device-types' |
970 | === added file 'lava_dispatcher/default-config/lava-dispatcher/device-types/beagle-xm.conf' |
971 | --- lava_dispatcher/default-config/lava-dispatcher/device-types/beagle-xm.conf 1970-01-01 00:00:00 +0000 |
972 | +++ lava_dispatcher/default-config/lava-dispatcher/device-types/beagle-xm.conf 2011-09-09 01:07:35 +0000 |
973 | @@ -0,0 +1,20 @@ |
974 | +boot_cmds = mmc init, |
975 | + mmc part 0, |
976 | + setenv bootcmd "'fatload mmc 0:3 0x80000000 uImage; |
977 | + fatload mmc 0:3 0x81600000 uInitrd; |
978 | + bootm 0x80000000 0x81600000'", |
979 | + setenv bootargs "' console=tty0 console=ttyO2,115200n8 |
980 | + root=LABEL=testrootfs rootwait ro earlyprintk fixrtc nocompcache |
981 | + vram=12M omapfb.debug=y omapfb.mode=dvi:1280x720MR-16@60'", |
982 | + boot |
983 | + |
984 | +boot_cmds_android = mmc init, |
985 | + mmc part 0, |
986 | + setenv bootcmd "'fatload mmc 0:3 0x80000000 uImage; |
987 | + fatload mmc 0:3 0x81600000 uInitrd; |
988 | + bootm 0x80000000 0x81600000'", |
989 | + setenv bootargs "'console=tty0 console=ttyO2,115200n8 |
990 | + rootwait rw earlyprintk fixrtc nocompcache |
991 | + vram=12M omapfb.debug=y omapfb.mode=dvi:1280x720MR-16@60 |
992 | + init=/init androidboot.console=ttyO2'", |
993 | + boot |
994 | |
995 | === added file 'lava_dispatcher/default-config/lava-dispatcher/device-types/mx51evk.conf' |
996 | --- lava_dispatcher/default-config/lava-dispatcher/device-types/mx51evk.conf 1970-01-01 00:00:00 +0000 |
997 | +++ lava_dispatcher/default-config/lava-dispatcher/device-types/mx51evk.conf 2011-09-09 01:07:35 +0000 |
998 | @@ -0,0 +1,10 @@ |
999 | +boot_part = 2 |
1000 | +root_part = 3 |
1001 | +boot_cmds = mmc init, |
1002 | + mmc part 0, |
1003 | + setenv bootcmd "'fatload mmc 0:5 0x90000000 uImage; fatload mmc 0:5 |
1004 | + 0x92000000 uInitrd; fatload mmc 0:5 0x91ff0000 board.dtb; bootm |
1005 | + 0x90000000 0x92000000 0x91ff0000'", |
1006 | + setenv bootargs "' console=tty0 console=ttymxc0,115200n8 |
1007 | + root=LABEL=testrootfs rootwait ro'", |
1008 | + boot |
1009 | |
1010 | === added file 'lava_dispatcher/default-config/lava-dispatcher/device-types/mx53loco.conf' |
1011 | --- lava_dispatcher/default-config/lava-dispatcher/device-types/mx53loco.conf 1970-01-01 00:00:00 +0000 |
1012 | +++ lava_dispatcher/default-config/lava-dispatcher/device-types/mx53loco.conf 2011-09-09 01:07:35 +0000 |
1013 | @@ -0,0 +1,9 @@ |
1014 | +boot_part = 2 |
1015 | +root_part = 3 |
1016 | +boot_cmds = mmc init, |
1017 | + mmc part 0, |
1018 | + setenv bootcmd "'fatload mmc 0:5 0x70800000 uImage; fatload mmc |
1019 | + 0:5 0x71800000 uInitrd; bootm 0x70800000 0x71800000'", |
1020 | + setenv bootargs "' console=tty0 console=ttymxc0,115200n8 |
1021 | + root=LABEL=testrootfs rootwait ro'", |
1022 | + boot |
1023 | |
1024 | === added file 'lava_dispatcher/default-config/lava-dispatcher/device-types/panda.conf' |
1025 | --- lava_dispatcher/default-config/lava-dispatcher/device-types/panda.conf 1970-01-01 00:00:00 +0000 |
1026 | +++ lava_dispatcher/default-config/lava-dispatcher/device-types/panda.conf 2011-09-09 01:07:35 +0000 |
1027 | @@ -0,0 +1,19 @@ |
1028 | +boot_cmds = mmc init, |
1029 | + mmc part 0, |
1030 | + setenv bootcmd "'fatload mmc 0:3 0x80200000 uImage; fatload mmc |
1031 | + 0:3 0x81600000 uInitrd; bootm 0x80200000 0x81600000'", |
1032 | + setenv bootargs "' console=tty0 console=ttyO2,115200n8 |
1033 | + root=LABEL=testrootfs rootwait ro earlyprintk fixrtc nocompcache |
1034 | + vram=48M omapfb.vram=0:24M mem=456M@0x80000000 mem=512M@0xA0000000'", |
1035 | + boot |
1036 | +boot_cmds_android = mmc init, |
1037 | + mmc part 0, |
1038 | + setenv bootcmd "'fatload mmc 0:3 0x80200000 uImage; |
1039 | + fatload mmc 0:3 0x81600000 uInitrd; |
1040 | + bootm 0x80200000 0x81600000'", |
1041 | + setenv bootargs "'console=tty0 console=ttyO2,115200n8 |
1042 | + rootwait rw earlyprintk fixrtc nocompcache vram=32M |
1043 | + omapfb.vram=0:8M mem=456M@0x80000000 mem=512M@0xA0000000 |
1044 | + omapfb.debug=y omapfb.mode=dvi:1280x720MR-16@60 |
1045 | + init=/init androidboot.console=ttyO2'", |
1046 | + boot |
1047 | |
1048 | === added file 'lava_dispatcher/default-config/lava-dispatcher/device-types/snowball.conf' |
1049 | --- lava_dispatcher/default-config/lava-dispatcher/device-types/snowball.conf 1970-01-01 00:00:00 +0000 |
1050 | +++ lava_dispatcher/default-config/lava-dispatcher/device-types/snowball.conf 2011-09-09 01:07:35 +0000 |
1051 | @@ -0,0 +1,12 @@ |
1052 | +boot_cmds = mmc init, |
1053 | + mmc rescan 1, |
1054 | + setenv bootcmd "'fat load mmc 1:3 0x00100000 /uImage; |
1055 | + bootm 0x00100000'", |
1056 | + setenv bootargs "'console=tty0 console=ttyAMA2,115200n8 |
1057 | + root=LABEL=testrootfs rootwait ro earlyprintk rootdelay=1 |
1058 | + fixrtc nocompcache mem=96M@0 mem_modem=32M@96M mem=44M@128M |
1059 | + pmem=22M@172M mem=30M@194M mem_mali=32M@224M pmem_hwb=54M@256M |
1060 | + hwmem=48M@302M mem=152M@360M'", |
1061 | + boot |
1062 | + |
1063 | +#boot_cmds_android = TBD |
1064 | \ No newline at end of file |
1065 | |
1066 | === added directory 'lava_dispatcher/default-config/lava-dispatcher/devices' |
1067 | === added file 'lava_dispatcher/default-config/lava-dispatcher/lava-dispatcher.conf' |
1068 | --- lava_dispatcher/default-config/lava-dispatcher/lava-dispatcher.conf 1970-01-01 00:00:00 +0000 |
1069 | +++ lava_dispatcher/default-config/lava-dispatcher/lava-dispatcher.conf 2011-09-09 01:07:35 +0000 |
1070 | @@ -0,0 +1,19 @@ |
1071 | +# General lava-dispatcher settings. |
1072 | + |
1073 | +# Main LAVA server IP in the lab. |
1074 | +# |
1075 | +# This is the IP the device downloads the image parts from. |
1076 | +LAVA_SERVER_IP = 192.168.1.10 |
1077 | + |
1078 | +# Location for rootfs/boot tarballs extracted from images |
1079 | +LAVA_IMAGE_TMPDIR = /linaro/images/tmp |
1080 | + |
1081 | +# URL where LAVA_IMAGE_TMPDIR can be accessed remotely |
1082 | +LAVA_IMAGE_URL = http://%(LAVA_SERVER_IP)s/images/tmp |
1083 | + |
1084 | +# Location on the device for storing test results. |
1085 | +LAVA_RESULT_DIR = /lava/results |
1086 | + |
1087 | +# Location for caching downloaded artifacts such as hwpacks and images |
1088 | +LAVA_CACHEDIR = /linaro/images/cache |
1089 | + |
1090 | |
1091 | === modified file 'lava_dispatcher/tests/test_config.py' |
1092 | --- lava_dispatcher/tests/test_config.py 2011-06-27 04:55:08 +0000 |
1093 | +++ lava_dispatcher/tests/test_config.py 2011-09-09 01:07:35 +0000 |
1094 | @@ -19,12 +19,15 @@ |
1095 | |
1096 | from unittest import TestCase |
1097 | |
1098 | -from lava_dispatcher.config import BOARDS, LAVA_SERVER_IP |
1099 | +from lava_dispatcher.config import get_config, get_device_config |
1100 | +from lava_dispatcher.utils import string_to_list |
1101 | |
1102 | class TestConfigData(TestCase): |
1103 | def test_beagle01_uboot_cmds(self): |
1104 | + beagle01_config = get_device_config("beaglexm01") |
1105 | expected = [ |
1106 | "mmc init", |
1107 | + "mmc part 0", |
1108 | "setenv bootcmd 'fatload mmc 0:3 0x80000000 uImage; fatload mmc " |
1109 | "0:3 0x81600000 uInitrd; bootm 0x80000000 0x81600000'", |
1110 | "setenv bootargs ' console=tty0 console=ttyO2,115200n8 " |
1111 | @@ -32,11 +35,12 @@ |
1112 | "nocompcache vram=12M omapfb.debug=y " |
1113 | "omapfb.mode=dvi:1280x720MR-16@60'", |
1114 | "boot"] |
1115 | - brd = BOARDS["beagle01"] |
1116 | - uboot_cmds = brd.uboot_cmds |
1117 | - self.assertEquals(expected, uboot_cmds) |
1118 | + uboot_cmds = beagle01_config.get("boot_cmds") |
1119 | + self.assertEquals(expected, string_to_list(uboot_cmds)) |
1120 | |
1121 | def test_server_ip(self): |
1122 | + server_config = get_config("lava-dispatcher") |
1123 | expected = "192.168.1.10" |
1124 | - self.assertEqual(expected, LAVA_SERVER_IP) |
1125 | + lava_server_ip = server_config.get("LAVA_SERVER_IP") |
1126 | + self.assertEqual(expected, lava_server_ip) |
1127 | |
1128 | |
1129 | === modified file 'lava_dispatcher/utils.py' |
1130 | --- lava_dispatcher/utils.py 2011-08-18 20:38:38 +0000 |
1131 | +++ lava_dispatcher/utils.py 2011-09-09 01:07:35 +0000 |
1132 | @@ -22,8 +22,7 @@ |
1133 | import shutil |
1134 | import urllib2 |
1135 | import urlparse |
1136 | - |
1137 | -from lava_dispatcher.config import LAVA_CACHEDIR |
1138 | +from shlex import shlex |
1139 | |
1140 | def download(url, path=""): |
1141 | urlpath = urlparse.urlsplit(url).path |
1142 | @@ -41,8 +40,8 @@ |
1143 | raise RuntimeError("Could not retrieve %s" % url) |
1144 | return filename |
1145 | |
1146 | -def download_with_cache(url, path=""): |
1147 | - cache_loc = url_to_cache(url) |
1148 | +def download_with_cache(url, path="", cachedir=""): |
1149 | + cache_loc = url_to_cache(url, cachedir) |
1150 | if os.path.exists(cache_loc): |
1151 | filename = os.path.basename(cache_loc) |
1152 | file_location = os.path.join(path, filename) |
1153 | @@ -61,8 +60,16 @@ |
1154 | #so ignore |
1155 | return file_location |
1156 | |
1157 | -def url_to_cache(url): |
1158 | +def url_to_cache(url, cachedir): |
1159 | url_parts = urlparse.urlsplit(url) |
1160 | - path = os.path.join(LAVA_CACHEDIR, url_parts.netloc, |
1161 | + path = os.path.join(cachedir, url_parts.netloc, |
1162 | url_parts.path.lstrip(os.sep)) |
1163 | return path |
1164 | + |
1165 | +def string_to_list(string): |
1166 | + splitter = shlex(string, posix=True) |
1167 | + splitter.whitespace = "," |
1168 | + splitter.whitespace_split = True |
1169 | + newlines_to_spaces = lambda x: x.replace('\n', ' ') |
1170 | + strip_newlines = lambda x: newlines_to_spaces(x).strip(' ') |
1171 | + return map(strip_newlines, list(splitter)) |
1172 | |
1173 | === modified file 'setup.py' |
1174 | --- setup.py 2011-07-21 16:55:47 +0000 |
1175 | +++ setup.py 2011-09-09 01:07:35 +0000 |
1176 | @@ -12,6 +12,15 @@ |
1177 | author='Linaro Validation Team', |
1178 | author_email='linaro-dev@lists.linaro.org', |
1179 | packages=find_packages(), |
1180 | + package_data= { |
1181 | + 'lava_dispatcher': [ |
1182 | + 'default-config/lava-dispatcher/lava-dispatcher.conf', |
1183 | + 'default-config/lava-dispatcher/lava-dispatcher.conf', |
1184 | + 'default-config/lava-dispatcher/device-defaults.conf', |
1185 | + 'default-config/lava-dispatcher/device-types/*.conf', |
1186 | + 'default-config/lava-dispatcher/devices/*.conf', |
1187 | + ], |
1188 | + }, |
1189 | scripts = [ |
1190 | 'lava-dispatch' |
1191 | ], |
156 - data_path = download_ with_cache( data_url, tarball_dir) with_cache( boot_url, tarball_dir, lava_cachedir)
157 + boot_path = download_
But download_with_cache API seems no change.