Implemented hooks for external logging infrastructure for storing both server-side and client-side logs.

Signed-off-by: Svitlana Tumanova <stumanova@google.com>



git-svn-id: http://test.kernel.org/svn/autotest/trunk@1408 592f7852-d20e-0410-864c-8624ca9c26a4
diff --git a/server/autotest.py b/server/autotest.py
index 2672afb..9a37e15 100644
--- a/server/autotest.py
+++ b/server/autotest.py
@@ -175,6 +175,29 @@
 		return host
 
 
+	def read_keyval(self, dest):
+		keyval = {}
+		try:
+			keyval = utils.read_keyval(dest)
+		except IOError:
+			traceback.print_exc()
+		return keyval
+
+
+	def prepend_keyval(self, dest, keyval):
+		try:
+			new_keyval = utils.read_keyval(dest)
+			# Old entries should overwrite new entries.
+			for key, val in keyval.iteritems():
+				new_keyval[key] = val
+			# Delete existing keyval file
+			os.remove(os.path.join(dest, 'keyval'))
+			# Write out new info to keyval file
+			utils.write_keyval(dest, new_keyval)
+		except IOError:
+			traceback.print_exc()
+
+
 	def _do_run(self, control_file, results_dir, host, atrun, timeout):
 		try:
 			atrun.verify_machine()
@@ -215,9 +238,11 @@
 
 			# get the results
 			results = os.path.join(atrun.autodir, 'results',
-					       'default')
+						      'default')
+			keyval = self.read_keyval(results_dir)
 			# Copy all dirs in default to results_dir
 			host.get_file(results + '/', results_dir)
+			self.prepend_keyval(results_dir, keyval)
 
 
 	def run_timed_test(self, test_name, results_dir = '.', host = None,
@@ -276,6 +301,8 @@
 		cmd = [os.path.join(self.autodir, 'bin/autotest_client')]
 		if section > 0:
 			cmd.append('-c')
+		if self.host.job.use_external_logging():
+			cmd.append('-l')
 		cmd.append(self.remote_control_file)
 		return ' '.join(cmd)
 
diff --git a/server/hosts/ssh_host.py b/server/hosts/ssh_host.py
index b920af6..a9f1297 100644
--- a/server/hosts/ssh_host.py
+++ b/server/hosts/ssh_host.py
@@ -312,6 +312,7 @@
 		Raises:
 			AutoservRunError: the exit code of the command 
 				execution was not 0
+			AutoservSSHTimeout: ssh connection has timed out
 		"""
 		stdout = stdout_tee or sys.stdout
 		stderr = stderr_tee or sys.stdout
diff --git a/server/server_job.py b/server/server_job.py
index c37c96c..bc39916 100755
--- a/server/server_job.py
+++ b/server/server_job.py
@@ -106,7 +106,7 @@
 		return {}
 
 
-class server_job:
+class base_server_job:
 	"""The actual job against which we do everything.
 
 	Properties:
@@ -203,6 +203,24 @@
 		self.verify()
 
 
+	def enable_external_logging(self):
+		"""Start or restart external logging mechanism.
+		"""
+		pass
+
+
+	def disable_external_logging(self):
+		""" Pause or stop external logging mechanism.
+		"""
+		pass
+
+
+	def use_external_logging(self):
+		"""Return True if external logging should be used.
+		"""
+		return False
+
+
 	def run(self, reboot = False, install_before = False,
 		install_after = False, collect_crashdumps = True,
 		namespace = {}):
@@ -217,7 +235,8 @@
 		test_start_time = int(time.time())
 
 		os.chdir(self.resultdir)
-
+		
+		self.enable_external_logging()
 		status_log = os.path.join(self.resultdir, 'status.log')
 		try:
 			if install_before and machines:
@@ -237,6 +256,7 @@
 				namespace['test_start_time'] = test_start_time
 				exec(preamble + crashdumps,
 				     namespace, namespace)
+			self.disable_external_logging()
 			if reboot and machines:
 				exec(preamble + reboot_segment,
 				     namespace, namespace)
@@ -630,3 +650,14 @@
 			self._process_line(self.leftover)
 		self._process_logs()
 		self.flush()
+
+# site_server_job.py may be non-existant or empty, make sure that an
+# appropriate site_server_job class is created nevertheless
+try:
+	from site_server_job import site_server_job
+except ImportError:
+	class site_server_job(base_server_job):
+		pass
+	
+class server_job(site_server_job):
+	pass