# -*- 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
