1*6777b538SAndroid Build Coastguard Worker#!/usr/bin/env vpython3 2*6777b538SAndroid Build Coastguard Worker# Copyright 2023 The Chromium Authors 3*6777b538SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be 4*6777b538SAndroid Build Coastguard Worker# found in the LICENSE file. 5*6777b538SAndroid Build Coastguard Worker"""Sets up the isolate daemon environment to run test on the bots.""" 6*6777b538SAndroid Build Coastguard Worker 7*6777b538SAndroid Build Coastguard Workerimport os 8*6777b538SAndroid Build Coastguard Workerimport sys 9*6777b538SAndroid Build Coastguard Workerimport tempfile 10*6777b538SAndroid Build Coastguard Worker 11*6777b538SAndroid Build Coastguard Workerfrom contextlib import AbstractContextManager 12*6777b538SAndroid Build Coastguard Workerfrom typing import List 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Workerfrom common import catch_sigterm, set_ffx_isolate_dir, start_ffx_daemon, \ 15*6777b538SAndroid Build Coastguard Worker stop_ffx_daemon, wait_for_sigterm 16*6777b538SAndroid Build Coastguard Workerfrom ffx_integration import ScopedFfxConfig 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker 19*6777b538SAndroid Build Coastguard Workerclass IsolateDaemon(AbstractContextManager): 20*6777b538SAndroid Build Coastguard Worker """Sets up the environment of an isolate ffx daemon.""" 21*6777b538SAndroid Build Coastguard Worker class IsolateDir(AbstractContextManager): 22*6777b538SAndroid Build Coastguard Worker """Sets up the ffx isolate dir to a temporary folder.""" 23*6777b538SAndroid Build Coastguard Worker def __init__(self): 24*6777b538SAndroid Build Coastguard Worker self._temp_dir = tempfile.TemporaryDirectory() 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker def __enter__(self): 27*6777b538SAndroid Build Coastguard Worker set_ffx_isolate_dir(self._temp_dir.__enter__()) 28*6777b538SAndroid Build Coastguard Worker return self 29*6777b538SAndroid Build Coastguard Worker 30*6777b538SAndroid Build Coastguard Worker def __exit__(self, exc_type, exc_value, traceback): 31*6777b538SAndroid Build Coastguard Worker return self._temp_dir.__exit__(exc_type, exc_value, traceback) 32*6777b538SAndroid Build Coastguard Worker 33*6777b538SAndroid Build Coastguard Worker def name(self): 34*6777b538SAndroid Build Coastguard Worker """Returns the location of the isolate dir.""" 35*6777b538SAndroid Build Coastguard Worker return self._temp_dir.name 36*6777b538SAndroid Build Coastguard Worker 37*6777b538SAndroid Build Coastguard Worker def __init__(self, extra_inits: List[AbstractContextManager] = None): 38*6777b538SAndroid Build Coastguard Worker # Keep the alphabetical order. 39*6777b538SAndroid Build Coastguard Worker self._extra_inits = [ 40*6777b538SAndroid Build Coastguard Worker self.IsolateDir(), 41*6777b538SAndroid Build Coastguard Worker ScopedFfxConfig('ffx.isolated', 'true'), 42*6777b538SAndroid Build Coastguard Worker ScopedFfxConfig('daemon.autostart', 'false'), 43*6777b538SAndroid Build Coastguard Worker # fxb/126212: The timeout rate determines the timeout for each file 44*6777b538SAndroid Build Coastguard Worker # transfer based on the size of the file / this rate (in MB). 45*6777b538SAndroid Build Coastguard Worker # Decreasing the rate to 1 (from 5) increases the timeout in 46*6777b538SAndroid Build Coastguard Worker # swarming, where large files can take longer to transfer. 47*6777b538SAndroid Build Coastguard Worker ScopedFfxConfig('fastboot.flash.timeout_rate', '1'), 48*6777b538SAndroid Build Coastguard Worker ScopedFfxConfig('fastboot.reboot.reconnect_timeout', '120'), 49*6777b538SAndroid Build Coastguard Worker ScopedFfxConfig('fastboot.usb.disabled', 'true'), 50*6777b538SAndroid Build Coastguard Worker ScopedFfxConfig('log.level', 'debug'), 51*6777b538SAndroid Build Coastguard Worker ScopedFfxConfig('repository.server.listen', '"[::]:0"'), 52*6777b538SAndroid Build Coastguard Worker ] + (extra_inits or []) 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker # Updating configurations to meet the requirement of isolate. 55*6777b538SAndroid Build Coastguard Worker def __enter__(self): 56*6777b538SAndroid Build Coastguard Worker # This environment variable needs to be set before stopping ffx daemon 57*6777b538SAndroid Build Coastguard Worker # to avoid sending unnecessary analytics. 58*6777b538SAndroid Build Coastguard Worker os.environ['FUCHSIA_ANALYTICS_DISABLED'] = '1' 59*6777b538SAndroid Build Coastguard Worker stop_ffx_daemon() 60*6777b538SAndroid Build Coastguard Worker for extra_init in self._extra_inits: 61*6777b538SAndroid Build Coastguard Worker extra_init.__enter__() 62*6777b538SAndroid Build Coastguard Worker start_ffx_daemon() 63*6777b538SAndroid Build Coastguard Worker return self 64*6777b538SAndroid Build Coastguard Worker 65*6777b538SAndroid Build Coastguard Worker def __exit__(self, exc_type, exc_value, traceback): 66*6777b538SAndroid Build Coastguard Worker for extra_init in self._extra_inits: 67*6777b538SAndroid Build Coastguard Worker extra_init.__exit__(exc_type, exc_value, traceback) 68*6777b538SAndroid Build Coastguard Worker stop_ffx_daemon() 69*6777b538SAndroid Build Coastguard Worker 70*6777b538SAndroid Build Coastguard Worker def isolate_dir(self): 71*6777b538SAndroid Build Coastguard Worker """Returns the location of the isolate dir.""" 72*6777b538SAndroid Build Coastguard Worker return self._extra_inits[0].name() 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard Worker 75*6777b538SAndroid Build Coastguard Workerdef main(): 76*6777b538SAndroid Build Coastguard Worker """Executes the IsolateDaemon and waits for the sigterm.""" 77*6777b538SAndroid Build Coastguard Worker catch_sigterm() 78*6777b538SAndroid Build Coastguard Worker with IsolateDaemon() as daemon: 79*6777b538SAndroid Build Coastguard Worker # Clients can assume the daemon is up and running when the output is 80*6777b538SAndroid Build Coastguard Worker # captured. Note, the client may rely on the printed isolate_dir. 81*6777b538SAndroid Build Coastguard Worker print(daemon.isolate_dir(), flush=True) 82*6777b538SAndroid Build Coastguard Worker wait_for_sigterm('shutting down the daemon.') 83*6777b538SAndroid Build Coastguard Worker 84*6777b538SAndroid Build Coastguard Worker 85*6777b538SAndroid Build Coastguard Workerif __name__ == '__main__': 86*6777b538SAndroid Build Coastguard Worker sys.exit(main()) 87