#!/usr/bin/python

# Copyright 2015 The Chromium OS Authors. All rights reserved.

"""Utilities for locking machines."""


import os
import sys
import time

import afe_lock_machine
import file_lock_machine

import logger


def AcquireLock(machines, chromeos_root, timeout=1200):
  """Acquire lock for machine(s) with timeout, using AFE server for locking."""
  start_time = time.time()
  locked = True
  sleep_time = min(10, timeout/10.0)
  while True:
    try:
      afe_lock_machine.AFELockManager(machines, False, chromeos_root,
                                      None).UpdateMachines(True)
      break
    except Exception as e:
      if time.time() - start_time > timeout:
        locked = False
        logger.GetLogger().LogWarning(
          "Could not acquire lock on this machine: {0} within {1} seconds. %s"
          .format(repr(machines), timeout, str(e)))
        break
      time.sleep(sleep_time)
  return locked


def ReleaseLock(machines, chromeos_root):
  """Release locked machine(s), using AFE server for locking."""
  unlocked = True
  try:
    afe_lock_machine.AFELockManager(machines, False, chromeos_root,
                                    None).UpdateMachines(False)
  except Exception as e:
    unlocked = False
    logger.GetLogger().LogWarning("Could not unlock %s. %s" %
                                  (repr(machines), str(e)))
  return unlocked
