xref: /aosp_15_r20/external/autotest/frontend/tko/preconfigs.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Liimport os
2*9c5db199SXin Li
3*9c5db199SXin Liclass PreconfigManager(object):
4*9c5db199SXin Li    _preconfigs = {}
5*9c5db199SXin Li    _is_init = False
6*9c5db199SXin Li
7*9c5db199SXin Li    def _get_preconfig_path(self, suffix):
8*9c5db199SXin Li        """\
9*9c5db199SXin Li        Get the absolute path to a prefix directory or file.
10*9c5db199SXin Li
11*9c5db199SXin Li        suffix: list of suffixes after the 'preconfigs' directory to navigate to
12*9c5db199SXin Li            E.g., ['metrics', 'abc'] gives the path to
13*9c5db199SXin Li            <tko>/preconfigs/metrics/abc
14*9c5db199SXin Li        """
15*9c5db199SXin Li        rel_path = os.path.join(os.path.dirname(__file__), 'preconfigs',
16*9c5db199SXin Li                                *suffix)
17*9c5db199SXin Li        return os.path.abspath(rel_path)
18*9c5db199SXin Li
19*9c5db199SXin Li
20*9c5db199SXin Li    def _init_preconfigs(self):
21*9c5db199SXin Li        """\
22*9c5db199SXin Li        Read the names of all the preconfigs from disk and store them in the
23*9c5db199SXin Li        _preconfigs dictionary.
24*9c5db199SXin Li        """
25*9c5db199SXin Li        if not self._is_init:
26*9c5db199SXin Li            # Read the data
27*9c5db199SXin Li            self._preconfigs['metrics'] = dict.fromkeys(
28*9c5db199SXin Li                os.listdir(self._get_preconfig_path(['metrics'])))
29*9c5db199SXin Li            self._preconfigs['qual'] = dict.fromkeys(
30*9c5db199SXin Li                os.listdir(self._get_preconfig_path(['qual'])))
31*9c5db199SXin Li            self._is_init = True
32*9c5db199SXin Li
33*9c5db199SXin Li    def _read_preconfig(self, name, type):
34*9c5db199SXin Li        """\
35*9c5db199SXin Li        Populate the _preconfigs dictionary entry for the preconfig described
36*9c5db199SXin Li        by the given parameters.  If the preconfig has already been loaded,
37*9c5db199SXin Li        do nothing.
38*9c5db199SXin Li
39*9c5db199SXin Li        name: specific name of the preconfig
40*9c5db199SXin Li        type: 'metrics' or 'qual'
41*9c5db199SXin Li        """
42*9c5db199SXin Li        if self._preconfigs[type][name] is not None:
43*9c5db199SXin Li            return
44*9c5db199SXin Li
45*9c5db199SXin Li        self._preconfigs[type][name] = {}
46*9c5db199SXin Li        path = self._get_preconfig_path([type, name])
47*9c5db199SXin Li        config = open(path)
48*9c5db199SXin Li        try:
49*9c5db199SXin Li            for line in config:
50*9c5db199SXin Li                parts = line.split(':')
51*9c5db199SXin Li                self._preconfigs[type][name][parts[0]] = parts[1].strip()
52*9c5db199SXin Li        finally:
53*9c5db199SXin Li            config.close()
54*9c5db199SXin Li
55*9c5db199SXin Li
56*9c5db199SXin Li    def get_preconfig(self, name, type):
57*9c5db199SXin Li        self._init_preconfigs()
58*9c5db199SXin Li        self._read_preconfig(name, type)
59*9c5db199SXin Li        return self._preconfigs[type][name]
60*9c5db199SXin Li
61*9c5db199SXin Li
62*9c5db199SXin Li    def all_preconfigs(self):
63*9c5db199SXin Li        self._init_preconfigs()
64*9c5db199SXin Li        return dict(self._preconfigs)
65*9c5db199SXin Li
66*9c5db199SXin Li
67*9c5db199SXin Limanager = PreconfigManager()
68