def get_user_defined_globals(globals_str): """Parse user-defined globals into an immutable dict using globals_str :param globals_str Either a file, in which case, attempt to open the file and parse the contents as JSON, or a JSON string representing a JSON object. The parsed JSON must represent a collection of key-value pairs, i.e. a python dict. :return dict containing user-defined global variables """ if globals_str is None: return persistence.make_dict() from_file = False if os.path.isfile(globals_str): # The string appears to be a file, so try loading JSON from file # This may raise an IOError if the file can't be read or a ValueError if the contents of the file # cannot be parsed. user_globals = json.loads(open(globals_str, "r").read()) from_file = True else: try: # try parsing directly as json if it doesn't seem to be a file user_globals = json.loads(globals_str) except ValueError as ve: message = str(ve) message += "\nglobals parameter %s is neither valid JSON nor a valid path to a JSON file." % globals_str raise ValueError(message) # Now check that the parsed JSON is a dictionary if not isinstance(user_globals, dict): if from_file: message = "The JSON contained in file %s must parse to a dict. " else: message = "JSON string referred to by globals parameter must parse to a dict. " message += "I.e. the contents of the JSON must be an object, not an array or primitive. " message += "Instead found %s, which parsed to %s" % ( str(user_globals), type(user_globals)) raise ValueError(message) # create the immutable dict return persistence.make_dict(**user_globals)
def __init__(self, cluster, session_context, session_logger, tests, deflake_num, min_port=ConsoleDefaults.TEST_DRIVER_MIN_PORT, max_port=ConsoleDefaults.TEST_DRIVER_MAX_PORT): # Set handler for SIGTERM (aka kill -15) # Note: it doesn't work to set a handler for SIGINT (Ctrl-C) in this parent process because the # handler is inherited by all forked child processes, and it prevents the default python behavior # of translating SIGINT into a KeyboardInterrupt exception signal.signal(signal.SIGTERM, self._propagate_sigterm) # session_logger, message logger, self.session_logger = session_logger self.cluster = cluster self.event_response = EventResponseFactory() self.hostname = "localhost" self.receiver = Receiver(min_port, max_port) self.deflake_num = deflake_num self.session_context = session_context self.max_parallel = session_context.max_parallel self.results = TestResults(self.session_context, self.cluster) self.exit_first = self.session_context.exit_first self.main_process_pid = os.getpid() self.scheduler = TestScheduler(tests, self.cluster) self.test_counter = 1 self.total_tests = len(self.scheduler) # This immutable dict tracks test_id -> test_context self._test_context = persistence.make_dict( **{t.test_id: t for t in tests}) self._test_cluster = { } # Track subcluster assigned to a particular TestKey self._client_procs = {} # track client processes running tests self.active_tests = {} self.finished_tests = {} self.test_schedule_log = []