=== modified file 'lava_dispatcher/client/base.py'
@@ -26,7 +26,6 @@
import time
from cStringIO import StringIO
import traceback
-from lava_dispatcher.utils import string_to_list
import logging
@@ -292,11 +291,6 @@
return self.device_option("TESTER_STR")
@property
- def boot_cmds(self):
- uboot_str = self.device_option("boot_cmds")
- return string_to_list(uboot_str)
-
- @property
def device_type(self):
return self.device_option("device_type")
@@ -391,7 +385,7 @@
"""
logging.info("Boot the test image")
- self.proc._boot(self.boot_cmds)
+ self._boot_linaro_image()
self.in_test_shell(300)
# set PS1 to include return value of last command
# Details: system PS1 is set in /etc/bash.bashrc and user PS1 is set in
@@ -412,7 +406,7 @@
def boot_linaro_android_image(self):
"""Reboot the system to the test android image."""
- self.proc._boot(string_to_list(self.config.get('boot_cmds_android')))
+ self._boot_linaro_android_image()
self.in_test_shell(timeout=900)
self.proc.sendline("export PS1=\"root@linaro: \"")
=== modified file 'lava_dispatcher/client/master.py'
@@ -22,17 +22,21 @@
import contextlib
import logging
import os
-import pexpect
+import re
import shutil
import subprocess
from tempfile import mkdtemp
import time
import traceback
+import pexpect
+
from lava_dispatcher.utils import (
download,
download_with_cache,
+ logging_spawn,
logging_system,
+ string_to_list,
)
from lava_dispatcher.client.base import (
CommandRunner,
@@ -45,9 +49,6 @@
generate_image,
image_partition_mounted,
)
-from lava_dispatcher.connection import (
- LavaConmuxConnection,
- )
def _extract_partition(image, partno, tarfile):
@@ -256,7 +257,11 @@
def __init__(self, context, config):
super(LavaMasterImageClient, self).__init__(context, config)
- self.proc = LavaConmuxConnection(config, self.sio)
+ cmd = self.device_option("connection_command")
+ proc = logging_spawn(cmd, timeout=1200, logfile=self.sio)
+ #serial can be slow, races do funny things if you don't increase delay
+ proc.delaybeforesend=1
+ self.proc = proc
@property
def master_str(self):
@@ -441,13 +446,13 @@
reboot the system, and check that we are in a master shell
"""
logging.info("Boot the system master image")
- self.proc.soft_reboot()
+ self.soft_reboot()
try:
self.proc.expect("Starting kernel")
self._in_master_shell(300)
except:
logging.exception("in_master_shell failed")
- self.proc.hard_reboot()
+ self.hard_reboot()
self._in_master_shell(300)
self.proc.sendline('export PS1="$PS1 [rc=$(echo \$?)]: "')
self.proc.expect(self.master_str, timeout=10, lava_no_logging=1)
@@ -595,7 +600,7 @@
[self.master_str, pexpect.TIMEOUT], timeout=timeout, lava_no_logging=1)
if match_id == 1:
raise OperationFailed
-
+
@contextlib.contextmanager
def _master_session(self):
"""A session that can be used to run commands in the master image.
@@ -609,3 +614,46 @@
except OperationFailed:
self.boot_master_image()
yield MasterCommandRunner(self)
+
+ def soft_reboot(self):
+ logging.info("Perform soft reboot the system")
+ cmd = self.device_option("soft_boot_cmd")
+ if cmd != "":
+ self.proc.sendline(cmd)
+ else:
+ self.proc.sendline("reboot")
+ # set soft reboot timeout 120s, or do a hard reset
+ id = self.proc.expect(
+ ['Restarting system.', 'The system is going down for reboot NOW',
+ 'Will now restart', pexpect.TIMEOUT], timeout=120)
+ if id not in [0, 1, 2]:
+ self.hard_reboot()
+
+ def hard_reboot(self):
+ logging.info("Perform hard reset on the system")
+ self.proc.send("~$")
+ self.proc.sendline("hardreset")
+
+ def _enter_uboot(self):
+ self.proc.expect("Hit any key to stop autoboot")
+ self.proc.sendline("")
+
+ def _boot_linaro_image(self):
+ self._boot(string_to_list(self.config.get('boot_cmds')))
+
+ def _boot_linaro_android_image(self):
+ self._boot(string_to_list(self.config.get('boot_cmds_android')))
+
+ def _boot(self, boot_cmds):
+ self.soft_reboot()
+ try:
+ self._enter_uboot()
+ except:
+ logging.exception("_enter_uboot failed")
+ self.hard_reboot()
+ self._enter_uboot()
+ self.proc.sendline(boot_cmds[0])
+ bootloader_prompt = re.escape(self.device_option('bootloader_prompt'))
+ for line in range(1, len(boot_cmds)):
+ self.proc.expect(bootloader_prompt, timeout=300)
+ self.proc.sendline(boot_cmds[line])
=== modified file 'lava_dispatcher/client/qemu.py'
@@ -33,6 +33,7 @@
image_partition_mounted,
)
from lava_dispatcher.utils import (
+ logging_spawn,
logging_system,
)
@@ -106,7 +107,8 @@
self.device_option('qemu_machine_type'),
self._lava_image)
logging.info('launching qemu with command %r' % qemu_cmd)
- self.proc = pexpect.spawn(qemu_cmd, logfile=self.sio, timeout=None)
+ self.proc = logging_spawn(
+ qemu_cmd, logfile=self.sio, timeout=None)
self.proc.expect(self.tester_str, timeout=300)
# set PS1 to include return value of last command
self.proc.sendline('export PS1="$PS1 [rc=$(echo \$?)]: "')
=== removed file 'lava_dispatcher/connection.py'
@@ -1,128 +0,0 @@
-# Copyright (C) 2011 Linaro Limited
-#
-# Author: Michael Hudson-Doyle <michael.hudson@linaro.org>
-#
-# This file is part of LAVA Dispatcher.
-#
-# LAVA Dispatcher is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
-# LAVA Dispatcher is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along
-# with this program; if not, see <http://www.gnu.org/licenses>.
-
-import logging
-import pexpect
-import re
-
-
-class LavaConnection(object):
-
- def __init__(self, device_config, sio):
- self.device_config = device_config
- self.proc = self._make_connection(sio)
-
- def _make_connection(self, sio):
- raise NotImplementedError(self._make_connection)
-
- def device_option(self, option_name):
- return self.device_config.get(option_name)
-
- def device_option_int(self, option_name):
- return self.device_config.getint(option_name)
-
-
- # pexpect-like interface.
-
- def sendline(self, *args, **kw):
- logging.debug("sendline : %s" %args[0])
- return self.proc.sendline(*args, **kw)
-
- def send(self, *args, **kw):
- logging.debug("sendline : %s" %args[0])
- return self.proc.send(*args, **kw)
-
- def expect(self, *args, **kw):
- # some expect should not be logged because it is so much noise.
- if kw.has_key('lava_no_logging'):
- del kw['lava_no_logging']
- return self.proc.expect(*args, **kw)
-
- if (kw.has_key('timeout')):
- timeout = kw['timeout']
- else:
- timeout = self.proc.timeout
-
- if len(args) == 1:
- logging.debug("expect (%d): '%s'" %(timeout, args[0]))
- else:
- logging.debug("expect (%d): '%s'" %(timeout, str(args)))
-
- return self.proc.expect(*args, **kw)
-
- def sendcontrol(self, *args, **kw):
- return self.proc.sendcontrol(*args, **kw)
-
- @property
- def match(self):
- return self.proc.match
-
-
- # Extra bits.
-
- def _enter_uboot(self):
- self.expect("Hit any key to stop autoboot")
- self.sendline("")
-
- def soft_reboot(self):
- logging.info("Perform soft reboot the system")
- cmd = self.device_option("soft_boot_cmd")
- if cmd != "":
- self.sendline(cmd)
- else:
- self.sendline("reboot")
- # set soft reboot timeout 120s, or do a hard reset
- id = self.expect(
- ['Restarting system.', 'The system is going down for reboot NOW',
- 'Will now restart', pexpect.TIMEOUT], timeout=120)
- if id not in [0,1,2]:
- self.hard_reboot()
-
- def hard_reboot(self):
- raise NotImplementedError(self.hard_reboot)
-
-
-class LavaConmuxConnection(LavaConnection):
-
- def _make_connection(self, sio):
- cmd = self.device_option("connection_command")
- proc = pexpect.spawn(cmd, timeout=1200, logfile=sio)
- #serial can be slow, races do funny things if you don't increase delay
- proc.delaybeforesend=1
- return proc
-
- def hard_reboot(self):
- logging.info("Perform hard reset on the system")
- self.proc.send("~$")
- self.proc.sendline("hardreset")
-
- def _boot(self, boot_cmds):
- self.soft_reboot()
- try:
- self._enter_uboot()
- except:
- logging.exception("_enter_uboot failed")
- self.hard_reboot()
- self._enter_uboot()
- self.sendline(boot_cmds[0])
- bootloader_prompt = re.escape(self.device_option('bootloader_prompt'))
- for line in range(1, len(boot_cmds)):
- self.expect(bootloader_prompt, timeout=300)
- self.sendline(boot_cmds[line])
=== modified file 'lava_dispatcher/utils.py'
@@ -26,6 +26,9 @@
import urlparse
from shlex import shlex
+import pexpect
+
+
def download(url, path="", verbose_failure=1):
urlpath = urlparse.urlsplit(url).path
filename = os.path.basename(urlpath)
@@ -93,3 +96,31 @@
logging.debug("Executing on host : '%r'"%cmd)
return os.system(cmd)
+
+class logging_spawn(pexpect.spawn):
+
+ def sendline(self, *args, **kw):
+ logging.debug("sendline : %s" %args[0])
+ return super(logging_spawn, self).sendline(*args, **kw)
+
+ def send(self, *args, **kw):
+ logging.debug("send : %s" %args[0])
+ return super(logging_spawn, self).send(*args, **kw)
+
+ def expect(self, *args, **kw):
+ # some expect should not be logged because it is so much noise.
+ if kw.has_key('lava_no_logging'):
+ del kw['lava_no_logging']
+ return self.expect(*args, **kw)
+
+ if (kw.has_key('timeout')):
+ timeout = kw['timeout']
+ else:
+ timeout = self.timeout
+
+ if len(args) == 1:
+ logging.debug("expect (%d): '%s'" %(timeout, args[0]))
+ else:
+ logging.debug("expect (%d): '%s'" %(timeout, str(args)))
+
+ return super(logging_spawn, self).expect(*args, **kw)