=== modified file 'lava_dispatcher/actions/boot_control.py'
@@ -23,7 +23,10 @@
import logging
from lava_dispatcher.actions import BaseAction, null_or_empty_schema
-from lava_dispatcher.errors import CriticalError
+from lava_dispatcher.errors import (
+ CriticalError,
+ ADBConnectError,
+)
_boot_schema = {
'type': 'object',
@@ -40,12 +43,20 @@
"""
parameters_schema = _boot_schema
+ parameters_schema['properties']['adb_check'] = {
+ 'default': False, 'optional': True
+ }
- def run(self, options=[]):
+ def run(self, options=[], adb_check=False):
client = self.client
client.target_device.boot_options = options
try:
- client.boot_linaro_android_image()
+ client.boot_linaro_android_image(
+ adb_check=adb_check)
+ except ADBConnectError as err:
+ logging.exception(('boot_linaro_android_image failed to create'
+ ' the adb connection: %s') % err)
+ raise err
except Exception as e:
logging.exception("boot_linaro_android_image failed: %s" % e)
raise CriticalError("Failed to boot test image.")
=== modified file 'lava_dispatcher/client/base.py'
@@ -34,6 +34,7 @@
NetworkError,
OperationFailed,
CriticalError,
+ ADBConnectError,
)
@@ -246,6 +247,9 @@
match_id = adb_proc.expect([pattern1, pattern2, pattern3, pexpect.EOF])
if match_id in [0, 1]:
self.dev_name = adb_proc.match.groups()[0]
+ else:
+ raise ADBConnectError(('Failed to connected to device with'
+ ' command:%s') % cmd)
def android_adb_over_tcp_disconnect(self):
dev_ip = self.dev_ip
@@ -289,7 +293,7 @@
return
time.sleep(3)
- raise NetworkError(
+ raise ADBConnectError(
"The android device(%s) isn't attached" % self._client.hostname)
def wait_home_screen(self):
@@ -441,7 +445,7 @@
def get_android_adb_interface(self):
return self.config.default_network_interface
- def boot_linaro_android_image(self):
+ def boot_linaro_android_image(self, adb_check=False):
"""Reboot the system to the test android image."""
self._boot_linaro_android_image()
TESTER_PS1_PATTERN = self.target_device.deployment_data['TESTER_PS1_PATTERN']
@@ -465,6 +469,14 @@
if self.config.android_adb_over_tcp:
self._enable_adb_over_tcp()
+ #check if the adb connection can be created.
+ #by adb connect dev_ip command
+ if adb_check:
+ try:
+ session = AndroidTesterCommandRunner(self)
+ session.connect()
+ finally:
+ session.disconnect()
def _disable_suspend(self):
""" disable the suspend of images.
=== modified file 'lava_dispatcher/errors.py'
@@ -51,6 +51,12 @@
"""
+class ADBConnectError(NetworkError):
+ """
+ This is used when adb connection failed to created
+ """
+
+
class OperationFailed(GeneralError):
"""
The exception throws when a file system or system operation fails.
=== modified file 'lava_dispatcher/job.py'
@@ -33,6 +33,7 @@
CriticalError,
TimeoutError,
GeneralError,
+ ADBConnectError,
)
@@ -175,6 +176,24 @@
try:
status = 'fail'
action.run(**params)
+ except ADBConnectError:
+ if cmd.get('command') == 'boot_linaro_android_image':
+ logging.warning(('[ACTION-E] %s failed to create the'
+ ' adb connection') % (cmd['command']))
+ ## clear the session on the serial and wait a while
+ ## and not put the following 3 sentences into the
+ ## boot_linaro_android_image method just for
+ ## avoiding effects when the method being called
+ ## in other places
+ logging.warning(
+ 'Now will reboot the image to try again')
+ self.context.client.proc.sendcontrol("c")
+ self.context.client.proc.sendline("")
+ time.sleep(5)
+ self.context.client.boot_linaro_android_image(
+ adb_check=True)
+ ## mark it as pass if the second boot works
+ status = 'pass'
except TimeoutError as err:
if cmd.get('command').startswith('lava_android_test'):
logging.warning("[ACTION-E] %s times out." % (