diff options
author | Zhizhou Yang <zhizhouy@google.com> | 2019-07-30 16:47:19 -0700 |
---|---|---|
committer | Zhizhou Yang <zhizhouy@google.com> | 2019-08-01 19:30:47 +0000 |
commit | 46c8b289cfca6bd7bdff6f1fbe9728647d9d8a47 (patch) | |
tree | 80361d0e87ea7a52de809e585944572f7577214b /crosperf | |
parent | e15a4c05e24684592a13ff1f08866be079467228 (diff) | |
download | toolchain-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.py | 35 | ||||
-rwxr-xr-x | crosperf/experiment_factory_unittest.py | 31 |
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) |