aboutsummaryrefslogtreecommitdiff
path: root/crosperf
diff options
context:
space:
mode:
authorZhizhou Yang <zhizhouy@google.com>2019-07-30 16:47:19 -0700
committerZhizhou Yang <zhizhouy@google.com>2019-08-01 19:30:47 +0000
commit46c8b289cfca6bd7bdff6f1fbe9728647d9d8a47 (patch)
tree80361d0e87ea7a52de809e585944572f7577214b /crosperf
parente15a4c05e24684592a13ff1f08866be079467228 (diff)
downloadtoolchain-utils-46c8b289cfca6bd7bdff6f1fbe9728647d9d8a47.tar.gz
crosperf: check skylab tool exists or not for skylab mode
This patch checks whether skylab tool is installed when skylab mode is specified. After installing it, it requires user to login the tool manually for the first time since there is no way to do it automatically. BUG=chromium:984790 TEST=Tested locally and passed unittest. Change-Id: Iff03ed0552127837264d8437e2b73346f1abdbd4 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/toolchain-utils/+/1727264 Reviewed-by: Caroline Tice <cmtice@chromium.org> Tested-by: Zhizhou Yang <zhizhouy@google.com> Auto-Submit: Zhizhou Yang <zhizhouy@google.com> Legacy-Commit-Queue: Commit Bot <commit-bot@chromium.org>
Diffstat (limited to 'crosperf')
-rw-r--r--crosperf/experiment_factory.py35
-rwxr-xr-xcrosperf/experiment_factory_unittest.py31
2 files changed, 61 insertions, 5 deletions
diff --git a/crosperf/experiment_factory.py b/crosperf/experiment_factory.py
index a31a6487..b889a129 100644
--- a/crosperf/experiment_factory.py
+++ b/crosperf/experiment_factory.py
@@ -9,9 +9,12 @@ from __future__ import print_function
import os
import re
import socket
+import sys
from benchmark import Benchmark
import config
+from cros_utils import logger
+from cros_utils import command_executer
from experiment import Experiment
from label import Label
from label import MockLabel
@@ -114,7 +117,16 @@ class ExperimentFactory(object):
global_settings = experiment_file.GetGlobalSettings()
experiment_name = global_settings.GetField('name')
board = global_settings.GetField('board')
+ chromeos_root = global_settings.GetField('chromeos_root')
+ log_level = global_settings.GetField('logging_level')
+ if log_level not in ('quiet', 'average', 'verbose'):
+ log_level = 'verbose'
+
skylab = global_settings.GetField('skylab')
+ # Check whether skylab tool is installed correctly for skylab mode.
+ if skylab and not self.CheckSkylabTool(chromeos_root, log_level):
+ sys.exit(0)
+
remote = global_settings.GetField('remote')
# This is used to remove the ",' from the remote if user
# add them to the remote string.
@@ -124,7 +136,6 @@ class ExperimentFactory(object):
c = re.sub('["\']', '', i)
new_remote.append(c)
remote = new_remote
- chromeos_root = global_settings.GetField('chromeos_root')
rm_chroot_tmp = global_settings.GetField('rm_chroot_tmp')
perf_args = global_settings.GetField('perf_args')
acquire_timeout = global_settings.GetField('acquire_timeout')
@@ -143,9 +154,6 @@ class ExperimentFactory(object):
locks_dir = file_lock_machine.Machine.LOCKS_DIR
chrome_src = global_settings.GetField('chrome_src')
show_all_results = global_settings.GetField('show_all_results')
- log_level = global_settings.GetField('logging_level')
- if log_level not in ('quiet', 'average', 'verbose'):
- log_level = 'verbose'
cwp_dso = global_settings.GetField('cwp_dso')
if cwp_dso and not cwp_dso in dso_list:
raise RuntimeError('The DSO specified is not supported')
@@ -416,3 +424,22 @@ class ExperimentFactory(object):
# TODO: (AI:zhizhouy) need to check whether a remote is a local or lab
# machine. If not lab machine, raise an error.
pass
+
+ def CheckSkylabTool(self, chromeos_root, log_level):
+ SKYLAB_PATH = '/usr/local/bin/skylab'
+ if os.path.exists(SKYLAB_PATH):
+ return True
+ l = logger.GetLogger()
+ l.LogOutput('Skylab tool not installed, trying to install it.')
+ ce = command_executer.GetCommandExecuter(l, log_level=log_level)
+ setup_lab_tools = os.path.join(chromeos_root, 'chromeos-admin', 'lab-tools',
+ 'setup_lab_tools')
+ cmd = '%s' % setup_lab_tools
+ status = ce.RunCommand(cmd)
+ if status != 0:
+ raise RuntimeError('Skylab tool not installed correctly, please try to '
+ 'manually install it from %s' % setup_lab_tools)
+ l.LogOutput('Skylab is installed at %s, please login before first use. '
+ 'Login by running \'skylab login\' and follow instructions.' %
+ SKYLAB_PATH)
+ return False
diff --git a/crosperf/experiment_factory_unittest.py b/crosperf/experiment_factory_unittest.py
index 0990cfc4..26fbf8a8 100755
--- a/crosperf/experiment_factory_unittest.py
+++ b/crosperf/experiment_factory_unittest.py
@@ -9,11 +9,13 @@
from __future__ import print_function
+import mock
+import os
import StringIO
import socket
-import mock
import unittest
+from cros_utils import command_executer
from cros_utils.file_utils import FileUtils
from experiment_file import ExperimentFile
@@ -407,6 +409,33 @@ class ExperimentFactoryTest(unittest.TestCase):
else:
self.assertGreaterEqual(len(remotes), 2)
+ @mock.patch.object(command_executer.CommandExecuter, 'RunCommand')
+ @mock.patch.object(os.path, 'exists')
+ def test_check_skylab_tool(self, mock_exists, mock_runcmd):
+ ef = ExperimentFactory()
+ chromeos_root = '/tmp/chromeos'
+ log_level = 'average'
+
+ mock_exists.return_value = True
+ ret = ef.CheckSkylabTool(chromeos_root, log_level)
+ self.assertTrue(ret)
+
+ mock_exists.return_value = False
+ mock_runcmd.return_value = 1
+ with self.assertRaises(RuntimeError) as err:
+ ef.CheckSkylabTool(chromeos_root, log_level)
+ self.assertEqual(mock_runcmd.call_count, 1)
+ self.assertEqual(
+ err.exception.message, 'Skylab tool not installed '
+ 'correctly, please try to manually install it from '
+ '/tmp/chromeos/chromeos-admin/lab-tools/setup_lab_tools')
+
+ mock_runcmd.return_value = 0
+ mock_runcmd.call_count = 0
+ ret = ef.CheckSkylabTool(chromeos_root, log_level)
+ self.assertEqual(mock_runcmd.call_count, 1)
+ self.assertFalse(ret)
+
if __name__ == '__main__':
FileUtils.Configure(True)