Don't make any servo XMLPRC calls during Servo contructor.

In order to test servo, it can be necessary to create a servo object
for a servo host where servod isn't working.  This changes the Servo
constructor not to fail in that case, allowing the callers to have
control over when and how to test for a working servod.

BUG=chromium:388458
TEST=run various test cases on a local instance

Change-Id: I8e5c51be2287ec4b93a6519144540c90846b88d4
Reviewed-on: https://chromium-review.googlesource.com/211875
Tested-by: Richard Barnette <jrbarnette@chromium.org>
Reviewed-by: Dan Shi <dshi@chromium.org>
Reviewed-by: Yusuf Mohsinally <mohsinally@chromium.org>
Commit-Queue: Richard Barnette <jrbarnette@chromium.org>
diff --git a/server/cros/servo/servo.py b/server/cros/servo/servo.py
index 45af3f8..2e55df5 100644
--- a/server/cros/servo/servo.py
+++ b/server/cros/servo/servo.py
@@ -165,29 +165,8 @@
         self._servo_serial = servo_serial
         self._server = servo_host.get_servod_server_proxy()
         self._power_state = _PowerStateController(self)
-
-        # a string, showing what interface (host or dut) the USB device is
-        # connected to.
         self._usb_state = None
-        self.set('dut_hub_pwren', 'on')
-        self.set('usb_mux_oe1', 'on')
-        self.switch_usbkey('off')
-
-        # Initialize firmware programmer
-        if self.get_version() == "servo_v2":
-            # Lab drones do not necessarily contain hdctools and the
-            # initialization of the firmware programmer raises an exception.
-            # We need to move the programmer code over to hctools,
-            # see chromium:381718.
-            try:
-                self._programmer = firmware_programmer.ProgrammerV2(self)
-            except firmware_programmer.ProgrammerError:
-                logging.warning(
-                        "No firmware programmer initialized for servoV2")
-                self._programmer = None
-        else:
-            logging.warning("No firmware programmer for servo version: %s",
-                         self.get_version())
+        self._programmer = None
 
 
     @property
@@ -227,6 +206,9 @@
                           initialization.
         """
         self._server.hwinit()
+        self.set('dut_hub_pwren', 'on')
+        self.set('usb_mux_oe1', 'on')
+        self.switch_usbkey('off')
         if cold_reset:
             self._power_state.reset()
 
@@ -641,6 +623,19 @@
                                     args=args).stdout.strip()
 
 
+    def _initialize_programmer(self):
+        if self._programmer:
+            return
+        # Initialize firmware programmer
+        servo_version = self.get_version()
+        if servo_version == 'servo_v2':
+            self._programmer = firmware_programmer.ProgrammerV2(self)
+        else:
+            raise error.TestError(
+                    'No firmware programmer for servo version: %s' %
+                         servo_version)
+
+
     def program_bios(self, image):
         """Program bios on DUT with given image.
 
@@ -648,8 +643,7 @@
                       on the DUT.
 
         """
-        if not self._programmer:
-            raise error.TestError('Firmware programmer is not set')
+        self._initialize_programmer()
         if not self.is_localhost():
             image = self._scp_image(image)
         self._programmer.program_bios(image)
@@ -662,8 +656,7 @@
                       on the DUT.
 
         """
-        if not self._programmer:
-            raise error.TestError('Firmware programmer is not set')
+        self._initialize_programmer()
         if not self.is_localhost():
             image = self._scp_image(image)
         self._programmer.program_ec(image)