Re-enable firmware_programmer initialization.

The factory_flow tool in factory repo is temporarily relying on the
servo and firmware_programmer modules of autotest. The dependency
will no longer be needed when the logic is moved to hdctools.

This CL re-enables firmware_programmer with exception control, so
the initialization will not fail when hdctools is not installed.

BUG=chromium:388945
TEST=Ran firmware_FAFTSetup with the DUT on my desk.

Change-Id: I02eea566abbc64ed91567620a94e06d6e6663368
Reviewed-on: https://chromium-review.googlesource.com/206644
Reviewed-by: Vic Yang <victoryang@chromium.org>
Reviewed-by: Yusuf Mohsinally <mohsinally@chromium.org>
Commit-Queue: Ricky Liang <jcliang@chromium.org>
Tested-by: Ricky Liang <jcliang@chromium.org>
diff --git a/server/cros/servo/servo.py b/server/cros/servo/servo.py
index f84e51c..45af3f8 100644
--- a/server/cros/servo/servo.py
+++ b/server/cros/servo/servo.py
@@ -10,6 +10,7 @@
 import logging, re, time, xmlrpclib
 
 from autotest_lib.client.common_lib import error
+from autotest_lib.server.cros.servo import firmware_programmer
 
 
 class _PowerStateController(object):
@@ -177,12 +178,13 @@
             # 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:281718.
-            # Removing the initialization because nothing uses the
-            # functionality right now and it stop causing an exception in the
-            # lab.
-            logging.warning("No firmware programmer initialized for servoV2")
-            #self._programmer = firmware_programmer.ProgrammerV2(self)
+            # 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())
@@ -646,10 +648,11 @@
                       on the DUT.
 
         """
-        raise NotImplementedError()
-        #if not self.is_localhost():
-        #    image = self._scp_image(image)
-        #self._programmer.program_bios(image)
+        if not self._programmer:
+            raise error.TestError('Firmware programmer is not set')
+        if not self.is_localhost():
+            image = self._scp_image(image)
+        self._programmer.program_bios(image)
 
 
     def program_ec(self, image):
@@ -659,10 +662,11 @@
                       on the DUT.
 
         """
-        raise NotImplementedError()
-        #if not self.is_localhost():
-        #    image = self._scp_image(image)
-        #self._programmer.program_ec(image)
+        if not self._programmer:
+            raise error.TestError('Firmware programmer is not set')
+        if not self.is_localhost():
+            image = self._scp_image(image)
+        self._programmer.program_ec(image)
 
 
     def _switch_usbkey_power(self, power_state, detection_delay=False):