| # -*- coding: utf-8 -*- |
| # |
| # Copyright 2019 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Utilities for locking machines.""" |
| |
| from __future__ import print_function |
| |
| import time |
| |
| import lock_machine |
| |
| from cros_utils import logger |
| |
| |
| 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 |