My bad expirients with LAVA on Pandaboard OMAP4460.
Линаровский билд Android'а был взят мною с сайта Linaro и так исторически сложилось, что версия билда была мою выбрана 93-я: https://android-build.linaro.org/builds/~linaro-android/panda-jb-gcc47-tilt-t...
Dispatcher.
Итак, вы установили LAVу(lava-deployment-tool скачанную где-то тут https://launchpad.net/lava), и вам даже удалось создать свой инстанс. Как это сделать описанно где-то тут http://lava-deployment-tool.readthedocs.org/en/latest/#limited-deployments так же в самой папке с lava-deployment-tool есть файл в котором это все описанно SETUP-WEBDEV-ENV. По этому останавливаться и расписывать я это не стану.
Если не вышло создать по инструкции Bundle Streams, то это можно создать руками через админ понель при помощи юзера, которого вы создавили во время установки LAVы. Ок. Допустим, вам даже удалось успешно установить lava-dispatcher(скачанную где-то тут https://launchpad.net/lava-dispatcher). Инструкция по установке была где-то внутри папки со скачанным dispatcherом. И вот еще одна полезная ссылка: http://lava-dispatcher.readthedocs.org/en/latest/standalonesetup.html
Для того что бы запустить, выполнить и засабмитить результаты теста busybox в Linaro LAVA на Pandaboard 4460 пришлось похачить файл под названием master.py. Пришлось закоментить некоторые строки в функции _boot_linaro_image т.к. попытка перепрошивки Pandы Linaroвскими билдами не увенчались успехом, итак коментим следующие строки в файле /LAVA/lava-dispatcher-0.23-2012.11/lava_dispatcher/device/master.py(строка 469):
def _boot_linaro_image(self): print 'MatserImage:Boot linaro image' boot_cmds = 'boot' options = boot_options.as_dict(self) if 'boot_cmds' in options: boot_cmds = options['boot_cmds'].value #boot_cmds = getattr(self.config, boot_cmds) self._boot(string_to_list(boot_cmds.encode('ascii'))) def _boot(self, boot_cmds): try: self._soft_reboot() #self._enter_uboot() except: logging.exception(«_enter_uboot failed») self._hard_reboot() #self._enter_uboot() # self.proc.sendline(" ") # for line in range(1, len(boot_cmds)): #self.proc.expect(self.config.bootloader_prompt, timeout=300) # self.proc.sendline(" ")
И дабы не возникало ошибки KeyError: 'TESTER_PS1_PATTERN' вроде:
<LAVA_DISPATCHER>2013-01-09 12:24:34 PM INFO: Attempting to connect to device Connected to panda01 console [channel connected] (~$quit to exit) (user:x0194611) is already connected (user:x0194611) is already connected <LAVA_DISPATCHER>2013-01-09 12:24:44 PM INFO: Matched <class 'pexpect.TIMEOUT'> which means all-good <LAVA_DISPATCHER>2013-01-09 12:24:44 PM INFO: [ACTION-B] lava_android_test_install is started with {u'tests': [u'busybox'], 'timeout': 18000} /usr/local/bin/lava-android-test <LAVA_DISPATCHER>2013-01-09 12:24:44 PM INFO: ensuring ADB port is ready MatserImage:Boot linaro image <LAVA_DISPATCHER>2013-01-09 12:24:44 PM INFO: Perform soft reboot the system
130|root@android:/ # reboot [ 954.643920] SysRq : Emergency Remount R/O [ 955.966766] EXT4-fs (mmcblk0p3): re-mounted. Opts: (null) [ 956.195617] EXT4-fs (mmcblk0p5): re-mounted. Opts: (null) [ 956.204864] Emergency Remount complete [ 956.264862] PVR: PVRSRVDriverShutdown(pDevice=efea1e00) [ 956.270751] PVR: SysSystemPrePowerState: Entering state D3 [ 956.276794] PVR: Uninstalling device LISR on IRQ 53 with cookie efeb3b80 [ 956.284057] PVR: DisableSystemClocks: Disabling System Clocks [ 956.290405] Restarting system. <LAVA_DISPATCHER>2013-01-09 12:24:51 PM WARNING: [ACTION-E] lava_android_test_install is finished with error ('TESTER_PS1_PATTERN'). Lava failed at action lava_android_test_install with error:'TESTER_PS1_PATTERN'
Traceback (most recent call last): File «/home/x0194611/Документы/LAVA/lava-dispatcher-0.23-2012.11/lava_dispatcher/job.py», line 179, in run action.run(**params) File «/home/x0194611/Документы/LAVA/lava-dispatcher-0.23-2012.11/lava_dispatcher/actions/lava_android_test.py», line 211, in run with self.client.android_tester_session() as session: File «/usr/lib/python2.7/contextlib.py», line 17, in __enter__ return self.gen.next() File «/home/x0194611/Документы/LAVA/lava-dispatcher-0.23-2012.11/lava_dispatcher/client/base.py», line 327, in android_tester_session self.boot_linaro_android_image() File «/home/x0194611/Документы/LAVA/lava-dispatcher-0.23-2012.11/lava_dispatcher/client/base.py», line 423, in boot_linaro_android_image TESTER_PS1_PATTERN = self.target_device.deployment_data['TESTER_PS1_PATTERN'] KeyError: 'TESTER_PS1_PATTERN' <LAVA_DISPATCHER>2013-01-09 12:24:51 PM INFO: Submitting the test result with parameters = {u'stream': u'/anonymous/test/', u'server': u'http://localhost/RPC2/'} dashboard-put-result: http://localhost/dashboard/permalink/bundle/7300799c313a215b46bc0da84e85f1cff... <LAVA_DISPATCHER>2013-01-09 12:24:51 PM INFO: Dashboard : http://localhost/dashboard/permalink/bundle/7300799c313a215b46bc0da84e85f1cff...
Traceback (most recent call last): File «/usr/local/bin/lava», line 9, in <module> load_entry_point('lava-tool==0.6', 'console_scripts', 'lava')() File «/usr/local/lib/python2.7/dist-packages/lava/tool/dispatcher.py», line 147, in run raise SystemExit(cls().dispatch(args)) File «/usr/local/lib/python2.7/dist-packages/lava/tool/dispatcher.py», line 137, in dispatch return command.invoke() File «/home/x0194611/Документы/LAVA/lava-dispatcher-0.23-2012.11/lava/dispatcher/commands.py», line 100, in invoke job.run() File «/home/x0194611/Документы/LAVA/lava-dispatcher-0.23-2012.11/lava_dispatcher/job.py», line 179, in run action.run(**params) File «/home/x0194611/Документы/LAVA/lava-dispatcher-0.23-2012.11/lava_dispatcher/actions/lava_android_test.py», line 211, in run with self.client.android_tester_session() as session: File «/usr/lib/python2.7/contextlib.py», line 17, in __enter__ return self.gen.next() File «/home/x0194611/Документы/LAVA/lava-dispatcher-0.23-2012.11/lava_dispatcher/client/base.py», line 327, in android_tester_session self.boot_linaro_android_image() File «/home/x0194611/Документы/LAVA/lava-dispatcher-0.23-2012.11/lava_dispatcher/client/base.py», line 423, in boot_linaro_android_image TESTER_PS1_PATTERN = self.target_device.deployment_data['TESTER_PS1_PATTERN'] KeyError: 'TESTER_PS1_PATTERN'
В тот же файл master.py добавляем следующие строки в самы конец класса MasterImageTarget(Target):
ANDROID_TESTER_PS1 = «root@android:/ #» self.deployment_data = { 'TESTER_PS1': ANDROID_TESTER_PS1, 'TESTER_PS1_PATTERN': ANDROID_TESTER_PS1, 'TESTER_PS1_INCLUDES_RC': False, }
Должно получиться так(строка 62):
class MasterImageTarget(Target): MASTER_PS1 = 'root@master [rc=$(echo \$?)]# ' MASTER_PS1_PATTERN = 'root@master \[rc=(\d+)\]# ' def __init__(self, context, config): super(MasterImageTarget, self).__init__(context, config) Target.android_deployment_data['boot_cmds'] = 'boot_cmds_android' Target.ubuntu_deployment_data['boot_cmds'] = 'boot_cmds' Target.oe_deployment_data['boot_cmds'] = 'boot_cmds_oe' # used for tarballcache logic to get proper boot_cmds Target.ubuntu_deployment_data['data_type'] = 'ubuntu' Target.oe_deployment_data['data_type'] = 'oe' self.target_map = { 'android': Target.android_deployment_data, 'oe': Target.oe_deployment_data, 'ubuntu': Target.ubuntu_deployment_data, } self.master_ip = None if config.pre_connect_command: logging_system(config.pre_connect_command) self.proc = self._connect_carefully(config.connection_command) atexit.register(self._close_logging_spawn) ANDROID_TESTER_PS1 = «root@android:/ #» self.deployment_data = { 'TESTER_PS1': ANDROID_TESTER_PS1, 'TESTER_PS1_PATTERN': ANDROID_TESTER_PS1, 'TESTER_PS1_INCLUDES_RC': False, }
Теперь не забудем переинсталить наш dispatcher. В моем случае это выглядело так:
/LAVA/lava-dispatcher-0.23-2012.11$ sudo ./setup.py install
Если вы этого еще не сделали, то незабудем упомянуть про то, что вам так же нужно было создать для своей борды (у меня это Panda) конфиг файлик, который в моем случае назывался panda01.conf и положила я его в папочку /devices(/LAVA/lava-dispatcher-0.23-2012.11/lava_dispatcher/default-config/lava-dispatcher) выглядел он так:
device_type = panda hostname = panda01
Так же необходимо создать конфиг файлик для типа вашего девайса (device-types) в моем случае он назывался panda.conf и положила я его соответственно в папочку /device-types(/LAVA/lava-dispatcher-0.23-2012.11/lava_dispatcher/default-config/lava-dispatcher), содержимое файла в моем случае следующее:
boot_cmds = boot boot_cmds_android = boot boot_cmds_oe = boot
Полезная ссылка: http://linuxtesting.blogspot.ru/2011/09/configuring-lava-dispatcher.html
Разные примеры этих файликов можно найти прямо в папке с dispatcherом в каталоге doc: /Документы/LAVA/lava-dispatcher-0.23-2012.11/doc/examples.
Отлично! Теперь можно запускать наш джоб! В моем случае он назывался lava-android-test3.json положила я его в папку с инстансом LAVы(/srv/lava/instances/test/tmp/) и выглядел он так:
{ «job_name»: «lava_android_test_busybox», «target»: «panda01», «timeout»: 18000, «actions»: [ { «command»: «lava_android_test_install», «parameters»: { «tests»: [«busybox»] } }, { «command»: «lava_android_test_run», «parameters»: { «test_name»: «busybox» } }, { «command»: «submit_results», «parameters»: { «server»: "http://localhost/RPC2/", «stream»: «/anonymous/test/» } } ] }
Лично я запускала его таким образом: :~LAVA/lava-dispatcher-0.23-2012.11$ lava-dispatch /srv/lava/instances/test/tmp/lava-android-test3.json
В результате тест busybox запустился, выполнился и засабмитился на хост:
root@android:/ # <LAVA_DISPATCHER>2013-01-09 03:19:42 PM INFO: Execute command on host: timeout 18000s lava-android-test run busybox -s 10.167.145.211:5555 -o /tmp/tmp49Ddx1/busybox.2013-01-09T13:19:42Z.bundle LAVA: --Start Operation: Run test (busybox) on device(XX.XXX.XXX.XXX:XXXX) LAVA: Begin to execute command: adb -s XX.XXX.XXX.XXX:XXXX shell /data/lava-android-test/share/installed-tests/busybox/busybox_test.sh LAVA: (stdout) mkdir=pass LAVA: (stdout) touch=pass LAVA: (stdout) ls=pass LAVA: (stdout) ps=pass LAVA: (stdout) whoami=pass LAVA: (stdout) which=pass LAVA: (stdout) basename=pass LAVA: (stdout) cp=pass LAVA: (stdout) rm=pass LAVA: (stdout) dmesg=pass LAVA: (stdout) grep=pass [ 109.436431] omapfb omapfb: Unknown ioctl 0x5401 ANDROID TEST RUN COMPLETE: Result id is 'busybox1357730383.0' LAVA: --End Operation: Run test (busybox) on device(XX.XXX.XXX.XXX:XXXX) <LAVA_DISPATCHER>2013-01-09 03:19:54 PM INFO: Execute adb command on host: adb disconnect XX.XXX.XXX.XXX
Scheduler.
Как установить скедюлер(шедулер) описанно тут: https://lava-scheduler.readthedocs.org/en/latest/usage.html?highlight=lava-to... Скачать его можно тут: https://launchpad.net/lava-scheduler А lava-scheduler-tool соответственно тут: https://launchpad.net/lava-scheduler-tool
Для сабмита джобы из scheduler (Scheduler --> Jobs) с запуском, выполнением и сабмитом результатов на хост в дальнейшем(Тут описанно как это можно сделать: https://lava-scheduler.readthedocs.org/en/latest/usage.html?highlight=lava-to...), необходимо сперва создать token. Сделать это можно непосредственно с веб-интерфейса LAVы: API-->Authentication Tokens. Созданный token копируем в память и вставляем в консоль так, как описанно ниже.
При попытке сделать необходимые действия у вас может возникнуть ошибка Fault 401 появляющаяся из-за proxy: EXPERIMENTAL - SUBJECT TO CHANGE (See --experimental-notice for more info) ERROR: <Fault 401: 'Authentication with user and token required for this API.'>
Исправить это можно так: :~LAVA/lava-scheduler-tool-0.5$ export http_proxy= :~LAVA/lava-scheduler-tool-0.5$ echo $http_proxy Для добавления token'а вводим следующую строку: :~/LAVA/lava-scheduler-tool-0.5$ lava-tool auth-add http://USERNAME@127.0.0.1/RPC2/
Сюда вставляем созданный и скопированный рание из веб-интерфейса token: Paste token for http://USERNAME@127.0.0.1/RPC2/:
После чего, если все было сделанно верно, вы должны увидеть: Token added successfully for user USERNAME.
Теперь наконец-то мы можем при помощи lava-tool засабмитить джоб с помощью ava-scheduler-tool на хост. И сделать это можно при помощи следующей команды: :~/LAVA/lava-scheduler-tool-0.5$ lava-tool submit-job http://USERNAME@127.0.0.1/RPC2/ /srv/lava/instances/test/tmp/lava-android-test3.json EXPERIMENTAL - SUBJECT TO CHANGE (See --experimental-notice for more info) submitted as job id: 5
Выглядеть в результате это будет так:
Useful links:
https://answers.launchpad.net/lava
http://lava-android-test.readthedocs.org/en/latest/index.html
https://docs.google.com/a/globallogic.com/viewer?a=v&q=cache:ue4eqqk6GHkJ...
LAVA Project Update - ELC 2012
Linaro LAVA test system