autotest: Update servo_state during DUT repair task

Updating servo_state during ServoHost.verify() and ServoHost.repair()

BUG=chromium:1045191,chromium:1012504
TEST=unittest

Change-Id: I794e90f0bbab554bd87fa89d8785eab9b0023f7c
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/autotest/+/2053074
Reviewed-by: Garry Wang <xianuowang@chromium.org>
Commit-Queue: Otabek Kasimov <otabek@google.com>
Tested-by: Otabek Kasimov <otabek@google.com>
Auto-Submit: Otabek Kasimov <otabek@google.com>
diff --git a/server/hosts/servo_host.py b/server/hosts/servo_host.py
index 87c0eb4..f479215 100644
--- a/server/hosts/servo_host.py
+++ b/server/hosts/servo_host.py
@@ -54,6 +54,10 @@
         'SCHEDULER', 'drone_installation_directory',
         default='/usr/local/autotest')
 
+SERVO_STATE_LABEL_PREFIX = 'servo_state'
+SERVO_STATE_WORKING = 'WORKING'
+SERVO_STATE_BROKEN = 'BROKEN'
+
 
 class ServoHost(base_servohost.BaseServoHost):
     """Host class for a servo host(e.g. beaglebone, labstation)
@@ -70,6 +74,15 @@
     # Ready test function
     SERVO_READY_METHOD = 'get_version'
 
+    def _init_attributes(self):
+        self._servo_state = None
+        self.servo_port = None
+        self.servo_board = None
+        self.servo_model = None
+        self.servo_serial = None
+        self._servo = None
+        self._servod_server_proxy = None
+
 
     def _initialize(self, servo_host='localhost',
                     servo_port=DEFAULT_PORT, servo_board=None,
@@ -93,12 +106,11 @@
         """
         super(ServoHost, self)._initialize(hostname=servo_host,
                                            is_in_lab=is_in_lab, *args, **dargs)
+        self._init_attributes()
         self.servo_port = int(servo_port)
         self.servo_board = servo_board
         self.servo_model = servo_model
         self.servo_serial = servo_serial
-        self._servo = None
-        self._servod_server_proxy = None
 
         # Path of the servo host lock file.
         self._lock_file = (self.TEMP_FILE_DIR + str(self.servo_port)
@@ -194,7 +206,11 @@
         self.record('INFO', None, None, message)
         try:
             self._repair_strategy.verify(self, silent)
+            self._servo_state = SERVO_STATE_WORKING
+            self.record('INFO', None, None, 'ServoHost verify set servo_state as WORKING')
         except:
+            self._servo_state = SERVO_STATE_BROKEN
+            self.record('INFO', None, None, 'ServoHost verify set servo_state as BROKEN')
             self.disconnect_servo()
             self.stop_servod()
             raise
@@ -210,11 +226,15 @@
         self.record('INFO', None, None, message)
         try:
             self._repair_strategy.repair(self, silent)
+            self._servo_state = SERVO_STATE_WORKING
+            self.record('INFO', None, None, 'ServoHost repair set servo_state as WORKING')
             # If target is a labstation then try to withdraw any existing
             # reboot request created by this servo because it passed repair.
             if self.is_labstation():
                 self.withdraw_reboot_request()
         except:
+            self._servo_state = SERVO_STATE_BROKEN
+            self.record('INFO', None, None, 'ServoHost repair set servo_state as BROKEN')
             self.disconnect_servo()
             self.stop_servod()
             raise
@@ -356,6 +376,10 @@
         super(ServoHost, self).close()
 
 
+    def get_servo_state(self):
+        return SERVO_STATE_BROKEN if self._servo_state is None else self._servo_state
+
+
 def make_servo_hostname(dut_hostname):
     """Given a DUT's hostname, return the hostname of its servo.