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)