| # -*- coding: utf-8 -*- |
| # |
| # Copyright 2019 The ChromiumOS Authors |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Utilities for locking machines.""" |
| |
| |
| import time |
| |
| from cros_utils import logger |
| import lock_machine |
| |
| |
| def AcquireLock(machines, chromeos_root, timeout=1200): |
| """Acquire lock for machine(s) with timeout.""" |
| start_time = time.time() |
| locked = True |
| sleep_time = min(10, timeout / 10.0) |
| while True: |
| try: |
| lock_machine.LockManager( |
| machines, False, chromeos_root |
| ).UpdateMachines(True) |
| break |
| except Exception as e: |
| if time.time() - start_time > timeout: |
| locked = False |
| logger.GetLogger().LogWarning( |
| "Could not acquire lock on {0} within {1} seconds: {2}".format( |
| repr(machines), timeout, str(e) |
| ) |
| ) |
| break |
| time.sleep(sleep_time) |
| return locked |
| |
| |
| def ReleaseLock(machines, chromeos_root): |
| """Release locked machine(s).""" |
| unlocked = True |
| try: |
| lock_machine.LockManager(machines, False, chromeos_root).UpdateMachines( |
| False |
| ) |
| except Exception as e: |
| unlocked = False |
| logger.GetLogger().LogWarning( |
| "Could not unlock %s. %s" % (repr(machines), str(e)) |
| ) |
| return unlocked |