xref: /aosp_15_r20/external/toolchain-utils/crosperf/settings.py (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
1*760c253cSXin Li# -*- coding: utf-8 -*-
2*760c253cSXin Li# Copyright 2019 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"""Module to get the settings from experiment file."""
7*760c253cSXin Li
8*760c253cSXin Li
9*760c253cSXin Lifrom cros_utils import logger
10*760c253cSXin Lifrom cros_utils import misc
11*760c253cSXin Lifrom download_images import ImageDownloader
12*760c253cSXin Li
13*760c253cSXin Li
14*760c253cSXin Liclass Settings(object):
15*760c253cSXin Li    """Class representing settings (a set of fields) from an experiment file."""
16*760c253cSXin Li
17*760c253cSXin Li    def __init__(self, name, settings_type):
18*760c253cSXin Li        self.name = name
19*760c253cSXin Li        self.settings_type = settings_type
20*760c253cSXin Li        self.fields = {}
21*760c253cSXin Li        self.parent = None
22*760c253cSXin Li
23*760c253cSXin Li    def SetParentSettings(self, settings):
24*760c253cSXin Li        """Set the parent settings which these settings can inherit from."""
25*760c253cSXin Li        self.parent = settings
26*760c253cSXin Li
27*760c253cSXin Li    def AddField(self, field):
28*760c253cSXin Li        name = field.name
29*760c253cSXin Li        if name in self.fields:
30*760c253cSXin Li            raise SyntaxError("Field %s defined previously." % name)
31*760c253cSXin Li        self.fields[name] = field
32*760c253cSXin Li
33*760c253cSXin Li    def SetField(self, name, value, append=False):
34*760c253cSXin Li        if name not in self.fields:
35*760c253cSXin Li            raise SyntaxError(
36*760c253cSXin Li                "'%s' is not a valid field in '%s' settings"
37*760c253cSXin Li                % (name, self.settings_type)
38*760c253cSXin Li            )
39*760c253cSXin Li        if append:
40*760c253cSXin Li            self.fields[name].Append(value)
41*760c253cSXin Li        else:
42*760c253cSXin Li            self.fields[name].Set(value)
43*760c253cSXin Li
44*760c253cSXin Li    def GetField(self, name):
45*760c253cSXin Li        """Get the value of a field with a given name."""
46*760c253cSXin Li        if name not in self.fields:
47*760c253cSXin Li            raise SyntaxError(
48*760c253cSXin Li                "Field '%s' not a valid field in '%s' settings."
49*760c253cSXin Li                % (name, self.name)
50*760c253cSXin Li            )
51*760c253cSXin Li        field = self.fields[name]
52*760c253cSXin Li        if not field.assigned and field.required:
53*760c253cSXin Li            raise SyntaxError(
54*760c253cSXin Li                "Required field '%s' not defined in '%s' settings."
55*760c253cSXin Li                % (name, self.name)
56*760c253cSXin Li            )
57*760c253cSXin Li        return self.fields[name].Get()
58*760c253cSXin Li
59*760c253cSXin Li    def Inherit(self):
60*760c253cSXin Li        """Inherit any unset values from the parent settings."""
61*760c253cSXin Li        for name in self.fields:
62*760c253cSXin Li            if (
63*760c253cSXin Li                not self.fields[name].assigned
64*760c253cSXin Li                and self.parent
65*760c253cSXin Li                and name in self.parent.fields
66*760c253cSXin Li                and self.parent.fields[name].assigned
67*760c253cSXin Li            ):
68*760c253cSXin Li                self.fields[name].Set(self.parent.GetField(name), parse=False)
69*760c253cSXin Li
70*760c253cSXin Li    def Override(self, settings):
71*760c253cSXin Li        """Override settings with settings from a different object."""
72*760c253cSXin Li        for name in settings.fields:
73*760c253cSXin Li            if name in self.fields and settings.fields[name].assigned:
74*760c253cSXin Li                self.fields[name].Set(settings.GetField(name), parse=False)
75*760c253cSXin Li
76*760c253cSXin Li    def Validate(self):
77*760c253cSXin Li        """Check that all required fields have been set."""
78*760c253cSXin Li        for name in self.fields:
79*760c253cSXin Li            if not self.fields[name].assigned and self.fields[name].required:
80*760c253cSXin Li                raise SyntaxError("Field %s is invalid." % name)
81*760c253cSXin Li
82*760c253cSXin Li    def GetXbuddyPath(
83*760c253cSXin Li        self,
84*760c253cSXin Li        path_str,
85*760c253cSXin Li        autotest_path,
86*760c253cSXin Li        debug_path,
87*760c253cSXin Li        board,
88*760c253cSXin Li        chromeos_root,
89*760c253cSXin Li        log_level,
90*760c253cSXin Li        download_debug,
91*760c253cSXin Li    ):
92*760c253cSXin Li        prefix = "remote"
93*760c253cSXin Li        l = logger.GetLogger()
94*760c253cSXin Li        if (
95*760c253cSXin Li            path_str.find("trybot") < 0
96*760c253cSXin Li            and path_str.find("toolchain") < 0
97*760c253cSXin Li            and path_str.find(board) < 0
98*760c253cSXin Li            and path_str.find(board.replace("_", "-"))
99*760c253cSXin Li        ):
100*760c253cSXin Li            xbuddy_path = "%s/%s/%s" % (prefix, board, path_str)
101*760c253cSXin Li        else:
102*760c253cSXin Li            xbuddy_path = "%s/%s" % (prefix, path_str)
103*760c253cSXin Li        image_downloader = ImageDownloader(l, log_level)
104*760c253cSXin Li        # Returns three variables: image, autotest_path, debug_path
105*760c253cSXin Li        return image_downloader.Run(
106*760c253cSXin Li            misc.CanonicalizePath(chromeos_root),
107*760c253cSXin Li            xbuddy_path,
108*760c253cSXin Li            autotest_path,
109*760c253cSXin Li            debug_path,
110*760c253cSXin Li            download_debug,
111*760c253cSXin Li        )
112