dev: add initial APIs to devserver to support cros auto-update.

This CL adds three APIs on devserver:
1. 'cros_au' API: to support 'start cros auto-update'.
2. 'get_au_status' API: to check the status of cros auto-update.
3. 'collect_au_log' API: to collect auto-update log from devserver.
4. 'handler_cleanup' API: delete the status file for tracking the progress of
   CrOS auto-update.
5. 'kill_au_proc' API: to kill unexpected auto-update process for DUT.

Also it updates the unittests and integration test.

The 'cros_au' API triggers a background process to support the whole
auto-update processes for a CrOS host, includes:
1. Transfer devserver/stateful update package.
2. If devserver cannot run on the host, restore the stateful partition.
3. If restore_stateful_partiton is not required, and stateful_update is
required, do stateful_update.
4. If stateful_update fails, or rootfs_update is required, do rootfs update.
5. Final check after the whole auto-update process.

BUG=chromium:613765
TEST=Locally ran 'ds.auto_update([dut], [image_path])';
Ran 'repair' for dut from local autotest instance;
Ran unittest, devserver_integration_test.

 Changes to be committed:
	modified:   Makefile
	new file:   cros_update.py
	new file:   cros_update_logging.py
	new file:   cros_update_progress.py
	new file:   cros_update_unittest.py
	modified:   devserver.py
	modified:   devserver_integration_test.py

Change-Id: I2e9c116bc1e0b07d37b540266fd252aee4fd6e84
Reviewed-on: https://chromium-review.googlesource.com/346199
Commit-Ready: Xixuan Wu <xixuan@chromium.org>
Tested-by: Xixuan Wu <xixuan@chromium.org>
Reviewed-by: Xixuan Wu <xixuan@chromium.org>
diff --git a/cros_update_logging.py b/cros_update_logging.py
new file mode 100644
index 0000000..b1fca8c
--- /dev/null
+++ b/cros_update_logging.py
@@ -0,0 +1,66 @@
+# Copyright 2016 The Chromium OS Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+"""A logging strategy for cros-update.
+
+1. Logging format is set as the same as autoserv.
+2. Globally, set log level of output as 'DEBUG'.
+3. For control output, set LEVEL as 'INFO', to avoid unnecessary logs in
+   cherrypy logs.
+4. Add file handler to record all logs above level 'DEBUG' into file.
+"""
+
+from __future__ import print_function
+
+import logging
+import sys
+
+
+class loggingConfig(object):
+  """Configuration for auto-update logging."""
+
+  LOGGING_FORMAT = ('%(asctime)s.%(msecs)03d %(levelname)-5.5s|%(module)18.18s:'
+                    '%(lineno)4.4d| %(message)s')
+
+  def __init__(self):
+    self.logger = logging.getLogger()
+    self.GLOBAL_LEVEL = logging.DEBUG
+    self.CONSOLE_LEVEL = logging.INFO
+    self.FILE_LEVEL = logging.DEBUG
+    self.ENABLE_CONSOLE_LOGGING = False
+
+  def SetControlHandler(self, stream):
+    """Set console handler for logging.
+
+    Args:
+      stream: The input stream, could be stdout/stderr.
+    """
+    handler = logging.StreamHandler(stream)
+    handler.setLevel(self.CONSOLE_LEVEL)
+    file_formatter = logging.Formatter(fmt=self.LOGGING_FORMAT,
+                                       datefmt='%Y/%m/%d %H:%M:%S')
+    handler.setFormatter(file_formatter)
+    self.logger.addHandler(handler)
+    return handler
+
+
+  def SetFileHandler(self, file_name):
+    """Set file handler for logging.
+
+    Args:
+      file_name: The file to save logs into.
+    """
+    handler = logging.FileHandler(file_name)
+    handler.setLevel(self.FILE_LEVEL)
+    # file format is set as same as concole format
+    file_formatter = logging.Formatter(fmt=self.LOGGING_FORMAT,
+                                       datefmt='%Y/%m/%d %H:%M:%S')
+    handler.setFormatter(file_formatter)
+    self.logger.addHandler(handler)
+
+
+  def ConfigureLogging(self):
+    self.logger.setLevel(self.GLOBAL_LEVEL)
+    if self.ENABLE_CONSOLE_LOGGING:
+      self.SetControlHandler(sys.stdout)