xref: /aosp_15_r20/external/autotest/server/system_utils.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# Copyright 2016 The Chromium OS Authors. All rights reserved.
2*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
3*9c5db199SXin Li# found in the LICENSE file.
4*9c5db199SXin Li
5*9c5db199SXin Li"""This module provides utility functions to get the servers used by Autotest
6*9c5db199SXin Lisystem, from server database or global config. The standalone module is needed
7*9c5db199SXin Lito avoid circular imports.
8*9c5db199SXin Li
9*9c5db199SXin Li"""
10*9c5db199SXin Li
11*9c5db199SXin Liimport copy
12*9c5db199SXin Li
13*9c5db199SXin Liimport common
14*9c5db199SXin Lifrom autotest_lib.client.common_lib import global_config
15*9c5db199SXin Lifrom autotest_lib.client.common_lib import utils
16*9c5db199SXin Li
17*9c5db199SXin Li
18*9c5db199SXin Lidef get_drones():
19*9c5db199SXin Li    """Get a list of drones from server database or global config.
20*9c5db199SXin Li    """
21*9c5db199SXin Li    return []
22*9c5db199SXin Li
23*9c5db199SXin Li
24*9c5db199SXin Lidef get_shards():
25*9c5db199SXin Li    """Get a list of shards from server database or global config.
26*9c5db199SXin Li    """
27*9c5db199SXin Li    config = global_config.global_config
28*9c5db199SXin Li    shards = config.get_config_value('SERVER', 'shards', default='')
29*9c5db199SXin Li    return [hostname.strip() for hostname in shards.split(',')]
30*9c5db199SXin Li
31*9c5db199SXin Li
32*9c5db199SXin Liclass DroneCache(object):
33*9c5db199SXin Li    """A cache object to store drone list related data.
34*9c5db199SXin Li
35*9c5db199SXin Li    The cache is added to avoid repeated calls from each agent task. The cache
36*9c5db199SXin Li    should be refreshed every tick.
37*9c5db199SXin Li    """
38*9c5db199SXin Li
39*9c5db199SXin Li    # A cache of unrestricted drones.
40*9c5db199SXin Li    unrestricted_drones = None
41*9c5db199SXin Li
42*9c5db199SXin Li    # A cache of a dict of (drone, ip).
43*9c5db199SXin Li    drone_ip_map = None
44*9c5db199SXin Li
45*9c5db199SXin Li    @classmethod
46*9c5db199SXin Li    def refresh(cls, restricted_subnets=utils.RESTRICTED_SUBNETS):
47*9c5db199SXin Li        """Refresh the cache.
48*9c5db199SXin Li
49*9c5db199SXin Li        @param restricted_subnets: A list of restricted subnet, default is set
50*9c5db199SXin Li                to restricted_subnets in global config.
51*9c5db199SXin Li        """
52*9c5db199SXin Li        new_drone_ip_map = {}
53*9c5db199SXin Li        new_unrestricted_drones = []
54*9c5db199SXin Li        for drone in get_drones():
55*9c5db199SXin Li            new_drone_ip_map[drone] = utils.get_ip_address(drone)
56*9c5db199SXin Li            if (not restricted_subnets or
57*9c5db199SXin Li                not utils.get_restricted_subnet(new_drone_ip_map[drone],
58*9c5db199SXin Li                                                restricted_subnets)):
59*9c5db199SXin Li                new_unrestricted_drones.append(drone)
60*9c5db199SXin Li        cls.drone_ip_map = new_drone_ip_map
61*9c5db199SXin Li        cls.unrestricted_drones = new_unrestricted_drones
62*9c5db199SXin Li
63*9c5db199SXin Li
64*9c5db199SXin Li    @classmethod
65*9c5db199SXin Li    def get_unrestricted_drones(
66*9c5db199SXin Li                cls, restricted_subnets=utils.RESTRICTED_SUBNETS):
67*9c5db199SXin Li        """Get a list of cached unrestricted drones.
68*9c5db199SXin Li
69*9c5db199SXin Li        @param restricted_subnets: A list of restricted subnet, default is set
70*9c5db199SXin Li                to restricted_subnets in global config.
71*9c5db199SXin Li        """
72*9c5db199SXin Li        if not cls.unrestricted_drones:
73*9c5db199SXin Li            cls.refresh(restricted_subnets)
74*9c5db199SXin Li
75*9c5db199SXin Li        return copy.copy(cls.unrestricted_drones)
76*9c5db199SXin Li
77*9c5db199SXin Li
78*9c5db199SXin Li    @classmethod
79*9c5db199SXin Li    def get_drone_ip_map(cls, restricted_subnets=utils.RESTRICTED_SUBNETS):
80*9c5db199SXin Li        """Get a dict of (drone, ip).
81*9c5db199SXin Li
82*9c5db199SXin Li        @param restricted_subnets: A list of restricted subnet, default is set
83*9c5db199SXin Li                to restricted_subnets in global config.
84*9c5db199SXin Li        """
85*9c5db199SXin Li        if not cls.drone_ip_map:
86*9c5db199SXin Li            cls.refresh(restricted_subnets)
87*9c5db199SXin Li
88*9c5db199SXin Li        return copy.copy(cls.drone_ip_map)
89