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