blob: a90115dfb873a237cf2d548d7f14b546b447af4b [file] [log] [blame]
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this file,
# You can obtain one at http://mozilla.org/MPL/2.0/.
#
# Assumes Python 2.6
#
import os
import time
import relay as relayModule
from sut_lib.__init__ import waitForDevice, getSUTLogger, dumpException
import devices
log = getSUTLogger()
def soft_reboot(device, dm, silent=False, *args, **kwargs):
"""
Use the softest/kindest reboot method we think we should use.
This does a reboot over devicemanager* in some cases, and a relay/pdu reboot in others
"""
if 'panda-' in device:
# Using devicemanager for reboots on pandas doesn't work reliably
if reboot_relay(device):
return True
else:
if not silent:
log.warn("Automation Error: Unable to reboot %s via Relay Board." %
device)
# If this panda doesn't successfully relay-reboot fall through to
# devicemanager
return dm.reboot(*args, **kwargs)
def reboot_relay(device):
if device in devices.pandas and devices.pandas[device]['relayhost']:
relay_host = devices.pandas[device]['relayhost']
bank, relay = map(int, devices.pandas[device]['relayid'].split(":"))
log.info("Calling PDU powercycle for %s, %s:%s:%s" % (
device, relay_host, bank, relay))
maxTries = 15
curTry = 1
while not relayModule.powercycle(relay_host, bank, relay):
log.info("Was not able to powercycle, attempt %s of %s" %
(curTry, maxTries))
curTry += 1
if curTry > maxTries:
log.error(
"Failed to powercycle %s times, giving up" % maxTries)
return False # Stop Trying
time.sleep(1) # Give us a chance to get a free socket next time
return True
return False
def soft_reboot_and_verify(device, dm, waitTime=90, max_attempts=5, silent=False, *args, **kwargs):
attempt = 0
while attempt < max_attempts:
attempt += 1
retVal = soft_reboot(device, dm, silent, *args, **kwargs)
if not retVal:
continue
if waitForDevice(dm, waitTime, silent=True):
return True
return False