| Index: chrome/test/pyautolib/chromeos/power_strip.py
|
| ===================================================================
|
| --- chrome/test/pyautolib/chromeos/power_strip.py (revision 261231)
|
| +++ chrome/test/pyautolib/chromeos/power_strip.py (working copy)
|
| @@ -1,119 +0,0 @@
|
| -# Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -# Use of this source code is governed by a BSD-style license that can be
|
| -# found in the LICENSE file.
|
| -
|
| -import logging
|
| -import re
|
| -import telnetlib
|
| -
|
| -
|
| -class PowerStrip(object):
|
| - """Controls Server Technology CW-16V1-C20M switched CDUs.
|
| - (Cabinet Power Distribution Unit)
|
| -
|
| - This class is used to control the CW-16V1-C20M unit which
|
| - is a 16 port remote power strip. The strip supports AC devices
|
| - using 100-120V 50/60Hz input voltages. The commands in this
|
| - class are supported by switches that use Sentry Switched CDU Version 6.0g.
|
| -
|
| - Opens a new connection for every command.
|
| - """
|
| -
|
| - TIMEOUT = 10
|
| -
|
| - def __init__(self, host, user='admn', password='admn'):
|
| - self._host = host
|
| - self._user = user
|
| - self._password = password
|
| -
|
| - def PowerOff(self, outlet):
|
| - """Powers off the device that is plugged into the specified outlet.
|
| -
|
| - Args:
|
| - outlet: The outlet ID defined on the switch (eg. .a14).
|
| - """
|
| - self._DoCommand('off', outlet)
|
| -
|
| - def PowerOn(self, outlet):
|
| - """Powers on the device that is plugged into the specified outlet.
|
| -
|
| - Args:
|
| - outlet: The outlet ID defined on the switch (eg. .a14).
|
| - """
|
| - self._DoCommand('on', outlet)
|
| -
|
| - def _DoCommand(self, command, outlet):
|
| - """Performs power strip commands on the specified outlet.
|
| -
|
| - Sample telnet interaction:
|
| - Escape character is '^]'.
|
| -
|
| - Sentry Switched CDU Version 6.0g
|
| -
|
| - Username: admn
|
| - Password: < password hidden from view >
|
| -
|
| - Location:
|
| -
|
| - Switched CDU: on .a1
|
| -
|
| - Outlet Outlet Outlet Control
|
| - ID Name Status State
|
| -
|
| - .A1 TowerA_Outlet1 On On
|
| -
|
| - Command successful
|
| -
|
| - Switched CDU: < cdu cmd >
|
| -
|
| - Args:
|
| - command: A valid CW-16V1-C20M command that follows the format
|
| - <command> <outlet>.
|
| - outlet: The outlet ID defined on the switch (eg. .a14).
|
| - """
|
| - tn = telnetlib.Telnet()
|
| - # To avoid 'Connection Reset by Peer: 104' exceptions when rapid calls
|
| - # are made to the telnet server on the power strip, we retry executing
|
| - # a command.
|
| - retry = range(5)
|
| - for attempt in retry:
|
| - try:
|
| - tn.open(self._host, timeout=PowerStrip.TIMEOUT)
|
| - resp = tn.read_until('Username:', timeout=PowerStrip.TIMEOUT)
|
| - assert 'Username' in resp, 'Username not found in response. (%s)' % resp
|
| - tn.write(self._user + '\n')
|
| -
|
| - resp = tn.read_until('Password:', timeout=PowerStrip.TIMEOUT)
|
| - assert 'Password' in resp, 'Password not found in response. (%s)' % resp
|
| - tn.write(self._password + '\n')
|
| -
|
| - resp = tn.read_until('Switched CDU:', timeout=PowerStrip.TIMEOUT)
|
| - assert 'Switched CDU' in resp, 'Standard prompt not found in ' \
|
| - 'response. (%s)' % resp
|
| - tn.write('%s %s\n' % (command, outlet))
|
| -
|
| - # Obtain the output of command and make sure it matches with the action
|
| - # we performed.
|
| - # Sample valid output:
|
| - # .A1 TowerA_Outlet1 On On
|
| - resp = tn.read_until('Switched CDU:', timeout=PowerStrip.TIMEOUT)
|
| - if not re.search('%s\s+\S+\s+%s\s+%s' % (outlet, command, command),
|
| - resp, re.I):
|
| - raise Exception('Command \'%s\' execution failed. (%s)' %
|
| - (command, resp))
|
| -
|
| - # Exiting the telnet session cleanly significantly reduces the chance of
|
| - # connection error on initiating the following telnet session.
|
| - tn.write('exit\n')
|
| - tn.read_all()
|
| -
|
| - # If we've gotten this far, there is no need to retry.
|
| - break
|
| - except Exception as e:
|
| - logging.debug('Power strip retry on cmd "%s". Reason: %s'
|
| - % (command, str(e)))
|
| - if attempt == retry[-1]:
|
| - raise Exception('Sentry Command "%s" failed. '
|
| - 'Reason: %s' % (command, str(e)))
|
| - finally:
|
| - tn.close()
|
|
|