xref: /aosp_15_r20/external/toolchain-utils/crosperf/settings_factory.py (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
1*760c253cSXin Li# -*- coding: utf-8 -*-
2*760c253cSXin Li# Copyright 2013 The ChromiumOS Authors
3*760c253cSXin Li# Use of this source code is governed by a BSD-style license that can be
4*760c253cSXin Li# found in the LICENSE file.
5*760c253cSXin Li
6*760c253cSXin Li"""Setting files for global, benchmark and labels."""
7*760c253cSXin Li
8*760c253cSXin Li
9*760c253cSXin Lifrom field import BooleanField
10*760c253cSXin Lifrom field import EnumField
11*760c253cSXin Lifrom field import FloatField
12*760c253cSXin Lifrom field import IntegerField
13*760c253cSXin Lifrom field import ListField
14*760c253cSXin Lifrom field import TextField
15*760c253cSXin Lifrom settings import Settings
16*760c253cSXin Li
17*760c253cSXin Li
18*760c253cSXin Liclass BenchmarkSettings(Settings):
19*760c253cSXin Li    """Settings used to configure individual benchmarks."""
20*760c253cSXin Li
21*760c253cSXin Li    def __init__(self, name):
22*760c253cSXin Li        super(BenchmarkSettings, self).__init__(name, "benchmark")
23*760c253cSXin Li        self.AddField(
24*760c253cSXin Li            TextField(
25*760c253cSXin Li                "test_name",
26*760c253cSXin Li                description="The name of the test to run. "
27*760c253cSXin Li                "Defaults to the name of the benchmark.",
28*760c253cSXin Li            )
29*760c253cSXin Li        )
30*760c253cSXin Li        self.AddField(
31*760c253cSXin Li            TextField(
32*760c253cSXin Li                "test_args",
33*760c253cSXin Li                description="Arguments to be passed to the " "test.",
34*760c253cSXin Li            )
35*760c253cSXin Li        )
36*760c253cSXin Li        self.AddField(
37*760c253cSXin Li            IntegerField(
38*760c253cSXin Li                "iterations",
39*760c253cSXin Li                required=False,
40*760c253cSXin Li                default=0,
41*760c253cSXin Li                description="Number of iterations to run the test. "
42*760c253cSXin Li                "If not set, will run each benchmark test the optimum number of "
43*760c253cSXin Li                "times to get a stable result.",
44*760c253cSXin Li            )
45*760c253cSXin Li        )
46*760c253cSXin Li        self.AddField(
47*760c253cSXin Li            TextField(
48*760c253cSXin Li                "suite",
49*760c253cSXin Li                default="test_that",
50*760c253cSXin Li                description="The type of the benchmark.",
51*760c253cSXin Li            )
52*760c253cSXin Li        )
53*760c253cSXin Li        self.AddField(
54*760c253cSXin Li            IntegerField(
55*760c253cSXin Li                "retries",
56*760c253cSXin Li                default=0,
57*760c253cSXin Li                description="Number of times to retry a " "benchmark run.",
58*760c253cSXin Li            )
59*760c253cSXin Li        )
60*760c253cSXin Li        self.AddField(
61*760c253cSXin Li            BooleanField(
62*760c253cSXin Li                "run_local",
63*760c253cSXin Li                description="Run benchmark harness on the DUT. "
64*760c253cSXin Li                "Currently only compatible with the suite: "
65*760c253cSXin Li                "telemetry_Crosperf.",
66*760c253cSXin Li                required=False,
67*760c253cSXin Li                default=True,
68*760c253cSXin Li            )
69*760c253cSXin Li        )
70*760c253cSXin Li        self.AddField(
71*760c253cSXin Li            FloatField(
72*760c253cSXin Li                "weight",
73*760c253cSXin Li                default=0.0,
74*760c253cSXin Li                description="Weight of the benchmark for CWP approximation",
75*760c253cSXin Li            )
76*760c253cSXin Li        )
77*760c253cSXin Li
78*760c253cSXin Li
79*760c253cSXin Liclass LabelSettings(Settings):
80*760c253cSXin Li    """Settings for each label."""
81*760c253cSXin Li
82*760c253cSXin Li    def __init__(self, name):
83*760c253cSXin Li        super(LabelSettings, self).__init__(name, "label")
84*760c253cSXin Li        self.AddField(
85*760c253cSXin Li            TextField(
86*760c253cSXin Li                "chromeos_image",
87*760c253cSXin Li                required=False,
88*760c253cSXin Li                description="The path to the image to run tests "
89*760c253cSXin Li                "on, for local/custom-built images. See the "
90*760c253cSXin Li                "'build' option for official or trybot images.",
91*760c253cSXin Li            )
92*760c253cSXin Li        )
93*760c253cSXin Li        self.AddField(
94*760c253cSXin Li            TextField(
95*760c253cSXin Li                "autotest_path",
96*760c253cSXin Li                required=False,
97*760c253cSXin Li                description="Autotest directory path relative to chroot which "
98*760c253cSXin Li                "has autotest files for the image to run tests requiring autotest "
99*760c253cSXin Li                "files.",
100*760c253cSXin Li            )
101*760c253cSXin Li        )
102*760c253cSXin Li        self.AddField(
103*760c253cSXin Li            TextField(
104*760c253cSXin Li                "debug_path",
105*760c253cSXin Li                required=False,
106*760c253cSXin Li                description="Debug info directory relative to chroot which has "
107*760c253cSXin Li                "symbols and vmlinux that can be used by perf tool.",
108*760c253cSXin Li            )
109*760c253cSXin Li        )
110*760c253cSXin Li        self.AddField(
111*760c253cSXin Li            TextField(
112*760c253cSXin Li                "chromeos_root",
113*760c253cSXin Li                description="The path to a chromeos checkout which "
114*760c253cSXin Li                "contains a src/scripts directory. Defaults to "
115*760c253cSXin Li                "the chromeos checkout which contains the "
116*760c253cSXin Li                "chromeos_image.",
117*760c253cSXin Li            )
118*760c253cSXin Li        )
119*760c253cSXin Li        self.AddField(
120*760c253cSXin Li            ListField(
121*760c253cSXin Li                "remote",
122*760c253cSXin Li                description="A comma-separated list of IPs of chromeos"
123*760c253cSXin Li                "devices to run experiments on.",
124*760c253cSXin Li            )
125*760c253cSXin Li        )
126*760c253cSXin Li        self.AddField(
127*760c253cSXin Li            TextField(
128*760c253cSXin Li                "image_args",
129*760c253cSXin Li                required=False,
130*760c253cSXin Li                default="",
131*760c253cSXin Li                description="Extra arguments to pass to " "image_chromeos.py.",
132*760c253cSXin Li            )
133*760c253cSXin Li        )
134*760c253cSXin Li        self.AddField(
135*760c253cSXin Li            TextField(
136*760c253cSXin Li                "cache_dir",
137*760c253cSXin Li                default="",
138*760c253cSXin Li                description="The cache dir for this image.",
139*760c253cSXin Li            )
140*760c253cSXin Li        )
141*760c253cSXin Li        self.AddField(
142*760c253cSXin Li            TextField(
143*760c253cSXin Li                "compiler",
144*760c253cSXin Li                default="gcc",
145*760c253cSXin Li                description="The compiler used to build the "
146*760c253cSXin Li                "ChromeOS image (gcc or llvm).",
147*760c253cSXin Li            )
148*760c253cSXin Li        )
149*760c253cSXin Li        self.AddField(
150*760c253cSXin Li            TextField(
151*760c253cSXin Li                "chrome_src",
152*760c253cSXin Li                description="The path to the source of chrome. "
153*760c253cSXin Li                "This is used to run telemetry benchmarks. "
154*760c253cSXin Li                "The default one is the src inside chroot.",
155*760c253cSXin Li                required=False,
156*760c253cSXin Li                default="",
157*760c253cSXin Li            )
158*760c253cSXin Li        )
159*760c253cSXin Li        self.AddField(
160*760c253cSXin Li            TextField(
161*760c253cSXin Li                "build",
162*760c253cSXin Li                description="The xbuddy specification for an "
163*760c253cSXin Li                "official or trybot image to use for tests. "
164*760c253cSXin Li                "'/remote' is assumed, and the board is given "
165*760c253cSXin Li                "elsewhere, so omit the '/remote/<board>/' xbuddy "
166*760c253cSXin Li                "prefix.",
167*760c253cSXin Li                required=False,
168*760c253cSXin Li                default="",
169*760c253cSXin Li            )
170*760c253cSXin Li        )
171*760c253cSXin Li
172*760c253cSXin Li
173*760c253cSXin Liclass GlobalSettings(Settings):
174*760c253cSXin Li    """Settings that apply per-experiment."""
175*760c253cSXin Li
176*760c253cSXin Li    def __init__(self, name):
177*760c253cSXin Li        super(GlobalSettings, self).__init__(name, "global")
178*760c253cSXin Li        self.AddField(
179*760c253cSXin Li            TextField(
180*760c253cSXin Li                "name",
181*760c253cSXin Li                description="The name of the experiment. Just an "
182*760c253cSXin Li                "identifier.",
183*760c253cSXin Li            )
184*760c253cSXin Li        )
185*760c253cSXin Li        self.AddField(
186*760c253cSXin Li            TextField(
187*760c253cSXin Li                "board",
188*760c253cSXin Li                description="The target board for running "
189*760c253cSXin Li                "experiments on, e.g. x86-alex.",
190*760c253cSXin Li            )
191*760c253cSXin Li        )
192*760c253cSXin Li        self.AddField(
193*760c253cSXin Li            BooleanField(
194*760c253cSXin Li                "crosfleet",
195*760c253cSXin Li                description="Whether to run experiments via crosfleet.",
196*760c253cSXin Li                default=False,
197*760c253cSXin Li            )
198*760c253cSXin Li        )
199*760c253cSXin Li        self.AddField(
200*760c253cSXin Li            ListField(
201*760c253cSXin Li                "remote",
202*760c253cSXin Li                description="A comma-separated list of IPs of "
203*760c253cSXin Li                "chromeos devices to run experiments on.",
204*760c253cSXin Li            )
205*760c253cSXin Li        )
206*760c253cSXin Li        self.AddField(
207*760c253cSXin Li            BooleanField(
208*760c253cSXin Li                "rerun_if_failed",
209*760c253cSXin Li                description="Whether to re-run failed test runs or not.",
210*760c253cSXin Li                default=False,
211*760c253cSXin Li            )
212*760c253cSXin Li        )
213*760c253cSXin Li        self.AddField(
214*760c253cSXin Li            BooleanField(
215*760c253cSXin Li                "rm_chroot_tmp",
216*760c253cSXin Li                default=False,
217*760c253cSXin Li                description="Whether to remove the test_that "
218*760c253cSXin Li                "result in the chroot.",
219*760c253cSXin Li            )
220*760c253cSXin Li        )
221*760c253cSXin Li        self.AddField(
222*760c253cSXin Li            ListField(
223*760c253cSXin Li                "email",
224*760c253cSXin Li                description="Space-separated list of email "
225*760c253cSXin Li                "addresses to send email to.",
226*760c253cSXin Li            )
227*760c253cSXin Li        )
228*760c253cSXin Li        self.AddField(
229*760c253cSXin Li            BooleanField(
230*760c253cSXin Li                "rerun",
231*760c253cSXin Li                description="Whether to ignore the cache and "
232*760c253cSXin Li                "for tests to be re-run.",
233*760c253cSXin Li                default=False,
234*760c253cSXin Li            )
235*760c253cSXin Li        )
236*760c253cSXin Li        self.AddField(
237*760c253cSXin Li            BooleanField(
238*760c253cSXin Li                "ignore_cache",
239*760c253cSXin Li                description='Alias of "rerun" to ignore cache.',
240*760c253cSXin Li                default=False,
241*760c253cSXin Li            )
242*760c253cSXin Li        )
243*760c253cSXin Li        self.AddField(
244*760c253cSXin Li            BooleanField(
245*760c253cSXin Li                "same_specs",
246*760c253cSXin Li                default=True,
247*760c253cSXin Li                description="Ensure cached runs are run on the "
248*760c253cSXin Li                "same kind of devices which are specified as a "
249*760c253cSXin Li                "remote.",
250*760c253cSXin Li            )
251*760c253cSXin Li        )
252*760c253cSXin Li        self.AddField(
253*760c253cSXin Li            BooleanField(
254*760c253cSXin Li                "same_machine",
255*760c253cSXin Li                default=False,
256*760c253cSXin Li                description="Ensure cached runs are run on the same remote.",
257*760c253cSXin Li            )
258*760c253cSXin Li        )
259*760c253cSXin Li        self.AddField(
260*760c253cSXin Li            BooleanField(
261*760c253cSXin Li                "use_file_locks",
262*760c253cSXin Li                default=False,
263*760c253cSXin Li                description="DEPRECATED: Whether to use the file locks "
264*760c253cSXin Li                "or AFE server lock mechanism.",
265*760c253cSXin Li            )
266*760c253cSXin Li        )
267*760c253cSXin Li        self.AddField(
268*760c253cSXin Li            IntegerField(
269*760c253cSXin Li                "iterations",
270*760c253cSXin Li                required=False,
271*760c253cSXin Li                default=0,
272*760c253cSXin Li                description="Number of iterations to run all tests. "
273*760c253cSXin Li                "If not set, will run each benchmark test the optimum number of "
274*760c253cSXin Li                "times to get a stable result.",
275*760c253cSXin Li            )
276*760c253cSXin Li        )
277*760c253cSXin Li        self.AddField(
278*760c253cSXin Li            TextField(
279*760c253cSXin Li                "chromeos_root",
280*760c253cSXin Li                description="The path to a chromeos checkout which "
281*760c253cSXin Li                "contains a src/scripts directory. Defaults to "
282*760c253cSXin Li                "the chromeos checkout which contains the "
283*760c253cSXin Li                "chromeos_image.",
284*760c253cSXin Li            )
285*760c253cSXin Li        )
286*760c253cSXin Li        self.AddField(
287*760c253cSXin Li            TextField(
288*760c253cSXin Li                "logging_level",
289*760c253cSXin Li                default="average",
290*760c253cSXin Li                description="The level of logging desired. "
291*760c253cSXin Li                "Options are 'quiet', 'average', and 'verbose'.",
292*760c253cSXin Li            )
293*760c253cSXin Li        )
294*760c253cSXin Li        self.AddField(
295*760c253cSXin Li            IntegerField(
296*760c253cSXin Li                "acquire_timeout",
297*760c253cSXin Li                default=0,
298*760c253cSXin Li                description="Number of seconds to wait for "
299*760c253cSXin Li                "machine before exit if all the machines in "
300*760c253cSXin Li                "the experiment file are busy. Default is 0.",
301*760c253cSXin Li            )
302*760c253cSXin Li        )
303*760c253cSXin Li        self.AddField(
304*760c253cSXin Li            TextField(
305*760c253cSXin Li                "perf_args",
306*760c253cSXin Li                default="",
307*760c253cSXin Li                description="The optional profile command. It "
308*760c253cSXin Li                "enables perf commands to record perforamance "
309*760c253cSXin Li                "related counters. It must start with perf "
310*760c253cSXin Li                "command record or stat followed by arguments.",
311*760c253cSXin Li            )
312*760c253cSXin Li        )
313*760c253cSXin Li        self.AddField(
314*760c253cSXin Li            BooleanField(
315*760c253cSXin Li                "download_debug",
316*760c253cSXin Li                default=True,
317*760c253cSXin Li                description="Download compressed debug symbols alongwith "
318*760c253cSXin Li                "image. This can provide more info matching symbols for"
319*760c253cSXin Li                "profiles, but takes larger space. By default, download"
320*760c253cSXin Li                "it only when perf_args is specified.",
321*760c253cSXin Li            )
322*760c253cSXin Li        )
323*760c253cSXin Li        self.AddField(
324*760c253cSXin Li            TextField(
325*760c253cSXin Li                "cache_dir",
326*760c253cSXin Li                default="",
327*760c253cSXin Li                description="The abs path of cache dir. "
328*760c253cSXin Li                "Default is /home/$(whoami)/cros_scratch.",
329*760c253cSXin Li            )
330*760c253cSXin Li        )
331*760c253cSXin Li        self.AddField(
332*760c253cSXin Li            BooleanField(
333*760c253cSXin Li                "cache_only",
334*760c253cSXin Li                default=False,
335*760c253cSXin Li                description="Whether to use only cached "
336*760c253cSXin Li                "results (do not rerun failed tests).",
337*760c253cSXin Li            )
338*760c253cSXin Li        )
339*760c253cSXin Li        self.AddField(
340*760c253cSXin Li            BooleanField(
341*760c253cSXin Li                "no_email",
342*760c253cSXin Li                default=False,
343*760c253cSXin Li                description="Whether to disable the email to "
344*760c253cSXin Li                "user after crosperf finishes.",
345*760c253cSXin Li            )
346*760c253cSXin Li        )
347*760c253cSXin Li        self.AddField(
348*760c253cSXin Li            BooleanField(
349*760c253cSXin Li                "json_report",
350*760c253cSXin Li                default=False,
351*760c253cSXin Li                description="Whether to generate a json version "
352*760c253cSXin Li                "of the report, for archiving.",
353*760c253cSXin Li            )
354*760c253cSXin Li        )
355*760c253cSXin Li        self.AddField(
356*760c253cSXin Li            BooleanField(
357*760c253cSXin Li                "show_all_results",
358*760c253cSXin Li                default=False,
359*760c253cSXin Li                description="When running Telemetry tests, "
360*760c253cSXin Li                "whether to all the results, instead of just "
361*760c253cSXin Li                "the default (summary) results.",
362*760c253cSXin Li            )
363*760c253cSXin Li        )
364*760c253cSXin Li        self.AddField(
365*760c253cSXin Li            TextField(
366*760c253cSXin Li                "share_cache",
367*760c253cSXin Li                default="",
368*760c253cSXin Li                description="Path to alternate cache whose data "
369*760c253cSXin Li                "you want to use. It accepts multiple directories "
370*760c253cSXin Li                'separated by a ",".',
371*760c253cSXin Li            )
372*760c253cSXin Li        )
373*760c253cSXin Li        self.AddField(
374*760c253cSXin Li            TextField("results_dir", default="", description="The results dir.")
375*760c253cSXin Li        )
376*760c253cSXin Li        self.AddField(
377*760c253cSXin Li            BooleanField(
378*760c253cSXin Li                "compress_results",
379*760c253cSXin Li                default=True,
380*760c253cSXin Li                description="Whether to compress all test results other than "
381*760c253cSXin Li                "reports into a tarball to save disk space.",
382*760c253cSXin Li            )
383*760c253cSXin Li        )
384*760c253cSXin Li        self.AddField(
385*760c253cSXin Li            TextField(
386*760c253cSXin Li                "locks_dir",
387*760c253cSXin Li                default="",
388*760c253cSXin Li                description="An alternate directory to use for "
389*760c253cSXin Li                "storing/checking machine file locks for local machines. "
390*760c253cSXin Li                "By default the file locks directory is "
391*760c253cSXin Li                "/google/data/rw/users/mo/mobiletc-prebuild/locks.\n"
392*760c253cSXin Li                "WARNING: If you use your own locks directory, "
393*760c253cSXin Li                "there is no guarantee that someone else might not "
394*760c253cSXin Li                "hold a lock on the same machine in a different "
395*760c253cSXin Li                "locks directory.",
396*760c253cSXin Li            )
397*760c253cSXin Li        )
398*760c253cSXin Li        self.AddField(
399*760c253cSXin Li            TextField(
400*760c253cSXin Li                "chrome_src",
401*760c253cSXin Li                description="The path to the source of chrome. "
402*760c253cSXin Li                "This is used to run telemetry benchmarks. "
403*760c253cSXin Li                "The default one is the src inside chroot.",
404*760c253cSXin Li                required=False,
405*760c253cSXin Li                default="",
406*760c253cSXin Li            )
407*760c253cSXin Li        )
408*760c253cSXin Li        self.AddField(
409*760c253cSXin Li            IntegerField(
410*760c253cSXin Li                "retries",
411*760c253cSXin Li                default=0,
412*760c253cSXin Li                description="Number of times to retry a " "benchmark run.",
413*760c253cSXin Li            )
414*760c253cSXin Li        )
415*760c253cSXin Li        self.AddField(
416*760c253cSXin Li            TextField(
417*760c253cSXin Li                "cwp_dso",
418*760c253cSXin Li                description="The DSO type that we want to use for "
419*760c253cSXin Li                "CWP approximation. This is used to run telemetry "
420*760c253cSXin Li                "benchmarks. Valid DSO types can be found from dso_list "
421*760c253cSXin Li                "in experiment_factory.py. The default value is set to "
422*760c253cSXin Li                "be empty.",
423*760c253cSXin Li                required=False,
424*760c253cSXin Li                default="",
425*760c253cSXin Li            )
426*760c253cSXin Li        )
427*760c253cSXin Li        self.AddField(
428*760c253cSXin Li            BooleanField(
429*760c253cSXin Li                "enable_aslr",
430*760c253cSXin Li                description="Enable ASLR on the machine to run the "
431*760c253cSXin Li                "benchmarks. ASLR is disabled by default",
432*760c253cSXin Li                required=False,
433*760c253cSXin Li                default=False,
434*760c253cSXin Li            )
435*760c253cSXin Li        )
436*760c253cSXin Li        self.AddField(
437*760c253cSXin Li            BooleanField(
438*760c253cSXin Li                "ignore_min_max",
439*760c253cSXin Li                description="When doing math for the raw results, "
440*760c253cSXin Li                "ignore min and max values to reduce noise.",
441*760c253cSXin Li                required=False,
442*760c253cSXin Li                default=False,
443*760c253cSXin Li            )
444*760c253cSXin Li        )
445*760c253cSXin Li        self.AddField(
446*760c253cSXin Li            TextField(
447*760c253cSXin Li                "intel_pstate",
448*760c253cSXin Li                description="Intel Pstate mode.\n"
449*760c253cSXin Li                'Supported modes: "active", "passive", "no_hwp".\n'
450*760c253cSXin Li                'Default is "no_hwp" which disables hardware pstates to avoid '
451*760c253cSXin Li                "noise in benchmarks.",
452*760c253cSXin Li                required=False,
453*760c253cSXin Li                default="no_hwp",
454*760c253cSXin Li            )
455*760c253cSXin Li        )
456*760c253cSXin Li        self.AddField(
457*760c253cSXin Li            BooleanField(
458*760c253cSXin Li                "turbostat",
459*760c253cSXin Li                description="Run turbostat process in the background"
460*760c253cSXin Li                " of a benchmark. Enabled by default.",
461*760c253cSXin Li                required=False,
462*760c253cSXin Li                default=True,
463*760c253cSXin Li            )
464*760c253cSXin Li        )
465*760c253cSXin Li        self.AddField(
466*760c253cSXin Li            FloatField(
467*760c253cSXin Li                "top_interval",
468*760c253cSXin Li                description="Run top command in the background of a benchmark with"
469*760c253cSXin Li                " interval of sampling specified in seconds.\n"
470*760c253cSXin Li                "Recommended values 1-5. Lower number provides more accurate"
471*760c253cSXin Li                " data.\n"
472*760c253cSXin Li                "With 0 - do not run top.\n"
473*760c253cSXin Li                "NOTE: Running top with interval 1-5 sec has insignificant"
474*760c253cSXin Li                " performance impact (performance degradation does not exceed"
475*760c253cSXin Li                " 0.3%%, measured on x86_64, ARM32, and ARM64). "
476*760c253cSXin Li                "The default value is 1.",
477*760c253cSXin Li                required=False,
478*760c253cSXin Li                default=1,
479*760c253cSXin Li            )
480*760c253cSXin Li        )
481*760c253cSXin Li        self.AddField(
482*760c253cSXin Li            IntegerField(
483*760c253cSXin Li                "cooldown_temp",
484*760c253cSXin Li                required=False,
485*760c253cSXin Li                default=40,
486*760c253cSXin Li                description="Wait until CPU temperature goes down below"
487*760c253cSXin Li                " specified temperature in Celsius"
488*760c253cSXin Li                " prior starting a benchmark. "
489*760c253cSXin Li                "By default the value is set to 40 degrees.",
490*760c253cSXin Li            )
491*760c253cSXin Li        )
492*760c253cSXin Li        self.AddField(
493*760c253cSXin Li            IntegerField(
494*760c253cSXin Li                "cooldown_time",
495*760c253cSXin Li                required=False,
496*760c253cSXin Li                default=10,
497*760c253cSXin Li                description="Wait specified time in minutes allowing"
498*760c253cSXin Li                " CPU to cool down. Zero value disables cooldown. "
499*760c253cSXin Li                "The default value is 10 minutes.",
500*760c253cSXin Li            )
501*760c253cSXin Li        )
502*760c253cSXin Li        self.AddField(
503*760c253cSXin Li            EnumField(
504*760c253cSXin Li                "governor",
505*760c253cSXin Li                options=[
506*760c253cSXin Li                    "performance",
507*760c253cSXin Li                    "powersave",
508*760c253cSXin Li                    "userspace",
509*760c253cSXin Li                    "ondemand",
510*760c253cSXin Li                    "conservative",
511*760c253cSXin Li                    "schedutils",
512*760c253cSXin Li                    "sched",
513*760c253cSXin Li                    "interactive",
514*760c253cSXin Li                ],
515*760c253cSXin Li                default="performance",
516*760c253cSXin Li                required=False,
517*760c253cSXin Li                description="Setup CPU governor for all cores.\n"
518*760c253cSXin Li                "For more details refer to:\n"
519*760c253cSXin Li                "https://www.kernel.org/doc/Documentation/cpu-freq/governors.txt. "
520*760c253cSXin Li                'Default is "performance" governor.',
521*760c253cSXin Li            )
522*760c253cSXin Li        )
523*760c253cSXin Li        self.AddField(
524*760c253cSXin Li            EnumField(
525*760c253cSXin Li                "cpu_usage",
526*760c253cSXin Li                options=[
527*760c253cSXin Li                    "all",
528*760c253cSXin Li                    "big_only",
529*760c253cSXin Li                    "little_only",
530*760c253cSXin Li                    "exclusive_cores",
531*760c253cSXin Li                ],
532*760c253cSXin Li                default="all",
533*760c253cSXin Li                required=False,
534*760c253cSXin Li                description="Restrict usage of CPUs to decrease CPU interference.\n"
535*760c253cSXin Li                '"all" - no restrictions;\n'
536*760c253cSXin Li                '"big-only", "little-only" - enable only big/little cores,'
537*760c253cSXin Li                " applicable only on ARM;\n"
538*760c253cSXin Li                '"exclusive-cores" - (for future use)'
539*760c253cSXin Li                " isolate cores for exclusive use of benchmark processes. "
540*760c253cSXin Li                "By default use all CPUs.",
541*760c253cSXin Li            )
542*760c253cSXin Li        )
543*760c253cSXin Li        self.AddField(
544*760c253cSXin Li            IntegerField(
545*760c253cSXin Li                "cpu_freq_pct",
546*760c253cSXin Li                required=False,
547*760c253cSXin Li                default=95,
548*760c253cSXin Li                description="Setup CPU frequency to a supported value less than"
549*760c253cSXin Li                " or equal to a percent of max_freq. "
550*760c253cSXin Li                "CPU frequency is reduced to 95%% by default to reduce thermal "
551*760c253cSXin Li                "throttling.",
552*760c253cSXin Li            )
553*760c253cSXin Li        )
554*760c253cSXin Li        self.AddField(
555*760c253cSXin Li            BooleanField(
556*760c253cSXin Li                "no_lock",
557*760c253cSXin Li                default=False,
558*760c253cSXin Li                description="Do not attempt to lock the DUT."
559*760c253cSXin Li                " Useful when lock is held externally, say with crosfleet.",
560*760c253cSXin Li            )
561*760c253cSXin Li        )
562*760c253cSXin Li        self.AddField(
563*760c253cSXin Li            BooleanField(
564*760c253cSXin Li                "keep_stateful",
565*760c253cSXin Li                default=False,
566*760c253cSXin Li                description="When flashing a ChromeOS image keep the stateful"
567*760c253cSXin Li                " partition, i.e. don't use --clobber-stateful. This option"
568*760c253cSXin Li                " is useful to keep ssh keys, wi-fi settings and so on.",
569*760c253cSXin Li            )
570*760c253cSXin Li        )
571*760c253cSXin Li
572*760c253cSXin Li
573*760c253cSXin Liclass SettingsFactory(object):
574*760c253cSXin Li    """Factory class for building different types of Settings objects.
575*760c253cSXin Li
576*760c253cSXin Li    This factory is currently hardcoded to produce settings for ChromeOS
577*760c253cSXin Li    experiment files. The idea is that in the future, other types
578*760c253cSXin Li    of settings could be produced.
579*760c253cSXin Li    """
580*760c253cSXin Li
581*760c253cSXin Li    def GetSettings(self, name, settings_type):
582*760c253cSXin Li        if settings_type == "label" or not settings_type:
583*760c253cSXin Li            return LabelSettings(name)
584*760c253cSXin Li        if settings_type == "global":
585*760c253cSXin Li            return GlobalSettings(name)
586*760c253cSXin Li        if settings_type == "benchmark":
587*760c253cSXin Li            return BenchmarkSettings(name)
588*760c253cSXin Li
589*760c253cSXin Li        raise TypeError("Invalid settings type: '%s'." % settings_type)
590