FAFT: Cold reset client on clean up if necessary

If the client is offline during clean up, cold reset it so that autoserv
ends gracefully. This saves us nearly 9 minutes in this kind of failures.

BUG=chrome-os-partner:23309
TEST=Turn off client during a test. Check client is reset before test
ends.

Change-Id: Ie5bf4a851134091f9d8450661119727b85bbac56
Signed-off-by: Vic Yang <victoryang@chromium.org>
Reviewed-on: https://gerrit.chromium.org/gerrit/33180
Reviewed-by: Tom Wai-Hong Tam <waihong@chromium.org>
diff --git a/server/cros/faftsequence.py b/server/cros/faftsequence.py
index 3a205de..7222463 100644
--- a/server/cros/faftsequence.py
+++ b/server/cros/faftsequence.py
@@ -305,6 +305,15 @@
         super(FAFTSequence, self).cleanup()
 
 
+    def reset_client(self):
+        """Reset client if necessary."""
+        # TODO(crosbug/23309): Implement complete reset.
+        if not self._ping_test(self._client.ip, timeout=1):
+            # Client is offline. Cold reset it.
+            self.cold_reboot()
+            self.wait_for_client()
+
+
     def assert_test_image_in_usb_disk(self, usb_dev=None):
         """Assert an USB disk plugged-in on servo and a test image inside.
 
@@ -1372,11 +1381,15 @@
             self.wait_for_client_offline()
             self._call_action(test['firmware_action'])
 
-            if 'install_deps_after_boot' in test:
-                self.wait_for_client(
-                        install_deps=test['install_deps_after_boot'])
-            else:
-                self.wait_for_client()
+            try:
+                if 'install_deps_after_boot' in test:
+                    self.wait_for_client(
+                            install_deps=test['install_deps_after_boot'])
+                else:
+                    self.wait_for_client()
+            except AssertionError:
+                self.reset_client()
+                raise
 
 
     def run_faft_sequence(self):