diff options
author | android-build-team Robot <android-build-team-robot@google.com> | 2020-02-14 03:08:18 +0000 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2020-02-14 03:08:18 +0000 |
commit | db729d703a0bf8fc92f011d160abd063c338b2f3 (patch) | |
tree | 35fa0fbaeaaddd9cc2a126a05eee3527b51e83a8 /deprecated/crb/machine_manager_singleton.py | |
parent | dddbf2c6f79f2334de6d41b86d63698714ba1124 (diff) | |
parent | b75f321fc8978b92ce3db6886ccb966768f0c7a8 (diff) | |
download | toolchain-utils-android11-tests-release.tar.gz |
Snap for 6206568 from b75f321fc8978b92ce3db6886ccb966768f0c7a8 to rvc-releaseandroid-vts-11.0_r9android-vts-11.0_r8android-vts-11.0_r7android-vts-11.0_r6android-vts-11.0_r5android-vts-11.0_r4android-vts-11.0_r3android-vts-11.0_r2android-vts-11.0_r16android-vts-11.0_r15android-vts-11.0_r14android-vts-11.0_r13android-vts-11.0_r12android-vts-11.0_r11android-vts-11.0_r10android-vts-11.0_r1android-security-11.0.0_r76android-security-11.0.0_r75android-security-11.0.0_r74android-security-11.0.0_r73android-security-11.0.0_r72android-security-11.0.0_r71android-security-11.0.0_r70android-security-11.0.0_r69android-security-11.0.0_r68android-security-11.0.0_r67android-security-11.0.0_r66android-security-11.0.0_r65android-security-11.0.0_r64android-security-11.0.0_r63android-security-11.0.0_r62android-security-11.0.0_r61android-security-11.0.0_r60android-security-11.0.0_r59android-security-11.0.0_r58android-security-11.0.0_r57android-security-11.0.0_r56android-security-11.0.0_r55android-security-11.0.0_r54android-security-11.0.0_r53android-security-11.0.0_r52android-security-11.0.0_r51android-security-11.0.0_r50android-security-11.0.0_r49android-security-11.0.0_r1android-platform-11.0.0_r9android-platform-11.0.0_r8android-platform-11.0.0_r7android-platform-11.0.0_r6android-platform-11.0.0_r5android-platform-11.0.0_r4android-platform-11.0.0_r3android-platform-11.0.0_r2android-platform-11.0.0_r13android-platform-11.0.0_r12android-platform-11.0.0_r11android-platform-11.0.0_r10android-platform-11.0.0_r1android-cts-11.0_r9android-cts-11.0_r8android-cts-11.0_r7android-cts-11.0_r6android-cts-11.0_r5android-cts-11.0_r4android-cts-11.0_r3android-cts-11.0_r2android-cts-11.0_r16android-cts-11.0_r15android-cts-11.0_r14android-cts-11.0_r13android-cts-11.0_r12android-cts-11.0_r11android-cts-11.0_r10android-cts-11.0_r1android-11.0.0_r6android-11.0.0_r5android-11.0.0_r4android-11.0.0_r3android-11.0.0_r25android-11.0.0_r2android-11.0.0_r17android-11.0.0_r1android11-tests-releaseandroid11-security-releaseandroid11-s1-releaseandroid11-releaseandroid11-platform-releaseandroid11-gsi
Change-Id: I997cf91dd612b5e50d502271baf665232843c30a
Diffstat (limited to 'deprecated/crb/machine_manager_singleton.py')
-rw-r--r-- | deprecated/crb/machine_manager_singleton.py | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/deprecated/crb/machine_manager_singleton.py b/deprecated/crb/machine_manager_singleton.py new file mode 100644 index 00000000..6ffe9684 --- /dev/null +++ b/deprecated/crb/machine_manager_singleton.py @@ -0,0 +1,153 @@ +import image_chromeos +import lock_machine +import sys +import threading +import time +from cros_utils import command_executer +from cros_utils import logger + + +class CrosMachine(object): + + def __init__(self, name): + self.name = name + self.image = None + self.checksum = None + self.locked = False + self.released_time = time.time() + self.autotest_run = None + + def __str__(self): + l = [] + l.append(self.name) + l.append(str(self.image)) + l.append(str(self.checksum)) + l.append(str(self.locked)) + l.append(str(self.released_time)) + return ', '.join(l) + + +class MachineManagerSingleton(object): + _instance = None + _lock = threading.RLock() + _all_machines = [] + _machines = [] + image_lock = threading.Lock() + num_reimages = 0 + chromeos_root = None + no_lock = False + + def __new__(cls, *args, **kwargs): + with cls._lock: + if not cls._instance: + cls._instance = super(MachineManagerSingleton, cls).__new__(cls, *args, + **kwargs) + return cls._instance + + def TryToLockMachine(self, cros_machine): + with self._lock: + assert cros_machine, "Machine can't be None" + for m in self._machines: + assert m.name != cros_machine.name, ('Tried to double-lock %s' % + cros_machine.name) + if self.no_lock: + locked = True + else: + locked = lock_machine.Machine(cros_machine.name).Lock(True, sys.argv[0]) + if locked: + ce = command_executer.GetCommandExecuter() + command = 'cat %s' % image_chromeos.checksum_file + ret, out, err = ce.CrosRunCommandWOutput( + command, + chromeos_root=self.chromeos_root, + machine=cros_machine.name) + if ret == 0: + cros_machine.checksum = out.strip() + self._machines.append(cros_machine) + else: + logger.GetLogger().LogOutput("Warning: Couldn't lock: %s" % + cros_machine.name) + + # This is called from single threaded mode. + def AddMachine(self, machine_name): + with self._lock: + for m in self._all_machines: + assert m.name != machine_name, 'Tried to double-add %s' % machine_name + self._all_machines.append(CrosMachine(machine_name)) + + def AcquireMachine(self, image_checksum): + with self._lock: + # Lazily external lock machines + if not self._machines: + for m in self._all_machines: + self.TryToLockMachine(m) + assert self._machines, ('Could not lock any machine in %s' % + self._all_machines) + + ### for m in self._machines: + ### if (m.locked and time.time() - m.released_time < 10 and + ### m.checksum == image_checksum): + ### return None + for m in [machine for machine in self._machines if not machine.locked]: + if m.checksum == image_checksum: + m.locked = True + m.autotest_run = threading.current_thread() + return m + for m in [machine for machine in self._machines if not machine.locked]: + if not m.checksum: + m.locked = True + m.autotest_run = threading.current_thread() + return m + for m in [machine for machine in self._machines if not machine.locked]: + if time.time() - m.released_time > 20: + m.locked = True + m.autotest_run = threading.current_thread() + return m + return None + + def ReleaseMachine(self, machine): + with self._lock: + for m in self._machines: + if machine.name == m.name: + assert m.locked == True, 'Tried to double-release %s' % m.name + m.released_time = time.time() + m.locked = False + m.status = 'Available' + break + + def __del__(self): + with self._lock: + # Unlock all machines. + for m in self._machines: + if not self.no_lock: + assert lock_machine.Machine(m.name).Unlock(True) == True, ( + "Couldn't unlock machine: %s" % m.name) + + def __str__(self): + with self._lock: + l = ['MachineManager Status:'] + for m in self._machines: + l.append(str(m)) + return '\n'.join(l) + + def AsString(self): + with self._lock: + stringify_fmt = '%-30s %-10s %-4s %-25s %-32s' + header = stringify_fmt % ('Machine', 'Thread', 'Lock', 'Status', + 'Checksum') + table = [header] + for m in self._machines: + if m.autotest_run: + autotest_name = m.autotest_run.name + autotest_status = m.autotest_run.status + else: + autotest_name = '' + autotest_status = '' + + try: + machine_string = stringify_fmt % (m.name, autotest_name, m.locked, + autotest_status, m.checksum) + except: + machine_string = '' + table.append(machine_string) + return 'Machine Status:\n%s' % '\n'.join(table) |